@theglitchking/hit-em-with-the-docs 2.0.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/.claude-plugin/marketplace.json +46 -0
- package/.claude-plugin/plugin.json +114 -0
- package/LICENSE +21 -0
- package/MIGRATION.md +255 -0
- package/README.backup.md +714 -0
- package/README.md +869 -0
- package/action.yml +56 -0
- package/dist/action/action/index.d.ts +2 -0
- package/dist/action/action/index.d.ts.map +1 -0
- package/dist/action/cli/index.d.ts +3 -0
- package/dist/action/cli/index.d.ts.map +1 -0
- package/dist/action/core/audit/auditor.d.ts +43 -0
- package/dist/action/core/audit/auditor.d.ts.map +1 -0
- package/dist/action/core/audit/rules.d.ts +37 -0
- package/dist/action/core/audit/rules.d.ts.map +1 -0
- package/dist/action/core/discover/antipatterns.d.ts +24 -0
- package/dist/action/core/discover/antipatterns.d.ts.map +1 -0
- package/dist/action/core/discover/dependencies.d.ts +57 -0
- package/dist/action/core/discover/dependencies.d.ts.map +1 -0
- package/dist/action/core/discover/patterns.d.ts +38 -0
- package/dist/action/core/discover/patterns.d.ts.map +1 -0
- package/dist/action/core/discover/standards.d.ts +58 -0
- package/dist/action/core/discover/standards.d.ts.map +1 -0
- package/dist/action/core/domains/classifier.d.ts +41 -0
- package/dist/action/core/domains/classifier.d.ts.map +1 -0
- package/dist/action/core/domains/constants.d.ts +40 -0
- package/dist/action/core/domains/constants.d.ts.map +1 -0
- package/dist/action/core/domains/detector.d.ts +35 -0
- package/dist/action/core/domains/detector.d.ts.map +1 -0
- package/dist/action/core/integrate/integrator.d.ts +35 -0
- package/dist/action/core/integrate/integrator.d.ts.map +1 -0
- package/dist/action/core/links/checker.d.ts +64 -0
- package/dist/action/core/links/checker.d.ts.map +1 -0
- package/dist/action/core/links/tracker.d.ts +69 -0
- package/dist/action/core/links/tracker.d.ts.map +1 -0
- package/dist/action/core/maintain/orchestrator.d.ts +39 -0
- package/dist/action/core/maintain/orchestrator.d.ts.map +1 -0
- package/dist/action/core/metadata/generator.d.ts +26 -0
- package/dist/action/core/metadata/generator.d.ts.map +1 -0
- package/dist/action/core/metadata/schema.d.ts +201 -0
- package/dist/action/core/metadata/schema.d.ts.map +1 -0
- package/dist/action/core/metadata/sync.d.ts +36 -0
- package/dist/action/core/metadata/sync.d.ts.map +1 -0
- package/dist/action/generators/index-generator.d.ts +19 -0
- package/dist/action/generators/index-generator.d.ts.map +1 -0
- package/dist/action/generators/registry-generator.d.ts +11 -0
- package/dist/action/generators/registry-generator.d.ts.map +1 -0
- package/dist/action/generators/scaffold.d.ts +30 -0
- package/dist/action/generators/scaffold.d.ts.map +1 -0
- package/dist/action/generators/templates/document.d.ts +14 -0
- package/dist/action/generators/templates/document.d.ts.map +1 -0
- package/dist/action/generators/templates/domain-index.d.ts +6 -0
- package/dist/action/generators/templates/domain-index.d.ts.map +1 -0
- package/dist/action/generators/templates/domain-registry.d.ts +6 -0
- package/dist/action/generators/templates/domain-registry.d.ts.map +1 -0
- package/dist/action/index.d.ts +31 -0
- package/dist/action/index.d.ts.map +1 -0
- package/dist/action/index.js +17 -0
- package/dist/action/index.js.map +1 -0
- package/dist/action/package.json +3 -0
- package/dist/action/reports/audit-report.d.ts +15 -0
- package/dist/action/reports/audit-report.d.ts.map +1 -0
- package/dist/action/reports/health-report.d.ts +15 -0
- package/dist/action/reports/health-report.d.ts.map +1 -0
- package/dist/action/reports/link-report.d.ts +15 -0
- package/dist/action/reports/link-report.d.ts.map +1 -0
- package/dist/action/utils/frontmatter.d.ts +50 -0
- package/dist/action/utils/frontmatter.d.ts.map +1 -0
- package/dist/action/utils/glob.d.ts +63 -0
- package/dist/action/utils/glob.d.ts.map +1 -0
- package/dist/action/utils/logger.d.ts +42 -0
- package/dist/action/utils/logger.d.ts.map +1 -0
- package/dist/action/utils/markdown.d.ts +89 -0
- package/dist/action/utils/markdown.d.ts.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +287 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/audit/auditor.d.ts +43 -0
- package/dist/core/audit/auditor.d.ts.map +1 -0
- package/dist/core/audit/auditor.js +273 -0
- package/dist/core/audit/auditor.js.map +1 -0
- package/dist/core/audit/rules.d.ts +37 -0
- package/dist/core/audit/rules.d.ts.map +1 -0
- package/dist/core/audit/rules.js +223 -0
- package/dist/core/audit/rules.js.map +1 -0
- package/dist/core/discover/antipatterns.d.ts +24 -0
- package/dist/core/discover/antipatterns.d.ts.map +1 -0
- package/dist/core/discover/antipatterns.js +354 -0
- package/dist/core/discover/antipatterns.js.map +1 -0
- package/dist/core/discover/dependencies.d.ts +57 -0
- package/dist/core/discover/dependencies.d.ts.map +1 -0
- package/dist/core/discover/dependencies.js +311 -0
- package/dist/core/discover/dependencies.js.map +1 -0
- package/dist/core/discover/patterns.d.ts +38 -0
- package/dist/core/discover/patterns.d.ts.map +1 -0
- package/dist/core/discover/patterns.js +371 -0
- package/dist/core/discover/patterns.js.map +1 -0
- package/dist/core/discover/standards.d.ts +58 -0
- package/dist/core/discover/standards.d.ts.map +1 -0
- package/dist/core/discover/standards.js +359 -0
- package/dist/core/discover/standards.js.map +1 -0
- package/dist/core/domains/classifier.d.ts +41 -0
- package/dist/core/domains/classifier.d.ts.map +1 -0
- package/dist/core/domains/classifier.js +208 -0
- package/dist/core/domains/classifier.js.map +1 -0
- package/dist/core/domains/constants.d.ts +40 -0
- package/dist/core/domains/constants.d.ts.map +1 -0
- package/dist/core/domains/constants.js +252 -0
- package/dist/core/domains/constants.js.map +1 -0
- package/dist/core/domains/detector.d.ts +35 -0
- package/dist/core/domains/detector.d.ts.map +1 -0
- package/dist/core/domains/detector.js +176 -0
- package/dist/core/domains/detector.js.map +1 -0
- package/dist/core/integrate/integrator.d.ts +35 -0
- package/dist/core/integrate/integrator.d.ts.map +1 -0
- package/dist/core/integrate/integrator.js +216 -0
- package/dist/core/integrate/integrator.js.map +1 -0
- package/dist/core/links/checker.d.ts +64 -0
- package/dist/core/links/checker.d.ts.map +1 -0
- package/dist/core/links/checker.js +190 -0
- package/dist/core/links/checker.js.map +1 -0
- package/dist/core/links/tracker.d.ts +69 -0
- package/dist/core/links/tracker.d.ts.map +1 -0
- package/dist/core/links/tracker.js +184 -0
- package/dist/core/links/tracker.js.map +1 -0
- package/dist/core/maintain/orchestrator.d.ts +39 -0
- package/dist/core/maintain/orchestrator.d.ts.map +1 -0
- package/dist/core/maintain/orchestrator.js +372 -0
- package/dist/core/maintain/orchestrator.js.map +1 -0
- package/dist/core/metadata/generator.d.ts +26 -0
- package/dist/core/metadata/generator.d.ts.map +1 -0
- package/dist/core/metadata/generator.js +221 -0
- package/dist/core/metadata/generator.js.map +1 -0
- package/dist/core/metadata/schema.d.ts +201 -0
- package/dist/core/metadata/schema.d.ts.map +1 -0
- package/dist/core/metadata/schema.js +184 -0
- package/dist/core/metadata/schema.js.map +1 -0
- package/dist/core/metadata/sync.d.ts +36 -0
- package/dist/core/metadata/sync.d.ts.map +1 -0
- package/dist/core/metadata/sync.js +195 -0
- package/dist/core/metadata/sync.js.map +1 -0
- package/dist/generators/index-generator.d.ts +19 -0
- package/dist/generators/index-generator.d.ts.map +1 -0
- package/dist/generators/index-generator.js +191 -0
- package/dist/generators/index-generator.js.map +1 -0
- package/dist/generators/registry-generator.d.ts +11 -0
- package/dist/generators/registry-generator.d.ts.map +1 -0
- package/dist/generators/registry-generator.js +156 -0
- package/dist/generators/registry-generator.js.map +1 -0
- package/dist/generators/scaffold.d.ts +30 -0
- package/dist/generators/scaffold.d.ts.map +1 -0
- package/dist/generators/scaffold.js +213 -0
- package/dist/generators/scaffold.js.map +1 -0
- package/dist/generators/templates/document.d.ts +14 -0
- package/dist/generators/templates/document.d.ts.map +1 -0
- package/dist/generators/templates/document.js +305 -0
- package/dist/generators/templates/document.js.map +1 -0
- package/dist/generators/templates/domain-index.d.ts +6 -0
- package/dist/generators/templates/domain-index.d.ts.map +1 -0
- package/dist/generators/templates/domain-index.js +68 -0
- package/dist/generators/templates/domain-index.js.map +1 -0
- package/dist/generators/templates/domain-registry.d.ts +6 -0
- package/dist/generators/templates/domain-registry.d.ts.map +1 -0
- package/dist/generators/templates/domain-registry.js +59 -0
- package/dist/generators/templates/domain-registry.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/reports/audit-report.d.ts +15 -0
- package/dist/reports/audit-report.d.ts.map +1 -0
- package/dist/reports/audit-report.js +150 -0
- package/dist/reports/audit-report.js.map +1 -0
- package/dist/reports/health-report.d.ts +15 -0
- package/dist/reports/health-report.d.ts.map +1 -0
- package/dist/reports/health-report.js +175 -0
- package/dist/reports/health-report.js.map +1 -0
- package/dist/reports/link-report.d.ts +15 -0
- package/dist/reports/link-report.d.ts.map +1 -0
- package/dist/reports/link-report.js +165 -0
- package/dist/reports/link-report.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +50 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +93 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/glob.d.ts +63 -0
- package/dist/utils/glob.d.ts.map +1 -0
- package/dist/utils/glob.js +128 -0
- package/dist/utils/glob.js.map +1 -0
- package/dist/utils/logger.d.ts +42 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +118 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown.d.ts +89 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +192 -0
- package/dist/utils/markdown.js.map +1 -0
- package/package.json +100 -0
- package/templates/claude/CLAUDE.md +204 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { pathExists } from '../utils/glob.js';
|
|
4
|
+
import { formatDate } from '../core/metadata/generator.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generate a link report
|
|
7
|
+
*/
|
|
8
|
+
export async function generateLinkReport(options) {
|
|
9
|
+
const { result, format = 'markdown' } = options;
|
|
10
|
+
if (format === 'json') {
|
|
11
|
+
return generateJsonReport(result);
|
|
12
|
+
}
|
|
13
|
+
return generateMarkdownReport(result);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Generate markdown link report
|
|
17
|
+
*/
|
|
18
|
+
function generateMarkdownReport(result) {
|
|
19
|
+
const now = formatDate(new Date());
|
|
20
|
+
const timestamp = new Date().toISOString();
|
|
21
|
+
let content = `---
|
|
22
|
+
title: Link Check Report
|
|
23
|
+
tier: admin
|
|
24
|
+
domains: [root]
|
|
25
|
+
status: active
|
|
26
|
+
last_updated: '${now}'
|
|
27
|
+
version: '1.0.0'
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
# Link Check Report
|
|
31
|
+
|
|
32
|
+
**Generated:** ${timestamp}
|
|
33
|
+
|
|
34
|
+
## Summary
|
|
35
|
+
|
|
36
|
+
| Metric | Value |
|
|
37
|
+
|--------|-------|
|
|
38
|
+
| Files Checked | ${result.totalFiles} |
|
|
39
|
+
| Total Links | ${result.totalLinks} |
|
|
40
|
+
| Valid Links | ${result.validLinks} |
|
|
41
|
+
| Broken Links | ${result.brokenLinks.length} |
|
|
42
|
+
| Internal Links | ${result.stats.internalLinks} |
|
|
43
|
+
| External Links | ${result.stats.externalLinks} |
|
|
44
|
+
| Cross-Domain Links | ${result.stats.crossDomainLinks} |
|
|
45
|
+
|
|
46
|
+
## Link Health
|
|
47
|
+
|
|
48
|
+
\`\`\`
|
|
49
|
+
Total Links: ${result.totalLinks}
|
|
50
|
+
├── Valid: ${result.validLinks} (${((result.validLinks / result.totalLinks) * 100).toFixed(1)}%)
|
|
51
|
+
├── Broken: ${result.brokenLinks.length} (${result.stats.brokenPercentage.toFixed(1)}%)
|
|
52
|
+
└── Cross-Domain: ${result.stats.crossDomainLinks} (${((result.stats.crossDomainLinks / result.totalLinks) * 100).toFixed(1)}%)
|
|
53
|
+
\`\`\`
|
|
54
|
+
|
|
55
|
+
`;
|
|
56
|
+
// Broken Links
|
|
57
|
+
if (result.brokenLinks.length > 0) {
|
|
58
|
+
content += `## Broken Links (${result.brokenLinks.length})
|
|
59
|
+
|
|
60
|
+
| Source File | Line | Target | Link Text |
|
|
61
|
+
|-------------|------|--------|-----------|
|
|
62
|
+
`;
|
|
63
|
+
for (const link of result.brokenLinks) {
|
|
64
|
+
content += `| ${link.sourceFile} | ${link.lineNumber} | \`${link.targetPath}\` | ${link.linkText.slice(0, 30)} |\n`;
|
|
65
|
+
}
|
|
66
|
+
content += '\n';
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
content += `## Broken Links
|
|
70
|
+
|
|
71
|
+
✅ No broken links found!
|
|
72
|
+
|
|
73
|
+
`;
|
|
74
|
+
}
|
|
75
|
+
// Top Cross-Domain Connections
|
|
76
|
+
if (result.stats.topConnectedDomains.length > 0) {
|
|
77
|
+
content += `## Cross-Domain Connections
|
|
78
|
+
|
|
79
|
+
| From | To | Links |
|
|
80
|
+
|------|-----|-------|
|
|
81
|
+
`;
|
|
82
|
+
for (const conn of result.stats.topConnectedDomains) {
|
|
83
|
+
content += `| ${conn.from} | ${conn.to} | ${conn.count} |\n`;
|
|
84
|
+
}
|
|
85
|
+
content += '\n';
|
|
86
|
+
}
|
|
87
|
+
// Cross-Domain Links Details
|
|
88
|
+
if (result.crossDomainLinks.length > 0) {
|
|
89
|
+
content += `## Cross-Domain Link Details
|
|
90
|
+
|
|
91
|
+
<details>
|
|
92
|
+
<summary>Show all ${result.crossDomainLinks.length} cross-domain links</summary>
|
|
93
|
+
|
|
94
|
+
| Source | From Domain | Target Domain | Link |
|
|
95
|
+
|--------|-------------|---------------|------|
|
|
96
|
+
`;
|
|
97
|
+
for (const link of result.crossDomainLinks.slice(0, 50)) {
|
|
98
|
+
content += `| ${link.sourceFile} | ${link.sourceDomain} | ${link.targetDomain} | ${link.linkText.slice(0, 30)} |\n`;
|
|
99
|
+
}
|
|
100
|
+
if (result.crossDomainLinks.length > 50) {
|
|
101
|
+
content += `\n*...and ${result.crossDomainLinks.length - 50} more*\n`;
|
|
102
|
+
}
|
|
103
|
+
content += '\n</details>\n\n';
|
|
104
|
+
}
|
|
105
|
+
// External Links
|
|
106
|
+
if (result.externalLinks.length > 0) {
|
|
107
|
+
content += `## External Links (${result.externalLinks.length})
|
|
108
|
+
|
|
109
|
+
<details>
|
|
110
|
+
<summary>Show external links</summary>
|
|
111
|
+
|
|
112
|
+
| Source File | URL |
|
|
113
|
+
|-------------|-----|
|
|
114
|
+
`;
|
|
115
|
+
for (const link of result.externalLinks.slice(0, 30)) {
|
|
116
|
+
content += `| ${link.sourceFile} | ${link.url.slice(0, 50)}${link.url.length > 50 ? '...' : ''} |\n`;
|
|
117
|
+
}
|
|
118
|
+
if (result.externalLinks.length > 30) {
|
|
119
|
+
content += `\n*...and ${result.externalLinks.length - 30} more*\n`;
|
|
120
|
+
}
|
|
121
|
+
content += '\n</details>\n\n';
|
|
122
|
+
}
|
|
123
|
+
content += `---
|
|
124
|
+
|
|
125
|
+
*Generated by hit-em-with-the-docs*
|
|
126
|
+
`;
|
|
127
|
+
return content;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Generate JSON link report
|
|
131
|
+
*/
|
|
132
|
+
function generateJsonReport(result) {
|
|
133
|
+
return JSON.stringify({
|
|
134
|
+
timestamp: new Date().toISOString(),
|
|
135
|
+
summary: {
|
|
136
|
+
totalFiles: result.totalFiles,
|
|
137
|
+
totalLinks: result.totalLinks,
|
|
138
|
+
validLinks: result.validLinks,
|
|
139
|
+
brokenLinks: result.brokenLinks.length,
|
|
140
|
+
externalLinks: result.externalLinks.length,
|
|
141
|
+
crossDomainLinks: result.crossDomainLinks.length,
|
|
142
|
+
},
|
|
143
|
+
stats: result.stats,
|
|
144
|
+
brokenLinks: result.brokenLinks,
|
|
145
|
+
crossDomainLinks: result.crossDomainLinks,
|
|
146
|
+
externalLinks: result.externalLinks,
|
|
147
|
+
}, null, 2);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Save link report to file
|
|
151
|
+
*/
|
|
152
|
+
export async function saveLinkReport(docsPath, result, format = 'markdown') {
|
|
153
|
+
const reportsDir = join(docsPath, 'reports');
|
|
154
|
+
if (!(await pathExists(reportsDir))) {
|
|
155
|
+
await mkdir(reportsDir, { recursive: true });
|
|
156
|
+
}
|
|
157
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
158
|
+
const ext = format === 'json' ? 'json' : 'md';
|
|
159
|
+
const fileName = `links-${timestamp}.${ext}`;
|
|
160
|
+
const filePath = join(reportsDir, fileName);
|
|
161
|
+
const content = await generateLinkReport({ docsPath, result, format });
|
|
162
|
+
await writeFile(filePath, content, 'utf-8');
|
|
163
|
+
return filePath;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=link-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-report.js","sourceRoot":"","sources":["../../src/reports/link-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAS3D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA0B;IAE1B,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IAEhD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,MAAuB;IACrD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,IAAI,OAAO,GAAG;;;;;iBAKC,GAAG;;;;;;iBAMH,SAAS;;;;;;oBAMN,MAAM,CAAC,UAAU;kBACnB,MAAM,CAAC,UAAU;kBACjB,MAAM,CAAC,UAAU;mBAChB,MAAM,CAAC,WAAW,CAAC,MAAM;qBACvB,MAAM,CAAC,KAAK,CAAC,aAAa;qBAC1B,MAAM,CAAC,KAAK,CAAC,aAAa;yBACtB,MAAM,CAAC,KAAK,CAAC,gBAAgB;;;;;eAKvC,MAAM,CAAC,UAAU;aACnB,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;cAC/E,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;oBAChE,MAAM,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;;CAG3H,CAAC;IAEA,eAAe;IACf,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,oBAAoB,MAAM,CAAC,WAAW,CAAC,MAAM;;;;CAI3D,CAAC;QACE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACtC,OAAO,IAAI,KAAK,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,UAAU,QAAQ,IAAI,CAAC,UAAU,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;QACtH,CAAC;QACD,OAAO,IAAI,IAAI,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,IAAI;;;;CAId,CAAC;IACA,CAAC;IAED,+BAA+B;IAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI;;;;CAId,CAAC;QACE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;YACpD,OAAO,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,KAAK,MAAM,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,IAAI,CAAC;IAClB,CAAC;IAED,6BAA6B;IAC7B,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI;;;oBAGK,MAAM,CAAC,gBAAgB,CAAC,MAAM;;;;CAIjD,CAAC;QACE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,KAAK,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,YAAY,MAAM,IAAI,CAAC,YAAY,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;QACtH,CAAC;QACD,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACxC,OAAO,IAAI,aAAa,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,UAAU,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,kBAAkB,CAAC;IAChC,CAAC;IAED,iBAAiB;IACjB,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,sBAAsB,MAAM,CAAC,aAAa,CAAC,MAAM;;;;;;;CAO/D,CAAC;QACE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,KAAK,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QACvG,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACrC,OAAO,IAAI,aAAa,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,UAAU,CAAC;QACrE,CAAC;QACD,OAAO,IAAI,kBAAkB,CAAC;IAChC,CAAC;IAED,OAAO,IAAI;;;CAGZ,CAAC;IAEA,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,MAAuB;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE;YACP,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;YACtC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM;YAC1C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC,MAAM;SACjD;QACD,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,MAAuB,EACvB,SAA8B,UAAU;IAExC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE7C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9C,MAAM,QAAQ,GAAG,SAAS,SAAS,IAAI,GAAG,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface FrontmatterResult<T = Record<string, unknown>> {
|
|
2
|
+
data: T;
|
|
3
|
+
content: string;
|
|
4
|
+
isEmpty: boolean;
|
|
5
|
+
excerpt?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Parse frontmatter from markdown content
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseFrontmatter<T = Record<string, unknown>>(content: string): FrontmatterResult<T>;
|
|
11
|
+
/**
|
|
12
|
+
* Check if content has frontmatter
|
|
13
|
+
*/
|
|
14
|
+
export declare function hasFrontmatter(content: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Extract frontmatter string from content
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractFrontmatterString(content: string): string | null;
|
|
19
|
+
/**
|
|
20
|
+
* Stringify frontmatter data to YAML
|
|
21
|
+
*/
|
|
22
|
+
export declare function stringifyFrontmatter(data: Record<string, unknown>): string;
|
|
23
|
+
/**
|
|
24
|
+
* Add or update frontmatter in content
|
|
25
|
+
*/
|
|
26
|
+
export declare function setFrontmatter(content: string, data: Record<string, unknown>): string;
|
|
27
|
+
/**
|
|
28
|
+
* Merge frontmatter data with existing
|
|
29
|
+
*/
|
|
30
|
+
export declare function mergeFrontmatter(content: string, newData: Record<string, unknown>): string;
|
|
31
|
+
/**
|
|
32
|
+
* Remove frontmatter from content
|
|
33
|
+
*/
|
|
34
|
+
export declare function removeFrontmatter(content: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* Get specific frontmatter field
|
|
37
|
+
*/
|
|
38
|
+
export declare function getFrontmatterField<T>(content: string, field: string): T | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Set specific frontmatter field
|
|
41
|
+
*/
|
|
42
|
+
export declare function setFrontmatterField(content: string, field: string, value: unknown): string;
|
|
43
|
+
/**
|
|
44
|
+
* Validate frontmatter structure
|
|
45
|
+
*/
|
|
46
|
+
export declare function validateFrontmatter(content: string, requiredFields: string[]): {
|
|
47
|
+
valid: boolean;
|
|
48
|
+
missingFields: string[];
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=frontmatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,OAAO,EAAE,MAAM,GACd,iBAAiB,CAAC,CAAC,CAAC,CAWtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAO1E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAIR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,SAAS,CAGf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,GACb,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EAAE,GACvB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CAS7C"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import matter from 'gray-matter';
|
|
2
|
+
import yaml from 'yaml';
|
|
3
|
+
/**
|
|
4
|
+
* Parse frontmatter from markdown content
|
|
5
|
+
*/
|
|
6
|
+
export function parseFrontmatter(content) {
|
|
7
|
+
const result = matter(content);
|
|
8
|
+
const parsed = {
|
|
9
|
+
data: result.data,
|
|
10
|
+
content: result.content,
|
|
11
|
+
isEmpty: Object.keys(result.data).length === 0,
|
|
12
|
+
};
|
|
13
|
+
if (result.excerpt) {
|
|
14
|
+
parsed.excerpt = result.excerpt;
|
|
15
|
+
}
|
|
16
|
+
return parsed;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if content has frontmatter
|
|
20
|
+
*/
|
|
21
|
+
export function hasFrontmatter(content) {
|
|
22
|
+
return content.trimStart().startsWith('---');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Extract frontmatter string from content
|
|
26
|
+
*/
|
|
27
|
+
export function extractFrontmatterString(content) {
|
|
28
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
29
|
+
return match ? match[1] ?? null : null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Stringify frontmatter data to YAML
|
|
33
|
+
*/
|
|
34
|
+
export function stringifyFrontmatter(data) {
|
|
35
|
+
// Use yaml library for better formatting control
|
|
36
|
+
return yaml.stringify(data, {
|
|
37
|
+
indent: 2,
|
|
38
|
+
lineWidth: 80,
|
|
39
|
+
singleQuote: true,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Add or update frontmatter in content
|
|
44
|
+
*/
|
|
45
|
+
export function setFrontmatter(content, data) {
|
|
46
|
+
const { content: body } = parseFrontmatter(content);
|
|
47
|
+
const frontmatter = stringifyFrontmatter(data);
|
|
48
|
+
return `---\n${frontmatter}---\n\n${body.trimStart()}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Merge frontmatter data with existing
|
|
52
|
+
*/
|
|
53
|
+
export function mergeFrontmatter(content, newData) {
|
|
54
|
+
const { data: existingData, content: body } = parseFrontmatter(content);
|
|
55
|
+
const mergedData = { ...existingData, ...newData };
|
|
56
|
+
const frontmatter = stringifyFrontmatter(mergedData);
|
|
57
|
+
return `---\n${frontmatter}---\n\n${body.trimStart()}`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Remove frontmatter from content
|
|
61
|
+
*/
|
|
62
|
+
export function removeFrontmatter(content) {
|
|
63
|
+
const { content: body } = parseFrontmatter(content);
|
|
64
|
+
return body.trimStart();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get specific frontmatter field
|
|
68
|
+
*/
|
|
69
|
+
export function getFrontmatterField(content, field) {
|
|
70
|
+
const { data } = parseFrontmatter(content);
|
|
71
|
+
return data[field];
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Set specific frontmatter field
|
|
75
|
+
*/
|
|
76
|
+
export function setFrontmatterField(content, field, value) {
|
|
77
|
+
const { data, content: body } = parseFrontmatter(content);
|
|
78
|
+
data[field] = value;
|
|
79
|
+
const frontmatter = stringifyFrontmatter(data);
|
|
80
|
+
return `---\n${frontmatter}---\n\n${body.trimStart()}`;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Validate frontmatter structure
|
|
84
|
+
*/
|
|
85
|
+
export function validateFrontmatter(content, requiredFields) {
|
|
86
|
+
const { data } = parseFrontmatter(content);
|
|
87
|
+
const missingFields = requiredFields.filter((field) => !(field in data) || data[field] === undefined || data[field] === null);
|
|
88
|
+
return {
|
|
89
|
+
valid: missingFields.length === 0,
|
|
90
|
+
missingFields,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export interface GlobOptions {
|
|
2
|
+
cwd?: string;
|
|
3
|
+
absolute?: boolean;
|
|
4
|
+
ignore?: string[];
|
|
5
|
+
dot?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Find files matching a glob pattern
|
|
9
|
+
*/
|
|
10
|
+
export declare function glob(pattern: string, options?: GlobOptions): Promise<string[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Find all markdown files in a directory
|
|
13
|
+
*/
|
|
14
|
+
export declare function findMarkdownFiles(dir: string, options?: Omit<GlobOptions, 'absolute'>): Promise<string[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Check if a path exists
|
|
17
|
+
*/
|
|
18
|
+
export declare function pathExists(path: string): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Check if a path exists (sync)
|
|
21
|
+
*/
|
|
22
|
+
export declare function pathExistsSync(path: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Check if a path is a directory
|
|
25
|
+
*/
|
|
26
|
+
export declare function isDirectory(path: string): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a path is a file
|
|
29
|
+
*/
|
|
30
|
+
export declare function isFile(path: string): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Get all subdirectories in a directory
|
|
33
|
+
*/
|
|
34
|
+
export declare function getSubdirectories(dir: string): Promise<string[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Resolve a path relative to a base
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolvePath(base: string, relativePath: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Get relative path from base to target
|
|
41
|
+
*/
|
|
42
|
+
export declare function getRelativePath(base: string, target: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Get directory name from path
|
|
45
|
+
*/
|
|
46
|
+
export declare function getDirname(path: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Get base name from path
|
|
49
|
+
*/
|
|
50
|
+
export declare function getBasename(path: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Get file extension
|
|
53
|
+
*/
|
|
54
|
+
export declare function getExtension(path: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Remove file extension from path
|
|
57
|
+
*/
|
|
58
|
+
export declare function removeExtension(path: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* Normalize path separators
|
|
61
|
+
*/
|
|
62
|
+
export declare function normalizePath(path: string): string;
|
|
63
|
+
//# sourceMappingURL=glob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/utils/glob.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAM,GAC1C,OAAO,CAAC,MAAM,EAAE,CAAC,CAMnB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhE;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAStE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { glob as globLib } from 'glob';
|
|
2
|
+
import { resolve, relative, dirname, basename, extname, join } from 'path';
|
|
3
|
+
import { stat, readdir } from 'fs/promises';
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
/**
|
|
6
|
+
* Find files matching a glob pattern
|
|
7
|
+
*/
|
|
8
|
+
export async function glob(pattern, options = {}) {
|
|
9
|
+
const { cwd = process.cwd(), absolute = false, ignore = ['node_modules/**', 'dist/**', '.git/**'], dot = false, } = options;
|
|
10
|
+
const matches = await globLib(pattern, {
|
|
11
|
+
cwd,
|
|
12
|
+
absolute,
|
|
13
|
+
ignore,
|
|
14
|
+
dot,
|
|
15
|
+
nodir: true,
|
|
16
|
+
});
|
|
17
|
+
return matches;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Find all markdown files in a directory
|
|
21
|
+
*/
|
|
22
|
+
export async function findMarkdownFiles(dir, options = {}) {
|
|
23
|
+
return glob('**/*.md', {
|
|
24
|
+
...options,
|
|
25
|
+
cwd: dir,
|
|
26
|
+
absolute: true,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a path exists
|
|
31
|
+
*/
|
|
32
|
+
export async function pathExists(path) {
|
|
33
|
+
try {
|
|
34
|
+
await stat(path);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if a path exists (sync)
|
|
43
|
+
*/
|
|
44
|
+
export function pathExistsSync(path) {
|
|
45
|
+
return existsSync(path);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if a path is a directory
|
|
49
|
+
*/
|
|
50
|
+
export async function isDirectory(path) {
|
|
51
|
+
try {
|
|
52
|
+
const stats = await stat(path);
|
|
53
|
+
return stats.isDirectory();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if a path is a file
|
|
61
|
+
*/
|
|
62
|
+
export async function isFile(path) {
|
|
63
|
+
try {
|
|
64
|
+
const stats = await stat(path);
|
|
65
|
+
return stats.isFile();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get all subdirectories in a directory
|
|
73
|
+
*/
|
|
74
|
+
export async function getSubdirectories(dir) {
|
|
75
|
+
try {
|
|
76
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
77
|
+
return entries
|
|
78
|
+
.filter((entry) => entry.isDirectory())
|
|
79
|
+
.map((entry) => join(dir, entry.name));
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Resolve a path relative to a base
|
|
87
|
+
*/
|
|
88
|
+
export function resolvePath(base, relativePath) {
|
|
89
|
+
return resolve(base, relativePath);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get relative path from base to target
|
|
93
|
+
*/
|
|
94
|
+
export function getRelativePath(base, target) {
|
|
95
|
+
return relative(base, target);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get directory name from path
|
|
99
|
+
*/
|
|
100
|
+
export function getDirname(path) {
|
|
101
|
+
return dirname(path);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get base name from path
|
|
105
|
+
*/
|
|
106
|
+
export function getBasename(path) {
|
|
107
|
+
return basename(path);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get file extension
|
|
111
|
+
*/
|
|
112
|
+
export function getExtension(path) {
|
|
113
|
+
return extname(path);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Remove file extension from path
|
|
117
|
+
*/
|
|
118
|
+
export function removeExtension(path) {
|
|
119
|
+
const ext = extname(path);
|
|
120
|
+
return path.slice(0, -ext.length);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Normalize path separators
|
|
124
|
+
*/
|
|
125
|
+
export function normalizePath(path) {
|
|
126
|
+
return path.replace(/\\/g, '/');
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/utils/glob.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'success';
|
|
2
|
+
export interface LoggerOptions {
|
|
3
|
+
silent?: boolean;
|
|
4
|
+
verbose?: boolean;
|
|
5
|
+
prefix?: string;
|
|
6
|
+
}
|
|
7
|
+
declare class Logger {
|
|
8
|
+
private silent;
|
|
9
|
+
private verbose;
|
|
10
|
+
private prefix;
|
|
11
|
+
configure(options: LoggerOptions): void;
|
|
12
|
+
private formatMessage;
|
|
13
|
+
debug(message: string, ...args: unknown[]): void;
|
|
14
|
+
info(message: string, ...args: unknown[]): void;
|
|
15
|
+
success(message: string, ...args: unknown[]): void;
|
|
16
|
+
warn(message: string, ...args: unknown[]): void;
|
|
17
|
+
error(message: string, ...args: unknown[]): void;
|
|
18
|
+
header(title: string): void;
|
|
19
|
+
subheader(title: string): void;
|
|
20
|
+
list(items: string[], indent?: number): void;
|
|
21
|
+
table(headers: string[], rows: string[][]): void;
|
|
22
|
+
progress(current: number, total: number, label?: string): void;
|
|
23
|
+
newline(): void;
|
|
24
|
+
emoji: {
|
|
25
|
+
docs: string;
|
|
26
|
+
check: string;
|
|
27
|
+
cross: string;
|
|
28
|
+
warn: string;
|
|
29
|
+
info: string;
|
|
30
|
+
search: string;
|
|
31
|
+
stats: string;
|
|
32
|
+
fix: string;
|
|
33
|
+
link: string;
|
|
34
|
+
folder: string;
|
|
35
|
+
file: string;
|
|
36
|
+
clock: string;
|
|
37
|
+
sparkles: string;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export declare const logger: Logger;
|
|
41
|
+
export default logger;
|
|
42
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,cAAM,MAAM;IACV,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,MAAM,CAAc;IAE5B,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMvC,OAAO,CAAC,aAAa;IAIrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAKhD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAK/C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAKlD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAK/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAKhD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO3B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;IAQ/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI;IAyBhD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAY9D,OAAO,IAAI,IAAI;IAMf,KAAK;;;;;;;;;;;;;;MAcH;CACH;AAED,eAAO,MAAM,MAAM,QAAe,CAAC;AACnC,eAAe,MAAM,CAAC"}
|