chore: wire forked playwright-core into workspace
This commit is contained in:
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "playwright"]
|
||||||
|
path = playwright
|
||||||
|
url = https://github.com/remorses/playwright.git
|
||||||
+72
-6
@@ -175,14 +175,80 @@ if the problem was in the ws server you can restart that yourself killing proces
|
|||||||
|
|
||||||
to run the cli locally with your current changes call `tsx playwriter/src/cli.ts -e ...`. also make sure you kill process on 19988 first to make sure to use the latest relay executor code.
|
to run the cli locally with your current changes call `tsx playwriter/src/cli.ts -e ...`. also make sure you kill process on 19988 first to make sure to use the latest relay executor code.
|
||||||
|
|
||||||
## playwright source code
|
## playwright fork (@xmorse/playwright-core)
|
||||||
|
|
||||||
the playwright source code is cloned at `./tmp/playwright` (gitignored). use Task agents to explore it when you need to understand how playwright implements CDP commands, page discovery, browser connection, etc. key files:
|
we maintain a fork of playwright-core at `./playwright` as a git submodule. this allows us to expose frame-level CDP access (targetId/sessionId) that upstream playwright doesn't provide.
|
||||||
|
|
||||||
- `packages/playwright-core/src/server/chromium/` - chromium-specific CDP implementation
|
### submodule setup
|
||||||
- `packages/playwright-core/src/server/chromium/crConnection.ts` - CDP websocket connection
|
|
||||||
- `packages/playwright-core/src/server/chromium/crBrowser.ts` - browser and page discovery
|
the playwright submodule should always stay on branch `playwriter`. never switch to main or other branches.
|
||||||
- `packages/playwright-core/src/server/chromium/chromium.ts` - connectOverCDP implementation
|
|
||||||
|
```bash
|
||||||
|
# check current branch
|
||||||
|
cd playwright && git branch
|
||||||
|
|
||||||
|
# if not on playwriter branch
|
||||||
|
git checkout playwriter
|
||||||
|
```
|
||||||
|
|
||||||
|
### bootstrapping the repo
|
||||||
|
|
||||||
|
after cloning this repo, run bootstrap to set up the playwright submodule:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm bootstrap
|
||||||
|
```
|
||||||
|
|
||||||
|
this does:
|
||||||
|
1. `git submodule update --init` - init the playwright submodule
|
||||||
|
2. `pnpm install` - install deps and link workspace packages
|
||||||
|
3. `node playwright/utils/generate_injected.js` - generate browser scripts to `src/generated/`
|
||||||
|
4. `node playwright/packages/playwright-core/build.mjs` - transpile (0.1s)
|
||||||
|
|
||||||
|
### rebuilding after changes
|
||||||
|
|
||||||
|
after modifying playwright-core source:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm playwright:build # 0.1s
|
||||||
|
```
|
||||||
|
|
||||||
|
### how the simplified build works
|
||||||
|
|
||||||
|
upstream playwright bundles all dependencies into single files (zero runtime deps). we skip this by using direct dependencies instead:
|
||||||
|
|
||||||
|
**1. dependencies in package.json** - ws, debug, pngjs, commander, etc. are regular deps
|
||||||
|
|
||||||
|
**2. rewritten bundle files** - `playwright/packages/playwright-core/src/utilsBundle.ts`, `zipBundle.ts`, `mcpBundle.ts` import directly:
|
||||||
|
```ts
|
||||||
|
// before (bundled)
|
||||||
|
export const ws = require('./utilsBundleImpl').ws;
|
||||||
|
|
||||||
|
// after (direct)
|
||||||
|
import wsLibrary from 'ws';
|
||||||
|
export const ws = wsLibrary;
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. simple build script** (`playwright/packages/playwright-core/build.mjs`) - just esbuild transpile + copy vendored files:
|
||||||
|
```bash
|
||||||
|
# transpile src/**/*.ts → lib/**/*.js (0.1s)
|
||||||
|
# copy third_party/lockfile.js, third_party/extract-zip.js
|
||||||
|
```
|
||||||
|
|
||||||
|
**4. generated files** - `playwright/packages/playwright-core/src/generated/*.ts` are browser scripts created by `playwright/utils/generate_injected.js`. these only need regenerating if upstream changes injected scripts.
|
||||||
|
|
||||||
|
| | upstream | ours |
|
||||||
|
|---|---|---|
|
||||||
|
| build time | ~30s | 0.1s |
|
||||||
|
| dependencies | 0 (bundled) | ~20 (external) |
|
||||||
|
| trace-viewer | built | skipped |
|
||||||
|
|
||||||
|
### key source files
|
||||||
|
|
||||||
|
- `playwright/packages/playwright-core/src/server/chromium/` - chromium CDP implementation
|
||||||
|
- `playwright/packages/playwright-core/src/server/chromium/crConnection.ts` - CDP websocket connection
|
||||||
|
- `playwright/packages/playwright-core/src/server/chromium/crBrowser.ts` - browser and page discovery
|
||||||
|
- `playwright/packages/playwright-core/src/server/chromium/chromium.ts` - connectOverCDP implementation
|
||||||
|
|
||||||
## ./claude-extension
|
## ./claude-extension
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -8,7 +8,9 @@
|
|||||||
"build": "pnpm --filter playwriter --filter mcp-extension build",
|
"build": "pnpm --filter playwriter --filter mcp-extension build",
|
||||||
"reload": "pnpm --filter playwriter build && pnpm --filter mcp-extension reload",
|
"reload": "pnpm --filter playwriter build && pnpm --filter mcp-extension reload",
|
||||||
"agents.md": "agentsdotmd ./PLAYWRITER_AGENTS.md core.md typescript.md pnpm.md vitest.md changelog.md docs-writing.md github.md playwright.md zod.md gitchamber.md",
|
"agents.md": "agentsdotmd ./PLAYWRITER_AGENTS.md core.md typescript.md pnpm.md vitest.md changelog.md docs-writing.md github.md playwright.md zod.md gitchamber.md",
|
||||||
"release": "pnpm --filter playwriter build && cd extension && PRODUCTION=true pnpm build && cd .. && rm -f extension.zip && cd extension && zip -r ../extension.zip dist && cd .. && realpath extension.zip | pbcopy && open 'https://chrome.google.com/webstore/devconsole/a379d569-9533-44e4-9749-0368f6dbf878/jfeammnjpkecdekppnclgkkffahnhfhe/edit/package'"
|
"release": "pnpm --filter playwriter build && cd extension && PRODUCTION=true pnpm build && cd .. && rm -f extension.zip && cd extension && zip -r ../extension.zip dist && cd .. && realpath extension.zip | pbcopy && open 'https://chrome.google.com/webstore/devconsole/a379d569-9533-44e4-9749-0368f6dbf878/jfeammnjpkecdekppnclgkkffahnhfhe/edit/package'",
|
||||||
|
"bootstrap": "git submodule update --init && pnpm install && node playwright/utils/generate_injected.js && node playwright/packages/playwright-core/build.mjs",
|
||||||
|
"playwright:build": "node playwright/packages/playwright-core/build.mjs"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@changesets/cli": "^2.29.7",
|
"@changesets/cli": "^2.29.7",
|
||||||
|
|||||||
Submodule
+1
Submodule playwright added at c5b09937d4
@@ -53,7 +53,7 @@
|
|||||||
"hono": "^4.10.6",
|
"hono": "^4.10.6",
|
||||||
"kill-port-process": "^3.2.1",
|
"kill-port-process": "^3.2.1",
|
||||||
"picocolors": "^1.1.1",
|
"picocolors": "^1.1.1",
|
||||||
"playwright-core": "^1.56.1",
|
"@xmorse/playwright-core": "workspace:*",
|
||||||
"posthtml": "^0.16.7",
|
"posthtml": "^0.16.7",
|
||||||
"posthtml-beautify": "^0.7.0",
|
"posthtml-beautify": "^0.7.0",
|
||||||
"string-dedent": "^3.0.2",
|
"string-dedent": "^3.0.2",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
||||||
import http from 'node:http'
|
import http from 'node:http'
|
||||||
import net from 'node:net'
|
import net from 'node:net'
|
||||||
import { Page } from 'playwright-core'
|
import { Page } from '@xmorse/playwright-core'
|
||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
import path from 'node:path'
|
import path from 'node:path'
|
||||||
import { getAriaSnapshot } from './aria-snapshot.js'
|
import { getAriaSnapshot } from './aria-snapshot.js'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// Accessibility snapshot pipeline: build raw AX tree, filter to a
|
// Accessibility snapshot pipeline: build raw AX tree, filter to a
|
||||||
// tree (interactive-only, labels/contexts, wrapper hoisting, ignored
|
// tree (interactive-only, labels/contexts, wrapper hoisting, ignored
|
||||||
// indent preservation), then render lines and locators.
|
// indent preservation), then render lines and locators.
|
||||||
import type { Page, Locator, ElementHandle } from 'playwright-core'
|
import type { Page, Locator, ElementHandle } from '@xmorse/playwright-core'
|
||||||
import crypto from 'node:crypto'
|
import crypto from 'node:crypto'
|
||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
import path from 'node:path'
|
import path from 'node:path'
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import WebSocket from 'ws'
|
import WebSocket from 'ws'
|
||||||
import type { Page } from 'playwright-core'
|
import type { Page } from '@xmorse/playwright-core'
|
||||||
import type { ProtocolMapping } from 'devtools-protocol/types/protocol-mapping.js'
|
import type { ProtocolMapping } from 'devtools-protocol/types/protocol-mapping.js'
|
||||||
import type { CDPResponseBase, CDPEventBase } from './cdp-types.js'
|
import type { CDPResponseBase, CDPEventBase } from './cdp-types.js'
|
||||||
import { getCdpUrl } from './utils.js'
|
import { getCdpUrl } from './utils.js'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Page, Locator } from 'playwright-core'
|
import { Page, Locator } from '@xmorse/playwright-core'
|
||||||
import { formatHtmlForPrompt } from './htmlrewrite.js'
|
import { formatHtmlForPrompt } from './htmlrewrite.js'
|
||||||
import { createSmartDiff } from './diff-utils.js'
|
import { createSmartDiff } from './diff-utils.js'
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { Page, Locator } from 'playwright-core'
|
import type { Page, Locator } from '@xmorse/playwright-core'
|
||||||
import type { CDPSession } from './cdp-session.js'
|
import type { CDPSession } from './cdp-session.js'
|
||||||
import type { Debugger } from './debugger.js'
|
import type { Debugger } from './debugger.js'
|
||||||
import type { Editor } from './editor.js'
|
import type { Editor } from './editor.js'
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* Used by both MCP and CLI to execute Playwright code with persistent state.
|
* Used by both MCP and CLI to execute Playwright code with persistent state.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Page, Frame, Browser, BrowserContext, chromium, Locator } from 'playwright-core'
|
import { Page, Frame, Browser, BrowserContext, chromium, Locator } from '@xmorse/playwright-core'
|
||||||
import crypto from 'node:crypto'
|
import crypto from 'node:crypto'
|
||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
import path from 'node:path'
|
import path from 'node:path'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { createMCPClient } from './mcp-client.js'
|
import { createMCPClient } from './mcp-client.js'
|
||||||
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
||||||
import { chromium } from 'playwright-core'
|
import { chromium } from '@xmorse/playwright-core'
|
||||||
import { getCdpUrl } from './utils.js'
|
import { getCdpUrl } from './utils.js'
|
||||||
import { setupTestContext, cleanupTestContext, getExtensionServiceWorker, type TestContext, js } from './test-utils.js'
|
import { setupTestContext, cleanupTestContext, getExtensionServiceWorker, type TestContext, js } from './test-utils.js'
|
||||||
import './test-declarations.js'
|
import './test-declarations.js'
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
import path from 'node:path'
|
import path from 'node:path'
|
||||||
import { fileURLToPath } from 'node:url'
|
import { fileURLToPath } from 'node:url'
|
||||||
import type { Page } from 'playwright-core'
|
import type { Page } from '@xmorse/playwright-core'
|
||||||
import { createSmartDiff } from './diff-utils.js'
|
import { createSmartDiff } from './diff-utils.js'
|
||||||
|
|
||||||
export interface PageMarkdownResult {
|
export interface PageMarkdownResult {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
import path from 'node:path'
|
import path from 'node:path'
|
||||||
import { fileURLToPath } from 'node:url'
|
import { fileURLToPath } from 'node:url'
|
||||||
import type { Page, Locator, ElementHandle } from 'playwright-core'
|
import type { Page, Locator, ElementHandle } from '@xmorse/playwright-core'
|
||||||
import type { ICDPSession, CDPSession } from './cdp-session.js'
|
import type { ICDPSession, CDPSession } from './cdp-session.js'
|
||||||
|
|
||||||
export interface ReactSourceLocation {
|
export interface ReactSourceLocation {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
||||||
import { chromium } from 'playwright-core'
|
import { chromium } from '@xmorse/playwright-core'
|
||||||
import { getCdpUrl } from './utils.js'
|
import { getCdpUrl } from './utils.js'
|
||||||
import { setupTestContext, cleanupTestContext, getExtensionServiceWorker, type TestContext, withTimeout, createSimpleServer } from './test-utils.js'
|
import { setupTestContext, cleanupTestContext, getExtensionServiceWorker, type TestContext, withTimeout, createSimpleServer } from './test-utils.js'
|
||||||
import './test-declarations.js'
|
import './test-declarations.js'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { createMCPClient } from './mcp-client.js'
|
import { createMCPClient } from './mcp-client.js'
|
||||||
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
||||||
import { chromium } from 'playwright-core'
|
import { chromium } from '@xmorse/playwright-core'
|
||||||
import { getCdpUrl } from './utils.js'
|
import { getCdpUrl } from './utils.js'
|
||||||
import { getCDPSessionForPage } from './cdp-session.js'
|
import { getCDPSessionForPage } from './cdp-session.js'
|
||||||
import { Debugger } from './debugger.js'
|
import { Debugger } from './debugger.js'
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import os from 'node:os'
|
import os from 'node:os'
|
||||||
import path from 'node:path'
|
import path from 'node:path'
|
||||||
import type { Page } from 'playwright-core'
|
import type { Page } from '@xmorse/playwright-core'
|
||||||
import type {
|
import type {
|
||||||
StartRecordingResult,
|
StartRecordingResult,
|
||||||
StopRecordingResult,
|
StopRecordingResult,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { createMCPClient } from './mcp-client.js'
|
import { createMCPClient } from './mcp-client.js'
|
||||||
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
||||||
import { chromium } from 'playwright-core'
|
import { chromium } from '@xmorse/playwright-core'
|
||||||
import type { Page } from 'playwright-core'
|
import type { Page } from '@xmorse/playwright-core'
|
||||||
import type { AriaSnapshotNode } from './aria-snapshot.js'
|
import type { AriaSnapshotNode } from './aria-snapshot.js'
|
||||||
import path from 'node:path'
|
import path from 'node:path'
|
||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
@@ -118,7 +118,7 @@ describe('Snapshot & Screenshot Tests', () => {
|
|||||||
"params": {
|
"params": {
|
||||||
"captureBeyondViewport": false,
|
"captureBeyondViewport": false,
|
||||||
"clip": {
|
"clip": {
|
||||||
"height": 528,
|
"height": 581,
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"width": 1280,
|
"width": 1280,
|
||||||
"x": 0,
|
"x": 0,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import type { ICDPSession, CDPSession } from './cdp-session.js'
|
import type { ICDPSession, CDPSession } from './cdp-session.js'
|
||||||
import type { Locator } from 'playwright-core'
|
import type { Locator } from '@xmorse/playwright-core'
|
||||||
|
|
||||||
export interface StyleSource {
|
export interface StyleSource {
|
||||||
url: string
|
url: string
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { exec } from 'node:child_process'
|
|||||||
import { promisify } from 'node:util'
|
import { promisify } from 'node:util'
|
||||||
import http from 'node:http'
|
import http from 'node:http'
|
||||||
import net from 'node:net'
|
import net from 'node:net'
|
||||||
import { chromium, BrowserContext } from 'playwright-core'
|
import { chromium, BrowserContext } from '@xmorse/playwright-core'
|
||||||
import path from 'node:path'
|
import path from 'node:path'
|
||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
import os from 'node:os'
|
import os from 'node:os'
|
||||||
@@ -317,7 +317,7 @@ export function tryJsonParse(str: string) {
|
|||||||
* @param drainDelayMs - Time to wait for pending messages to be processed (default: 50ms)
|
* @param drainDelayMs - Time to wait for pending messages to be processed (default: 50ms)
|
||||||
*/
|
*/
|
||||||
export async function safeCloseCDPBrowser(
|
export async function safeCloseCDPBrowser(
|
||||||
browser: Awaited<ReturnType<typeof import('playwright-core').chromium.connectOverCDP>>,
|
browser: Awaited<ReturnType<typeof import('@xmorse/playwright-core').chromium.connectOverCDP>>,
|
||||||
drainDelayMs = 50
|
drainDelayMs = 50
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
// Wait for any queued message handlers to run
|
// Wait for any queued message handlers to run
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { Page } from 'playwright-core'
|
import type { Page } from '@xmorse/playwright-core'
|
||||||
import { sleep } from './utils.js'
|
import { sleep } from './utils.js'
|
||||||
|
|
||||||
const FILTERED_DOMAINS = [
|
const FILTERED_DOMAINS = [
|
||||||
|
|||||||
Generated
+3279
-159
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,5 @@
|
|||||||
packages:
|
packages:
|
||||||
- ./*
|
- ./*
|
||||||
|
- playwright/packages/playwright-core
|
||||||
|
|
||||||
preferWorkspacePackages: true
|
preferWorkspacePackages: true
|
||||||
|
|||||||
Reference in New Issue
Block a user