/** * Types and interfaces for the TWD testing library. * * @module twd-types */ /** * All supported assertion names for the `should` function. * * @example * api.should("have.text", "Hello"); * api.should("be.empty"); */ export type AssertionName = 'have.text' | 'contain.text' | 'be.empty' | 'have.attr' | 'have.value' | 'be.disabled' | 'be.enabled' | 'be.checked' | 'be.selected' | 'be.focused' | 'be.visible' | 'be.hidden' | 'have.class'; /** * Negatable assertion names (e.g., 'not.have.text'). */ export type Negatable = T | `not.${T}`; /** * All assertion names, including negated ones. */ export type AnyAssertion = Negatable; /** * Argument types for each assertion. */ export type AssertionArgs = { 'have.text': [expected: string]; 'contain.text': [expected: string]; 'be.empty': []; 'have.attr': [attr: string, value: string]; 'have.value': [value: string]; 'be.disabled': []; 'be.enabled': []; 'be.checked': []; 'be.selected': []; 'be.focused': []; 'be.visible': []; 'be.hidden': []; 'have.class': [className: string]; }; /** * Maps assertion name to its argument tuple. */ export type ArgsFor = A extends `not.${infer Base extends AssertionName}` ? AssertionArgs[Base] : A extends AssertionName ? AssertionArgs[A] : never; /** * Overloads for the `should` function, for best IntelliSense. * * @example * twd.should("have.text", "Hello"); * twd.should("be.empty"); * twd.should("have.class", "active"); */ export type ShouldFn = { (name: 'have.text', expected: string): TWDElemAPI; (name: 'not.have.text', expected: string): TWDElemAPI; (name: 'contain.text', expected: string): TWDElemAPI; (name: 'not.contain.text', expected: string): TWDElemAPI; (name: 'be.empty'): TWDElemAPI; (name: 'not.be.empty'): TWDElemAPI; (name: 'have.attr', attr: string, value: string): TWDElemAPI; (name: 'not.have.attr', attr: string, value: string): TWDElemAPI; (name: 'have.value', value: string): TWDElemAPI; (name: 'not.have.value', value: string): TWDElemAPI; (name: 'be.disabled'): TWDElemAPI; (name: 'not.be.disabled'): TWDElemAPI; (name: 'be.enabled'): TWDElemAPI; (name: 'not.be.enabled'): TWDElemAPI; (name: 'be.checked'): TWDElemAPI; (name: 'not.be.checked'): TWDElemAPI; (name: 'be.selected'): TWDElemAPI; (name: 'not.be.selected'): TWDElemAPI; (name: 'be.focused'): TWDElemAPI; (name: 'not.be.focused'): TWDElemAPI; (name: 'be.visible'): TWDElemAPI; (name: 'not.be.visible'): TWDElemAPI; (name: 'be.hidden'): TWDElemAPI; (name: 'not.be.hidden'): TWDElemAPI; (name: 'have.class', className: string): TWDElemAPI; (name: 'not.have.class', className: string): TWDElemAPI; }; /** * The main API returned by `twd.get()`. * * @example * ```ts * const btn = await twd.get("button"); * btn.should("have.text", "Clicked").click(); * * ``` * */ export interface TWDElemAPI { /** The underlying DOM element. */ el: Element; /** * Asserts something about the element. * @param name The name of the assertion. * @param args Arguments for the assertion. * @returns The same API for chaining. * * @example * ```ts * const btn = await twd.get("button"); * btn.should("have.text", "Click me").should("not.be.disabled"); * * ``` * */ should: ShouldFn; } /** * Options for `twd.waitFor()`. */ export interface WaitForOptions { /** Max time to wait in ms. Default: 2000 */ timeout?: number; /** Poll interval in ms. Default: 50 */ interval?: number; /** Context message included in timeout errors */ message?: string; }