diff --git a/docs/api/README.md b/docs/api/README.md index f57c88c6..a6ea7409 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -312,13 +312,13 @@ limitations under the License. ### createRunner -▸ **createRunner**(`flow`, `extension?`): `Promise`<[`Runner`](classes/Runner.md)\> +▸ **createRunner**(`flow?`, `extension?`): `Promise`<[`Runner`](classes/Runner.md)\> #### Parameters | Name | Type | | :----------- | :---------------------------------------------- | -| `flow` | [`UserFlow`](interfaces/Schema.UserFlow.md) | +| `flow?` | [`UserFlow`](interfaces/Schema.UserFlow.md) | | `extension?` | [`RunnerExtension`](classes/RunnerExtension.md) | #### Returns @@ -327,7 +327,7 @@ limitations under the License. #### Defined in -[Runner.ts:79](https://github.com/puppeteer/replay/blob/main/src/Runner.ts#L79) +[Runner.ts:92](https://github.com/puppeteer/replay/blob/main/src/Runner.ts#L92) --- diff --git a/docs/api/classes/Runner.md b/docs/api/classes/Runner.md index 9290de77..30622e74 100644 --- a/docs/api/classes/Runner.md +++ b/docs/api/classes/Runner.md @@ -4,12 +4,36 @@ ## Table of contents +### Accessors + +- [flow](Runner.md#flow) + ### Methods - [abort](Runner.md#abort) - [run](Runner.md#run) - [runStep](Runner.md#runstep) +## Accessors + +### flow + +• `set` **flow**(`flow`): `void` + +#### Parameters + +| Name | Type | +| :----- | :--------------------------------------------- | +| `flow` | [`UserFlow`](../interfaces/Schema.UserFlow.md) | + +#### Returns + +`void` + +#### Defined in + +[Runner.ts:47](https://github.com/puppeteer/replay/blob/main/src/Runner.ts#L47) + ## Methods ### abort @@ -22,7 +46,7 @@ #### Defined in -[Runner.ts:44](https://github.com/puppeteer/replay/blob/main/src/Runner.ts#L44) +[Runner.ts:43](https://github.com/puppeteer/replay/blob/main/src/Runner.ts#L43) --- @@ -40,7 +64,7 @@ whether all the steps are run or the execution is aborted #### Defined in -[Runner.ts:56](https://github.com/puppeteer/replay/blob/main/src/Runner.ts#L56) +[Runner.ts:63](https://github.com/puppeteer/replay/blob/main/src/Runner.ts#L63) --- @@ -48,6 +72,9 @@ whether all the steps are run or the execution is aborted ▸ **runStep**(`step`): `Promise`<`void`\> +Runs the provided `step` with `beforeEachStep` and `afterEachStep` hooks. +Parameters from the `flow` apply if the `flow` is set. + #### Parameters | Name | Type | @@ -60,4 +87,4 @@ whether all the steps are run or the execution is aborted #### Defined in -[Runner.ts:48](https://github.com/puppeteer/replay/blob/main/src/Runner.ts#L48) +[Runner.ts:55](https://github.com/puppeteer/replay/blob/main/src/Runner.ts#L55) diff --git a/src/Runner.ts b/src/Runner.ts index bb1fffc2..f765fe09 100644 --- a/src/Runner.ts +++ b/src/Runner.ts @@ -29,15 +29,14 @@ async function _runStepWithHooks( } export class Runner { - #flow: UserFlow; + #flow?: UserFlow; #extension: RunnerExtension; #aborted: boolean = false; /** * @internal */ - constructor(flow: UserFlow, extension: RunnerExtension) { - this.#flow = flow; + constructor(extension: RunnerExtension) { this.#extension = extension; } @@ -45,6 +44,14 @@ export class Runner { this.#aborted = true; } + set flow(flow: UserFlow) { + this.#flow = flow; + } + + /** + * Runs the provided `step` with `beforeEachStep` and `afterEachStep` hooks. + * Parameters from the `flow` apply if the `flow` is set. + */ async runStep(step: Step): Promise { await _runStepWithHooks(this.#extension, step); } @@ -54,36 +61,47 @@ export class Runner { * @returns whether all the steps are run or the execution is aborted */ async run(): Promise { + if (!this.#flow) { + throw new Error( + 'Set the flow on the runner instance before calling `run`.' + ); + } + + const flow = this.#flow; + this.#aborted = false; - await this.#extension.beforeAllSteps?.(this.#flow); + await this.#extension.beforeAllSteps?.(flow); if (this.#aborted) { return false; } - for (const step of this.#flow.steps) { + for (const step of flow.steps) { if (this.#aborted) { - await this.#extension.afterAllSteps?.(this.#flow); + await this.#extension.afterAllSteps?.(flow); return false; } - await _runStepWithHooks(this.#extension, step, this.#flow); + await _runStepWithHooks(this.#extension, step, flow); } - await this.#extension.afterAllSteps?.(this.#flow); + await this.#extension.afterAllSteps?.(flow); return true; } } export async function createRunner( - flow: UserFlow, + flow?: UserFlow, extension?: RunnerExtension ) { - return new Runner( - flow, + const runner = new Runner( extension ?? (await createPuppeteerRunnerOwningBrowserExtension()) ); + if (flow) { + runner.flow = flow; + } + return runner; } async function createPuppeteerRunnerOwningBrowserExtension() { diff --git a/src/lighthouse/LighthouseRunnerExtension.ts b/src/lighthouse/LighthouseRunnerExtension.ts index e5244833..2a6811bd 100644 --- a/src/lighthouse/LighthouseRunnerExtension.ts +++ b/src/lighthouse/LighthouseRunnerExtension.ts @@ -52,7 +52,7 @@ export class LighthouseRunnerExtension extends PuppeteerRunnerExtension { }); } - override async beforeEachStep(step: Step, flow: UserFlow) { + override async beforeEachStep(step: Step, flow?: UserFlow) { await super.beforeEachStep?.(step, flow); if (step.type === StepType.SetViewport) return; @@ -69,7 +69,7 @@ export class LighthouseRunnerExtension extends PuppeteerRunnerExtension { } } - override async afterEachStep(step: Step, flow: UserFlow) { + override async afterEachStep(step: Step, flow?: UserFlow) { if (this.#isNavigationRunning) { await this.#lhFlow.endNavigation(); this.#isNavigationRunning = false; diff --git a/test/runner.test.ts b/test/runner.test.ts index c1cbe977..f46e50f6 100644 --- a/test/runner.test.ts +++ b/test/runner.test.ts @@ -939,11 +939,7 @@ describe('Runner', () => { it('should replay individual steps', async () => { const runner = await createRunner( - { - title: 'Test Recording', - timeout: 3000, - steps: [], - }, + undefined, new PuppeteerRunnerExtension(browser, page) ); await runner.runStep({