@memvid/maw 1.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/README.md +188 -0
- package/dist/bin/maw.d.ts +6 -0
- package/dist/bin/maw.d.ts.map +1 -0
- package/dist/bin/maw.js +275 -0
- package/dist/bin/maw.js.map +1 -0
- package/dist/src/crawler/index.d.ts +71 -0
- package/dist/src/crawler/index.d.ts.map +1 -0
- package/dist/src/crawler/index.js +249 -0
- package/dist/src/crawler/index.js.map +1 -0
- package/dist/src/crawler/robots.d.ts +26 -0
- package/dist/src/crawler/robots.d.ts.map +1 -0
- package/dist/src/crawler/robots.js +179 -0
- package/dist/src/crawler/robots.js.map +1 -0
- package/dist/src/crawler/sitemap.d.ts +36 -0
- package/dist/src/crawler/sitemap.d.ts.map +1 -0
- package/dist/src/crawler/sitemap.js +209 -0
- package/dist/src/crawler/sitemap.js.map +1 -0
- package/dist/src/engine/detector.d.ts +18 -0
- package/dist/src/engine/detector.d.ts.map +1 -0
- package/dist/src/engine/detector.js +155 -0
- package/dist/src/engine/detector.js.map +1 -0
- package/dist/src/engine/fetch.d.ts +18 -0
- package/dist/src/engine/fetch.d.ts.map +1 -0
- package/dist/src/engine/fetch.js +53 -0
- package/dist/src/engine/fetch.js.map +1 -0
- package/dist/src/engine/index.d.ts +39 -0
- package/dist/src/engine/index.d.ts.map +1 -0
- package/dist/src/engine/index.js +116 -0
- package/dist/src/engine/index.js.map +1 -0
- package/dist/src/engine/playwright.d.ts +23 -0
- package/dist/src/engine/playwright.d.ts.map +1 -0
- package/dist/src/engine/playwright.js +88 -0
- package/dist/src/engine/playwright.js.map +1 -0
- package/dist/src/engine/rebrowser.d.ts +22 -0
- package/dist/src/engine/rebrowser.d.ts.map +1 -0
- package/dist/src/engine/rebrowser.js +142 -0
- package/dist/src/engine/rebrowser.js.map +1 -0
- package/dist/src/extractor/cleaner.d.ts +13 -0
- package/dist/src/extractor/cleaner.d.ts.map +1 -0
- package/dist/src/extractor/cleaner.js +122 -0
- package/dist/src/extractor/cleaner.js.map +1 -0
- package/dist/src/extractor/index.d.ts +29 -0
- package/dist/src/extractor/index.d.ts.map +1 -0
- package/dist/src/extractor/index.js +162 -0
- package/dist/src/extractor/index.js.map +1 -0
- package/dist/src/extractor/links.d.ts +22 -0
- package/dist/src/extractor/links.d.ts.map +1 -0
- package/dist/src/extractor/links.js +92 -0
- package/dist/src/extractor/links.js.map +1 -0
- package/dist/src/extractor/markdown.d.ts +13 -0
- package/dist/src/extractor/markdown.d.ts.map +1 -0
- package/dist/src/extractor/markdown.js +94 -0
- package/dist/src/extractor/markdown.js.map +1 -0
- package/dist/src/git/index.d.ts +40 -0
- package/dist/src/git/index.d.ts.map +1 -0
- package/dist/src/git/index.js +303 -0
- package/dist/src/git/index.js.map +1 -0
- package/dist/src/index.d.ts +103 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +229 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ingestor/index.d.ts +95 -0
- package/dist/src/ingestor/index.d.ts.map +1 -0
- package/dist/src/ingestor/index.js +471 -0
- package/dist/src/ingestor/index.js.map +1 -0
- package/dist/src/utils/dedup.d.ts +66 -0
- package/dist/src/utils/dedup.d.ts.map +1 -0
- package/dist/src/utils/dedup.js +296 -0
- package/dist/src/utils/dedup.js.map +1 -0
- package/dist/src/utils/index.d.ts +3 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +3 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +12 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +49 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/ui.d.ts +126 -0
- package/dist/src/utils/ui.d.ts.map +1 -0
- package/dist/src/utils/ui.js +357 -0
- package/dist/src/utils/ui.js.map +1 -0
- package/dist/src/utils/url.d.ts +21 -0
- package/dist/src/utils/url.d.ts.map +1 -0
- package/dist/src/utils/url.js +107 -0
- package/dist/src/utils/url.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link extraction utilities
|
|
3
|
+
*/
|
|
4
|
+
import type { CheerioAPI } from 'cheerio';
|
|
5
|
+
export interface ExtractedLink {
|
|
6
|
+
href: string;
|
|
7
|
+
text: string;
|
|
8
|
+
isInternal: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Extract all links from HTML
|
|
12
|
+
*/
|
|
13
|
+
export declare function extractLinks($: CheerioAPI, baseUrl: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Extract links with additional metadata
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractLinksWithMeta($: CheerioAPI, baseUrl: string): ExtractedLink[];
|
|
18
|
+
/**
|
|
19
|
+
* Extract only internal links (same domain)
|
|
20
|
+
*/
|
|
21
|
+
export declare function extractInternalLinks($: CheerioAPI, baseUrl: string): string[];
|
|
22
|
+
//# sourceMappingURL=links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../../src/extractor/links.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA4BrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAoCpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAa7E"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link extraction utilities
|
|
3
|
+
*/
|
|
4
|
+
import { resolveUrl, shouldSkipUrl } from '../utils/url.js';
|
|
5
|
+
/**
|
|
6
|
+
* Extract all links from HTML
|
|
7
|
+
*/
|
|
8
|
+
export function extractLinks($, baseUrl) {
|
|
9
|
+
const links = [];
|
|
10
|
+
const seen = new Set();
|
|
11
|
+
try {
|
|
12
|
+
const baseHost = new URL(baseUrl).hostname;
|
|
13
|
+
$('a[href]').each((_, el) => {
|
|
14
|
+
const href = $(el).attr('href');
|
|
15
|
+
if (!href)
|
|
16
|
+
return;
|
|
17
|
+
const resolved = resolveUrl(href, baseUrl);
|
|
18
|
+
if (!resolved)
|
|
19
|
+
return;
|
|
20
|
+
// Skip non-HTML resources
|
|
21
|
+
if (shouldSkipUrl(resolved))
|
|
22
|
+
return;
|
|
23
|
+
// Deduplicate
|
|
24
|
+
if (seen.has(resolved))
|
|
25
|
+
return;
|
|
26
|
+
seen.add(resolved);
|
|
27
|
+
links.push(resolved);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Invalid base URL
|
|
32
|
+
}
|
|
33
|
+
return links;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Extract links with additional metadata
|
|
37
|
+
*/
|
|
38
|
+
export function extractLinksWithMeta($, baseUrl) {
|
|
39
|
+
const links = [];
|
|
40
|
+
const seen = new Set();
|
|
41
|
+
try {
|
|
42
|
+
const baseHost = new URL(baseUrl).hostname;
|
|
43
|
+
$('a[href]').each((_, el) => {
|
|
44
|
+
const $el = $(el);
|
|
45
|
+
const href = $el.attr('href');
|
|
46
|
+
if (!href)
|
|
47
|
+
return;
|
|
48
|
+
const resolved = resolveUrl(href, baseUrl);
|
|
49
|
+
if (!resolved)
|
|
50
|
+
return;
|
|
51
|
+
if (shouldSkipUrl(resolved))
|
|
52
|
+
return;
|
|
53
|
+
if (seen.has(resolved))
|
|
54
|
+
return;
|
|
55
|
+
seen.add(resolved);
|
|
56
|
+
let isInternal = false;
|
|
57
|
+
try {
|
|
58
|
+
isInternal = new URL(resolved).hostname === baseHost;
|
|
59
|
+
}
|
|
60
|
+
catch { }
|
|
61
|
+
links.push({
|
|
62
|
+
href: resolved,
|
|
63
|
+
text: $el.text().trim().slice(0, 100),
|
|
64
|
+
isInternal,
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Invalid base URL
|
|
70
|
+
}
|
|
71
|
+
return links;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Extract only internal links (same domain)
|
|
75
|
+
*/
|
|
76
|
+
export function extractInternalLinks($, baseUrl) {
|
|
77
|
+
try {
|
|
78
|
+
const baseHost = new URL(baseUrl).hostname;
|
|
79
|
+
return extractLinks($, baseUrl).filter(link => {
|
|
80
|
+
try {
|
|
81
|
+
return new URL(link).hostname === baseHost;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../../src/extractor/links.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML to Markdown conversion using node-html-markdown
|
|
3
|
+
* 1.57x faster than Turndown
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert HTML to Markdown
|
|
7
|
+
*/
|
|
8
|
+
export declare function htmlToMarkdown(html: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Extract plain text from markdown (remove formatting)
|
|
11
|
+
*/
|
|
12
|
+
export declare function markdownToPlainText(markdown: string): string;
|
|
13
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/extractor/markdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYnD;AA4CD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmC5D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML to Markdown conversion using node-html-markdown
|
|
3
|
+
* 1.57x faster than Turndown
|
|
4
|
+
*/
|
|
5
|
+
import { NodeHtmlMarkdown } from 'node-html-markdown';
|
|
6
|
+
// Configure node-html-markdown for optimal output
|
|
7
|
+
const nhm = new NodeHtmlMarkdown({
|
|
8
|
+
codeFence: '```',
|
|
9
|
+
bulletMarker: '-',
|
|
10
|
+
codeBlockStyle: 'fenced',
|
|
11
|
+
emDelimiter: '*',
|
|
12
|
+
strongDelimiter: '**',
|
|
13
|
+
maxConsecutiveNewlines: 2,
|
|
14
|
+
useLinkReferenceDefinitions: false,
|
|
15
|
+
useInlineLinks: true,
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* Convert HTML to Markdown
|
|
19
|
+
*/
|
|
20
|
+
export function htmlToMarkdown(html) {
|
|
21
|
+
if (!html || !html.trim()) {
|
|
22
|
+
return '';
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const markdown = nhm.translate(html);
|
|
26
|
+
return postProcess(markdown);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
// Fallback: strip HTML tags if conversion fails
|
|
30
|
+
return html.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Post-process markdown for cleaner output
|
|
35
|
+
*/
|
|
36
|
+
function postProcess(markdown) {
|
|
37
|
+
return markdown
|
|
38
|
+
// Normalize line endings
|
|
39
|
+
.replace(/\r\n/g, '\n')
|
|
40
|
+
// Max 2 consecutive newlines
|
|
41
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
42
|
+
// Trim trailing whitespace on each line
|
|
43
|
+
.replace(/[ \t]+$/gm, '')
|
|
44
|
+
// Fix code block spacing
|
|
45
|
+
.replace(/```(\w*)\n\n+/g, '```$1\n')
|
|
46
|
+
.replace(/\n\n+```/g, '\n```')
|
|
47
|
+
// Remove empty code blocks
|
|
48
|
+
.replace(/```\w*\n\s*\n?```/g, '')
|
|
49
|
+
// Collapse multiple spaces (but not in code blocks)
|
|
50
|
+
.replace(/(?<!```)[ ]{2,}(?!```)/g, ' ')
|
|
51
|
+
// Remove leading/trailing empty lines in blockquotes
|
|
52
|
+
.replace(/^>\s*\n/gm, '> ')
|
|
53
|
+
.replace(/\n>\s*$/gm, '')
|
|
54
|
+
// Fix list formatting
|
|
55
|
+
.replace(/^(-|\*|\d+\.)\s+\n/gm, '')
|
|
56
|
+
// Remove excessive horizontal rules
|
|
57
|
+
.replace(/(---\n){2,}/g, '---\n')
|
|
58
|
+
// Clean up link formatting
|
|
59
|
+
.replace(/\[([^\]]*)\]\(\s+/g, '[$1](')
|
|
60
|
+
.replace(/\s+\)/g, ')')
|
|
61
|
+
// Final trim
|
|
62
|
+
.trim() + '\n';
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Extract plain text from markdown (remove formatting)
|
|
66
|
+
*/
|
|
67
|
+
export function markdownToPlainText(markdown) {
|
|
68
|
+
return markdown
|
|
69
|
+
// Remove code blocks
|
|
70
|
+
.replace(/```[\s\S]*?```/g, '')
|
|
71
|
+
.replace(/`[^`]+`/g, '')
|
|
72
|
+
// Remove images
|
|
73
|
+
.replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1')
|
|
74
|
+
// Convert links to text
|
|
75
|
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
|
|
76
|
+
// Remove headers
|
|
77
|
+
.replace(/^#{1,6}\s+/gm, '')
|
|
78
|
+
// Remove emphasis
|
|
79
|
+
.replace(/\*\*([^*]+)\*\*/g, '$1')
|
|
80
|
+
.replace(/\*([^*]+)\*/g, '$1')
|
|
81
|
+
.replace(/__([^_]+)__/g, '$1')
|
|
82
|
+
.replace(/_([^_]+)_/g, '$1')
|
|
83
|
+
// Remove blockquotes
|
|
84
|
+
.replace(/^>\s*/gm, '')
|
|
85
|
+
// Remove horizontal rules
|
|
86
|
+
.replace(/^---$/gm, '')
|
|
87
|
+
// Remove list markers
|
|
88
|
+
.replace(/^[-*+]\s+/gm, '')
|
|
89
|
+
.replace(/^\d+\.\s+/gm, '')
|
|
90
|
+
// Collapse whitespace
|
|
91
|
+
.replace(/\s+/g, ' ')
|
|
92
|
+
.trim();
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/extractor/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git repository ingestion
|
|
3
|
+
* Clone and read files from git repos
|
|
4
|
+
*/
|
|
5
|
+
export interface GitFile {
|
|
6
|
+
path: string;
|
|
7
|
+
content: string;
|
|
8
|
+
language: string;
|
|
9
|
+
size: number;
|
|
10
|
+
}
|
|
11
|
+
export interface GitRepoInfo {
|
|
12
|
+
name: string;
|
|
13
|
+
url?: string;
|
|
14
|
+
localPath: string;
|
|
15
|
+
isTemp: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check if a string is a git URL
|
|
19
|
+
*/
|
|
20
|
+
export declare function isGitUrl(input: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Check if a path is a local git repo
|
|
23
|
+
*/
|
|
24
|
+
export declare function isLocalGitRepo(path: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Clone a git repo to temp directory
|
|
27
|
+
*/
|
|
28
|
+
export declare function cloneRepo(url: string): Promise<GitRepoInfo>;
|
|
29
|
+
/**
|
|
30
|
+
* Read all files from a git repo
|
|
31
|
+
*/
|
|
32
|
+
export declare function readGitRepo(input: string): AsyncGenerator<GitFile>;
|
|
33
|
+
/**
|
|
34
|
+
* Get repo info without reading files
|
|
35
|
+
*/
|
|
36
|
+
export declare function getRepoInfo(input: string): Promise<{
|
|
37
|
+
name: string;
|
|
38
|
+
fileCount: number;
|
|
39
|
+
}>;
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/git/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4FH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAS/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMpD;AAcD;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBjE;AAsFD;;GAEG;AACH,wBAAuB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAwCzE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB7F"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git repository ingestion
|
|
3
|
+
* Clone and read files from git repos
|
|
4
|
+
*/
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
import { existsSync, readdirSync, readFileSync, statSync, rmSync } from 'fs';
|
|
7
|
+
import { join, extname, relative } from 'path';
|
|
8
|
+
import { tmpdir } from 'os';
|
|
9
|
+
import { createLogger } from '../utils/logger.js';
|
|
10
|
+
const log = createLogger();
|
|
11
|
+
// File extensions to include
|
|
12
|
+
const CODE_EXTENSIONS = new Set([
|
|
13
|
+
// JavaScript/TypeScript
|
|
14
|
+
'.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs',
|
|
15
|
+
// Python
|
|
16
|
+
'.py', '.pyi',
|
|
17
|
+
// Rust
|
|
18
|
+
'.rs',
|
|
19
|
+
// Go
|
|
20
|
+
'.go',
|
|
21
|
+
// Java/Kotlin
|
|
22
|
+
'.java', '.kt', '.kts',
|
|
23
|
+
// C/C++
|
|
24
|
+
'.c', '.h', '.cpp', '.hpp', '.cc', '.cxx',
|
|
25
|
+
// C#
|
|
26
|
+
'.cs',
|
|
27
|
+
// Ruby
|
|
28
|
+
'.rb',
|
|
29
|
+
// PHP
|
|
30
|
+
'.php',
|
|
31
|
+
// Swift
|
|
32
|
+
'.swift',
|
|
33
|
+
// Shell
|
|
34
|
+
'.sh', '.bash', '.zsh',
|
|
35
|
+
// Web
|
|
36
|
+
'.html', '.css', '.scss', '.sass', '.less', '.vue', '.svelte',
|
|
37
|
+
// Data/Config
|
|
38
|
+
'.json', '.yaml', '.yml', '.toml', '.xml', '.ini', '.env.example',
|
|
39
|
+
// Documentation
|
|
40
|
+
'.md', '.mdx', '.rst', '.txt', '.adoc',
|
|
41
|
+
// SQL
|
|
42
|
+
'.sql',
|
|
43
|
+
// GraphQL
|
|
44
|
+
'.graphql', '.gql',
|
|
45
|
+
// Solidity
|
|
46
|
+
'.sol',
|
|
47
|
+
]);
|
|
48
|
+
// Directories to skip
|
|
49
|
+
const SKIP_DIRS = new Set([
|
|
50
|
+
'node_modules',
|
|
51
|
+
'.git',
|
|
52
|
+
'.svn',
|
|
53
|
+
'.hg',
|
|
54
|
+
'vendor',
|
|
55
|
+
'target',
|
|
56
|
+
'dist',
|
|
57
|
+
'build',
|
|
58
|
+
'out',
|
|
59
|
+
'.next',
|
|
60
|
+
'.nuxt',
|
|
61
|
+
'__pycache__',
|
|
62
|
+
'.pytest_cache',
|
|
63
|
+
'.mypy_cache',
|
|
64
|
+
'venv',
|
|
65
|
+
'.venv',
|
|
66
|
+
'env',
|
|
67
|
+
'.tox',
|
|
68
|
+
'coverage',
|
|
69
|
+
'.coverage',
|
|
70
|
+
'.nyc_output',
|
|
71
|
+
'logs',
|
|
72
|
+
'tmp',
|
|
73
|
+
'.cache',
|
|
74
|
+
'.parcel-cache',
|
|
75
|
+
'.turbo',
|
|
76
|
+
]);
|
|
77
|
+
// Files to skip
|
|
78
|
+
const SKIP_FILES = new Set([
|
|
79
|
+
'package-lock.json',
|
|
80
|
+
'yarn.lock',
|
|
81
|
+
'pnpm-lock.yaml',
|
|
82
|
+
'Cargo.lock',
|
|
83
|
+
'Gemfile.lock',
|
|
84
|
+
'poetry.lock',
|
|
85
|
+
'composer.lock',
|
|
86
|
+
]);
|
|
87
|
+
// Max file size to read (500KB)
|
|
88
|
+
const MAX_FILE_SIZE = 500 * 1024;
|
|
89
|
+
/**
|
|
90
|
+
* Check if a string is a git URL
|
|
91
|
+
*/
|
|
92
|
+
export function isGitUrl(input) {
|
|
93
|
+
return (input.startsWith('https://github.com/') ||
|
|
94
|
+
input.startsWith('https://gitlab.com/') ||
|
|
95
|
+
input.startsWith('https://bitbucket.org/') ||
|
|
96
|
+
input.startsWith('git@github.com:') ||
|
|
97
|
+
input.startsWith('git@gitlab.com:') ||
|
|
98
|
+
input.endsWith('.git'));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Check if a path is a local git repo
|
|
102
|
+
*/
|
|
103
|
+
export function isLocalGitRepo(path) {
|
|
104
|
+
try {
|
|
105
|
+
return existsSync(join(path, '.git'));
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Extract repo name from URL or path
|
|
113
|
+
*/
|
|
114
|
+
function getRepoName(input) {
|
|
115
|
+
// GitHub URL: https://github.com/user/repo or https://github.com/user/repo.git
|
|
116
|
+
const match = input.match(/\/([^/]+?)(\.git)?$/);
|
|
117
|
+
if (match)
|
|
118
|
+
return match[1];
|
|
119
|
+
// Local path
|
|
120
|
+
return input.split('/').pop() || 'repo';
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Clone a git repo to temp directory
|
|
124
|
+
*/
|
|
125
|
+
export async function cloneRepo(url) {
|
|
126
|
+
const repoName = getRepoName(url);
|
|
127
|
+
const tempPath = join(tmpdir(), `maw-${repoName}-${Date.now()}`);
|
|
128
|
+
log.info(` Cloning ${repoName}...`);
|
|
129
|
+
try {
|
|
130
|
+
// Shallow clone for speed
|
|
131
|
+
execSync(`git clone --depth 1 "${url}" "${tempPath}"`, {
|
|
132
|
+
stdio: 'pipe',
|
|
133
|
+
timeout: 60000, // 1 minute timeout
|
|
134
|
+
});
|
|
135
|
+
return {
|
|
136
|
+
name: repoName,
|
|
137
|
+
url,
|
|
138
|
+
localPath: tempPath,
|
|
139
|
+
isTemp: true,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
throw new Error(`Failed to clone ${url}: ${error.message}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get language from file extension
|
|
148
|
+
*/
|
|
149
|
+
function getLanguage(ext) {
|
|
150
|
+
const langMap = {
|
|
151
|
+
'.js': 'javascript',
|
|
152
|
+
'.jsx': 'javascript',
|
|
153
|
+
'.ts': 'typescript',
|
|
154
|
+
'.tsx': 'typescript',
|
|
155
|
+
'.py': 'python',
|
|
156
|
+
'.rs': 'rust',
|
|
157
|
+
'.go': 'go',
|
|
158
|
+
'.java': 'java',
|
|
159
|
+
'.kt': 'kotlin',
|
|
160
|
+
'.c': 'c',
|
|
161
|
+
'.cpp': 'cpp',
|
|
162
|
+
'.cs': 'csharp',
|
|
163
|
+
'.rb': 'ruby',
|
|
164
|
+
'.php': 'php',
|
|
165
|
+
'.swift': 'swift',
|
|
166
|
+
'.sh': 'shell',
|
|
167
|
+
'.md': 'markdown',
|
|
168
|
+
'.json': 'json',
|
|
169
|
+
'.yaml': 'yaml',
|
|
170
|
+
'.yml': 'yaml',
|
|
171
|
+
'.sql': 'sql',
|
|
172
|
+
'.html': 'html',
|
|
173
|
+
'.css': 'css',
|
|
174
|
+
'.vue': 'vue',
|
|
175
|
+
'.svelte': 'svelte',
|
|
176
|
+
};
|
|
177
|
+
return langMap[ext] || ext.slice(1) || 'text';
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Walk directory and collect files
|
|
181
|
+
*/
|
|
182
|
+
function* walkDir(dir, basePath = dir) {
|
|
183
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
184
|
+
for (const entry of entries) {
|
|
185
|
+
const fullPath = join(dir, entry.name);
|
|
186
|
+
const relativePath = relative(basePath, fullPath);
|
|
187
|
+
if (entry.isDirectory()) {
|
|
188
|
+
// Skip ignored directories
|
|
189
|
+
if (SKIP_DIRS.has(entry.name) || entry.name.startsWith('.')) {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
yield* walkDir(fullPath, basePath);
|
|
193
|
+
}
|
|
194
|
+
else if (entry.isFile()) {
|
|
195
|
+
// Skip ignored files
|
|
196
|
+
if (SKIP_FILES.has(entry.name))
|
|
197
|
+
continue;
|
|
198
|
+
const ext = extname(entry.name).toLowerCase();
|
|
199
|
+
// Only include known extensions
|
|
200
|
+
if (!CODE_EXTENSIONS.has(ext))
|
|
201
|
+
continue;
|
|
202
|
+
// Check file size
|
|
203
|
+
const stats = statSync(fullPath);
|
|
204
|
+
if (stats.size > MAX_FILE_SIZE)
|
|
205
|
+
continue;
|
|
206
|
+
if (stats.size === 0)
|
|
207
|
+
continue;
|
|
208
|
+
try {
|
|
209
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
210
|
+
// Skip binary files (files with null bytes)
|
|
211
|
+
if (content.includes('\0'))
|
|
212
|
+
continue;
|
|
213
|
+
yield {
|
|
214
|
+
path: relativePath,
|
|
215
|
+
content,
|
|
216
|
+
language: getLanguage(ext),
|
|
217
|
+
size: stats.size,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// Skip files that can't be read
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Read all files from a git repo
|
|
229
|
+
*/
|
|
230
|
+
export async function* readGitRepo(input) {
|
|
231
|
+
let repoInfo;
|
|
232
|
+
if (isGitUrl(input)) {
|
|
233
|
+
repoInfo = await cloneRepo(input);
|
|
234
|
+
}
|
|
235
|
+
else if (isLocalGitRepo(input)) {
|
|
236
|
+
repoInfo = {
|
|
237
|
+
name: getRepoName(input),
|
|
238
|
+
localPath: input,
|
|
239
|
+
isTemp: false,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
else if (existsSync(input)) {
|
|
243
|
+
// Treat as local directory even if not a git repo
|
|
244
|
+
repoInfo = {
|
|
245
|
+
name: getRepoName(input),
|
|
246
|
+
localPath: input,
|
|
247
|
+
isTemp: false,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
throw new Error(`Not a valid git URL or local path: ${input}`);
|
|
252
|
+
}
|
|
253
|
+
try {
|
|
254
|
+
let fileCount = 0;
|
|
255
|
+
for (const file of walkDir(repoInfo.localPath)) {
|
|
256
|
+
fileCount++;
|
|
257
|
+
yield file;
|
|
258
|
+
}
|
|
259
|
+
log.info(` Found ${fileCount} files`);
|
|
260
|
+
}
|
|
261
|
+
finally {
|
|
262
|
+
// Clean up temp directory
|
|
263
|
+
if (repoInfo.isTemp) {
|
|
264
|
+
try {
|
|
265
|
+
rmSync(repoInfo.localPath, { recursive: true, force: true });
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Ignore cleanup errors
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Get repo info without reading files
|
|
275
|
+
*/
|
|
276
|
+
export async function getRepoInfo(input) {
|
|
277
|
+
let localPath;
|
|
278
|
+
let isTemp = false;
|
|
279
|
+
if (isGitUrl(input)) {
|
|
280
|
+
const info = await cloneRepo(input);
|
|
281
|
+
localPath = info.localPath;
|
|
282
|
+
isTemp = true;
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
localPath = input;
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
let count = 0;
|
|
289
|
+
for (const _ of walkDir(localPath)) {
|
|
290
|
+
count++;
|
|
291
|
+
}
|
|
292
|
+
return { name: getRepoName(input), fileCount: count };
|
|
293
|
+
}
|
|
294
|
+
finally {
|
|
295
|
+
if (isTemp) {
|
|
296
|
+
try {
|
|
297
|
+
rmSync(localPath, { recursive: true, force: true });
|
|
298
|
+
}
|
|
299
|
+
catch { }
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/git/index.ts"],"names":[],"mappings":"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"}
|