@poe-platform/safe-bash 0.1.640 → 0.1.641
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/safe-bash/commands/playwright/index.d.ts.map +1 -1
- package/dist/safe-bash/commands/playwright/index.js +9 -1
- package/dist/safe-bash/commands/playwright/index.js.map +1 -1
- package/dist/safe-bash/playwright/abilities.d.ts +40 -0
- package/dist/safe-bash/playwright/abilities.d.ts.map +1 -0
- package/dist/safe-bash/playwright/abilities.js +43 -0
- package/dist/safe-bash/playwright/abilities.js.map +1 -0
- package/dist/safe-bash/playwright/ability-execution.d.ts +10 -0
- package/dist/safe-bash/playwright/ability-execution.d.ts.map +1 -0
- package/dist/safe-bash/playwright/ability-execution.js +126 -0
- package/dist/safe-bash/playwright/ability-execution.js.map +1 -0
- package/dist/safe-bash/playwright/builtins.d.ts +61 -0
- package/dist/safe-bash/playwright/builtins.d.ts.map +1 -0
- package/dist/safe-bash/playwright/builtins.js +23 -0
- package/dist/safe-bash/playwright/builtins.js.map +1 -0
- package/dist/safe-bash/playwright/catalog.d.ts +19 -0
- package/dist/safe-bash/playwright/catalog.d.ts.map +1 -0
- package/dist/safe-bash/playwright/catalog.js +35 -0
- package/dist/safe-bash/playwright/catalog.js.map +1 -0
- package/dist/safe-bash/playwright/command-reference.d.ts +584 -0
- package/dist/safe-bash/playwright/command-reference.d.ts.map +1 -0
- package/dist/safe-bash/playwright/command-reference.js +712 -0
- package/dist/safe-bash/playwright/command-reference.js.map +1 -0
- package/dist/safe-bash/playwright/controller.d.ts +3 -0
- package/dist/safe-bash/playwright/controller.d.ts.map +1 -1
- package/dist/safe-bash/playwright/controller.js +68 -9
- package/dist/safe-bash/playwright/controller.js.map +1 -1
- package/dist/safe-bash/playwright/help.d.ts +3 -60
- package/dist/safe-bash/playwright/help.d.ts.map +1 -1
- package/dist/safe-bash/playwright/help.js +48 -50
- package/dist/safe-bash/playwright/help.js.map +1 -1
- package/dist/safe-bash/playwright/index.d.ts +2 -0
- package/dist/safe-bash/playwright/index.d.ts.map +1 -1
- package/dist/safe-bash/playwright/index.js +1 -0
- package/dist/safe-bash/playwright/index.js.map +1 -1
- package/dist/safe-bash/playwright/invocation.d.ts +6 -4
- package/dist/safe-bash/playwright/invocation.d.ts.map +1 -1
- package/dist/safe-bash/playwright/invocation.js +106 -74
- package/dist/safe-bash/playwright/invocation.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/playwright/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACzG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAIpE,MAAM,MAAM,oBAAoB,GAAG,2BAA2B,GAAG;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhG,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/playwright/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACzG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAIpE,MAAM,MAAM,oBAAoB,GAAG,2BAA2B,GAAG;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhG,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CA2CzI;AAED,cAAc,2BAA2B,CAAC"}
|
|
@@ -12,7 +12,7 @@ export function createPlaywrightCli(options = {}) {
|
|
|
12
12
|
setup(host) {
|
|
13
13
|
host.commands.register({
|
|
14
14
|
name: 'playwright-cli',
|
|
15
|
-
description: '
|
|
15
|
+
description: 'Playwright commands selected and implemented by injected client abilities',
|
|
16
16
|
async execute(context) {
|
|
17
17
|
try {
|
|
18
18
|
await controller.run({
|
|
@@ -20,6 +20,14 @@ export function createPlaywrightCli(options = {}) {
|
|
|
20
20
|
env: context.env,
|
|
21
21
|
signal: context.signal,
|
|
22
22
|
registerCleanup: context.registerCleanup,
|
|
23
|
+
readArtifact: async (filename, maxBytes) => {
|
|
24
|
+
context.signal.throwIfAborted();
|
|
25
|
+
const path = resolvePath(context.cwd, filename);
|
|
26
|
+
const bytes = await context.fs.readFile(path, { signal: context.signal, maxBytes });
|
|
27
|
+
if (bytes.byteLength > maxBytes)
|
|
28
|
+
throw new Error('Artifact byte limit exceeded');
|
|
29
|
+
return bytes;
|
|
30
|
+
},
|
|
23
31
|
writeArtifact: async (bytes, filename) => {
|
|
24
32
|
context.signal.throwIfAborted();
|
|
25
33
|
if (filename === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/playwright/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAoC,MAAM,2BAA2B,CAAC;AAEzG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAInD,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,UAAgC,EAAE;IACpE,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;IACzI,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,UAAU,GAAG,0BAA0B,CAAC,iBAAiB,CAAC,CAAC;IACjE,MAAM,MAAM,GAAuB;QACjC,IAAI,EAAE,gBAAgB;QACtB,KAAK,CAAC,IAAI;YACR,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACrB,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/playwright/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { PlaywrightContext, PlaywrightElementHandle, PlaywrightPage } from './adapter.js';
|
|
2
|
+
import { type PlaywrightCommand, type PlaywrightCommandDefinition } from './catalog.js';
|
|
3
|
+
import { type PlaywrightBuiltinCommand } from './builtins.js';
|
|
4
|
+
export interface PlaywrightAbilityRequest {
|
|
5
|
+
readonly command: PlaywrightCommand;
|
|
6
|
+
readonly session: string;
|
|
7
|
+
readonly args: readonly string[];
|
|
8
|
+
readonly options: Readonly<Record<string, string | boolean | readonly string[]>>;
|
|
9
|
+
readonly signal: AbortSignal;
|
|
10
|
+
readonly browserSession?: {
|
|
11
|
+
readonly context: PlaywrightContext;
|
|
12
|
+
readonly page: PlaywrightPage | undefined;
|
|
13
|
+
resolveTarget(ref: string): Promise<PlaywrightElementHandle>;
|
|
14
|
+
selectPage(page: PlaywrightPage): Promise<void>;
|
|
15
|
+
registerCleanup(cleanup: () => Promise<void>): void;
|
|
16
|
+
};
|
|
17
|
+
write(text: string): Promise<void>;
|
|
18
|
+
readFile(filename: string): Promise<Uint8Array>;
|
|
19
|
+
writeArtifact(bytes: Uint8Array, filename?: string): Promise<void>;
|
|
20
|
+
registerCleanup(cleanup: () => Promise<void>): void;
|
|
21
|
+
}
|
|
22
|
+
export interface PlaywrightAbility {
|
|
23
|
+
readonly options?: readonly string[] | 'all';
|
|
24
|
+
readonly scope?: 'client' | 'session';
|
|
25
|
+
readonly limitations?: string;
|
|
26
|
+
execute(request: PlaywrightAbilityRequest): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
export type PlaywrightAbilities = {
|
|
29
|
+
readonly [Command in PlaywrightCommand]?: PlaywrightAbility | (Command extends PlaywrightBuiltinCommand ? true : never);
|
|
30
|
+
};
|
|
31
|
+
export interface RegisteredPlaywrightAbility {
|
|
32
|
+
readonly execute?: (request: PlaywrightAbilityRequest) => Promise<void>;
|
|
33
|
+
readonly scope: 'client' | 'session';
|
|
34
|
+
readonly arity: readonly [number, number];
|
|
35
|
+
readonly options: PlaywrightCommandDefinition['options'];
|
|
36
|
+
readonly limitations?: string;
|
|
37
|
+
readonly details?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function registerPlaywrightAbilities(abilities: PlaywrightAbilities | undefined, hasAdapter: boolean): ReadonlyMap<PlaywrightCommand, RegisteredPlaywrightAbility>;
|
|
40
|
+
//# sourceMappingURL=abilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abilities.d.ts","sourceRoot":"","sources":["../../src/playwright/abilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/F,OAAO,EAA4B,KAAK,iBAAiB,EAAE,KAAK,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAClH,OAAO,EAA2C,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEvG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IACjF,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE;QACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;QACpC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,CAAC;QAC1C,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAC7D,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,eAAe,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KACrD,CAAC;IACF,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,eAAe,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,KAAK,CAAC;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,OAAO,IAAI,iBAAiB,CAAC,CAAC,EAAE,iBAAiB,GAAG,CAAC,OAAO,SAAS,wBAAwB,GAAG,IAAI,GAAG,KAAK,CAAC;CACxH,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC,SAAS,CAAC,CAAC;IACzD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,mBAAmB,GAAG,SAAS,EAAE,UAAU,EAAE,OAAO,GAAG,WAAW,CAAC,iBAAiB,EAAE,2BAA2B,CAAC,CA6BxK"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { playwrightCommandCatalog } from './catalog.js';
|
|
2
|
+
import { playwrightBuiltinCommands, limitedForms } from './builtins.js';
|
|
3
|
+
const builtinOptions = {
|
|
4
|
+
open: ['browser', 'headed', 'headless'], snapshot: ['filename'], screenshot: ['filename', 'full-page'],
|
|
5
|
+
};
|
|
6
|
+
export function registerPlaywrightAbilities(abilities, hasAdapter) {
|
|
7
|
+
if (abilities !== undefined && (!abilities || typeof abilities !== 'object' || Array.isArray(abilities)))
|
|
8
|
+
throw new TypeError('Invalid Playwright abilities');
|
|
9
|
+
const entries = abilities === undefined
|
|
10
|
+
? Object.keys(playwrightBuiltinCommands).filter(command => hasAdapter || ['list', 'close', 'close-all'].includes(command)).map(command => [command, true])
|
|
11
|
+
: Object.entries(abilities);
|
|
12
|
+
const registered = new Map();
|
|
13
|
+
for (const [name, ability] of entries) {
|
|
14
|
+
if (!Object.hasOwn(playwrightCommandCatalog, name))
|
|
15
|
+
throw new TypeError(`Unknown Playwright ability: ${name}`);
|
|
16
|
+
const command = name;
|
|
17
|
+
const definition = playwrightCommandCatalog[command];
|
|
18
|
+
if (ability === true) {
|
|
19
|
+
if (!Object.hasOwn(playwrightBuiltinCommands, name))
|
|
20
|
+
throw new TypeError(`No built-in Playwright ability: ${name}`);
|
|
21
|
+
if (!hasAdapter && !['list', 'close', 'close-all'].includes(name))
|
|
22
|
+
throw new TypeError(`An injected Playwright adapter is required for ${name}`);
|
|
23
|
+
const builtin = name;
|
|
24
|
+
const metadata = playwrightBuiltinCommands[builtin];
|
|
25
|
+
const options = Object.fromEntries((builtinOptions[builtin] ?? []).map(flag => [flag, definition.options[flag] ?? { type: 'boolean', description: 'run browser in headless mode' }]));
|
|
26
|
+
registered.set(command, Object.freeze({ scope: 'session', arity: Object.freeze(metadata.arity.map(value => value - 1)), options: Object.freeze(options), details: metadata.details, ...(limitedForms[builtin] ? { limitations: limitedForms[builtin] } : {}) }));
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (!ability || typeof ability !== 'object' || Array.isArray(ability) || typeof ability.execute !== 'function'
|
|
30
|
+
|| Object.keys(ability).some(key => !['execute', 'scope', 'options', 'limitations'].includes(key))
|
|
31
|
+
|| ability.scope !== undefined && !['client', 'session'].includes(ability.scope)
|
|
32
|
+
|| ability.limitations !== undefined && (typeof ability.limitations !== 'string' || !ability.limitations.trim()))
|
|
33
|
+
throw new TypeError(`Invalid Playwright ability: ${name}`);
|
|
34
|
+
if (ability.scope === 'session' && !hasAdapter)
|
|
35
|
+
throw new TypeError(`An injected Playwright adapter is required for ${name}`);
|
|
36
|
+
const flags = ability.options === 'all' ? Object.keys(definition.options) : ability.options ?? [];
|
|
37
|
+
if (!Array.isArray(flags) || flags.some(flag => typeof flag !== 'string' || !Object.hasOwn(definition.options, flag)) || new Set(flags).size !== flags.length)
|
|
38
|
+
throw new TypeError(`Invalid Playwright ability options: ${name}`);
|
|
39
|
+
registered.set(command, Object.freeze({ execute: ability.execute.bind(ability), scope: ability.scope ?? 'client', arity: definition.arity, options: Object.freeze(Object.fromEntries(flags.map(flag => [flag, definition.options[flag]]))), ...(ability.limitations === undefined ? {} : { limitations: ability.limitations }) }));
|
|
40
|
+
}
|
|
41
|
+
return registered;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=abilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abilities.js","sourceRoot":"","sources":["../../src/playwright/abilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PlaywrightAbilityRequest, RegisteredPlaywrightAbility } from './abilities.js';
|
|
2
|
+
import type { ParsedInvocation, PlaywrightInvocation } from './invocation.js';
|
|
3
|
+
export declare function executePlaywrightAbility(ability: RegisteredPlaywrightAbility, parsed: ParsedInvocation, invocation: PlaywrightInvocation, context: {
|
|
4
|
+
readonly signal: AbortSignal;
|
|
5
|
+
readonly maxCommandBytes: number;
|
|
6
|
+
readonly maxArtifactBytes: number;
|
|
7
|
+
readonly browserSession?: PlaywrightAbilityRequest['browserSession'];
|
|
8
|
+
check(): void;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=ability-execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ability-execution.d.ts","sourceRoot":"","sources":["../../src/playwright/ability-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAE5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,2BAA2B,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,oBAAoB,EAAE,OAAO,EAAE;IACxJ,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IACrE,KAAK,IAAI,IAAI,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FhB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
export async function executePlaywrightAbility(ability, parsed, invocation, context) {
|
|
2
|
+
let accepting = true;
|
|
3
|
+
let bytesUsed = 0;
|
|
4
|
+
const pending = [];
|
|
5
|
+
const cleanups = new Set();
|
|
6
|
+
const check = () => {
|
|
7
|
+
context.check();
|
|
8
|
+
if (!accepting)
|
|
9
|
+
throw new Error('Playwright ability invocation has finished');
|
|
10
|
+
};
|
|
11
|
+
const admitBytes = (bytes) => {
|
|
12
|
+
if (bytes > context.maxCommandBytes - bytesUsed)
|
|
13
|
+
throw new Error('Playwright command byte limit exceeded');
|
|
14
|
+
bytesUsed += bytes;
|
|
15
|
+
};
|
|
16
|
+
const track = (action) => {
|
|
17
|
+
const operation = Promise.resolve().then(action);
|
|
18
|
+
pending.push(operation);
|
|
19
|
+
void operation.catch(() => { });
|
|
20
|
+
return operation;
|
|
21
|
+
};
|
|
22
|
+
const filenameCheck = (filename) => {
|
|
23
|
+
if (typeof filename !== 'string' || !filename || filename.includes('\0'))
|
|
24
|
+
throw new TypeError('Invalid virtual artifact filename');
|
|
25
|
+
};
|
|
26
|
+
const browserSession = context.browserSession;
|
|
27
|
+
const request = Object.freeze({
|
|
28
|
+
command: parsed.command, session: parsed.session, args: parsed.args, options: parsed.options, signal: context.signal,
|
|
29
|
+
...(browserSession ? { browserSession: Object.freeze({
|
|
30
|
+
context: browserSession.context,
|
|
31
|
+
page: browserSession.page,
|
|
32
|
+
resolveTarget(ref) {
|
|
33
|
+
check();
|
|
34
|
+
return track(async () => {
|
|
35
|
+
context.check();
|
|
36
|
+
const target = await browserSession.resolveTarget(ref);
|
|
37
|
+
context.check();
|
|
38
|
+
return target;
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
selectPage(page) {
|
|
42
|
+
check();
|
|
43
|
+
return track(async () => { context.check(); await browserSession.selectPage(page); context.check(); });
|
|
44
|
+
},
|
|
45
|
+
registerCleanup(cleanup) {
|
|
46
|
+
check();
|
|
47
|
+
if (typeof cleanup !== 'function')
|
|
48
|
+
throw new TypeError('Invalid Playwright session cleanup');
|
|
49
|
+
browserSession.registerCleanup(cleanup);
|
|
50
|
+
},
|
|
51
|
+
}) } : {}),
|
|
52
|
+
write(text) {
|
|
53
|
+
check();
|
|
54
|
+
if (typeof text !== 'string')
|
|
55
|
+
throw new TypeError('Playwright output must be text');
|
|
56
|
+
if (text.length > context.maxCommandBytes - bytesUsed)
|
|
57
|
+
throw new Error('Playwright command byte limit exceeded');
|
|
58
|
+
admitBytes(new TextEncoder().encode(text).byteLength);
|
|
59
|
+
return track(async () => { context.check(); await invocation.write(text); context.check(); });
|
|
60
|
+
},
|
|
61
|
+
readFile(filename) {
|
|
62
|
+
check();
|
|
63
|
+
filenameCheck(filename);
|
|
64
|
+
if (!invocation.readArtifact)
|
|
65
|
+
throw new Error('Virtual artifact input unsupported');
|
|
66
|
+
return track(async () => {
|
|
67
|
+
context.check();
|
|
68
|
+
const bytes = await invocation.readArtifact(filename, Math.min(context.maxArtifactBytes, context.maxCommandBytes - bytesUsed));
|
|
69
|
+
if (!(bytes instanceof Uint8Array))
|
|
70
|
+
throw new TypeError('Artifact input must return bytes');
|
|
71
|
+
if (bytes.byteLength > context.maxArtifactBytes)
|
|
72
|
+
throw new Error('Artifact byte limit exceeded');
|
|
73
|
+
admitBytes(bytes.byteLength);
|
|
74
|
+
context.check();
|
|
75
|
+
return new Uint8Array(bytes);
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
writeArtifact(bytes, filename) {
|
|
79
|
+
check();
|
|
80
|
+
if (!(bytes instanceof Uint8Array))
|
|
81
|
+
throw new TypeError('Artifact output must be bytes');
|
|
82
|
+
if (bytes.byteLength > context.maxArtifactBytes)
|
|
83
|
+
throw new Error('Artifact byte limit exceeded');
|
|
84
|
+
if (filename !== undefined)
|
|
85
|
+
filenameCheck(filename);
|
|
86
|
+
if (!invocation.writeArtifact)
|
|
87
|
+
throw new Error('Artifact byte destination unsupported');
|
|
88
|
+
admitBytes(bytes.byteLength);
|
|
89
|
+
const owned = new Uint8Array(bytes);
|
|
90
|
+
return track(async () => { context.check(); await invocation.writeArtifact(owned, filename); context.check(); });
|
|
91
|
+
},
|
|
92
|
+
registerCleanup(cleanup) {
|
|
93
|
+
check();
|
|
94
|
+
if (typeof cleanup !== 'function')
|
|
95
|
+
throw new TypeError('Invalid Playwright ability cleanup');
|
|
96
|
+
cleanups.add(cleanup);
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
const failures = [];
|
|
100
|
+
try {
|
|
101
|
+
context.check();
|
|
102
|
+
await ability.execute(request);
|
|
103
|
+
context.check();
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
failures.push(error);
|
|
107
|
+
}
|
|
108
|
+
accepting = false;
|
|
109
|
+
const effects = await Promise.allSettled(pending);
|
|
110
|
+
const retired = await Promise.allSettled([...cleanups].map(cleanup => Promise.resolve().then(cleanup)));
|
|
111
|
+
for (const result of [...effects, ...retired])
|
|
112
|
+
if (result.status === 'rejected' && !failures.includes(result.reason))
|
|
113
|
+
failures.push(result.reason);
|
|
114
|
+
try {
|
|
115
|
+
context.check();
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
if (!failures.includes(error))
|
|
119
|
+
failures.push(error);
|
|
120
|
+
}
|
|
121
|
+
if (failures.length === 1)
|
|
122
|
+
throw failures[0];
|
|
123
|
+
if (failures.length)
|
|
124
|
+
throw new AggregateError(failures, 'Playwright ability execution and cleanup failed');
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=ability-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ability-execution.js","sourceRoot":"","sources":["../../src/playwright/ability-execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export declare const playwrightBuiltinCommands: {
|
|
2
|
+
readonly open: {
|
|
3
|
+
readonly arity: readonly [1, 2];
|
|
4
|
+
readonly details: "--browser <chromium|firefox|webkit> selects an injected engine (default: chromium).\n--headed or --headless selects the mode (default: headless); host support is required.";
|
|
5
|
+
};
|
|
6
|
+
readonly goto: {
|
|
7
|
+
readonly arity: readonly [2, 2];
|
|
8
|
+
readonly details: "Navigation accepts http:, https:, and about:blank. It invalidates snapshot refs.";
|
|
9
|
+
};
|
|
10
|
+
readonly list: {
|
|
11
|
+
readonly arity: readonly [1, 1];
|
|
12
|
+
readonly details: "Lists sessions owned by this controller. States: acquiring, open, closing, closed.";
|
|
13
|
+
};
|
|
14
|
+
readonly close: {
|
|
15
|
+
readonly arity: readonly [1, 1];
|
|
16
|
+
readonly details: "Closes the selected owned session. Closing an absent session is safe; use open to start it again.";
|
|
17
|
+
};
|
|
18
|
+
readonly 'close-all': {
|
|
19
|
+
readonly arity: readonly [1, 1];
|
|
20
|
+
readonly details: "Closes sessions owned by this controller, not unrelated host browsers.";
|
|
21
|
+
};
|
|
22
|
+
readonly snapshot: {
|
|
23
|
+
readonly arity: readonly [1, 1];
|
|
24
|
+
readonly details: "--filename <path> writes UTF-8 snapshot text to the virtual filesystem instead of stdout.\nUse the emitted refs (for example e1) with click/fill; snapshot again after changes.\nA new snapshot, navigation or tab change invalidates old refs. Byte/ref limits apply.";
|
|
25
|
+
};
|
|
26
|
+
readonly click: {
|
|
27
|
+
readonly arity: readonly [2, 2];
|
|
28
|
+
readonly details: "The target must still be connected to the current page.";
|
|
29
|
+
};
|
|
30
|
+
readonly fill: {
|
|
31
|
+
readonly arity: readonly [3, 3];
|
|
32
|
+
readonly details: "Quote text containing spaces; use -- before literal arguments beginning with -.";
|
|
33
|
+
};
|
|
34
|
+
readonly press: {
|
|
35
|
+
readonly arity: readonly [2, 2];
|
|
36
|
+
readonly details: "Acts on the selected tab through the injected keyboard capability.";
|
|
37
|
+
};
|
|
38
|
+
readonly screenshot: {
|
|
39
|
+
readonly arity: readonly [1, 1];
|
|
40
|
+
readonly details: "--filename <path.png|path.jpg|path.jpeg> writes to the virtual filesystem.\nWithout --filename, raw PNG bytes go to stdout; use shell redirection.\n--full-page captures the whole page instead of the viewport. Byte limits apply.";
|
|
41
|
+
};
|
|
42
|
+
readonly 'tab-list': {
|
|
43
|
+
readonly arity: readonly [1, 1];
|
|
44
|
+
readonly details: "Tabs have zero-based indexes; the selected tab is marked selected.";
|
|
45
|
+
};
|
|
46
|
+
readonly 'tab-new': {
|
|
47
|
+
readonly arity: readonly [1, 2];
|
|
48
|
+
readonly details: "Opens and selects a tab, defaulting to about:blank. The host tab limit applies.";
|
|
49
|
+
};
|
|
50
|
+
readonly 'tab-select': {
|
|
51
|
+
readonly arity: readonly [2, 2];
|
|
52
|
+
readonly details: "Use tab-list to discover indexes. Selecting a tab invalidates snapshot refs.";
|
|
53
|
+
};
|
|
54
|
+
readonly 'tab-close': {
|
|
55
|
+
readonly arity: readonly [1, 2];
|
|
56
|
+
readonly details: "Closes the selected tab when no index is given. Use tab-list to discover remaining tabs.";
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
export type PlaywrightBuiltinCommand = keyof typeof playwrightBuiltinCommands;
|
|
60
|
+
export declare const limitedForms: Partial<Record<PlaywrightBuiltinCommand, string>>;
|
|
61
|
+
//# sourceMappingURL=builtins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../../src/playwright/builtins.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAe5B,CAAC;AAEX,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,yBAAyB,CAAC;AAE9E,eAAO,MAAM,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAK1E,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const playwrightBuiltinCommands = {
|
|
2
|
+
open: { arity: [1, 2], details: '--browser <chromium|firefox|webkit> selects an injected engine (default: chromium).\n--headed or --headless selects the mode (default: headless); host support is required.' },
|
|
3
|
+
goto: { arity: [2, 2], details: 'Navigation accepts http:, https:, and about:blank. It invalidates snapshot refs.' },
|
|
4
|
+
list: { arity: [1, 1], details: 'Lists sessions owned by this controller. States: acquiring, open, closing, closed.' },
|
|
5
|
+
close: { arity: [1, 1], details: 'Closes the selected owned session. Closing an absent session is safe; use open to start it again.' },
|
|
6
|
+
'close-all': { arity: [1, 1], details: 'Closes sessions owned by this controller, not unrelated host browsers.' },
|
|
7
|
+
snapshot: { arity: [1, 1], details: '--filename <path> writes UTF-8 snapshot text to the virtual filesystem instead of stdout.\nUse the emitted refs (for example e1) with click/fill; snapshot again after changes.\nA new snapshot, navigation or tab change invalidates old refs. Byte/ref limits apply.' },
|
|
8
|
+
click: { arity: [2, 2], details: 'The target must still be connected to the current page.' },
|
|
9
|
+
fill: { arity: [3, 3], details: 'Quote text containing spaces; use -- before literal arguments beginning with -.' },
|
|
10
|
+
press: { arity: [2, 2], details: 'Acts on the selected tab through the injected keyboard capability.' },
|
|
11
|
+
screenshot: { arity: [1, 1], details: '--filename <path.png|path.jpg|path.jpeg> writes to the virtual filesystem.\nWithout --filename, raw PNG bytes go to stdout; use shell redirection.\n--full-page captures the whole page instead of the viewport. Byte limits apply.' },
|
|
12
|
+
'tab-list': { arity: [1, 1], details: 'Tabs have zero-based indexes; the selected tab is marked selected.' },
|
|
13
|
+
'tab-new': { arity: [1, 2], details: 'Opens and selects a tab, defaulting to about:blank. The host tab limit applies.' },
|
|
14
|
+
'tab-select': { arity: [2, 2], details: 'Use tab-list to discover indexes. Selecting a tab invalidates snapshot refs.' },
|
|
15
|
+
'tab-close': { arity: [1, 2], details: 'Closes the selected tab when no index is given. Use tab-list to discover remaining tabs.' },
|
|
16
|
+
};
|
|
17
|
+
export const limitedForms = {
|
|
18
|
+
click: 'click: <target> must be an issued snapshot ref; the optional button argument is unsupported.',
|
|
19
|
+
fill: 'fill: <target> must be an issued snapshot ref, not a selector or text target.',
|
|
20
|
+
snapshot: 'snapshot: the optional target argument is unsupported; only full-page snapshots are available.',
|
|
21
|
+
screenshot: 'screenshot: the optional target argument is unsupported; element screenshots are unavailable.',
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=builtins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../src/playwright/builtins.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,6KAA6K,EAAE;IAC/M,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,kFAAkF,EAAE;IACpH,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,oFAAoF,EAAE;IACtH,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,mGAAmG,EAAE;IACtI,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,wEAAwE,EAAE;IACjH,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,wQAAwQ,EAAE;IAC9S,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,yDAAyD,EAAE;IAC5F,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,iFAAiF,EAAE;IACnH,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,oEAAoE,EAAE;IACvG,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,qOAAqO,EAAE;IAC7Q,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,oEAAoE,EAAE;IAC5G,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,iFAAiF,EAAE;IACxH,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,8EAA8E,EAAE;IACxH,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,0FAA0F,EAAE;CAC3H,CAAC;AAIX,MAAM,CAAC,MAAM,YAAY,GAAsD;IAC7E,KAAK,EAAE,8FAA8F;IACrG,IAAI,EAAE,+EAA+E;IACrF,QAAQ,EAAE,gGAAgG;IAC1G,UAAU,EAAE,+FAA+F;CAC5G,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { playwrightCommandReference } from './command-reference.js';
|
|
2
|
+
export type PlaywrightCommand = keyof typeof playwrightCommandReference;
|
|
3
|
+
export type PlaywrightOptionType = 'string' | 'boolean';
|
|
4
|
+
export interface PlaywrightCommandDefinition {
|
|
5
|
+
readonly usage: string;
|
|
6
|
+
readonly description: string;
|
|
7
|
+
readonly section: string;
|
|
8
|
+
readonly referenceLine: string;
|
|
9
|
+
readonly arguments: readonly string[];
|
|
10
|
+
readonly arity: readonly [number, number];
|
|
11
|
+
readonly options: Readonly<Record<string, {
|
|
12
|
+
readonly type: PlaywrightOptionType;
|
|
13
|
+
readonly description: string;
|
|
14
|
+
readonly repeatable?: boolean;
|
|
15
|
+
readonly optionalValue?: boolean;
|
|
16
|
+
}>>;
|
|
17
|
+
}
|
|
18
|
+
export declare const playwrightCommandCatalog: Readonly<Record<PlaywrightCommand, PlaywrightCommandDefinition>>;
|
|
19
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/playwright/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAGpE,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,0BAA0B,CAAC;AACxE,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;CACpL;AA4BD,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,CAAC,CAA+I,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { playwrightCommandReference } from './command-reference.js';
|
|
2
|
+
import { playwrightHelpReference } from './help-reference.js';
|
|
3
|
+
const definitions = {};
|
|
4
|
+
for (const [name, reference] of Object.entries(playwrightCommandReference)) {
|
|
5
|
+
const usage = reference.help.split('\n')[0].slice('playwright-cli '.length).trimEnd();
|
|
6
|
+
const args = usage.split(' ').slice(1).filter(Boolean);
|
|
7
|
+
let section = 'Additional commands';
|
|
8
|
+
let referenceLine = '';
|
|
9
|
+
let currentSection = '';
|
|
10
|
+
for (const line of playwrightHelpReference.split('\n')) {
|
|
11
|
+
if (line.endsWith(':'))
|
|
12
|
+
currentSection = line.slice(0, -1);
|
|
13
|
+
if (line.startsWith(' ') && line.trimStart().split(' ')[0] === name) {
|
|
14
|
+
section = currentSection;
|
|
15
|
+
referenceLine = line;
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const description = referenceLine ? referenceLine.trimStart().slice(usage.length).trimStart() : reference.help.split('\n')[2] ?? '';
|
|
20
|
+
const options = {};
|
|
21
|
+
for (const [flag, type] of Object.entries(reference.flags)) {
|
|
22
|
+
const line = reference.help.split('\n').find(line => line.trimStart().split(' ')[0] === `--${flag}`);
|
|
23
|
+
options[flag] = Object.freeze({ type, description: line?.trimStart().slice(flag.length + 2).trimStart() ?? '', repeatable: line?.includes('(repeatable)') ?? false, optionalValue: name === 'attach' && flag === 'extension' || name === 'install' && flag === 'skills' });
|
|
24
|
+
}
|
|
25
|
+
definitions[name] = Object.freeze({
|
|
26
|
+
usage, description, section, referenceLine: referenceLine || ` ${usage.padEnd(28)}${description}`,
|
|
27
|
+
arguments: Object.freeze([...reference.args]),
|
|
28
|
+
arity: Object.freeze([args.filter(arg => arg.startsWith('<')).length, args.some(arg => arg.includes('...')) ? Infinity : args.length]),
|
|
29
|
+
options: Object.freeze(options),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const visible = playwrightHelpReference.split('\n').filter(line => line.startsWith(' ') && !line.trimStart().startsWith('--')).map(line => line.trimStart().split(' ')[0]);
|
|
33
|
+
const ordered = [...visible, ...Object.keys(definitions).filter(name => !visible.includes(name))];
|
|
34
|
+
export const playwrightCommandCatalog = Object.freeze(Object.fromEntries(ordered.map(name => [name, definitions[name]])));
|
|
35
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/playwright/catalog.ts"],"names":[],"mappings":"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"}
|