@auxiora/browser 1.0.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-manager.d.ts +6 -1
- package/dist/browser-manager.d.ts.map +1 -1
- package/dist/browser-manager.js +113 -33
- package/dist/browser-manager.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/url-validator.d.ts +1 -36
- package/dist/url-validator.d.ts.map +1 -1
- package/dist/url-validator.js +2 -188
- package/dist/url-validator.js.map +1 -1
- package/package.json +9 -2
- package/src/browser-manager.ts +0 -284
- package/src/index.ts +0 -13
- package/src/types.ts +0 -49
- package/src/url-validator.ts +0 -198
- package/tests/browser-actions.test.ts +0 -185
- package/tests/browser-manager.test.ts +0 -142
- package/tests/integration.test.ts +0 -141
- package/tests/types.test.ts +0 -72
- package/tests/url-validator.test.ts +0 -151
- package/tsconfig.json +0 -11
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -11,7 +11,10 @@ export declare class BrowserManager {
|
|
|
11
11
|
private context;
|
|
12
12
|
private pages;
|
|
13
13
|
private browserFactory;
|
|
14
|
+
private fetchOnly;
|
|
14
15
|
constructor(options?: BrowserManagerOptions);
|
|
16
|
+
/** Whether running in fetch-only fallback mode (no Playwright). */
|
|
17
|
+
get isFetchOnly(): boolean;
|
|
15
18
|
launch(): Promise<void>;
|
|
16
19
|
private ensureBrowser;
|
|
17
20
|
getPage(sessionId: string): Promise<Page>;
|
|
@@ -24,7 +27,6 @@ export declare class BrowserManager {
|
|
|
24
27
|
base64: string;
|
|
25
28
|
path?: string;
|
|
26
29
|
}>;
|
|
27
|
-
private processScreenshot;
|
|
28
30
|
extract(sessionId: string, selector: string): Promise<ExtractResult>;
|
|
29
31
|
wait(sessionId: string, selectorOrMs: string | number): Promise<void>;
|
|
30
32
|
runScript(sessionId: string, script: string): Promise<string>;
|
|
@@ -32,6 +34,9 @@ export declare class BrowserManager {
|
|
|
32
34
|
result: string;
|
|
33
35
|
steps: BrowseStep[];
|
|
34
36
|
}>;
|
|
37
|
+
private fetchNavigate;
|
|
38
|
+
private extractTitle;
|
|
39
|
+
private processScreenshot;
|
|
35
40
|
private getPageMarkdown;
|
|
36
41
|
private htmlToMarkdown;
|
|
37
42
|
getActiveSessionIds(): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-manager.d.ts","sourceRoot":"","sources":["../src/browser-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAkB,MAAM,YAAY,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAMxG,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;
|
|
1
|
+
{"version":3,"file":"browser-manager.d.ts","sourceRoot":"","sources":["../src/browser-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAkB,MAAM,YAAY,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAMxG,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAUD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,GAAE,qBAA0B;IAK/C,mEAAmE;IACnE,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAmBf,aAAa;IAarB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BzC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BzB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwB3D,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5F,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAsBtG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAiBpE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc7D,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;YAmBjF,aAAa;IAuC3B,OAAO,CAAC,YAAY;YAON,iBAAiB;YAqBjB,eAAe;IAK7B,OAAO,CAAC,cAAc;IAuBtB,mBAAmB,IAAI,MAAM,EAAE;IAI/B,YAAY,IAAI,MAAM;CAGvB"}
|
package/dist/browser-manager.js
CHANGED
|
@@ -4,26 +4,48 @@ import { validateUrl } from './url-validator.js';
|
|
|
4
4
|
const logger = getLogger('browser:manager');
|
|
5
5
|
const MAX_SCREENSHOT_SIZE = 5 * 1024 * 1024; // 5MB
|
|
6
6
|
const MAX_RESULT_SIZE = 100 * 1024; // 100KB
|
|
7
|
+
const MAX_FETCH_CONTENT = 500_000; // 500KB
|
|
8
|
+
const FETCH_TIMEOUT = 15_000; // 15s
|
|
9
|
+
const USER_AGENT = 'Auxiora/1.0 (AI Assistant; +https://github.com/trollByte/auxiora)';
|
|
10
|
+
const INTERACTIVE_ERROR = 'Interactive browsing is not available (Playwright not installed). Navigation and page reading still work. To enable clicking, typing, and screenshots, install Playwright: npx playwright install --with-deps chromium';
|
|
7
11
|
export class BrowserManager {
|
|
8
12
|
config;
|
|
9
13
|
browser = null;
|
|
10
14
|
context = null;
|
|
11
15
|
pages = new Map();
|
|
12
16
|
browserFactory;
|
|
17
|
+
fetchOnly = false;
|
|
13
18
|
constructor(options = {}) {
|
|
14
19
|
this.config = { ...DEFAULT_BROWSER_CONFIG, ...options.config };
|
|
15
20
|
this.browserFactory = options.browserFactory || defaultBrowserFactory;
|
|
16
21
|
}
|
|
22
|
+
/** Whether running in fetch-only fallback mode (no Playwright). */
|
|
23
|
+
get isFetchOnly() {
|
|
24
|
+
return this.fetchOnly;
|
|
25
|
+
}
|
|
17
26
|
async launch() {
|
|
18
|
-
if (this.
|
|
27
|
+
if (this.fetchOnly)
|
|
28
|
+
return;
|
|
29
|
+
if (this.browser?.isConnected())
|
|
19
30
|
return;
|
|
20
|
-
}
|
|
21
31
|
logger.info('Launching browser', { headless: this.config.headless });
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
32
|
+
try {
|
|
33
|
+
this.browser = await this.browserFactory(this.config);
|
|
34
|
+
this.context = await this.browser.newContext();
|
|
35
|
+
logger.info('Browser launched');
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
logger.warn('Playwright unavailable, falling back to fetch-only mode', {
|
|
39
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
40
|
+
});
|
|
41
|
+
this.fetchOnly = true;
|
|
42
|
+
this.browser = null;
|
|
43
|
+
this.context = null;
|
|
44
|
+
}
|
|
25
45
|
}
|
|
26
46
|
async ensureBrowser() {
|
|
47
|
+
if (this.fetchOnly)
|
|
48
|
+
return;
|
|
27
49
|
if (!this.browser || !this.browser.isConnected()) {
|
|
28
50
|
this.pages.clear();
|
|
29
51
|
this.context = null;
|
|
@@ -33,6 +55,9 @@ export class BrowserManager {
|
|
|
33
55
|
}
|
|
34
56
|
}
|
|
35
57
|
async getPage(sessionId) {
|
|
58
|
+
if (this.fetchOnly) {
|
|
59
|
+
throw new Error(INTERACTIVE_ERROR);
|
|
60
|
+
}
|
|
36
61
|
await this.ensureBrowser();
|
|
37
62
|
const existing = this.pages.get(sessionId);
|
|
38
63
|
if (existing && !existing.isClosed()) {
|
|
@@ -81,6 +106,7 @@ export class BrowserManager {
|
|
|
81
106
|
}
|
|
82
107
|
logger.info('Browser shutdown complete');
|
|
83
108
|
}
|
|
109
|
+
// ─── Navigation (works in both modes) ────────────────────────────────────
|
|
84
110
|
async navigate(sessionId, url) {
|
|
85
111
|
const validationError = validateUrl(url, {
|
|
86
112
|
allowedUrls: this.config.allowedUrls,
|
|
@@ -89,17 +115,25 @@ export class BrowserManager {
|
|
|
89
115
|
if (validationError) {
|
|
90
116
|
throw new Error(validationError);
|
|
91
117
|
}
|
|
118
|
+
if (this.fetchOnly) {
|
|
119
|
+
return this.fetchNavigate(url);
|
|
120
|
+
}
|
|
92
121
|
const page = await this.getPage(sessionId);
|
|
93
122
|
await page.goto(url, { waitUntil: 'domcontentloaded' });
|
|
94
123
|
const title = await page.title();
|
|
95
124
|
const content = await this.getPageMarkdown(page);
|
|
96
125
|
return { url: page.url(), title, content };
|
|
97
126
|
}
|
|
127
|
+
// ─── Interactive methods (Playwright only) ───────────────────────────────
|
|
98
128
|
async click(sessionId, selector) {
|
|
129
|
+
if (this.fetchOnly)
|
|
130
|
+
throw new Error(INTERACTIVE_ERROR);
|
|
99
131
|
const page = await this.getPage(sessionId);
|
|
100
132
|
await page.click(selector, { timeout: this.config.actionTimeout });
|
|
101
133
|
}
|
|
102
134
|
async type(sessionId, selector, text, pressEnter) {
|
|
135
|
+
if (this.fetchOnly)
|
|
136
|
+
throw new Error(INTERACTIVE_ERROR);
|
|
103
137
|
const page = await this.getPage(sessionId);
|
|
104
138
|
await page.fill(selector, text);
|
|
105
139
|
if (pressEnter) {
|
|
@@ -107,6 +141,8 @@ export class BrowserManager {
|
|
|
107
141
|
}
|
|
108
142
|
}
|
|
109
143
|
async screenshot(sessionId, options) {
|
|
144
|
+
if (this.fetchOnly)
|
|
145
|
+
throw new Error(INTERACTIVE_ERROR);
|
|
110
146
|
const page = await this.getPage(sessionId);
|
|
111
147
|
const screenshotOptions = {
|
|
112
148
|
fullPage: options?.fullPage ?? true,
|
|
@@ -123,24 +159,9 @@ export class BrowserManager {
|
|
|
123
159
|
const buffer = await page.screenshot(screenshotOptions);
|
|
124
160
|
return this.processScreenshot(buffer, sessionId);
|
|
125
161
|
}
|
|
126
|
-
async processScreenshot(buffer, sessionId) {
|
|
127
|
-
if (buffer.length > MAX_SCREENSHOT_SIZE) {
|
|
128
|
-
logger.warn('Screenshot exceeds size limit', { size: buffer.length });
|
|
129
|
-
}
|
|
130
|
-
const base64 = buffer.toString('base64');
|
|
131
|
-
let filePath;
|
|
132
|
-
if (this.config.screenshotDir) {
|
|
133
|
-
const { mkdir, writeFile } = await import('node:fs/promises');
|
|
134
|
-
const { join } = await import('node:path');
|
|
135
|
-
const dir = this.config.screenshotDir;
|
|
136
|
-
await mkdir(dir, { recursive: true });
|
|
137
|
-
const timestamp = Date.now();
|
|
138
|
-
filePath = join(dir, `${timestamp}-${sessionId}.png`);
|
|
139
|
-
await writeFile(filePath, buffer);
|
|
140
|
-
}
|
|
141
|
-
return { base64, path: filePath };
|
|
142
|
-
}
|
|
143
162
|
async extract(sessionId, selector) {
|
|
163
|
+
if (this.fetchOnly)
|
|
164
|
+
throw new Error(INTERACTIVE_ERROR);
|
|
144
165
|
const page = await this.getPage(sessionId);
|
|
145
166
|
const elements = await page.$$eval(selector, (els) => els.map((el) => ({
|
|
146
167
|
text: el.innerText || el.textContent || '',
|
|
@@ -150,18 +171,21 @@ export class BrowserManager {
|
|
|
150
171
|
return { selector, elements };
|
|
151
172
|
}
|
|
152
173
|
async wait(sessionId, selectorOrMs) {
|
|
153
|
-
const page = await this.getPage(sessionId);
|
|
154
174
|
if (typeof selectorOrMs === 'number') {
|
|
155
175
|
const delay = Math.min(selectorOrMs, 30_000);
|
|
156
176
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
177
|
+
return;
|
|
157
178
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
179
|
+
if (this.fetchOnly)
|
|
180
|
+
throw new Error(INTERACTIVE_ERROR);
|
|
181
|
+
const page = await this.getPage(sessionId);
|
|
182
|
+
await page.waitForSelector(selectorOrMs, { timeout: this.config.actionTimeout });
|
|
161
183
|
}
|
|
162
184
|
async runScript(sessionId, script) {
|
|
185
|
+
if (this.fetchOnly)
|
|
186
|
+
throw new Error(INTERACTIVE_ERROR);
|
|
163
187
|
const page = await this.getPage(sessionId);
|
|
164
|
-
//
|
|
188
|
+
// Playwright's page API for running script in browser context
|
|
165
189
|
const result = await page.evaluate(script);
|
|
166
190
|
const json = JSON.stringify(result);
|
|
167
191
|
if (json.length > MAX_RESULT_SIZE) {
|
|
@@ -170,20 +194,76 @@ export class BrowserManager {
|
|
|
170
194
|
return json;
|
|
171
195
|
}
|
|
172
196
|
async browse(sessionId, task) {
|
|
173
|
-
const steps = [];
|
|
174
197
|
const mutationKeywords = ['click', 'type', 'fill', 'submit', 'login', 'sign in', 'purchase', 'buy', 'send', 'post', 'delete'];
|
|
175
198
|
const needsMutation = mutationKeywords.some((kw) => task.toLowerCase().includes(kw));
|
|
176
199
|
if (needsMutation) {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
};
|
|
200
|
+
const msg = this.fetchOnly
|
|
201
|
+
? `This task requires page interactions (clicking, typing) which are not available in fetch-only mode. ${INTERACTIVE_ERROR}`
|
|
202
|
+
: 'This task requires page interactions (clicking, typing). Please use the primitive browser tools (browser_click, browser_type) for these actions, which require user approval for safety.';
|
|
203
|
+
return { result: msg, steps: [] };
|
|
181
204
|
}
|
|
182
205
|
return {
|
|
183
206
|
result: `Browse task queued: "${task}". Use browser_navigate to go to a page, then browser_extract to get data.`,
|
|
184
|
-
steps,
|
|
207
|
+
steps: [],
|
|
185
208
|
};
|
|
186
209
|
}
|
|
210
|
+
// ─── Fetch-only fallback ─────────────────────────────────────────────────
|
|
211
|
+
async fetchNavigate(url) {
|
|
212
|
+
logger.info('Fetching URL (fetch-only mode)', { url });
|
|
213
|
+
const controller = new AbortController();
|
|
214
|
+
const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT);
|
|
215
|
+
try {
|
|
216
|
+
const response = await fetch(url, {
|
|
217
|
+
headers: {
|
|
218
|
+
'User-Agent': USER_AGENT,
|
|
219
|
+
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
220
|
+
},
|
|
221
|
+
signal: controller.signal,
|
|
222
|
+
redirect: 'follow',
|
|
223
|
+
});
|
|
224
|
+
if (!response.ok) {
|
|
225
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
226
|
+
}
|
|
227
|
+
let text = await response.text();
|
|
228
|
+
if (text.length > MAX_FETCH_CONTENT) {
|
|
229
|
+
text = text.substring(0, MAX_FETCH_CONTENT);
|
|
230
|
+
}
|
|
231
|
+
const title = this.extractTitle(text);
|
|
232
|
+
const content = this.htmlToMarkdown(text);
|
|
233
|
+
return { url: response.url, title, content };
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (error.name === 'AbortError') {
|
|
237
|
+
throw new Error(`Request timed out after ${FETCH_TIMEOUT}ms`);
|
|
238
|
+
}
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
clearTimeout(timeoutId);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
extractTitle(html) {
|
|
246
|
+
const match = html.match(/<title[^>]*>(.*?)<\/title>/is);
|
|
247
|
+
return match ? match[1].replace(/\s+/g, ' ').trim() : '';
|
|
248
|
+
}
|
|
249
|
+
// ─── Shared helpers ──────────────────────────────────────────────────────
|
|
250
|
+
async processScreenshot(buffer, sessionId) {
|
|
251
|
+
if (buffer.length > MAX_SCREENSHOT_SIZE) {
|
|
252
|
+
logger.warn('Screenshot exceeds size limit', { size: buffer.length });
|
|
253
|
+
}
|
|
254
|
+
const base64 = buffer.toString('base64');
|
|
255
|
+
let filePath;
|
|
256
|
+
if (this.config.screenshotDir) {
|
|
257
|
+
const { mkdir, writeFile } = await import('node:fs/promises');
|
|
258
|
+
const { join } = await import('node:path');
|
|
259
|
+
const dir = this.config.screenshotDir;
|
|
260
|
+
await mkdir(dir, { recursive: true });
|
|
261
|
+
const timestamp = Date.now();
|
|
262
|
+
filePath = join(dir, `${timestamp}-${sessionId}.png`);
|
|
263
|
+
await writeFile(filePath, buffer);
|
|
264
|
+
}
|
|
265
|
+
return { base64, path: filePath };
|
|
266
|
+
}
|
|
187
267
|
async getPageMarkdown(page) {
|
|
188
268
|
const html = await page.content();
|
|
189
269
|
return this.htmlToMarkdown(html);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-manager.js","sourceRoot":"","sources":["../src/browser-manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser-manager.js","sourceRoot":"","sources":["../src/browser-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,MAAM,GAAG,SAAS,CAAC,iBAAiB,CAAC,CAAC;AAS5C,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM;AACnD,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,QAAQ;AAC5C,MAAM,iBAAiB,GAAG,OAAO,CAAC,CAAC,QAAQ;AAC3C,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,MAAM;AACpC,MAAM,UAAU,GAAG,mEAAmE,CAAC;AAEvF,MAAM,iBAAiB,GAAG,wNAAwN,CAAC;AAEnP,MAAM,OAAO,cAAc;IACjB,MAAM,CAAgB;IACtB,OAAO,GAAmB,IAAI,CAAC;IAC/B,OAAO,GAA0B,IAAI,CAAC;IACtC,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAChC,cAAc,CAAiB;IAC/B,SAAS,GAAG,KAAK,CAAC;IAE1B,YAAY,UAAiC,EAAE;QAC7C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,sBAAsB,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/D,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,qBAAqB,CAAC;IACxE,CAAC;IAED,mEAAmE;IACnE,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE;YAAE,OAAO;QAExC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,yDAAyD,EAAE;gBACrE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aACjE,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YAEpB,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;YACrC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,MAAM,CAAC,kBAAkB,WAAW,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAQ,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAChE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAElD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;oBACrB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBACrB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACrH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAEnB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7G,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,GAAW;QAC3C,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;YACvC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;SACrC,CAAC,CAAC;QACH,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAExD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEjD,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,QAAgB;QAC7C,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,QAAgB,EAAE,IAAY,EAAE,UAAoB;QAChF,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,OAA2B;QAC7D,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,iBAAiB,GAAQ;YAC7B,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;YACnC,IAAI,EAAE,KAAK;SACZ,CAAC;QAEF,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,QAAgB;QAC/C,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CACnD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACf,IAAI,EAAG,EAAU,CAAC,SAAS,IAAI,EAAE,CAAC,WAAW,IAAI,EAAE;YACnD,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;YACjC,UAAU,EAAE,MAAM,CAAC,WAAW,CAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CACtE;SACF,CAAC,CAAC,CACJ,CAAC;QAEF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,YAA6B;QACzD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,MAAc;QAC/C,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,8DAA8D;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,MAAM,eAAe,eAAe,GAAG,CAAC,CAAC;QACrF,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,IAAY;QAC1C,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9H,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAErF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS;gBACxB,CAAC,CAAC,uGAAuG,iBAAiB,EAAE;gBAC5H,CAAC,CAAC,0LAA0L,CAAC;YAC/L,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACpC,CAAC;QAED,OAAO;YACL,MAAM,EAAE,wBAAwB,IAAI,4EAA4E;YAChH,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,4EAA4E;IAEpE,KAAK,CAAC,aAAa,CAAC,GAAW;QACrC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAEvD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,aAAa,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,OAAO,EAAE;oBACP,YAAY,EAAE,UAAU;oBACxB,QAAQ,EAAE,iEAAiE;iBAC5E;gBACD,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,IAAI,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;gBACpC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAE1C,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,aAAa,IAAI,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,IAAY;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,CAAC;IAED,4EAA4E;IAEpE,KAAK,CAAC,iBAAiB,CAAC,MAAc,EAAE,SAAiB;QAC/D,IAAI,MAAM,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,QAA4B,CAAC;QACjC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC9B,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC9D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;YACtC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,SAAS,MAAM,CAAC,CAAC;YACtD,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,IAAU;QACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAEO,cAAc,CAAC,IAAY;QACjC,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qDAAqD,EAAE,EAAE,CAAC,CAAC;QAC/E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kDAAkD,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;QAC1D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC;QAC3D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,YAAY,CAAC,CAAC;QAC5D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yCAAyC,EAAE,UAAU,CAAC,CAAC;QAC3E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;QACtD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAClC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAClC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,mBAAmB;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAED,KAAK,UAAU,qBAAqB,CAAC,MAAqB;IACxD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAChD,OAAO,QAAQ,CAAC,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,CAAC,sBAAsB,EAAE,yBAAyB,EAAE,cAAc,CAAC;KAC1E,CAAC,CAAC;AACL,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface BrowserConfig {
|
|
|
12
12
|
blockedUrls?: string[];
|
|
13
13
|
}
|
|
14
14
|
export declare const DEFAULT_BROWSER_CONFIG: BrowserConfig;
|
|
15
|
-
export
|
|
15
|
+
export { BLOCKED_PROTOCOLS } from '@auxiora/ssrf-guard';
|
|
16
16
|
export interface PageInfo {
|
|
17
17
|
url: string;
|
|
18
18
|
title: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,sBAAsB,EAAE,aAOpC,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,sBAAsB,EAAE,aAOpC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ"}
|
package/dist/types.js
CHANGED
|
@@ -6,5 +6,5 @@ export const DEFAULT_BROWSER_CONFIG = {
|
|
|
6
6
|
maxConcurrentPages: 10,
|
|
7
7
|
screenshotDir: 'screenshots',
|
|
8
8
|
};
|
|
9
|
-
export
|
|
9
|
+
export { BLOCKED_PROTOCOLS } from '@auxiora/ssrf-guard';
|
|
10
10
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IACtC,iBAAiB,EAAE,MAAM;IACzB,aAAa,EAAE,MAAM;IACrB,kBAAkB,EAAE,EAAE;IACtB,aAAa,EAAE,aAAa;CAC7B,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IACtC,iBAAiB,EAAE,MAAM;IACzB,aAAa,EAAE,MAAM;IACrB,kBAAkB,EAAE,EAAE;IACtB,aAAa,EAAE,aAAa;CAC7B,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/url-validator.d.ts
CHANGED
|
@@ -1,37 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
allowedUrls?: string[];
|
|
3
|
-
blockedUrls?: string[];
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Check if an IP address (v4 or v6) falls within private/internal ranges.
|
|
7
|
-
* Uses numeric comparison instead of string prefix matching to prevent
|
|
8
|
-
* bypass via decimal, hex, or octal IP encodings.
|
|
9
|
-
*/
|
|
10
|
-
declare function isPrivateIP(ip: string): boolean;
|
|
11
|
-
/**
|
|
12
|
-
* Parse an IPv4 address string to a 32-bit unsigned number.
|
|
13
|
-
* Handles standard dotted-decimal (e.g. "127.0.0.1").
|
|
14
|
-
*/
|
|
15
|
-
declare function parseIPv4ToNumber(ip: string): number | null;
|
|
16
|
-
/**
|
|
17
|
-
* Normalize an IPv6 address to its full expanded form.
|
|
18
|
-
*/
|
|
19
|
-
declare function normalizeIPv6(ip: string): string;
|
|
20
|
-
/**
|
|
21
|
-
* Check if a hostname looks like a numeric IP (decimal, hex, octal)
|
|
22
|
-
* that could bypass string-based checks.
|
|
23
|
-
*/
|
|
24
|
-
declare function isNumericHostname(hostname: string): boolean;
|
|
25
|
-
/**
|
|
26
|
-
* Validates a URL for browser navigation.
|
|
27
|
-
* Returns null if valid, or an error message string.
|
|
28
|
-
*
|
|
29
|
-
* Blocks:
|
|
30
|
-
* - Non http/https protocols (file:, javascript:, data:, blob:)
|
|
31
|
-
* - Private/internal IP addresses (127.x, 10.x, 192.168.x, 172.16-31.x, 169.254.x, localhost)
|
|
32
|
-
* - Numeric IP bypasses (decimal, hex, octal encodings)
|
|
33
|
-
* - IPv6-mapped IPv4 addresses (::ffff:127.0.0.1)
|
|
34
|
-
*/
|
|
35
|
-
export declare function validateUrl(url: string, options?: ValidatorOptions): string | null;
|
|
36
|
-
export { isPrivateIP, parseIPv4ToNumber, isNumericHostname, normalizeIPv6 };
|
|
1
|
+
export { validateUrl, isPrivateIP, parseIPv4ToNumber, isNumericHostname, normalizeIPv6 } from '@auxiora/ssrf-guard';
|
|
37
2
|
//# sourceMappingURL=url-validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-validator.d.ts","sourceRoot":"","sources":["../src/url-validator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"url-validator.d.ts","sourceRoot":"","sources":["../src/url-validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/url-validator.js
CHANGED
|
@@ -1,189 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Check if an IP address (v4 or v6) falls within private/internal ranges.
|
|
5
|
-
* Uses numeric comparison instead of string prefix matching to prevent
|
|
6
|
-
* bypass via decimal, hex, or octal IP encodings.
|
|
7
|
-
*/
|
|
8
|
-
function isPrivateIP(ip) {
|
|
9
|
-
// IPv6 checks
|
|
10
|
-
if (ip.includes(':')) {
|
|
11
|
-
const normalized = normalizeIPv6(ip);
|
|
12
|
-
// ::1 (loopback)
|
|
13
|
-
if (normalized === '0000:0000:0000:0000:0000:0000:0000:0001')
|
|
14
|
-
return true;
|
|
15
|
-
// :: (unspecified)
|
|
16
|
-
if (normalized === '0000:0000:0000:0000:0000:0000:0000:0000')
|
|
17
|
-
return true;
|
|
18
|
-
// fe80::/10 (link-local)
|
|
19
|
-
if (normalized.startsWith('fe8') || normalized.startsWith('fe9') ||
|
|
20
|
-
normalized.startsWith('fea') || normalized.startsWith('feb'))
|
|
21
|
-
return true;
|
|
22
|
-
// fc00::/7 (unique local)
|
|
23
|
-
if (normalized.startsWith('fc') || normalized.startsWith('fd'))
|
|
24
|
-
return true;
|
|
25
|
-
// ::ffff:x.x.x.x (IPv4-mapped IPv6)
|
|
26
|
-
if (normalized.startsWith('0000:0000:0000:0000:0000:ffff:')) {
|
|
27
|
-
const lastTwo = normalized.slice(30); // e.g., "7f00:0001"
|
|
28
|
-
const hi = parseInt(lastTwo.slice(0, 4), 16);
|
|
29
|
-
const lo = parseInt(lastTwo.slice(5, 9), 16);
|
|
30
|
-
const ipv4 = ((hi << 16) | lo) >>> 0;
|
|
31
|
-
return isPrivateIPv4Numeric(ipv4);
|
|
32
|
-
}
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
// IPv4: parse to numeric
|
|
36
|
-
const num = parseIPv4ToNumber(ip);
|
|
37
|
-
if (num === null)
|
|
38
|
-
return false;
|
|
39
|
-
return isPrivateIPv4Numeric(num);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Parse an IPv4 address string to a 32-bit unsigned number.
|
|
43
|
-
* Handles standard dotted-decimal (e.g. "127.0.0.1").
|
|
44
|
-
*/
|
|
45
|
-
function parseIPv4ToNumber(ip) {
|
|
46
|
-
const parts = ip.split('.');
|
|
47
|
-
if (parts.length !== 4)
|
|
48
|
-
return null;
|
|
49
|
-
let result = 0;
|
|
50
|
-
for (const part of parts) {
|
|
51
|
-
const n = parseInt(part, 10);
|
|
52
|
-
if (isNaN(n) || n < 0 || n > 255)
|
|
53
|
-
return null;
|
|
54
|
-
result = (result << 8) | n;
|
|
55
|
-
}
|
|
56
|
-
return result >>> 0; // unsigned
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Check if a numeric IPv4 address is in a private/internal range.
|
|
60
|
-
*/
|
|
61
|
-
function isPrivateIPv4Numeric(ip) {
|
|
62
|
-
// 127.0.0.0/8 (loopback)
|
|
63
|
-
if ((ip >>> 24) === 127)
|
|
64
|
-
return true;
|
|
65
|
-
// 10.0.0.0/8
|
|
66
|
-
if ((ip >>> 24) === 10)
|
|
67
|
-
return true;
|
|
68
|
-
// 172.16.0.0/12
|
|
69
|
-
if ((ip >>> 20) === (172 << 4 | 1))
|
|
70
|
-
return true; // 0xAC1 = 172.16-31
|
|
71
|
-
// 192.168.0.0/16
|
|
72
|
-
if ((ip >>> 16) === (192 << 8 | 168))
|
|
73
|
-
return true; // 0xC0A8
|
|
74
|
-
// 169.254.0.0/16 (link-local)
|
|
75
|
-
if ((ip >>> 16) === (169 << 8 | 254))
|
|
76
|
-
return true; // 0xA9FE
|
|
77
|
-
// 0.0.0.0
|
|
78
|
-
if (ip === 0)
|
|
79
|
-
return true;
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Normalize an IPv6 address to its full expanded form.
|
|
84
|
-
*/
|
|
85
|
-
function normalizeIPv6(ip) {
|
|
86
|
-
// Handle IPv4-mapped addresses like ::ffff:127.0.0.1
|
|
87
|
-
const v4MappedMatch = ip.match(/::ffff:(\d+\.\d+\.\d+\.\d+)$/i);
|
|
88
|
-
if (v4MappedMatch) {
|
|
89
|
-
const v4num = parseIPv4ToNumber(v4MappedMatch[1]);
|
|
90
|
-
if (v4num !== null) {
|
|
91
|
-
const hi = (v4num >>> 16) & 0xffff;
|
|
92
|
-
const lo = v4num & 0xffff;
|
|
93
|
-
return `0000:0000:0000:0000:0000:ffff:${hi.toString(16).padStart(4, '0')}:${lo.toString(16).padStart(4, '0')}`;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
let parts = ip.split(':');
|
|
97
|
-
// Handle :: expansion
|
|
98
|
-
const emptyIndex = parts.indexOf('');
|
|
99
|
-
if (ip.includes('::')) {
|
|
100
|
-
const before = ip.split('::')[0].split(':').filter(Boolean);
|
|
101
|
-
const after = ip.split('::')[1].split(':').filter(Boolean);
|
|
102
|
-
const missing = 8 - before.length - after.length;
|
|
103
|
-
parts = [...before, ...Array(missing).fill('0'), ...after];
|
|
104
|
-
}
|
|
105
|
-
return parts.map((p) => (p || '0').padStart(4, '0').toLowerCase()).join(':');
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Check if a hostname looks like a numeric IP (decimal, hex, octal)
|
|
109
|
-
* that could bypass string-based checks.
|
|
110
|
-
*/
|
|
111
|
-
function isNumericHostname(hostname) {
|
|
112
|
-
// Pure decimal number (e.g., 2130706433 for 127.0.0.1)
|
|
113
|
-
if (/^\d+$/.test(hostname))
|
|
114
|
-
return true;
|
|
115
|
-
// Hex number (e.g., 0x7f000001)
|
|
116
|
-
if (/^0x[0-9a-fA-F]+$/i.test(hostname))
|
|
117
|
-
return true;
|
|
118
|
-
// Octal parts (e.g., 0177.0.0.1)
|
|
119
|
-
if (/^[0-7]+\./.test(hostname) && hostname.startsWith('0') && !hostname.startsWith('0.'))
|
|
120
|
-
return true;
|
|
121
|
-
return false;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Validates a URL for browser navigation.
|
|
125
|
-
* Returns null if valid, or an error message string.
|
|
126
|
-
*
|
|
127
|
-
* Blocks:
|
|
128
|
-
* - Non http/https protocols (file:, javascript:, data:, blob:)
|
|
129
|
-
* - Private/internal IP addresses (127.x, 10.x, 192.168.x, 172.16-31.x, 169.254.x, localhost)
|
|
130
|
-
* - Numeric IP bypasses (decimal, hex, octal encodings)
|
|
131
|
-
* - IPv6-mapped IPv4 addresses (::ffff:127.0.0.1)
|
|
132
|
-
*/
|
|
133
|
-
export function validateUrl(url, options) {
|
|
134
|
-
if (!url || typeof url !== 'string') {
|
|
135
|
-
return 'URL must be a non-empty string';
|
|
136
|
-
}
|
|
137
|
-
let parsed;
|
|
138
|
-
try {
|
|
139
|
-
parsed = new URL(url);
|
|
140
|
-
}
|
|
141
|
-
catch {
|
|
142
|
-
return 'Invalid URL format';
|
|
143
|
-
}
|
|
144
|
-
// Check blocked protocols
|
|
145
|
-
if (BLOCKED_PROTOCOLS.includes(parsed.protocol)) {
|
|
146
|
-
return `Blocked protocol: ${parsed.protocol} — only http: and https: are allowed`;
|
|
147
|
-
}
|
|
148
|
-
// Only allow http and https
|
|
149
|
-
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
150
|
-
return `Blocked protocol: ${parsed.protocol} — only http: and https: are allowed`;
|
|
151
|
-
}
|
|
152
|
-
const hostname = parsed.hostname;
|
|
153
|
-
// Check blocklist first (takes priority)
|
|
154
|
-
if (options?.blockedUrls?.some((pattern) => hostname.includes(pattern))) {
|
|
155
|
-
return `URL blocked by blocklist: ${hostname}`;
|
|
156
|
-
}
|
|
157
|
-
// Check if in allowlist (skip private IP check if allowed)
|
|
158
|
-
const isAllowed = options?.allowedUrls?.some((pattern) => hostname.includes(pattern));
|
|
159
|
-
if (isAllowed) {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
// Block numeric IP encodings (decimal, hex, octal) that could bypass string checks
|
|
163
|
-
if (isNumericHostname(hostname)) {
|
|
164
|
-
return `Blocked numeric IP encoding: ${hostname}`;
|
|
165
|
-
}
|
|
166
|
-
// Block localhost
|
|
167
|
-
if (hostname === 'localhost' || hostname.endsWith('.localhost')) {
|
|
168
|
-
return `Blocked private/internal address: ${hostname}`;
|
|
169
|
-
}
|
|
170
|
-
// Check if hostname is an IP address
|
|
171
|
-
const ipVersion = isIP(hostname);
|
|
172
|
-
if (ipVersion > 0) {
|
|
173
|
-
// It's a direct IP — check against private ranges numerically
|
|
174
|
-
if (isPrivateIP(hostname)) {
|
|
175
|
-
return `Blocked private/internal address: ${hostname}`;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
// Check hostnames that resolve to IPv6 loopback patterns
|
|
179
|
-
if (hostname.startsWith('[') && hostname.endsWith(']')) {
|
|
180
|
-
const innerIP = hostname.slice(1, -1);
|
|
181
|
-
if (isPrivateIP(innerIP)) {
|
|
182
|
-
return `Blocked private/internal address: ${hostname}`;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
return null;
|
|
186
|
-
}
|
|
187
|
-
// Export for testing
|
|
188
|
-
export { isPrivateIP, parseIPv4ToNumber, isNumericHostname, normalizeIPv6 };
|
|
1
|
+
// Re-export from shared SSRF guard package
|
|
2
|
+
export { validateUrl, isPrivateIP, parseIPv4ToNumber, isNumericHostname, normalizeIPv6 } from '@auxiora/ssrf-guard';
|
|
189
3
|
//# sourceMappingURL=url-validator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-validator.js","sourceRoot":"","sources":["../src/url-validator.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"url-validator.js","sourceRoot":"","sources":["../src/url-validator.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@auxiora/browser",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -15,8 +15,15 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"playwright": "^1.50.0",
|
|
18
|
-
"@auxiora/logger": "1.
|
|
18
|
+
"@auxiora/logger": "1.3.0",
|
|
19
|
+
"@auxiora/ssrf-guard": "1.3.0"
|
|
19
20
|
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist/"
|
|
26
|
+
],
|
|
20
27
|
"scripts": {
|
|
21
28
|
"build": "tsc",
|
|
22
29
|
"clean": "rm -rf dist",
|