import { CB } from 'vest-utils'; import { StandardSchemaV1 } from 'vest-utils/standardSchemaSpec'; import { Subscribe } from '../core/VestBus/VestBus'; import { TIsolateSuite } from '../core/isolate/IsolateSuite/IsolateSuite'; import { FieldExclusion } from '../hooks/focused/focused'; import { SuiteResult, TFieldName, TGroupName, InferSchemaData, InferSchemaOutput, TSchema, } from '../suiteResult/SuiteResultTypes'; import { SuiteSelectors } from '../suiteResult/selectors/suiteSelectors'; import { TTypedMethods } from './getTypedMethods'; export type SuiteCallbackWithSchema< S extends TSchema, T extends CB, > = S extends undefined ? T : (data: InferSchemaOutput, ...args: any[]) => void; export type Suite< F extends TFieldName, G extends TGroupName, T extends CB = CB, S extends TSchema = undefined, > = SuiteMethods & StandardSchemaV1, InferSchemaData>; type SuiteMethods< F extends TFieldName, G extends TGroupName, T extends CB, S extends TSchema, > = { dump: CB; get: CB>; resume: CB; reset: CB; remove: CB; resetField: CB; run: ( ...args: S extends undefined ? Parameters : [data: InferSchemaData, ...args: any[]] ) => SuiteResult; runStatic: ( ...args: S extends undefined ? Parameters : [data: InferSchemaData, ...args: any[]] ) => SuiteResult; validate: ( ...args: S extends undefined ? Parameters : [data: InferSchemaData, ...args: any[]] ) => SuiteResult; subscribe: Subscribe; } & AfterMethods & TTypedMethods & SuiteSelectors; type FocusedMethods< F extends TFieldName, G extends TGroupName, T extends CB, S extends TSchema, > = { afterEach: CB, [callback: CB]>; afterField: CB, [fieldName: F, callback: CB]>; focus: CB, [config: SuiteModifiers]>; only: CB, [onlyField: FieldExclusion]>; // run is included but runStatic is intentionally omitted: runStatic is stateless // and does not carry focus modifiers, so it is not part of the focused API surface. run: ( ...args: S extends undefined ? Parameters : [data: Partial>, ...args: any[]] ) => SuiteResult; }; type AfterMethods< F extends TFieldName, G extends TGroupName, T extends CB, S extends TSchema, > = { afterEach: CB, [callback: CB]>; afterField: CB, [fieldName: F, callback: CB]>; focus: CB, [config: SuiteModifiers]>; only: CB, [onlyField: FieldExclusion]>; run: ( ...args: S extends undefined ? Parameters : [data: InferSchemaData, ...args: any[]] ) => SuiteResult; }; /** * Modifiers that control which fields and groups are included or excluded * during a focused suite run. These can be provided either via * `suite.focus(modifiers)` or via shorthand methods: * - `suite.only(field)` is a shortcut for `suite.focus({ only: field })` * * - `only` — Run only the specified field(s). All others are excluded unless * explicitly included via `include()`. * - `skip` — Skip the specified field(s). All others run as usual. * - `skipGroup` — Skip all tests inside the named group(s). Tests outside the * matched groups are unaffected. * - `onlyGroup` — Run only tests inside the named group(s). Top-level tests * outside any group are also excluded. */ export type SuiteModifiers< F extends TFieldName, G extends TGroupName = TGroupName, > = { only?: FieldExclusion; onlyGroup?: G | G[]; skip?: FieldExclusion; skipGroup?: G | G[]; };