From ab8d2b05d14beac6b1eb6564d0daaa4ebf424f97 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Mon, 26 Jan 2026 16:55:51 -0800 Subject: [PATCH] Improve scene type visibility --- libs/playwright-helpers/src/play.ts | 6 ++++-- .../src/scene-templates/scene-template.ts | 4 +++- .../src/scene-templates/single-user.scene.ts | 16 +++++++--------- libs/playwright-helpers/src/scene.ts | 12 ++++++++---- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/libs/playwright-helpers/src/play.ts b/libs/playwright-helpers/src/play.ts index 19a8ba79e3a..4776c810ea6 100644 --- a/libs/playwright-helpers/src/play.ts +++ b/libs/playwright-helpers/src/play.ts @@ -24,8 +24,10 @@ export class Play { * @param options Options for the scene * @returns */ - static async scene(template: SceneTemplate): Promise> { - const scene = new Scene(); + static async scene( + template: SceneTemplate, + ): Promise> { + const scene = new Scene(); await scene.init(template); return scene; } diff --git a/libs/playwright-helpers/src/scene-templates/scene-template.ts b/libs/playwright-helpers/src/scene-templates/scene-template.ts index dc33de822c1..3beca507f35 100644 --- a/libs/playwright-helpers/src/scene-templates/scene-template.ts +++ b/libs/playwright-helpers/src/scene-templates/scene-template.ts @@ -3,6 +3,8 @@ import { webServerBaseUrl } from "@playwright-config"; // First seed points at the seeder API proxy, second is the seed path of the SeedController const seedApiUrl = new URL("/seed/seed/", webServerBaseUrl).toString(); +export type extractTUpType = T extends SceneTemplate ? U : never; + export abstract class SceneTemplate { abstract template: string; private seedId?: string; @@ -14,7 +16,7 @@ export abstract class SceneTemplate { return this.seedId; } - constructor(private upArgs: TUp) {} + constructor(public upArgs: TUp) {} async up(): Promise> { const result = await sceneUp(this.template, this.upArgs); this.seedId = result.seedId; diff --git a/libs/playwright-helpers/src/scene-templates/single-user.scene.ts b/libs/playwright-helpers/src/scene-templates/single-user.scene.ts index 41ca0691807..acfb8313159 100644 --- a/libs/playwright-helpers/src/scene-templates/single-user.scene.ts +++ b/libs/playwright-helpers/src/scene-templates/single-user.scene.ts @@ -5,16 +5,14 @@ import { Scene } from "../scene"; import { SceneTemplate } from "./scene-template"; type SceneResult = UserId; +type UpParams = { + email: string; + emailVerified?: boolean; + premium?: boolean; +}; -export type SingleUserScene = Scene; +export type SingleUserScene = Scene; -export class SingleUserSceneTemplate extends SceneTemplate< - { - email: string; - emailVerified?: boolean; - premium?: boolean; - }, - SceneResult -> { +export class SingleUserSceneTemplate extends SceneTemplate { template: string = "SingleUserScene"; } diff --git a/libs/playwright-helpers/src/scene.ts b/libs/playwright-helpers/src/scene.ts index 9be032ef6e9..4c0975eed6c 100644 --- a/libs/playwright-helpers/src/scene.ts +++ b/libs/playwright-helpers/src/scene.ts @@ -10,15 +10,15 @@ import { SceneTemplate } from "./scene-templates/scene-template"; * - {@link SceneOptions.noDown}: Useful for setting up data then using codegen to create tests that use the data. Remember to tear down the data manually. * - {@link SceneOptions.downAfterAll}: Useful for expensive setups that you want to share across all tests in a worker or for writing acts. */ -export class Scene { +export class Scene { private inited = false; - private _template?: SceneTemplate; + private _template?: SceneTemplate; private mangledMap = new Map(); private _returnValue?: Returns; constructor() {} - private get template(): SceneTemplate { + private get template(): SceneTemplate { if (!this.inited) { throw new Error("Scene must be initialized before accessing template"); } @@ -28,6 +28,10 @@ export class Scene { return this._template; } + get upArgs(): UpParams { + return this.template.upArgs; + } + get returnValue(): Returns { if (!this.inited) { throw new Error("Scene must be initialized before accessing returnValue"); @@ -43,7 +47,7 @@ export class Scene { return this.mangledMap.get(id) ?? id; } - async init, TUp>(template: T): Promise { + async init(template: SceneTemplate): Promise { if (this.inited) { throw new Error("Scene has already been initialized"); }