@razohq/razo 0.1.0
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/LICENSE +21 -0
- package/README.md +176 -0
- package/dist/chunk-UCLP2ILU.mjs +20 -0
- package/dist/chunk-UCLP2ILU.mjs.map +1 -0
- package/dist/events-D_lCLx1V.d.mts +44 -0
- package/dist/events-D_lCLx1V.d.ts +44 -0
- package/dist/index.d.mts +336 -0
- package/dist/index.d.ts +336 -0
- package/dist/index.js +961 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +892 -0
- package/dist/index.mjs.map +1 -0
- package/dist/reporter.d.mts +31 -0
- package/dist/reporter.d.ts +31 -0
- package/dist/reporter.js +91 -0
- package/dist/reporter.js.map +1 -0
- package/dist/reporter.mjs +50 -0
- package/dist/reporter.mjs.map +1 -0
- package/dist/vite.d.mts +29 -0
- package/dist/vite.d.ts +29 -0
- package/dist/vite.js +55 -0
- package/dist/vite.js.map +1 -0
- package/dist/vite.mjs +26 -0
- package/dist/vite.mjs.map +1 -0
- package/package.json +110 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/controls/Control.ts","../src/reporting/events.ts","../src/controls/Button.ts","../src/controls/Input.ts","../src/controls/RadioButton.ts","../src/controls/Checkbox.ts","../src/controls/Select.ts","../src/controls/Link.ts","../src/controls/Label.ts","../src/controls/FileInput.ts","../src/controls/Slider.ts","../src/controls/TextArea.ts","../src/controls/Switch.ts","../src/controls/Combobox.ts","../src/controls/Table.ts","../src/controls/Dialog.ts","../src/controls/Tabs.ts","../src/controls/Image.ts","../src/controls/DatePicker.ts","../src/controls/Menu.ts","../src/controls/Tooltip.ts","../src/controls/Editor.ts"],"sourcesContent":["export {\n Control,\n type ControlOptions,\n type LocatorSpec,\n type StepAction,\n type StepOptions,\n} from './controls/Control';\nexport { Button } from './controls/Button';\nexport { Input } from './controls/Input';\nexport { RadioButton } from './controls/RadioButton';\nexport { Checkbox } from './controls/Checkbox';\nexport { Select } from './controls/Select';\nexport { Link } from './controls/Link';\nexport { Label } from './controls/Label';\nexport { FileInput } from './controls/FileInput';\nexport { Slider } from './controls/Slider';\nexport { TextArea } from './controls/TextArea';\nexport { Switch } from './controls/Switch';\nexport { Combobox } from './controls/Combobox';\nexport { Table } from './controls/Table';\nexport { Dialog } from './controls/Dialog';\nexport { Tabs } from './controls/Tabs';\nexport { Image } from './controls/Image';\nexport { DatePicker } from './controls/DatePicker';\nexport { Menu } from './controls/Menu';\nexport { Tooltip } from './controls/Tooltip';\nexport { Editor } from './controls/Editor';\nexport { type StepEvent, AI_STEP_ATTACHMENT, emitStepEvent } from './reporting/events';\n","import { expect, test, type Locator, type Page } from '@playwright/test';\nimport { emitStepEvent, stripAnsi, type StepEvent } from '../reporting/events';\n\ntype StepEventExtras = Pick<StepEvent, 'healed' | 'domCandidates' | 'actual'>;\n\ninterface SentenceContext {\n controlType: string;\n name: string;\n detail?: string;\n expected?: string;\n}\n\n/**\n * Sentence grammar: one fixed template per verb, in a single place,\n * so the narration is predictable and parseable by an AI.\n */\nconst SENTENCES = {\n click: (c: SentenceContext) => `Click ${c.controlType} \"${c.name}\"`,\n fill: (c: SentenceContext) => `Type \"${c.detail}\" into ${c.controlType} \"${c.name}\"`,\n clear: (c: SentenceContext) => `Clear ${c.controlType} \"${c.name}\"`,\n select: (c: SentenceContext) => `Select option \"${c.detail}\" in ${c.controlType} \"${c.name}\"`,\n check: (c: SentenceContext) => `Check ${c.controlType} \"${c.name}\"`,\n uncheck: (c: SentenceContext) => `Uncheck ${c.controlType} \"${c.name}\"`,\n choose: (c: SentenceContext) => `Choose \"${c.detail}\" in ${c.controlType} \"${c.name}\"`,\n 'choose-many': (c: SentenceContext) =>\n `Choose options \"${c.detail}\" in ${c.controlType} \"${c.name}\"`,\n open: (c: SentenceContext) => `Open ${c.controlType} \"${c.name}\"`,\n attach: (c: SentenceContext) => `Attach \"${c.detail}\" to ${c.controlType} \"${c.name}\"`,\n set: (c: SentenceContext) => `Set ${c.controlType} \"${c.name}\" to \"${c.detail}\"`,\n 'assert-visible': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is visible`,\n 'assert-enabled': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is enabled`,\n 'assert-disabled': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is disabled`,\n 'assert-text': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" has text \"${c.expected}\"`,\n 'assert-checked': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is checked`,\n 'assert-unchecked': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is not checked`,\n 'assert-selected': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" has option \"${c.expected}\" selected`,\n 'assert-value': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" has value \"${c.expected}\"`,\n 'assert-href': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" points to \"${c.expected}\"`,\n // Universal interactions\n hover: (c: SentenceContext) => `Hover over ${c.controlType} \"${c.name}\"`,\n 'double-click': (c: SentenceContext) => `Double-click ${c.controlType} \"${c.name}\"`,\n 'right-click': (c: SentenceContext) => `Right-click ${c.controlType} \"${c.name}\"`,\n press: (c: SentenceContext) => `Press \"${c.detail}\" on ${c.controlType} \"${c.name}\"`,\n focus: (c: SentenceContext) => `Focus ${c.controlType} \"${c.name}\"`,\n 'scroll-to': (c: SentenceContext) => `Scroll to ${c.controlType} \"${c.name}\"`,\n // detail carries the drop target already rendered as `type \"name\"`\n drag: (c: SentenceContext) => `Drag ${c.controlType} \"${c.name}\" onto ${c.detail}`,\n // Universal assertions\n 'assert-hidden': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is hidden`,\n 'assert-focused': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is focused`,\n 'assert-contains-text': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" contains text \"${c.expected}\"`,\n 'assert-attribute': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" attribute \"${c.detail}\" is \"${c.expected}\"`,\n 'assert-empty': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is empty`,\n // Switch\n 'turn-on': (c: SentenceContext) => `Turn on ${c.controlType} \"${c.name}\"`,\n 'turn-off': (c: SentenceContext) => `Turn off ${c.controlType} \"${c.name}\"`,\n 'assert-on': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is on`,\n 'assert-off': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is off`,\n // Combobox\n pick: (c: SentenceContext) => `Pick \"${c.detail}\" in ${c.controlType} \"${c.name}\"`,\n // Table\n 'assert-row-count': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" has ${c.expected} rows`,\n 'assert-row-contains': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" has a row containing \"${c.expected}\"`,\n // Dialog\n close: (c: SentenceContext) => `Close ${c.controlType} \"${c.name}\"`,\n 'assert-open': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is open`,\n 'assert-closed': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is closed`,\n // Tabs\n 'open-tab': (c: SentenceContext) => `Open tab \"${c.detail}\" in ${c.controlType} \"${c.name}\"`,\n 'assert-active-tab': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" has active tab \"${c.expected}\"`,\n // Image\n 'assert-alt': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" has alt text \"${c.expected}\"`,\n 'assert-loaded': (c: SentenceContext) => `Assert ${c.controlType} \"${c.name}\" is loaded`,\n // DatePicker\n 'pick-date': (c: SentenceContext) =>\n `Pick date \"${c.detail}\" in ${c.controlType} \"${c.name}\"`,\n // Collections\n 'assert-count': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" appears ${c.expected} times`,\n // Tooltip\n 'assert-tooltip': (c: SentenceContext) =>\n `Assert ${c.controlType} \"${c.name}\" says \"${c.expected}\"`,\n} as const;\n\nexport type StepAction = keyof typeof SENTENCES;\n\nexport interface StepOptions {\n /** Action payload (typed text, chosen option) */\n detail?: string;\n /** Assertions only: expected value */\n expected?: string;\n /** On assertion failure: how to read the value actually found */\n readActual?: () => Promise<string>;\n /** Sentence override for business-level narration (\"Confirm the export\") */\n as?: string;\n}\n\nexport interface ControlOptions {\n /** Scope the control inside another one (e.g. a button within a dialog). */\n within?: Control;\n /**\n * Deterministic healing alternatives, tried in order when the primary\n * locator stops resolving. After these, the implicit `role + name`\n * fallback derived from the control type is tried. See RAZO_HEALING.\n */\n fallbacks?: LocatorSpec[];\n}\n\ntype AriaRole = Parameters<Page['getByRole']>[0];\n\n/**\n * Safe role per control type for the implicit healing fallback. Types whose\n * role is ambiguous (label, tooltip, editor, file input…) are deliberately\n * absent: they only heal through explicit `fallbacks`.\n */\n// Keys are the exact controlType strings the subclasses declare.\nconst IMPLICIT_ROLE: Record<string, AriaRole> = {\n button: 'button',\n link: 'link',\n checkbox: 'checkbox',\n 'radio group': 'radiogroup',\n switch: 'switch',\n field: 'textbox',\n 'text area': 'textbox',\n // Single-choice <select>; a `multiple` select is a listbox and will simply\n // not match the count()===1 guard — it fails safe instead of mis-healing.\n select: 'combobox',\n combobox: 'combobox',\n slider: 'slider',\n dialog: 'dialog',\n menu: 'menu',\n tabs: 'tablist',\n image: 'img',\n table: 'table',\n};\n\ntype HealingMode = 'pass' | 'fail' | 'off';\n\n/** RAZO_HEALING: pass (default: heal and warn) | fail (heal only to diagnose) | off. */\nfunction healingMode(): HealingMode {\n const value = process.env.RAZO_HEALING;\n return value === 'fail' || value === 'off' ? value : 'pass';\n}\n\n/**\n * How to find a control. A plain string means data-testid (the recommended,\n * stable path — see the auto-testid Vite plugin); the object forms map 1:1\n * to Playwright's user-facing locators, so razo works on apps that were\n * never instrumented. `{ locator }` is the full escape hatch.\n */\nexport type LocatorSpec =\n | string\n | { testId: string }\n | { role: AriaRole; name?: string; exact?: boolean }\n | { label: string; exact?: boolean }\n | { placeholder: string }\n | { text: string; exact?: boolean }\n | { altText: string }\n | { title: string }\n | { css: string }\n | { locator: Locator };\n\nfunction resolveLocator(root: Page | Locator, spec: LocatorSpec): Locator {\n if (typeof spec === 'string') return root.getByTestId(spec);\n if ('testId' in spec) return root.getByTestId(spec.testId);\n if ('role' in spec) return root.getByRole(spec.role, { name: spec.name, exact: spec.exact });\n if ('label' in spec) return root.getByLabel(spec.label, { exact: spec.exact });\n if ('placeholder' in spec) return root.getByPlaceholder(spec.placeholder);\n if ('text' in spec) return root.getByText(spec.text, { exact: spec.exact });\n if ('altText' in spec) return root.getByAltText(spec.altText);\n if ('title' in spec) return root.getByTitle(spec.title);\n if ('css' in spec) return root.locator(spec.css);\n return spec.locator;\n}\n\n/** Human/AI-readable selector string for the StepEvent. */\nfunction describeSelector(spec: LocatorSpec): string {\n if (typeof spec === 'string') return `[data-testid=\"${spec}\"]`;\n if ('testId' in spec) return `[data-testid=\"${spec.testId}\"]`;\n if ('role' in spec) return spec.name ? `role=${spec.role}[name=\"${spec.name}\"]` : `role=${spec.role}`;\n if ('label' in spec) return `label=\"${spec.label}\"`;\n if ('placeholder' in spec) return `placeholder=\"${spec.placeholder}\"`;\n if ('text' in spec) return `text=\"${spec.text}\"`;\n if ('altText' in spec) return `alt=\"${spec.altText}\"`;\n if ('title' in spec) return `title=\"${spec.title}\"`;\n if ('css' in spec) return `css=${spec.css}`;\n return String(spec.locator);\n}\n\nexport abstract class Control {\n protected abstract readonly controlType: string;\n /** @deprecated Only set when the control was located by testid; use `selector`. */\n readonly testId: string;\n\n // Mutable internals so deterministic healing can re-point the control; the\n // public surface stays read-only.\n private _locator: Locator;\n private _selector: string;\n private readonly parent?: Control;\n private readonly fallbacks: LocatorSpec[];\n\n /**\n * Root that fallbacks resolve against — read lazily so a child control\n * follows its `within` parent even after the PARENT healed.\n */\n private get healRoot(): Page | Locator {\n return this.parent?.locator ?? this.page;\n }\n\n private get withinPrefix(): string {\n return this.parent ? `${this.parent.selector} ` : '';\n }\n\n /** The Playwright locator currently backing this control. */\n get locator(): Locator {\n return this._locator;\n }\n\n /** Readable selector, chained through `within` parents; travels in every StepEvent. */\n get selector(): string {\n return this._selector;\n }\n\n constructor(\n readonly page: Page,\n locate: LocatorSpec,\n readonly name: string,\n options: ControlOptions = {},\n ) {\n if (!name || !name.trim()) {\n throw new Error(\n `Control located by ${describeSelector(locate)} needs a human-readable name: an anonymous control breaks the narration.`,\n );\n }\n this.testId =\n typeof locate === 'string' ? locate : 'testId' in locate ? locate.testId : '';\n // A raw { locator } escape hatch is already bound to the page, so it\n // cannot be re-rooted inside a `within` parent.\n this.parent = options.within;\n this.fallbacks = options.fallbacks ?? [];\n this._locator = resolveLocator(this.healRoot, locate);\n this._selector = this.withinPrefix + describeSelector(locate);\n }\n\n /**\n * Core of the framework: runs `fn` inside a test.step titled with the\n * grammar sentence, and emits the matching structured StepEvent —\n * also (especially) when it fails.\n */\n protected async step<T>(\n action: StepAction,\n options: StepOptions,\n fn: () => Promise<T>,\n ): Promise<T> {\n const context: SentenceContext = {\n controlType: this.controlType,\n name: this.name,\n detail: options.detail,\n expected: options.expected,\n };\n const sentence = options.as ?? SENTENCES[action](context);\n const base = {\n action,\n controlType: this.controlType,\n name: this.name,\n sentence,\n detail: options.detail,\n expected: options.expected,\n };\n const fail = (error: unknown, extra: Partial<StepEventExtras> = {}) => {\n emitStepEvent({\n ...base,\n ...extra,\n selector: this.selector,\n status: 'failed',\n error: stripAnsi(error instanceof Error ? error.message : String(error)),\n timestamp: new Date().toISOString(),\n });\n };\n return test.step(sentence, async () => {\n try {\n const result = await fn();\n emitStepEvent({\n ...base, selector: this.selector, status: 'passed', timestamp: new Date().toISOString(),\n });\n return result;\n } catch (error) {\n // Deterministic healing: only when the primary locator resolves to\n // NOTHING. An element that exists but fails the action/assertion is\n // a real failure — healing must never mask a regression.\n const gone = healingMode() !== 'off' && (await this.primaryGone());\n if (gone) {\n const healedSpec = await this.findHealingSpec();\n if (healedSpec) {\n const healed = {\n from: this.selector,\n to: this.withinPrefix + describeSelector(healedSpec),\n };\n this._locator = resolveLocator(this.healRoot, healedSpec);\n this._selector = healed.to;\n if (healingMode() === 'fail') {\n const drift = new Error(\n `locator drift: ${healed.from} no longer resolves; element found via ${healed.to} — update the locator`,\n );\n fail(drift, { healed });\n throw drift;\n }\n try {\n const result = await fn();\n emitStepEvent({\n ...base, selector: this.selector, healed, status: 'passed',\n timestamp: new Date().toISOString(),\n });\n return result;\n } catch (retryError) {\n const actual = options.readActual\n ? await options.readActual().catch(() => undefined)\n : undefined;\n fail(retryError, { healed, actual });\n throw retryError;\n }\n }\n }\n const actual = options.readActual\n ? await options.readActual().catch(() => undefined)\n : undefined;\n const domCandidates = gone ? await this.collectDomCandidates() : undefined;\n fail(error, { actual, domCandidates });\n throw error;\n }\n });\n }\n\n /** True when the primary locator currently matches nothing (safe: never throws). */\n private async primaryGone(): Promise<boolean> {\n try {\n return (await this._locator.count()) === 0;\n } catch {\n return false;\n }\n }\n\n /** First fallback (explicit, then implicit role+name) resolving to exactly one element. */\n private async findHealingSpec(): Promise<LocatorSpec | null> {\n const role = IMPLICIT_ROLE[this.controlType];\n const candidates: LocatorSpec[] = [\n ...this.fallbacks,\n // exact: getByRole's name matching is substring by default, which on a\n // page with \"Export\" and \"Confirm export…\" would match both and block\n // (or worse, mis-target) the heal. Exact accessible name only.\n ...(role ? [{ role, name: this.name, exact: true } as LocatorSpec] : []),\n ];\n for (const spec of candidates) {\n try {\n if ((await resolveLocator(this.healRoot, spec).count()) === 1) return spec;\n } catch {\n // Unresolvable fallback spec: try the next one.\n }\n }\n return null;\n }\n\n /**\n * Same-role elements on the page, as evidence for the analyzer to propose\n * a replacement locator. Best-effort: capped, time-boxed, never throws.\n */\n private async collectDomCandidates(): Promise<string[] | undefined> {\n const role = IMPLICIT_ROLE[this.controlType];\n if (!role) return undefined;\n const collect = async () => {\n const elements = (await this.healRoot.getByRole(role).all()).slice(0, 5);\n const out: string[] = [];\n for (const element of elements) {\n const label =\n (await element.getAttribute('aria-label')) ?? (await element.textContent()) ?? '';\n out.push(`role=${role} name=\"${label.trim().replace(/\\s+/g, ' ').slice(0, 120)}\"`);\n }\n return out.length > 0 ? out : undefined;\n };\n const timeBox = new Promise<undefined>((resolve) => {\n setTimeout(() => resolve(undefined), 2_000).unref?.();\n });\n try {\n // collect() carries its own catch: if it loses the race and rejects\n // later (page closed mid-read), the rejection must not go unhandled.\n return await Promise.race([collect().catch(() => undefined), timeBox]);\n } catch {\n return undefined;\n }\n }\n\n async expectVisible(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-visible',\n {\n ...options,\n expected: 'visible',\n readActual: async () => ((await this.locator.isVisible()) ? 'visible' : 'hidden'),\n },\n () => expect(this.locator).toBeVisible(),\n );\n }\n\n async expectEnabled(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-enabled',\n {\n ...options,\n expected: 'enabled',\n readActual: async () => ((await this.locator.isEnabled()) ? 'enabled' : 'disabled'),\n },\n () => expect(this.locator).toBeEnabled(),\n );\n }\n\n async expectDisabled(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-disabled',\n {\n ...options,\n expected: 'disabled',\n readActual: async () => ((await this.locator.isEnabled()) ? 'enabled' : 'disabled'),\n },\n () => expect(this.locator).toBeDisabled(),\n );\n }\n\n async expectText(expected: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-text',\n {\n ...options,\n expected,\n readActual: async () => ((await this.locator.textContent()) ?? '').trim(),\n },\n () => expect(this.locator).toHaveText(expected),\n );\n }\n\n /** The control as it appears in the narration: `button \"Export\"`. */\n describe(): string {\n return `${this.controlType} \"${this.name}\"`;\n }\n\n // --- universal interactions ---\n\n async hover(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('hover', options, () => this.locator.hover());\n }\n\n async doubleClick(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('double-click', options, () => this.locator.dblclick());\n }\n\n async rightClick(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('right-click', options, () => this.locator.click({ button: 'right' }));\n }\n\n async press(key: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step('press', { ...options, detail: key }, () => this.locator.press(key));\n }\n\n async focus(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('focus', options, () => this.locator.focus());\n }\n\n async scrollTo(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('scroll-to', options, () => this.locator.scrollIntoViewIfNeeded());\n }\n\n async dragTo(target: Control, options: Pick<StepOptions, 'as'> = {}) {\n await this.step('drag', { ...options, detail: target.describe() }, () =>\n this.locator.dragTo(target.locator),\n );\n }\n\n // --- universal assertions ---\n\n async expectHidden(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-hidden',\n {\n ...options,\n expected: 'hidden',\n readActual: async () => ((await this.locator.isVisible()) ? 'visible' : 'hidden'),\n },\n () => expect(this.locator).toBeHidden(),\n );\n }\n\n async expectFocused(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-focused',\n {\n ...options,\n expected: 'focused',\n readActual: () =>\n this.locator.evaluate((el) =>\n el === el.ownerDocument.activeElement ? 'focused' : 'not focused',\n ),\n },\n () => expect(this.locator).toBeFocused(),\n );\n }\n\n async expectContainsText(expected: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-contains-text',\n {\n ...options,\n expected,\n readActual: async () => ((await this.locator.textContent()) ?? '').trim(),\n },\n () => expect(this.locator).toContainText(expected),\n );\n }\n\n async expectAttribute(\n attribute: string,\n expected: string,\n options: Pick<StepOptions, 'as'> = {},\n ) {\n await this.step(\n 'assert-attribute',\n {\n ...options,\n detail: attribute,\n expected,\n readActual: async () => (await this.locator.getAttribute(attribute)) ?? 'none',\n },\n () => expect(this.locator).toHaveAttribute(attribute, expected),\n );\n }\n\n /** For repeated testids (list items): how many elements the control matches. */\n async expectCount(expected: number, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-count',\n {\n ...options,\n expected: String(expected),\n readActual: async () => String(await this.locator.count()),\n },\n () => expect(this.locator).toHaveCount(expected),\n );\n }\n}\n","import { test } from '@playwright/test';\n\n/**\n * Structured event that accompanies every narrated sentence.\n * This is the artifact an AI analyzer consumes: one entry per action\n * or assertion, with status and business context.\n */\nexport interface StepEvent {\n /** Grammar verb: 'click', 'fill', 'assert-text', ... */\n action: string;\n /** Control type: 'button', 'input', 'select', ... */\n controlType: string;\n /** Human-readable control name (\"Export\", \"Filename\") */\n name: string;\n /** The sentence exactly as it appears in the Playwright report */\n sentence: string;\n /** Action payload (typed text, chosen option) */\n detail?: string;\n /** Assertions only: what was expected */\n expected?: string;\n /** Failed assertions only: what was actually found */\n actual?: string;\n /** Stable selector of the control */\n selector: string;\n status: 'passed' | 'failed';\n /** Error message when status === 'failed' */\n error?: string;\n /** Set when the primary locator stopped resolving and a fallback found the element. */\n healed?: { from: string; to: string };\n /** Failed locator-not-found steps: same-role elements on the page, for the analyzer. */\n domCandidates?: string[];\n timestamp: string;\n}\n\n/** Artifacts are meant for an AI, not a terminal: no ANSI codes. */\nexport function stripAnsi(text: string): string {\n // eslint-disable-next-line no-control-regex\n return text.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\n/** Attachment name under which events travel to the reporter. */\nexport const AI_STEP_ATTACHMENT = 'ai-step';\n\n/**\n * Emits a StepEvent as an attachment of the running test. Attachments\n * cross the worker → reporter boundary, so AiReporter can collect them\n * in onTestEnd without shared state.\n */\nexport function emitStepEvent(event: StepEvent): void {\n test.info().attachments.push({\n name: AI_STEP_ATTACHMENT,\n contentType: 'application/json',\n body: Buffer.from(JSON.stringify(event)),\n });\n}\n","import { Control, type StepOptions } from './Control';\n\nexport class Button extends Control {\n protected readonly controlType = 'button';\n\n async click(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('click', options, () => this.locator.click());\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\nexport class Input extends Control {\n protected readonly controlType: string = 'field';\n\n /** For a field, \"text\" means its value, not its DOM content. */\n override async expectText(expected: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-text',\n { ...options, expected, readActual: () => this.locator.inputValue() },\n () => expect(this.locator).toHaveValue(expected),\n );\n }\n\n async fill(value: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step('fill', { ...options, detail: value }, () => this.locator.fill(value));\n }\n\n async clear(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('clear', options, () => this.locator.clear());\n }\n\n async expectEmpty(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-empty',\n { ...options, expected: 'empty', readActual: () => this.locator.inputValue() },\n () => expect(this.locator).toHaveValue(''),\n );\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\n/** Radio group: the testId points at the group container. */\nexport class RadioButton extends Control {\n protected readonly controlType = 'radio group';\n\n async select(option: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step('select', { ...options, detail: option }, () =>\n this.locator.getByRole('radio', { name: option }).check(),\n );\n }\n\n async expectSelected(option: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-selected',\n {\n ...options,\n expected: option,\n readActual: () =>\n this.locator\n .locator('input[type=\"radio\"]')\n .evaluateAll(\n (radios) =>\n (radios.find((r) => (r as HTMLInputElement).checked) as HTMLInputElement)?.value ??\n 'none',\n ),\n },\n () => expect(this.locator.getByRole('radio', { name: option })).toBeChecked(),\n );\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\nexport class Checkbox extends Control {\n protected readonly controlType = 'checkbox';\n\n private readActualState = async () =>\n (await this.locator.isChecked()) ? 'checked' : 'unchecked';\n\n async expectChecked(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-checked',\n { ...options, expected: 'checked', readActual: this.readActualState },\n () => expect(this.locator).toBeChecked(),\n );\n }\n\n async expectUnchecked(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-unchecked',\n { ...options, expected: 'unchecked', readActual: this.readActualState },\n () => expect(this.locator).not.toBeChecked(),\n );\n }\n\n async check(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('check', options, () => this.locator.check());\n }\n\n async uncheck(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('uncheck', options, () => this.locator.uncheck());\n }\n}\n","import { Control, type StepOptions } from './Control';\n\nexport class Select extends Control {\n protected readonly controlType = 'select';\n\n /** Chooses an option by its visible label. */\n async choose(option: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step('choose', { ...options, detail: option }, async () => {\n await this.locator.selectOption({ label: option });\n });\n }\n\n /** Chooses several options by label (for <select multiple>). */\n async chooseMany(optionLabels: string[], options: Pick<StepOptions, 'as'> = {}) {\n await this.step('choose-many', { ...options, detail: optionLabels.join(', ') }, async () => {\n await this.locator.selectOption(optionLabels.map((label) => ({ label })));\n });\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\nexport class Link extends Control {\n protected readonly controlType = 'link';\n\n async open(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('open', options, () => this.locator.click());\n }\n\n async expectHref(expected: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-href',\n {\n ...options,\n expected,\n readActual: async () => (await this.locator.getAttribute('href')) ?? 'none',\n },\n () => expect(this.locator).toHaveAttribute('href', expected),\n );\n }\n}\n","import { Control } from './Control';\n\n/**\n * Read-only element (status messages, headings). It has no actions:\n * it exists so outcome verifications are narrated too.\n */\nexport class Label extends Control {\n protected readonly controlType = 'label';\n}\n","import * as path from 'path';\nimport { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\nexport class FileInput extends Control {\n protected readonly controlType = 'file input';\n\n /** Attaches one or more files by path. The narration shows the file names. */\n async attach(files: string | string[], options: Pick<StepOptions, 'as'> = {}) {\n const list = Array.isArray(files) ? files : [files];\n const names = list.map((f) => path.basename(f)).join(', ');\n await this.step('attach', { ...options, detail: names }, () =>\n this.locator.setInputFiles(list),\n );\n }\n\n async clear(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('clear', options, () => this.locator.setInputFiles([]));\n }\n\n /** Asserts the name of the file currently selected. */\n async expectFile(expectedName: string, options: Pick<StepOptions, 'as'> = {}) {\n const readSelectedName = () =>\n this.locator.evaluate(\n (el) => (el as HTMLInputElement).files?.[0]?.name ?? 'none',\n );\n await this.step(\n 'assert-value',\n { ...options, expected: expectedName, readActual: readSelectedName },\n () => expect.poll(readSelectedName).toBe(expectedName),\n );\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\nexport class Slider extends Control {\n protected readonly controlType = 'slider';\n\n /**\n * Sets the slider value. Range inputs cannot be filled, so the value is\n * set in the DOM and the input/change events the app listens to are fired.\n */\n async setValue(value: number | string, options: Pick<StepOptions, 'as'> = {}) {\n const detail = String(value);\n await this.step('set', { ...options, detail }, async () => {\n await expect(this.locator).toBeVisible();\n await this.locator.evaluate((el, v) => {\n const input = el as HTMLInputElement;\n input.value = v;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n }, detail);\n });\n }\n\n async expectValue(expected: number | string, options: Pick<StepOptions, 'as'> = {}) {\n const value = String(expected);\n await this.step(\n 'assert-value',\n { ...options, expected: value, readActual: () => this.locator.inputValue() },\n () => expect(this.locator).toHaveValue(value),\n );\n }\n}\n","import { Input } from './Input';\n\n/** Same behavior as Input; only the narration names it differently. */\nexport class TextArea extends Input {\n protected override readonly controlType = 'text area';\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\n/** ARIA switch (role=\"switch\" with aria-checked). Actions are idempotent. */\nexport class Switch extends Control {\n protected readonly controlType = 'switch';\n\n private readState = async () =>\n (await this.locator.getAttribute('aria-checked')) === 'true' ? 'on' : 'off';\n\n async turnOn(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('turn-on', options, async () => {\n if ((await this.readState()) !== 'on') await this.locator.click();\n await expect(this.locator).toHaveAttribute('aria-checked', 'true');\n });\n }\n\n async turnOff(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('turn-off', options, async () => {\n if ((await this.readState()) !== 'off') await this.locator.click();\n await expect(this.locator).toHaveAttribute('aria-checked', 'false');\n });\n }\n\n async expectOn(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-on',\n { ...options, expected: 'on', readActual: this.readState },\n () => expect(this.locator).toHaveAttribute('aria-checked', 'true'),\n );\n }\n\n async expectOff(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-off',\n { ...options, expected: 'off', readActual: this.readState },\n () => expect(this.locator).toHaveAttribute('aria-checked', 'false'),\n );\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\n/**\n * ARIA combobox: the testId points at the text input; options are looked up\n * by role anywhere on the page (comboboxes often render their listbox in a\n * portal outside the input's subtree).\n */\nexport class Combobox extends Control {\n protected readonly controlType = 'combobox';\n\n async search(text: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step('fill', { ...options, detail: text }, () => this.locator.fill(text));\n }\n\n async pick(option: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step('pick', { ...options, detail: option }, () =>\n this.page.getByRole('option', { name: option }).click(),\n );\n }\n\n async expectSelected(expected: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-value',\n { ...options, expected, readActual: () => this.locator.inputValue() },\n () => expect(this.locator).toHaveValue(expected),\n );\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\n/** Read-only table assertions over tbody rows. */\nexport class Table extends Control {\n protected readonly controlType = 'table';\n\n private rows() {\n return this.locator.locator('tbody tr');\n }\n\n async expectRowCount(expected: number, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-row-count',\n {\n ...options,\n expected: String(expected),\n readActual: async () => String(await this.rows().count()),\n },\n () => expect(this.rows()).toHaveCount(expected),\n );\n }\n\n async expectRowContains(expected: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-row-contains',\n {\n ...options,\n expected,\n readActual: async () => `${await this.rows().count()} rows, none matching`,\n },\n () => expect(this.rows().filter({ hasText: expected }).first()).toBeVisible(),\n );\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\n/** Native <dialog> or role=\"dialog\". close() sends Escape. */\nexport class Dialog extends Control {\n protected readonly controlType = 'dialog';\n\n private readState = async () => ((await this.locator.isVisible()) ? 'open' : 'closed');\n\n async close(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('close', options, async () => {\n await this.page.keyboard.press('Escape');\n await expect(this.locator).toBeHidden();\n });\n }\n\n async expectOpen(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-open',\n { ...options, expected: 'open', readActual: this.readState },\n () => expect(this.locator).toBeVisible(),\n );\n }\n\n async expectClosed(options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-closed',\n { ...options, expected: 'closed', readActual: this.readState },\n () => expect(this.locator).toBeHidden(),\n );\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\n/** ARIA tablist: the testId points at the tablist container. */\nexport class Tabs extends Control {\n protected readonly controlType = 'tabs';\n\n async open(tab: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step('open-tab', { ...options, detail: tab }, () =>\n this.locator.getByRole('tab', { name: tab }).click(),\n );\n }\n\n async expectActive(expected: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-active-tab',\n {\n ...options,\n expected,\n readActual: async () =>\n (\n (await this.locator\n .locator('[role=\"tab\"][aria-selected=\"true\"]')\n .first()\n .textContent()) ?? 'none'\n ).trim(),\n },\n () =>\n expect(this.locator.getByRole('tab', { name: expected })).toHaveAttribute(\n 'aria-selected',\n 'true',\n ),\n );\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\nexport class Image extends Control {\n protected readonly controlType = 'image';\n\n async expectAlt(expected: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-alt',\n {\n ...options,\n expected,\n readActual: async () => (await this.locator.getAttribute('alt')) ?? 'none',\n },\n () => expect(this.locator).toHaveAttribute('alt', expected),\n );\n }\n\n async expectLoaded(options: Pick<StepOptions, 'as'> = {}) {\n const isLoaded = () =>\n this.locator.evaluate(\n (el) => (el as HTMLImageElement).complete && (el as HTMLImageElement).naturalWidth > 0,\n );\n await this.step(\n 'assert-loaded',\n {\n ...options,\n expected: 'loaded',\n readActual: async () => ((await isLoaded()) ? 'loaded' : 'not loaded'),\n },\n () => expect.poll(isLoaded).toBe(true),\n );\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\n/** Native input[type=\"date\"]; dates travel in ISO format (YYYY-MM-DD). */\nexport class DatePicker extends Control {\n protected readonly controlType = 'date picker';\n\n async pick(isoDate: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step('pick-date', { ...options, detail: isoDate }, () =>\n this.locator.fill(isoDate),\n );\n }\n\n async expectDate(expected: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-value',\n { ...options, expected, readActual: () => this.locator.inputValue() },\n () => expect(this.locator).toHaveValue(expected),\n );\n }\n}\n","import { Control, type StepOptions } from './Control';\n\n/**\n * Dropdown menu: the testId points at the trigger button; menu items are\n * looked up by role anywhere on the page (menus often render in portals).\n */\nexport class Menu extends Control {\n protected readonly controlType = 'menu';\n\n async choose(item: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step('choose', { ...options, detail: item }, async () => {\n await this.locator.click();\n await this.page.getByRole('menuitem', { name: item }).click();\n });\n }\n}\n","import { expect } from '@playwright/test';\nimport { Control, type StepOptions } from './Control';\n\n/**\n * Tooltip: the testId points at the TRIGGER element. The tooltip content is\n * resolved through the trigger's aria-describedby (the accessible pattern),\n * so it works wherever the tooltip node is rendered.\n */\nexport class Tooltip extends Control {\n protected readonly controlType = 'tooltip';\n\n private async tooltipText(): Promise<string> {\n const id = await this.locator.getAttribute('aria-describedby');\n if (!id) return 'no tooltip';\n const text = await this.page.locator(`#${id}`).textContent();\n return (text ?? '').trim() || 'no tooltip';\n }\n\n /** Hovers the trigger and asserts the tooltip content. */\n async expectContent(expected: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step(\n 'assert-tooltip',\n { ...options, expected, readActual: () => this.tooltipText() },\n async () => {\n await this.locator.hover();\n const id = await this.locator.getAttribute('aria-describedby');\n if (!id) throw new Error('trigger has no aria-describedby tooltip');\n await expect(this.page.locator(`#${id}`)).toBeVisible();\n await expect(this.page.locator(`#${id}`)).toHaveText(expected);\n },\n );\n }\n}\n","import { Control, type StepOptions } from './Control';\n\n/** contenteditable region. Inherits expectText/expectContainsText from the base. */\nexport class Editor extends Control {\n protected readonly controlType = 'editor';\n\n async write(text: string, options: Pick<StepOptions, 'as'> = {}) {\n await this.step('fill', { ...options, detail: text }, () => this.locator.fill(text));\n }\n\n async clear(options: Pick<StepOptions, 'as'> = {}) {\n await this.step('clear', options, () => this.locator.fill(''));\n }\n}\n"],"mappings":"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","names":["import_test","actual","import_test","import_test","import_test","import_test","import_test","import_test","import_test","import_test","import_test","import_test","import_test","import_test","import_test","import_test"]}
|