mdx-linklist 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +211 -0
- package/dist/cache/url-cache.d.ts +13 -0
- package/dist/cache/url-cache.d.ts.map +1 -0
- package/dist/cache/url-cache.js +48 -0
- package/dist/cache/url-cache.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +160 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +42 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/heading-parser.d.ts +8 -0
- package/dist/parsers/heading-parser.d.ts.map +1 -0
- package/dist/parsers/heading-parser.js +63 -0
- package/dist/parsers/heading-parser.js.map +1 -0
- package/dist/parsers/index.d.ts +2 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +2 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/reporters/console.d.ts +3 -0
- package/dist/reporters/console.d.ts.map +1 -0
- package/dist/reporters/console.js +86 -0
- package/dist/reporters/console.js.map +1 -0
- package/dist/reporters/index.d.ts +4 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +4 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json.d.ts +3 -0
- package/dist/reporters/json.d.ts.map +1 -0
- package/dist/reporters/json.js +31 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/markdown.d.ts +3 -0
- package/dist/reporters/markdown.d.ts.map +1 -0
- package/dist/reporters/markdown.js +77 -0
- package/dist/reporters/markdown.js.map +1 -0
- package/dist/scanner/file-scanner.d.ts +3 -0
- package/dist/scanner/file-scanner.d.ts.map +1 -0
- package/dist/scanner/file-scanner.js +20 -0
- package/dist/scanner/file-scanner.js.map +1 -0
- package/dist/scanner/index.d.ts +3 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +3 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/link-extractor.d.ts +3 -0
- package/dist/scanner/link-extractor.d.ts.map +1 -0
- package/dist/scanner/link-extractor.js +101 -0
- package/dist/scanner/link-extractor.js.map +1 -0
- package/dist/types.d.ts +46 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +115 -0
- package/dist/utils.js.map +1 -0
- package/dist/validators/external.d.ts +4 -0
- package/dist/validators/external.d.ts.map +1 -0
- package/dist/validators/external.js +111 -0
- package/dist/validators/external.js.map +1 -0
- package/dist/validators/index.d.ts +3 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +3 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/validators/internal.d.ts +3 -0
- package/dist/validators/internal.d.ts.map +1 -0
- package/dist/validators/internal.js +55 -0
- package/dist/validators/internal.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../src/reporters/console.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG5D,wBAAgB,aAAa,CAC3B,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,GACf,IAAI,CAoHN"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { formatDuration, relativePath } from '../utils.js';
|
|
3
|
+
export function reportConsole(results, summary, baseDir, verbose) {
|
|
4
|
+
const brokenInternal = results.filter((r) => r.status === 'broken' &&
|
|
5
|
+
(r.link.type === 'internal' || r.link.type === 'anchor'));
|
|
6
|
+
const brokenExternal = results.filter((r) => r.status === 'broken' && r.link.type === 'external');
|
|
7
|
+
const timeouts = results.filter((r) => r.status === 'timeout');
|
|
8
|
+
const skipped = results.filter((r) => r.status === 'skipped');
|
|
9
|
+
console.log('');
|
|
10
|
+
// Broken internal links
|
|
11
|
+
if (brokenInternal.length > 0) {
|
|
12
|
+
console.log(chalk.red.bold(`BROKEN INTERNAL LINKS (${brokenInternal.length})`));
|
|
13
|
+
console.log('');
|
|
14
|
+
for (const result of brokenInternal) {
|
|
15
|
+
const relPath = relativePath(result.link.sourceFile, baseDir);
|
|
16
|
+
console.log(chalk.yellow(` ${relPath}:${result.link.line}:${result.link.column || 0}`));
|
|
17
|
+
console.log(chalk.dim(` │ ${result.link.context}`));
|
|
18
|
+
console.log(chalk.red(` └─ ${result.error}`));
|
|
19
|
+
if (result.suggestions && result.suggestions.length > 0) {
|
|
20
|
+
console.log(chalk.cyan(` Suggestions: ${result.suggestions.join(', ')}`));
|
|
21
|
+
}
|
|
22
|
+
console.log('');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Broken external links
|
|
26
|
+
if (brokenExternal.length > 0) {
|
|
27
|
+
console.log(chalk.red.bold(`BROKEN EXTERNAL LINKS (${brokenExternal.length})`));
|
|
28
|
+
console.log('');
|
|
29
|
+
for (const result of brokenExternal) {
|
|
30
|
+
const relPath = relativePath(result.link.sourceFile, baseDir);
|
|
31
|
+
console.log(chalk.yellow(` ${relPath}:${result.link.line}:${result.link.column || 0}`));
|
|
32
|
+
console.log(chalk.dim(` │ ${result.link.href}`));
|
|
33
|
+
console.log(chalk.red(` └─ ${result.error}${result.statusCode ? ` (${result.statusCode})` : ''}`));
|
|
34
|
+
console.log('');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Timeouts
|
|
38
|
+
if (timeouts.length > 0) {
|
|
39
|
+
console.log(chalk.yellow.bold(`TIMEOUTS (${timeouts.length})`));
|
|
40
|
+
console.log('');
|
|
41
|
+
for (const result of timeouts) {
|
|
42
|
+
const relPath = relativePath(result.link.sourceFile, baseDir);
|
|
43
|
+
console.log(chalk.yellow(` ${relPath}:${result.link.line}`));
|
|
44
|
+
console.log(chalk.dim(` │ ${result.link.href}`));
|
|
45
|
+
console.log(chalk.yellow(` └─ ${result.error}`));
|
|
46
|
+
console.log('');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Skipped (only in verbose mode)
|
|
50
|
+
if (verbose && skipped.length > 0) {
|
|
51
|
+
console.log(chalk.gray.bold(`SKIPPED (${skipped.length})`));
|
|
52
|
+
console.log('');
|
|
53
|
+
for (const result of skipped) {
|
|
54
|
+
const relPath = relativePath(result.link.sourceFile, baseDir);
|
|
55
|
+
console.log(chalk.gray(` ${relPath}:${result.link.line}`));
|
|
56
|
+
console.log(chalk.gray(` └─ ${result.link.href}`));
|
|
57
|
+
}
|
|
58
|
+
console.log('');
|
|
59
|
+
}
|
|
60
|
+
// Summary
|
|
61
|
+
console.log(chalk.dim('─'.repeat(50)));
|
|
62
|
+
console.log(chalk.bold('SUMMARY'));
|
|
63
|
+
console.log(chalk.dim('─'.repeat(50)));
|
|
64
|
+
console.log(` Files scanned ${chalk.cyan(summary.filesScanned)}`);
|
|
65
|
+
console.log(` Total links ${chalk.cyan(summary.totalLinks)}`);
|
|
66
|
+
console.log(` ├─ Internal ${chalk.cyan(summary.internalLinks)}`);
|
|
67
|
+
console.log(` └─ External ${chalk.cyan(summary.externalLinks)}`);
|
|
68
|
+
console.log('');
|
|
69
|
+
const brokenTotal = summary.brokenInternal + summary.brokenExternal;
|
|
70
|
+
const brokenColor = brokenTotal > 0 ? chalk.red : chalk.green;
|
|
71
|
+
console.log(` Broken ${brokenColor(brokenTotal)}`);
|
|
72
|
+
if (brokenTotal > 0) {
|
|
73
|
+
console.log(` ├─ Internal ${chalk.red(summary.brokenInternal)}`);
|
|
74
|
+
console.log(` └─ External ${chalk.red(summary.brokenExternal)}`);
|
|
75
|
+
}
|
|
76
|
+
if (summary.timeouts > 0) {
|
|
77
|
+
console.log(` Timeouts ${chalk.yellow(summary.timeouts)}`);
|
|
78
|
+
}
|
|
79
|
+
if (summary.skipped > 0) {
|
|
80
|
+
console.log(` Skipped ${chalk.gray(summary.skipped)}`);
|
|
81
|
+
}
|
|
82
|
+
console.log('');
|
|
83
|
+
console.log(` Duration ${chalk.cyan(formatDuration(summary.duration))}`);
|
|
84
|
+
console.log(chalk.dim('─'.repeat(50)));
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/reporters/console.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA4B5D,wBAAgB,UAAU,CACxB,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,MAAM,GACd,MAAM,CA+BR"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { relativePath } from '../utils.js';
|
|
2
|
+
export function reportJson(results, summary, baseDir) {
|
|
3
|
+
const broken = results
|
|
4
|
+
.filter((r) => r.status === 'broken' || r.status === 'timeout')
|
|
5
|
+
.map((r) => ({
|
|
6
|
+
type: r.link.type,
|
|
7
|
+
href: r.link.href,
|
|
8
|
+
sourceFile: relativePath(r.link.sourceFile, baseDir),
|
|
9
|
+
line: r.link.line,
|
|
10
|
+
column: r.link.column,
|
|
11
|
+
context: r.link.context,
|
|
12
|
+
error: r.error,
|
|
13
|
+
statusCode: r.statusCode,
|
|
14
|
+
suggestions: r.suggestions,
|
|
15
|
+
}));
|
|
16
|
+
const skipped = results
|
|
17
|
+
.filter((r) => r.status === 'skipped')
|
|
18
|
+
.map((r) => ({
|
|
19
|
+
href: r.link.href,
|
|
20
|
+
sourceFile: relativePath(r.link.sourceFile, baseDir),
|
|
21
|
+
line: r.link.line,
|
|
22
|
+
reason: 'Matched ignore pattern',
|
|
23
|
+
}));
|
|
24
|
+
const report = {
|
|
25
|
+
summary,
|
|
26
|
+
broken,
|
|
27
|
+
skipped,
|
|
28
|
+
};
|
|
29
|
+
return JSON.stringify(report, null, 2);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA2B3C,MAAM,UAAU,UAAU,CACxB,OAA0B,EAC1B,OAAqB,EACrB,OAAe;IAEf,MAAM,MAAM,GAAG,OAAO;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;SAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;QACjB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;QACjB,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;QACpD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;QACjB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;QACrB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;QACvB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,WAAW,EAAE,CAAC,CAAC,WAAW;KAC3B,CAAC,CAAC,CAAC;IAEN,MAAM,OAAO,GAAG,OAAO;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;SACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;QACjB,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;QACpD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;QACjB,MAAM,EAAE,wBAAwB;KACjC,CAAC,CAAC,CAAC;IAEN,MAAM,MAAM,GAAe;QACzB,OAAO;QACP,MAAM;QACN,OAAO;KACR,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/reporters/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG5D,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,MAAM,GACd,MAAM,CAoGR"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { relativePath, formatDuration } from '../utils.js';
|
|
2
|
+
export function reportMarkdown(results, summary, baseDir) {
|
|
3
|
+
const lines = [];
|
|
4
|
+
const now = new Date().toISOString();
|
|
5
|
+
lines.push('# Link Check Report');
|
|
6
|
+
lines.push('');
|
|
7
|
+
lines.push(`Generated: ${now}`);
|
|
8
|
+
lines.push('');
|
|
9
|
+
// Summary table
|
|
10
|
+
lines.push('## Summary');
|
|
11
|
+
lines.push('');
|
|
12
|
+
lines.push('| Metric | Count |');
|
|
13
|
+
lines.push('|--------|-------|');
|
|
14
|
+
lines.push(`| Files scanned | ${summary.filesScanned} |`);
|
|
15
|
+
lines.push(`| Total links | ${summary.totalLinks} |`);
|
|
16
|
+
lines.push(`| Internal links | ${summary.internalLinks} |`);
|
|
17
|
+
lines.push(`| External links | ${summary.externalLinks} |`);
|
|
18
|
+
lines.push(`| Broken (internal) | ${summary.brokenInternal} |`);
|
|
19
|
+
lines.push(`| Broken (external) | ${summary.brokenExternal} |`);
|
|
20
|
+
lines.push(`| Timeouts | ${summary.timeouts} |`);
|
|
21
|
+
lines.push(`| Skipped | ${summary.skipped} |`);
|
|
22
|
+
lines.push(`| Duration | ${formatDuration(summary.duration)} |`);
|
|
23
|
+
lines.push('');
|
|
24
|
+
// Broken internal links
|
|
25
|
+
const brokenInternal = results.filter((r) => (r.status === 'broken' || r.status === 'timeout') &&
|
|
26
|
+
(r.link.type === 'internal' || r.link.type === 'anchor'));
|
|
27
|
+
if (brokenInternal.length > 0) {
|
|
28
|
+
lines.push(`## Broken Internal Links (${brokenInternal.length})`);
|
|
29
|
+
lines.push('');
|
|
30
|
+
// Group by file
|
|
31
|
+
const byFile = new Map();
|
|
32
|
+
for (const result of brokenInternal) {
|
|
33
|
+
const file = relativePath(result.link.sourceFile, baseDir);
|
|
34
|
+
const existing = byFile.get(file) || [];
|
|
35
|
+
existing.push(result);
|
|
36
|
+
byFile.set(file, existing);
|
|
37
|
+
}
|
|
38
|
+
for (const [file, fileResults] of byFile) {
|
|
39
|
+
lines.push(`### ${file}`);
|
|
40
|
+
lines.push('');
|
|
41
|
+
for (const result of fileResults) {
|
|
42
|
+
lines.push(`- **Line ${result.link.line}**: \`${result.link.href}\``);
|
|
43
|
+
lines.push(` - Error: ${result.error}`);
|
|
44
|
+
if (result.suggestions && result.suggestions.length > 0) {
|
|
45
|
+
lines.push(` - Suggestions: ${result.suggestions.join(', ')}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
lines.push('');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Broken external links
|
|
52
|
+
const brokenExternal = results.filter((r) => (r.status === 'broken' || r.status === 'timeout') &&
|
|
53
|
+
r.link.type === 'external');
|
|
54
|
+
if (brokenExternal.length > 0) {
|
|
55
|
+
lines.push(`## Broken External Links (${brokenExternal.length})`);
|
|
56
|
+
lines.push('');
|
|
57
|
+
// Group by file
|
|
58
|
+
const byFile = new Map();
|
|
59
|
+
for (const result of brokenExternal) {
|
|
60
|
+
const file = relativePath(result.link.sourceFile, baseDir);
|
|
61
|
+
const existing = byFile.get(file) || [];
|
|
62
|
+
existing.push(result);
|
|
63
|
+
byFile.set(file, existing);
|
|
64
|
+
}
|
|
65
|
+
for (const [file, fileResults] of byFile) {
|
|
66
|
+
lines.push(`### ${file}`);
|
|
67
|
+
lines.push('');
|
|
68
|
+
for (const result of fileResults) {
|
|
69
|
+
lines.push(`- **Line ${result.link.line}**: ${result.link.href}`);
|
|
70
|
+
lines.push(` - Error: ${result.error}${result.statusCode ? ` (${result.statusCode})` : ''}`);
|
|
71
|
+
}
|
|
72
|
+
lines.push('');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return lines.join('\n');
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/reporters/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-scanner.d.ts","sourceRoot":"","sources":["../../src/scanner/file-scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { glob } from 'glob';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
export async function scanFiles(directory, config) {
|
|
4
|
+
const baseDir = resolve(process.cwd(), directory);
|
|
5
|
+
const patterns = config.include.map((pattern) => pattern.startsWith('./') ? pattern.slice(2) : pattern);
|
|
6
|
+
const ignorePatterns = config.exclude.map((pattern) => pattern.startsWith('./') ? pattern.slice(2) : pattern);
|
|
7
|
+
const files = [];
|
|
8
|
+
for (const pattern of patterns) {
|
|
9
|
+
const matches = await glob(pattern, {
|
|
10
|
+
cwd: baseDir,
|
|
11
|
+
ignore: ignorePatterns,
|
|
12
|
+
absolute: true,
|
|
13
|
+
nodir: true,
|
|
14
|
+
});
|
|
15
|
+
files.push(...matches);
|
|
16
|
+
}
|
|
17
|
+
// Remove duplicates and sort
|
|
18
|
+
return [...new Set(files)].sort();
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=file-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../../src/scanner/file-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAiB,EACjB,MAAc;IAEd,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IAElD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC9C,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CACtD,CAAC;IAEF,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACpD,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CACtD,CAAC;IAEF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;YAClC,GAAG,EAAE,OAAO;YACZ,MAAM,EAAE,cAAc;YACtB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,6BAA6B;IAC7B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-extractor.d.ts","sourceRoot":"","sources":["../../src/scanner/link-extractor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAY,MAAM,EAAE,MAAM,aAAa,CAAC;AAU9D,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,aAAa,EAAE,CAgFjB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { isExternalUrl, isSpecialProtocol } from '../utils.js';
|
|
3
|
+
export function extractLinksFromFile(filePath, config) {
|
|
4
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
5
|
+
const lines = content.split('\n');
|
|
6
|
+
const rawLinks = [];
|
|
7
|
+
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
8
|
+
const line = lines[lineIndex];
|
|
9
|
+
const lineNumber = lineIndex + 1;
|
|
10
|
+
// Skip HTML comments
|
|
11
|
+
if (line.trim().startsWith('<!--')) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
// Extract markdown links: [text](url)
|
|
15
|
+
const markdownLinkRegex = /\[([^\]]*)\]\(([^)]+)\)/g;
|
|
16
|
+
let match;
|
|
17
|
+
while ((match = markdownLinkRegex.exec(line)) !== null) {
|
|
18
|
+
const href = match[2].trim();
|
|
19
|
+
rawLinks.push({
|
|
20
|
+
href,
|
|
21
|
+
line: lineNumber,
|
|
22
|
+
column: match.index + 1,
|
|
23
|
+
context: match[0],
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// Extract image references: 
|
|
27
|
+
const imageRegex = /!\[([^\]]*)\]\(([^)]+)\)/g;
|
|
28
|
+
while ((match = imageRegex.exec(line)) !== null) {
|
|
29
|
+
const href = match[2].trim();
|
|
30
|
+
rawLinks.push({
|
|
31
|
+
href,
|
|
32
|
+
line: lineNumber,
|
|
33
|
+
column: match.index + 1,
|
|
34
|
+
context: match[0],
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// Extract JSX component links
|
|
38
|
+
for (const component of config.customComponents) {
|
|
39
|
+
const jsxRegex = new RegExp(`<${component}\\s+[^>]*href=["']([^"']+)["'][^>]*/?>`, 'g');
|
|
40
|
+
while ((match = jsxRegex.exec(line)) !== null) {
|
|
41
|
+
rawLinks.push({
|
|
42
|
+
href: match[1],
|
|
43
|
+
line: lineNumber,
|
|
44
|
+
column: match.index + 1,
|
|
45
|
+
context: match[0],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Extract standard <a> tags
|
|
50
|
+
const anchorRegex = /<a\s+[^>]*href=["']([^"']+)["'][^>]*>/gi;
|
|
51
|
+
while ((match = anchorRegex.exec(line)) !== null) {
|
|
52
|
+
rawLinks.push({
|
|
53
|
+
href: match[1],
|
|
54
|
+
line: lineNumber,
|
|
55
|
+
column: match.index + 1,
|
|
56
|
+
context: match[0],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Convert raw links to ExtractedLink with type classification
|
|
61
|
+
return rawLinks
|
|
62
|
+
.filter((raw) => !isSpecialProtocol(raw.href))
|
|
63
|
+
.filter((raw) => raw.href.trim() !== '')
|
|
64
|
+
.map((raw) => ({
|
|
65
|
+
type: classifyLinkType(raw.href),
|
|
66
|
+
href: raw.href,
|
|
67
|
+
sourceFile: filePath,
|
|
68
|
+
line: raw.line,
|
|
69
|
+
column: raw.column,
|
|
70
|
+
context: raw.context,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
function classifyLinkType(href) {
|
|
74
|
+
if (isExternalUrl(href)) {
|
|
75
|
+
return 'external';
|
|
76
|
+
}
|
|
77
|
+
if (href.startsWith('#')) {
|
|
78
|
+
return 'anchor';
|
|
79
|
+
}
|
|
80
|
+
// Check for asset extensions
|
|
81
|
+
const assetExtensions = [
|
|
82
|
+
'.png',
|
|
83
|
+
'.jpg',
|
|
84
|
+
'.jpeg',
|
|
85
|
+
'.gif',
|
|
86
|
+
'.svg',
|
|
87
|
+
'.webp',
|
|
88
|
+
'.ico',
|
|
89
|
+
'.mp4',
|
|
90
|
+
'.webm',
|
|
91
|
+
'.mp3',
|
|
92
|
+
'.wav',
|
|
93
|
+
'.pdf',
|
|
94
|
+
];
|
|
95
|
+
const hrefLower = href.toLowerCase().split('#')[0].split('?')[0];
|
|
96
|
+
if (assetExtensions.some((ext) => hrefLower.endsWith(ext))) {
|
|
97
|
+
return 'asset';
|
|
98
|
+
}
|
|
99
|
+
return 'internal';
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=link-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-extractor.js","sourceRoot":"","sources":["../../src/scanner/link-extractor.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type LinkType = 'internal' | 'external' | 'anchor' | 'asset';
|
|
2
|
+
export type LinkStatus = 'valid' | 'broken' | 'skipped' | 'timeout';
|
|
3
|
+
export interface ExtractedLink {
|
|
4
|
+
type: LinkType;
|
|
5
|
+
href: string;
|
|
6
|
+
resolvedPath?: string;
|
|
7
|
+
sourceFile: string;
|
|
8
|
+
line: number;
|
|
9
|
+
column?: number;
|
|
10
|
+
context?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface LinkCheckResult {
|
|
13
|
+
link: ExtractedLink;
|
|
14
|
+
status: LinkStatus;
|
|
15
|
+
statusCode?: number;
|
|
16
|
+
error?: string;
|
|
17
|
+
suggestion?: string;
|
|
18
|
+
suggestions?: string[];
|
|
19
|
+
responseTime?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface CheckSummary {
|
|
22
|
+
filesScanned: number;
|
|
23
|
+
totalLinks: number;
|
|
24
|
+
internalLinks: number;
|
|
25
|
+
externalLinks: number;
|
|
26
|
+
brokenInternal: number;
|
|
27
|
+
brokenExternal: number;
|
|
28
|
+
skipped: number;
|
|
29
|
+
timeouts: number;
|
|
30
|
+
duration: number;
|
|
31
|
+
}
|
|
32
|
+
export interface Config {
|
|
33
|
+
include: string[];
|
|
34
|
+
exclude: string[];
|
|
35
|
+
ignorePatterns: string[];
|
|
36
|
+
ignoreDomains: string[];
|
|
37
|
+
timeout: number;
|
|
38
|
+
retries: number;
|
|
39
|
+
concurrency: number;
|
|
40
|
+
internalOnly: boolean;
|
|
41
|
+
externalOnly: boolean;
|
|
42
|
+
customComponents: string[];
|
|
43
|
+
routePrefixes: string[];
|
|
44
|
+
}
|
|
45
|
+
export declare const DEFAULT_CONFIG: Config;
|
|
46
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpE,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,cAAc,EAAE,MAY5B,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const DEFAULT_CONFIG = {
|
|
2
|
+
include: ['./**/*.mdx', './**/*.md'],
|
|
3
|
+
exclude: ['**/node_modules/**', '**/dist/**', '**/.git/**'],
|
|
4
|
+
ignorePatterns: ['localhost:*', '127.0.0.1:*', '*.local'],
|
|
5
|
+
ignoreDomains: [],
|
|
6
|
+
timeout: 10000,
|
|
7
|
+
retries: 2,
|
|
8
|
+
concurrency: 10,
|
|
9
|
+
internalOnly: false,
|
|
10
|
+
externalOnly: false,
|
|
11
|
+
customComponents: ['Link', 'A'],
|
|
12
|
+
routePrefixes: [],
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAkDA,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,OAAO,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,YAAY,CAAC;IAC3D,cAAc,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,SAAS,CAAC;IACzD,aAAa,EAAE,EAAE;IACjB,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,KAAK;IACnB,YAAY,EAAE,KAAK;IACnB,gBAAgB,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC;IAC/B,aAAa,EAAE,EAAE;CAClB,CAAC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function resolveInternalPath(href: string, sourceFile: string, baseDir: string): string;
|
|
2
|
+
export declare function shouldIgnoreUrl(href: string, ignorePatterns: string[], ignoreDomains: string[]): boolean;
|
|
3
|
+
export declare function isExternalUrl(href: string): boolean;
|
|
4
|
+
export declare function isSpecialProtocol(href: string): boolean;
|
|
5
|
+
export declare function formatDuration(ms: number): string;
|
|
6
|
+
export declare function relativePath(filePath: string, baseDir: string): string;
|
|
7
|
+
export declare function findSimilarPaths(target: string, availablePaths: string[], maxSuggestions?: number): string[];
|
|
8
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,MAAM,CAgBR;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EAAE,EACxB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CA2BT;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUvD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EAAE,EACxB,cAAc,SAAI,GACjB,MAAM,EAAE,CAqCV"}
|