@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.
Files changed (240) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +368 -0
  3. package/build/__mocks__/embeddings.d.ts +17 -0
  4. package/build/__mocks__/embeddings.js +66 -0
  5. package/build/__mocks__/embeddings.js.map +1 -0
  6. package/build/config.d.ts +44 -0
  7. package/build/config.js +158 -0
  8. package/build/config.js.map +1 -0
  9. package/build/config.test.d.ts +1 -0
  10. package/build/config.test.js +165 -0
  11. package/build/config.test.js.map +1 -0
  12. package/build/crawler/auth.d.ts +128 -0
  13. package/build/crawler/auth.js +546 -0
  14. package/build/crawler/auth.js.map +1 -0
  15. package/build/crawler/auth.test.d.ts +1 -0
  16. package/build/crawler/auth.test.js +174 -0
  17. package/build/crawler/auth.test.js.map +1 -0
  18. package/build/crawler/base.d.ts +24 -0
  19. package/build/crawler/base.js +149 -0
  20. package/build/crawler/base.js.map +1 -0
  21. package/build/crawler/base.test.d.ts +1 -0
  22. package/build/crawler/base.test.js +234 -0
  23. package/build/crawler/base.test.js.map +1 -0
  24. package/build/crawler/browser-config.d.ts +2 -0
  25. package/build/crawler/browser-config.js +29 -0
  26. package/build/crawler/browser-config.js.map +1 -0
  27. package/build/crawler/browser-config.test.d.ts +1 -0
  28. package/build/crawler/browser-config.test.js +56 -0
  29. package/build/crawler/browser-config.test.js.map +1 -0
  30. package/build/crawler/cheerio.d.ts +11 -0
  31. package/build/crawler/cheerio.js +134 -0
  32. package/build/crawler/cheerio.js.map +1 -0
  33. package/build/crawler/chromium.d.ts +21 -0
  34. package/build/crawler/chromium.js +596 -0
  35. package/build/crawler/chromium.js.map +1 -0
  36. package/build/crawler/content-extractor-types.d.ts +25 -0
  37. package/build/crawler/content-extractor-types.js +2 -0
  38. package/build/crawler/content-extractor-types.js.map +1 -0
  39. package/build/crawler/content-extractors.d.ts +9 -0
  40. package/build/crawler/content-extractors.js +9 -0
  41. package/build/crawler/content-extractors.js.map +1 -0
  42. package/build/crawler/content-utils.d.ts +2 -0
  43. package/build/crawler/content-utils.js +22 -0
  44. package/build/crawler/content-utils.js.map +1 -0
  45. package/build/crawler/content-utils.test.d.ts +1 -0
  46. package/build/crawler/content-utils.test.js +99 -0
  47. package/build/crawler/content-utils.test.js.map +1 -0
  48. package/build/crawler/crawlee-crawler.d.ts +63 -0
  49. package/build/crawler/crawlee-crawler.js +342 -0
  50. package/build/crawler/crawlee-crawler.js.map +1 -0
  51. package/build/crawler/crawlee-crawler.test.d.ts +1 -0
  52. package/build/crawler/crawlee-crawler.test.js +280 -0
  53. package/build/crawler/crawlee-crawler.test.js.map +1 -0
  54. package/build/crawler/default-extractor.d.ts +4 -0
  55. package/build/crawler/default-extractor.js +26 -0
  56. package/build/crawler/default-extractor.js.map +1 -0
  57. package/build/crawler/default-extractor.test.d.ts +1 -0
  58. package/build/crawler/default-extractor.test.js +200 -0
  59. package/build/crawler/default-extractor.test.js.map +1 -0
  60. package/build/crawler/default.d.ts +11 -0
  61. package/build/crawler/default.js +138 -0
  62. package/build/crawler/default.js.map +1 -0
  63. package/build/crawler/docs-crawler.d.ts +26 -0
  64. package/build/crawler/docs-crawler.js +97 -0
  65. package/build/crawler/docs-crawler.js.map +1 -0
  66. package/build/crawler/docs-crawler.test.d.ts +1 -0
  67. package/build/crawler/docs-crawler.test.js +185 -0
  68. package/build/crawler/docs-crawler.test.js.map +1 -0
  69. package/build/crawler/factory.d.ts +6 -0
  70. package/build/crawler/factory.js +83 -0
  71. package/build/crawler/factory.js.map +1 -0
  72. package/build/crawler/github-pages-extractor.d.ts +4 -0
  73. package/build/crawler/github-pages-extractor.js +33 -0
  74. package/build/crawler/github-pages-extractor.js.map +1 -0
  75. package/build/crawler/github-pages-extractor.test.d.ts +1 -0
  76. package/build/crawler/github-pages-extractor.test.js +184 -0
  77. package/build/crawler/github-pages-extractor.test.js.map +1 -0
  78. package/build/crawler/github.d.ts +20 -0
  79. package/build/crawler/github.js +181 -0
  80. package/build/crawler/github.js.map +1 -0
  81. package/build/crawler/github.test.d.ts +1 -0
  82. package/build/crawler/github.test.js +326 -0
  83. package/build/crawler/github.test.js.map +1 -0
  84. package/build/crawler/puppeteer.d.ts +16 -0
  85. package/build/crawler/puppeteer.js +191 -0
  86. package/build/crawler/puppeteer.js.map +1 -0
  87. package/build/crawler/queue-manager.d.ts +43 -0
  88. package/build/crawler/queue-manager.js +169 -0
  89. package/build/crawler/queue-manager.js.map +1 -0
  90. package/build/crawler/queue-manager.test.d.ts +1 -0
  91. package/build/crawler/queue-manager.test.js +509 -0
  92. package/build/crawler/queue-manager.test.js.map +1 -0
  93. package/build/crawler/site-rules.d.ts +11 -0
  94. package/build/crawler/site-rules.js +104 -0
  95. package/build/crawler/site-rules.js.map +1 -0
  96. package/build/crawler/site-rules.test.d.ts +1 -0
  97. package/build/crawler/site-rules.test.js +139 -0
  98. package/build/crawler/site-rules.test.js.map +1 -0
  99. package/build/crawler/storybook-extractor.d.ts +34 -0
  100. package/build/crawler/storybook-extractor.js +767 -0
  101. package/build/crawler/storybook-extractor.js.map +1 -0
  102. package/build/crawler/storybook-extractor.test.d.ts +1 -0
  103. package/build/crawler/storybook-extractor.test.js +491 -0
  104. package/build/crawler/storybook-extractor.test.js.map +1 -0
  105. package/build/embeddings/fastembed.d.ts +25 -0
  106. package/build/embeddings/fastembed.js +188 -0
  107. package/build/embeddings/fastembed.js.map +1 -0
  108. package/build/embeddings/fastembed.test.d.ts +1 -0
  109. package/build/embeddings/fastembed.test.js +307 -0
  110. package/build/embeddings/fastembed.test.js.map +1 -0
  111. package/build/embeddings/openai.d.ts +8 -0
  112. package/build/embeddings/openai.js +56 -0
  113. package/build/embeddings/openai.js.map +1 -0
  114. package/build/embeddings/types.d.ts +4 -0
  115. package/build/embeddings/types.js +2 -0
  116. package/build/embeddings/types.js.map +1 -0
  117. package/build/index.d.ts +2 -0
  118. package/build/index.js +1007 -0
  119. package/build/index.js.map +1 -0
  120. package/build/index.test.d.ts +1 -0
  121. package/build/index.test.js +364 -0
  122. package/build/index.test.js.map +1 -0
  123. package/build/indexing/queue-manager.d.ts +36 -0
  124. package/build/indexing/queue-manager.js +86 -0
  125. package/build/indexing/queue-manager.js.map +1 -0
  126. package/build/indexing/queue-manager.test.d.ts +1 -0
  127. package/build/indexing/queue-manager.test.js +257 -0
  128. package/build/indexing/queue-manager.test.js.map +1 -0
  129. package/build/indexing/status.d.ts +39 -0
  130. package/build/indexing/status.js +207 -0
  131. package/build/indexing/status.js.map +1 -0
  132. package/build/indexing/status.test.d.ts +1 -0
  133. package/build/indexing/status.test.js +246 -0
  134. package/build/indexing/status.test.js.map +1 -0
  135. package/build/processor/content.d.ts +16 -0
  136. package/build/processor/content.js +286 -0
  137. package/build/processor/content.js.map +1 -0
  138. package/build/processor/content.test.d.ts +1 -0
  139. package/build/processor/content.test.js +369 -0
  140. package/build/processor/content.test.js.map +1 -0
  141. package/build/processor/markdown.d.ts +11 -0
  142. package/build/processor/markdown.js +256 -0
  143. package/build/processor/markdown.js.map +1 -0
  144. package/build/processor/markdown.test.d.ts +1 -0
  145. package/build/processor/markdown.test.js +312 -0
  146. package/build/processor/markdown.test.js.map +1 -0
  147. package/build/processor/metadata-parser.d.ts +37 -0
  148. package/build/processor/metadata-parser.js +245 -0
  149. package/build/processor/metadata-parser.js.map +1 -0
  150. package/build/processor/metadata-parser.test.d.ts +1 -0
  151. package/build/processor/metadata-parser.test.js +357 -0
  152. package/build/processor/metadata-parser.test.js.map +1 -0
  153. package/build/processor/processor.d.ts +8 -0
  154. package/build/processor/processor.js +190 -0
  155. package/build/processor/processor.js.map +1 -0
  156. package/build/processor/processor.test.d.ts +1 -0
  157. package/build/processor/processor.test.js +357 -0
  158. package/build/processor/processor.test.js.map +1 -0
  159. package/build/rag/cache.d.ts +10 -0
  160. package/build/rag/cache.js +10 -0
  161. package/build/rag/cache.js.map +1 -0
  162. package/build/rag/code-generator.d.ts +11 -0
  163. package/build/rag/code-generator.js +30 -0
  164. package/build/rag/code-generator.js.map +1 -0
  165. package/build/rag/context-assembler.d.ts +23 -0
  166. package/build/rag/context-assembler.js +113 -0
  167. package/build/rag/context-assembler.js.map +1 -0
  168. package/build/rag/docs-search.d.ts +55 -0
  169. package/build/rag/docs-search.js +380 -0
  170. package/build/rag/docs-search.js.map +1 -0
  171. package/build/rag/pipeline.d.ts +26 -0
  172. package/build/rag/pipeline.js +91 -0
  173. package/build/rag/pipeline.js.map +1 -0
  174. package/build/rag/query-processor.d.ts +14 -0
  175. package/build/rag/query-processor.js +57 -0
  176. package/build/rag/query-processor.js.map +1 -0
  177. package/build/rag/reranker.d.ts +55 -0
  178. package/build/rag/reranker.js +210 -0
  179. package/build/rag/reranker.js.map +1 -0
  180. package/build/rag/response-generator.d.ts +20 -0
  181. package/build/rag/response-generator.js +101 -0
  182. package/build/rag/response-generator.js.map +1 -0
  183. package/build/rag/retriever.d.ts +19 -0
  184. package/build/rag/retriever.js +111 -0
  185. package/build/rag/retriever.js.map +1 -0
  186. package/build/rag/validator.d.ts +22 -0
  187. package/build/rag/validator.js +128 -0
  188. package/build/rag/validator.js.map +1 -0
  189. package/build/rag/version-manager.d.ts +23 -0
  190. package/build/rag/version-manager.js +98 -0
  191. package/build/rag/version-manager.js.map +1 -0
  192. package/build/setupTests.d.ts +4 -0
  193. package/build/setupTests.js +50 -0
  194. package/build/setupTests.js.map +1 -0
  195. package/build/storage/storage.d.ts +38 -0
  196. package/build/storage/storage.js +700 -0
  197. package/build/storage/storage.js.map +1 -0
  198. package/build/storage/storage.test.d.ts +1 -0
  199. package/build/storage/storage.test.js +338 -0
  200. package/build/storage/storage.test.js.map +1 -0
  201. package/build/types/rag.d.ts +27 -0
  202. package/build/types/rag.js +2 -0
  203. package/build/types/rag.js.map +1 -0
  204. package/build/types.d.ts +120 -0
  205. package/build/types.js +2 -0
  206. package/build/types.js.map +1 -0
  207. package/build/util/content-utils.d.ts +31 -0
  208. package/build/util/content-utils.js +120 -0
  209. package/build/util/content-utils.js.map +1 -0
  210. package/build/util/content.d.ts +1 -0
  211. package/build/util/content.js +16 -0
  212. package/build/util/content.js.map +1 -0
  213. package/build/util/docs.d.ts +1 -0
  214. package/build/util/docs.js +26 -0
  215. package/build/util/docs.js.map +1 -0
  216. package/build/util/docs.test.d.ts +1 -0
  217. package/build/util/docs.test.js +49 -0
  218. package/build/util/docs.test.js.map +1 -0
  219. package/build/util/favicon.d.ts +6 -0
  220. package/build/util/favicon.js +88 -0
  221. package/build/util/favicon.js.map +1 -0
  222. package/build/util/favicon.test.d.ts +1 -0
  223. package/build/util/favicon.test.js +140 -0
  224. package/build/util/favicon.test.js.map +1 -0
  225. package/build/util/logger.d.ts +17 -0
  226. package/build/util/logger.js +72 -0
  227. package/build/util/logger.js.map +1 -0
  228. package/build/util/logger.test.d.ts +1 -0
  229. package/build/util/logger.test.js +46 -0
  230. package/build/util/logger.test.js.map +1 -0
  231. package/build/util/security.d.ts +312 -0
  232. package/build/util/security.js +719 -0
  233. package/build/util/security.js.map +1 -0
  234. package/build/util/security.test.d.ts +1 -0
  235. package/build/util/security.test.js +524 -0
  236. package/build/util/security.test.js.map +1 -0
  237. package/build/util/site-detector.d.ts +22 -0
  238. package/build/util/site-detector.js +42 -0
  239. package/build/util/site-detector.js.map +1 -0
  240. 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
+ }