@gulibs/safe-coder 0.0.25 → 0.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +682 -902
- package/dist/cache/cache-manager.d.ts +71 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +244 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/executor/cli-executor.d.ts +106 -0
- package/dist/executor/cli-executor.d.ts.map +1 -0
- package/dist/executor/cli-executor.js +133 -0
- package/dist/executor/cli-executor.js.map +1 -0
- package/dist/executor/dependency-checker.d.ts +23 -0
- package/dist/executor/dependency-checker.d.ts.map +1 -0
- package/dist/executor/dependency-checker.js +62 -0
- package/dist/executor/dependency-checker.js.map +1 -0
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/processor/content-processor.d.ts +76 -0
- package/dist/processor/content-processor.d.ts.map +1 -0
- package/dist/processor/content-processor.js +182 -0
- package/dist/processor/content-processor.js.map +1 -0
- package/dist/processor/guide-generator.d.ts +68 -0
- package/dist/processor/guide-generator.d.ts.map +1 -0
- package/dist/processor/guide-generator.js +189 -0
- package/dist/processor/guide-generator.js.map +1 -0
- package/dist/server/safe-coder-mcp.d.ts +18 -0
- package/dist/server/safe-coder-mcp.d.ts.map +1 -0
- package/dist/server/safe-coder-mcp.js +164 -0
- package/dist/server/safe-coder-mcp.js.map +1 -0
- package/dist/tools/cache-tools.d.ts +42 -0
- package/dist/tools/cache-tools.d.ts.map +1 -0
- package/dist/tools/cache-tools.js +70 -0
- package/dist/tools/cache-tools.js.map +1 -0
- package/dist/tools/crawl-documentation.d.ts +57 -0
- package/dist/tools/crawl-documentation.d.ts.map +1 -0
- package/dist/tools/crawl-documentation.js +96 -0
- package/dist/tools/crawl-documentation.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/save-skill.d.ts +49 -0
- package/dist/tools/save-skill.d.ts.map +1 -0
- package/dist/tools/save-skill.js +207 -0
- package/dist/tools/save-skill.js.map +1 -0
- package/package.json +18 -22
- package/dist/documentation/browser-doc-browser.d.ts +0 -41
- package/dist/documentation/browser-doc-browser.d.ts.map +0 -1
- package/dist/documentation/browser-doc-browser.js +0 -357
- package/dist/documentation/browser-doc-browser.js.map +0 -1
- package/dist/documentation/cache.d.ts +0 -13
- package/dist/documentation/cache.d.ts.map +0 -1
- package/dist/documentation/cache.js +0 -48
- package/dist/documentation/cache.js.map +0 -1
- package/dist/documentation/checkpoint-manager.d.ts +0 -38
- package/dist/documentation/checkpoint-manager.d.ts.map +0 -1
- package/dist/documentation/checkpoint-manager.js +0 -101
- package/dist/documentation/checkpoint-manager.js.map +0 -1
- package/dist/documentation/doc-crawler.d.ts +0 -185
- package/dist/documentation/doc-crawler.d.ts.map +0 -1
- package/dist/documentation/doc-crawler.js +0 -1162
- package/dist/documentation/doc-crawler.js.map +0 -1
- package/dist/documentation/github-client.d.ts +0 -13
- package/dist/documentation/github-client.d.ts.map +0 -1
- package/dist/documentation/github-client.js +0 -90
- package/dist/documentation/github-client.js.map +0 -1
- package/dist/documentation/http-fetcher.d.ts +0 -8
- package/dist/documentation/http-fetcher.d.ts.map +0 -1
- package/dist/documentation/http-fetcher.js +0 -31
- package/dist/documentation/http-fetcher.js.map +0 -1
- package/dist/documentation/index.d.ts +0 -16
- package/dist/documentation/index.d.ts.map +0 -1
- package/dist/documentation/index.js +0 -159
- package/dist/documentation/index.js.map +0 -1
- package/dist/documentation/llms-txt/detector.d.ts +0 -31
- package/dist/documentation/llms-txt/detector.d.ts.map +0 -1
- package/dist/documentation/llms-txt/detector.js +0 -77
- package/dist/documentation/llms-txt/detector.js.map +0 -1
- package/dist/documentation/llms-txt/downloader.d.ts +0 -30
- package/dist/documentation/llms-txt/downloader.d.ts.map +0 -1
- package/dist/documentation/llms-txt/downloader.js +0 -84
- package/dist/documentation/llms-txt/downloader.js.map +0 -1
- package/dist/documentation/llms-txt/index.d.ts +0 -4
- package/dist/documentation/llms-txt/index.d.ts.map +0 -1
- package/dist/documentation/llms-txt/index.js +0 -4
- package/dist/documentation/llms-txt/index.js.map +0 -1
- package/dist/documentation/llms-txt/parser.d.ts +0 -43
- package/dist/documentation/llms-txt/parser.d.ts.map +0 -1
- package/dist/documentation/llms-txt/parser.js +0 -177
- package/dist/documentation/llms-txt/parser.js.map +0 -1
- package/dist/documentation/normalizer.d.ts +0 -6
- package/dist/documentation/normalizer.d.ts.map +0 -1
- package/dist/documentation/normalizer.js +0 -38
- package/dist/documentation/normalizer.js.map +0 -1
- package/dist/documentation/npm-client.d.ts +0 -19
- package/dist/documentation/npm-client.d.ts.map +0 -1
- package/dist/documentation/npm-client.js +0 -182
- package/dist/documentation/npm-client.js.map +0 -1
- package/dist/documentation/skill-generator.d.ts +0 -108
- package/dist/documentation/skill-generator.d.ts.map +0 -1
- package/dist/documentation/skill-generator.js +0 -642
- package/dist/documentation/skill-generator.js.map +0 -1
- package/dist/documentation/web-doc-browser.d.ts +0 -67
- package/dist/documentation/web-doc-browser.d.ts.map +0 -1
- package/dist/documentation/web-doc-browser.js +0 -555
- package/dist/documentation/web-doc-browser.js.map +0 -1
- package/dist/errors/api-validator.d.ts +0 -9
- package/dist/errors/api-validator.d.ts.map +0 -1
- package/dist/errors/api-validator.js +0 -57
- package/dist/errors/api-validator.js.map +0 -1
- package/dist/errors/contextual-analysis.d.ts +0 -14
- package/dist/errors/contextual-analysis.d.ts.map +0 -1
- package/dist/errors/contextual-analysis.js +0 -173
- package/dist/errors/contextual-analysis.js.map +0 -1
- package/dist/errors/cross-file-analyzer.d.ts +0 -16
- package/dist/errors/cross-file-analyzer.d.ts.map +0 -1
- package/dist/errors/cross-file-analyzer.js +0 -172
- package/dist/errors/cross-file-analyzer.js.map +0 -1
- package/dist/errors/eslint-integration.d.ts +0 -9
- package/dist/errors/eslint-integration.d.ts.map +0 -1
- package/dist/errors/eslint-integration.js +0 -131
- package/dist/errors/eslint-integration.js.map +0 -1
- package/dist/errors/framework-detector.d.ts +0 -10
- package/dist/errors/framework-detector.d.ts.map +0 -1
- package/dist/errors/framework-detector.js +0 -126
- package/dist/errors/framework-detector.js.map +0 -1
- package/dist/errors/index.d.ts +0 -18
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js +0 -134
- package/dist/errors/index.js.map +0 -1
- package/dist/errors/pattern-matcher.d.ts +0 -25
- package/dist/errors/pattern-matcher.d.ts.map +0 -1
- package/dist/errors/pattern-matcher.js +0 -44
- package/dist/errors/pattern-matcher.js.map +0 -1
- package/dist/errors/patterns.d.ts +0 -11
- package/dist/errors/patterns.d.ts.map +0 -1
- package/dist/errors/patterns.js +0 -351
- package/dist/errors/patterns.js.map +0 -1
- package/dist/errors/performance-detector.d.ts +0 -11
- package/dist/errors/performance-detector.d.ts.map +0 -1
- package/dist/errors/performance-detector.js +0 -119
- package/dist/errors/performance-detector.js.map +0 -1
- package/dist/errors/runtime-detector.d.ts +0 -7
- package/dist/errors/runtime-detector.d.ts.map +0 -1
- package/dist/errors/runtime-detector.js +0 -86
- package/dist/errors/runtime-detector.js.map +0 -1
- package/dist/errors/security-detector.d.ts +0 -6
- package/dist/errors/security-detector.d.ts.map +0 -1
- package/dist/errors/security-detector.js +0 -75
- package/dist/errors/security-detector.js.map +0 -1
- package/dist/errors/typescript-integration.d.ts +0 -6
- package/dist/errors/typescript-integration.d.ts.map +0 -1
- package/dist/errors/typescript-integration.js +0 -46
- package/dist/errors/typescript-integration.js.map +0 -1
- package/dist/server/mcp-server.d.ts +0 -14
- package/dist/server/mcp-server.d.ts.map +0 -1
- package/dist/server/mcp-server.js +0 -776
- package/dist/server/mcp-server.js.map +0 -1
- package/dist/types/documentation.d.ts +0 -26
- package/dist/types/documentation.d.ts.map +0 -1
- package/dist/types/documentation.js +0 -2
- package/dist/types/documentation.js.map +0 -1
- package/dist/utils/config.d.ts +0 -21
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js +0 -34
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/http-client.d.ts +0 -17
- package/dist/utils/http-client.d.ts.map +0 -1
- package/dist/utils/http-client.js +0 -62
- package/dist/utils/http-client.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -36
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -128
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/rate-limiter.d.ts +0 -9
- package/dist/utils/rate-limiter.d.ts.map +0 -1
- package/dist/utils/rate-limiter.js +0 -26
- package/dist/utils/rate-limiter.js.map +0 -1
- package/dist/validation/auto-fix.d.ts +0 -15
- package/dist/validation/auto-fix.d.ts.map +0 -1
- package/dist/validation/auto-fix.js +0 -49
- package/dist/validation/auto-fix.js.map +0 -1
- package/dist/validation/index.d.ts +0 -21
- package/dist/validation/index.d.ts.map +0 -1
- package/dist/validation/index.js +0 -45
- package/dist/validation/index.js.map +0 -1
- package/dist/validation/resolution-db.d.ts +0 -15
- package/dist/validation/resolution-db.d.ts.map +0 -1
- package/dist/validation/resolution-db.js +0 -62
- package/dist/validation/resolution-db.js.map +0 -1
|
@@ -1,555 +0,0 @@
|
|
|
1
|
-
import { HttpClient } from '../utils/http-client.js';
|
|
2
|
-
import { logger } from '../utils/logger.js';
|
|
3
|
-
export class WebDocumentationBrowser {
|
|
4
|
-
httpClient;
|
|
5
|
-
DOCUMENTATION_INDICATORS = [
|
|
6
|
-
// URL patterns
|
|
7
|
-
/\/docs?\//i,
|
|
8
|
-
/\/documentation/i,
|
|
9
|
-
/\/guide/i,
|
|
10
|
-
/\/tutorial/i,
|
|
11
|
-
/\/api/i,
|
|
12
|
-
/\/reference/i,
|
|
13
|
-
/\/manual/i,
|
|
14
|
-
/\/help/i,
|
|
15
|
-
/\/about/i,
|
|
16
|
-
/\/getting-started/i,
|
|
17
|
-
// HTML content indicators
|
|
18
|
-
/documentation|docs|guide|tutorial|api reference|getting started/i,
|
|
19
|
-
// Meta tags
|
|
20
|
-
/og:type.*article|documentation/i,
|
|
21
|
-
];
|
|
22
|
-
NON_DOCUMENTATION_INDICATORS = [
|
|
23
|
-
/\.(jpg|jpeg|png|gif|svg|pdf|zip|exe|dmg)$/i,
|
|
24
|
-
/login|signup|register|checkout|cart|payment/i,
|
|
25
|
-
/404|not found|error/i,
|
|
26
|
-
];
|
|
27
|
-
// SPA detection patterns
|
|
28
|
-
SPA_INDICATORS = [
|
|
29
|
-
// React/Vue/Angular indicators
|
|
30
|
-
/<div[^>]*id=["'](?:root|app|__next|gatsby-focus-wrapper|___gatsby)[^"']*["']/i,
|
|
31
|
-
/<div[^>]*id=["'][^"']*root[^"']*["']/i,
|
|
32
|
-
/react|vue|angular|svelte/i,
|
|
33
|
-
// Framework-specific patterns
|
|
34
|
-
/__NEXT_DATA__|gatsby|nuxt|next\.js/i,
|
|
35
|
-
/<script[^>]*src=["'][^"']*(?:react|vue|angular|svelte)[^"']*["']/i,
|
|
36
|
-
// Minimal HTML with script tags (typical SPA structure)
|
|
37
|
-
/<body[^>]*>[\s\S]{0,500}<script[^>]*src=["'][^"']*app[^"']*\.js["']/i,
|
|
38
|
-
// Empty or minimal content with scripts
|
|
39
|
-
/<body[^>]*>[\s\S]{0,1000}<script[^>]*type=["']module["']/i,
|
|
40
|
-
// Common SPA meta tags
|
|
41
|
-
/<meta[^>]*name=["']generator["'][^>]*content=["'][^"']*(?:gatsby|next|nuxt|vuepress)[^"']*["']/i,
|
|
42
|
-
];
|
|
43
|
-
constructor(httpClient) {
|
|
44
|
-
this.httpClient = httpClient || new HttpClient();
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Detect if a website is a Single Page Application (SPA)
|
|
48
|
-
* that requires JavaScript rendering
|
|
49
|
-
*/
|
|
50
|
-
async detectSPA(url, html) {
|
|
51
|
-
const indicators = [];
|
|
52
|
-
let confidence = 'low';
|
|
53
|
-
try {
|
|
54
|
-
// If HTML not provided, fetch a sample
|
|
55
|
-
if (!html) {
|
|
56
|
-
const response = await this.httpClient.get(url, {
|
|
57
|
-
timeout: 5000,
|
|
58
|
-
headers: {
|
|
59
|
-
'User-Agent': 'Safe-Coder-MCP/1.0.0',
|
|
60
|
-
'Accept': 'text/html',
|
|
61
|
-
},
|
|
62
|
-
maxContentLength: 100000, // 100KB for SPA detection
|
|
63
|
-
});
|
|
64
|
-
html = typeof response.data === 'string' ? response.data : String(response.data);
|
|
65
|
-
}
|
|
66
|
-
// Check for SPA indicators
|
|
67
|
-
for (const pattern of this.SPA_INDICATORS) {
|
|
68
|
-
if (pattern.test(html)) {
|
|
69
|
-
const match = html.match(pattern);
|
|
70
|
-
if (match) {
|
|
71
|
-
const indicator = match[0].substring(0, 100);
|
|
72
|
-
indicators.push(indicator);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// Check for minimal content with many script tags (SPA pattern)
|
|
77
|
-
const scriptCount = (html.match(/<script[^>]*>/gi) || []).length;
|
|
78
|
-
const bodyContent = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i)?.[1] || '';
|
|
79
|
-
const bodyTextLength = bodyContent.replace(/<[^>]+>/g, '').trim().length;
|
|
80
|
-
if (scriptCount >= 3 && bodyTextLength < 500) {
|
|
81
|
-
indicators.push(`Minimal content (${bodyTextLength} chars) with ${scriptCount} script tags`);
|
|
82
|
-
confidence = 'high';
|
|
83
|
-
}
|
|
84
|
-
// Check for React/Vue/Angular specific patterns
|
|
85
|
-
if (/react|vue|angular|svelte/i.test(html)) {
|
|
86
|
-
indicators.push('Framework detected in HTML');
|
|
87
|
-
confidence = confidence === 'low' ? 'medium' : 'high';
|
|
88
|
-
}
|
|
89
|
-
// Check for Next.js/Gatsby specific patterns
|
|
90
|
-
if (/__NEXT_DATA__|gatsby|next\.js/i.test(html)) {
|
|
91
|
-
indicators.push('SSR/SSG framework detected');
|
|
92
|
-
confidence = 'high';
|
|
93
|
-
}
|
|
94
|
-
// Determine confidence level
|
|
95
|
-
if (indicators.length >= 3) {
|
|
96
|
-
confidence = 'high';
|
|
97
|
-
}
|
|
98
|
-
else if (indicators.length >= 2) {
|
|
99
|
-
confidence = 'medium';
|
|
100
|
-
}
|
|
101
|
-
const suggestion = confidence !== 'low'
|
|
102
|
-
? 'This appears to be a Single Page Application (SPA) that requires JavaScript rendering. HTTP-only crawling may not capture all content. Consider using browser automation tools (like Cursor/Claude browser tools) to get fully rendered HTML before processing.'
|
|
103
|
-
: undefined;
|
|
104
|
-
return {
|
|
105
|
-
isSPA: confidence !== 'low',
|
|
106
|
-
confidence,
|
|
107
|
-
indicators: indicators.slice(0, 5), // Limit to 5 indicators
|
|
108
|
-
suggestion,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
logger.debug('SPA detection failed', {
|
|
113
|
-
url,
|
|
114
|
-
error: error instanceof Error ? error.message : String(error),
|
|
115
|
-
});
|
|
116
|
-
return {
|
|
117
|
-
isSPA: false,
|
|
118
|
-
confidence: 'low',
|
|
119
|
-
indicators: [],
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Check if a URL is likely a documentation page
|
|
125
|
-
*/
|
|
126
|
-
async isDocumentationPage(url) {
|
|
127
|
-
try {
|
|
128
|
-
// Quick URL check first
|
|
129
|
-
if (this.NON_DOCUMENTATION_INDICATORS.some(pattern => pattern.test(url))) {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
// Check URL patterns
|
|
133
|
-
const hasDocPattern = this.DOCUMENTATION_INDICATORS.some(pattern => pattern.test(url));
|
|
134
|
-
if (hasDocPattern) {
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
// Fetch a small sample to check content
|
|
138
|
-
const response = await this.httpClient.get(url, {
|
|
139
|
-
timeout: 5000,
|
|
140
|
-
headers: {
|
|
141
|
-
'User-Agent': 'Safe-Coder-MCP/1.0.0',
|
|
142
|
-
'Accept': 'text/html',
|
|
143
|
-
},
|
|
144
|
-
maxContentLength: 50000, // Limit to 50KB for quick check
|
|
145
|
-
});
|
|
146
|
-
const html = typeof response.data === 'string' ? response.data : String(response.data);
|
|
147
|
-
// Check for documentation indicators in HTML
|
|
148
|
-
const hasDocContent = this.DOCUMENTATION_INDICATORS.some(pattern => pattern.test(html));
|
|
149
|
-
const hasNonDocContent = this.NON_DOCUMENTATION_INDICATORS.some(pattern => pattern.test(html));
|
|
150
|
-
// Check for common documentation HTML structures
|
|
151
|
-
const hasDocStructure = /<nav[^>]*>.*?(?:table of contents|toc|sidebar|menu)/is.test(html) ||
|
|
152
|
-
/<aside[^>]*>.*?(?:navigation|toc|sidebar)/is.test(html) ||
|
|
153
|
-
/class="[^"]*(?:doc|documentation|guide|tutorial|api)[^"]*"/i.test(html);
|
|
154
|
-
return (hasDocContent || hasDocStructure) && !hasNonDocContent;
|
|
155
|
-
}
|
|
156
|
-
catch (error) {
|
|
157
|
-
// If we can't fetch, assume it might be documentation
|
|
158
|
-
// Let the full fetch handle the error
|
|
159
|
-
return true;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Browse a documentation page and extract content
|
|
164
|
-
* Uses HTTP client (axios) exclusively - no browser automation
|
|
165
|
-
*/
|
|
166
|
-
async browsePage(url, query) {
|
|
167
|
-
try {
|
|
168
|
-
const fullUrl = url.startsWith('http') ? url : `https://${url}`;
|
|
169
|
-
const baseUrl = new URL(fullUrl).origin;
|
|
170
|
-
// Log HTTP request (not browser)
|
|
171
|
-
logger.debug('Making HTTP GET request (no browser)', {
|
|
172
|
-
url: fullUrl,
|
|
173
|
-
method: 'HTTP GET',
|
|
174
|
-
client: 'axios/HttpClient',
|
|
175
|
-
});
|
|
176
|
-
const response = await this.httpClient.get(fullUrl, {
|
|
177
|
-
timeout: 15000,
|
|
178
|
-
headers: {
|
|
179
|
-
'User-Agent': 'Safe-Coder-MCP/1.0.0',
|
|
180
|
-
'Accept': 'text/html',
|
|
181
|
-
},
|
|
182
|
-
});
|
|
183
|
-
logger.debug('HTTP response received, parsing HTML', {
|
|
184
|
-
url: fullUrl,
|
|
185
|
-
statusCode: response.status,
|
|
186
|
-
contentType: response.headers['content-type'],
|
|
187
|
-
});
|
|
188
|
-
const html = typeof response.data === 'string' ? response.data : String(response.data);
|
|
189
|
-
// Check if it's documentation
|
|
190
|
-
const isDoc = await this.isDocumentationPage(fullUrl);
|
|
191
|
-
if (!isDoc) {
|
|
192
|
-
throw new Error('The provided URL does not appear to be a documentation page. Please provide a documentation URL (e.g., /docs/, /documentation/, /guide/, /api/, etc.)');
|
|
193
|
-
}
|
|
194
|
-
// Detect SPA and warn if detected
|
|
195
|
-
const spaDetection = await this.detectSPA(fullUrl, html);
|
|
196
|
-
if (spaDetection.isSPA && spaDetection.confidence !== 'low') {
|
|
197
|
-
logger.warn('SPA detected - content may be incomplete', {
|
|
198
|
-
url: fullUrl,
|
|
199
|
-
confidence: spaDetection.confidence,
|
|
200
|
-
indicators: spaDetection.indicators,
|
|
201
|
-
suggestion: spaDetection.suggestion,
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
// Parse HTML
|
|
205
|
-
const parsed = this.parseHTML(html, baseUrl, fullUrl);
|
|
206
|
-
// Filter content by query if provided
|
|
207
|
-
let filteredContent = parsed.content;
|
|
208
|
-
let filteredSections = parsed.sections;
|
|
209
|
-
if (query) {
|
|
210
|
-
const queryLower = query.toLowerCase();
|
|
211
|
-
filteredSections = parsed.sections.filter(section => section.title.toLowerCase().includes(queryLower) ||
|
|
212
|
-
section.content.toLowerCase().includes(queryLower));
|
|
213
|
-
if (filteredSections.length > 0) {
|
|
214
|
-
filteredContent = filteredSections.map(s => `## ${s.title}\n\n${s.content}`).join('\n\n');
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
// If no sections match, search in full content
|
|
218
|
-
if (parsed.searchableContent.toLowerCase().includes(queryLower)) {
|
|
219
|
-
// Extract relevant paragraphs
|
|
220
|
-
const paragraphs = parsed.content.split('\n\n');
|
|
221
|
-
const relevant = paragraphs.filter(p => p.toLowerCase().includes(queryLower));
|
|
222
|
-
filteredContent = relevant.join('\n\n');
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
filteredContent = `No content found matching "${query}". Showing full page content:\n\n${parsed.content}`;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return {
|
|
230
|
-
url: fullUrl,
|
|
231
|
-
title: parsed.title,
|
|
232
|
-
content: filteredContent,
|
|
233
|
-
isDocumentation: true,
|
|
234
|
-
navigationLinks: parsed.navigationLinks,
|
|
235
|
-
sections: filteredSections.length > 0 ? filteredSections : parsed.sections,
|
|
236
|
-
searchableContent: parsed.searchableContent,
|
|
237
|
-
headings: parsed.headings,
|
|
238
|
-
codeSamples: parsed.codeSamples,
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
catch (error) {
|
|
242
|
-
if (error instanceof Error && error.message.includes('does not appear to be a documentation')) {
|
|
243
|
-
throw error;
|
|
244
|
-
}
|
|
245
|
-
throw new Error(`Failed to browse documentation page: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Navigate to a specific page in the documentation
|
|
250
|
-
*/
|
|
251
|
-
async navigateTo(url, baseUrl) {
|
|
252
|
-
const fullUrl = url.startsWith('http')
|
|
253
|
-
? url
|
|
254
|
-
: baseUrl
|
|
255
|
-
? new URL(url, baseUrl).href
|
|
256
|
-
: `https://${url}`;
|
|
257
|
-
return this.browsePage(fullUrl);
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Parse HTML and extract documentation content
|
|
261
|
-
*/
|
|
262
|
-
parseHTML(html, baseUrl, currentUrl) {
|
|
263
|
-
// Extract title
|
|
264
|
-
const titleMatch = html.match(/<title[^>]*>([^<]+)<\/title>/i);
|
|
265
|
-
const title = titleMatch ? titleMatch[1].trim() : 'Documentation';
|
|
266
|
-
// Remove scripts and styles
|
|
267
|
-
let cleanHtml = html
|
|
268
|
-
.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
|
|
269
|
-
.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
|
|
270
|
-
.replace(/<!--[\s\S]*?-->/g, '');
|
|
271
|
-
// Extract navigation links (primary source - from nav/aside elements)
|
|
272
|
-
const navigationLinks = [];
|
|
273
|
-
const navigationLinksSet = new Set(); // For deduplication
|
|
274
|
-
// Find nav, aside, or sidebar elements
|
|
275
|
-
const navMatches = cleanHtml.match(/<(?:nav|aside)[^>]*>([\s\S]*?)<\/(?:nav|aside)>/gi);
|
|
276
|
-
logger.debug('Extracting navigation links', {
|
|
277
|
-
navElementsFound: navMatches ? navMatches.length : 0,
|
|
278
|
-
url: currentUrl,
|
|
279
|
-
});
|
|
280
|
-
if (navMatches) {
|
|
281
|
-
navMatches.forEach(navHtml => {
|
|
282
|
-
const linkMatches = navHtml.matchAll(/<a[^>]+href=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi);
|
|
283
|
-
for (const match of linkMatches) {
|
|
284
|
-
const href = match[1];
|
|
285
|
-
let text = match[2].replace(/<[^>]+>/g, '').trim();
|
|
286
|
-
if (text && href && !href.startsWith('#')) {
|
|
287
|
-
try {
|
|
288
|
-
const fullUrl = href.startsWith('http')
|
|
289
|
-
? href
|
|
290
|
-
: new URL(href, baseUrl).href;
|
|
291
|
-
const normalizedUrl = fullUrl.split('#')[0]; // Remove fragments
|
|
292
|
-
const isInternal = new URL(fullUrl).origin === new URL(currentUrl).origin;
|
|
293
|
-
// Deduplicate by normalized URL
|
|
294
|
-
if (!navigationLinksSet.has(normalizedUrl)) {
|
|
295
|
-
navigationLinks.push({ text, url: normalizedUrl, isInternal });
|
|
296
|
-
navigationLinksSet.add(normalizedUrl);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
catch {
|
|
300
|
-
// Invalid URL, skip
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
logger.debug('Navigation links extraction completed', {
|
|
307
|
-
navLinksFound: navigationLinks.length,
|
|
308
|
-
internalNavLinks: navigationLinks.filter(l => l.isInternal).length,
|
|
309
|
-
externalNavLinks: navigationLinks.filter(l => !l.isInternal).length,
|
|
310
|
-
});
|
|
311
|
-
// Extract links from main content area (secondary source)
|
|
312
|
-
const contentLinks = [];
|
|
313
|
-
// Extract main content area for link discovery
|
|
314
|
-
let contentArea = '';
|
|
315
|
-
const mainMatches = cleanHtml.match(/<main[^>]*>([\s\S]*?)<\/main>/i) ||
|
|
316
|
-
cleanHtml.match(/<article[^>]*>([\s\S]*?)<\/article>/i) ||
|
|
317
|
-
cleanHtml.match(/<div[^>]*class="[^"]*(?:content|main|documentation|doc)[^"]*"[^>]*>([\s\S]*?)<\/div>/i);
|
|
318
|
-
if (mainMatches) {
|
|
319
|
-
contentArea = mainMatches[1];
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
// Fallback: use body content
|
|
323
|
-
const bodyMatch = cleanHtml.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
|
|
324
|
-
contentArea = bodyMatch ? bodyMatch[1] : cleanHtml;
|
|
325
|
-
}
|
|
326
|
-
// Extract links from content area
|
|
327
|
-
logger.debug('Extracting links from content area', {
|
|
328
|
-
contentAreaLength: contentArea.length,
|
|
329
|
-
url: currentUrl,
|
|
330
|
-
});
|
|
331
|
-
const contentLinkMatches = contentArea.matchAll(/<a[^>]+href=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi);
|
|
332
|
-
for (const match of contentLinkMatches) {
|
|
333
|
-
const href = match[1];
|
|
334
|
-
let text = match[2].replace(/<[^>]+>/g, '').trim();
|
|
335
|
-
if (text && href && !href.startsWith('#')) {
|
|
336
|
-
try {
|
|
337
|
-
const fullUrl = href.startsWith('http')
|
|
338
|
-
? href
|
|
339
|
-
: new URL(href, baseUrl).href;
|
|
340
|
-
const normalizedUrl = fullUrl.split('#')[0]; // Remove fragments
|
|
341
|
-
const isInternal = new URL(fullUrl).origin === new URL(currentUrl).origin;
|
|
342
|
-
// Only add if not already in navigation links (deduplication)
|
|
343
|
-
if (!navigationLinksSet.has(normalizedUrl)) {
|
|
344
|
-
contentLinks.push({ text, url: normalizedUrl, isInternal });
|
|
345
|
-
navigationLinksSet.add(normalizedUrl);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
catch {
|
|
349
|
-
// Invalid URL, skip
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
logger.debug('Content links extraction completed', {
|
|
354
|
-
contentLinksFound: contentLinks.length,
|
|
355
|
-
internalContentLinks: contentLinks.filter(l => l.isInternal).length,
|
|
356
|
-
externalContentLinks: contentLinks.filter(l => !l.isInternal).length,
|
|
357
|
-
});
|
|
358
|
-
// Fallback: Extract links from entire body if we found very few links
|
|
359
|
-
// This handles cases where React/SPA sites don't have standard nav/aside structures
|
|
360
|
-
const bodyLinks = [];
|
|
361
|
-
if (navigationLinks.length + contentLinks.length < 5) {
|
|
362
|
-
logger.debug('Few links found from nav/content, extracting from entire body as fallback', {
|
|
363
|
-
navLinks: navigationLinks.length,
|
|
364
|
-
contentLinks: contentLinks.length,
|
|
365
|
-
});
|
|
366
|
-
// Extract body content
|
|
367
|
-
const bodyMatch = cleanHtml.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
|
|
368
|
-
const bodyContent = bodyMatch ? bodyMatch[1] : cleanHtml;
|
|
369
|
-
// Extract all links from body
|
|
370
|
-
const bodyLinkMatches = bodyContent.matchAll(/<a[^>]+href=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi);
|
|
371
|
-
for (const match of bodyLinkMatches) {
|
|
372
|
-
const href = match[1];
|
|
373
|
-
let text = match[2].replace(/<[^>]+>/g, '').trim();
|
|
374
|
-
// Skip empty links or anchor-only links
|
|
375
|
-
if (!text || !href || href.startsWith('#')) {
|
|
376
|
-
continue;
|
|
377
|
-
}
|
|
378
|
-
try {
|
|
379
|
-
const fullUrl = href.startsWith('http')
|
|
380
|
-
? href
|
|
381
|
-
: new URL(href, baseUrl).href;
|
|
382
|
-
const normalizedUrl = fullUrl.split('#')[0]; // Remove fragments
|
|
383
|
-
const isInternal = new URL(fullUrl).origin === new URL(currentUrl).origin;
|
|
384
|
-
// Only add if not already in navigation or content links (deduplication)
|
|
385
|
-
if (!navigationLinksSet.has(normalizedUrl)) {
|
|
386
|
-
bodyLinks.push({ text, url: normalizedUrl, isInternal });
|
|
387
|
-
navigationLinksSet.add(normalizedUrl);
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
catch {
|
|
391
|
-
// Invalid URL, skip
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
logger.debug('Body fallback extraction completed', {
|
|
395
|
-
bodyLinksFound: bodyLinks.length,
|
|
396
|
-
totalLinksNow: navigationLinks.length + contentLinks.length + bodyLinks.length,
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
// Combine navigation links (priority) with content links and body links
|
|
400
|
-
const allLinks = [...navigationLinks, ...contentLinks, ...bodyLinks];
|
|
401
|
-
// Extract main content (reuse contentArea if already extracted, otherwise extract again)
|
|
402
|
-
let mainContent = contentArea || '';
|
|
403
|
-
if (!mainContent) {
|
|
404
|
-
const mainMatches = cleanHtml.match(/<main[^>]*>([\s\S]*?)<\/main>/i) ||
|
|
405
|
-
cleanHtml.match(/<article[^>]*>([\s\S]*?)<\/article>/i) ||
|
|
406
|
-
cleanHtml.match(/<div[^>]*class="[^"]*(?:content|main|documentation|doc)[^"]*"[^>]*>([\s\S]*?)<\/div>/i);
|
|
407
|
-
if (mainMatches) {
|
|
408
|
-
mainContent = mainMatches[1];
|
|
409
|
-
}
|
|
410
|
-
else {
|
|
411
|
-
// Fallback: use body content
|
|
412
|
-
const bodyMatch = cleanHtml.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
|
|
413
|
-
mainContent = bodyMatch ? bodyMatch[1] : cleanHtml;
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
// Extract headings with structure
|
|
417
|
-
const headings = [];
|
|
418
|
-
const headingMatches = mainContent.matchAll(/<h([1-6])[^>]*(?:id=["']([^"']+)["'])?[^>]*>([^<]+)<\/h[1-6]>/gi);
|
|
419
|
-
for (const match of headingMatches) {
|
|
420
|
-
const level = `h${match[1]}`;
|
|
421
|
-
const text = match[3].replace(/<[^>]+>/g, '').trim();
|
|
422
|
-
const id = match[2];
|
|
423
|
-
if (text) {
|
|
424
|
-
headings.push({ level, text, id });
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
// Extract code samples with language detection
|
|
428
|
-
const codeSamples = [];
|
|
429
|
-
// Match <pre><code> blocks (with optional language class)
|
|
430
|
-
const codeBlockMatches = mainContent.matchAll(/<pre[^>]*><code[^>]*(?:class=["'][^"']*language-([^"'\s]+)[^"']*["']|data-language=["']([^"']+)["'])?[^>]*>([\s\S]*?)<\/code><\/pre>/gi);
|
|
431
|
-
for (const match of codeBlockMatches) {
|
|
432
|
-
const language = (match[1] || match[2] || 'unknown').toLowerCase();
|
|
433
|
-
let code = match[3].replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, "'");
|
|
434
|
-
code = code.replace(/<[^>]+>/g, '').trim();
|
|
435
|
-
if (code.length > 10) {
|
|
436
|
-
// Try to detect language from code content if not specified
|
|
437
|
-
const detectedLang = this.detectLanguage(code, language);
|
|
438
|
-
codeSamples.push({ code, language: detectedLang });
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
// Also extract inline code blocks that might be significant
|
|
442
|
-
const inlineCodeMatches = mainContent.matchAll(/<code[^>]*(?:class=["'][^"']*language-([^"'\s]+)[^"']*["'])?[^>]*>([\s\S]*?)<\/code>/gi);
|
|
443
|
-
for (const match of inlineCodeMatches) {
|
|
444
|
-
const language = (match[1] || 'unknown').toLowerCase();
|
|
445
|
-
let code = match[2].replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, "'");
|
|
446
|
-
code = code.replace(/<[^>]+>/g, '').trim();
|
|
447
|
-
// Only include if it's substantial (more than just a variable name)
|
|
448
|
-
if (code.length > 20 && !codeSamples.some(s => s.code === code)) {
|
|
449
|
-
const detectedLang = this.detectLanguage(code, language);
|
|
450
|
-
codeSamples.push({ code, language: detectedLang });
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
// Convert HTML to markdown-like text
|
|
454
|
-
let textContent = mainContent
|
|
455
|
-
// Headers
|
|
456
|
-
.replace(/<h([1-6])[^>]*>([^<]+)<\/h[1-6]>/gi, (_, level, text) => {
|
|
457
|
-
const prefix = '#'.repeat(parseInt(level));
|
|
458
|
-
return `\n${prefix} ${text.trim()}\n`;
|
|
459
|
-
})
|
|
460
|
-
// Links
|
|
461
|
-
.replace(/<a[^>]+href=["']([^"']+)["'][^>]*>([^<]+)<\/a>/gi, '[$2]($1)')
|
|
462
|
-
// Code blocks
|
|
463
|
-
.replace(/<pre[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/gi, '```\n$1\n```')
|
|
464
|
-
.replace(/<code[^>]*>([^<]+)<\/code>/gi, '`$1`')
|
|
465
|
-
// Lists
|
|
466
|
-
.replace(/<li[^>]*>([^<]+)<\/li>/gi, '- $1')
|
|
467
|
-
// Paragraphs
|
|
468
|
-
.replace(/<p[^>]*>([^<]+)<\/p>/gi, '$1\n')
|
|
469
|
-
// Remove remaining HTML tags
|
|
470
|
-
.replace(/<[^>]+>/g, ' ')
|
|
471
|
-
// Clean up whitespace
|
|
472
|
-
.replace(/\n{3,}/g, '\n\n')
|
|
473
|
-
.replace(/[ \t]+/g, ' ')
|
|
474
|
-
.trim();
|
|
475
|
-
// Extract sections (based on headers)
|
|
476
|
-
const sections = [];
|
|
477
|
-
const sectionMatches = textContent.matchAll(/(?:^|\n)(#{1,6})\s+(.+?)(?=\n#{1,6}|\n*$)/gs);
|
|
478
|
-
let lastIndex = 0;
|
|
479
|
-
for (const match of sectionMatches) {
|
|
480
|
-
const headerLevel = match[1].length;
|
|
481
|
-
const headerText = match[2].trim();
|
|
482
|
-
const startIndex = match.index || 0;
|
|
483
|
-
// Get content until next header of same or higher level
|
|
484
|
-
const nextHeaderPattern = new RegExp(`\n#{1,${headerLevel}}\\s+`, 'g');
|
|
485
|
-
nextHeaderPattern.lastIndex = startIndex + match[0].length;
|
|
486
|
-
const nextMatch = nextHeaderPattern.exec(textContent);
|
|
487
|
-
const endIndex = nextMatch ? nextMatch.index : textContent.length;
|
|
488
|
-
const sectionContent = textContent.substring(startIndex + match[0].length, endIndex).trim();
|
|
489
|
-
if (sectionContent) {
|
|
490
|
-
sections.push({
|
|
491
|
-
title: headerText,
|
|
492
|
-
content: sectionContent,
|
|
493
|
-
anchor: `#${headerText.toLowerCase().replace(/\s+/g, '-')}`,
|
|
494
|
-
});
|
|
495
|
-
}
|
|
496
|
-
lastIndex = endIndex;
|
|
497
|
-
}
|
|
498
|
-
// If no sections found, create one from all content
|
|
499
|
-
if (sections.length === 0 && textContent) {
|
|
500
|
-
sections.push({
|
|
501
|
-
title: title,
|
|
502
|
-
content: textContent,
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
const finalLinks = allLinks.slice(0, 100); // Limit to 100 links
|
|
506
|
-
logger.debug('Link extraction summary', {
|
|
507
|
-
url: currentUrl,
|
|
508
|
-
navLinks: navigationLinks.length,
|
|
509
|
-
contentLinks: contentLinks.length,
|
|
510
|
-
bodyLinks: bodyLinks.length,
|
|
511
|
-
totalLinks: allLinks.length,
|
|
512
|
-
finalLinksCount: finalLinks.length,
|
|
513
|
-
sampleLinks: finalLinks.slice(0, 5).map(l => ({ text: l.text.substring(0, 30), url: l.url, isInternal: l.isInternal })),
|
|
514
|
-
});
|
|
515
|
-
return {
|
|
516
|
-
title,
|
|
517
|
-
content: textContent || 'No content extracted',
|
|
518
|
-
navigationLinks: finalLinks,
|
|
519
|
-
sections,
|
|
520
|
-
searchableContent: textContent.toLowerCase(),
|
|
521
|
-
headings,
|
|
522
|
-
codeSamples,
|
|
523
|
-
};
|
|
524
|
-
}
|
|
525
|
-
/**
|
|
526
|
-
* Detect programming language from code content
|
|
527
|
-
*/
|
|
528
|
-
detectLanguage(code, fallback) {
|
|
529
|
-
if (fallback && fallback !== 'unknown') {
|
|
530
|
-
return fallback;
|
|
531
|
-
}
|
|
532
|
-
// Simple heuristics for language detection
|
|
533
|
-
const patterns = [
|
|
534
|
-
{ pattern: /^(import|export|from|const|let|var|function|class|interface|type)\s/, language: 'typescript' },
|
|
535
|
-
{ pattern: /^(import|export|from|const|let|var|function|class)\s/, language: 'javascript' },
|
|
536
|
-
{ pattern: /^(def|class|import|from|if __name__)/, language: 'python' },
|
|
537
|
-
{ pattern: /^(package|import|public class|private|protected)/, language: 'java' },
|
|
538
|
-
{ pattern: /^(#include|using namespace|int main|std::)/, language: 'cpp' },
|
|
539
|
-
{ pattern: /^(fn |let |struct |impl |use |pub )/, language: 'rust' },
|
|
540
|
-
{ pattern: /^(func |package |import |var |const )/, language: 'go' },
|
|
541
|
-
{ pattern: /^(<?php|<\?=)/, language: 'php' },
|
|
542
|
-
{ pattern: /^(SELECT|INSERT|UPDATE|DELETE|CREATE|ALTER)\s/i, language: 'sql' },
|
|
543
|
-
{ pattern: /^(<html|<!DOCTYPE|<!doctype)/i, language: 'html' },
|
|
544
|
-
{ pattern: /^(\.|#|@|body|div|margin|padding|color:)/, language: 'css' },
|
|
545
|
-
{ pattern: /^(json|yaml|xml)/i, language: 'json' },
|
|
546
|
-
];
|
|
547
|
-
for (const { pattern, language } of patterns) {
|
|
548
|
-
if (pattern.test(code)) {
|
|
549
|
-
return language;
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
return 'text';
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
//# sourceMappingURL=web-doc-browser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"web-doc-browser.js","sourceRoot":"","sources":["../../src/documentation/web-doc-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAoC5C,MAAM,OAAO,uBAAuB;IAC1B,UAAU,CAAa;IACd,wBAAwB,GAAG;QAC1C,eAAe;QACf,YAAY;QACZ,kBAAkB;QAClB,UAAU;QACV,aAAa;QACb,QAAQ;QACR,cAAc;QACd,WAAW;QACX,SAAS;QACT,UAAU;QACV,oBAAoB;QACpB,0BAA0B;QAC1B,kEAAkE;QAClE,YAAY;QACZ,iCAAiC;KAClC,CAAC;IAEe,4BAA4B,GAAG;QAC9C,4CAA4C;QAC5C,8CAA8C;QAC9C,sBAAsB;KACvB,CAAC;IAEF,yBAAyB;IACR,cAAc,GAAG;QAChC,+BAA+B;QAC/B,+EAA+E;QAC/E,uCAAuC;QACvC,2BAA2B;QAC3B,8BAA8B;QAC9B,qCAAqC;QACrC,mEAAmE;QACnE,wDAAwD;QACxD,sEAAsE;QACtE,wCAAwC;QACxC,2DAA2D;QAC3D,uBAAuB;QACvB,iGAAiG;KAClG,CAAC;IAEF,YAAY,UAAuB;QACjC,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,UAAU,EAAE,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,IAAa;QACxC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,UAAU,GAA8B,KAAK,CAAC;QAElD,IAAI,CAAC;YACH,uCAAuC;YACvC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;oBAC9C,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP,YAAY,EAAE,sBAAsB;wBACpC,QAAQ,EAAE,WAAW;qBACtB;oBACD,gBAAgB,EAAE,MAAM,EAAE,0BAA0B;iBACrD,CAAC,CAAC;gBACH,IAAI,GAAG,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnF,CAAC;YAED,2BAA2B;YAC3B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAClC,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;wBAC7C,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,gEAAgE;YAChE,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACjE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5E,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;YAEzE,IAAI,WAAW,IAAI,CAAC,IAAI,cAAc,GAAG,GAAG,EAAE,CAAC;gBAC7C,UAAU,CAAC,IAAI,CAAC,oBAAoB,cAAc,gBAAgB,WAAW,cAAc,CAAC,CAAC;gBAC7F,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;YAED,gDAAgD;YAChD,IAAI,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,UAAU,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAC9C,UAAU,GAAG,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YACxD,CAAC;YAED,6CAA6C;YAC7C,IAAI,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,UAAU,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAC9C,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;YAED,6BAA6B;YAC7B,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC3B,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;iBAAM,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAClC,UAAU,GAAG,QAAQ,CAAC;YACxB,CAAC;YAED,MAAM,UAAU,GAAG,UAAU,KAAK,KAAK;gBACrC,CAAC,CAAC,iQAAiQ;gBACnQ,CAAC,CAAC,SAAS,CAAC;YAEd,OAAO;gBACL,KAAK,EAAE,UAAU,KAAK,KAAK;gBAC3B,UAAU;gBACV,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,wBAAwB;gBAC5D,UAAU;aACX,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;gBACnC,GAAG;gBACH,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,KAAK;gBACjB,UAAU,EAAE,EAAE;aACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,GAAW;QACnC,IAAI,CAAC;YACH,wBAAwB;YACxB,IAAI,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,qBAAqB;YACrB,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACvF,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,wCAAwC;YACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC9C,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP,YAAY,EAAE,sBAAsB;oBACpC,QAAQ,EAAE,WAAW;iBACtB;gBACD,gBAAgB,EAAE,KAAK,EAAE,gCAAgC;aAC1D,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEvF,6CAA6C;YAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACxF,MAAM,gBAAgB,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAE/F,iDAAiD;YACjD,MAAM,eAAe,GACnB,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC;gBAClE,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxD,6DAA6D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE3E,OAAO,CAAC,aAAa,IAAI,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,sCAAsC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,GAAW,EACX,KAAc;QAEd,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;YAChE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YAExC,iCAAiC;YACjC,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE;gBACnD,GAAG,EAAE,OAAO;gBACZ,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,kBAAkB;aAC3B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE;gBAClD,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE;oBACP,YAAY,EAAE,sBAAsB;oBACpC,QAAQ,EAAE,WAAW;iBACtB;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE;gBACnD,GAAG,EAAE,OAAO;gBACZ,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC;aAC9C,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEvF,8BAA8B;YAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,uJAAuJ,CAAC,CAAC;YAC3K,CAAC;YAED,kCAAkC;YAClC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzD,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE;oBACtD,GAAG,EAAE,OAAO;oBACZ,UAAU,EAAE,YAAY,CAAC,UAAU;oBACnC,UAAU,EAAE,YAAY,CAAC,UAAU;oBACnC,UAAU,EAAE,YAAY,CAAC,UAAU;iBACpC,CAAC,CAAC;YACL,CAAC;YAED,aAAa;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEtD,sCAAsC;YACtC,IAAI,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC;YACrC,IAAI,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;YAEvC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBACvC,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAClD,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAChD,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CACnD,CAAC;gBAEF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,eAAe,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACzC,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,CAChC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,+CAA+C;oBAC/C,IAAI,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wBAChE,8BAA8B;wBAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBAChD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CACrC,CAAC;wBACF,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC1C,CAAC;yBAAM,CAAC;wBACN,eAAe,GAAG,8BAA8B,KAAK,oCAAoC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC5G,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,OAAO,EAAE,eAAe;gBACxB,eAAe,EAAE,IAAI;gBACrB,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,QAAQ,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ;gBAC1E,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;gBAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,uCAAuC,CAAC,EAAE,CAAC;gBAC9F,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACtH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,OAAgB;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YACpC,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,OAAO;gBACP,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI;gBAC5B,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;QAEvB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,IAAY,EAAE,OAAe,EAAE,UAAkB;QASjE,gBAAgB;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;QAElE,4BAA4B;QAC5B,IAAI,SAAS,GAAG,IAAI;aACjB,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC;aAChD,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC;aAC9C,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAEnC,sEAAsE;QACtE,MAAM,eAAe,GAA8D,EAAE,CAAC;QACtF,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC,CAAC,oBAAoB;QAElE,uCAAuC;QACvC,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACxF,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;YAC1C,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpD,GAAG,EAAE,UAAU;SAChB,CAAC,CAAC;QAEH,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC3B,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;gBAC5F,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;oBAChC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBACnD,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC1C,IAAI,CAAC;4BACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gCACrC,CAAC,CAAC,IAAI;gCACN,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;4BAChC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;4BAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;4BAE1E,gCAAgC;4BAChC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gCAC3C,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;gCAC/D,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;4BACxC,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,oBAAoB;wBACtB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;YACpD,aAAa,EAAE,eAAe,CAAC,MAAM;YACrC,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;YAClE,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;SACpE,CAAC,CAAC;QAEH,0DAA0D;QAC1D,MAAM,YAAY,GAA8D,EAAE,CAAC;QAEnF,+CAA+C;QAC/C,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC;YACnE,SAAS,CAAC,KAAK,CAAC,sCAAsC,CAAC;YACvD,SAAS,CAAC,KAAK,CAAC,uFAAuF,CAAC,CAAC;QAE3G,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,6BAA6B;YAC7B,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpE,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrD,CAAC;QAED,kCAAkC;QAClC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;YACjD,iBAAiB,EAAE,WAAW,CAAC,MAAM;YACrC,GAAG,EAAE,UAAU;SAChB,CAAC,CAAC;QAEH,MAAM,kBAAkB,GAAG,WAAW,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;QACvG,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;wBACrC,CAAC,CAAC,IAAI;wBACN,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;oBAChC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;oBAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;oBAE1E,8DAA8D;oBAC9D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;wBAC3C,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;wBAC5D,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,oBAAoB;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;YACjD,iBAAiB,EAAE,YAAY,CAAC,MAAM;YACtC,oBAAoB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;YACnE,oBAAoB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;SACrE,CAAC,CAAC;QAEH,sEAAsE;QACtE,oFAAoF;QACpF,MAAM,SAAS,GAA8D,EAAE,CAAC;QAChF,IAAI,eAAe,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,2EAA2E,EAAE;gBACxF,QAAQ,EAAE,eAAe,CAAC,MAAM;gBAChC,YAAY,EAAE,YAAY,CAAC,MAAM;aAClC,CAAC,CAAC;YAEH,uBAAuB;YACvB,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpE,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAEzD,8BAA8B;YAC9B,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;YACpG,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEnD,wCAAwC;gBACxC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3C,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;wBACrC,CAAC,CAAC,IAAI;wBACN,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;oBAChC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;oBAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;oBAE1E,yEAAyE;oBACzE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;wBAC3C,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;wBACzD,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,oBAAoB;gBACtB,CAAC;YACH,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;gBACjD,cAAc,EAAE,SAAS,CAAC,MAAM;gBAChC,aAAa,EAAE,eAAe,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;aAC/E,CAAC,CAAC;QACL,CAAC;QAED,wEAAwE;QACxE,MAAM,QAAQ,GAAG,CAAC,GAAG,eAAe,EAAE,GAAG,YAAY,EAAE,GAAG,SAAS,CAAC,CAAC;QAErE,yFAAyF;QACzF,IAAI,WAAW,GAAG,WAAW,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC;gBACnE,SAAS,CAAC,KAAK,CAAC,sCAAsC,CAAC;gBACvD,SAAS,CAAC,KAAK,CAAC,uFAAuF,CAAC,CAAC;YAE3G,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBACpE,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACrD,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,QAAQ,GAAwD,EAAE,CAAC;QACzE,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,iEAAiE,CAAC,CAAC;QAC/G,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrD,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,IAAI,EAAE,CAAC;gBACT,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,MAAM,WAAW,GAA8C,EAAE,CAAC;QAClE,0DAA0D;QAC1D,MAAM,gBAAgB,GAAG,WAAW,CAAC,QAAQ,CAAC,wIAAwI,CAAC,CAAC;QACxL,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YACnE,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACtI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACrB,4DAA4D;gBAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACzD,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,MAAM,iBAAiB,GAAG,WAAW,CAAC,QAAQ,CAAC,wFAAwF,CAAC,CAAC;QACzI,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YACvD,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACtI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,oEAAoE;YACpE,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAChE,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACzD,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,WAAW,GAAG,WAAW;YAC3B,UAAU;aACT,OAAO,CAAC,oCAAoC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAChE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QACxC,CAAC,CAAC;YACF,QAAQ;aACP,OAAO,CAAC,kDAAkD,EAAE,UAAU,CAAC;YACxE,cAAc;aACb,OAAO,CAAC,kDAAkD,EAAE,cAAc,CAAC;aAC3E,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC;YAChD,QAAQ;aACP,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC;YAC5C,aAAa;aACZ,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC;YAC1C,6BAA6B;aAC5B,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;YACzB,sBAAsB;aACrB,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;aAC1B,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,IAAI,EAAE,CAAC;QAEV,sCAAsC;QACtC,MAAM,QAAQ,GAA+D,EAAE,CAAC;QAChF,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,6CAA6C,CAAC,CAAC;QAE3F,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACpC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;YAEpC,wDAAwD;YACxD,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,SAAS,WAAW,OAAO,EAAE,GAAG,CAAC,CAAC;YACvE,iBAAiB,CAAC,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3D,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;YAElE,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YAE5F,IAAI,cAAc,EAAE,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,UAAU;oBACjB,OAAO,EAAE,cAAc;oBACvB,MAAM,EAAE,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;iBAC5D,CAAC,CAAC;YACL,CAAC;YAED,SAAS,GAAG,QAAQ,CAAC;QACvB,CAAC;QAED,oDAAoD;QACpD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,qBAAqB;QAEhE,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;YACtC,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,eAAe,CAAC,MAAM;YAChC,YAAY,EAAE,YAAY,CAAC,MAAM;YACjC,SAAS,EAAE,SAAS,CAAC,MAAM;YAC3B,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,eAAe,EAAE,UAAU,CAAC,MAAM;YAClC,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;SACxH,CAAC,CAAC;QAEH,OAAO;YACL,KAAK;YACL,OAAO,EAAE,WAAW,IAAI,sBAAsB;YAC9C,eAAe,EAAE,UAAU;YAC3B,QAAQ;YACR,iBAAiB,EAAE,WAAW,CAAC,WAAW,EAAE;YAC5C,QAAQ;YACR,WAAW;SACZ,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,IAAY,EAAE,QAAgB;QACnD,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,2CAA2C;QAC3C,MAAM,QAAQ,GAAiD;YAC7D,EAAE,OAAO,EAAE,qEAAqE,EAAE,QAAQ,EAAE,YAAY,EAAE;YAC1G,EAAE,OAAO,EAAE,sDAAsD,EAAE,QAAQ,EAAE,YAAY,EAAE;YAC3F,EAAE,OAAO,EAAE,sCAAsC,EAAE,QAAQ,EAAE,QAAQ,EAAE;YACvE,EAAE,OAAO,EAAE,kDAAkD,EAAE,QAAQ,EAAE,MAAM,EAAE;YACjF,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC1E,EAAE,OAAO,EAAE,qCAAqC,EAAE,QAAQ,EAAE,MAAM,EAAE;YACpE,EAAE,OAAO,EAAE,uCAAuC,EAAE,QAAQ,EAAE,IAAI,EAAE;YACpE,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC7C,EAAE,OAAO,EAAE,gDAAgD,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC9E,EAAE,OAAO,EAAE,+BAA+B,EAAE,QAAQ,EAAE,MAAM,EAAE;YAC9D,EAAE,OAAO,EAAE,0CAA0C,EAAE,QAAQ,EAAE,KAAK,EAAE;YACxE,EAAE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE;SACnD,CAAC;QAEF,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { DetectedError } from './pattern-matcher.js';
|
|
2
|
-
export declare class ApiValidator {
|
|
3
|
-
detectErrors(code: string, filename?: string): DetectedError[];
|
|
4
|
-
private visitNode;
|
|
5
|
-
private looksLikeAsyncFunction;
|
|
6
|
-
private getLineAndChar;
|
|
7
|
-
private prioritize;
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=api-validator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-validator.d.ts","sourceRoot":"","sources":["../../src/errors/api-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,YAAY;IACvB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,GAAG,aAAa,EAAE;IAqBzE,OAAO,CAAC,SAAS;IA8BjB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,UAAU;CAGnB"}
|