real-browser-mcp-server 1.5.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -41
- package/dist/lib/cjs/index.d.ts +14 -1
- package/dist/lib/cjs/index.d.ts.map +1 -1
- package/dist/lib/cjs/index.js +5 -3
- package/dist/lib/cjs/index.js.map +1 -1
- package/dist/lib/cjs/module/pageController.d.ts +7 -1
- package/dist/lib/cjs/module/pageController.d.ts.map +1 -1
- package/dist/lib/cjs/module/pageController.js +4 -23
- package/dist/lib/cjs/module/pageController.js.map +1 -1
- package/dist/lib/cjs/module/turnstile.d.ts +4 -1
- package/dist/lib/cjs/module/turnstile.d.ts.map +1 -1
- package/dist/lib/cjs/module/turnstile.js +14 -13
- package/dist/lib/cjs/module/turnstile.js.map +1 -1
- package/dist/lib/esm/index.d.mjs +11 -0
- package/dist/lib/esm/index.mjs +4 -0
- package/dist/lib/esm/module/pageController.d.mjs +3 -0
- package/dist/lib/esm/module/turnstile.d.mjs +3 -0
- package/dist/scripts/generate-esm.d.ts +2 -0
- package/dist/scripts/generate-esm.d.ts.map +1 -0
- package/dist/scripts/generate-esm.js +100 -0
- package/dist/scripts/generate-esm.js.map +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +0 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/handlers/browser.d.ts +8 -7
- package/dist/src/mcp/handlers/browser.d.ts.map +1 -1
- package/dist/src/mcp/handlers/browser.js +19 -2
- package/dist/src/mcp/handlers/browser.js.map +1 -1
- package/dist/src/mcp/handlers/dom.d.ts +19 -18
- package/dist/src/mcp/handlers/dom.d.ts.map +1 -1
- package/dist/src/mcp/handlers/dom.js +7 -28
- package/dist/src/mcp/handlers/dom.js.map +1 -1
- package/dist/src/mcp/handlers/extract.js.map +1 -1
- package/dist/src/mcp/handlers/handler-utils.d.ts +14 -0
- package/dist/src/mcp/handlers/handler-utils.d.ts.map +1 -0
- package/dist/src/mcp/handlers/handler-utils.js +42 -0
- package/dist/src/mcp/handlers/handler-utils.js.map +1 -0
- package/dist/src/mcp/handlers/helpers.d.ts +0 -7
- package/dist/src/mcp/handlers/helpers.d.ts.map +1 -1
- package/dist/src/mcp/handlers/helpers.js +0 -15
- package/dist/src/mcp/handlers/helpers.js.map +1 -1
- package/dist/src/mcp/handlers/index.d.ts.map +1 -1
- package/dist/src/mcp/handlers/index.js +11 -0
- package/dist/src/mcp/handlers/index.js.map +1 -1
- package/dist/src/mcp/handlers/media-handlers.d.ts +2 -1
- package/dist/src/mcp/handlers/media-handlers.d.ts.map +1 -1
- package/dist/src/mcp/handlers/media-handlers.js +24 -8
- package/dist/src/mcp/handlers/media-handlers.js.map +1 -1
- package/dist/src/mcp/handlers/network-extractors.d.ts +2 -0
- package/dist/src/mcp/handlers/network-extractors.d.ts.map +1 -0
- package/dist/src/mcp/handlers/network-extractors.js +651 -0
- package/dist/src/mcp/handlers/network-extractors.js.map +1 -0
- package/dist/src/mcp/handlers/network-recorder.d.ts +119 -0
- package/dist/src/mcp/handlers/network-recorder.d.ts.map +1 -0
- package/dist/src/mcp/handlers/network-recorder.js +337 -0
- package/dist/src/mcp/handlers/network-recorder.js.map +1 -0
- package/dist/src/mcp/handlers/network.d.ts +30 -118
- package/dist/src/mcp/handlers/network.d.ts.map +1 -1
- package/dist/src/mcp/handlers/network.js +28 -1187
- package/dist/src/mcp/handlers/network.js.map +1 -1
- package/dist/src/mcp/handlers/state.d.ts +1 -0
- package/dist/src/mcp/handlers/state.d.ts.map +1 -1
- package/dist/src/mcp/handlers/state.js +17 -0
- package/dist/src/mcp/handlers/state.js.map +1 -1
- package/dist/src/mcp/handlers/utility-handlers.d.ts +8 -37
- package/dist/src/mcp/handlers/utility-handlers.d.ts.map +1 -1
- package/dist/src/mcp/handlers/utility-handlers.js +69 -31
- package/dist/src/mcp/handlers/utility-handlers.js.map +1 -1
- package/dist/src/mcp/handlers/vision-captcha.d.ts +221 -0
- package/dist/src/mcp/handlers/vision-captcha.d.ts.map +1 -0
- package/dist/src/mcp/handlers/vision-captcha.js +238 -0
- package/dist/src/mcp/handlers/vision-captcha.js.map +1 -0
- package/dist/src/mcp/handlers/vision-see-page.d.ts +32 -0
- package/dist/src/mcp/handlers/vision-see-page.d.ts.map +1 -0
- package/dist/src/mcp/handlers/vision-see-page.js +260 -0
- package/dist/src/mcp/handlers/vision-see-page.js.map +1 -0
- package/dist/src/mcp/handlers/vision.d.ts +50 -27
- package/dist/src/mcp/handlers/vision.d.ts.map +1 -1
- package/dist/src/mcp/handlers/vision.js +4 -606
- package/dist/src/mcp/handlers/vision.js.map +1 -1
- package/dist/src/mcp/index.d.ts.map +1 -1
- package/dist/src/mcp/index.js +11 -3
- package/dist/src/mcp/index.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +6 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/shared/cache-manager.d.ts +0 -2
- package/dist/src/shared/cache-manager.d.ts.map +1 -1
- package/dist/src/shared/cache-manager.js +1 -3
- package/dist/src/shared/cache-manager.js.map +1 -1
- package/dist/src/shared/lib-core.d.ts +2 -1
- package/dist/src/shared/lib-core.d.ts.map +1 -1
- package/dist/src/shared/lib-core.js +5 -38
- package/dist/src/shared/lib-core.js.map +1 -1
- package/dist/src/shared/tools.d.ts.map +1 -1
- package/dist/src/shared/tools.js +6 -18
- package/dist/src/shared/tools.js.map +1 -1
- package/dist/src/types.d.ts +25 -6
- package/dist/src/types.d.ts.map +1 -1
- package/dist/test/cjs/test.js +29 -33
- package/dist/test/cjs/test.js.map +1 -1
- package/dist/test/mcp/smoke-test.d.ts +1 -1
- package/dist/test/mcp/smoke-test.d.ts.map +1 -1
- package/dist/test/mcp/smoke-test.js +16 -4
- package/dist/test/mcp/smoke-test.js.map +1 -1
- package/dist/test/unit/handler-test.d.ts +3 -0
- package/dist/test/unit/handler-test.d.ts.map +1 -0
- package/dist/test/unit/handler-test.js +133 -0
- package/dist/test/unit/handler-test.js.map +1 -0
- package/lib/esm/module/pageController.mjs +4 -22
- package/lib/esm/module/turnstile.mjs +16 -13
- package/package.json +5 -4
- package/typings.d.ts +5 -40
package/README.md
CHANGED
|
@@ -91,7 +91,7 @@ docker run -i --rm ghcr.io/codeiva4u/real-browser-mcp-server:latest
|
|
|
91
91
|
* **Human-like Interactions**: Integrates **ghost-cursor-patchright** (Bézier curves) to transparently simulate human mouse movements, velocity, and natural hover-before-click behaviors. Features **Physics-based Smooth Scrolling** (`page.realScroll`) utilizing real mouse-wheel events and Cubic Ease-Out deceleration to perfectly mimic manual trackpad/mouse flicks, bypassing advanced behavioral detectors.
|
|
92
92
|
* **Turnstile Auto-Solver**: Seamlessly detects and bypasses Cloudflare Turnstile widgets.
|
|
93
93
|
* **Anti-Race Condition Guards**: Robust state-guards ensure popup blockers, shims, and adblockers attach exactly once per page, preventing context destruction.
|
|
94
|
-
* **
|
|
94
|
+
* **TypeScript**: Entire codebase is written in TypeScript for type safety and maintainability.
|
|
95
95
|
* **Global Persistent Cache**: Internal `CacheManager` saves browser state and extracted data persistently across server restarts to `.cache/browser_state.json`.
|
|
96
96
|
|
|
97
97
|
---
|
|
@@ -109,7 +109,7 @@ Add the following to your `claude_desktop_config.json`:
|
|
|
109
109
|
"real-browser-mcp-server": {
|
|
110
110
|
"command": "node",
|
|
111
111
|
"args": [
|
|
112
|
-
"c:/Users/Admin/Desktop/Software/Real-Browser-Mcp-Server/src/index.js"
|
|
112
|
+
"c:/Users/Admin/Desktop/Software/Real-Browser-Mcp-Server/dist/src/index.js"
|
|
113
113
|
],
|
|
114
114
|
"env": {
|
|
115
115
|
"HEADLESS": "false"
|
|
@@ -125,7 +125,7 @@ Add the following to your `claude_desktop_config.json`:
|
|
|
125
125
|
3. Configure as follows:
|
|
126
126
|
* **Name**: `real-browser-mcp-server`
|
|
127
127
|
* **Type**: `command`
|
|
128
|
-
* **Command**: `node c:/Users/Admin/Desktop/Software/Real-Browser-Mcp-Server/src/index.js`
|
|
128
|
+
* **Command**: `node c:/Users/Admin/Desktop/Software/Real-Browser-Mcp-Server/dist/src/index.js`
|
|
129
129
|
4. Click **Save**.
|
|
130
130
|
|
|
131
131
|
### 3. Cline / Roo Code (VS Code)
|
|
@@ -138,7 +138,7 @@ Add the server entry to your global MCP settings file (typically found at `%APPD
|
|
|
138
138
|
"type": "stdio",
|
|
139
139
|
"command": "C:/Program Files/nodejs/node.exe",
|
|
140
140
|
"args": [
|
|
141
|
-
"c:/Users/Admin/Desktop/Software/Real-Browser-Mcp-Server/src/index.js"
|
|
141
|
+
"c:/Users/Admin/Desktop/Software/Real-Browser-Mcp-Server/dist/src/index.js"
|
|
142
142
|
],
|
|
143
143
|
"env": {
|
|
144
144
|
"HEADLESS": "false"
|
|
@@ -160,7 +160,7 @@ Configure the server in your `~/.codeium/windsurf/mcp_config.json`:
|
|
|
160
160
|
"real-browser-mcp-server": {
|
|
161
161
|
"command": "node",
|
|
162
162
|
"args": [
|
|
163
|
-
"c:/Users/Admin/Desktop/Software/Real-Browser-Mcp-Server/src/index.js"
|
|
163
|
+
"c:/Users/Admin/Desktop/Software/Real-Browser-Mcp-Server/dist/src/index.js"
|
|
164
164
|
],
|
|
165
165
|
"env": {
|
|
166
166
|
"HEADLESS": "false"
|
|
@@ -171,7 +171,7 @@ Configure the server in your `~/.codeium/windsurf/mcp_config.json`:
|
|
|
171
171
|
```
|
|
172
172
|
|
|
173
173
|
### 5. PearAI
|
|
174
|
-
Add the
|
|
174
|
+
Add the configuration via **PearAI Settings** ➔ **MCP Servers** using the standard `command` setup pointing to `node` and the built entrypoint at `dist/src/index.js`.
|
|
175
175
|
|
|
176
176
|
### 6. OpenCode AI IDE
|
|
177
177
|
Configure the server in your `opencode.jsonc` or standard MCP settings configuration:
|
|
@@ -182,7 +182,7 @@ Configure the server in your `opencode.jsonc` or standard MCP settings configura
|
|
|
182
182
|
"real-browser-mcp-server": {
|
|
183
183
|
"command": "node",
|
|
184
184
|
"args": [
|
|
185
|
-
"c:/Users/Admin/Desktop/Software/Real-Browser-Mcp-Server/src/index.js"
|
|
185
|
+
"c:/Users/Admin/Desktop/Software/Real-Browser-Mcp-Server/dist/src/index.js"
|
|
186
186
|
],
|
|
187
187
|
"env": {
|
|
188
188
|
"HEADLESS": "false"
|
|
@@ -196,25 +196,25 @@ Configure the server in your `opencode.jsonc` or standard MCP settings configura
|
|
|
196
196
|
|
|
197
197
|
## 🌐 Complete MCP Tool Reference (21 Tools)
|
|
198
198
|
|
|
199
|
-
The server exposes 21
|
|
199
|
+
The server exposes 21 tools categorized into functional units:
|
|
200
200
|
|
|
201
201
|
### 🌐 Browser & Session
|
|
202
202
|
| Tool Name | Description | Parameters |
|
|
203
203
|
|:---|:---|:---|
|
|
204
204
|
| `browser_init` | Initialize Brave/Patchright browser with stealth, ad blocker, and turnstile bypass. | `headless` (boolean), `proxy` (object) |
|
|
205
|
-
| `browser_close` | Close browser with cleanup and session saving. |
|
|
205
|
+
| `browser_close` | Close browser with cleanup and session saving. | `force` (boolean), `saveSession` (boolean) |
|
|
206
206
|
|
|
207
207
|
### 🧭 Navigation
|
|
208
208
|
| Tool Name | Description | Parameters |
|
|
209
209
|
|:---|:---|:---|
|
|
210
|
-
| `navigate` | Navigate to URL with smart retry and configurable wait strategy. | `url` (string), `
|
|
210
|
+
| `navigate` | Navigate to URL with smart retry and configurable wait strategy. | `url` (string), `waitUntil` (string), `timeout` (number), `retries` (number) |
|
|
211
211
|
|
|
212
212
|
### 👆 Human-like Interaction
|
|
213
213
|
| Tool Name | Description | Parameters |
|
|
214
214
|
|:---|:---|:---|
|
|
215
215
|
| `click` | Human-like click using ghost cursor and iframe support. | `selector` (string), `hoverFirst` (boolean) |
|
|
216
216
|
| `type` | Type text with human speed variation, smart clearing, and iframe support. | `selector` (string), `text` (string) |
|
|
217
|
-
| `solve_captcha` |
|
|
217
|
+
| `solve_captcha` | Solves Turnstile directly and returns OCR/vision guidance for image CAPTCHAs. reCAPTCHA/hCaptcha are detected honestly but not solved automatically. | `type` (string), `captchaSelector` (string) |
|
|
218
218
|
| `random_scroll` | Simulated human scrolling with natural patterns and lazy-load triggers. | `direction` (string), `amount` (number), `smooth` (boolean) |
|
|
219
219
|
| `press_key` | Press keyboard keys with modifier key support (Ctrl/Shift/Alt). | `key` (string), `modifiers` (array) |
|
|
220
220
|
| `execute_js` | Run custom asynchronous/synchronous JavaScript inside a page or iframe. | `code` (string), `iframeIndex` (number) |
|
|
@@ -223,42 +223,41 @@ The server exposes 21 highly optimized tools categorized into functional units:
|
|
|
223
223
|
| Tool Name | Description | Parameters |
|
|
224
224
|
|:---|:---|:---|
|
|
225
225
|
| `get_content` | Retrieve page content in `html`, `text`, `markdown`, or direct `rawHttp` modes. | `format` (string) |
|
|
226
|
-
| `extract_data` | Advanced
|
|
227
|
-
| `media_extractor` | Capture and control HLS, DASH, JWPlayer, Plyr, or dynamic streaming content. | `action` (string), `
|
|
226
|
+
| `extract_data` | Advanced extractor for regex, JSON, metadata, structured data, deobfuscation, API discovery, and decrypt flows. | `type` (string), `source` (string) |
|
|
227
|
+
| `media_extractor` | Capture and control HLS, DASH, JWPlayer, Plyr, or dynamic streaming content. | `action` (string), `types` (array), `quality` (string) |
|
|
228
228
|
|
|
229
229
|
### 📡 Network & Utilities
|
|
230
230
|
| Tool Name | Description | Parameters |
|
|
231
231
|
|:---|:---|:---|
|
|
232
232
|
| `redirect_tracer` | Trace complete redirect chains (HTTP 301/302, JS location, meta refresh). | `url` (string) |
|
|
233
|
-
| `network_recorder` | Capture
|
|
234
|
-
| `deep_analysis` | Detailed analysis of DOM structure, scripts, anti-bots, and
|
|
235
|
-
| `wait` | Smart delay
|
|
236
|
-
| `progress_tracker` | Track running automation progress with AI-estimated remaining times. | `
|
|
233
|
+
| `network_recorder` | Capture requests, responses, intercepted APIs, GraphQL payloads, WebSockets, and media URLs. | `action` (string), `captureXhrBody` (boolean) |
|
|
234
|
+
| `deep_analysis` | Detailed analysis of DOM structure, scripts, anti-bots, stack, and page signals. | `types` (array) |
|
|
235
|
+
| `wait` | Smart delay for selectors, navigation, or fixed timeout. | `type` (string), `value` (string) |
|
|
236
|
+
| `progress_tracker` | Track running automation progress with AI-estimated remaining times. | `taskName` (string), `progress` (number) |
|
|
237
237
|
| `storage_inspector` | Inspect IndexedDB and Service Workers natively via JS. | None |
|
|
238
|
-
| `replay_request` | Replay a captured API request directly in the browser context (bypasses CORS). | `
|
|
238
|
+
| `replay_request` | Replay a captured API request directly in the browser context (bypasses CORS). | `url` (string), `method` (string) |
|
|
239
239
|
| `api_analyzer` | Generate schemas, diff JSONs, and create SDK boilerplates (Python/TypeScript). | `action` (string), `data` (string) |
|
|
240
240
|
|
|
241
241
|
### 👁️ AI Vision (Eyes)
|
|
242
242
|
| Tool Name | Description | Parameters |
|
|
243
243
|
|:---|:---|:---|
|
|
244
|
-
| `see_page` | Lets the AI **visually SEE** the page like human eyes: returns
|
|
244
|
+
| `see_page` | Lets the AI **visually SEE** the page like human eyes: returns a screenshot image plus a text JSON summary and a visual map of visible interactive elements. | `fullPage` (boolean), `format` (png/jpeg) |
|
|
245
|
+
|
|
246
|
+
If the current model cannot consume images, `see_page` still returns a text summary, and `solve_captcha` can return text-only fallback guidance when called with `preferTextFallback: true`.
|
|
245
247
|
|
|
246
248
|
---
|
|
247
249
|
|
|
248
250
|
## 📈 Evasion Performance & Test Coverage
|
|
249
251
|
|
|
250
|
-
Our test suites
|
|
252
|
+
Our test suites cover several real-world bot and fingerprinting pages, plus a fast MCP smoke test. Results still depend on IP reputation, third-party site changes, and network conditions.
|
|
251
253
|
|
|
252
254
|
| Target Test Platform | Detection Type | Status |
|
|
253
255
|
|:---|:---|:---|
|
|
254
|
-
| **DrissionPage Detector** | Bot / Automation framework detection | ✅ Pass |
|
|
255
256
|
| **Sannysoft WebDriver** | WebDriver/navigator properties check | ✅ Pass |
|
|
256
257
|
| **Cloudflare WAF** | Web Application Firewall challenge | ✅ Pass |
|
|
257
258
|
| **Cloudflare Turnstile** | Advanced CAPTCHA widget solver | ✅ Pass |
|
|
258
259
|
| **FingerprintJS Bot Detector** | Fingerprint-based bot detection | ✅ Pass |
|
|
259
|
-
| **
|
|
260
|
-
| **reCAPTCHA v3 Score** | Google Trust Score test (Passed with > 0.9) | ✅ Pass |
|
|
261
|
-
| **CreepJS Fingerprinting** | Advanced trust rating and fingerprint check | ✅ Pass |
|
|
260
|
+
| **reCAPTCHA v3 Score** | Google Trust Score test (target: not obviously bot-like) | ✅ Environment-dependent |
|
|
262
261
|
| **Pixelscan Fingerprint** | Masque & Canvas fingerprint masking check | ✅ Pass (No Masking Detected) |
|
|
263
262
|
|
|
264
263
|
### 🧪 Local Test Suite Execution Status
|
|
@@ -267,32 +266,20 @@ Both the CommonJS and ES Module test suites execute and pass successfully under
|
|
|
267
266
|
|
|
268
267
|
| Test Suite / Environment | Test Case | Status |
|
|
269
268
|
|:---|:---|:---|
|
|
270
|
-
| **CommonJS (`cjs_test`)** | DrissionPage Detector | ✅ Passed |
|
|
271
269
|
| **CommonJS (`cjs_test`)** | Sannysoft WebDriver Detector | ✅ Passed |
|
|
272
270
|
| **CommonJS (`cjs_test`)** | Cloudflare WAF | ✅ Passed |
|
|
273
271
|
| **CommonJS (`cjs_test`)** | Cloudflare Turnstile | ✅ Passed |
|
|
274
272
|
| **CommonJS (`cjs_test`)** | Fingerprint JS Bot Detector | ✅ Passed |
|
|
275
273
|
| **CommonJS (`cjs_test`)** | Recaptcha V3 Score | ✅ Passed |
|
|
276
274
|
| **CommonJS (`cjs_test`)** | Pixelscan Fingerprint Check | ✅ Passed |
|
|
277
|
-
| **CommonJS (`cjs_test`)** | Human-like Move & Click | ✅ Passed |
|
|
278
|
-
| **CommonJS (`cjs_test`)** | Human-like Typing | ✅ Passed |
|
|
279
|
-
| **CommonJS (`cjs_test`)** | Human-like Scrolling | ✅ Passed |
|
|
280
|
-
| **CommonJS (`cjs_test`)** | Form Automation Demonstration | ✅ Passed |
|
|
281
|
-
| **CommonJS (`cjs_test`)** | Content Strategy Demonstration | ✅ Passed |
|
|
282
|
-
| **ES Module (`esm_test`)** | DrissionPage Detector | ✅ Passed |
|
|
283
275
|
| **ES Module (`esm_test`)** | Sannysoft WebDriver Detector | ✅ Passed |
|
|
284
276
|
| **ES Module (`esm_test`)** | Cloudflare WAF | ✅ Passed |
|
|
285
277
|
| **ES Module (`esm_test`)** | Cloudflare Turnstile | ✅ Passed |
|
|
286
278
|
| **ES Module (`esm_test`)** | Fingerprint JS Bot Detector | ✅ Passed |
|
|
287
279
|
| **ES Module (`esm_test`)** | Recaptcha V3 Score | ✅ Passed |
|
|
288
280
|
| **ES Module (`esm_test`)** | Pixelscan Fingerprint Check | ✅ Passed |
|
|
289
|
-
| **
|
|
290
|
-
| **
|
|
291
|
-
| **ES Module (`esm_test`)** | Human-like Scrolling | ✅ Passed |
|
|
292
|
-
| **ES Module (`esm_test`)** | Form Automation Demonstration | ✅ Passed |
|
|
293
|
-
| **ES Module (`esm_test`)** | Content Strategy Demonstration | ✅ Passed |
|
|
294
|
-
|
|
295
|
-
---
|
|
281
|
+
| **MCP Smoke (`mcp_test`)** | Tool Registry Check | ✅ Passed |
|
|
282
|
+
| **MCP Smoke (`mcp_test`)** | JSON-RPC Initialize Handshake | ✅ Passed |
|
|
296
283
|
|
|
297
284
|
---
|
|
298
285
|
|
|
@@ -352,8 +339,8 @@ Run these scripts from the project root directory:
|
|
|
352
339
|
| `npm run dev` | Alias to start the MCP server. |
|
|
353
340
|
| `npm run mcp` | Start the MCP server. |
|
|
354
341
|
| `npm run mcp:verbose` | Start the MCP server with verbose logging on `stderr`. |
|
|
355
|
-
| `npm run list` |
|
|
356
|
-
| `npm run build` |
|
|
342
|
+
| `npm run list` | List all registered MCP tools with categories. |
|
|
343
|
+
| `npm run build` | Compile TypeScript into the `dist/` folder. |
|
|
357
344
|
| `npm test` | Execute the full test suite (CJS & ESM). |
|
|
358
345
|
| `npm run cjs_test` | Run CommonJS test scripts. |
|
|
359
346
|
| `npm run esm_test` | Run ECMAScript Module test scripts. |
|
|
@@ -361,6 +348,24 @@ Run these scripts from the project root directory:
|
|
|
361
348
|
|
|
362
349
|
---
|
|
363
350
|
|
|
351
|
+
## 🏗️ Architecture Notes
|
|
352
|
+
|
|
353
|
+
### Design
|
|
354
|
+
|
|
355
|
+
- **MCP-first**: every tool is defined in `src/shared/tools.ts` and dispatched through a single `executeTool()` router.
|
|
356
|
+
- **Handler modules**: `src/mcp/handlers/` contains focused helper files (`network-recorder.ts`, `network-extractors.ts`, `vision-captcha.ts`, `vision-see-page.ts`) with thin wrapper files (`network.ts`, `vision.ts`) for the tool-facing API.
|
|
357
|
+
- **Browser state**: a single global `state` object in `src/mcp/handlers/state.ts` holds the current browser/page instance and network recorder data. `createSessionContext()` provides a typed accessor pattern for handlers.
|
|
358
|
+
- **Persistent cache**: `src/shared/cache-manager.ts` and `src/shared/activity-logger.ts` survive server restarts via JSON files on disk.
|
|
359
|
+
|
|
360
|
+
### Known Limitations
|
|
361
|
+
|
|
362
|
+
- **Single-session model**: the MCP server manages one browser instance at a time. Concurrent multi-session isolation is not supported.
|
|
363
|
+
- **reCAPTCHA / hCaptcha**: detected honestly but not solved automatically. Use a third-party service for these.
|
|
364
|
+
- **Vision tools require image-capable models**: `see_page` and `solve_captcha` return images. Non-vision models get a text JSON summary fallback, but image reading itself requires a multimodal client.
|
|
365
|
+
- **TypeScript strict mode**: the project compiles with `strict: true`, though some legacy bridge files still use `@ts-nocheck`.
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
364
369
|
## 🛡️ License
|
|
365
370
|
|
|
366
|
-
This project is licensed under the **
|
|
371
|
+
This project is licensed under the **MIT License**. Created and maintained by [codeiva4u](https://github.com/codeiva4u).
|
package/dist/lib/cjs/index.d.ts
CHANGED
|
@@ -1,2 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
declare const connect: ({ args, headless, proxy, contextOptions, turnstile, executablePath, }?: {
|
|
2
|
+
args?: never[] | undefined;
|
|
3
|
+
headless?: boolean | undefined;
|
|
4
|
+
proxy?: any;
|
|
5
|
+
contextOptions?: {} | undefined;
|
|
6
|
+
turnstile?: boolean | undefined;
|
|
7
|
+
executablePath?: undefined;
|
|
8
|
+
}) => Promise<{
|
|
9
|
+
browser: import("patchright-core").Browser;
|
|
10
|
+
page: import("patchright-core").Page;
|
|
11
|
+
blocker: any;
|
|
12
|
+
setupPage: (p: any) => Promise<void>;
|
|
13
|
+
}>;
|
|
14
|
+
export { connect };
|
|
2
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/cjs/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/cjs/index.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,OAAO;;;;;;;;;;;;EAAgC,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/lib/cjs/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
3
|
+
exports.connect = void 0;
|
|
4
|
+
const pageController_1 = require("./module/pageController");
|
|
5
|
+
const lib_core_1 = require("../../src/shared/lib-core");
|
|
6
|
+
const connect = (0, lib_core_1.createConnect)(pageController_1.pageController);
|
|
7
|
+
exports.connect = connect;
|
|
6
8
|
module.exports = { connect };
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/cjs/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/cjs/index.ts"],"names":[],"mappings":";;;AAAA,4DAAyD;AACzD,wDAA0D;AAE1D,MAAM,OAAO,GAAG,IAAA,wBAAa,EAAC,+BAAc,CAAC,CAAC;AAErC,0BAAO;AAChB,MAAM,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageController.d.ts","sourceRoot":"","sources":["../../../../lib/cjs/module/pageController.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pageController.d.ts","sourceRoot":"","sources":["../../../../lib/cjs/module/pageController.ts"],"names":[],"mappings":"AAEA,iBAAe,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAAE,OAAO,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,gBA+C7H;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
3
|
+
exports.pageController = pageController;
|
|
4
|
+
const turnstile_1 = require("./turnstile");
|
|
4
5
|
async function pageController({ browser, page, proxy, turnstile }) {
|
|
5
6
|
if (page._pageControllerApplied)
|
|
6
7
|
return page;
|
|
@@ -11,15 +12,13 @@ async function pageController({ browser, page, proxy, turnstile }) {
|
|
|
11
12
|
});
|
|
12
13
|
async function turnstileSolver() {
|
|
13
14
|
while (solveStatus) {
|
|
14
|
-
await checkTurnstile({ page }).catch(() => { });
|
|
15
|
+
await (0, turnstile_1.checkTurnstile)({ page }).catch(() => { });
|
|
15
16
|
await new Promise(r => setTimeout(r, 1000));
|
|
16
17
|
}
|
|
17
|
-
return;
|
|
18
18
|
}
|
|
19
19
|
if (solveStatus) {
|
|
20
20
|
turnstileSolver();
|
|
21
21
|
}
|
|
22
|
-
// === POPUP AD BLOCKING ===
|
|
23
22
|
const context = page.context();
|
|
24
23
|
if (!context._popupBlockerApplied) {
|
|
25
24
|
context._popupBlockerApplied = true;
|
|
@@ -40,29 +39,11 @@ async function pageController({ browser, page, proxy, turnstile }) {
|
|
|
40
39
|
}
|
|
41
40
|
}
|
|
42
41
|
}
|
|
43
|
-
catch (
|
|
42
|
+
catch (_e) {
|
|
44
43
|
// Ignore errors
|
|
45
44
|
}
|
|
46
45
|
});
|
|
47
46
|
}
|
|
48
|
-
// NOTE: JS stealth overrides are commented out because Patchright natively handles automation hiding.
|
|
49
|
-
// Manual JS overrides trigger Pixelscan fingerprint masking detectors.
|
|
50
|
-
/*
|
|
51
|
-
await page.addInitScript(() => {
|
|
52
|
-
// ========== HARDWARE CONCURRENCY & DEVICE MEMORY FIX ==========
|
|
53
|
-
Object.defineProperty(navigator, 'hardwareConcurrency', {
|
|
54
|
-
get: () => 8,
|
|
55
|
-
configurable: true
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
if ('deviceMemory' in navigator) {
|
|
59
|
-
Object.defineProperty(navigator, 'deviceMemory', {
|
|
60
|
-
get: () => 8,
|
|
61
|
-
configurable: true
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
*/
|
|
66
47
|
return page;
|
|
67
48
|
}
|
|
68
49
|
module.exports = { pageController };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageController.js","sourceRoot":"","sources":["../../../../lib/cjs/module/pageController.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"pageController.js","sourceRoot":"","sources":["../../../../lib/cjs/module/pageController.ts"],"names":[],"mappings":";;AAmDS,wCAAc;AAnDvB,2CAA6C;AAE7C,KAAK,UAAU,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAA+D;IAC1H,IAAI,IAAI,CAAC,sBAAsB;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAEnC,IAAI,WAAW,GAAG,SAAS,CAAC;IAE5B,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,WAAW,GAAG,KAAK,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,eAAe;QAC1B,OAAO,WAAW,EAAE,CAAC;YACjB,MAAM,IAAA,0BAAc,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAChD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;QAChC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACpC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,OAAY,EAAE,EAAE;YACtC,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;gBACtC,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAG,GAAG,KAAK,aAAa;wBACnC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAClB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACnB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;wBACrB,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;wBACxB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC1B,IAAI,SAAS,EAAE,CAAC;wBACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;wBACvC,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC7E,CAAC;gBACL,CAAC;YACL,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACV,gBAAgB;YACpB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAGD,MAAM,CAAC,OAAO,GAAG,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turnstile.d.ts","sourceRoot":"","sources":["../../../../lib/cjs/module/turnstile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"turnstile.d.ts","sourceRoot":"","sources":["../../../../lib/cjs/module/turnstile.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,cAAc,GAAU,UAAU;IAAE,IAAI,EAAE,GAAG,CAAA;CAAE,KAAG,OAAO,CAAC,OAAO,CAiEtE,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkTurnstile = void 0;
|
|
3
4
|
const checkTurnstile = async ({ page }) => {
|
|
4
5
|
try {
|
|
5
6
|
const elements = await page.locator('[name="cf-turnstile-response"]').all();
|
|
@@ -12,29 +13,29 @@ const checkTurnstile = async ({ page }) => {
|
|
|
12
13
|
if (!isChallenge)
|
|
13
14
|
return false;
|
|
14
15
|
const coordinates = await page.evaluate(() => {
|
|
15
|
-
let
|
|
16
|
+
let coords = [];
|
|
16
17
|
document.querySelectorAll('div').forEach(item => {
|
|
17
18
|
try {
|
|
18
19
|
let itemCoordinates = item.getBoundingClientRect();
|
|
19
20
|
let itemCss = window.getComputedStyle(item);
|
|
20
|
-
if (itemCss.margin
|
|
21
|
-
|
|
21
|
+
if (itemCss.margin === "0px" && itemCss.padding === "0px" && itemCoordinates.width > 290 && itemCoordinates.width <= 310 && !item.querySelector('*')) {
|
|
22
|
+
coords.push({ x: itemCoordinates.x, y: item.getBoundingClientRect().y, w: item.getBoundingClientRect().width, h: item.getBoundingClientRect().height });
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
|
-
catch (
|
|
25
|
+
catch (_err) { }
|
|
25
26
|
});
|
|
26
|
-
if (
|
|
27
|
+
if (coords.length <= 0) {
|
|
27
28
|
document.querySelectorAll('div').forEach(item => {
|
|
28
29
|
try {
|
|
29
30
|
let itemCoordinates = item.getBoundingClientRect();
|
|
30
31
|
if (itemCoordinates.width > 290 && itemCoordinates.width <= 310 && !item.querySelector('*')) {
|
|
31
|
-
|
|
32
|
+
coords.push({ x: itemCoordinates.x, y: item.getBoundingClientRect().y, w: item.getBoundingClientRect().width, h: item.getBoundingClientRect().height });
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
|
-
catch (
|
|
35
|
+
catch (_err) { }
|
|
35
36
|
});
|
|
36
37
|
}
|
|
37
|
-
return
|
|
38
|
+
return coords;
|
|
38
39
|
});
|
|
39
40
|
for (const item of coordinates) {
|
|
40
41
|
try {
|
|
@@ -42,14 +43,13 @@ const checkTurnstile = async ({ page }) => {
|
|
|
42
43
|
let y = item.y + item.h / 2;
|
|
43
44
|
await page.mouse.click(x, y);
|
|
44
45
|
}
|
|
45
|
-
catch (
|
|
46
|
+
catch (_err) { }
|
|
46
47
|
}
|
|
47
48
|
return true;
|
|
48
49
|
}
|
|
49
50
|
for (const element of elements) {
|
|
50
51
|
try {
|
|
51
|
-
|
|
52
|
-
const box = await element.evaluate(el => {
|
|
52
|
+
const box = await element.evaluate((el) => {
|
|
53
53
|
const parent = el.parentElement;
|
|
54
54
|
if (!parent)
|
|
55
55
|
return null;
|
|
@@ -62,13 +62,14 @@ const checkTurnstile = async ({ page }) => {
|
|
|
62
62
|
await page.mouse.click(x, y);
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
catch (
|
|
65
|
+
catch (_err) { }
|
|
66
66
|
}
|
|
67
67
|
return true;
|
|
68
68
|
}
|
|
69
|
-
catch (
|
|
69
|
+
catch (_err) {
|
|
70
70
|
return false;
|
|
71
71
|
}
|
|
72
72
|
};
|
|
73
|
+
exports.checkTurnstile = checkTurnstile;
|
|
73
74
|
module.exports = { checkTurnstile };
|
|
74
75
|
//# sourceMappingURL=turnstile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turnstile.js","sourceRoot":"","sources":["../../../../lib/cjs/module/turnstile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"turnstile.js","sourceRoot":"","sources":["../../../../lib/cjs/module/turnstile.ts"],"names":[],"mappings":";;;AAAA,MAAM,cAAc,GAAG,KAAK,EAAE,EAAE,IAAI,EAAiB,EAAoB,EAAE;IACvE,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC5E,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACzC,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;oBACxC,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAC,KAAK,IAAI;oBACnD,QAAQ,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;YAC5D,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,WAAW;gBAAE,OAAO,KAAK,CAAC;YAE/B,MAAM,WAAW,GAAwD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;gBAC9F,IAAI,MAAM,GAAwD,EAAE,CAAC;gBACrE,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBAC5C,IAAI,CAAC;wBACD,IAAI,eAAe,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;wBACnD,IAAI,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;wBAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,IAAI,eAAe,CAAC,KAAK,GAAG,GAAG,IAAI,eAAe,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;4BACnJ,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;wBAC5J,CAAC;oBACL,CAAC;oBAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;gBACtB,CAAC,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBACrB,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;wBAC5C,IAAI,CAAC;4BACD,IAAI,eAAe,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;4BACnD,IAAI,eAAe,CAAC,KAAK,GAAG,GAAG,IAAI,eAAe,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;gCAC1F,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;4BAC5J,CAAC;wBACL,CAAC;wBAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;oBACtB,CAAC,CAAC,CAAC;gBACP,CAAC;gBACD,OAAO,MAAM,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACD,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;oBACpB,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC5B,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjC,CAAC;gBAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;YACtB,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAO,EAAE,EAAE;oBAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC;oBAChC,IAAI,CAAC,MAAM;wBAAE,OAAO,IAAI,CAAC;oBACzB,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;oBAC5C,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC5E,CAAC,CAAC,CAAC;gBACH,IAAI,GAAG,EAAE,CAAC;oBACN,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;oBACnB,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC/B,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjC,CAAC;YACL,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,IAAI,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AAEO,wCAAc;AACvB,MAAM,CAAC,OAAO,GAAG,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const connect: ({ args, headless, proxy, contextOptions, turnstile, executablePath, }? | undefined;
|
|
2
|
+
turnstile? | undefined;
|
|
3
|
+
executablePath?;
|
|
4
|
+
}) => Promise<{
|
|
5
|
+
browser: import("patchright-core").Browser;
|
|
6
|
+
page: import("patchright-core").Page;
|
|
7
|
+
blocker;
|
|
8
|
+
setupPage: (p) => Promise<void>;
|
|
9
|
+
}>;
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-esm.d.ts","sourceRoot":"","sources":["../../scripts/generate-esm.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const cjsDir = path.join(__dirname, '..', 'lib', 'cjs');
|
|
39
|
+
const esmDir = path.join(__dirname, '..', 'lib', 'esm');
|
|
40
|
+
function convertCjsToEsm(content, _filename) {
|
|
41
|
+
let out = content;
|
|
42
|
+
out = out.replace(/\/\/ @ts-nocheck\n/g, '');
|
|
43
|
+
out = out.replace(/export\s*\{\s*\};\n/g, '');
|
|
44
|
+
out = out.replace(/^export\s*\{[^}]+\};?\s*$/gm, '');
|
|
45
|
+
const moduleExportsMatch = out.match(/module\.exports\s*=\s*\{\s*([^}]+)\s*\};/);
|
|
46
|
+
const exportedNames = moduleExportsMatch
|
|
47
|
+
? moduleExportsMatch[1].split(',').map((n) => n.trim()).filter(Boolean)
|
|
48
|
+
: [];
|
|
49
|
+
out = out.replace(/const\s+\{\s*([^}]+)\s*\}\s*=\s*require\(([^)]+)\);/g, (_, names, mod) => {
|
|
50
|
+
let modPath = mod.replace(/['"]/g, '');
|
|
51
|
+
if (modPath.endsWith('.js'))
|
|
52
|
+
modPath = modPath.replace(/\.js$/, '.mjs');
|
|
53
|
+
return `import { ${names.trim()} } from '${modPath}';`;
|
|
54
|
+
});
|
|
55
|
+
out = out.replace(/from\s+'(\.[^']+)'/g, (match, modPath) => {
|
|
56
|
+
if (modPath.endsWith('.mjs'))
|
|
57
|
+
return match;
|
|
58
|
+
return `from '${modPath}.mjs'`;
|
|
59
|
+
});
|
|
60
|
+
out = out.replace(/module\.exports\s*=\s*\{\s*[^}]+\s*\};/g, '');
|
|
61
|
+
for (const name of exportedNames) {
|
|
62
|
+
const fnRegex = new RegExp(`^(\\s*)async function ${name}\\(`, 'gm');
|
|
63
|
+
out = out.replace(fnRegex, `$1export async function ${name}(`);
|
|
64
|
+
const constRegex = new RegExp(`^(\\s*)const ${name}\\s*=\\s*async`, 'gm');
|
|
65
|
+
out = out.replace(constRegex, `$1export const ${name} = async`);
|
|
66
|
+
}
|
|
67
|
+
out = out.replace(/:\s*\{[^}]*\}/g, '');
|
|
68
|
+
out = out.replace(/:\s*Promise<[^>]*>/g, '');
|
|
69
|
+
out = out.replace(/:\s*Array<[^>]*>/g, '');
|
|
70
|
+
out = out.replace(/:\s*(string|number|boolean|any|void|null|undefined)\b/g, '');
|
|
71
|
+
out = out.replace(/\)\s*:\s*\w+/g, ')');
|
|
72
|
+
out = out.replace(/as\s+(any|string|number|boolean)\b/g, '');
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
function processDir(cjsSubDir, esmSubDir) {
|
|
76
|
+
if (!fs.existsSync(esmSubDir))
|
|
77
|
+
fs.mkdirSync(esmSubDir, { recursive: true });
|
|
78
|
+
for (const entry of fs.readdirSync(cjsSubDir, { withFileTypes: true })) {
|
|
79
|
+
const cjsPath = path.join(cjsSubDir, entry.name);
|
|
80
|
+
const esmName = entry.name.replace(/\.ts$/, '.mjs');
|
|
81
|
+
const esmPath = path.join(esmSubDir, esmName);
|
|
82
|
+
if (entry.isDirectory()) {
|
|
83
|
+
processDir(cjsPath, esmPath);
|
|
84
|
+
}
|
|
85
|
+
else if (entry.name.endsWith('.ts')) {
|
|
86
|
+
const content = fs.readFileSync(cjsPath, 'utf-8');
|
|
87
|
+
const esm = convertCjsToEsm(content, entry.name);
|
|
88
|
+
fs.writeFileSync(esmPath, esm);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
processDir(cjsDir, esmDir);
|
|
93
|
+
const indexEsm = `import { pageController } from "./module/pageController.mjs";
|
|
94
|
+
import { createConnect } from "../../dist/src/shared/lib-core.js";
|
|
95
|
+
|
|
96
|
+
export const connect = createConnect(pageController);
|
|
97
|
+
`;
|
|
98
|
+
fs.writeFileSync(path.join(esmDir, 'index.mjs'), indexEsm);
|
|
99
|
+
console.log('✅ ESM files auto-generated from CJS source');
|
|
100
|
+
//# sourceMappingURL=generate-esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-esm.js","sourceRoot":"","sources":["../../scripts/generate-esm.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AA0GH,OAAO,EAAE,CAAA"}
|