@cosmocoder/mcp-web-docs 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/LICENSE +22 -0
- package/README.md +368 -0
- package/build/__mocks__/embeddings.d.ts +17 -0
- package/build/__mocks__/embeddings.js +66 -0
- package/build/__mocks__/embeddings.js.map +1 -0
- package/build/config.d.ts +44 -0
- package/build/config.js +158 -0
- package/build/config.js.map +1 -0
- package/build/config.test.d.ts +1 -0
- package/build/config.test.js +165 -0
- package/build/config.test.js.map +1 -0
- package/build/crawler/auth.d.ts +128 -0
- package/build/crawler/auth.js +546 -0
- package/build/crawler/auth.js.map +1 -0
- package/build/crawler/auth.test.d.ts +1 -0
- package/build/crawler/auth.test.js +174 -0
- package/build/crawler/auth.test.js.map +1 -0
- package/build/crawler/base.d.ts +24 -0
- package/build/crawler/base.js +149 -0
- package/build/crawler/base.js.map +1 -0
- package/build/crawler/base.test.d.ts +1 -0
- package/build/crawler/base.test.js +234 -0
- package/build/crawler/base.test.js.map +1 -0
- package/build/crawler/browser-config.d.ts +2 -0
- package/build/crawler/browser-config.js +29 -0
- package/build/crawler/browser-config.js.map +1 -0
- package/build/crawler/browser-config.test.d.ts +1 -0
- package/build/crawler/browser-config.test.js +56 -0
- package/build/crawler/browser-config.test.js.map +1 -0
- package/build/crawler/cheerio.d.ts +11 -0
- package/build/crawler/cheerio.js +134 -0
- package/build/crawler/cheerio.js.map +1 -0
- package/build/crawler/chromium.d.ts +21 -0
- package/build/crawler/chromium.js +596 -0
- package/build/crawler/chromium.js.map +1 -0
- package/build/crawler/content-extractor-types.d.ts +25 -0
- package/build/crawler/content-extractor-types.js +2 -0
- package/build/crawler/content-extractor-types.js.map +1 -0
- package/build/crawler/content-extractors.d.ts +9 -0
- package/build/crawler/content-extractors.js +9 -0
- package/build/crawler/content-extractors.js.map +1 -0
- package/build/crawler/content-utils.d.ts +2 -0
- package/build/crawler/content-utils.js +22 -0
- package/build/crawler/content-utils.js.map +1 -0
- package/build/crawler/content-utils.test.d.ts +1 -0
- package/build/crawler/content-utils.test.js +99 -0
- package/build/crawler/content-utils.test.js.map +1 -0
- package/build/crawler/crawlee-crawler.d.ts +63 -0
- package/build/crawler/crawlee-crawler.js +342 -0
- package/build/crawler/crawlee-crawler.js.map +1 -0
- package/build/crawler/crawlee-crawler.test.d.ts +1 -0
- package/build/crawler/crawlee-crawler.test.js +280 -0
- package/build/crawler/crawlee-crawler.test.js.map +1 -0
- package/build/crawler/default-extractor.d.ts +4 -0
- package/build/crawler/default-extractor.js +26 -0
- package/build/crawler/default-extractor.js.map +1 -0
- package/build/crawler/default-extractor.test.d.ts +1 -0
- package/build/crawler/default-extractor.test.js +200 -0
- package/build/crawler/default-extractor.test.js.map +1 -0
- package/build/crawler/default.d.ts +11 -0
- package/build/crawler/default.js +138 -0
- package/build/crawler/default.js.map +1 -0
- package/build/crawler/docs-crawler.d.ts +26 -0
- package/build/crawler/docs-crawler.js +97 -0
- package/build/crawler/docs-crawler.js.map +1 -0
- package/build/crawler/docs-crawler.test.d.ts +1 -0
- package/build/crawler/docs-crawler.test.js +185 -0
- package/build/crawler/docs-crawler.test.js.map +1 -0
- package/build/crawler/factory.d.ts +6 -0
- package/build/crawler/factory.js +83 -0
- package/build/crawler/factory.js.map +1 -0
- package/build/crawler/github-pages-extractor.d.ts +4 -0
- package/build/crawler/github-pages-extractor.js +33 -0
- package/build/crawler/github-pages-extractor.js.map +1 -0
- package/build/crawler/github-pages-extractor.test.d.ts +1 -0
- package/build/crawler/github-pages-extractor.test.js +184 -0
- package/build/crawler/github-pages-extractor.test.js.map +1 -0
- package/build/crawler/github.d.ts +20 -0
- package/build/crawler/github.js +181 -0
- package/build/crawler/github.js.map +1 -0
- package/build/crawler/github.test.d.ts +1 -0
- package/build/crawler/github.test.js +326 -0
- package/build/crawler/github.test.js.map +1 -0
- package/build/crawler/puppeteer.d.ts +16 -0
- package/build/crawler/puppeteer.js +191 -0
- package/build/crawler/puppeteer.js.map +1 -0
- package/build/crawler/queue-manager.d.ts +43 -0
- package/build/crawler/queue-manager.js +169 -0
- package/build/crawler/queue-manager.js.map +1 -0
- package/build/crawler/queue-manager.test.d.ts +1 -0
- package/build/crawler/queue-manager.test.js +509 -0
- package/build/crawler/queue-manager.test.js.map +1 -0
- package/build/crawler/site-rules.d.ts +11 -0
- package/build/crawler/site-rules.js +104 -0
- package/build/crawler/site-rules.js.map +1 -0
- package/build/crawler/site-rules.test.d.ts +1 -0
- package/build/crawler/site-rules.test.js +139 -0
- package/build/crawler/site-rules.test.js.map +1 -0
- package/build/crawler/storybook-extractor.d.ts +34 -0
- package/build/crawler/storybook-extractor.js +767 -0
- package/build/crawler/storybook-extractor.js.map +1 -0
- package/build/crawler/storybook-extractor.test.d.ts +1 -0
- package/build/crawler/storybook-extractor.test.js +491 -0
- package/build/crawler/storybook-extractor.test.js.map +1 -0
- package/build/embeddings/fastembed.d.ts +25 -0
- package/build/embeddings/fastembed.js +188 -0
- package/build/embeddings/fastembed.js.map +1 -0
- package/build/embeddings/fastembed.test.d.ts +1 -0
- package/build/embeddings/fastembed.test.js +307 -0
- package/build/embeddings/fastembed.test.js.map +1 -0
- package/build/embeddings/openai.d.ts +8 -0
- package/build/embeddings/openai.js +56 -0
- package/build/embeddings/openai.js.map +1 -0
- package/build/embeddings/types.d.ts +4 -0
- package/build/embeddings/types.js +2 -0
- package/build/embeddings/types.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +1007 -0
- package/build/index.js.map +1 -0
- package/build/index.test.d.ts +1 -0
- package/build/index.test.js +364 -0
- package/build/index.test.js.map +1 -0
- package/build/indexing/queue-manager.d.ts +36 -0
- package/build/indexing/queue-manager.js +86 -0
- package/build/indexing/queue-manager.js.map +1 -0
- package/build/indexing/queue-manager.test.d.ts +1 -0
- package/build/indexing/queue-manager.test.js +257 -0
- package/build/indexing/queue-manager.test.js.map +1 -0
- package/build/indexing/status.d.ts +39 -0
- package/build/indexing/status.js +207 -0
- package/build/indexing/status.js.map +1 -0
- package/build/indexing/status.test.d.ts +1 -0
- package/build/indexing/status.test.js +246 -0
- package/build/indexing/status.test.js.map +1 -0
- package/build/processor/content.d.ts +16 -0
- package/build/processor/content.js +286 -0
- package/build/processor/content.js.map +1 -0
- package/build/processor/content.test.d.ts +1 -0
- package/build/processor/content.test.js +369 -0
- package/build/processor/content.test.js.map +1 -0
- package/build/processor/markdown.d.ts +11 -0
- package/build/processor/markdown.js +256 -0
- package/build/processor/markdown.js.map +1 -0
- package/build/processor/markdown.test.d.ts +1 -0
- package/build/processor/markdown.test.js +312 -0
- package/build/processor/markdown.test.js.map +1 -0
- package/build/processor/metadata-parser.d.ts +37 -0
- package/build/processor/metadata-parser.js +245 -0
- package/build/processor/metadata-parser.js.map +1 -0
- package/build/processor/metadata-parser.test.d.ts +1 -0
- package/build/processor/metadata-parser.test.js +357 -0
- package/build/processor/metadata-parser.test.js.map +1 -0
- package/build/processor/processor.d.ts +8 -0
- package/build/processor/processor.js +190 -0
- package/build/processor/processor.js.map +1 -0
- package/build/processor/processor.test.d.ts +1 -0
- package/build/processor/processor.test.js +357 -0
- package/build/processor/processor.test.js.map +1 -0
- package/build/rag/cache.d.ts +10 -0
- package/build/rag/cache.js +10 -0
- package/build/rag/cache.js.map +1 -0
- package/build/rag/code-generator.d.ts +11 -0
- package/build/rag/code-generator.js +30 -0
- package/build/rag/code-generator.js.map +1 -0
- package/build/rag/context-assembler.d.ts +23 -0
- package/build/rag/context-assembler.js +113 -0
- package/build/rag/context-assembler.js.map +1 -0
- package/build/rag/docs-search.d.ts +55 -0
- package/build/rag/docs-search.js +380 -0
- package/build/rag/docs-search.js.map +1 -0
- package/build/rag/pipeline.d.ts +26 -0
- package/build/rag/pipeline.js +91 -0
- package/build/rag/pipeline.js.map +1 -0
- package/build/rag/query-processor.d.ts +14 -0
- package/build/rag/query-processor.js +57 -0
- package/build/rag/query-processor.js.map +1 -0
- package/build/rag/reranker.d.ts +55 -0
- package/build/rag/reranker.js +210 -0
- package/build/rag/reranker.js.map +1 -0
- package/build/rag/response-generator.d.ts +20 -0
- package/build/rag/response-generator.js +101 -0
- package/build/rag/response-generator.js.map +1 -0
- package/build/rag/retriever.d.ts +19 -0
- package/build/rag/retriever.js +111 -0
- package/build/rag/retriever.js.map +1 -0
- package/build/rag/validator.d.ts +22 -0
- package/build/rag/validator.js +128 -0
- package/build/rag/validator.js.map +1 -0
- package/build/rag/version-manager.d.ts +23 -0
- package/build/rag/version-manager.js +98 -0
- package/build/rag/version-manager.js.map +1 -0
- package/build/setupTests.d.ts +4 -0
- package/build/setupTests.js +50 -0
- package/build/setupTests.js.map +1 -0
- package/build/storage/storage.d.ts +38 -0
- package/build/storage/storage.js +700 -0
- package/build/storage/storage.js.map +1 -0
- package/build/storage/storage.test.d.ts +1 -0
- package/build/storage/storage.test.js +338 -0
- package/build/storage/storage.test.js.map +1 -0
- package/build/types/rag.d.ts +27 -0
- package/build/types/rag.js +2 -0
- package/build/types/rag.js.map +1 -0
- package/build/types.d.ts +120 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/build/util/content-utils.d.ts +31 -0
- package/build/util/content-utils.js +120 -0
- package/build/util/content-utils.js.map +1 -0
- package/build/util/content.d.ts +1 -0
- package/build/util/content.js +16 -0
- package/build/util/content.js.map +1 -0
- package/build/util/docs.d.ts +1 -0
- package/build/util/docs.js +26 -0
- package/build/util/docs.js.map +1 -0
- package/build/util/docs.test.d.ts +1 -0
- package/build/util/docs.test.js +49 -0
- package/build/util/docs.test.js.map +1 -0
- package/build/util/favicon.d.ts +6 -0
- package/build/util/favicon.js +88 -0
- package/build/util/favicon.js.map +1 -0
- package/build/util/favicon.test.d.ts +1 -0
- package/build/util/favicon.test.js +140 -0
- package/build/util/favicon.test.js.map +1 -0
- package/build/util/logger.d.ts +17 -0
- package/build/util/logger.js +72 -0
- package/build/util/logger.js.map +1 -0
- package/build/util/logger.test.d.ts +1 -0
- package/build/util/logger.test.js +46 -0
- package/build/util/logger.test.js.map +1 -0
- package/build/util/security.d.ts +312 -0
- package/build/util/security.js +719 -0
- package/build/util/security.js.map +1 -0
- package/build/util/security.test.d.ts +1 -0
- package/build/util/security.test.js +524 -0
- package/build/util/security.test.js.map +1 -0
- package/build/util/site-detector.d.ts +22 -0
- package/build/util/site-detector.js +42 -0
- package/build/util/site-detector.js.map +1 -0
- package/package.json +112 -0
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
import { URL } from 'url';
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
import PCR from 'puppeteer-chromium-resolver';
|
|
4
|
+
import { BaseCrawler } from './base.js';
|
|
5
|
+
export class ChromiumCrawler extends BaseCrawler {
|
|
6
|
+
PCR_CONFIG = {
|
|
7
|
+
revision: '',
|
|
8
|
+
detectionPath: '',
|
|
9
|
+
folderName: '.chromium-browser',
|
|
10
|
+
downloadPath: process.env.CHROMIUM_PATH || '/tmp/chromium'
|
|
11
|
+
};
|
|
12
|
+
curCrawlCount = 0;
|
|
13
|
+
baseHostname = '';
|
|
14
|
+
BATCH_SIZE = 20; // Increased for parallel processing
|
|
15
|
+
REACT_WAIT_TIME = 3000; // Increased for Storybook initial load
|
|
16
|
+
NAVIGATION_WAIT_TIME = 1000; // Increased for Storybook navigation
|
|
17
|
+
MAX_CONCURRENT_PAGES = 3; // Number of concurrent pages
|
|
18
|
+
PAGE_TIMEOUT = 20000; // Reduced page timeout
|
|
19
|
+
resourceCache = new Map();
|
|
20
|
+
constructor(maxDepth = 4, maxRequestsPerCrawl = 1000, onProgress) {
|
|
21
|
+
super(maxDepth, maxRequestsPerCrawl, onProgress);
|
|
22
|
+
}
|
|
23
|
+
async *crawl(url) {
|
|
24
|
+
console.debug(`[${this.constructor.name}] Starting crawl of: ${url}`);
|
|
25
|
+
// Store the base hostname to restrict crawling
|
|
26
|
+
const startUrl = new URL(url);
|
|
27
|
+
this.baseHostname = startUrl.hostname;
|
|
28
|
+
const stats = await PCR(this.PCR_CONFIG);
|
|
29
|
+
const browser = await stats.puppeteer.launch({
|
|
30
|
+
args: [
|
|
31
|
+
'--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36',
|
|
32
|
+
'--disable-web-security', // Allow cross-origin requests
|
|
33
|
+
'--disable-features=IsolateOrigins,site-per-process', // Disable site isolation
|
|
34
|
+
'--no-sandbox',
|
|
35
|
+
'--disable-setuid-sandbox',
|
|
36
|
+
'--window-size=1920,1080' // Larger viewport
|
|
37
|
+
],
|
|
38
|
+
executablePath: stats.executablePath,
|
|
39
|
+
headless: 'new',
|
|
40
|
+
defaultViewport: {
|
|
41
|
+
width: 1920,
|
|
42
|
+
height: 1080
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
try {
|
|
46
|
+
const page = await browser.newPage();
|
|
47
|
+
// Enhanced page configuration
|
|
48
|
+
await Promise.all([
|
|
49
|
+
page.setDefaultNavigationTimeout(60000), // Increased timeout
|
|
50
|
+
page.setDefaultTimeout(60000),
|
|
51
|
+
page.setViewport({ width: 1920, height: 1080 }),
|
|
52
|
+
page.setJavaScriptEnabled(true)
|
|
53
|
+
]);
|
|
54
|
+
console.debug('[ChromiumCrawler] Basic page configuration complete');
|
|
55
|
+
// Load the first page without request interception
|
|
56
|
+
console.debug('[ChromiumCrawler] Loading initial page:', startUrl.toString());
|
|
57
|
+
await page.goto(startUrl.toString(), {
|
|
58
|
+
waitUntil: ['networkidle0'], // Wait for all network activity to stop
|
|
59
|
+
timeout: 60000 // Longer timeout for initial load
|
|
60
|
+
});
|
|
61
|
+
console.debug('[ChromiumCrawler] Initial page navigation complete');
|
|
62
|
+
// Initial wait for page load
|
|
63
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
64
|
+
// Wait for Storybook to be ready
|
|
65
|
+
console.debug('[ChromiumCrawler] Waiting for Storybook...');
|
|
66
|
+
await page.waitForFunction(() => {
|
|
67
|
+
// Check for Storybook API
|
|
68
|
+
const api = window.__STORYBOOK_API__;
|
|
69
|
+
if (!api?.store?.getState) {
|
|
70
|
+
console.debug('[Page] No Storybook API yet');
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// Check for manager UI
|
|
74
|
+
const manager = document.querySelector('#storybook-preview-wrapper');
|
|
75
|
+
if (!manager) {
|
|
76
|
+
console.debug('[Page] No manager UI yet');
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
// Check for stories in the store
|
|
80
|
+
const { stories = {} } = api.store.getState();
|
|
81
|
+
const storyCount = Object.keys(stories).length;
|
|
82
|
+
// Check for sidebar
|
|
83
|
+
const sidebar = document.querySelector('[class*="sidebar"]');
|
|
84
|
+
console.debug('[Page] Storybook check:', {
|
|
85
|
+
hasApi: !!api,
|
|
86
|
+
hasManager: !!manager,
|
|
87
|
+
hasSidebar: !!sidebar,
|
|
88
|
+
storyCount
|
|
89
|
+
});
|
|
90
|
+
// Wait for both stories and sidebar
|
|
91
|
+
return storyCount > 0 && !!sidebar;
|
|
92
|
+
}, { timeout: 60000, polling: 1000 } // Longer timeout and active polling
|
|
93
|
+
);
|
|
94
|
+
console.debug('[ChromiumCrawler] Storybook initialized');
|
|
95
|
+
// Wait for preview iframe
|
|
96
|
+
console.debug('[ChromiumCrawler] Waiting for preview iframe...');
|
|
97
|
+
await page.waitForSelector('iframe[id="storybook-preview-iframe"]', { timeout: 20000 })
|
|
98
|
+
.catch(() => console.debug('[ChromiumCrawler] No preview iframe found'));
|
|
99
|
+
// Additional wait for any dynamic updates
|
|
100
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
101
|
+
// Now enable request interception for subsequent requests
|
|
102
|
+
await page.setRequestInterception(true);
|
|
103
|
+
console.debug('[ChromiumCrawler] Request interception enabled for subsequent requests');
|
|
104
|
+
// Short wait to ensure everything is stable
|
|
105
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
106
|
+
console.debug('[ChromiumCrawler] Additional wait complete');
|
|
107
|
+
// Enhanced error and event handling
|
|
108
|
+
page.on('console', (msg) => {
|
|
109
|
+
const type = msg.type();
|
|
110
|
+
const text = msg.text();
|
|
111
|
+
if (type === 'error' || type === 'warn') {
|
|
112
|
+
console.error(`[ChromiumCrawler] Console ${type}: ${text}`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.debug(`[ChromiumCrawler] Console ${type}: ${text}`);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
page.on('pageerror', (err) => {
|
|
119
|
+
console.error('[ChromiumCrawler] Page error:', {
|
|
120
|
+
message: err.message,
|
|
121
|
+
stack: err.stack,
|
|
122
|
+
name: err.name
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
page.on('requestfailed', (request) => {
|
|
126
|
+
const failure = request.failure();
|
|
127
|
+
console.error('[ChromiumCrawler] Request failed:', {
|
|
128
|
+
url: request.url(),
|
|
129
|
+
errorText: failure?.errorText,
|
|
130
|
+
method: request.method(),
|
|
131
|
+
resourceType: request.resourceType()
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
page.on('response', (response) => {
|
|
135
|
+
const status = response.status();
|
|
136
|
+
if (status >= 400) {
|
|
137
|
+
console.error('[ChromiumCrawler] HTTP error:', {
|
|
138
|
+
url: response.url(),
|
|
139
|
+
status,
|
|
140
|
+
statusText: response.statusText()
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
// Minimal request handling for Storybook
|
|
145
|
+
page.on('request', (request) => {
|
|
146
|
+
const resourceType = request.resourceType();
|
|
147
|
+
const url = request.url();
|
|
148
|
+
// Block only non-essential resources
|
|
149
|
+
if (['image', 'media', 'font', 'websocket'].includes(resourceType) ||
|
|
150
|
+
url.includes('google-analytics') ||
|
|
151
|
+
url.includes('analytics') ||
|
|
152
|
+
url.includes('tracking')) {
|
|
153
|
+
request.abort();
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// Allow all other resources including Storybook-specific ones
|
|
157
|
+
request.continue();
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
// Initialize progress tracking
|
|
161
|
+
this.updateProgress('Starting crawl...');
|
|
162
|
+
// Extract content from initial page
|
|
163
|
+
const { content, title } = await this.extractPageContent(page);
|
|
164
|
+
// Get links from initial page
|
|
165
|
+
const links = await this.getLinksFromPage(page, startUrl);
|
|
166
|
+
console.debug(`[ChromiumCrawler] Found ${links.length} links on initial page:`, links);
|
|
167
|
+
// Update progress for initial page
|
|
168
|
+
this.addDiscoveredUrls(links.length);
|
|
169
|
+
this.markUrlProcessed(startUrl.toString());
|
|
170
|
+
// Yield initial page content
|
|
171
|
+
const initialResult = {
|
|
172
|
+
url: startUrl.toString(),
|
|
173
|
+
path: startUrl.pathname + startUrl.search,
|
|
174
|
+
content,
|
|
175
|
+
title
|
|
176
|
+
};
|
|
177
|
+
console.debug('[ChromiumCrawler] Initial page content:', {
|
|
178
|
+
url: initialResult.url,
|
|
179
|
+
path: initialResult.path,
|
|
180
|
+
titleLength: initialResult.title.length,
|
|
181
|
+
contentLength: initialResult.content.length
|
|
182
|
+
});
|
|
183
|
+
yield initialResult;
|
|
184
|
+
// Initialize visited links tracking
|
|
185
|
+
const visitedLinks = new Set([startUrl.toString()]);
|
|
186
|
+
console.debug('[ChromiumCrawler] Initialized visited links with:', Array.from(visitedLinks));
|
|
187
|
+
// Process remaining pages in parallel
|
|
188
|
+
if (links.length > 0) {
|
|
189
|
+
// Create initial pool of browser contexts
|
|
190
|
+
const contexts = await Promise.all(Array(this.MAX_CONCURRENT_PAGES).fill(0).map(() => browser.createIncognitoBrowserContext()));
|
|
191
|
+
let contextIndex = 0;
|
|
192
|
+
// Process links in batches
|
|
193
|
+
for (let i = 0; i < links.length; i += this.BATCH_SIZE) {
|
|
194
|
+
const batch = links.slice(i, i + this.BATCH_SIZE);
|
|
195
|
+
const batchPromises = [];
|
|
196
|
+
for (const link of batch) {
|
|
197
|
+
if (this.curCrawlCount >= this.maxRequestsPerCrawl) {
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
// Use round-robin context assignment
|
|
201
|
+
const context = contexts[contextIndex];
|
|
202
|
+
contextIndex = (contextIndex + 1) % contexts.length;
|
|
203
|
+
const page = await context.newPage();
|
|
204
|
+
await this.configurePage(page);
|
|
205
|
+
this.curCrawlCount++;
|
|
206
|
+
batchPromises.push(this.processSinglePage(page, new URL(link), visitedLinks));
|
|
207
|
+
}
|
|
208
|
+
// Process batch
|
|
209
|
+
const results = await Promise.all(batchPromises);
|
|
210
|
+
for (const result of results) {
|
|
211
|
+
if (result) {
|
|
212
|
+
yield result;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Short delay between batches
|
|
216
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
217
|
+
}
|
|
218
|
+
// Cleanup contexts
|
|
219
|
+
await Promise.all(contexts.map((ctx) => ctx.close()));
|
|
220
|
+
}
|
|
221
|
+
// Final progress update
|
|
222
|
+
this.updateProgress('Crawl complete');
|
|
223
|
+
}
|
|
224
|
+
catch (e) {
|
|
225
|
+
console.error('[ChromiumCrawler] Error during crawl:', e);
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
await browser.close();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
async extractPageContent(page) {
|
|
232
|
+
// Import pdfjs-dist at runtime
|
|
233
|
+
const pdfjsLib = require('pdfjs-dist');
|
|
234
|
+
// Configure PDF.js worker
|
|
235
|
+
const pdfjsWorker = require('pdfjs-dist/build/pdf.worker.entry');
|
|
236
|
+
pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorker;
|
|
237
|
+
try {
|
|
238
|
+
// Generate PDF of the page
|
|
239
|
+
const pdfBuffer = await page.pdf({
|
|
240
|
+
format: 'A4',
|
|
241
|
+
printBackground: true,
|
|
242
|
+
margin: { top: '20px', right: '20px', bottom: '20px', left: '20px' }
|
|
243
|
+
});
|
|
244
|
+
// Load the PDF document
|
|
245
|
+
const pdf = await pdfjsLib.getDocument({ data: pdfBuffer }).promise;
|
|
246
|
+
// Extract text from all pages
|
|
247
|
+
let textContent = '';
|
|
248
|
+
for (let i = 1; i <= pdf.numPages; i++) {
|
|
249
|
+
const page = await pdf.getPage(i);
|
|
250
|
+
const content = await page.getTextContent();
|
|
251
|
+
const pageText = content.items
|
|
252
|
+
.map((item) => item.str)
|
|
253
|
+
.join(' ');
|
|
254
|
+
textContent += pageText + '\n';
|
|
255
|
+
}
|
|
256
|
+
// Get the title from the page
|
|
257
|
+
const title = await page.evaluate(() => {
|
|
258
|
+
return document.querySelector('h1')?.textContent?.trim() ||
|
|
259
|
+
document.title?.trim() ||
|
|
260
|
+
'Untitled';
|
|
261
|
+
});
|
|
262
|
+
// Convert the text content to HTML with proper structure
|
|
263
|
+
const htmlContent = textContent
|
|
264
|
+
.split('\n')
|
|
265
|
+
.filter(line => line.trim()) // Remove empty lines
|
|
266
|
+
.map(line => `<p>${line}</p>`) // Wrap each line in a paragraph
|
|
267
|
+
.join('\n');
|
|
268
|
+
return {
|
|
269
|
+
content: htmlContent,
|
|
270
|
+
title: title
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
catch (e) {
|
|
274
|
+
console.error('[ChromiumCrawler] Error extracting content:', e);
|
|
275
|
+
// Fallback to basic text extraction
|
|
276
|
+
const title = await page.title();
|
|
277
|
+
const content = await page.evaluate(() => document.body.innerText);
|
|
278
|
+
return {
|
|
279
|
+
content: `<p>${content}</p>`,
|
|
280
|
+
title: title || 'Untitled'
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
async waitForDynamicContent(page) {
|
|
285
|
+
try {
|
|
286
|
+
// Initial shorter wait for React hydration
|
|
287
|
+
await new Promise(resolve => setTimeout(resolve, this.REACT_WAIT_TIME));
|
|
288
|
+
// Wait for Storybook's iframe to load
|
|
289
|
+
try {
|
|
290
|
+
const iframeHandle = await page.$('iframe[id="storybook-preview-iframe"]');
|
|
291
|
+
if (iframeHandle) {
|
|
292
|
+
const frame = await iframeHandle.contentFrame();
|
|
293
|
+
if (frame) {
|
|
294
|
+
// Wait for content in the iframe
|
|
295
|
+
await frame.waitForFunction(() => {
|
|
296
|
+
const root = document.querySelector('#root');
|
|
297
|
+
return root && root.textContent ? root.textContent.trim().length > 0 : false;
|
|
298
|
+
}, { timeout: 10000 }).catch(() => {
|
|
299
|
+
console.debug('[ChromiumCrawler] Timeout waiting for iframe content');
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch (e) {
|
|
305
|
+
console.debug('[ChromiumCrawler] Error handling iframe:', e);
|
|
306
|
+
}
|
|
307
|
+
// Check for Storybook initialization in main document
|
|
308
|
+
await page.waitForFunction(() => {
|
|
309
|
+
// Check Storybook API and manager
|
|
310
|
+
const hasStorybook = typeof window.__STORYBOOK_API__ !== 'undefined' &&
|
|
311
|
+
document.querySelector('#storybook-preview-wrapper');
|
|
312
|
+
// Check for either content or navigation
|
|
313
|
+
const hasContent = document.querySelector('[class*="docs-content"]') ||
|
|
314
|
+
document.querySelector('[class*="story-content"]') ||
|
|
315
|
+
document.querySelector('[class*="storybook-"]');
|
|
316
|
+
const hasSidebar = document.querySelector('[class*="sidebar"]') ||
|
|
317
|
+
document.querySelector('[data-nodetype]');
|
|
318
|
+
return hasStorybook && (hasContent || hasSidebar);
|
|
319
|
+
}, { timeout: 10000 });
|
|
320
|
+
// Quick check for loading indicators
|
|
321
|
+
await page.waitForFunction(() => {
|
|
322
|
+
return !document.querySelector('[aria-busy="true"], [class*="loading"]');
|
|
323
|
+
}, { timeout: 5000 }).catch(() => {
|
|
324
|
+
// Continue even if loading indicators remain
|
|
325
|
+
console.debug('[ChromiumCrawler] Some loading indicators still present');
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
catch (e) {
|
|
329
|
+
console.debug('[ChromiumCrawler] Error waiting for Storybook content:', e);
|
|
330
|
+
throw e;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async gotoPageAndHandleRedirects(page, url) {
|
|
334
|
+
try {
|
|
335
|
+
// Navigate with optimized options for Storybook
|
|
336
|
+
await page.goto(url, {
|
|
337
|
+
timeout: 30000, // Reduced timeout
|
|
338
|
+
waitUntil: ['domcontentloaded', 'networkidle2'] // Removed 'load' to speed up
|
|
339
|
+
});
|
|
340
|
+
// Wait for client-side routing
|
|
341
|
+
await new Promise(resolve => setTimeout(resolve, this.NAVIGATION_WAIT_TIME));
|
|
342
|
+
// Wait for dynamic content
|
|
343
|
+
await this.waitForDynamicContent(page);
|
|
344
|
+
}
|
|
345
|
+
catch (e) {
|
|
346
|
+
console.error(`[ChromiumCrawler] Error loading page ${url}:`, e);
|
|
347
|
+
throw e;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
async configurePage(page) {
|
|
351
|
+
await Promise.all([
|
|
352
|
+
page.setDefaultNavigationTimeout(this.PAGE_TIMEOUT),
|
|
353
|
+
page.setDefaultTimeout(this.PAGE_TIMEOUT),
|
|
354
|
+
page.setRequestInterception(true)
|
|
355
|
+
]);
|
|
356
|
+
// Minimal request handling
|
|
357
|
+
page.on('request', (request) => {
|
|
358
|
+
const resourceType = request.resourceType();
|
|
359
|
+
const url = request.url();
|
|
360
|
+
// Check cache first
|
|
361
|
+
if (this.resourceCache.has(url)) {
|
|
362
|
+
request.respond({
|
|
363
|
+
body: this.resourceCache.get(url)
|
|
364
|
+
});
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
// Block only non-essential resources
|
|
368
|
+
if (['image', 'media', 'websocket'].includes(resourceType) ||
|
|
369
|
+
url.includes('google-analytics') ||
|
|
370
|
+
url.includes('analytics') ||
|
|
371
|
+
url.includes('tracking')) {
|
|
372
|
+
request.abort();
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
// Allow all other resources including Storybook-specific ones
|
|
376
|
+
request.continue();
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
// Cache responses
|
|
380
|
+
page.on('response', async (response) => {
|
|
381
|
+
const url = response.url();
|
|
382
|
+
const resourceType = response.request().resourceType();
|
|
383
|
+
if (['script', 'stylesheet'].includes(resourceType)) {
|
|
384
|
+
try {
|
|
385
|
+
const body = await response.text();
|
|
386
|
+
this.resourceCache.set(url, body);
|
|
387
|
+
}
|
|
388
|
+
catch (e) {
|
|
389
|
+
// Ignore cache errors
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
async processSinglePage(page, url, visitedLinks) {
|
|
395
|
+
try {
|
|
396
|
+
await this.gotoPageAndHandleRedirects(page, url.toString());
|
|
397
|
+
const currentUrl = page.url();
|
|
398
|
+
const { content, title } = await this.extractPageContent(page);
|
|
399
|
+
// Update tracking
|
|
400
|
+
this.markUrlProcessed(currentUrl);
|
|
401
|
+
visitedLinks.add(currentUrl);
|
|
402
|
+
await page.close();
|
|
403
|
+
return {
|
|
404
|
+
url: currentUrl,
|
|
405
|
+
path: new URL(currentUrl).pathname + new URL(currentUrl).search,
|
|
406
|
+
content,
|
|
407
|
+
title
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
catch (e) {
|
|
411
|
+
console.error(`[ChromiumCrawler] Error processing single page ${url}:`, e);
|
|
412
|
+
await page.close();
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
async getLinksFromPage(page, startUrl) {
|
|
417
|
+
try {
|
|
418
|
+
console.debug('[ChromiumCrawler] Starting link discovery...');
|
|
419
|
+
await new Promise(resolve => setTimeout(resolve, this.NAVIGATION_WAIT_TIME));
|
|
420
|
+
// Get all links from the page
|
|
421
|
+
const rawLinks = await page.evaluate(() => {
|
|
422
|
+
console.debug('[Page] Starting link discovery in page...');
|
|
423
|
+
const links = new Set();
|
|
424
|
+
// Helper function to normalize URLs
|
|
425
|
+
const normalizeUrl = (url) => {
|
|
426
|
+
console.debug('[Page] Normalizing URL:', url);
|
|
427
|
+
try {
|
|
428
|
+
// Handle relative paths with query parameters
|
|
429
|
+
if (url.startsWith('/')) {
|
|
430
|
+
// Keep the query parameters but ensure base path is correct
|
|
431
|
+
const urlObj = new URL(url, window.location.origin);
|
|
432
|
+
urlObj.hash = ''; // Remove hash
|
|
433
|
+
return urlObj.toString();
|
|
434
|
+
}
|
|
435
|
+
// Handle absolute URLs
|
|
436
|
+
const urlObj = new URL(url, window.location.href);
|
|
437
|
+
urlObj.hash = ''; // Remove hash but keep query params
|
|
438
|
+
return urlObj.toString();
|
|
439
|
+
}
|
|
440
|
+
catch (e) {
|
|
441
|
+
console.debug('[Page] Error normalizing URL:', e);
|
|
442
|
+
return '';
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
console.debug('[Page] Document ready state:', document.readyState);
|
|
446
|
+
// Get all anchor tags with href attributes
|
|
447
|
+
const anchors = Array.from(document.querySelectorAll('a[href]'));
|
|
448
|
+
console.debug('[Page] Found anchors:', anchors.length);
|
|
449
|
+
anchors.forEach(anchor => {
|
|
450
|
+
const href = anchor.getAttribute('href');
|
|
451
|
+
if (href && !href.startsWith('javascript:')) {
|
|
452
|
+
const normalized = normalizeUrl(href);
|
|
453
|
+
if (normalized) {
|
|
454
|
+
links.add(normalized);
|
|
455
|
+
console.debug('[Page] Added link:', {
|
|
456
|
+
href,
|
|
457
|
+
normalized,
|
|
458
|
+
text: anchor.textContent?.trim()
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
// Get links from iframes
|
|
464
|
+
const iframes = Array.from(document.getElementsByTagName('iframe'));
|
|
465
|
+
console.debug('[Page] Found iframes:', iframes.length);
|
|
466
|
+
iframes.forEach(iframe => {
|
|
467
|
+
try {
|
|
468
|
+
if (iframe.contentDocument) {
|
|
469
|
+
console.debug('[Page] Processing iframe:', iframe.id || 'unnamed');
|
|
470
|
+
const iframeLinks = Array.from(iframe.contentDocument.querySelectorAll('a[href]'));
|
|
471
|
+
console.debug('[Page] Found links in iframe:', iframeLinks.length);
|
|
472
|
+
iframeLinks.forEach(link => {
|
|
473
|
+
const href = link.href;
|
|
474
|
+
if (href && !href.startsWith('javascript:')) {
|
|
475
|
+
const normalized = normalizeUrl(href);
|
|
476
|
+
links.add(normalized);
|
|
477
|
+
console.debug('[Page] Added iframe link:', normalized);
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
catch (e) {
|
|
483
|
+
console.debug('[Page] Error accessing iframe:', e);
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
// Try to get Storybook links if available
|
|
487
|
+
try {
|
|
488
|
+
console.debug('[Page] Checking for Storybook API...');
|
|
489
|
+
const api = window.__STORYBOOK_API__;
|
|
490
|
+
if (api?.store?.getState) {
|
|
491
|
+
console.debug('[Page] Found Storybook API');
|
|
492
|
+
const { stories = {}, refs = {} } = api.store.getState();
|
|
493
|
+
console.debug('[Page] Stories count:', Object.keys(stories).length);
|
|
494
|
+
console.debug('[Page] Refs count:', Object.keys(refs).length);
|
|
495
|
+
// Add story links
|
|
496
|
+
Object.entries(stories).forEach(([storyId, story]) => {
|
|
497
|
+
// Add docs page
|
|
498
|
+
const docsUrl = normalizeUrl(`${window.location.pathname}?path=/docs/${storyId}`);
|
|
499
|
+
links.add(docsUrl);
|
|
500
|
+
console.debug('[Page] Added docs link:', { storyId, docsUrl });
|
|
501
|
+
// Add story page
|
|
502
|
+
const storyUrl = normalizeUrl(`${window.location.pathname}?path=/story/${storyId}`);
|
|
503
|
+
links.add(storyUrl);
|
|
504
|
+
console.debug('[Page] Added story link:', { storyId, storyUrl });
|
|
505
|
+
// Add any additional story variants
|
|
506
|
+
if (story.args) {
|
|
507
|
+
Object.keys(story.args).forEach(variantId => {
|
|
508
|
+
const variantUrl = normalizeUrl(`${window.location.pathname}?path=/story/${storyId}--${variantId}`);
|
|
509
|
+
links.add(variantUrl);
|
|
510
|
+
console.debug('[Page] Added variant link:', { storyId, variantId, variantUrl });
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
});
|
|
514
|
+
// Add reference links
|
|
515
|
+
Object.entries(refs).forEach(([refId, ref]) => {
|
|
516
|
+
if (ref.stories) {
|
|
517
|
+
Object.entries(ref.stories).forEach(([storyId, _]) => {
|
|
518
|
+
// Add docs page
|
|
519
|
+
const docsUrl = normalizeUrl(`${window.location.pathname}?path=/docs/${refId}-${storyId}`);
|
|
520
|
+
links.add(docsUrl);
|
|
521
|
+
console.debug('[Page] Added ref docs link:', { refId, storyId, docsUrl });
|
|
522
|
+
// Add story page
|
|
523
|
+
const storyUrl = normalizeUrl(`${window.location.pathname}?path=/story/${refId}-${storyId}`);
|
|
524
|
+
links.add(storyUrl);
|
|
525
|
+
console.debug('[Page] Added ref story link:', { refId, storyId, storyUrl });
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
else {
|
|
531
|
+
console.debug('[Page] No Storybook API found');
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
catch (e) {
|
|
535
|
+
console.debug('[Page] Error getting Storybook links:', e);
|
|
536
|
+
}
|
|
537
|
+
const result = Array.from(links).map(href => ({ href }));
|
|
538
|
+
console.debug('[Page] Total unique links found:', result.length);
|
|
539
|
+
return result;
|
|
540
|
+
});
|
|
541
|
+
console.debug(`[ChromiumCrawler] Raw links found:`, rawLinks);
|
|
542
|
+
const validLinks = new Set();
|
|
543
|
+
// Log the base hostname we're comparing against
|
|
544
|
+
console.debug(`[ChromiumCrawler] Base hostname: ${this.baseHostname}`);
|
|
545
|
+
for (const { href } of rawLinks) {
|
|
546
|
+
try {
|
|
547
|
+
// Handle different URL patterns
|
|
548
|
+
let fullUrl;
|
|
549
|
+
if (href.startsWith('?path=/')) {
|
|
550
|
+
// Handle query-only URLs by combining with the current URL
|
|
551
|
+
fullUrl = `${startUrl.origin}${startUrl.pathname}${href}`;
|
|
552
|
+
}
|
|
553
|
+
else if (href.startsWith('/')) {
|
|
554
|
+
// Handle absolute paths by combining with origin
|
|
555
|
+
fullUrl = `${startUrl.origin}${href}`;
|
|
556
|
+
}
|
|
557
|
+
else {
|
|
558
|
+
// Handle full URLs
|
|
559
|
+
fullUrl = href;
|
|
560
|
+
}
|
|
561
|
+
// Create URL object for validation
|
|
562
|
+
const linkUrl = new URL(fullUrl);
|
|
563
|
+
console.debug(`[ChromiumCrawler] Checking link:`, {
|
|
564
|
+
original: href,
|
|
565
|
+
fullUrl,
|
|
566
|
+
hostname: linkUrl.hostname,
|
|
567
|
+
pathname: linkUrl.pathname,
|
|
568
|
+
search: linkUrl.search
|
|
569
|
+
});
|
|
570
|
+
// Accept links that:
|
|
571
|
+
// 1. Match the base hostname and base path (/ui/latest/), or
|
|
572
|
+
// 2. Are query parameters for docs
|
|
573
|
+
if (linkUrl.hostname === this.baseHostname &&
|
|
574
|
+
(linkUrl.pathname.startsWith(startUrl.pathname) || href.startsWith('?path=/docs/'))) {
|
|
575
|
+
validLinks.add(linkUrl.toString());
|
|
576
|
+
console.debug(`[ChromiumCrawler] Added valid link: ${linkUrl.toString()}`);
|
|
577
|
+
}
|
|
578
|
+
else {
|
|
579
|
+
console.debug(`[ChromiumCrawler] Skipping link: ${href} (hostname: ${linkUrl.hostname}, pathname: ${linkUrl.pathname})`);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
catch (e) {
|
|
583
|
+
console.debug(`[ChromiumCrawler] Invalid URL ${href}:`, e);
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
const uniqueLinks = Array.from(validLinks);
|
|
587
|
+
console.debug(`[ChromiumCrawler] Found ${uniqueLinks.length} unique valid links`);
|
|
588
|
+
return uniqueLinks;
|
|
589
|
+
}
|
|
590
|
+
catch (e) {
|
|
591
|
+
console.error('[ChromiumCrawler] Error extracting links:', e);
|
|
592
|
+
return [];
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
//# sourceMappingURL=chromium.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chromium.js","sourceRoot":"","sources":["../../src/crawler/chromium.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ContentExtractor {
|
|
2
|
+
extractContent(document: Document): Promise<ExtractedContent>;
|
|
3
|
+
}
|
|
4
|
+
export interface ExtractedContent {
|
|
5
|
+
content: string;
|
|
6
|
+
metadata: {
|
|
7
|
+
type: 'overview' | 'props' | 'examples' | 'api' | 'usage';
|
|
8
|
+
pattern?: ComponentPattern;
|
|
9
|
+
relationships?: ComponentRelationship[];
|
|
10
|
+
context?: string[];
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface ComponentPattern {
|
|
14
|
+
name: string;
|
|
15
|
+
type: 'component' | 'layout' | 'page';
|
|
16
|
+
description: string;
|
|
17
|
+
usageContexts: string[];
|
|
18
|
+
relatedPatterns: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface ComponentRelationship {
|
|
21
|
+
sourceComponent: string;
|
|
22
|
+
targetComponent: string;
|
|
23
|
+
type: 'contains' | 'uses' | 'extends' | 'precedes';
|
|
24
|
+
context: string;
|
|
25
|
+
}
|