@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.
Files changed (86) hide show
  1. package/README.md +188 -0
  2. package/dist/bin/maw.d.ts +6 -0
  3. package/dist/bin/maw.d.ts.map +1 -0
  4. package/dist/bin/maw.js +275 -0
  5. package/dist/bin/maw.js.map +1 -0
  6. package/dist/src/crawler/index.d.ts +71 -0
  7. package/dist/src/crawler/index.d.ts.map +1 -0
  8. package/dist/src/crawler/index.js +249 -0
  9. package/dist/src/crawler/index.js.map +1 -0
  10. package/dist/src/crawler/robots.d.ts +26 -0
  11. package/dist/src/crawler/robots.d.ts.map +1 -0
  12. package/dist/src/crawler/robots.js +179 -0
  13. package/dist/src/crawler/robots.js.map +1 -0
  14. package/dist/src/crawler/sitemap.d.ts +36 -0
  15. package/dist/src/crawler/sitemap.d.ts.map +1 -0
  16. package/dist/src/crawler/sitemap.js +209 -0
  17. package/dist/src/crawler/sitemap.js.map +1 -0
  18. package/dist/src/engine/detector.d.ts +18 -0
  19. package/dist/src/engine/detector.d.ts.map +1 -0
  20. package/dist/src/engine/detector.js +155 -0
  21. package/dist/src/engine/detector.js.map +1 -0
  22. package/dist/src/engine/fetch.d.ts +18 -0
  23. package/dist/src/engine/fetch.d.ts.map +1 -0
  24. package/dist/src/engine/fetch.js +53 -0
  25. package/dist/src/engine/fetch.js.map +1 -0
  26. package/dist/src/engine/index.d.ts +39 -0
  27. package/dist/src/engine/index.d.ts.map +1 -0
  28. package/dist/src/engine/index.js +116 -0
  29. package/dist/src/engine/index.js.map +1 -0
  30. package/dist/src/engine/playwright.d.ts +23 -0
  31. package/dist/src/engine/playwright.d.ts.map +1 -0
  32. package/dist/src/engine/playwright.js +88 -0
  33. package/dist/src/engine/playwright.js.map +1 -0
  34. package/dist/src/engine/rebrowser.d.ts +22 -0
  35. package/dist/src/engine/rebrowser.d.ts.map +1 -0
  36. package/dist/src/engine/rebrowser.js +142 -0
  37. package/dist/src/engine/rebrowser.js.map +1 -0
  38. package/dist/src/extractor/cleaner.d.ts +13 -0
  39. package/dist/src/extractor/cleaner.d.ts.map +1 -0
  40. package/dist/src/extractor/cleaner.js +122 -0
  41. package/dist/src/extractor/cleaner.js.map +1 -0
  42. package/dist/src/extractor/index.d.ts +29 -0
  43. package/dist/src/extractor/index.d.ts.map +1 -0
  44. package/dist/src/extractor/index.js +162 -0
  45. package/dist/src/extractor/index.js.map +1 -0
  46. package/dist/src/extractor/links.d.ts +22 -0
  47. package/dist/src/extractor/links.d.ts.map +1 -0
  48. package/dist/src/extractor/links.js +92 -0
  49. package/dist/src/extractor/links.js.map +1 -0
  50. package/dist/src/extractor/markdown.d.ts +13 -0
  51. package/dist/src/extractor/markdown.d.ts.map +1 -0
  52. package/dist/src/extractor/markdown.js +94 -0
  53. package/dist/src/extractor/markdown.js.map +1 -0
  54. package/dist/src/git/index.d.ts +40 -0
  55. package/dist/src/git/index.d.ts.map +1 -0
  56. package/dist/src/git/index.js +303 -0
  57. package/dist/src/git/index.js.map +1 -0
  58. package/dist/src/index.d.ts +103 -0
  59. package/dist/src/index.d.ts.map +1 -0
  60. package/dist/src/index.js +229 -0
  61. package/dist/src/index.js.map +1 -0
  62. package/dist/src/ingestor/index.d.ts +95 -0
  63. package/dist/src/ingestor/index.d.ts.map +1 -0
  64. package/dist/src/ingestor/index.js +471 -0
  65. package/dist/src/ingestor/index.js.map +1 -0
  66. package/dist/src/utils/dedup.d.ts +66 -0
  67. package/dist/src/utils/dedup.d.ts.map +1 -0
  68. package/dist/src/utils/dedup.js +296 -0
  69. package/dist/src/utils/dedup.js.map +1 -0
  70. package/dist/src/utils/index.d.ts +3 -0
  71. package/dist/src/utils/index.d.ts.map +1 -0
  72. package/dist/src/utils/index.js +3 -0
  73. package/dist/src/utils/index.js.map +1 -0
  74. package/dist/src/utils/logger.d.ts +12 -0
  75. package/dist/src/utils/logger.d.ts.map +1 -0
  76. package/dist/src/utils/logger.js +49 -0
  77. package/dist/src/utils/logger.js.map +1 -0
  78. package/dist/src/utils/ui.d.ts +126 -0
  79. package/dist/src/utils/ui.d.ts.map +1 -0
  80. package/dist/src/utils/ui.js +357 -0
  81. package/dist/src/utils/ui.js.map +1 -0
  82. package/dist/src/utils/url.d.ts +21 -0
  83. package/dist/src/utils/url.d.ts.map +1 -0
  84. package/dist/src/utils/url.js +107 -0
  85. package/dist/src/utils/url.js.map +1 -0
  86. package/package.json +71 -0
@@ -0,0 +1,357 @@
1
+ /**
2
+ * Beautiful terminal UI for maw
3
+ * Clean, minimal, production-ready
4
+ */
5
+ import chalk from 'chalk';
6
+ // Theme colors - refined palette
7
+ const theme = {
8
+ primary: chalk.hex('#a78bfa'), // Soft violet
9
+ success: chalk.hex('#34d399'), // Mint green
10
+ warning: chalk.hex('#fbbf24'), // Golden
11
+ error: chalk.hex('#f87171'), // Soft red
12
+ muted: chalk.hex('#9ca3af'), // Gray
13
+ accent: chalk.hex('#60a5fa'), // Sky blue
14
+ info: chalk.hex('#38bdf8'), // Cyan
15
+ dim: chalk.dim,
16
+ bold: chalk.bold,
17
+ white: chalk.white,
18
+ };
19
+ // Icons
20
+ const icons = {
21
+ success: '✓',
22
+ error: '✗',
23
+ warning: '⚠',
24
+ arrow: '→',
25
+ bullet: '•',
26
+ page: '◉',
27
+ folder: '◈',
28
+ };
29
+ /**
30
+ * Format bytes to human readable
31
+ */
32
+ export function formatBytes(bytes) {
33
+ if (bytes < 1024)
34
+ return `${bytes} B`;
35
+ if (bytes < 1024 * 1024)
36
+ return `${(bytes / 1024).toFixed(1)} KB`;
37
+ if (bytes < 1024 * 1024 * 1024)
38
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
39
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;
40
+ }
41
+ /**
42
+ * Format duration to human readable
43
+ */
44
+ export function formatDuration(ms) {
45
+ if (ms < 1000)
46
+ return `${ms}ms`;
47
+ if (ms < 60000)
48
+ return `${(ms / 1000).toFixed(1)}s`;
49
+ const mins = Math.floor(ms / 60000);
50
+ const secs = Math.floor((ms % 60000) / 1000);
51
+ return `${mins}m ${secs}s`;
52
+ }
53
+ /**
54
+ * Truncate URL for display
55
+ */
56
+ function truncateUrl(url, maxLen = 60) {
57
+ if (url.length <= maxLen)
58
+ return url;
59
+ try {
60
+ const parsed = new URL(url);
61
+ const host = parsed.hostname;
62
+ const path = parsed.pathname;
63
+ // Show host + truncated path
64
+ const availableForPath = maxLen - host.length - 5;
65
+ if (availableForPath > 10) {
66
+ return `${host}/...${path.slice(-availableForPath)}`;
67
+ }
68
+ return url.slice(0, maxLen - 3) + '...';
69
+ }
70
+ catch {
71
+ return url.slice(0, maxLen - 3) + '...';
72
+ }
73
+ }
74
+ /**
75
+ * Create a smooth progress bar
76
+ */
77
+ export function progressBar(current, total, width = 24) {
78
+ const ratio = Math.min(current / total, 1);
79
+ const filled = Math.round(ratio * width);
80
+ const empty = width - filled;
81
+ const filledBar = theme.primary('━'.repeat(filled));
82
+ const emptyBar = theme.muted('─'.repeat(empty));
83
+ return filledBar + emptyBar;
84
+ }
85
+ /**
86
+ * Clean header - no box, just styled text
87
+ */
88
+ export function header(title, subtitle) {
89
+ const lines = [''];
90
+ lines.push(` ${theme.primary.bold(title)}`);
91
+ if (subtitle) {
92
+ // Truncate long URLs
93
+ const display = truncateUrl(subtitle, 70);
94
+ lines.push(` ${theme.muted(display)}`);
95
+ }
96
+ lines.push('');
97
+ return lines.join('\n');
98
+ }
99
+ /**
100
+ * Crawl progress line - clean and minimal
101
+ */
102
+ export function crawlProgress(current, total, title, status) {
103
+ const bar = progressBar(current, Math.max(total, current), 20);
104
+ const count = theme.muted(`${current}/${total}`);
105
+ const titleTrunc = title.length > 50 ? title.slice(0, 47) + '...' : title;
106
+ return `\n ${bar} ${count}\n ${theme.white(titleTrunc)}`;
107
+ }
108
+ /**
109
+ * Success message - clean layout
110
+ */
111
+ export function successMessage(output, size, pages, duration) {
112
+ const lines = [''];
113
+ // Success line
114
+ lines.push(` ${theme.success(icons.success)} ${theme.success.bold(output)}`);
115
+ lines.push('');
116
+ // Stats in a clean row
117
+ const stats = [
118
+ `${theme.muted('Size')} ${theme.accent.bold(formatBytes(size))}`,
119
+ `${theme.muted('Pages')} ${theme.accent.bold(pages.toString())}`,
120
+ `${theme.muted('Time')} ${theme.accent.bold(formatDuration(duration))}`,
121
+ ].join(' ');
122
+ lines.push(` ${stats}`);
123
+ return lines.join('\n');
124
+ }
125
+ /**
126
+ * Engine stats display
127
+ */
128
+ export function engineStats(stats) {
129
+ const parts = [
130
+ stats.fetch > 0 ? theme.success(`fetch ${stats.fetch}`) : null,
131
+ stats.playwright > 0 ? theme.info(`browser ${stats.playwright}`) : null,
132
+ stats.rebrowser > 0 ? theme.warning(`stealth ${stats.rebrowser}`) : null,
133
+ stats.blocked > 0 ? theme.error(`blocked ${stats.blocked}`) : null,
134
+ ].filter(Boolean);
135
+ if (parts.length === 0)
136
+ return '';
137
+ return `\n ${theme.muted('Engines:')} ${parts.join(theme.muted(' · '))}`;
138
+ }
139
+ /**
140
+ * Dedup stats display
141
+ */
142
+ export function dedupStats(stats) {
143
+ if (stats.localeSkipped === 0 && stats.similarSkipped === 0)
144
+ return '';
145
+ const parts = [];
146
+ if (stats.localeSkipped > 0) {
147
+ parts.push(`${stats.localeSkipped} locales`);
148
+ }
149
+ if (stats.similarSkipped > 0) {
150
+ parts.push(`${stats.similarSkipped} similar`);
151
+ }
152
+ return `\n ${theme.muted('Skipped:')} ${theme.info(parts.join(', '))}`;
153
+ }
154
+ /**
155
+ * Warning message for size limit
156
+ */
157
+ export function limitWarning() {
158
+ const lines = [''];
159
+ lines.push(` ${theme.warning(icons.warning)} ${theme.warning('Stopped at free tier limit (~50MB)')}`);
160
+ lines.push(` ${theme.muted('Set MEMVID_API_KEY for unlimited crawling')}`);
161
+ lines.push(` ${theme.muted('Get your key:')} ${theme.info('https://memvid.com/dashboard/api')}`);
162
+ return lines.join('\n');
163
+ }
164
+ /**
165
+ * Cloud sync message
166
+ */
167
+ export function cloudSyncMessage(memoryId) {
168
+ const dashboardUrl = process.env.MEMVID_DASHBOARD_URL || 'https://memvid.com';
169
+ return `\n ${theme.muted('Synced:')} ${theme.info(`${dashboardUrl}/memories/${memoryId}`)}`;
170
+ }
171
+ /**
172
+ * Error message
173
+ */
174
+ export function errorMessage(message) {
175
+ return `\n ${theme.error(icons.error)} ${theme.error(message)}\n`;
176
+ }
177
+ /**
178
+ * Maw banner - minimal and clean
179
+ */
180
+ export function banner() {
181
+ return `
182
+ ${theme.primary.bold('maw')} ${theme.muted('— Feed the maw. It never forgets.')}
183
+ `;
184
+ }
185
+ /**
186
+ * Preview results display
187
+ */
188
+ export function previewResults(result) {
189
+ const lines = [''];
190
+ lines.push(` ${theme.primary.bold(result.domain)}`);
191
+ lines.push(` ${theme.muted(`${result.totalPages.toLocaleString()} pages in sitemap`)}`);
192
+ if (result.estimatedSize) {
193
+ lines.push(` ${theme.muted('Est. size:')} ${theme.accent(result.estimatedSize)}`);
194
+ }
195
+ if (result.recentPages.length > 0) {
196
+ lines.push('');
197
+ lines.push(` ${theme.muted('Recent:')}`);
198
+ for (const page of result.recentPages.slice(0, 8)) {
199
+ const date = page.lastmod ? theme.warning(page.lastmod) + ' ' : '';
200
+ const url = truncateUrl(page.url, 55);
201
+ lines.push(` ${date}${theme.info(url)}`);
202
+ }
203
+ if (result.recentPages.length > 8) {
204
+ lines.push(` ${theme.muted(`... +${result.recentPages.length - 8} more`)}`);
205
+ }
206
+ }
207
+ if (!result.hasSitemap) {
208
+ lines.push('');
209
+ lines.push(` ${theme.muted('No sitemap. Will discover by crawling.')}`);
210
+ }
211
+ lines.push('');
212
+ return lines.join('\n');
213
+ }
214
+ /**
215
+ * Search results display
216
+ */
217
+ export function searchResults(hits) {
218
+ const lines = [''];
219
+ if (hits.length === 0) {
220
+ lines.push(` ${theme.muted('No results found.')}`);
221
+ return lines.join('\n');
222
+ }
223
+ // Deduplicate by base title (remove page info, keep highest score)
224
+ const seen = new Map();
225
+ for (const hit of hits) {
226
+ // Extract base title (remove " (page X/Y)" suffix)
227
+ const baseTitle = hit.title.replace(/\s*\(page \d+\/\d+\)\s*$/, '');
228
+ const existing = seen.get(baseTitle);
229
+ if (!existing || (hit.score || 0) > (existing.score || 0)) {
230
+ seen.set(baseTitle, { ...hit, title: baseTitle });
231
+ }
232
+ }
233
+ const uniqueHits = Array.from(seen.values());
234
+ for (let i = 0; i < uniqueHits.length; i++) {
235
+ const hit = uniqueHits[i];
236
+ // Normalize score: if > 1, it's probably raw similarity, cap at 99
237
+ let scoreDisplay = '';
238
+ if (hit.score !== undefined) {
239
+ const normalizedScore = hit.score > 1 ? Math.min(hit.score / 2, 0.99) : hit.score;
240
+ scoreDisplay = theme.accent(`${(normalizedScore * 100).toFixed(0)}%`) + ' ';
241
+ }
242
+ // Show full title (no truncation)
243
+ lines.push(` ${theme.muted(`${i + 1}.`)} ${scoreDisplay}${theme.white(hit.title)}`);
244
+ if (hit.metadata?.url && !hit.metadata.url.startsWith('mv2://')) {
245
+ lines.push(` ${theme.muted(hit.metadata.url)}`);
246
+ }
247
+ lines.push('');
248
+ }
249
+ return lines.join('\n');
250
+ }
251
+ /**
252
+ * Ask result display
253
+ */
254
+ export function askResult(answer, sources) {
255
+ const lines = [''];
256
+ // Wrap answer text nicely
257
+ const maxWidth = 75;
258
+ const words = answer.split(' ');
259
+ let currentLine = ' ';
260
+ for (const word of words) {
261
+ if (currentLine.length + word.length + 1 > maxWidth) {
262
+ lines.push(currentLine);
263
+ currentLine = ' ' + word;
264
+ }
265
+ else {
266
+ currentLine += (currentLine === ' ' ? '' : ' ') + word;
267
+ }
268
+ }
269
+ if (currentLine.trim()) {
270
+ lines.push(currentLine);
271
+ }
272
+ lines.push('');
273
+ if (sources && sources.length > 0) {
274
+ // Deduplicate sources by base title (remove page info)
275
+ const seen = new Set();
276
+ const uniqueSources = sources.filter(s => {
277
+ // Extract base title (remove " (page X/Y)" suffix)
278
+ let key = (s.title || s.url || '').replace(/\s*\(page \d+\/\d+\)\s*$/, '');
279
+ if (seen.has(key))
280
+ return false;
281
+ seen.add(key);
282
+ return true;
283
+ });
284
+ lines.push(` ${theme.muted('Sources:')}`);
285
+ for (const source of uniqueSources.slice(0, 3)) {
286
+ // Clean up title - remove page info for cleaner display
287
+ let display = (source.title || source.url || '').replace(/\s*\(page \d+\/\d+\)\s*$/, '');
288
+ lines.push(` ${theme.muted('›')} ${theme.info(display)}`);
289
+ }
290
+ }
291
+ lines.push('');
292
+ return lines.join('\n');
293
+ }
294
+ /**
295
+ * List documents display
296
+ */
297
+ export function listDocuments(items) {
298
+ const lines = [''];
299
+ if (items.length === 0) {
300
+ lines.push(` ${theme.muted('No documents found.')}`);
301
+ return lines.join('\n');
302
+ }
303
+ // Deduplicate by base title (remove page info)
304
+ const seen = new Map();
305
+ for (const item of items) {
306
+ // Extract base title (remove " (page X/Y)" suffix)
307
+ const baseTitle = (item.title || item.preview || '').replace(/\s*\(page \d+\/\d+\)\s*$/, '');
308
+ const key = baseTitle || item.url || '';
309
+ const existing = seen.get(key);
310
+ if (existing) {
311
+ existing.pages++;
312
+ }
313
+ else {
314
+ seen.set(key, { item: { ...item, title: baseTitle || item.title }, pages: 1 });
315
+ }
316
+ }
317
+ const uniqueItems = Array.from(seen.values());
318
+ lines.push(` ${theme.muted(`${uniqueItems.length} document${uniqueItems.length !== 1 ? 's' : ''}`)}`);
319
+ lines.push('');
320
+ for (let i = 0; i < uniqueItems.length; i++) {
321
+ const { item, pages } = uniqueItems[i];
322
+ const title = item.title || item.preview || 'Untitled';
323
+ const pageInfo = pages > 1 ? theme.muted(` (${pages} pages)`) : '';
324
+ lines.push(` ${theme.muted(`${i + 1}.`)} ${theme.white(title)}${pageInfo}`);
325
+ if (item.url && !item.url.startsWith('mv2://')) {
326
+ lines.push(` ${theme.muted(item.url)}`);
327
+ }
328
+ }
329
+ lines.push('');
330
+ return lines.join('\n');
331
+ }
332
+ /**
333
+ * Stats panel for detailed view
334
+ */
335
+ export function statsPanel(stats) {
336
+ const lines = [''];
337
+ for (const [key, value] of Object.entries(stats)) {
338
+ const val = typeof value === 'number' ? value.toLocaleString() : value;
339
+ lines.push(` ${theme.muted(key)} ${theme.accent(val)}`);
340
+ }
341
+ return lines.join('\n');
342
+ }
343
+ /**
344
+ * Summary table
345
+ */
346
+ export function summaryTable(rows) {
347
+ const lines = [''];
348
+ for (const row of rows) {
349
+ const colorFn = row.color ? theme[row.color] : theme.info;
350
+ const value = typeof row.value === 'number' ? row.value.toLocaleString() : row.value;
351
+ lines.push(` ${theme.muted(row.label.padEnd(20))} ${colorFn.bold(value)}`);
352
+ }
353
+ return lines.join('\n');
354
+ }
355
+ // Export theme for custom usage
356
+ export { theme };
357
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../src/utils/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * URL utilities for maw
3
+ */
4
+ /**
5
+ * Normalize a URL for deduplication
6
+ */
7
+ export declare function normalizeUrl(url: string): string;
8
+ /**
9
+ * Extract the base domain from a URL
10
+ */
11
+ export declare function getBaseDomain(url: string): string;
12
+ export declare function shouldSkipUrl(url: string): boolean;
13
+ /**
14
+ * Resolve a relative URL against a base URL
15
+ */
16
+ export declare function resolveUrl(href: string, baseUrl: string): string | null;
17
+ /**
18
+ * Check if two URLs are on the same domain
19
+ */
20
+ export declare function isSameDomain(url1: string, url2: string): boolean;
21
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/utils/url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA2BhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOjD;AAgBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAqBlD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQhE"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * URL utilities for maw
3
+ */
4
+ /**
5
+ * Normalize a URL for deduplication
6
+ */
7
+ export function normalizeUrl(url) {
8
+ try {
9
+ const parsed = new URL(url.startsWith('http') ? url : `https://${url}`);
10
+ // Remove trailing slash
11
+ let path = parsed.pathname;
12
+ if (path.endsWith('/') && path !== '/') {
13
+ path = path.slice(0, -1);
14
+ }
15
+ // Remove common tracking params
16
+ parsed.searchParams.delete('utm_source');
17
+ parsed.searchParams.delete('utm_medium');
18
+ parsed.searchParams.delete('utm_campaign');
19
+ parsed.searchParams.delete('utm_content');
20
+ parsed.searchParams.delete('utm_term');
21
+ parsed.searchParams.delete('ref');
22
+ parsed.searchParams.delete('fbclid');
23
+ parsed.searchParams.delete('gclid');
24
+ // Remove hash
25
+ parsed.hash = '';
26
+ return `${parsed.origin}${path}${parsed.search}`;
27
+ }
28
+ catch {
29
+ return url;
30
+ }
31
+ }
32
+ /**
33
+ * Extract the base domain from a URL
34
+ */
35
+ export function getBaseDomain(url) {
36
+ try {
37
+ const parsed = new URL(url.startsWith('http') ? url : `https://${url}`);
38
+ return parsed.hostname.replace(/^www\./, '');
39
+ }
40
+ catch {
41
+ return url;
42
+ }
43
+ }
44
+ /**
45
+ * Check if a URL should be skipped (non-HTML resources)
46
+ */
47
+ const SKIP_EXTENSIONS = new Set([
48
+ '.pdf', '.jpg', '.jpeg', '.png', '.gif', '.svg', '.ico', '.webp', '.avif',
49
+ '.css', '.js', '.mjs', '.cjs', '.ts', '.tsx', '.jsx',
50
+ '.woff', '.woff2', '.ttf', '.eot', '.otf',
51
+ '.mp4', '.mp3', '.wav', '.ogg', '.webm', '.avi', '.mov',
52
+ '.zip', '.tar', '.gz', '.rar', '.7z',
53
+ '.exe', '.dmg', '.pkg', '.deb', '.rpm',
54
+ '.json', '.xml', '.yaml', '.yml', '.toml',
55
+ '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx',
56
+ ]);
57
+ export function shouldSkipUrl(url) {
58
+ try {
59
+ const parsed = new URL(url);
60
+ const pathname = parsed.pathname.toLowerCase();
61
+ // Skip non-HTML extensions
62
+ for (const ext of SKIP_EXTENSIONS) {
63
+ if (pathname.endsWith(ext)) {
64
+ return true;
65
+ }
66
+ }
67
+ // Skip mailto and javascript links
68
+ if (url.startsWith('mailto:') || url.startsWith('javascript:') || url.startsWith('tel:')) {
69
+ return true;
70
+ }
71
+ return false;
72
+ }
73
+ catch {
74
+ return true;
75
+ }
76
+ }
77
+ /**
78
+ * Resolve a relative URL against a base URL
79
+ */
80
+ export function resolveUrl(href, baseUrl) {
81
+ try {
82
+ if (href.startsWith('#'))
83
+ return null;
84
+ if (href.startsWith('mailto:') || href.startsWith('javascript:') || href.startsWith('tel:')) {
85
+ return null;
86
+ }
87
+ const base = new URL(baseUrl);
88
+ return new URL(href, base.origin).href;
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ }
94
+ /**
95
+ * Check if two URLs are on the same domain
96
+ */
97
+ export function isSameDomain(url1, url2) {
98
+ try {
99
+ const domain1 = getBaseDomain(url1);
100
+ const domain2 = getBaseDomain(url2);
101
+ return domain1 === domain2;
102
+ }
103
+ catch {
104
+ return false;
105
+ }
106
+ }
107
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/utils/url.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@memvid/maw",
3
+ "version": "1.0.0",
4
+ "description": "Crawl any site. Search it forever.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "maw": "dist/bin/maw.js"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/memvid/maw.git"
14
+ },
15
+ "homepage": "https://github.com/memvid/maw#readme",
16
+ "bugs": {
17
+ "url": "https://github.com/memvid/maw/issues"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsx watch src/index.ts",
22
+ "test": "vitest",
23
+ "prepublishOnly": "npm run build"
24
+ },
25
+ "keywords": [
26
+ "web-scraper",
27
+ "markdown",
28
+ "ai",
29
+ "memory",
30
+ "rag",
31
+ "offline",
32
+ "documentation",
33
+ "crawler"
34
+ ],
35
+ "author": "Memvid",
36
+ "license": "MIT",
37
+ "dependencies": {
38
+ "@memvid/sdk": "^2.0.148",
39
+ "@mozilla/readability": "^0.5.0",
40
+ "chalk": "^5.3.0",
41
+ "cheerio": "^1.0.0",
42
+ "cliui": "^9.0.1",
43
+ "commander": "^12.0.0",
44
+ "jsdom": "^24.0.0",
45
+ "node-html-markdown": "^1.3.0",
46
+ "p-queue": "^8.0.0",
47
+ "sitemapper": "^4.0.2"
48
+ },
49
+ "optionalDependencies": {
50
+ "playwright": "^1.47.0",
51
+ "rebrowser-playwright": "^1.47.0"
52
+ },
53
+ "devDependencies": {
54
+ "@types/jsdom": "^21.0.0",
55
+ "@types/node": "^20.0.0",
56
+ "tsx": "^4.0.0",
57
+ "typescript": "^5.0.0",
58
+ "vitest": "^1.0.0"
59
+ },
60
+ "engines": {
61
+ "node": ">=20"
62
+ },
63
+ "files": [
64
+ "dist",
65
+ "README.md",
66
+ "LICENSE"
67
+ ],
68
+ "publishConfig": {
69
+ "access": "public"
70
+ }
71
+ }