Skip to content

Commit

Permalink
fix: infer unioned handles
Browse files Browse the repository at this point in the history
  • Loading branch information
jrandolf committed Jun 23, 2022
1 parent 23622c8 commit 7bfe6d3
Show file tree
Hide file tree
Showing 13 changed files with 96 additions and 86 deletions.
18 changes: 9 additions & 9 deletions src/common/DOMWorld.ts
Expand Up @@ -26,7 +26,7 @@ import {JSHandle} from './JSHandle.js';
import {LifecycleWatcher, PuppeteerLifeCycleEvent} from './LifecycleWatcher.js';
import {_getQueryHandlerAndSelector} from './QueryHandler.js';
import {TimeoutSettings} from './TimeoutSettings.js';
import {EvaluateFunc, EvaluateParams, HandleFor} from './types.js';
import {EvaluateFunc, HandleFor} from './types.js';
import {
debugError,
isNumber,
Expand Down Expand Up @@ -183,7 +183,7 @@ export class DOMWorld {
Func extends EvaluateFunc<Params> = EvaluateFunc<Params>
>(
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<HandleFor<Awaited<ReturnType<Func>>>> {
const context = await this.executionContext();
return context.evaluateHandle(pageFunction, ...args);
Expand All @@ -194,7 +194,7 @@ export class DOMWorld {
Func extends EvaluateFunc<Params> = EvaluateFunc<Params>
>(
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>> {
const context = await this.executionContext();
return context.evaluate(pageFunction, ...args);
Expand Down Expand Up @@ -253,7 +253,7 @@ export class DOMWorld {
>(
selector: Selector,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $eval<
Params extends unknown[],
Expand All @@ -263,7 +263,7 @@ export class DOMWorld {
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $eval<
Params extends unknown[],
Expand All @@ -273,7 +273,7 @@ export class DOMWorld {
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>> {
const document = await this._document();
return document.$eval(selector, pageFunction, ...args);
Expand All @@ -288,7 +288,7 @@ export class DOMWorld {
>(
selector: Selector,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $$eval<
Params extends unknown[],
Expand All @@ -298,7 +298,7 @@ export class DOMWorld {
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $$eval<
Params extends unknown[],
Expand All @@ -308,7 +308,7 @@ export class DOMWorld {
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>> {
const document = await this._document();
const value = await document.$$eval(selector, pageFunction, ...args);
Expand Down
14 changes: 7 additions & 7 deletions src/common/ElementHandle.ts
Expand Up @@ -16,7 +16,7 @@ import {
} from './JSHandle.js';
import {Page, ScreenshotOptions} from './Page.js';
import {_getQueryHandlerAndSelector} from './QueryHandler.js';
import {EvaluateFunc, EvaluateParams} from './types.js';
import {EvaluateFunc} from './types.js';
import {KeyInput} from './USKeyboardLayout.js';
import {debugError, isString} from './util.js';

Expand Down Expand Up @@ -898,7 +898,7 @@ export class ElementHandle<
>(
selector: Selector,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $eval<
Params extends unknown[],
Expand All @@ -908,7 +908,7 @@ export class ElementHandle<
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $eval<
Params extends unknown[],
Expand All @@ -918,7 +918,7 @@ export class ElementHandle<
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>> {
const elementHandle = await this.$(selector);
if (!elementHandle) {
Expand Down Expand Up @@ -963,7 +963,7 @@ export class ElementHandle<
>(
selector: Selector,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $$eval<
Params extends unknown[],
Expand All @@ -973,7 +973,7 @@ export class ElementHandle<
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $$eval<
Params extends unknown[],
Expand All @@ -983,7 +983,7 @@ export class ElementHandle<
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>> {
const {updatedSelector, queryHandler} =
_getQueryHandlerAndSelector(selector);
Expand Down
16 changes: 8 additions & 8 deletions src/common/ExecutionContext.ts
Expand Up @@ -18,15 +18,15 @@ import {Protocol} from 'devtools-protocol';
import {assert} from './assert.js';
import {CDPSession} from './Connection.js';
import {DOMWorld} from './DOMWorld.js';
import {EvaluateFunc, HandleFor, EvaluateParams} from './types.js';
import {ElementHandle} from './ElementHandle.js';
import {Frame} from './FrameManager.js';
import {JSHandle} from './JSHandle.js';
import {ElementHandle} from './ElementHandle.js';
import {EvaluateFunc, HandleFor} from './types.js';
import {
getExceptionMessage,
_createJSHandle,
isString,
valueFromRemoteObject,
_createJSHandle,
} from './util.js';

/**
Expand Down Expand Up @@ -145,7 +145,7 @@ export class ExecutionContext {
Func extends EvaluateFunc<Params> = EvaluateFunc<Params>
>(
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>> {
return await this.#evaluate(true, pageFunction, ...args);
}
Expand Down Expand Up @@ -197,7 +197,7 @@ export class ExecutionContext {
Func extends EvaluateFunc<Params> = EvaluateFunc<Params>
>(
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<HandleFor<Awaited<ReturnType<Func>>>> {
return this.#evaluate(false, pageFunction, ...args);
}
Expand All @@ -208,23 +208,23 @@ export class ExecutionContext {
>(
returnByValue: true,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async #evaluate<
Params extends unknown[],
Func extends EvaluateFunc<Params> = EvaluateFunc<Params>
>(
returnByValue: false,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<HandleFor<Awaited<ReturnType<Func>>>>;
async #evaluate<
Params extends unknown[],
Func extends EvaluateFunc<Params> = EvaluateFunc<Params>
>(
returnByValue: boolean,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<HandleFor<Awaited<ReturnType<Func>>> | Awaited<ReturnType<Func>>> {
const suffix = `//# sourceURL=${EVALUATION_SCRIPT_URL}`;

Expand Down
20 changes: 10 additions & 10 deletions src/common/FrameManager.ts
Expand Up @@ -27,7 +27,7 @@ import {LifecycleWatcher, PuppeteerLifeCycleEvent} from './LifecycleWatcher.js';
import {NetworkManager} from './NetworkManager.js';
import {Page} from './Page.js';
import {TimeoutSettings} from './TimeoutSettings.js';
import {EvaluateFunc, EvaluateParams, HandleFor} from './types.js';
import {EvaluateFunc, HandleFor} from './types.js';
import {debugError, isErrorLike} from './util.js';

const UTILITY_WORLD_NAME = '__puppeteer_utility_world__';
Expand Down Expand Up @@ -889,7 +889,7 @@ export class Frame {
Func extends EvaluateFunc<Params> = EvaluateFunc<Params>
>(
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<HandleFor<Awaited<ReturnType<Func>>>> {
return this._mainWorld.evaluateHandle(pageFunction, ...args);
}
Expand All @@ -908,7 +908,7 @@ export class Frame {
Func extends EvaluateFunc<Params> = EvaluateFunc<Params>
>(
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>> {
return this._mainWorld.evaluate(pageFunction, ...args);
}
Expand Down Expand Up @@ -979,7 +979,7 @@ export class Frame {
>(
selector: Selector,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $eval<
Params extends unknown[],
Expand All @@ -989,7 +989,7 @@ export class Frame {
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $eval<
Params extends unknown[],
Expand All @@ -999,7 +999,7 @@ export class Frame {
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>> {
return this._mainWorld.$eval(selector, pageFunction, ...args);
}
Expand Down Expand Up @@ -1032,7 +1032,7 @@ export class Frame {
>(
selector: Selector,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $$eval<
Params extends unknown[],
Expand All @@ -1042,7 +1042,7 @@ export class Frame {
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>>;
async $$eval<
Params extends unknown[],
Expand All @@ -1052,7 +1052,7 @@ export class Frame {
>(
selector: string,
pageFunction: Func | string,
...args: EvaluateParams<Params>
...args: Params
): Promise<Awaited<ReturnType<Func>>> {
return this._mainWorld.$$eval(selector, pageFunction, ...args);
}
Expand Down Expand Up @@ -1440,7 +1440,7 @@ export class Frame {
>(
pageFunction: Func | string,
options: FrameWaitForFunctionOptions = {},
...args: EvaluateParams<Params>
...args: Params
): Promise<HandleFor<Awaited<ReturnType<Func>>>> {
// TODO: Fix when NodeHandle has been added.
return this._mainWorld.waitForFunction(
Expand Down
40 changes: 24 additions & 16 deletions src/common/JSHandle.ts
Expand Up @@ -17,7 +17,7 @@
import {Protocol} from 'devtools-protocol';
import {assert} from './assert.js';
import {CDPSession} from './Connection.js';
import {EvaluateFunc, EvaluateParams, HandleFor, HandleOr} from './types.js';
import {EvaluateFunc, HandleFor, HandleOr} from './types.js';
import {ExecutionContext} from './ExecutionContext.js';
import {MouseButton} from './Input.js';
import {releaseObject, valueFromRemoteObject, _createJSHandle} from './util.js';
Expand Down Expand Up @@ -121,9 +121,9 @@ export class JSHandle<T = unknown> {
}

/**
* This method passes this handle as the first argument to `pageFunction`.
* If `pageFunction` returns a Promise, then `handle.evaluate` would wait
* for the promise to resolve and return its value.
* This method passes this handle as the first argument to `pageFunction`. If
* `pageFunction` returns a Promise, then `handle.evaluate` would wait for the
* promise to resolve and return its value.
*
* @example
* ```js
Expand All @@ -134,11 +134,15 @@ export class JSHandle<T = unknown> {

async evaluate<
Params extends unknown[],
Func extends EvaluateFunc<[T, ...Params]> = EvaluateFunc<[T, ...Params]>
Func extends EvaluateFunc<[this, ...Params]> = EvaluateFunc<
[this, ...Params]
>
>(
pageFunction: Func | string,
...args: EvaluateParams<Params>
): Promise<Awaited<ReturnType<Func>>> {
...args: Params
): // @ts-expect-error Circularity here is okay because we only need the return
// type which doesn't use `this`.
Promise<Awaited<ReturnType<Func>>> {
return await this.executionContext().evaluate(pageFunction, this, ...args);
}

Expand All @@ -148,22 +152,26 @@ export class JSHandle<T = unknown> {
* @remarks
*
* The only difference between `jsHandle.evaluate` and
* `jsHandle.evaluateHandle` is that `jsHandle.evaluateHandle`
* returns an in-page object (JSHandle).
* `jsHandle.evaluateHandle` is that `jsHandle.evaluateHandle` returns an
* in-page object (JSHandle).
*
* If the function passed to `jsHandle.evaluateHandle` returns a Promise,
* then `evaluateHandle.evaluateHandle` waits for the promise to resolve and
* If the function passed to `jsHandle.evaluateHandle` returns a Promise, then
* `evaluateHandle.evaluateHandle` waits for the promise to resolve and
* returns its value.
*
* See {@link Page.evaluateHandle} for more details.
*/
async evaluateHandle<
Params extends unknown[],
Func extends EvaluateFunc<[T, ...Params]> = EvaluateFunc<[T, ...Params]>
Func extends EvaluateFunc<[this, ...Params]> = EvaluateFunc<
[this, ...Params]
>
>(
pageFunction: Func,
...args: EvaluateParams<Params>
): Promise<HandleFor<Awaited<ReturnType<Func>>>> {
...args: Params
): // @ts-expect-error Circularity here is okay because we only need the return
// type which doesn't use `this`.
Promise<HandleFor<Awaited<ReturnType<Func>>>> {
return await this.executionContext().evaluateHandle(
pageFunction,
this,
Expand All @@ -187,8 +195,8 @@ export class JSHandle<T = unknown> {
}

/**
* The method returns a map with property names as keys and JSHandle
* instances for the property values.
* The method returns a map with property names as keys and JSHandle instances
* for the property values.
*
* @example
* ```js
Expand Down

0 comments on commit 7bfe6d3

Please sign in to comment.