@midscene/web 1.12.9-beta-20260917120835.0 → 1.12.9
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/es/bridge-mode/io-client.mjs +1 -1
- package/dist/es/bridge-mode/io-server.mjs +2 -2
- package/dist/es/bridge-mode/io-server.mjs.map +1 -1
- package/dist/es/bridge-mode/page-browser-side.mjs +1 -1
- package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -1
- package/dist/es/cli.mjs +1 -1
- package/dist/es/playwright/test-runner/cookies.mjs +136 -5
- package/dist/es/playwright/test-runner/cookies.mjs.map +1 -1
- package/dist/es/playwright/test-runner/utils.mjs +21 -1
- package/dist/es/playwright/test-runner/utils.mjs.map +1 -1
- package/dist/es/puppeteer/browser-agent.mjs +1 -9
- package/dist/es/puppeteer/browser-agent.mjs.map +1 -1
- package/dist/es/puppeteer/page-agent.mjs +1 -19
- package/dist/es/puppeteer/page-agent.mjs.map +1 -1
- package/dist/lib/bridge-mode/io-client.js +1 -1
- package/dist/lib/bridge-mode/io-server.js +2 -2
- package/dist/lib/bridge-mode/io-server.js.map +1 -1
- package/dist/lib/bridge-mode/page-browser-side.js +1 -1
- package/dist/lib/bridge-mode/page-browser-side.js.map +1 -1
- package/dist/lib/cli.js +1 -1
- package/dist/lib/playwright/test-runner/cookies.js +137 -6
- package/dist/lib/playwright/test-runner/cookies.js.map +1 -1
- package/dist/lib/playwright/test-runner/utils.js +24 -4
- package/dist/lib/playwright/test-runner/utils.js.map +1 -1
- package/dist/lib/puppeteer/browser-agent.js +1 -9
- package/dist/lib/puppeteer/browser-agent.js.map +1 -1
- package/dist/lib/puppeteer/page-agent.js +1 -19
- package/dist/lib/puppeteer/page-agent.js.map +1 -1
- package/dist/types/playwright/test-runner/cookies.d.ts +31 -4
- package/dist/types/playwright/test-runner/types.d.ts +14 -4
- package/dist/types/playwright/test-runner/utils.d.ts +2 -1
- package/dist/types/puppeteer/browser-agent.d.ts +0 -5
- package/dist/types/puppeteer/index.d.ts +1 -1
- package/dist/types/puppeteer/page-agent.d.ts +1 -8
- package/package.json +4 -9
- package/dist/es/common/test-runner/cookies.mjs +0 -133
- package/dist/es/common/test-runner/cookies.mjs.map +0 -1
- package/dist/es/common/test-runner/utils.mjs +0 -24
- package/dist/es/common/test-runner/utils.mjs.map +0 -1
- package/dist/es/puppeteer/test-runner/agent-nodes.mjs +0 -13
- package/dist/es/puppeteer/test-runner/agent-nodes.mjs.map +0 -1
- package/dist/es/puppeteer/test-runner/clear-cookies.mjs +0 -36
- package/dist/es/puppeteer/test-runner/clear-cookies.mjs.map +0 -1
- package/dist/es/puppeteer/test-runner/cookies.mjs +0 -31
- package/dist/es/puppeteer/test-runner/cookies.mjs.map +0 -1
- package/dist/es/puppeteer/test-runner/goto-url.mjs +0 -57
- package/dist/es/puppeteer/test-runner/goto-url.mjs.map +0 -1
- package/dist/es/puppeteer/test-runner/index.mjs +0 -6
- package/dist/es/puppeteer/test-runner/types.mjs +0 -0
- package/dist/es/puppeteer/test-runner/utils.mjs +0 -8
- package/dist/es/puppeteer/test-runner/utils.mjs.map +0 -1
- package/dist/es/puppeteer/test-runner/viewport.mjs +0 -39
- package/dist/es/puppeteer/test-runner/viewport.mjs.map +0 -1
- package/dist/lib/common/test-runner/cookies.js +0 -170
- package/dist/lib/common/test-runner/cookies.js.map +0 -1
- package/dist/lib/common/test-runner/utils.js +0 -61
- package/dist/lib/common/test-runner/utils.js.map +0 -1
- package/dist/lib/puppeteer/test-runner/agent-nodes.js +0 -47
- package/dist/lib/puppeteer/test-runner/agent-nodes.js.map +0 -1
- package/dist/lib/puppeteer/test-runner/clear-cookies.js +0 -73
- package/dist/lib/puppeteer/test-runner/clear-cookies.js.map +0 -1
- package/dist/lib/puppeteer/test-runner/cookies.js +0 -68
- package/dist/lib/puppeteer/test-runner/cookies.js.map +0 -1
- package/dist/lib/puppeteer/test-runner/goto-url.js +0 -94
- package/dist/lib/puppeteer/test-runner/goto-url.js.map +0 -1
- package/dist/lib/puppeteer/test-runner/index.js +0 -54
- package/dist/lib/puppeteer/test-runner/index.js.map +0 -1
- package/dist/lib/puppeteer/test-runner/types.js +0 -20
- package/dist/lib/puppeteer/test-runner/types.js.map +0 -1
- package/dist/lib/puppeteer/test-runner/utils.js +0 -48
- package/dist/lib/puppeteer/test-runner/utils.js.map +0 -1
- package/dist/lib/puppeteer/test-runner/viewport.js +0 -76
- package/dist/lib/puppeteer/test-runner/viewport.js.map +0 -1
- package/dist/types/common/test-runner/cookies.d.ts +0 -51
- package/dist/types/common/test-runner/utils.d.ts +0 -2
- package/dist/types/puppeteer/test-runner/agent-nodes.d.ts +0 -2
- package/dist/types/puppeteer/test-runner/clear-cookies.d.ts +0 -11
- package/dist/types/puppeteer/test-runner/cookies.d.ts +0 -5
- package/dist/types/puppeteer/test-runner/goto-url.d.ts +0 -19
- package/dist/types/puppeteer/test-runner/index.d.ts +0 -10
- package/dist/types/puppeteer/test-runner/types.d.ts +0 -18
- package/dist/types/puppeteer/test-runner/utils.d.ts +0 -3
- package/dist/types/puppeteer/test-runner/viewport.d.ts +0 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer/page-agent.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/puppeteer/page-agent.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\n WebAgentCore,\n resolveBrowserAgentRuntimeOptions,\n} from '@/common/browser-agent';\nimport { applyForceChromeSelectRendering } from '@/common/browser-agent-utils';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport
|
|
1
|
+
{"version":3,"file":"puppeteer/page-agent.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/puppeteer/page-agent.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\n WebAgentCore,\n resolveBrowserAgentRuntimeOptions,\n} from '@/common/browser-agent';\nimport { applyForceChromeSelectRendering } from '@/common/browser-agent-utils';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport { getDebug } from '@midscene/shared/logger';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport { forceClosePopup } from './base-page';\nimport { PuppeteerWebPage } from './page';\n\nconst debug = getDebug('puppeteer:agent');\n\nexport class PuppeteerPageAgent extends WebAgentCore<PuppeteerWebPage> {\n constructor(page: PuppeteerPage, opts?: WebPageAgentOpt) {\n if (!page) {\n throw new Error(\n '[midscene] PuppeteerPageAgent requires a valid Puppeteer page instance. Please make sure to pass a valid page object.',\n );\n }\n const webPage = new PuppeteerWebPage(page, opts);\n super(webPage, opts);\n\n const { forceSameTabNavigation, forceChromeSelectRendering } = opts ?? {};\n const runtimeOptions = resolveBrowserAgentRuntimeOptions({\n agentName: 'PuppeteerPageAgent',\n pageScope: 'page',\n forceSameTabNavigation,\n });\n\n if (runtimeOptions.forceSameTabNavigation) {\n forceClosePopup(page, debug);\n }\n\n applyForceChromeSelectRendering(\n page,\n 'puppeteer',\n forceChromeSelectRendering,\n );\n }\n}\n\nexport { PuppeteerPageAgent as PuppeteerAgent };\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","PuppeteerPageAgent","WebAgentCore","page","opts","Error","webPage","PuppeteerWebPage","forceSameTabNavigation","forceChromeSelectRendering","runtimeOptions","resolveBrowserAgentRuntimeOptions","forceClosePopup","applyForceChromeSelectRendering"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;ACKA,MAAMI,QAAQC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAEhB,MAAMC,2BAA2BC,iCAAAA,YAAYA;IAClD,YAAYC,IAAmB,EAAEC,IAAsB,CAAE;QACvD,IAAI,CAACD,MACH,MAAM,IAAIE,MACR;QAGJ,MAAMC,UAAU,IAAIC,iCAAAA,gBAAgBA,CAACJ,MAAMC;QAC3C,KAAK,CAACE,SAASF;QAEf,MAAM,EAAEI,sBAAsB,EAAEC,0BAA0B,EAAE,GAAGL,QAAQ,CAAC;QACxE,MAAMM,iBAAiBC,AAAAA,IAAAA,iCAAAA,iCAAAA,AAAAA,EAAkC;YACvD,WAAW;YACX,WAAW;YACXH;QACF;QAEA,IAAIE,eAAe,sBAAsB,EACvCE,AAAAA,IAAAA,sCAAAA,eAAAA,AAAAA,EAAgBT,MAAMJ;QAGxBc,IAAAA,uCAAAA,+BAAAA,AAAAA,EACEV,MACA,aACAM;IAEJ;AACF"}
|
|
@@ -1,5 +1,32 @@
|
|
|
1
|
-
import { type SetCookiesNodeInput, type SetCookiesNodeResult, setCookiesInputSchema } from '../../common/test-runner/cookies';
|
|
2
1
|
import type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
type CookieSourceReference = {
|
|
4
|
+
kind: 'env';
|
|
5
|
+
name: string;
|
|
6
|
+
} | {
|
|
7
|
+
kind: 'profile';
|
|
8
|
+
name: string;
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'storage-state';
|
|
11
|
+
name: string;
|
|
12
|
+
};
|
|
13
|
+
/** Input schema for the Playwright setCookies Node. */
|
|
14
|
+
export declare const setCookiesInputSchema: z.ZodObject<{
|
|
15
|
+
cookiesEnv: z.ZodOptional<z.ZodString>;
|
|
16
|
+
profile: z.ZodOptional<z.ZodString>;
|
|
17
|
+
storageStatePath: z.ZodOptional<z.ZodString>;
|
|
18
|
+
url: z.ZodOptional<z.ZodString>;
|
|
19
|
+
}, z.core.$strict>;
|
|
20
|
+
/** Validated input accepted by the Playwright setCookies Node. */
|
|
21
|
+
export type SetCookiesNodeInput = z.infer<typeof setCookiesInputSchema>;
|
|
22
|
+
/** Secret-free metadata returned by the Playwright setCookies Node. */
|
|
23
|
+
export interface SetCookiesNodeResult {
|
|
24
|
+
/** Kind of configured reference used to resolve the cookies. */
|
|
25
|
+
source: CookieSourceReference['kind'];
|
|
26
|
+
/** Environment variable, profile, or storage-state reference name. */
|
|
27
|
+
sourceName: string;
|
|
28
|
+
/** Number of cookies passed to the BrowserContext. */
|
|
29
|
+
count: number;
|
|
30
|
+
}
|
|
31
|
+
export declare const setCookiesNode: AgentTestRunnerNodeDefinition<z.output<typeof setCookiesInputSchema>, SetCookiesNodeResult>;
|
|
32
|
+
export {};
|
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
import type { BrowserContext, Page } from 'playwright';
|
|
2
|
-
import type { CookieProfileContext, WebCookieSourceOptions, WebNodeContext } from '../../common/test-runner/cookies';
|
|
3
2
|
type Awaitable<T> = T | Promise<T>;
|
|
4
3
|
export type PlaywrightCookie = Parameters<BrowserContext['addCookies']>[0][number];
|
|
5
4
|
/** Runtime resources supplied by the test runner to Playwright Nodes. */
|
|
6
|
-
export
|
|
5
|
+
export interface PlaywrightNodeContext<TContext> {
|
|
6
|
+
input: unknown;
|
|
7
|
+
context: TContext;
|
|
8
|
+
signal: AbortSignal;
|
|
9
|
+
}
|
|
7
10
|
/** Context passed to a configured Playwright cookie profile resolver. */
|
|
8
|
-
export
|
|
11
|
+
export interface PlaywrightCookieProfileContext<TContext> {
|
|
12
|
+
/** Profile reference from the setCookies Node input. */
|
|
13
|
+
profile: string;
|
|
14
|
+
/** The Agent executing the current Node. */
|
|
15
|
+
context: TContext;
|
|
16
|
+
/** Cancellation signal for the current Node execution. */
|
|
17
|
+
signal: AbortSignal;
|
|
18
|
+
}
|
|
9
19
|
/** Dependencies and source resolvers used by the Playwright preset Nodes. */
|
|
10
|
-
export interface PlaywrightTestRunnerOptions
|
|
20
|
+
export interface PlaywrightTestRunnerOptions {
|
|
11
21
|
/**
|
|
12
22
|
* Return the environment used by setCookies. Defaults to process.env when
|
|
13
23
|
* omitted.
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { resolveWebUrl, throwIfAborted } from '../../common/test-runner/utils';
|
|
2
1
|
import type { PlaywrightTestRunnerAgent } from './types';
|
|
2
|
+
export declare const throwIfAborted: (signal: AbortSignal, operation: string) => void;
|
|
3
|
+
export declare const resolveWebUrl: (target: string, baseUrl: string | undefined, label: string) => string;
|
|
3
4
|
export declare const requirePlaywrightAgent: (agent: unknown) => PlaywrightTestRunnerAgent;
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { type BrowserPageManager, WebAgentCore } from '../common/browser-agent';
|
|
2
2
|
import type { WebPageAgentOpt } from '../web-element';
|
|
3
|
-
import type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';
|
|
4
3
|
import type { Browser as PuppeteerBrowser, Page as PuppeteerPage, Target as PuppeteerTarget } from 'puppeteer';
|
|
5
4
|
import { PuppeteerWebPage } from './page';
|
|
6
|
-
import type { PuppeteerTestRunnerOptions } from './test-runner/types';
|
|
7
5
|
export type PuppeteerBrowserAgentOpt = Omit<WebPageAgentOpt, 'forceSameTabNavigation'> & {
|
|
8
|
-
testRunner?: PuppeteerTestRunnerOptions;
|
|
9
6
|
autoFollowNewPage?: boolean;
|
|
10
7
|
newPageTimeout?: number;
|
|
11
8
|
};
|
|
@@ -13,8 +10,6 @@ export type PuppeteerBrowserAgentCreateOpt = PuppeteerBrowserAgentOpt & {
|
|
|
13
10
|
initialPage?: PuppeteerPage;
|
|
14
11
|
};
|
|
15
12
|
export declare class PuppeteerBrowserAgent extends WebAgentCore<PuppeteerWebPage> {
|
|
16
|
-
static getTestRunnerNodeDefinitions(): readonly AgentTestRunnerNodeDefinition[];
|
|
17
|
-
readonly testRunner?: PuppeteerTestRunnerOptions;
|
|
18
13
|
protected pageManager: BrowserPageManager<PuppeteerPage, PuppeteerTarget>;
|
|
19
14
|
constructor(browser: PuppeteerBrowser, initialPage: PuppeteerPage, opts?: PuppeteerBrowserAgentOpt);
|
|
20
15
|
static create(browser: PuppeteerBrowser, opts?: PuppeteerBrowserAgentCreateOpt): Promise<PuppeteerBrowserAgent>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { PuppeteerPageAgent, PuppeteerAgent
|
|
1
|
+
export { PuppeteerPageAgent, PuppeteerAgent } from './page-agent';
|
|
2
2
|
export { PuppeteerBrowserAgent, type PuppeteerBrowserAgentCreateOpt, type PuppeteerBrowserAgentOpt, } from './browser-agent';
|
|
3
3
|
export { PuppeteerWebPage } from './page';
|
|
4
4
|
export type { WebPageAgentOpt } from '../web-element';
|
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
import { WebAgentCore } from '../common/browser-agent';
|
|
2
2
|
import type { WebPageAgentOpt } from '../web-element';
|
|
3
|
-
import type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';
|
|
4
3
|
import type { Page as PuppeteerPage } from 'puppeteer';
|
|
5
4
|
import { PuppeteerWebPage } from './page';
|
|
6
|
-
import type { PuppeteerTestRunnerOptions } from './test-runner/types';
|
|
7
|
-
export type PuppeteerPageAgentOpt = WebPageAgentOpt & {
|
|
8
|
-
testRunner?: PuppeteerTestRunnerOptions;
|
|
9
|
-
};
|
|
10
5
|
export declare class PuppeteerPageAgent extends WebAgentCore<PuppeteerWebPage> {
|
|
11
|
-
|
|
12
|
-
readonly testRunner?: PuppeteerTestRunnerOptions;
|
|
13
|
-
constructor(page: PuppeteerPage, opts?: PuppeteerPageAgentOpt);
|
|
6
|
+
constructor(page: PuppeteerPage, opts?: WebPageAgentOpt);
|
|
14
7
|
}
|
|
15
8
|
export { PuppeteerPageAgent as PuppeteerAgent };
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"Browser use",
|
|
9
9
|
"Android use"
|
|
10
10
|
],
|
|
11
|
-
"version": "1.12.9
|
|
11
|
+
"version": "1.12.9",
|
|
12
12
|
"repository": "https://github.com/web-infra-dev/midscene",
|
|
13
13
|
"homepage": "https://midscenejs.com/",
|
|
14
14
|
"main": "./dist/lib/index.js",
|
|
@@ -50,11 +50,6 @@
|
|
|
50
50
|
"require": "./dist/lib/puppeteer/agent-launcher.js",
|
|
51
51
|
"import": "./dist/es/puppeteer/agent-launcher.mjs"
|
|
52
52
|
},
|
|
53
|
-
"./puppeteer/test": {
|
|
54
|
-
"types": "./dist/types/puppeteer/test-runner/index.d.ts",
|
|
55
|
-
"require": "./dist/lib/puppeteer/test-runner/index.js",
|
|
56
|
-
"import": "./dist/es/puppeteer/test-runner/index.mjs"
|
|
57
|
-
},
|
|
58
53
|
"./playwright": {
|
|
59
54
|
"types": "./dist/types/playwright/index.d.ts",
|
|
60
55
|
"require": "./dist/lib/playwright/index.js",
|
|
@@ -122,9 +117,9 @@
|
|
|
122
117
|
"socket.io-client": "4.8.1",
|
|
123
118
|
"ws": "^8.18.1",
|
|
124
119
|
"zod": "^3.25.1",
|
|
125
|
-
"@midscene/core": "1.12.9
|
|
126
|
-
"@midscene/
|
|
127
|
-
"@midscene/
|
|
120
|
+
"@midscene/core": "1.12.9",
|
|
121
|
+
"@midscene/playground": "1.12.9",
|
|
122
|
+
"@midscene/shared": "1.12.9"
|
|
128
123
|
},
|
|
129
124
|
"devDependencies": {
|
|
130
125
|
"@playwright/test": "^1.45.0",
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
import { z } from "zod/v4";
|
|
4
|
-
import { resolveWebUrl } from "./utils.mjs";
|
|
5
|
-
const setCookiesInputSchema = z.strictObject({
|
|
6
|
-
cookiesEnv: z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).optional().describe('The environment variable containing a Cookie header, cookie array JSON, or browser storage-state JSON.'),
|
|
7
|
-
profile: z.string().regex(/\S/).optional().describe('A cookie profile resolved by getCookieProfile().'),
|
|
8
|
-
storageStatePath: z.string().regex(/\S/).optional().describe('A path to a browser storage-state JSON file.'),
|
|
9
|
-
url: z.string().url().optional().describe('The HTTP(S) URL used to scope Cookie-header values or cookies without domain/path.')
|
|
10
|
-
}).superRefine((input, ctx)=>{
|
|
11
|
-
const sourceCount = [
|
|
12
|
-
input.cookiesEnv,
|
|
13
|
-
input.profile,
|
|
14
|
-
input.storageStatePath
|
|
15
|
-
].filter((value)=>void 0 !== value).length;
|
|
16
|
-
if (1 !== sourceCount) ctx.addIssue({
|
|
17
|
-
code: 'custom',
|
|
18
|
-
message: 'exactly one of cookiesEnv, profile, and storageStatePath is required'
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
const toCookieSourceReference = (input)=>{
|
|
22
|
-
if (void 0 !== input.cookiesEnv) return {
|
|
23
|
-
kind: 'env',
|
|
24
|
-
name: input.cookiesEnv
|
|
25
|
-
};
|
|
26
|
-
if (void 0 !== input.profile) return {
|
|
27
|
-
kind: 'profile',
|
|
28
|
-
name: input.profile
|
|
29
|
-
};
|
|
30
|
-
if (void 0 !== input.storageStatePath) return {
|
|
31
|
-
kind: 'storage-state',
|
|
32
|
-
name: input.storageStatePath
|
|
33
|
-
};
|
|
34
|
-
throw new TypeError('setCookies requires one cookie source.');
|
|
35
|
-
};
|
|
36
|
-
const parseCookieHeader = (raw, url)=>{
|
|
37
|
-
if (void 0 === url) throw new TypeError('setCookies.url is required when cookiesEnv contains a Cookie header.');
|
|
38
|
-
const segments = raw.split(';').map((segment)=>segment.trim()).filter(Boolean);
|
|
39
|
-
if (0 === segments.length) throw new TypeError('setCookies Cookie header contains no cookies.');
|
|
40
|
-
return segments.map((segment)=>{
|
|
41
|
-
const separator = segment.indexOf('=');
|
|
42
|
-
if (separator <= 0) throw new TypeError('setCookies Cookie header contains an invalid name/value pair.');
|
|
43
|
-
const name = segment.slice(0, separator).trim();
|
|
44
|
-
const value = segment.slice(separator + 1).trim();
|
|
45
|
-
if (!name) throw new TypeError('setCookies Cookie header contains an empty name.');
|
|
46
|
-
return {
|
|
47
|
-
name,
|
|
48
|
-
value,
|
|
49
|
-
url
|
|
50
|
-
};
|
|
51
|
-
});
|
|
52
|
-
};
|
|
53
|
-
const parseCookieJson = (raw)=>{
|
|
54
|
-
try {
|
|
55
|
-
return JSON.parse(raw);
|
|
56
|
-
} catch {
|
|
57
|
-
throw new TypeError('setCookies source must contain valid JSON or a Cookie header.');
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
const normalizeCookie = (candidate, defaultUrl, index)=>{
|
|
61
|
-
if (!candidate || 'object' != typeof candidate || Array.isArray(candidate)) throw new TypeError(`setCookies cookie at index ${index} must be an object.`);
|
|
62
|
-
const cookie = candidate;
|
|
63
|
-
if ('string' != typeof cookie.name || !cookie.name.trim()) throw new TypeError(`setCookies cookie at index ${index} requires a non-blank name.`);
|
|
64
|
-
if ('string' != typeof cookie.value) throw new TypeError(`setCookies cookie at index ${index} requires a string value.`);
|
|
65
|
-
const normalized = {
|
|
66
|
-
...cookie
|
|
67
|
-
};
|
|
68
|
-
const hasUrl = 'string' == typeof cookie.url && cookie.url.length > 0;
|
|
69
|
-
const hasDomain = 'string' == typeof cookie.domain && cookie.domain.length > 0;
|
|
70
|
-
if (!hasUrl && !hasDomain) {
|
|
71
|
-
if (void 0 === defaultUrl) throw new TypeError(`setCookies cookie at index ${index} requires url or domain, or setCookies.url must be provided.`);
|
|
72
|
-
normalized.url = defaultUrl;
|
|
73
|
-
}
|
|
74
|
-
if (hasDomain && 'string' != typeof cookie.path) normalized.path = '/';
|
|
75
|
-
return normalized;
|
|
76
|
-
};
|
|
77
|
-
const normalizeCookies = (source, defaultUrl)=>{
|
|
78
|
-
const candidates = Array.isArray(source) ? source : source && 'object' == typeof source && Array.isArray(source.cookies) ? source.cookies : void 0;
|
|
79
|
-
if (!candidates) throw new TypeError('setCookies JSON must be a cookie array or an object with a cookies array.');
|
|
80
|
-
if (0 === candidates.length) throw new TypeError('setCookies source contains no cookies.');
|
|
81
|
-
return candidates.map((cookie, index)=>normalizeCookie(cookie, defaultUrl, index));
|
|
82
|
-
};
|
|
83
|
-
const resolveCookieInput = async (input, ctx, options)=>{
|
|
84
|
-
const defaultUrl = void 0 === input.url ? void 0 : resolveWebUrl(input.url, void 0, 'setCookies.url');
|
|
85
|
-
const reference = toCookieSourceReference(input);
|
|
86
|
-
let source;
|
|
87
|
-
switch(reference.kind){
|
|
88
|
-
case 'env':
|
|
89
|
-
{
|
|
90
|
-
let env;
|
|
91
|
-
try {
|
|
92
|
-
env = await options.getEnv?.(ctx) ?? process.env;
|
|
93
|
-
} catch {
|
|
94
|
-
throw new Error(`Failed to resolve cookie environment ${reference.name}; the original error was redacted because it may contain cookie values.`);
|
|
95
|
-
}
|
|
96
|
-
const raw = env[reference.name];
|
|
97
|
-
if (!raw?.trim()) throw new Error(`Environment variable ${reference.name} is missing or blank.`);
|
|
98
|
-
const trimmed = raw.trim();
|
|
99
|
-
source = /^[\[{]/.test(trimmed) ? parseCookieJson(trimmed) : parseCookieHeader(trimmed, defaultUrl);
|
|
100
|
-
break;
|
|
101
|
-
}
|
|
102
|
-
case 'profile':
|
|
103
|
-
if (!options.getCookieProfile) throw new Error('setCookies.profile requires a configured getCookieProfile callback.');
|
|
104
|
-
try {
|
|
105
|
-
source = await options.getCookieProfile({
|
|
106
|
-
profile: reference.name,
|
|
107
|
-
context: ctx.context,
|
|
108
|
-
signal: ctx.signal
|
|
109
|
-
});
|
|
110
|
-
} catch {
|
|
111
|
-
throw new Error(`Failed to resolve cookie profile ${reference.name}; the original error was redacted because it may contain cookie values.`);
|
|
112
|
-
}
|
|
113
|
-
break;
|
|
114
|
-
case 'storage-state':
|
|
115
|
-
{
|
|
116
|
-
const path = options.resolveStorageStatePath ? await options.resolveStorageStatePath(reference.name, ctx) : resolve(process.cwd(), reference.name);
|
|
117
|
-
source = parseCookieJson(await readFile(path, 'utf8'));
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
const cookies = normalizeCookies(source, defaultUrl);
|
|
122
|
-
return {
|
|
123
|
-
cookies,
|
|
124
|
-
result: {
|
|
125
|
-
source: reference.kind,
|
|
126
|
-
sourceName: reference.name,
|
|
127
|
-
count: cookies.length
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
};
|
|
131
|
-
export { resolveCookieInput, setCookiesInputSchema };
|
|
132
|
-
|
|
133
|
-
//# sourceMappingURL=cookies.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"common/test-runner/cookies.mjs","sources":["../../../../src/common/test-runner/cookies.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { z } from 'zod/v4';\nimport { resolveWebUrl } from './utils';\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport type CookieSourceReference =\n | { kind: 'env'; name: string }\n | { kind: 'profile'; name: string }\n | { kind: 'storage-state'; name: string };\n\nexport interface WebNodeContext<TContext> {\n input: unknown;\n context: TContext;\n signal: AbortSignal;\n}\n\nexport interface CookieProfileContext<TContext> {\n profile: string;\n context: TContext;\n signal: AbortSignal;\n}\n\nexport interface WebCookieSourceOptions<TAgent> {\n getEnv?(\n ctx: WebNodeContext<TAgent>,\n ): Awaitable<Readonly<Record<string, string | undefined>>>;\n getCookieProfile?(input: CookieProfileContext<TAgent>): Awaitable<unknown>;\n resolveStorageStatePath?(\n path: string,\n ctx: WebNodeContext<TAgent>,\n ): Awaitable<string>;\n}\n\nexport interface PortableWebCookie extends Record<string, unknown> {\n name: string;\n value: string;\n url?: string;\n domain?: string;\n path?: string;\n}\n\nexport const setCookiesInputSchema = z\n .strictObject({\n cookiesEnv: z\n .string()\n .regex(/^[A-Za-z_][A-Za-z0-9_]*$/)\n .optional()\n .describe(\n 'The environment variable containing a Cookie header, cookie array JSON, or browser storage-state JSON.',\n ),\n profile: z\n .string()\n .regex(/\\S/)\n .optional()\n .describe('A cookie profile resolved by getCookieProfile().'),\n storageStatePath: z\n .string()\n .regex(/\\S/)\n .optional()\n .describe('A path to a browser storage-state JSON file.'),\n url: z\n .string()\n .url()\n .optional()\n .describe(\n 'The HTTP(S) URL used to scope Cookie-header values or cookies without domain/path.',\n ),\n })\n .superRefine((input, ctx) => {\n const sourceCount = [\n input.cookiesEnv,\n input.profile,\n input.storageStatePath,\n ].filter((value) => value !== undefined).length;\n if (sourceCount !== 1) {\n ctx.addIssue({\n code: 'custom',\n message:\n 'exactly one of cookiesEnv, profile, and storageStatePath is required',\n });\n }\n });\n\nexport type SetCookiesNodeInput = z.infer<typeof setCookiesInputSchema>;\n\nexport interface SetCookiesNodeResult {\n source: CookieSourceReference['kind'];\n sourceName: string;\n count: number;\n}\n\nconst toCookieSourceReference = (\n input: SetCookiesNodeInput,\n): CookieSourceReference => {\n if (input.cookiesEnv !== undefined) {\n return { kind: 'env', name: input.cookiesEnv };\n }\n if (input.profile !== undefined) {\n return { kind: 'profile', name: input.profile };\n }\n if (input.storageStatePath !== undefined) {\n return { kind: 'storage-state', name: input.storageStatePath };\n }\n throw new TypeError('setCookies requires one cookie source.');\n};\n\nconst parseCookieHeader = (raw: string, url: string | undefined) => {\n if (url === undefined) {\n throw new TypeError(\n 'setCookies.url is required when cookiesEnv contains a Cookie header.',\n );\n }\n const segments = raw\n .split(';')\n .map((segment) => segment.trim())\n .filter(Boolean);\n if (segments.length === 0) {\n throw new TypeError('setCookies Cookie header contains no cookies.');\n }\n return segments.map((segment) => {\n const separator = segment.indexOf('=');\n if (separator <= 0) {\n throw new TypeError(\n 'setCookies Cookie header contains an invalid name/value pair.',\n );\n }\n const name = segment.slice(0, separator).trim();\n const value = segment.slice(separator + 1).trim();\n if (!name) {\n throw new TypeError('setCookies Cookie header contains an empty name.');\n }\n return { name, value, url } satisfies PortableWebCookie;\n });\n};\n\nconst parseCookieJson = (raw: string): unknown => {\n try {\n return JSON.parse(raw);\n } catch {\n throw new TypeError(\n 'setCookies source must contain valid JSON or a Cookie header.',\n );\n }\n};\n\nconst normalizeCookie = (\n candidate: unknown,\n defaultUrl: string | undefined,\n index: number,\n): PortableWebCookie => {\n if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {\n throw new TypeError(\n `setCookies cookie at index ${index} must be an object.`,\n );\n }\n const cookie = candidate as Record<string, unknown>;\n if (typeof cookie.name !== 'string' || !cookie.name.trim()) {\n throw new TypeError(\n `setCookies cookie at index ${index} requires a non-blank name.`,\n );\n }\n if (typeof cookie.value !== 'string') {\n throw new TypeError(\n `setCookies cookie at index ${index} requires a string value.`,\n );\n }\n\n const normalized = { ...cookie } as PortableWebCookie;\n const hasUrl = typeof cookie.url === 'string' && cookie.url.length > 0;\n const hasDomain =\n typeof cookie.domain === 'string' && cookie.domain.length > 0;\n if (!hasUrl && !hasDomain) {\n if (defaultUrl === undefined) {\n throw new TypeError(\n `setCookies cookie at index ${index} requires url or domain, or setCookies.url must be provided.`,\n );\n }\n normalized.url = defaultUrl;\n }\n if (hasDomain && typeof cookie.path !== 'string') normalized.path = '/';\n return normalized;\n};\n\nconst normalizeCookies = (\n source: unknown,\n defaultUrl: string | undefined,\n): PortableWebCookie[] => {\n const candidates = Array.isArray(source)\n ? source\n : source &&\n typeof source === 'object' &&\n Array.isArray((source as { cookies?: unknown }).cookies)\n ? (source as { cookies: unknown[] }).cookies\n : undefined;\n if (!candidates) {\n throw new TypeError(\n 'setCookies JSON must be a cookie array or an object with a cookies array.',\n );\n }\n if (candidates.length === 0) {\n throw new TypeError('setCookies source contains no cookies.');\n }\n return candidates.map((cookie, index) =>\n normalizeCookie(cookie, defaultUrl, index),\n );\n};\n\nexport const resolveCookieInput = async <TAgent>(\n input: SetCookiesNodeInput,\n ctx: WebNodeContext<TAgent>,\n options: WebCookieSourceOptions<TAgent>,\n): Promise<{\n cookies: PortableWebCookie[];\n result: SetCookiesNodeResult;\n}> => {\n const defaultUrl =\n input.url === undefined\n ? undefined\n : resolveWebUrl(input.url, undefined, 'setCookies.url');\n const reference = toCookieSourceReference(input);\n let source: unknown;\n switch (reference.kind) {\n case 'env': {\n let env: Readonly<Record<string, string | undefined>>;\n try {\n env = (await options.getEnv?.(ctx)) ?? process.env;\n } catch {\n throw new Error(\n `Failed to resolve cookie environment ${reference.name}; the original error was redacted because it may contain cookie values.`,\n );\n }\n const raw = env[reference.name];\n if (!raw?.trim()) {\n throw new Error(\n `Environment variable ${reference.name} is missing or blank.`,\n );\n }\n const trimmed = raw.trim();\n source = /^[\\[{]/.test(trimmed)\n ? parseCookieJson(trimmed)\n : parseCookieHeader(trimmed, defaultUrl);\n break;\n }\n case 'profile': {\n if (!options.getCookieProfile) {\n throw new Error(\n 'setCookies.profile requires a configured getCookieProfile callback.',\n );\n }\n try {\n source = await options.getCookieProfile({\n profile: reference.name,\n context: ctx.context,\n signal: ctx.signal,\n });\n } catch {\n throw new Error(\n `Failed to resolve cookie profile ${reference.name}; the original error was redacted because it may contain cookie values.`,\n );\n }\n break;\n }\n case 'storage-state': {\n const path = options.resolveStorageStatePath\n ? await options.resolveStorageStatePath(reference.name, ctx)\n : resolve(process.cwd(), reference.name);\n source = parseCookieJson(await readFile(path, 'utf8'));\n break;\n }\n }\n const cookies = normalizeCookies(source, defaultUrl);\n return {\n cookies,\n result: {\n source: reference.kind,\n sourceName: reference.name,\n count: cookies.length,\n },\n };\n};\n"],"names":["setCookiesInputSchema","z","input","ctx","sourceCount","value","undefined","toCookieSourceReference","TypeError","parseCookieHeader","raw","url","segments","segment","Boolean","separator","name","parseCookieJson","JSON","normalizeCookie","candidate","defaultUrl","index","Array","cookie","normalized","hasUrl","hasDomain","normalizeCookies","source","candidates","resolveCookieInput","options","resolveWebUrl","reference","env","process","Error","trimmed","path","resolve","readFile","cookies"],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
const SUPPORTED_WEB_PROTOCOLS = new Set([
|
|
2
|
-
'http:',
|
|
3
|
-
'https:'
|
|
4
|
-
]);
|
|
5
|
-
const throwIfAborted = (signal, operation)=>{
|
|
6
|
-
if (signal.aborted) throw signal.reason ?? new Error(`${operation} aborted.`);
|
|
7
|
-
};
|
|
8
|
-
const resolveWebUrl = (target, baseUrl, label)=>{
|
|
9
|
-
const trimmed = target.trim();
|
|
10
|
-
if (!trimmed) throw new TypeError(`${label} must not be blank.`);
|
|
11
|
-
let resolved;
|
|
12
|
-
try {
|
|
13
|
-
resolved = void 0 === baseUrl ? new URL(trimmed) : new URL(trimmed, baseUrl);
|
|
14
|
-
} catch (error) {
|
|
15
|
-
throw new TypeError(void 0 === baseUrl ? `${label} must be an absolute HTTP(S) URL.` : `${label} is not a valid URL.`, {
|
|
16
|
-
cause: error
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
if (!SUPPORTED_WEB_PROTOCOLS.has(resolved.protocol)) throw new TypeError(`${label} does not support the ${resolved.protocol} protocol.`);
|
|
20
|
-
return resolved.toString();
|
|
21
|
-
};
|
|
22
|
-
export { resolveWebUrl, throwIfAborted };
|
|
23
|
-
|
|
24
|
-
//# sourceMappingURL=utils.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"common/test-runner/utils.mjs","sources":["../../../../src/common/test-runner/utils.ts"],"sourcesContent":["const SUPPORTED_WEB_PROTOCOLS = new Set(['http:', 'https:']);\n\nexport const throwIfAborted = (signal: AbortSignal, operation: string) => {\n if (signal.aborted) {\n throw signal.reason ?? new Error(`${operation} aborted.`);\n }\n};\n\nexport const resolveWebUrl = (\n target: string,\n baseUrl: string | undefined,\n label: string,\n): string => {\n const trimmed = target.trim();\n if (!trimmed) throw new TypeError(`${label} must not be blank.`);\n\n let resolved: URL;\n try {\n resolved =\n baseUrl === undefined ? new URL(trimmed) : new URL(trimmed, baseUrl);\n } catch (error) {\n throw new TypeError(\n baseUrl === undefined\n ? `${label} must be an absolute HTTP(S) URL.`\n : `${label} is not a valid URL.`,\n { cause: error },\n );\n }\n if (!SUPPORTED_WEB_PROTOCOLS.has(resolved.protocol)) {\n throw new TypeError(\n `${label} does not support the ${resolved.protocol} protocol.`,\n );\n }\n return resolved.toString();\n};\n"],"names":["SUPPORTED_WEB_PROTOCOLS","Set","throwIfAborted","signal","operation","Error","resolveWebUrl","target","baseUrl","label","trimmed","TypeError","resolved","undefined","URL","error"],"mappings":"AAAA,MAAMA,0BAA0B,IAAIC,IAAI;IAAC;IAAS;CAAS;AAEpD,MAAMC,iBAAiB,CAACC,QAAqBC;IAClD,IAAID,OAAO,OAAO,EAChB,MAAMA,OAAO,MAAM,IAAI,IAAIE,MAAM,GAAGD,UAAU,SAAS,CAAC;AAE5D;AAEO,MAAME,gBAAgB,CAC3BC,QACAC,SACAC;IAEA,MAAMC,UAAUH,OAAO,IAAI;IAC3B,IAAI,CAACG,SAAS,MAAM,IAAIC,UAAU,GAAGF,MAAM,mBAAmB,CAAC;IAE/D,IAAIG;IACJ,IAAI;QACFA,WACEJ,AAAYK,WAAZL,UAAwB,IAAIM,IAAIJ,WAAW,IAAII,IAAIJ,SAASF;IAChE,EAAE,OAAOO,OAAO;QACd,MAAM,IAAIJ,UACRH,AAAYK,WAAZL,UACI,GAAGC,MAAM,iCAAiC,CAAC,GAC3C,GAAGA,MAAM,oBAAoB,CAAC,EAClC;YAAE,OAAOM;QAAM;IAEnB;IACA,IAAI,CAACf,wBAAwB,GAAG,CAACY,SAAS,QAAQ,GAChD,MAAM,IAAID,UACR,GAAGF,MAAM,sBAAsB,EAAEG,SAAS,QAAQ,CAAC,UAAU,CAAC;IAGlE,OAAOA,SAAS,QAAQ;AAC1B"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { clearCookiesNode } from "./clear-cookies.mjs";
|
|
2
|
-
import { setCookiesNode } from "./cookies.mjs";
|
|
3
|
-
import { gotoUrlNode } from "./goto-url.mjs";
|
|
4
|
-
import { setViewportSizeNode } from "./viewport.mjs";
|
|
5
|
-
const puppeteerAgentTestRunnerNodeDefinitions = [
|
|
6
|
-
gotoUrlNode,
|
|
7
|
-
setCookiesNode,
|
|
8
|
-
clearCookiesNode,
|
|
9
|
-
setViewportSizeNode
|
|
10
|
-
];
|
|
11
|
-
export { puppeteerAgentTestRunnerNodeDefinitions };
|
|
12
|
-
|
|
13
|
-
//# sourceMappingURL=agent-nodes.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer/test-runner/agent-nodes.mjs","sources":["../../../../src/puppeteer/test-runner/agent-nodes.ts"],"sourcesContent":["import type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';\nimport { clearCookiesNode } from './clear-cookies';\nimport { setCookiesNode } from './cookies';\nimport { gotoUrlNode } from './goto-url';\nimport { setViewportSizeNode } from './viewport';\n\nexport const puppeteerAgentTestRunnerNodeDefinitions: readonly AgentTestRunnerNodeDefinition[] =\n [gotoUrlNode, setCookiesNode, clearCookiesNode, setViewportSizeNode];\n"],"names":["puppeteerAgentTestRunnerNodeDefinitions","gotoUrlNode","setCookiesNode","clearCookiesNode","setViewportSizeNode"],"mappings":";;;;AAMO,MAAMA,0CACX;IAACC;IAAaC;IAAgBC;IAAkBC;CAAoB"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { z } from "zod/v4";
|
|
2
|
-
import { requirePuppeteerAgent, throwIfAborted } from "./utils.mjs";
|
|
3
|
-
const clearCookiesInputSchema = z.strictObject({
|
|
4
|
-
name: z.string().regex(/\S/).optional().describe('Cookie name to clear.'),
|
|
5
|
-
domain: z.string().regex(/\S/).optional().describe('Cookie domain to clear.'),
|
|
6
|
-
path: z.string().regex(/\S/).optional().describe('Cookie path to clear.')
|
|
7
|
-
});
|
|
8
|
-
const clearCookiesNode = {
|
|
9
|
-
name: 'clearCookies',
|
|
10
|
-
title: 'Clear browser cookies',
|
|
11
|
-
description: 'Clear all cookies from the current Puppeteer BrowserContext, or only cookies matching name, domain, or path.',
|
|
12
|
-
stringInputKey: false,
|
|
13
|
-
inputSchema: clearCookiesInputSchema,
|
|
14
|
-
async execute (agent, input, executionContext) {
|
|
15
|
-
const ctx = {
|
|
16
|
-
...executionContext,
|
|
17
|
-
input,
|
|
18
|
-
context: requirePuppeteerAgent(agent)
|
|
19
|
-
};
|
|
20
|
-
throwIfAborted(ctx.signal, 'clearCookies');
|
|
21
|
-
const browserContext = ctx.context.interface.underlyingPage.browserContext();
|
|
22
|
-
const cookies = (await browserContext.cookies()).filter((cookie)=>(void 0 === input.name || cookie.name === input.name) && (void 0 === input.domain || cookie.domain === input.domain) && (void 0 === input.path || cookie.path === input.path));
|
|
23
|
-
throwIfAborted(ctx.signal, 'clearCookies');
|
|
24
|
-
if (cookies.length > 0) await browserContext.deleteCookie(...cookies);
|
|
25
|
-
const filterNames = Object.keys(input);
|
|
26
|
-
return {
|
|
27
|
-
summary: 0 === filterNames.length ? `Cleared ${cookies.length} browser cookie(s)` : `Cleared ${cookies.length} browser cookie(s) matching ${filterNames.join(', ')}`,
|
|
28
|
-
data: {
|
|
29
|
-
filters: input
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
export { clearCookiesInputSchema, clearCookiesNode };
|
|
35
|
-
|
|
36
|
-
//# sourceMappingURL=clear-cookies.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer/test-runner/clear-cookies.mjs","sources":["../../../../src/puppeteer/test-runner/clear-cookies.ts"],"sourcesContent":["import type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';\nimport { z } from 'zod/v4';\nimport { requirePuppeteerAgent, throwIfAborted } from './utils';\n\nexport const clearCookiesInputSchema = z.strictObject({\n name: z.string().regex(/\\S/).optional().describe('Cookie name to clear.'),\n domain: z.string().regex(/\\S/).optional().describe('Cookie domain to clear.'),\n path: z.string().regex(/\\S/).optional().describe('Cookie path to clear.'),\n});\n\nexport type ClearCookiesNodeInput = z.infer<typeof clearCookiesInputSchema>;\n\nexport const clearCookiesNode: AgentTestRunnerNodeDefinition<\n z.output<typeof clearCookiesInputSchema>,\n { filters: ClearCookiesNodeInput }\n> = {\n name: 'clearCookies',\n title: 'Clear browser cookies',\n description:\n 'Clear all cookies from the current Puppeteer BrowserContext, or only cookies matching name, domain, or path.',\n stringInputKey: false,\n inputSchema: clearCookiesInputSchema,\n async execute(agent, input, executionContext) {\n const ctx = {\n ...executionContext,\n input,\n context: requirePuppeteerAgent(agent),\n };\n throwIfAborted(ctx.signal, 'clearCookies');\n const browserContext =\n ctx.context.interface.underlyingPage.browserContext();\n const cookies = (await browserContext.cookies()).filter(\n (cookie) =>\n (input.name === undefined || cookie.name === input.name) &&\n (input.domain === undefined || cookie.domain === input.domain) &&\n (input.path === undefined || cookie.path === input.path),\n );\n throwIfAborted(ctx.signal, 'clearCookies');\n if (cookies.length > 0) await browserContext.deleteCookie(...cookies);\n const filterNames = Object.keys(input);\n return {\n summary:\n filterNames.length === 0\n ? `Cleared ${cookies.length} browser cookie(s)`\n : `Cleared ${cookies.length} browser cookie(s) matching ${filterNames.join(', ')}`,\n data: { filters: input },\n };\n },\n};\n"],"names":["clearCookiesInputSchema","z","clearCookiesNode","agent","input","executionContext","ctx","requirePuppeteerAgent","throwIfAborted","browserContext","cookies","cookie","undefined","filterNames","Object"],"mappings":";;AAIO,MAAMA,0BAA0BC,EAAE,YAAY,CAAC;IACpD,MAAMA,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC;IACjD,QAAQA,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC;IACnD,MAAMA,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC;AACnD;AAIO,MAAMC,mBAGT;IACF,MAAM;IACN,OAAO;IACP,aACE;IACF,gBAAgB;IAChB,aAAaF;IACb,MAAM,SAAQG,KAAK,EAAEC,KAAK,EAAEC,gBAAgB;QAC1C,MAAMC,MAAM;YACV,GAAGD,gBAAgB;YACnBD;YACA,SAASG,sBAAsBJ;QACjC;QACAK,eAAeF,IAAI,MAAM,EAAE;QAC3B,MAAMG,iBACJH,IAAI,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,cAAc;QACrD,MAAMI,UAAW,OAAMD,eAAe,OAAO,EAAC,EAAG,MAAM,CACrD,CAACE,SACEP,AAAAA,CAAAA,AAAeQ,WAAfR,MAAM,IAAI,IAAkBO,OAAO,IAAI,KAAKP,MAAM,IAAG,KACrDA,CAAAA,AAAiBQ,WAAjBR,MAAM,MAAM,IAAkBO,OAAO,MAAM,KAAKP,MAAM,MAAK,KAC3DA,CAAAA,AAAeQ,WAAfR,MAAM,IAAI,IAAkBO,OAAO,IAAI,KAAKP,MAAM,IAAG;QAE1DI,eAAeF,IAAI,MAAM,EAAE;QAC3B,IAAII,QAAQ,MAAM,GAAG,GAAG,MAAMD,eAAe,YAAY,IAAIC;QAC7D,MAAMG,cAAcC,OAAO,IAAI,CAACV;QAChC,OAAO;YACL,SACES,AAAuB,MAAvBA,YAAY,MAAM,GACd,CAAC,QAAQ,EAAEH,QAAQ,MAAM,CAAC,kBAAkB,CAAC,GAC7C,CAAC,QAAQ,EAAEA,QAAQ,MAAM,CAAC,4BAA4B,EAAEG,YAAY,IAAI,CAAC,OAAO;YACtF,MAAM;gBAAE,SAAST;YAAM;QACzB;IACF;AACF"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { resolveCookieInput, setCookiesInputSchema } from "../../common/test-runner/cookies.mjs";
|
|
2
|
-
import { requirePuppeteerAgent, throwIfAborted } from "./utils.mjs";
|
|
3
|
-
const setCookiesNode = {
|
|
4
|
-
name: 'setCookies',
|
|
5
|
-
title: 'Set browser cookies',
|
|
6
|
-
description: 'Load cookies from an environment variable, configured profile, or browser storage-state file without persisting cookie values in workflow input or output.',
|
|
7
|
-
stringInputKey: false,
|
|
8
|
-
inputSchema: setCookiesInputSchema,
|
|
9
|
-
async execute (agent, input, executionContext) {
|
|
10
|
-
const ctx = {
|
|
11
|
-
...executionContext,
|
|
12
|
-
input,
|
|
13
|
-
context: requirePuppeteerAgent(agent)
|
|
14
|
-
};
|
|
15
|
-
throwIfAborted(ctx.signal, 'setCookies');
|
|
16
|
-
const { cookies, result } = await resolveCookieInput(input, ctx, ctx.context.testRunner ?? {});
|
|
17
|
-
throwIfAborted(ctx.signal, 'setCookies');
|
|
18
|
-
try {
|
|
19
|
-
await ctx.context.interface.underlyingPage.setCookie(...cookies);
|
|
20
|
-
} catch {
|
|
21
|
-
throw new Error(`Failed to set ${cookies.length} browser cookie(s); the browser error was redacted because it may contain cookie values.`);
|
|
22
|
-
}
|
|
23
|
-
return {
|
|
24
|
-
summary: `Set ${result.count} browser cookie(s) from ${result.source} source ${result.sourceName}`,
|
|
25
|
-
data: result
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
export { setCookiesInputSchema, setCookiesNode };
|
|
30
|
-
|
|
31
|
-
//# sourceMappingURL=cookies.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer/test-runner/cookies.mjs","sources":["../../../../src/puppeteer/test-runner/cookies.ts"],"sourcesContent":["import {\n type SetCookiesNodeInput,\n type SetCookiesNodeResult,\n resolveCookieInput,\n setCookiesInputSchema,\n} from '@/common/test-runner/cookies';\nimport type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';\nimport type { CookieParam } from 'puppeteer';\nimport { requirePuppeteerAgent, throwIfAborted } from './utils';\n\nexport { setCookiesInputSchema };\nexport type { SetCookiesNodeInput, SetCookiesNodeResult };\n\nexport const setCookiesNode: AgentTestRunnerNodeDefinition<\n SetCookiesNodeInput,\n SetCookiesNodeResult\n> = {\n name: 'setCookies',\n title: 'Set browser cookies',\n description:\n 'Load cookies from an environment variable, configured profile, or browser storage-state file without persisting cookie values in workflow input or output.',\n stringInputKey: false,\n inputSchema: setCookiesInputSchema,\n async execute(agent, input, executionContext) {\n const ctx = {\n ...executionContext,\n input,\n context: requirePuppeteerAgent(agent),\n };\n throwIfAborted(ctx.signal, 'setCookies');\n const { cookies, result } = await resolveCookieInput(\n input,\n ctx,\n ctx.context.testRunner ?? {},\n );\n\n throwIfAborted(ctx.signal, 'setCookies');\n try {\n await ctx.context.interface.underlyingPage.setCookie(\n ...(cookies as CookieParam[]),\n );\n } catch {\n throw new Error(\n `Failed to set ${cookies.length} browser cookie(s); the browser error was redacted because it may contain cookie values.`,\n );\n }\n return {\n summary: `Set ${result.count} browser cookie(s) from ${result.source} source ${result.sourceName}`,\n data: result,\n };\n },\n};\n"],"names":["setCookiesNode","setCookiesInputSchema","agent","input","executionContext","ctx","requirePuppeteerAgent","throwIfAborted","cookies","result","resolveCookieInput","Error"],"mappings":";;AAaO,MAAMA,iBAGT;IACF,MAAM;IACN,OAAO;IACP,aACE;IACF,gBAAgB;IAChB,aAAaC;IACb,MAAM,SAAQC,KAAK,EAAEC,KAAK,EAAEC,gBAAgB;QAC1C,MAAMC,MAAM;YACV,GAAGD,gBAAgB;YACnBD;YACA,SAASG,sBAAsBJ;QACjC;QACAK,eAAeF,IAAI,MAAM,EAAE;QAC3B,MAAM,EAAEG,OAAO,EAAEC,MAAM,EAAE,GAAG,MAAMC,mBAChCP,OACAE,KACAA,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC;QAG7BE,eAAeF,IAAI,MAAM,EAAE;QAC3B,IAAI;YACF,MAAMA,IAAI,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,IAC9CG;QAER,EAAE,OAAM;YACN,MAAM,IAAIG,MACR,CAAC,cAAc,EAAEH,QAAQ,MAAM,CAAC,wFAAwF,CAAC;QAE7H;QACA,OAAO;YACL,SAAS,CAAC,IAAI,EAAEC,OAAO,KAAK,CAAC,wBAAwB,EAAEA,OAAO,MAAM,CAAC,QAAQ,EAAEA,OAAO,UAAU,EAAE;YAClG,MAAMA;QACR;IACF;AACF"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { z } from "zod/v4";
|
|
2
|
-
import { requirePuppeteerAgent, resolveWebUrl, throwIfAborted } from "./utils.mjs";
|
|
3
|
-
const DEFAULT_NAVIGATION_TIMEOUT_MS = 60000;
|
|
4
|
-
const DEFAULT_WAIT_UNTIL = 'domcontentloaded';
|
|
5
|
-
const gotoUrlInputSchema = z.strictObject({
|
|
6
|
-
url: z.string().min(1).describe('An absolute HTTP(S) URL or a path relative to Puppeteer baseURL or the current page URL.'),
|
|
7
|
-
waitUntil: z["enum"]([
|
|
8
|
-
'domcontentloaded',
|
|
9
|
-
'load',
|
|
10
|
-
'networkidle0',
|
|
11
|
-
'networkidle2'
|
|
12
|
-
]).default(DEFAULT_WAIT_UNTIL).describe('The Puppeteer navigation lifecycle event to wait for.'),
|
|
13
|
-
timeoutMs: z.number().positive().default(DEFAULT_NAVIGATION_TIMEOUT_MS).describe('The navigation timeout in milliseconds.')
|
|
14
|
-
});
|
|
15
|
-
const resolveNavigationUrl = (target, page, configuredBase)=>{
|
|
16
|
-
const trimmed = target.trim();
|
|
17
|
-
if (!trimmed) throw new TypeError('gotoUrl.url must not be blank.');
|
|
18
|
-
if (/^[a-z][a-z\d+.-]*:/i.test(trimmed)) return resolveWebUrl(trimmed, void 0, 'gotoUrl.url');
|
|
19
|
-
if (void 0 !== configuredBase) return resolveWebUrl(trimmed, configuredBase, 'gotoUrl.url');
|
|
20
|
-
const currentUrl = page.url();
|
|
21
|
-
if (!/^https?:\/\//i.test(currentUrl)) throw new TypeError(`gotoUrl.url cannot resolve a relative URL from ${JSON.stringify(currentUrl)}. Use an absolute HTTP(S) URL for the first navigation or configure Puppeteer testRunner.baseURL.`);
|
|
22
|
-
return resolveWebUrl(trimmed, currentUrl, 'gotoUrl.url');
|
|
23
|
-
};
|
|
24
|
-
const gotoUrlNode = {
|
|
25
|
-
name: 'gotoUrl',
|
|
26
|
-
title: 'Open a Web URL',
|
|
27
|
-
description: 'Navigate the current Puppeteer Page to an absolute HTTP(S) URL or a path relative to testRunner.baseURL or the current page URL.',
|
|
28
|
-
stringInputKey: 'url',
|
|
29
|
-
inputSchema: gotoUrlInputSchema,
|
|
30
|
-
async execute (agent, input, executionContext) {
|
|
31
|
-
const ctx = {
|
|
32
|
-
...executionContext,
|
|
33
|
-
input,
|
|
34
|
-
context: requirePuppeteerAgent(agent)
|
|
35
|
-
};
|
|
36
|
-
throwIfAborted(ctx.signal, 'gotoUrl');
|
|
37
|
-
const page = ctx.context.interface.underlyingPage;
|
|
38
|
-
const url = resolveNavigationUrl(ctx.input.url, page, ctx.context.testRunner?.baseURL);
|
|
39
|
-
const response = await page.goto(url, {
|
|
40
|
-
waitUntil: ctx.input.waitUntil,
|
|
41
|
-
timeout: ctx.input.timeoutMs
|
|
42
|
-
});
|
|
43
|
-
throwIfAborted(ctx.signal, 'gotoUrl');
|
|
44
|
-
const result = {
|
|
45
|
-
url: page.url(),
|
|
46
|
-
status: response?.status() ?? null,
|
|
47
|
-
title: await page.title()
|
|
48
|
-
};
|
|
49
|
-
return {
|
|
50
|
-
summary: `Navigated to ${result.url}`,
|
|
51
|
-
data: result
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
export { gotoUrlInputSchema, gotoUrlNode };
|
|
56
|
-
|
|
57
|
-
//# sourceMappingURL=goto-url.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer/test-runner/goto-url.mjs","sources":["../../../../src/puppeteer/test-runner/goto-url.ts"],"sourcesContent":["import type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';\nimport type { Page } from 'puppeteer';\nimport { z } from 'zod/v4';\nimport { requirePuppeteerAgent, resolveWebUrl, throwIfAborted } from './utils';\n\nconst DEFAULT_NAVIGATION_TIMEOUT_MS = 60_000;\nconst DEFAULT_WAIT_UNTIL = 'domcontentloaded' as const;\n\nexport const gotoUrlInputSchema = z.strictObject({\n url: z\n .string()\n .min(1)\n .describe(\n 'An absolute HTTP(S) URL or a path relative to Puppeteer baseURL or the current page URL.',\n ),\n waitUntil: z\n .enum(['domcontentloaded', 'load', 'networkidle0', 'networkidle2'])\n .default(DEFAULT_WAIT_UNTIL)\n .describe('The Puppeteer navigation lifecycle event to wait for.'),\n timeoutMs: z\n .number()\n .positive()\n .default(DEFAULT_NAVIGATION_TIMEOUT_MS)\n .describe('The navigation timeout in milliseconds.'),\n});\n\nexport type GotoUrlNodeInput = z.infer<typeof gotoUrlInputSchema>;\n\nexport interface GotoUrlNodeResult {\n url: string;\n status: number | null;\n title: string;\n}\n\nconst resolveNavigationUrl = (\n target: string,\n page: Page,\n configuredBase: string | undefined,\n): string => {\n const trimmed = target.trim();\n if (!trimmed) throw new TypeError('gotoUrl.url must not be blank.');\n if (/^[a-z][a-z\\d+.-]*:/i.test(trimmed)) {\n return resolveWebUrl(trimmed, undefined, 'gotoUrl.url');\n }\n if (configuredBase !== undefined) {\n return resolveWebUrl(trimmed, configuredBase, 'gotoUrl.url');\n }\n const currentUrl = page.url();\n if (!/^https?:\\/\\//i.test(currentUrl)) {\n throw new TypeError(\n `gotoUrl.url cannot resolve a relative URL from ${JSON.stringify(currentUrl)}. Use an absolute HTTP(S) URL for the first navigation or configure Puppeteer testRunner.baseURL.`,\n );\n }\n return resolveWebUrl(trimmed, currentUrl, 'gotoUrl.url');\n};\n\nexport const gotoUrlNode: AgentTestRunnerNodeDefinition<\n z.output<typeof gotoUrlInputSchema>,\n GotoUrlNodeResult\n> = {\n name: 'gotoUrl',\n title: 'Open a Web URL',\n description:\n 'Navigate the current Puppeteer Page to an absolute HTTP(S) URL or a path relative to testRunner.baseURL or the current page URL.',\n stringInputKey: 'url',\n inputSchema: gotoUrlInputSchema,\n async execute(agent, input, executionContext) {\n const ctx = {\n ...executionContext,\n input,\n context: requirePuppeteerAgent(agent),\n };\n throwIfAborted(ctx.signal, 'gotoUrl');\n const page = ctx.context.interface.underlyingPage;\n const url = resolveNavigationUrl(\n ctx.input.url,\n page,\n ctx.context.testRunner?.baseURL,\n );\n const response = await page.goto(url, {\n waitUntil: ctx.input.waitUntil,\n timeout: ctx.input.timeoutMs,\n });\n throwIfAborted(ctx.signal, 'gotoUrl');\n const result = {\n url: page.url(),\n status: response?.status() ?? null,\n title: await page.title(),\n };\n return { summary: `Navigated to ${result.url}`, data: result };\n },\n};\n"],"names":["DEFAULT_NAVIGATION_TIMEOUT_MS","DEFAULT_WAIT_UNTIL","gotoUrlInputSchema","z","resolveNavigationUrl","target","page","configuredBase","trimmed","TypeError","resolveWebUrl","undefined","currentUrl","JSON","gotoUrlNode","agent","input","executionContext","ctx","requirePuppeteerAgent","throwIfAborted","url","response","result"],"mappings":";;AAKA,MAAMA,gCAAgC;AACtC,MAAMC,qBAAqB;AAEpB,MAAMC,qBAAqBC,EAAE,YAAY,CAAC;IAC/C,KAAKA,EAAAA,MACI,GACN,GAAG,CAAC,GACJ,QAAQ,CACP;IAEJ,WAAWA,CAAC,CAADA,OACJ,CAAC;QAAC;QAAoB;QAAQ;QAAgB;KAAe,EACjE,OAAO,CAACF,oBACR,QAAQ,CAAC;IACZ,WAAWE,EAAAA,MACF,GACN,QAAQ,GACR,OAAO,CAACH,+BACR,QAAQ,CAAC;AACd;AAUA,MAAMI,uBAAuB,CAC3BC,QACAC,MACAC;IAEA,MAAMC,UAAUH,OAAO,IAAI;IAC3B,IAAI,CAACG,SAAS,MAAM,IAAIC,UAAU;IAClC,IAAI,sBAAsB,IAAI,CAACD,UAC7B,OAAOE,cAAcF,SAASG,QAAW;IAE3C,IAAIJ,AAAmBI,WAAnBJ,gBACF,OAAOG,cAAcF,SAASD,gBAAgB;IAEhD,MAAMK,aAAaN,KAAK,GAAG;IAC3B,IAAI,CAAC,gBAAgB,IAAI,CAACM,aACxB,MAAM,IAAIH,UACR,CAAC,+CAA+C,EAAEI,KAAK,SAAS,CAACD,YAAY,iGAAiG,CAAC;IAGnL,OAAOF,cAAcF,SAASI,YAAY;AAC5C;AAEO,MAAME,cAGT;IACF,MAAM;IACN,OAAO;IACP,aACE;IACF,gBAAgB;IAChB,aAAaZ;IACb,MAAM,SAAQa,KAAK,EAAEC,KAAK,EAAEC,gBAAgB;QAC1C,MAAMC,MAAM;YACV,GAAGD,gBAAgB;YACnBD;YACA,SAASG,sBAAsBJ;QACjC;QACAK,eAAeF,IAAI,MAAM,EAAE;QAC3B,MAAMZ,OAAOY,IAAI,OAAO,CAAC,SAAS,CAAC,cAAc;QACjD,MAAMG,MAAMjB,qBACVc,IAAI,KAAK,CAAC,GAAG,EACbZ,MACAY,IAAI,OAAO,CAAC,UAAU,EAAE;QAE1B,MAAMI,WAAW,MAAMhB,KAAK,IAAI,CAACe,KAAK;YACpC,WAAWH,IAAI,KAAK,CAAC,SAAS;YAC9B,SAASA,IAAI,KAAK,CAAC,SAAS;QAC9B;QACAE,eAAeF,IAAI,MAAM,EAAE;QAC3B,MAAMK,SAAS;YACb,KAAKjB,KAAK,GAAG;YACb,QAAQgB,UAAU,YAAY;YAC9B,OAAO,MAAMhB,KAAK,KAAK;QACzB;QACA,OAAO;YAAE,SAAS,CAAC,aAAa,EAAEiB,OAAO,GAAG,EAAE;YAAE,MAAMA;QAAO;IAC/D;AACF"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { clearCookiesInputSchema } from "./clear-cookies.mjs";
|
|
2
|
-
import { setCookiesInputSchema } from "./cookies.mjs";
|
|
3
|
-
import { gotoUrlInputSchema } from "./goto-url.mjs";
|
|
4
|
-
import { setViewportSizeInputSchema } from "./viewport.mjs";
|
|
5
|
-
import { puppeteerAgentTestRunnerNodeDefinitions } from "./agent-nodes.mjs";
|
|
6
|
-
export { clearCookiesInputSchema, gotoUrlInputSchema, puppeteerAgentTestRunnerNodeDefinitions, setCookiesInputSchema, setViewportSizeInputSchema };
|
|
File without changes
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { resolveWebUrl, throwIfAborted } from "../../common/test-runner/utils.mjs";
|
|
2
|
-
const requirePuppeteerAgent = (agent)=>{
|
|
3
|
-
if (!agent || 'object' != typeof agent || !('interface' in agent) || !agent.interface || 'object' != typeof agent.interface || !('underlyingPage' in agent.interface) || !agent.interface.underlyingPage) throw new TypeError('getAgent() must return a Puppeteer Agent with an underlying Page.');
|
|
4
|
-
return agent;
|
|
5
|
-
};
|
|
6
|
-
export { requirePuppeteerAgent, resolveWebUrl, throwIfAborted };
|
|
7
|
-
|
|
8
|
-
//# sourceMappingURL=utils.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer/test-runner/utils.mjs","sources":["../../../../src/puppeteer/test-runner/utils.ts"],"sourcesContent":["import type { PuppeteerTestRunnerAgent } from './types';\n\nexport { resolveWebUrl, throwIfAborted } from '../../common/test-runner/utils';\n\nexport const requirePuppeteerAgent = (\n agent: unknown,\n): PuppeteerTestRunnerAgent => {\n if (\n !agent ||\n typeof agent !== 'object' ||\n !('interface' in agent) ||\n !agent.interface ||\n typeof agent.interface !== 'object' ||\n !('underlyingPage' in agent.interface) ||\n !agent.interface.underlyingPage\n ) {\n throw new TypeError(\n 'getAgent() must return a Puppeteer Agent with an underlying Page.',\n );\n }\n return agent as PuppeteerTestRunnerAgent;\n};\n"],"names":["requirePuppeteerAgent","agent","TypeError"],"mappings":";AAIO,MAAMA,wBAAwB,CACnCC;IAEA,IACE,CAACA,SACD,AAAiB,YAAjB,OAAOA,SACP,CAAE,gBAAeA,KAAI,KACrB,CAACA,MAAM,SAAS,IAChB,AAA2B,YAA3B,OAAOA,MAAM,SAAS,IACtB,CAAE,qBAAoBA,MAAM,SAAQ,KACpC,CAACA,MAAM,SAAS,CAAC,cAAc,EAE/B,MAAM,IAAIC,UACR;IAGJ,OAAOD;AACT"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { z } from "zod/v4";
|
|
2
|
-
import { requirePuppeteerAgent, throwIfAborted } from "./utils.mjs";
|
|
3
|
-
const setViewportSizeInputSchema = z.strictObject({
|
|
4
|
-
width: z.number().int().positive().describe('Viewport width in CSS pixels.'),
|
|
5
|
-
height: z.number().int().positive().describe('Viewport height in CSS pixels.')
|
|
6
|
-
});
|
|
7
|
-
const setViewportSizeNode = {
|
|
8
|
-
name: 'setViewportSize',
|
|
9
|
-
title: 'Set the browser viewport size',
|
|
10
|
-
description: 'Set the current Puppeteer Page viewport size in CSS pixels and return the effective size.',
|
|
11
|
-
stringInputKey: false,
|
|
12
|
-
inputSchema: setViewportSizeInputSchema,
|
|
13
|
-
async execute (agent, input, executionContext) {
|
|
14
|
-
const ctx = {
|
|
15
|
-
...executionContext,
|
|
16
|
-
input,
|
|
17
|
-
context: requirePuppeteerAgent(agent)
|
|
18
|
-
};
|
|
19
|
-
throwIfAborted(ctx.signal, 'setViewportSize');
|
|
20
|
-
const page = ctx.context.interface.underlyingPage;
|
|
21
|
-
await page.setViewport({
|
|
22
|
-
width: input.width,
|
|
23
|
-
height: input.height
|
|
24
|
-
});
|
|
25
|
-
const viewport = page.viewport();
|
|
26
|
-
if (!viewport) throw new Error('Puppeteer did not report an effective viewport size.');
|
|
27
|
-
const result = {
|
|
28
|
-
width: viewport.width,
|
|
29
|
-
height: viewport.height
|
|
30
|
-
};
|
|
31
|
-
return {
|
|
32
|
-
summary: `Set viewport to ${result.width}x${result.height}`,
|
|
33
|
-
data: result
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
export { setViewportSizeInputSchema, setViewportSizeNode };
|
|
38
|
-
|
|
39
|
-
//# sourceMappingURL=viewport.mjs.map
|