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.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +211 -0
  3. package/dist/cache/url-cache.d.ts +13 -0
  4. package/dist/cache/url-cache.d.ts.map +1 -0
  5. package/dist/cache/url-cache.js +48 -0
  6. package/dist/cache/url-cache.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +160 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config.d.ts +4 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +42 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +5 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/parsers/heading-parser.d.ts +8 -0
  20. package/dist/parsers/heading-parser.d.ts.map +1 -0
  21. package/dist/parsers/heading-parser.js +63 -0
  22. package/dist/parsers/heading-parser.js.map +1 -0
  23. package/dist/parsers/index.d.ts +2 -0
  24. package/dist/parsers/index.d.ts.map +1 -0
  25. package/dist/parsers/index.js +2 -0
  26. package/dist/parsers/index.js.map +1 -0
  27. package/dist/reporters/console.d.ts +3 -0
  28. package/dist/reporters/console.d.ts.map +1 -0
  29. package/dist/reporters/console.js +86 -0
  30. package/dist/reporters/console.js.map +1 -0
  31. package/dist/reporters/index.d.ts +4 -0
  32. package/dist/reporters/index.d.ts.map +1 -0
  33. package/dist/reporters/index.js +4 -0
  34. package/dist/reporters/index.js.map +1 -0
  35. package/dist/reporters/json.d.ts +3 -0
  36. package/dist/reporters/json.d.ts.map +1 -0
  37. package/dist/reporters/json.js +31 -0
  38. package/dist/reporters/json.js.map +1 -0
  39. package/dist/reporters/markdown.d.ts +3 -0
  40. package/dist/reporters/markdown.d.ts.map +1 -0
  41. package/dist/reporters/markdown.js +77 -0
  42. package/dist/reporters/markdown.js.map +1 -0
  43. package/dist/scanner/file-scanner.d.ts +3 -0
  44. package/dist/scanner/file-scanner.d.ts.map +1 -0
  45. package/dist/scanner/file-scanner.js +20 -0
  46. package/dist/scanner/file-scanner.js.map +1 -0
  47. package/dist/scanner/index.d.ts +3 -0
  48. package/dist/scanner/index.d.ts.map +1 -0
  49. package/dist/scanner/index.js +3 -0
  50. package/dist/scanner/index.js.map +1 -0
  51. package/dist/scanner/link-extractor.d.ts +3 -0
  52. package/dist/scanner/link-extractor.d.ts.map +1 -0
  53. package/dist/scanner/link-extractor.js +101 -0
  54. package/dist/scanner/link-extractor.js.map +1 -0
  55. package/dist/types.d.ts +46 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +14 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/utils.d.ts +8 -0
  60. package/dist/utils.d.ts.map +1 -0
  61. package/dist/utils.js +115 -0
  62. package/dist/utils.js.map +1 -0
  63. package/dist/validators/external.d.ts +4 -0
  64. package/dist/validators/external.d.ts.map +1 -0
  65. package/dist/validators/external.js +111 -0
  66. package/dist/validators/external.js.map +1 -0
  67. package/dist/validators/index.d.ts +3 -0
  68. package/dist/validators/index.d.ts.map +1 -0
  69. package/dist/validators/index.js +3 -0
  70. package/dist/validators/index.js.map +1 -0
  71. package/dist/validators/internal.d.ts +3 -0
  72. package/dist/validators/internal.d.ts.map +1 -0
  73. package/dist/validators/internal.js +55 -0
  74. package/dist/validators/internal.js.map +1 -0
  75. 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,3 @@
1
+ import { LinkCheckResult, CheckSummary } from '../types.js';
2
+ export declare function reportConsole(results: LinkCheckResult[], summary: CheckSummary, baseDir: string, verbose: boolean): void;
3
+ //# sourceMappingURL=console.d.ts.map
@@ -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,4 @@
1
+ export { reportConsole } from './console.js';
2
+ export { reportJson } from './json.js';
3
+ export { reportMarkdown } from './markdown.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export { reportConsole } from './console.js';
2
+ export { reportJson } from './json.js';
3
+ export { reportMarkdown } from './markdown.js';
4
+ //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ import { LinkCheckResult, CheckSummary } from '../types.js';
2
+ export declare function reportJson(results: LinkCheckResult[], summary: CheckSummary, baseDir: string): string;
3
+ //# sourceMappingURL=json.d.ts.map
@@ -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,3 @@
1
+ import { LinkCheckResult, CheckSummary } from '../types.js';
2
+ export declare function reportMarkdown(results: LinkCheckResult[], summary: CheckSummary, baseDir: string): string;
3
+ //# sourceMappingURL=markdown.d.ts.map
@@ -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,3 @@
1
+ import { Config } from '../types.js';
2
+ export declare function scanFiles(directory: string, config: Config): Promise<string[]>;
3
+ //# sourceMappingURL=file-scanner.d.ts.map
@@ -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,3 @@
1
+ export { scanFiles } from './file-scanner.js';
2
+ export { extractLinksFromFile } from './link-extractor.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export { scanFiles } from './file-scanner.js';
2
+ export { extractLinksFromFile } from './link-extractor.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ import { ExtractedLink, Config } from '../types.js';
2
+ export declare function extractLinksFromFile(filePath: string, config: Config): ExtractedLink[];
3
+ //# sourceMappingURL=link-extractor.d.ts.map
@@ -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: ![alt](url)
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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"}
@@ -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"}
@@ -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"}