vest 6.2.8 → 6.3.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.
Files changed (37) hide show
  1. package/dist/exports/classnames.cjs +2 -2
  2. package/dist/exports/classnames.mjs +2 -2
  3. package/dist/exports/debounce.cjs +1 -1
  4. package/dist/exports/debounce.mjs +1 -1
  5. package/dist/exports/memo.cjs +1 -1
  6. package/dist/exports/memo.mjs +1 -1
  7. package/dist/exports/parser.cjs +2 -2
  8. package/dist/exports/parser.mjs +2 -2
  9. package/dist/{parser-BwKlnVQB.mjs → parser-BDHdwZo7.mjs} +2 -2
  10. package/dist/{parser-BwKlnVQB.mjs.map → parser-BDHdwZo7.mjs.map} +1 -1
  11. package/dist/{parser-kVnFfJrH.cjs → parser-DagIUS0b.cjs} +2 -2
  12. package/dist/{parser-kVnFfJrH.cjs.map → parser-DagIUS0b.cjs.map} +1 -1
  13. package/dist/{vest-Bb1dSrg7.cjs → vest-B-NiE6Di.cjs} +22 -11
  14. package/dist/vest-B-NiE6Di.cjs.map +1 -0
  15. package/dist/{vest-CJMSUTEl.mjs → vest-C_ndMBdJ.mjs} +23 -12
  16. package/dist/vest-C_ndMBdJ.mjs.map +1 -0
  17. package/dist/vest.cjs +1 -1
  18. package/dist/vest.mjs +1 -1
  19. package/package.json +6 -3
  20. package/src/core/Runtime.ts +10 -3
  21. package/src/core/VestBus/VestBus.ts +3 -15
  22. package/src/core/context/SuiteContext.ts +2 -2
  23. package/src/core/isolate/IsolateTest/IsolateTestReconciler.ts +4 -7
  24. package/src/isolates/omitWhen.ts +10 -4
  25. package/src/isolates/skipWhen.ts +7 -1
  26. package/src/suite/__tests__/recordValidation.test.ts +113 -0
  27. package/src/suite/__tests__/schema.runtime.test.ts +3 -2
  28. package/src/suite/__tests__/schema.types.test.ts +49 -0
  29. package/types/IsolateSuite-D5Qr0Oyg.d.mts.map +1 -1
  30. package/types/IsolateSuite-t022G3ua.d.cts.map +1 -1
  31. package/types/vest.d.cts +17 -5
  32. package/types/vest.d.cts.map +1 -1
  33. package/types/vest.d.mts +17 -5
  34. package/types/vest.d.mts.map +1 -1
  35. package/types/vest.d.ts +17 -5
  36. package/dist/vest-Bb1dSrg7.cjs.map +0 -1
  37. package/dist/vest-CJMSUTEl.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vest-B-NiE6Di.cjs","names":["RegistryPredicates: Record<IsolateCategory, RegistryCategoryConfig>","IsolateRegistry","Isolate","IsolateTestStateMachine","test","Walker","IsolateSelectors","makeResult","TestStatus","TestAction","VestRuntime","stateRef: StateExtra","VestRuntime","VestReconciler","makeResult","makeResult","output: FailureMessages","group","fieldName","makeResult","fieldName: F","message: string | undefined","groupName: G | undefined","VestRuntime","makeBrand","enforce","makeResult","VestRuntime","IsolateInspector","Walker","VestRuntime","Walker","VestRuntime","summary","group","VestRuntime","Walker","FocusSelectors","VestRuntime","makeResult","VestRuntime","mode","makeResult","makeResult","makeResult","makeResult","VestRuntime","Walker","makeResult","VestRuntime","Bus","VestRuntime","deferThrow","IsolateInspector","makeResult","Reconciler","reconcilers: IsolateReconciler[]","payload: IsolateTestPayload","Isolate","IsolateTestStateMachine","makeResult","makeResult","VestRuntime","makeResult","FocusModes","makeResult","Walker","FocusSelectors","conditionRef: IncludeConditionRef<F, G>","skip","enforce","only","VestRuntime","only","makeResult","VestRuntime","makeResult"],"sources":["../src/errors/ErrorStrings.ts","../src/hooks/optional/Modes.ts","../src/core/context/SuiteContext.ts","../src/core/test/TestRegistry.ts","../src/suiteResult/Severity.ts","../src/core/isolate/VestIsolateType.ts","../src/core/isolate/IsolateTest/VestTest.ts","../src/suiteResult/SuiteResultTypes.ts","../src/core/isolate/registerTests.ts","../src/core/Runtime.ts","../src/core/test/helpers/matchingFieldName.ts","../src/suiteResult/selectors/collectFailures.ts","../src/suiteResult/selectors/suiteSelectors.ts","../src/suiteResult/SummaryFailure.ts","../src/core/isolate/IsolateSuite/IsolateSuite.ts","../src/hooks/optional/OptionalTypes.ts","../src/hooks/optional/optional.ts","../src/core/selectors/useIsPending.ts","../src/suiteResult/selectors/useSetValidProperty.ts","../src/suiteResult/selectors/useProduceSuiteSummary.ts","../src/suiteResult/suiteResult.ts","../src/suiteResult/selectors/LazyDraft.ts","../src/isolates/skipWhen.ts","../src/hooks/focused/useIsExcluded.ts","../src/core/test/helpers/nonMatchingSeverityProfile.ts","../src/suiteResult/selectors/hasFailuresByTestObjects.ts","../src/hooks/optional/mode.ts","../src/core/test/testLevelFlowControl/verifyTestRun.ts","../src/core/isolate/IsolateTest/isSameProfileTest.ts","../src/core/isolate/IsolateTest/cancelOverriddenPendingTest.ts","../src/core/isolate/IsolateTest/TestWalker.ts","../src/hooks/optional/omitOptionalFields.ts","../src/suite/runCallbacks.ts","../src/core/VestBus/VestBus.ts","../src/core/isolate/IsolateTest/IsolateTestReconciler.ts","../src/core/isolate/VestReconciler.ts","../src/core/isolate/IsolateTest/IsolateTest.ts","../src/core/test/helpers/shouldUseErrorMessage.ts","../src/core/test/Abortable.ts","../src/core/test/testLevelFlowControl/runTest.ts","../src/core/test/validateTestParams.ts","../src/core/test/test.ts","../src/hooks/focused/focused.ts","../src/hooks/focused/useHasOnliedTests.ts","../src/hooks/include.ts","../src/hooks/useWarn.ts","../src/hooks/warn.ts","../src/core/isolate/IsolateEach/IsolateEach.ts","../src/isolates/each.ts","../src/isolates/group.ts","../src/isolates/omitWhen.ts","../src/suite/after/deferDoneCallback.ts","../src/suite/getStandardSchema.ts","../src/suite/getTypedMethods.ts","../src/suite/useCreateSuiteRunner.ts","../src/suite/useCreateSuiteMethods.ts","../src/suite/validateSuiteCallback/validateSuiteCallback.ts","../src/suite/createSuite.ts"],"sourcesContent":["export enum ErrorStrings {\n HOOK_CALLED_OUTSIDE = 'hook called outside of a running suite.',\n EXPECTED_VEST_TEST = 'Expected value to be an instance of IsolateTest',\n FIELD_NAME_REQUIRED = 'Field name must be passed',\n SUITE_MUST_BE_INITIALIZED_WITH_FUNCTION = 'Suite must be initialized with a function',\n PARSER_EXPECT_RESULT_OBJECT = \"Vest parser: expected argument at position 0 to be Vest's result object.\",\n WARN_MUST_BE_CALLED_FROM_TEST = 'Warn must be called from within the body of a test function',\n USE_WARN_MUST_BE_CALLED_FROM_TEST = 'useWarn must be called from within the body of a test function',\n EACH_CALLBACK_MUST_BE_A_FUNCTION = 'Each must be called with a function',\n INVALID_PARAM_PASSED_TO_FUNCTION = 'Incompatible params passed to {fn_name} function. \"{param}\" must be of type {expected}',\n TESTS_CALLED_IN_DIFFERENT_ORDER = `Vest Critical Error: Tests called in different order than previous run.\n expected: {fieldName}\n received: {prevName}\n This can happen on one of two reasons:\n 1. You're using if/else statements to conditionally select tests. Instead, use \"skipWhen\".\n 2. You are iterating over a list of tests, and their order changed. Use \"each\" and a custom key prop so that Vest retains their state.`,\n UNEXPECTED_TEST_REGISTRATION_ERROR = `Unexpected error encountered during test registration.\n Please report this issue to Vest's Github repository.\n Test Object: {testObject}.\n Error: {error}.`,\n UNEXPECTED_TEST_RUN_ERROR = `Unexpected error encountered during test run. Please report this issue to Vest's Github repository.\n Test Object: {testObject}.`,\n INCLUDE_SELF = 'Trying to call include.when on the same field.',\n}\n","export enum Modes {\n EAGER = 'EAGER',\n ALL = 'ALL',\n ONE = 'ONE',\n}\n","import { createCascade } from 'context';\nimport { assign, TinyState, createTinyState, DynamicValue } from 'vest-utils';\n\nimport { Modes } from '../../hooks/optional/Modes';\nimport { SuiteModifiers } from '../../suite/SuiteTypes';\nimport { TFieldName, TSchema } from '../../suiteResult/SuiteResultTypes';\nimport { TIsolateTest } from '../isolate/IsolateTest/IsolateTest';\n\nexport const SuiteContext = createCascade<CTXType>((ctxRef, parentContext) => {\n if (parentContext) {\n return null;\n }\n\n return assign(\n {\n inclusion: {},\n mode: createTinyState<Modes>(Modes.EAGER),\n modifiers: {\n onlyGroup: new Set<string>(),\n skipGroup: new Set<string>(),\n },\n schema: null,\n suiteParams: [],\n },\n ctxRef,\n );\n});\n\ntype CTXType = {\n inclusion: Record<string, DynamicValue<boolean>>;\n mode: TinyState<Modes>;\n suiteParams: any[];\n currentTest?: TIsolateTest;\n skipped?: boolean;\n schema: TSchema;\n modifiers: TInternalModifiers<TFieldName>;\n};\n\nexport type TInternalModifiers<F extends TFieldName = TFieldName> = Omit<\n SuiteModifiers<F>,\n 'onlyGroup' | 'skipGroup'\n> & {\n onlyGroup: Set<string>;\n skipGroup: Set<string>;\n};\n\nexport function useCurrentTest(msg?: string) {\n return SuiteContext.useX(msg).currentTest;\n}\n\nexport function useInclusion() {\n return SuiteContext.useX().inclusion;\n}\n\nexport function useMode() {\n return SuiteContext.useX().mode();\n}\n\nexport function useSkipped() {\n return SuiteContext.useX().skipped ?? false;\n}\n\nexport function useSuiteParams() {\n return SuiteContext.useX().suiteParams;\n}\n","import {\n IsolateRegistry,\n RegistryCategoryConfig,\n TIsolate,\n} from 'vestjs-runtime';\n\nimport { TIsolateTest } from '../isolate/IsolateTest/IsolateTest';\nimport { VestTest } from '../isolate/IsolateTest/VestTest';\nimport { TFieldName } from '../../suiteResult/SuiteResultTypes';\n\n/**\n * Represents the categories of isolates tracked within the registry.\n */\nexport type IsolateCategory =\n | 'all'\n | 'failed'\n | 'omitted'\n | 'passing'\n | 'pending'\n | 'tested'\n | 'valid'\n | 'warning';\n\n/**\n * A predicate function used to determine if an isolate belongs to a given category.\n */\ntype IsolatePredicate = (isolate: TIsolate) => boolean;\n\n/**\n * Helper to extract field name from test isolate.\n */\nconst getFieldName = (isolate: TIsolate): TFieldName =>\n (isolate as TIsolateTest).data?.fieldName;\n\n/**\n * Helper to create a predicate that first checks if an isolate is a VestTest.\n */\nconst isTestAnd =\n (predicate: (isolate: TIsolateTest) => boolean): IsolatePredicate =>\n (isolate: TIsolate) =>\n VestTest.is(isolate) && predicate(isolate as TIsolateTest);\n\n/**\n * Set of predicates used to categorize isolates.\n */\nconst RegistryPredicates: Record<IsolateCategory, RegistryCategoryConfig> = {\n all: {\n getKey: getFieldName,\n predicate: isTestAnd(() => true),\n },\n failed: {\n getKey: getFieldName,\n predicate: isTestAnd(isolate => VestTest.isFailing(isolate).unwrap()),\n },\n omitted: {\n getKey: getFieldName,\n predicate: isTestAnd(isolate => VestTest.isOmitted(isolate).unwrap()),\n },\n passing: {\n getKey: getFieldName,\n predicate: isTestAnd(isolate => VestTest.isPassing(isolate).unwrap()),\n },\n pending: {\n getKey: getFieldName,\n predicate: isTestAnd(isolate => VestTest.isStarted(isolate).unwrap()),\n },\n tested: {\n getKey: getFieldName,\n predicate: isTestAnd(isolate => VestTest.isTested(isolate).unwrap()),\n },\n valid: {\n getKey: getFieldName,\n predicate: isTestAnd(\n isolate =>\n VestTest.isPassing(isolate).unwrap() ||\n VestTest.isWarning(isolate).unwrap(),\n ),\n },\n warning: {\n getKey: getFieldName,\n predicate: isTestAnd(isolate => VestTest.isWarning(isolate).unwrap()),\n },\n};\n\n/**\n * Updates the registration of an isolate in all relevant characteristic indices.\n *\n * This function is called reactively whenever an isolate is registered or its state changes.\n * It re-evaluates all known predicates and ensures the isolate is correctly added to or\n * removed from the corresponding registry maps.\n *\n * @param isolate - The isolate node to update in the registry.\n */\nexport function useUpdateRegistry(isolate: TIsolate) {\n IsolateRegistry.useUpdateRegistry(isolate, RegistryPredicates);\n}\n\n/**\n * Accessor for the registry. Retrieves isolates indexed under a specific characteristic.\n *\n * @param category - The characteristic category to look up (e.g., 'failed', 'pending').\n * @param fieldName - Optional field name to filter the results by.\n * @returns A Set containing the isolates that currently match the characteristic.\n *\n * @example\n * ```typescript\n * // Get all failed tests for the 'email' field\n * const failedEmailTests = useGetFromRegistry('failed', 'email');\n * ```\n */\nexport function useGetFromRegistry(\n category: IsolateCategory,\n fieldName?: string,\n): Set<TIsolate> {\n return IsolateRegistry.useGetFromRegistry(category, fieldName);\n}\n\n/**\n * Checks if the registry contains any isolates for a given category and optional field name.\n *\n * @param category - The category to check for.\n * @param fieldName - The name of the field to check for.\n * @returns true if the registry contains matching isolates.\n */\nexport function useHasFromRegistry(\n category: IsolateCategory,\n fieldName?: string,\n): boolean {\n return IsolateRegistry.useHasFromRegistry(category, fieldName);\n}\n\n/**\n * Removes all entries for a specific field name from the registry.\n * This is useful when a field is removed from the suite and its state should be cleared.\n *\n * @param fieldName - The name of the field to remove from the registry.\n */\nexport function useRemoveFieldFromRegistry(fieldName: string): void {\n IsolateRegistry.useRemoveFieldFromRegistry(fieldName);\n}\n\n/**\n * Initializes registry event listeners.\n *\n * @param bus - The event bus to subscribe to.\n */\nexport function useRegistryBusEvents(bus: any) {\n // We're listening to the REMOVE_FIELD event to ensure the registry\n // stays in sync when a field is removed from the suite.\n bus.on('REMOVE_FIELD', (fieldName: string) => {\n useRemoveFieldFromRegistry(fieldName);\n });\n}\n\n/**\n * Clears all registry indices from the root isolate.\n * This is primarily used during tree reprocessing to ensure a clean slate\n * before rebuilding the registry from the current tree state.\n *\n * @param root - The suite's root isolate containing the registry.\n */\nexport function useClearRegistry(root: TIsolate) {\n IsolateRegistry.useClearRegistry(root);\n}\n","export enum Severity {\n WARNINGS = 'warnings',\n ERRORS = 'errors',\n}\n\nexport enum SeverityCount {\n ERROR_COUNT = 'errorCount',\n WARN_COUNT = 'warnCount',\n}\n\nexport function countKeyBySeverity(severity: Severity): SeverityCount {\n return severity === Severity.ERRORS\n ? SeverityCount.ERROR_COUNT\n : SeverityCount.WARN_COUNT;\n}\n\nexport enum TestSeverity {\n Error = 'error',\n Warning = 'warning',\n}\n","import { CB } from 'vest-utils';\nimport { Isolate, IsolateKey, TIsolate } from 'vestjs-runtime';\n\nimport { TIsolateTest } from './IsolateTest/IsolateTest';\n\nexport const VestIsolateType = {\n Each: 'Each',\n Focused: 'Focused',\n Group: 'Group',\n OmitWhen: 'OmitWhen',\n Reorderable: 'Reorderable',\n SkipWhen: 'SkipWhen',\n Suite: 'Suite',\n Test: 'Test',\n};\n\nexport type TVestIsolate<P = void> = TIsolate<\n P & {\n tests: TIsolateTest[];\n }\n>;\n\nexport function createVestIsolate<Payload = Record<string, any>>(\n type: string,\n cb: CB,\n payload: Payload,\n key?: IsolateKey,\n): TVestIsolate<Payload> {\n return Isolate.create(\n type,\n cb,\n {\n ...payload,\n tests: [],\n },\n key,\n );\n}\n\nexport function isVestIsolate(\n isolate: TIsolate | null,\n): isolate is TVestIsolate {\n return Array.isArray(isolate?.data?.tests);\n}\n","import {\n Maybe,\n invariant,\n isPromise,\n dynamicValue,\n makeResult,\n Result,\n} from 'vest-utils';\nimport {\n IsolateMutator,\n IsolateSelectors,\n TIsolate,\n Walker,\n} from 'vestjs-runtime';\n\nimport { useUpdateRegistry } from '../../test/TestRegistry';\n\nimport { ErrorStrings } from '../../../errors/ErrorStrings';\nimport { TIsolateGroup } from '../../../isolates/group';\nimport { TestSeverity } from '../../../suiteResult/Severity';\nimport { TFieldName, TGroupName } from '../../../suiteResult/SuiteResultTypes';\nimport {\n IsolateTestStateMachine,\n TestAction,\n TestStatus,\n} from '../../StateMachines/IsolateTestStateMachine';\nimport { VestIsolateType } from '../VestIsolateType';\n\nimport type { TIsolateTest } from './IsolateTest';\n\nexport class VestTest {\n static stateMachine = IsolateTestStateMachine;\n\n // Read\n /**\n * Retrieves the data object from the test isolate.\n */\n static getData<F extends TFieldName = TFieldName>(test: TIsolateTest<F>) {\n invariant(test.data);\n return test.data;\n }\n\n /**\n * Retrieves the current status of the test.\n */\n static getStatus(test: TIsolateTest): TestStatus {\n const data = VestTest.getData(test);\n return data.testStatus;\n }\n\n /**\n * Sets the status of the test, triggering a state machine transition.\n */\n static setStatus(\n test: TIsolateTest,\n status: TestStatus,\n payload?: any,\n ): void {\n const currentStatus = VestTest.getStatus(test);\n const nextStatus = VestTest.stateMachine.staticTransition(\n currentStatus,\n status,\n payload,\n );\n\n VestTest.setData(test, current => ({\n ...current,\n testStatus: nextStatus,\n }));\n\n useUpdateRegistry(test);\n }\n\n static getGroupName<G extends TGroupName>(test: TIsolateTest): Maybe<G> {\n const group = Walker.closest<TIsolateGroup<G>>(test, i =>\n IsolateSelectors.isIsolateType(i, VestIsolateType.Group),\n );\n return group?.data.groupName;\n }\n\n /**\n * Checks if the given isolate is a VestTest isolate.\n */\n static is(isolate?: Maybe<TIsolate>): isolate is TIsolateTest {\n return IsolateSelectors.isIsolateType<TIsolateTest>(\n isolate,\n VestIsolateType.Test,\n );\n }\n\n static cast<F extends TFieldName = TFieldName>(\n isolate?: Maybe<TIsolate>,\n ): Result<TIsolateTest<F>, string> {\n return VestTest.is(isolate)\n ? makeResult.Ok(isolate as TIsolateTest<F>)\n : makeResult.Err(ErrorStrings.EXPECTED_VEST_TEST);\n }\n\n static statusEquals(test: TIsolateTest, status: TestStatus): boolean {\n return VestTest.getStatus(test) === status;\n }\n\n static warns(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(\n VestTest.getData(test).severity === TestSeverity.Warning,\n );\n }\n\n static isOmitted(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(VestTest.statusEquals(test, TestStatus.OMITTED));\n }\n\n static isUntested(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(VestTest.statusEquals(test, TestStatus.UNTESTED));\n }\n\n static isFailing(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(VestTest.statusEquals(test, TestStatus.FAILED));\n }\n\n static isCanceled(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(VestTest.statusEquals(test, TestStatus.CANCELED));\n }\n\n static isSkipped(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(VestTest.statusEquals(test, TestStatus.SKIPPED));\n }\n\n static isPassing(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(VestTest.statusEquals(test, TestStatus.PASSING));\n }\n\n static isWarning(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(VestTest.statusEquals(test, TestStatus.WARNING));\n }\n\n /**\n * Checks if the test has failed or has a warning.\n */\n static hasFailures(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(\n VestTest.isFailing(test).unwrap() || VestTest.isWarning(test).unwrap(),\n );\n }\n\n static isNonActionable(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(\n VestTest.isSkipped(test).unwrap() ||\n VestTest.isOmitted(test).unwrap() ||\n VestTest.isCanceled(test).unwrap(),\n );\n }\n\n /**\n * Checks if the test has been run and completed (passed or failed).\n */\n static isTested(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(\n VestTest.hasFailures(test).unwrap() || VestTest.isPassing(test).unwrap(),\n );\n }\n\n static isStartedStatus(test: TIsolateTest): boolean {\n return VestTest.statusEquals(test, TestStatus.STARTED);\n }\n\n static isStarted(test: TIsolateTest): Result<boolean> {\n return makeResult.Ok(VestTest.isStartedStatus(test));\n }\n\n /**\n * Checks if the test is awaiting resolution (skipped, untested, or started).\n */\n static awaitsResolution(test: TIsolateTest): Result<boolean> {\n // Is the test in a state where it can still be run, or complete running\n // and its final status is indeterminate?\n return makeResult.Ok(\n VestTest.isSkipped(test).unwrap() ||\n VestTest.isUntested(test).unwrap() ||\n VestTest.isStartedStatus(test),\n );\n }\n\n /**\n * Checks if the test is asynchronous.\n */\n static isAsyncTest(test: TIsolateTest): boolean {\n return isPromise(VestTest.getData(test).asyncTest);\n }\n\n // Mutate\n\n static setStarted(test: TIsolateTest) {\n VestTest.setStatus(test, TestStatus.STARTED);\n }\n\n static fail(test: TIsolateTest): void {\n VestTest.setStatus(\n test,\n VestTest.warns(test).unwrap() ? TestStatus.WARNING : TestStatus.FAILED,\n );\n }\n\n static pass(test: TIsolateTest): void {\n VestTest.setStatus(test, TestStatus.PASSING);\n }\n\n static warn(test: TIsolateTest): void {\n VestTest.setData(test, current => ({\n ...current,\n severity: TestSeverity.Warning,\n }));\n }\n\n // VestTest.setSeverity intentionally skips useUpdateRegistry; severity is consumed by fail() -> VestTest.setStatus(), which calls useUpdateRegistry and avoids intermediate registry updates.\n static setSeverity(test: TIsolateTest, severity: TestSeverity): void {\n if (VestTest.isTested(test).unwrap()) {\n return;\n }\n\n VestTest.setData(test, current => ({\n ...current,\n severity,\n }));\n }\n\n static setData(\n test: TIsolateTest,\n setter:\n | ((current: TIsolateTest['data']) => TIsolateTest['data'])\n | TIsolateTest['data'],\n ): void {\n test.data = dynamicValue(setter, VestTest.getData(test));\n }\n\n static skip(test: TIsolateTest, force?: boolean): void {\n // Without this force flag, the test will be marked as skipped even if it is pending.\n // This means that it will not be counted in \"allIncomplete\" and its done callbacks\n // will not be called, or will be called prematurely.\n // What this mostly say is that when we have a pending test for one field, and we then\n // start typing in a different field - the pending test will be canceled, which\n // is usually an unwanted behavior.\n // The only scenario in which we DO want to cancel the async test regardless\n // is when we specifically skip a test with `skipWhen`, which is handled by the\n // \"force\" boolean flag.\n // I am not a fan of this flag, but it gets the job done.\n VestTest.setStatus(test, TestStatus.SKIPPED, force);\n }\n\n static cancel(test: TIsolateTest): void {\n VestTest.setStatus(test, TestStatus.CANCELED);\n IsolateMutator.abort(test, TestStatus.CANCELED);\n }\n\n static omit(test: TIsolateTest): void {\n VestTest.setStatus(test, TestStatus.OMITTED);\n }\n\n static reset(test: TIsolateTest): void {\n VestTest.setStatus(test, TestAction.RESET);\n }\n}\n","import { CB, Nullable } from 'vest-utils';\nimport { StandardSchemaV1 } from 'vest-utils/standardSchemaSpec';\n\nimport { TIsolateSuite } from '../core/isolate/IsolateSuite/IsolateSuite';\n\nimport { Severity } from './Severity';\nimport { SummaryFailure } from './SummaryFailure';\nimport { SuiteSelectors } from './selectors/suiteSelectors';\nimport { SuiteModifiers } from '../suite/SuiteTypes';\n\nexport class SummaryBase {\n public errorCount = 0;\n public warnCount = 0;\n public testCount = 0;\n public pendingCount = 0;\n}\n\nexport class SuiteSummary<\n F extends TFieldName,\n G extends TGroupName,\n D = unknown,\n S extends TSchema = undefined,\n> extends SummaryBase {\n public [Severity.ERRORS]: SummaryFailure<F, G>[] = [];\n public [Severity.WARNINGS]: SummaryFailure<F, G>[] = [];\n public groups: Groups<G, F> = {} as Groups<G, F>;\n public tests: Tests<F> = {} as Tests<F>;\n public run!: {\n data: {\n raw: D | undefined;\n parsed: Partial<InferSchemaOutput<S>> | undefined;\n };\n time: Date;\n focus?: SuiteModifiers<F, G>;\n };\n public valid: Nullable<boolean> = null;\n\n constructor() {\n super();\n\n Object.defineProperty(this, 'run', {\n configurable: true,\n enumerable: false,\n value: {\n data: {\n raw: undefined,\n parsed: undefined,\n },\n time: new Date(0),\n },\n writable: true,\n });\n }\n}\n\nexport type TestsContainer<F extends TFieldName, _G extends TGroupName> =\n | Group<F>\n | Tests<F>;\n\nexport type Groups<G extends TGroupName, F extends TFieldName> = {\n [key in G]: Group<F>;\n};\ntype Group<F extends TFieldName> = {\n [key in F]: SingleTestSummary;\n} & ValidProperty;\nexport type Tests<F extends TFieldName> = { [key in F]: SingleTestSummary };\n\nexport type SingleTestSummary = SummaryBase &\n CommonSummaryProperties &\n ValidProperty;\n\ntype ValidProperty = {\n valid: Nullable<boolean>;\n};\n\nexport type CommonSummaryProperties = SummaryBase & {\n errors: string[];\n warnings: string[];\n};\n\nexport type GetFailuresResponse = FailureMessages | string[];\n\nexport type FailureMessages = Record<string, string[]>;\nexport type TSchema = any;\n\nexport type InferSchemaData<S> = S extends {\n '~standard': { types: { input: infer I } };\n}\n ? I\n : S extends { infer: infer T }\n ? { [K in keyof T]: T[K] } & NonNullable<unknown>\n : any;\n\nexport type InferSchemaOutput<S> = S extends {\n '~standard': { types: { output: infer O } };\n}\n ? O\n : S extends { infer: infer T }\n ? { [K in keyof T]: T[K] } & NonNullable<unknown>\n : any;\n\ntype SuiteResultData<\n F extends TFieldName,\n G extends TGroupName,\n S extends TSchema = undefined,\n D = unknown,\n> =\n | (Omit<SuiteSummary<F, G, D, S>, 'valid'> &\n SuiteSelectors<F, G> & {\n valid: true;\n value: InferSchemaOutput<S>;\n issues?: undefined;\n })\n | (Omit<SuiteSummary<F, G, D, S>, 'valid'> &\n SuiteSelectors<F, G> & {\n valid: false;\n issues: ReadonlyArray<StandardSchemaV1.Issue>;\n value?: undefined;\n })\n | (Omit<SuiteSummary<F, G, D, S>, 'valid'> &\n SuiteSelectors<F, G> & {\n valid: null;\n issues?: undefined;\n value?: undefined;\n });\n\ntype BrandedFieldName<F extends string> = F & TFieldName;\ntype BrandedGroupName<G extends string> = G & TGroupName;\n\nexport type SuiteResult<\n F extends string = TFieldName,\n G extends string = TGroupName,\n S extends TSchema = undefined,\n D = unknown,\n> = SuiteResultData<BrandedFieldName<F>, BrandedGroupName<G>, S, D> & {\n dump: CB<TIsolateSuite>;\n types: S extends undefined\n ? undefined\n : { input: InferSchemaData<S>; output: InferSchemaOutput<S> };\n};\n\n// Public-facing aliases remain plain strings; internals can still brand via FieldName/GroupName.\nexport type TFieldName = string;\nexport type TGroupName = string;\n","import { dynamicValue } from 'vest-utils';\nimport { VestRuntime, TIsolate } from 'vestjs-runtime';\n\nimport { TIsolateTest } from './IsolateTest/IsolateTest';\nimport { VestTest } from './IsolateTest/VestTest';\nimport { useUpdateRegistry, useClearRegistry } from '../test/TestRegistry';\n\nexport function useTestObjects(): [\n TIsolateTest[],\n (tests: TIsolateTest[] | ((prev: TIsolateTest[]) => TIsolateTest[])) => void,\n] {\n const root = VestRuntime.useAvailableRoot();\n\n if (!root) {\n return [[], () => {}];\n }\n\n return [root.data.tests || [], setTests];\n\n function setTests(\n tests: TIsolateTest[] | ((prev: TIsolateTest[]) => TIsolateTest[]),\n ) {\n if (!root) return;\n root.data.tests = dynamicValue(tests, root.data.tests || []);\n }\n}\n\nconst registeredTestsCache = new WeakMap<TIsolate, WeakSet<TIsolateTest>>();\n\nfunction getRegisteredTestsSet(root: TIsolate): WeakSet<TIsolateTest> {\n let set = registeredTestsCache.get(root);\n\n if (!set) {\n set = new WeakSet();\n registeredTestsCache.set(root, set);\n }\n\n return set;\n}\n\nexport function useAddTestToRoot(testObject: TIsolateTest) {\n const root = VestRuntime.useAvailableRoot();\n\n if (!root) return;\n\n const registeredSet = getRegisteredTestsSet(root);\n\n if (registeredSet.has(testObject)) {\n return;\n }\n\n registeredSet.add(testObject);\n\n const [, setTests] = useTestObjects();\n\n setTests(prev => {\n // Update characteristic registry\n useUpdateRegistry(testObject);\n\n prev.push(testObject);\n return prev;\n });\n}\n\nexport function useOnTestStart(testObject: TIsolateTest) {\n useAddTestToRoot(testObject);\n}\n\nexport function useRegisterSubtree(isolate: TIsolate) {\n if (VestTest.is(isolate)) {\n useAddTestToRoot(isolate);\n // Populate characteristics correctly\n useUpdateRegistry(isolate);\n }\n\n if (isolate.children) {\n for (const child of isolate.children) {\n useRegisterSubtree(child);\n }\n }\n}\n\nexport function useReprocessTree(rootNode: TIsolate): void {\n const root = VestRuntime.useAvailableRoot();\n\n if (root) {\n useClearTestIndexes(root);\n }\n useRegisterSubtree(rootNode);\n}\n\nfunction useClearTestIndexes(root: TIsolate) {\n if (root.data.testIndex) {\n root.data.testIndex.clear();\n }\n useClearRegistry(root);\n}\n","import {\n CB,\n CacheApi,\n TinyState,\n cache,\n seq,\n createTinyState,\n} from 'vest-utils';\nimport { IReconciler, VestRuntime } from 'vestjs-runtime';\n\nimport {\n SuiteResult,\n TFieldName,\n TGroupName,\n TSchema,\n} from '../suiteResult/SuiteResultTypes';\n\nimport { TIsolateSuite } from './isolate/IsolateSuite/IsolateSuite';\nimport { useReprocessTree } from './isolate/registerTests';\n\nexport type DoneCallback = (res: SuiteResult<TFieldName, TGroupName>) => void;\ntype FieldCallbacks = Record<string, DoneCallbacks>;\n\ntype DoneCallbacks = Array<DoneCallback>;\n\ntype StateExtra = {\n doneCallbacks: TinyState<DoneCallbacks>;\n fieldCallbacks: TinyState<FieldCallbacks>;\n suiteId: string;\n suiteResultCache: CacheApi<SuiteResult<TFieldName, TGroupName, TSchema>>;\n};\nconst createSuiteResultCache = () =>\n cache<SuiteResult<TFieldName, TGroupName, TSchema>>();\n\nexport function useCreateVestState({\n VestReconciler,\n}: {\n VestReconciler: IReconciler;\n}) {\n const stateRef: StateExtra = {\n doneCallbacks: createTinyState<DoneCallbacks>(() => []),\n fieldCallbacks: createTinyState<FieldCallbacks>(() => ({})),\n suiteId: seq(),\n suiteResultCache: createSuiteResultCache(),\n };\n\n return VestRuntime.createRef(VestReconciler, stateRef);\n}\n\nfunction useVestState() {\n return VestRuntime.useXAppData<StateExtra>();\n}\n\nexport function useDoneCallbacks() {\n return useVestState().doneCallbacks();\n}\n\nexport function useFieldCallbacks() {\n return useVestState().fieldCallbacks();\n}\n\nfunction useSuiteId() {\n return useVestState().suiteId;\n}\n\nexport function useSuiteResultCache<\n F extends TFieldName,\n G extends TGroupName,\n S extends TSchema = undefined,\n D = unknown,\n>(action: CB<SuiteResult<F, G, S, D>>): SuiteResult<F, G, S, D> {\n const suiteResultCache = useVestState().suiteResultCache;\n\n return suiteResultCache([useSuiteId()], action) as SuiteResult<F, G, S, D>;\n}\n\nexport function usePreviousSuiteResult<\n F extends TFieldName,\n G extends TGroupName,\n S extends TSchema = undefined,\n D = unknown,\n>(): SuiteResult<F, G, S, D> | undefined {\n const suiteResultCache = useVestState().suiteResultCache;\n return suiteResultCache.get([useSuiteId()])?.[1] as unknown as\n | SuiteResult<F, G, S, D>\n | undefined;\n}\n\nexport function useExpireSuiteResultCache() {\n const suiteResultCache = useVestState().suiteResultCache;\n suiteResultCache.invalidate([useSuiteId()]);\n}\n\nexport function useResetCallbacks() {\n const [, , resetDoneCallbacks] = useDoneCallbacks();\n const [, , resetFieldCallbacks] = useFieldCallbacks();\n\n resetDoneCallbacks();\n resetFieldCallbacks();\n}\n\nexport function useResetSuite() {\n useExpireSuiteResultCache();\n useResetCallbacks();\n VestRuntime.reset();\n}\n\nexport function useLoadSuite(rootNode: TIsolateSuite): void {\n VestRuntime.useSetHistoryRoot(rootNode);\n\n useReprocessTree(rootNode);\n\n useExpireSuiteResultCache();\n}\n","import { Maybe, makeResult, Result } from 'vest-utils';\n\nimport { TFieldName } from '../../../suiteResult/SuiteResultTypes';\nimport { WithFieldName } from '../TestTypes';\n\nexport function nonMatchingFieldName(\n WithFieldName: WithFieldName<TFieldName>,\n fieldName?: Maybe<TFieldName>,\n): Result<boolean> {\n return makeResult.Ok(\n !!fieldName && !matchingFieldName(WithFieldName, fieldName).unwrap(),\n );\n}\n\nexport default function matchingFieldName(\n WithFieldName: WithFieldName<TFieldName>,\n fieldName?: Maybe<TFieldName>,\n): Result<boolean> {\n return makeResult.Ok(!!(fieldName && WithFieldName.fieldName === fieldName));\n}\n","import { isPositive, makeResult, Result } from 'vest-utils';\n\nimport { countKeyBySeverity, Severity } from '../Severity';\nimport {\n FailureMessages,\n TestsContainer,\n TFieldName,\n TGroupName,\n} from '../SuiteResultTypes';\n\n// calls collectAll or getByFieldName depending on whether fieldName is provided\n\nexport function gatherFailures(\n testGroup: TestsContainer<TFieldName, TGroupName>,\n severityKey: Severity,\n fieldName?: TFieldName,\n): string[] | FailureMessages {\n return (\n fieldName\n ? getByFieldName(testGroup, severityKey, fieldName)\n : collectAll(testGroup, severityKey)\n ).unwrap();\n}\n\nfunction getByFieldName(\n testGroup: TestsContainer<TFieldName, TGroupName>,\n severityKey: Severity,\n fieldName: TFieldName,\n): Result<string[]> {\n return makeResult.Ok(testGroup?.[fieldName]?.[severityKey] || []);\n}\n\nfunction collectAll(\n testGroup: TestsContainer<TFieldName, TGroupName>,\n severityKey: Severity,\n): Result<FailureMessages> {\n const output: FailureMessages = {};\n\n const countKey = countKeyBySeverity(severityKey);\n\n for (const field in testGroup) {\n if (isPositive(testGroup[field as TFieldName][countKey])) {\n // We will probably never get to the fallback array\n // leaving it just in case the implementation changes\n output[field] = testGroup[field as TFieldName][severityKey] || [];\n }\n }\n\n return makeResult.Ok(output);\n}\n","import {\n Maybe,\n greaterThan,\n isPositive,\n isStringValue,\n makeBrand,\n makeResult,\n Result,\n} from 'vest-utils';\n\nimport matchingFieldName from '../../core/test/helpers/matchingFieldName';\nimport { Severity, SeverityCount } from '../Severity';\nimport {\n FailureMessages,\n GetFailuresResponse,\n SuiteResult,\n SuiteSummary,\n TFieldName,\n TGroupName,\n TSchema,\n} from '../SuiteResultTypes';\nimport { SummaryFailure } from '../SummaryFailure';\n\nimport { gatherFailures } from './collectFailures';\n\ntype InputFieldName<F extends TFieldName> = F;\ntype InputGroupName<G extends TGroupName> = G;\n\nexport function bindSuiteSelectors<\n F extends TFieldName,\n G extends TGroupName,\n S extends TSchema = undefined,\n>(get: () => SuiteResult<F, G, S>): SuiteSelectors<F, G> {\n return {\n getError: (...args: Parameters<SuiteSelectors<F, G>['getError']>) =>\n get().getError(...args),\n getErrors: (...args: Parameters<SuiteSelectors<F, G>['getErrors']>) =>\n get().getErrors(...args),\n getErrorsByGroup: (\n ...args: Parameters<SuiteSelectors<F, G>['getErrorsByGroup']>\n ) => get().getErrorsByGroup(...args),\n getMessage: (...args: Parameters<SuiteSelectors<F, G>['getMessage']>) =>\n get().getMessage(...args),\n getWarning: (...args: Parameters<SuiteSelectors<F, G>['getWarning']>) =>\n get().getWarning(...args),\n getWarnings: (...args: Parameters<SuiteSelectors<F, G>['getWarnings']>) =>\n get().getWarnings(...args),\n getWarningsByGroup: (\n ...args: Parameters<SuiteSelectors<F, G>['getWarningsByGroup']>\n ) => get().getWarningsByGroup(...args),\n hasErrors: (...args: Parameters<SuiteSelectors<F, G>['hasErrors']>) =>\n get().hasErrors(...args),\n hasErrorsByGroup: (\n ...args: Parameters<SuiteSelectors<F, G>['hasErrorsByGroup']>\n ) => get().hasErrorsByGroup(...args),\n hasWarnings: (...args: Parameters<SuiteSelectors<F, G>['hasWarnings']>) =>\n get().hasWarnings(...args),\n hasWarningsByGroup: (\n ...args: Parameters<SuiteSelectors<F, G>['hasWarningsByGroup']>\n ) => get().hasWarningsByGroup(...args),\n isPending: (...args: Parameters<SuiteSelectors<F, G>['isPending']>) =>\n get().isPending(...args),\n isTested: (...args: Parameters<SuiteSelectors<F, G>['isTested']>) =>\n get().isTested(...args),\n isValid: (...args: Parameters<SuiteSelectors<F, G>['isValid']>) =>\n get().isValid(...args),\n isValidByGroup: (\n ...args: Parameters<SuiteSelectors<F, G>['isValidByGroup']>\n ) => get().isValidByGroup(...args),\n } as SuiteSelectors<F, G>;\n}\n\n// eslint-disable-next-line max-lines-per-function, max-statements\nexport function suiteSelectors<F extends TFieldName, G extends TGroupName>(\n summary: SuiteSummary<F, G>,\n): SuiteSelectors<F, G> {\n const selectors = {\n getError,\n getErrors,\n getErrorsByGroup,\n getMessage,\n getWarning,\n getWarnings,\n getWarningsByGroup,\n hasErrors,\n hasErrorsByGroup,\n hasWarnings,\n hasWarningsByGroup,\n isPending,\n isTested,\n isValid,\n isValidByGroup,\n };\n\n return selectors;\n\n function asFieldName(fieldName?: InputFieldName<F>): F | undefined {\n if (isStringValue(fieldName)) {\n return makeBrand<TFieldName>(fieldName) as F;\n }\n\n return fieldName;\n }\n\n function asGroupName(groupName: InputGroupName<G>): G {\n if (isStringValue(groupName)) {\n return makeBrand<TGroupName>(groupName) as G;\n }\n\n return groupName;\n }\n\n // Booleans\n\n function isValid(fieldName?: InputFieldName<F>): boolean {\n const targetFieldName = asFieldName(fieldName);\n\n return Boolean(\n targetFieldName ? summary.tests[targetFieldName]?.valid : summary.valid,\n );\n }\n\n // eslint-disable-next-line max-statements, complexity\n function isValidByGroup(\n groupName: InputGroupName<G>,\n fieldName?: InputFieldName<F>,\n ): boolean {\n if (\n summary.valid === null ||\n (!summary.testCount &&\n !Object.keys(summary.tests).length &&\n !Object.keys(summary.groups).length)\n ) {\n return false;\n }\n\n const safeGroupName = asGroupName(groupName);\n const safeFieldName = asFieldName(fieldName);\n const group = summary.groups[safeGroupName];\n\n // If the group doesn't exist, it is vacuously valid in this selector.\n if (!group) {\n return true;\n }\n\n // If checking a specific field within the group\n if (safeFieldName) {\n const fieldSummary = group[safeFieldName];\n // If field doesn't exist in group, it's invalid (test was never run)\n if (!fieldSummary) {\n return false;\n }\n return !!fieldSummary.valid;\n }\n\n // Check all fields in the group\n let hasAnyFields = false;\n for (const fieldName of Object.keys(group) as F[]) {\n hasAnyFields = true;\n if (!group[fieldName]?.valid) {\n return false;\n }\n }\n\n return hasAnyFields;\n }\n\n function hasErrors(fieldName?: InputFieldName<F>): boolean {\n return hasFailures(\n summary,\n SeverityCount.ERROR_COUNT,\n asFieldName(fieldName),\n ).unwrap();\n }\n\n function hasWarnings(fieldName?: InputFieldName<F>): boolean {\n return hasFailures(\n summary,\n SeverityCount.WARN_COUNT,\n asFieldName(fieldName),\n ).unwrap();\n }\n\n function isTested(fieldName: InputFieldName<F>): boolean {\n const safeFieldName = asFieldName(fieldName);\n\n return safeFieldName\n ? isPositive(summary.tests[safeFieldName]?.testCount)\n : false;\n }\n\n function hasWarningsByGroup(\n groupName: InputGroupName<G>,\n fieldName?: InputFieldName<F>,\n ): boolean {\n return hasFailuresByGroup(\n summary,\n SeverityCount.WARN_COUNT,\n asGroupName(groupName),\n asFieldName(fieldName),\n ).unwrap();\n }\n\n function hasErrorsByGroup(\n groupName: InputGroupName<G>,\n fieldName?: InputFieldName<F>,\n ): boolean {\n return hasFailuresByGroup(\n summary,\n SeverityCount.ERROR_COUNT,\n asGroupName(groupName),\n asFieldName(fieldName),\n ).unwrap();\n }\n\n // Responses\n\n function getWarnings(): FailureMessages;\n function getWarnings(fieldName: InputFieldName<F>): string[];\n function getWarnings(fieldName?: InputFieldName<F>): GetFailuresResponse {\n return getFailures(\n summary,\n Severity.WARNINGS,\n asFieldName(fieldName),\n ).unwrap();\n }\n\n function getWarning(): Maybe<SummaryFailure<F, G>>;\n function getWarning(fieldName: InputFieldName<F>): Maybe<string>;\n function getWarning(\n fieldName?: InputFieldName<F>,\n ): Maybe<SummaryFailure<F, G> | string> {\n const safeFieldName = asFieldName(fieldName);\n\n return (\n safeFieldName\n ? getFailure<F, G>(Severity.WARNINGS, summary, safeFieldName)\n : getFailure<F, G>(Severity.WARNINGS, summary)\n ).unwrap();\n }\n\n function getErrors(): FailureMessages;\n function getErrors(fieldName: InputFieldName<F>): string[];\n function getErrors(fieldName?: InputFieldName<F>): GetFailuresResponse {\n return getFailures(\n summary,\n Severity.ERRORS,\n asFieldName(fieldName),\n ).unwrap();\n }\n\n function getError(): Maybe<SummaryFailure<F, G>>;\n function getError(fieldName: InputFieldName<F>): Maybe<string>;\n function getError(\n fieldName?: InputFieldName<F>,\n ): Maybe<SummaryFailure<F, G> | string> {\n const safeFieldName = asFieldName(fieldName);\n\n return (\n safeFieldName\n ? getFailure<F, G>(Severity.ERRORS, summary, safeFieldName)\n : getFailure<F, G>(Severity.ERRORS, summary)\n ).unwrap();\n }\n\n function getErrorsByGroup(groupName: InputGroupName<G>): FailureMessages;\n function getErrorsByGroup(\n groupName: InputGroupName<G>,\n fieldName: InputFieldName<F>,\n ): string[];\n function getErrorsByGroup(\n groupName: InputGroupName<G>,\n fieldName?: InputFieldName<F>,\n ): GetFailuresResponse {\n return getFailuresByGroup(\n summary,\n Severity.ERRORS,\n asGroupName(groupName),\n asFieldName(fieldName),\n ).unwrap();\n }\n\n function getMessage(fieldName: InputFieldName<F>): Maybe<string> {\n return getError(fieldName) || getWarning(fieldName);\n }\n\n function getWarningsByGroup(groupName: InputGroupName<G>): FailureMessages;\n function getWarningsByGroup(\n groupName: InputGroupName<G>,\n fieldName: InputFieldName<F>,\n ): string[];\n function getWarningsByGroup(\n groupName: InputGroupName<G>,\n fieldName?: InputFieldName<F>,\n ): GetFailuresResponse {\n return getFailuresByGroup(\n summary,\n Severity.WARNINGS,\n asGroupName(groupName),\n asFieldName(fieldName),\n ).unwrap();\n }\n\n function isPending(fieldName?: InputFieldName<F>): boolean {\n const safeFieldName = asFieldName(fieldName);\n\n return safeFieldName\n ? greaterThan(summary.tests[safeFieldName]?.pendingCount, 0)\n : greaterThan(summary.pendingCount, 0);\n }\n}\n\nexport interface SuiteSelectors<F extends TFieldName, G extends TGroupName> {\n getWarning(): SummaryFailure<F, G> | undefined;\n getWarning(fieldName: InputFieldName<F>): string | undefined;\n getWarning(\n fieldName?: InputFieldName<F>,\n ): SummaryFailure<F, G> | string | undefined;\n getError(): SummaryFailure<F, G> | undefined;\n getError(fieldName: InputFieldName<F>): string | undefined;\n getError(\n fieldName?: InputFieldName<F>,\n ): SummaryFailure<F, G> | string | undefined;\n getMessage(fieldName: InputFieldName<F>): string | undefined;\n getErrors(): FailureMessages;\n getErrors(fieldName: InputFieldName<F>): string[];\n getErrors(fieldName?: InputFieldName<F>): string[] | FailureMessages;\n getWarnings(): FailureMessages;\n getWarnings(fieldName: InputFieldName<F>): string[];\n getWarnings(fieldName?: InputFieldName<F>): string[] | FailureMessages;\n getErrorsByGroup(groupName: InputGroupName<G>): FailureMessages;\n getErrorsByGroup(\n groupName: InputGroupName<G>,\n fieldName: InputFieldName<F>,\n ): string[];\n getErrorsByGroup(\n groupName: InputGroupName<G>,\n fieldName?: InputFieldName<F>,\n ): string[] | FailureMessages;\n getWarningsByGroup(groupName: InputGroupName<G>): FailureMessages;\n getWarningsByGroup(\n groupName: InputGroupName<G>,\n fieldName: InputFieldName<F>,\n ): string[];\n getWarningsByGroup(\n groupName: InputGroupName<G>,\n fieldName?: InputFieldName<F>,\n ): string[] | FailureMessages;\n hasErrors(fieldName?: InputFieldName<F>): boolean;\n hasWarnings(fieldName?: InputFieldName<F>): boolean;\n hasErrorsByGroup(\n groupName: InputGroupName<G>,\n fieldName?: InputFieldName<F>,\n ): boolean;\n hasWarningsByGroup(\n groupName: InputGroupName<G>,\n fieldName?: InputFieldName<F>,\n ): boolean;\n isTested(fieldName: InputFieldName<F>): boolean;\n isPending(fieldName?: InputFieldName<F>): boolean;\n isValid(fieldName?: InputFieldName<F>): boolean;\n isValidByGroup(\n groupName: InputGroupName<G>,\n fieldName?: InputFieldName<F>,\n ): boolean;\n}\n\n// Gathers all failures of a given severity\n// With a fieldName, it will only gather failures for that field\nfunction getFailures<F extends TFieldName, G extends TGroupName>(\n summary: SuiteSummary<F, G>,\n severityKey: Severity,\n): Result<FailureMessages>;\nfunction getFailures<F extends TFieldName, G extends TGroupName>(\n summary: SuiteSummary<F, G>,\n severityKey: Severity,\n fieldName?: TFieldName,\n): Result<string[]>;\nfunction getFailures<F extends TFieldName, G extends TGroupName>(\n summary: SuiteSummary<F, G>,\n severityKey: Severity,\n fieldName?: TFieldName,\n): Result<GetFailuresResponse> {\n return makeResult.Ok(gatherFailures(summary.tests, severityKey, fieldName));\n}\n\n// Gathers all failures of a given severity within a group\n// With a fieldName, it will only gather failures for that field\nfunction getFailuresByGroup(\n summary: SuiteSummary<TFieldName, TGroupName>,\n severityKey: Severity,\n groupName: TGroupName,\n fieldName?: TFieldName,\n): Result<GetFailuresResponse> {\n return makeResult.Ok(\n gatherFailures(summary.groups[groupName], severityKey, fieldName),\n );\n}\n\n// Checks if a there are any failures of a given severity within a group\n// If a fieldName is provided, it will only check for failures within that field\n// eslint-disable-next-line complexity\nfunction hasFailuresByGroup<F extends TFieldName, G extends TGroupName>(\n summary: SuiteSummary<F, G>,\n severityCount: SeverityCount,\n groupName: G,\n fieldName?: F,\n): Result<boolean> {\n const group = summary.groups[groupName];\n\n if (!group) {\n return makeResult.Ok(false);\n }\n\n if (fieldName) {\n return makeResult.Ok(isPositive(group[fieldName]?.[severityCount]));\n }\n\n for (const field in group) {\n if (isPositive(group[field as unknown as F]?.[severityCount])) {\n return makeResult.Ok(true);\n }\n }\n\n return makeResult.Ok(false);\n}\n\n// Checks if there are any failures of a given severity\n// If a fieldName is provided, it will only check for failures within that field\nfunction hasFailures(\n summary: SuiteSummary<TFieldName, TGroupName>,\n countKey: SeverityCount,\n fieldName?: TFieldName,\n): Result<boolean> {\n const failureCount = fieldName\n ? summary.tests[fieldName]?.[countKey]\n : summary[countKey] || 0;\n\n return makeResult.Ok(isPositive(failureCount));\n}\n\nfunction getFailure<F extends TFieldName, G extends TGroupName>(\n severity: Severity,\n summary: SuiteSummary<F, G>,\n): Result<Maybe<SummaryFailure<F, G>>>;\nfunction getFailure<F extends TFieldName, G extends TGroupName>(\n severity: Severity,\n summary: SuiteSummary<F, G>,\n fieldName: F,\n): Result<Maybe<string>>;\nfunction getFailure<F extends TFieldName, G extends TGroupName>(\n severity: Severity,\n summary: SuiteSummary<F, G>,\n fieldName?: F,\n): Result<Maybe<SummaryFailure<F, G> | string>> {\n const summaryKey = summary[severity];\n\n if (!fieldName) {\n return makeResult.Ok(summaryKey[0]);\n }\n\n return makeResult.Ok(\n summaryKey.find((summaryFailure: SummaryFailure<TFieldName, TGroupName>) =>\n matchingFieldName(summaryFailure, fieldName).unwrap(),\n )?.message,\n );\n}\n","import { TIsolateTest } from '../core/isolate/IsolateTest/IsolateTest';\nimport { VestTest } from '../core/isolate/IsolateTest/VestTest';\nimport { WithFieldName } from '../core/test/TestTypes';\n\nimport { TFieldName, TGroupName } from './SuiteResultTypes';\n\nexport class SummaryFailure<\n F extends TFieldName,\n G extends TGroupName,\n> implements WithFieldName<F> {\n constructor(\n public fieldName: F,\n public message: string | undefined,\n public groupName: G | undefined,\n ) {}\n\n static fromTestObject<F extends TFieldName, G extends TGroupName>(\n testObject: TIsolateTest<F>,\n ): SummaryFailure<F, G> {\n const { fieldName, message } = VestTest.getData(testObject);\n const groupName = VestTest.getGroupName<G>(testObject);\n\n return new SummaryFailure<F, G>(fieldName, message, groupName);\n }\n}\n","import { CB, assign } from 'vest-utils';\nimport { RegistryIndex } from 'vestjs-runtime';\n\nimport {\n OptionalFieldDeclaration,\n OptionalFields,\n} from '../../../hooks/optional/OptionalTypes';\nimport {\n SuiteResult,\n TFieldName,\n TGroupName,\n} from '../../../suiteResult/SuiteResultTypes';\nimport {\n createVestIsolate,\n TVestIsolate,\n VestIsolateType,\n} from '../VestIsolateType';\n\nexport type TIsolateSuite = TVestIsolate<{\n optional: OptionalFields;\n resolver: CB<SuiteResult<TFieldName, TGroupName, any>>;\n // Registry indices (populated by IsolateRegistry)\n registry_all?: RegistryIndex;\n registry_failed?: RegistryIndex;\n registry_omitted?: RegistryIndex;\n registry_passing?: RegistryIndex;\n registry_pending?: RegistryIndex;\n registry_tested?: RegistryIndex;\n registry_valid?: RegistryIndex;\n registry_warning?: RegistryIndex;\n}>;\n\nexport function IsolateSuite<Callback extends CB = CB>(\n callback: Callback,\n resolver: CB<SuiteResult<TFieldName, TGroupName, any>>,\n): TIsolateSuite {\n return createVestIsolate(VestIsolateType.Suite, callback, {\n optional: {},\n resolver,\n });\n}\n\nexport class SuiteOptionalFields {\n static setOptionalField(\n suite: TIsolateSuite,\n fieldName: TFieldName,\n setter: (current: OptionalFieldDeclaration) => OptionalFieldDeclaration,\n ): void {\n const current = suite.data.optional;\n const currentField = current[fieldName];\n\n assign(current, {\n [fieldName]: assign({}, currentField, setter(currentField)),\n });\n }\n\n static getOptionalField(\n suite: TIsolateSuite,\n fieldName: TFieldName,\n ): OptionalFieldDeclaration {\n return (\n SuiteOptionalFields.getOptionalFields(suite)[fieldName] ??\n ({} as OptionalFieldDeclaration)\n );\n }\n\n static getOptionalFields(suite: TIsolateSuite): OptionalFields {\n return suite.data?.optional ?? {};\n }\n}\n","import { DynamicValue, OneOrMoreOf } from 'vest-utils';\n\nexport type OptionalFields = Record<string, OptionalFieldDeclaration>;\n\nexport type OptionalsInput<F extends string = string> =\n | OneOrMoreOf<F>\n | OptionalsObject<F>;\n\ntype OptionalsObject<F extends string> = Record<F, TOptionalRule | any>;\n\ntype ImmediateOptionalFieldDeclaration = {\n type: OptionalFieldTypes.CUSTOM_LOGIC;\n rule: TOptionalRule;\n applied: boolean;\n};\n\ntype DelayedOptionalFieldDeclaration = {\n type: OptionalFieldTypes.AUTO;\n applied: boolean;\n rule: null;\n};\n\ntype TOptionalRule = DynamicValue<boolean>;\n\nexport type OptionalFieldDeclaration =\n | ImmediateOptionalFieldDeclaration\n | DelayedOptionalFieldDeclaration;\n\nexport enum OptionalFieldTypes {\n CUSTOM_LOGIC,\n AUTO,\n}\n","import { enforce } from 'n4s';\nimport {\n asArray,\n hasOwnProperty,\n isArray,\n isStringValue,\n makeBrand,\n makeResult,\n Result,\n} from 'vest-utils';\nimport { VestRuntime } from 'vestjs-runtime';\n\nimport { useSuiteParams } from '../../core/context/SuiteContext';\nimport {\n SuiteOptionalFields,\n TIsolateSuite,\n} from '../../core/isolate/IsolateSuite/IsolateSuite';\nimport { TFieldName } from '../../suiteResult/SuiteResultTypes';\n\nimport { OptionalFieldTypes, OptionalsInput } from './OptionalTypes';\n\n// @vx-allow use-use\n// eslint-disable-next-line complexity\nexport function optional<F extends string>(optionals: OptionalsInput<F>): void {\n const suiteRoot = VestRuntime.useAvailableRoot<TIsolateSuite>();\n\n const suiteParams = useSuiteParams();\n const dataObject = suiteParams?.[0] ?? {};\n\n // There are two types of optional field declarations:\n\n // 1 AUTO: Vest will automatically determine whether the field should be omitted\n // Based on the current run. Vest will omit \"auto\" added fields without any\n // configuration if their tests did not run at all in the suite, or if the data object\n // contains a blank value for the field.\n //\n // 2 Custom logic: Vest will determine whether they should fail based on the custom\n // logic supplied by the developer.\n // If the developer supplies a function - when the function returns true, the field will be omitted.\n // If the developer supplies a boolean - the field will be omitted if the value is true.\n // If the developer supplies a value - the field will be omitted if the value is blank.\n\n // AUTO case (field name)\n if (isArray(optionals) || isStringValue(optionals)) {\n asArray(optionals)\n .map(makeBrand<TFieldName>)\n .forEach(optionalField => {\n SuiteOptionalFields.setOptionalField(suiteRoot, optionalField, () => ({\n type: OptionalFieldTypes.AUTO,\n applied: hasOwnProperty(dataObject, optionalField)\n ? enforce.isBlank().test(dataObject?.[optionalField])\n : false,\n rule: null,\n }));\n });\n } else {\n // CUSTOM_LOGIC case (function or boolean)\n const optionalsObject = optionals as Record<string, any>;\n\n for (const field in optionalsObject) {\n const value = optionalsObject[field];\n const optionalField = makeBrand<TFieldName>(field);\n\n SuiteOptionalFields.setOptionalField(suiteRoot, optionalField, () => ({\n type: OptionalFieldTypes.CUSTOM_LOGIC,\n rule: value,\n applied: enforce.isBlank().test(value) || value === true,\n }));\n }\n }\n}\n\nexport function useIsOptionalFieldApplied(\n fieldName?: TFieldName,\n): Result<boolean> {\n if (!fieldName) {\n return makeResult.Ok(false);\n }\n\n const root = VestRuntime.useAvailableRoot<TIsolateSuite>();\n\n return makeResult.Ok(\n SuiteOptionalFields.getOptionalField(root, fieldName)?.applied ?? false,\n );\n}\n","import {\n IsolateInspector,\n TIsolate,\n VestRuntime,\n Walker,\n} from 'vestjs-runtime';\n\nimport { useHasFromRegistry } from '../test/TestRegistry';\n\n/**\n * Checks if there are any pending isolates.\n * If a fieldName is provided, it checks if there are any pending isolates for that specific field.\n */\nexport function useIsPending(fieldName?: string): boolean {\n return useHasFromRegistry('pending', fieldName);\n}\n\n/**\n * Iterates over the pending isolates and applies a callback to each.\n * The callback receives the isolate and a breakout function.\n * Calling the breakout function stops the iteration and returns the value passed to it.\n * If the iteration completes without calling breakout, it returns null.\n */\nexport function useMapFirstPending<T>(\n callback: (isolate: TIsolate, breakout: (value: T) => void) => void,\n): T | null {\n const root = VestRuntime.useAvailableRoot();\n\n if (!IsolateInspector.hasPending(root)) {\n return null;\n }\n\n return Walker.mapFirst(root, callback);\n}\n","import { TIsolate, VestRuntime, Walker } from 'vestjs-runtime';\n\nimport {\n SuiteOptionalFields,\n TIsolateSuite,\n} from '../../core/isolate/IsolateSuite/IsolateSuite';\nimport { TIsolateTest } from '../../core/isolate/IsolateTest/IsolateTest';\nimport { VestTest } from '../../core/isolate/IsolateTest/VestTest';\nimport { isVestIsolate } from '../../core/isolate/VestIsolateType';\nimport { nonMatchingFieldName } from '../../core/test/helpers/matchingFieldName';\nimport { OptionalFieldTypes } from '../../hooks/optional/OptionalTypes';\nimport { useIsOptionalFieldApplied } from '../../hooks/optional/optional';\nimport { TFieldName, TGroupName } from '../SuiteResultTypes';\n\nimport { useMapFirstPending } from '../../core/selectors/useIsPending';\nimport {\n useGetFromRegistry,\n useHasFromRegistry,\n} from '../../core/test/TestRegistry';\n\n/**\n * Determines if a field (or field within a group) should be marked as \"valid\".\n *\n * This module answers the question: \"Is this field ready to be submitted?\"\n *\n * ## What makes a field valid?\n *\n * A field is valid when ALL of these conditions are met:\n * 1. The field has no errors (failures)\n * 2. All tests for the field have completed (not pending)\n * 3. All tests for the field have run (not skipped or missing)\n *\n * ## Special cases:\n *\n * - **Optional fields**: If a field is marked as optional AND the optional condition\n * is met, it's automatically valid regardless of test results. The optional condition\n * can be:\n * - AUTO: Tests never ran, OR the field value is blank (empty string, null, undefined)\n * - CUSTOM: A boolean or function provided to `optional()` evaluates to true\n *\n * - **Empty groups**: If checking a group that has no tests for a field, it's\n * considered valid (you can't fail tests that don't exist).\n *\n * - **Empty fields**: If checking a field at the top level that has no tests,\n * it's considered INVALID (incomplete validation).\n *\n * ## Usage:\n *\n * ```typescript\n * // Check if a field is valid at the suite level\n * const isEmailValid = useSetValidProperty('email');\n *\n * // Check if a field is valid within a specific group\n * const isEmailValidInGroup = useSetValidPropertyImpl('email', 'contactInfo');\n * ```\n */\n\n/**\n * Checks if a field is valid at the top level (across all tests in the suite).\n *\n * @param fieldName - The name of the field to check. If undefined, checks entire suite.\n * @returns `true` if the field is valid, `false` otherwise.\n *\n * @example\n * ```typescript\n * // Check if the 'username' field is valid\n * const isValid = useSetValidProperty('username');\n * // Returns true only if:\n * // - All 'username' tests passed (no errors)\n * // - All 'username' tests completed (not pending)\n * // - All 'username' tests ran (not skipped)\n * ```\n */\nexport function useSetValidProperty(fieldName?: TFieldName): boolean {\n return useSetValidPropertyImpl(fieldName);\n}\n\n/**\n * Shared implementation for validity checking with optional group scoping.\n *\n * This is the core logic that determines validity. It can check:\n * - A field across the entire suite (when groupName is undefined)\n * - A field within a specific group (when groupName is provided)\n *\n * @param fieldName - The field to check. If undefined, checks all fields.\n * @param groupName - Optional group name to scope the check to tests within that group only.\n * @returns `true` if valid, `false` otherwise.\n *\n * @example\n * ```typescript\n * // Check if 'email' is valid across entire suite\n * useSetValidPropertyImpl('email'); // groupName = undefined\n *\n * // Check if 'email' is valid within 'shippingAddress' group\n * useSetValidPropertyImpl('email', 'shippingAddress');\n * ```\n *\n * ## How it works (step by step):\n *\n * 1. **Check if optional**: If the field is optional and the optional condition\n * is applied, immediately return `true`. Optional fields are valid when:\n * - AUTO type: Tests never ran OR field value is blank ('', null, undefined)\n * - CUSTOM type: The boolean/function provided to `optional()` returns true\n *\n * 2. **Check for errors**: If any test for this field has errors, return `false`.\n * A field with errors cannot be valid.\n *\n * 3. **Check for pending tests**: If any non-optional test for this field is\n * still running (pending), return `false`. We can't say a field is valid\n * until all its tests complete.\n *\n * 4. **Check for missing tests**: If any test for this field was skipped or\n * didn't run, return `false`. We need all tests to run to confirm validity.\n *\n * 5. **All checks passed**: Return `true`. The field is valid!\n */\nexport function useSetValidPropertyImpl(\n fieldName?: TFieldName,\n groupName?: TGroupName,\n): boolean {\n // Step 1: Is the field optional, and the optional condition is applied?\n if (useIsOptionalFieldApplied(fieldName).unwrap()) {\n return true;\n }\n\n // Step 2: Does the field have any tests with errors?\n if (useHasErrors(fieldName, groupName)) {\n return false;\n }\n\n // Step 3: Does the given field have any pending tests that are not optional?\n if (useHasNonOptionalIncomplete(fieldName, groupName)) {\n return false;\n }\n\n // Step 4: Did all required tests for the field run?\n const noMissing = useNoMissingTests(fieldName, groupName);\n return noMissing;\n}\n\n/**\n * Helper function to check if a field has errors.\n *\n * Decides whether to check errors globally or within a specific group.\n *\n * @param fieldName - The field to check for errors\n * @param groupName - Optional group to scope the check\n * @returns `true` if the field has errors, `false` otherwise\n *\n * @example\n * ```typescript\n * // Check if 'email' has errors anywhere in the suite\n * useHasErrors('email'); // Checks all tests for 'email'\n *\n * // Check if 'email' has errors only in 'billingInfo' group\n * useHasErrors('email', 'billingInfo'); // Only checks 'email' tests in that group\n * ```\n */\nfunction useHasErrors(\n fieldName: TFieldName | undefined,\n groupName?: TGroupName,\n): boolean {\n if (groupName) {\n return hasErrorsByTestObjectsInGroup(fieldName, groupName);\n }\n\n return useHasFromRegistry('failed', fieldName);\n}\n\n/**\n * Checks if a specific field has errors within a specific group.\n *\n * This function looks through all test objects and finds ones that:\n * - Belong to the specified group\n * - Test the specified field\n * - Have failed (have errors)\n *\n * @param fieldName - The field to check\n * @param groupName - The group to check within\n * @returns `true` if any test for this field in this group has failed\n *\n * @example\n * ```typescript\n * // Imagine you have:\n * group('contactInfo', () => {\n * test('email', 'Invalid email', () => false); // This test fails\n * test('phone', () => true);\n * });\n *\n * hasErrorsByTestObjectsInGroup('email', 'contactInfo'); // true (test failed)\n * hasErrorsByTestObjectsInGroup('phone', 'contactInfo'); // false (test passed)\n * hasErrorsByTestObjectsInGroup('email', 'otherGroup'); // false (not in that group)\n * ```\n */\nfunction hasErrorsByTestObjectsInGroup(\n fieldName: TFieldName | undefined,\n groupName: TGroupName,\n): boolean {\n const root = VestRuntime.useAvailableRoot();\n\n if (!isVestIsolate(root)) {\n return false;\n }\n\n const tests = root.data.tests;\n\n return tests.some(testObject => {\n // Skip tests that aren't in our target group\n if (VestTest.getGroupName(testObject) !== groupName) {\n return false;\n }\n\n // Skip tests that didn't fail (errors, not warnings)\n if (!VestTest.isFailing(testObject).unwrap()) {\n return false;\n }\n\n // Skip tests that aren't for our target field\n if (\n nonMatchingFieldName(VestTest.getData(testObject), fieldName).unwrap()\n ) {\n return false;\n }\n\n // This test is in our group, for our field, and it failed!\n return true;\n });\n}\n\n/**\n * Checks if a field has any pending (incomplete) tests that are not optional.\n *\n * A test is \"pending\" when it started running but hasn't finished yet.\n * This commonly happens with async tests.\n *\n * @param fieldName - The field to check\n * @param groupName - Optional group to scope the check\n * @returns `true` if there are pending non-optional tests\n *\n * @example\n * ```typescript\n * // Imagine you have:\n * test('email', async () => {\n * await checkEmailWithServer(email); // This takes 2 seconds\n * return result;\n * });\n *\n * // Right after calling suite.run():\n * useHasNonOptionalIncomplete('email'); // true (test still running)\n *\n * // After 2 seconds:\n * useHasNonOptionalIncomplete('email'); // false (test completed)\n * ```\n *\n * ## Why ignore optional fields?\n *\n * If a field is optional and the condition is applied, we don't care if its\n * tests are pending. Optional fields are valid by definition when:\n * - The field is blank (AUTO type)\n * - The custom condition returns true (CUSTOM type)\n * - The tests never ran (AUTO type)\n */\nfunction useHasNonOptionalIncomplete(\n fieldName?: TFieldName,\n groupName?: TGroupName,\n) {\n if (groupName) {\n return (\n useMapFirstPending(\n (isolate: TIsolate, breakout: (value: boolean) => void) => {\n const testObject = isolate as TIsolateTest;\n if (useIsPendingTestRelevant(testObject, fieldName, groupName)) {\n breakout(true);\n }\n },\n ) ?? false\n );\n }\n\n const pendingTests = useGetFromRegistry(\n 'pending',\n fieldName,\n ) as Set<TIsolateTest>;\n\n for (const testObject of pendingTests) {\n if (useIsPendingTestRelevant(testObject, fieldName)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Determines if a pending test is relevant to the current validity check.\n *\n * A pending test is relevant if:\n * 1. It belongs to the target group (if a group is specified)\n * 2. It belongs to the target field (if a field is specified)\n * 3. The field is NOT optional (optional fields are valid even if pending)\n *\n * @param testObject - The test to check\n * @param fieldName - The field being validated\n * @param groupName - The group being validated\n * @returns `true` if the pending test prevents the field from being valid\n */\nfunction useIsPendingTestRelevant(\n testObject: TIsolateTest,\n fieldName?: TFieldName,\n groupName?: TGroupName,\n): boolean {\n if (groupName && VestTest.getGroupName(testObject) !== groupName) {\n return false;\n }\n\n if (nonMatchingFieldName(VestTest.getData(testObject), fieldName).unwrap()) {\n return false;\n }\n\n if (useIsOptionalFieldApplied(fieldName).unwrap()) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Checks if all required tests for a field have run.\n *\n * A test is \"missing\" if it was defined but:\n * - Skipped (using skip() or skipWhen())\n * - Never executed (mode filters prevented it)\n * - Still pending (hasn't finished yet)\n *\n * @param fieldName - The field to check\n * @param groupName - Optional group to scope the check\n * @returns `true` if all tests ran, `false` if any are missing\n *\n * @example\n * ```typescript\n * // Imagine you have:\n * test('username', () => true); // Runs\n * skipWhen(someCondition, () => {\n * test('username', () => true); // Skipped\n * });\n *\n * // If someCondition is true:\n * useNoMissingTests('username'); // false (one test was skipped)\n *\n * // If someCondition is false:\n * useNoMissingTests('username'); // true (all tests ran)\n * ```\n *\n * ## Empty field handling:\n *\n * What if no tests exist for a field?\n * - **In a group**: Returns `true` (empty group is valid - can't fail tests that don't exist)\n * - **At top level**: Returns `false` (no tests means incomplete validation)\n *\n * This distinction is important:\n * - `group('emptyGroup', () => {})` - valid (intentionally empty)\n * - `create(() => {})` - invalid (you forgot to add tests)\n */\nfunction useNoMissingTests(\n fieldName?: TFieldName,\n groupName?: TGroupName,\n): boolean {\n if (groupName) {\n return useNoMissingTestsInGroup(fieldName, groupName);\n }\n\n return useNoMissingTestsInSuite(fieldName);\n}\n\nfunction useNoMissingTestsInGroup(\n fieldName: TFieldName | undefined,\n groupName: TGroupName,\n): boolean {\n let hasAnyTestsForField = false;\n const root = VestRuntime.useAvailableRoot();\n\n const result = Walker.every(\n root,\n isolate => {\n const testObject = isolate as TIsolateTest;\n\n if (VestTest.getGroupName(testObject) !== groupName) {\n return true;\n }\n\n if (\n nonMatchingFieldName(VestTest.getData(testObject), fieldName).unwrap()\n ) {\n return true;\n }\n\n hasAnyTestsForField = true;\n\n return useNoMissingTestsLogic(testObject, fieldName);\n },\n VestTest.is,\n );\n\n return !hasAnyTestsForField || result;\n}\n\nfunction useNoMissingTestsInSuite(fieldName?: TFieldName): boolean {\n const tests = useGetFieldTests(fieldName);\n\n if (tests.length === 0) {\n return false;\n }\n\n // Optimized path: All tests have explicitly finished or were omitted\n if (useAllTestsFinished(tests.length, fieldName)) {\n return true;\n }\n\n // Fallback: If we have pending tests, we need to check if they are optional async tests\n // that are allowed to be \"missing\".\n return tests.every((testObject: TIsolateTest) =>\n useNoMissingTestsLogic(testObject, fieldName),\n );\n}\n\n/**\n * Retrieves all test isolates for a given field name, or all tests in the suite\n * if no field name is provided.\n *\n * @param fieldName - The field name to look up.\n * @returns An array of test isolates.\n */\nfunction useGetFieldTests(fieldName?: TFieldName): TIsolateTest[] {\n return Array.from(useGetFromRegistry('all', fieldName) as Set<TIsolateTest>);\n}\n\n/**\n * Checks if all tests for a field (or the entire suite) have reached a final\n * state (either tested or omitted).\n *\n * This is an O(1) optimization using the registry's set sizes.\n *\n * @param totalTests - The total number of tests expected for the field.\n * @param fieldName - The field name.\n * @returns `true` if all tests have finished/omitted.\n */\nfunction useAllTestsFinished(\n totalTests: number,\n fieldName?: TFieldName,\n): boolean {\n const testedCount = useGetFromRegistry('tested', fieldName).size;\n const omittedCount = useGetFromRegistry('omitted', fieldName).size;\n\n return testedCount + omittedCount === totalTests;\n}\n\n/**\n * Checks if a single test should be considered \"not missing\".\n *\n * A test is \"not missing\" if it:\n * 1. Already ran and completed (tested)\n * 2. Was intentionally omitted (e.g., optional field is blank: '', null, or undefined)\n * 3. Is an AUTO optional async test that's still running but hasn't finished\n *\n * @param testObject - The test to check\n * @param fieldName - The field being validated\n * @returns `true` if the test is not missing, `false` if it's missing\n *\n * @example\n * ```typescript\n * // Test ran and completed\n * test('email', () => true);\n * useNoMissingTestsLogic(testObject); // true\n *\n * // Test was skipped\n * skip('email');\n * test('email', () => true);\n * useNoMissingTestsLogic(testObject); // false\n *\n * // Test was omitted (optional field is blank)\n * optional('email');\n * test('email', () => false);\n * useNoMissingTestsLogic(testObject); // true (intentionally omitted)\n * ```\n */\nexport function useNoMissingTestsLogic(\n testObject: TIsolateTest,\n fieldName?: TFieldName,\n): boolean {\n if (nonMatchingFieldName(VestTest.getData(testObject), fieldName).unwrap()) {\n return true;\n }\n\n /**\n * Why check for optional fields here?\n *\n * Optional fields have a special rule: if they're marked as AUTO optional\n * (e.g., \"optional when blank\") and the test hasn't finished yet, we still\n * consider it \"not missing\".\n *\n * This is different from the omitOptionalFields check, which uses a boolean\n * condition. Here, we only care about whether the test has been tested already.\n *\n * A test is \"not missing\" if:\n * 1. It already ran (isTested) - we have results\n * 2. It was intentionally omitted (isOmitted) - we don't need results\n * 3. It's an optional AUTO field that's still running - we'll accept its absence\n */\n\n const isOmitted = VestTest.isOmitted(testObject).unwrap();\n const isTested = VestTest.isTested(testObject).unwrap();\n const awaitsResolution = useOptionalTestAwaitsResolution(testObject);\n\n return isOmitted || isTested || awaitsResolution;\n}\n\n/**\n * Checks if a test belongs to an AUTO optional field that's still running.\n *\n * AUTO optional fields are fields marked as optional without a custom condition:\n * ```typescript\n * optional('email'); // AUTO type\n * optional(['email', 'phone']); // Multiple AUTO fields\n * ```\n *\n * AUTO optional behavior (per documentation):\n * - If tests never ran (e.g., skipped via only()), field is optional\n * - If field value is blank ('', null, undefined) in data object, field is optional\n *\n * When a field is AUTO optional and blank, its tests are typically omitted.\n * But if the test is async and started before we knew the field would be blank,\n * we give it a pass - we don't consider it \"missing\" even if it hasn't finished.\n *\n * @param testObject - The test to check\n * @returns `true` if this is an AUTO optional field with a pending test\n *\n * @example\n * ```typescript\n * optional('email'); // AUTO optional\n *\n * test('email', async () => {\n * // User clears the email field while this is running\n * await validateEmail(email);\n * return result;\n * });\n *\n * // While test is still running:\n * useOptionalTestAwaitsResolution(testObject); // true\n * // We don't consider this test \"missing\" even though it's not done\n * ```\n */\nfunction useOptionalTestAwaitsResolution(testObject: TIsolateTest): boolean {\n const root = VestRuntime.useAvailableRoot<TIsolateSuite>();\n\n const { fieldName } = VestTest.getData(testObject);\n\n return (\n SuiteOptionalFields.getOptionalField(root, fieldName).type ===\n OptionalFieldTypes.AUTO && VestTest.awaitsResolution(testObject).unwrap()\n );\n}\n","import { defaultTo, isEmpty, Maybe, assign } from 'vest-utils';\nimport { VestRuntime } from 'vestjs-runtime';\n\nimport { TIsolateSuite } from '../../core/isolate/IsolateSuite/IsolateSuite';\nimport { TIsolateTest } from '../../core/isolate/IsolateTest/IsolateTest';\nimport { VestTest } from '../../core/isolate/IsolateTest/VestTest';\nimport { isVestIsolate } from '../../core/isolate/VestIsolateType';\nimport { countKeyBySeverity, Severity } from '../Severity';\nimport {\n CommonSummaryProperties,\n Groups,\n SingleTestSummary,\n SuiteSummary,\n SummaryBase,\n Tests,\n TFieldName,\n TGroupName,\n TSchema,\n} from '../SuiteResultTypes';\nimport { SummaryFailure } from '../SummaryFailure';\n\nimport {\n useNoMissingTestsLogic,\n useSetValidProperty,\n} from './useSetValidProperty';\n\nexport function useProduceSuiteSummary<\n F extends TFieldName,\n G extends TGroupName,\n D = unknown,\n S extends TSchema = undefined,\n>(): SuiteSummary<F, G, D, S> {\n const root = VestRuntime.useAvailableRoot<TIsolateSuite>();\n\n const summary = new SuiteSummary<F, G, D, S>();\n\n if (isVestIsolate(root)) {\n useProcessTests(root.data.tests, summary);\n }\n\n if (summary.valid !== false) {\n summary.valid = useSetValidProperty();\n }\n\n return summary;\n}\n\nfunction useProcessTests<F extends TFieldName, G extends TGroupName>(\n tests: TIsolateTest<F>[],\n summary: SuiteSummary<F, G>,\n): SuiteSummary<F, G> {\n if (isEmpty(tests)) {\n // early bail for empty test arrays\n summary.valid = false;\n return summary;\n }\n\n tests.reduce((summary, testObject) => {\n const { fieldName } = VestTest.getData(testObject);\n\n summary.tests[fieldName] = useAppendToTest(summary.tests, testObject);\n summary.groups = useAppendToGroup(summary.groups, testObject);\n\n if (VestTest.isOmitted(testObject).unwrap()) {\n return summary;\n }\n\n return addSummaryStats(testObject, summary);\n }, summary);\n\n // After we have all the tests bucketed, we decide on the final validity\n // of the suite.\n // We iterate over all the fields we've seen, and if any of them is not valid,\n // the suite is not valid.\n for (const fieldName in summary.tests) {\n if (summary.tests[fieldName].valid === false) {\n summary.valid = false;\n break;\n }\n }\n\n return summary;\n}\n\nfunction useAppendToGroup<F extends TFieldName, G extends TGroupName>(\n groups: Groups<G, F>,\n testObject: TIsolateTest<F>,\n): Groups<G, F> {\n const groupName = VestTest.getGroupName<G>(testObject);\n\n if (!groupName) {\n return groups;\n }\n\n const group = ensureGroup<F, G>(groups, groupName);\n\n const { fieldName } = VestTest.getData<F>(testObject);\n\n const nextGroupEntry = useAppendTestSummaryObject(\n group[fieldName],\n testObject,\n );\n (group as Record<string, SingleTestSummary>)[fieldName] = nextGroupEntry;\n\n return groups;\n}\n\nfunction ensureGroup<F extends TFieldName, G extends TGroupName>(\n groups: Groups<G, F>,\n groupName: G,\n): Groups<G, F>[G] {\n groups[groupName] =\n groups[groupName] || ({} as Groups<G, F>[typeof groupName]);\n return groups[groupName];\n}\n\nfunction useAppendToTest<F extends TFieldName>(\n tests: Tests<F>,\n testObject: TIsolateTest<F>,\n): SingleTestSummary {\n const fieldName = VestTest.getData<F>(testObject).fieldName;\n\n const test = useAppendTestSummaryObject(tests[fieldName], testObject);\n return test;\n}\n\nfunction addSummaryStats<F extends TFieldName, G extends TGroupName>(\n testObject: TIsolateTest<F>,\n summary: SuiteSummary<F, G>,\n): SuiteSummary<F, G> {\n if (VestTest.isWarning(testObject).unwrap()) {\n summary.warnCount++;\n summary.warnings.push(SummaryFailure.fromTestObject(testObject));\n } else if (VestTest.isFailing(testObject).unwrap()) {\n summary.errorCount++;\n summary.errors.push(SummaryFailure.fromTestObject(testObject));\n }\n\n if (VestTest.isStartedStatus(testObject)) {\n summary.pendingCount++;\n }\n\n if (shouldCountTestRun(testObject)) {\n summary.testCount++;\n }\n\n return summary;\n}\n\nfunction useAppendTestSummaryObject(\n summaryKey: Maybe<SingleTestSummary>,\n testObject: TIsolateTest,\n): SingleTestSummary {\n const nextSummaryKey = createNewSummaryKey(summaryKey) as SingleTestSummary;\n\n const isNoMissing = useNoMissingTestsLogic(testObject);\n\n if (nextSummaryKey.valid !== false) {\n nextSummaryKey.valid = isNoMissing;\n }\n\n return updateSummaryWithTestResults(nextSummaryKey, testObject);\n}\n\nfunction createNewSummaryKey<S extends CommonSummaryProperties>(\n summaryKey: Maybe<S>,\n): S {\n return defaultTo<S>(summaryKey ? { ...summaryKey } : null, baseTestStats);\n}\n\nfunction updateSummaryWithTestResults(\n nextSummaryKey: SingleTestSummary,\n testObject: TIsolateTest,\n): SingleTestSummary {\n const isStarted = VestTest.isStartedStatus(testObject);\n const isFailing = VestTest.isFailing(testObject).unwrap();\n\n if (isStarted) {\n nextSummaryKey.pendingCount++;\n }\n\n updateFailures(nextSummaryKey, testObject, isFailing);\n\n if (isStarted || isFailing) {\n nextSummaryKey.valid = false;\n }\n\n if (shouldCountTestRun(testObject)) {\n nextSummaryKey.testCount++;\n }\n\n return nextSummaryKey;\n}\n\nfunction updateFailures(\n nextSummaryKey: SingleTestSummary,\n testObject: TIsolateTest,\n isFailing: boolean,\n): void {\n const { message } = VestTest.getData(testObject);\n\n if (isFailing) {\n incrementFailures(nextSummaryKey, Severity.ERRORS, message);\n } else if (VestTest.isWarning(testObject).unwrap()) {\n incrementFailures(nextSummaryKey, Severity.WARNINGS, message);\n }\n}\n\nfunction incrementFailures<S extends CommonSummaryProperties>(\n summaryKey: S,\n severity: Severity,\n message?: string,\n): void {\n const countKey = countKeyBySeverity(severity);\n summaryKey[countKey]++;\n if (message) {\n summaryKey[severity] = (summaryKey[severity] || []).concat(message);\n }\n}\n\nfunction baseTestStats<S extends CommonSummaryProperties>(): S {\n return assign(new SummaryBase(), {\n errors: [],\n warnings: [],\n }) as unknown as S;\n}\n\nfunction shouldCountTestRun<F extends TFieldName>(\n testObject: TIsolateTest<F>,\n): boolean {\n return (\n VestTest.isTested(testObject).unwrap() ||\n VestTest.isStartedStatus(testObject)\n );\n}\n","import { assign } from 'vest-utils';\nimport { StandardSchemaV1 } from 'vest-utils/standardSchemaSpec';\nimport { VestRuntime } from 'vestjs-runtime';\n\nimport { useSuiteResultCache } from '../core/Runtime';\nimport { TIsolateSuite } from '../core/isolate/IsolateSuite/IsolateSuite';\nimport { SuiteModifiers } from '../suite/SuiteTypes';\n\nimport { Severity } from './Severity';\nimport {\n SuiteResult,\n SuiteSummary,\n TFieldName,\n TGroupName,\n TSchema,\n InferSchemaOutput,\n} from './SuiteResultTypes';\nimport { suiteSelectors } from './selectors/suiteSelectors';\nimport { useProduceSuiteSummary } from './selectors/useProduceSuiteSummary';\n\nexport function useCreateSuiteResult<\n F extends TFieldName,\n G extends TGroupName,\n S extends TSchema = undefined,\n D = unknown,\n>(\n schema?: S,\n outputData?: any,\n inputData?: D,\n runTime: Date = new Date(),\n parsedData?: Partial<InferSchemaOutput<S>>,\n focus?: SuiteModifiers<F, G>,\n): SuiteResult<F, G, S, D> {\n return useSuiteResultCache<F, G, S, D>(() => {\n // @vx-allow use-use\n const summary = useProduceSuiteSummary<F, G, D, S>();\n summary.run = {\n data: {\n raw: inputData,\n parsed: parsedData,\n },\n focus,\n time: runTime,\n };\n\n const resultBody = constructSuiteResultObject<F, G, S, D>(\n summary,\n outputData,\n );\n\n const result = assign(resultBody as SuiteResult<F, G, S, D>, {\n dump: VestRuntime.persist(VestRuntime.useAvailableRoot<TIsolateSuite>),\n types: (schema\n ? { input: inputData, output: outputData }\n : undefined) as SuiteResult<F, G, S, D>['types'],\n }) as SuiteResult<F, G, S, D>;\n\n const runMeta = Object.freeze({ ...summary.run });\n\n Object.defineProperty(result, 'run', {\n configurable: true,\n enumerable: false,\n value: runMeta,\n writable: true,\n });\n\n return Object.freeze(result);\n });\n}\n\nexport function constructSuiteResultObject<\n F extends TFieldName,\n G extends TGroupName,\n S extends TSchema = undefined,\n D = unknown,\n>(\n summary: SuiteSummary<F, G, D, S>,\n outputData?: any,\n): Omit<SuiteResult<F, G, S, D>, 'dump' | 'types'> {\n const { valid, ...summaryWithoutValid } = summary;\n const selectors = suiteSelectors<F, G>(summary);\n\n const common = assign(summaryWithoutValid, selectors);\n\n if (valid === true) {\n return {\n ...common,\n valid: true,\n value: outputData,\n };\n } else if (valid === false) {\n const issues = summary[Severity.ERRORS].reduce((acc, failure) => {\n if (failure.message) {\n acc.push({\n message: failure.message,\n path: [failure.fieldName],\n });\n }\n return acc;\n }, [] as StandardSchemaV1.Issue[]);\n\n return {\n ...common,\n valid: false,\n issues,\n };\n }\n\n // valid is null\n return {\n ...common,\n valid: null as null,\n };\n}\n","import {\n SuiteResult,\n SuiteSummary,\n TFieldName,\n TGroupName,\n} from '../SuiteResultTypes';\nimport {\n constructSuiteResultObject,\n useCreateSuiteResult,\n} from '../suiteResult';\n\n// @vx-allow use-use\nexport function LazyDraft<\n F extends TFieldName,\n G extends TGroupName,\n>(): SuiteResult<F, G> {\n const emptySummary = constructSuiteResultObject(new SuiteSummary<F, G>());\n\n return new Proxy(emptySummary, {\n get: (_, prop) => {\n const result = useCreateSuiteResult<F, G>();\n\n return result[prop as keyof SuiteResult<F, G>];\n },\n }) as SuiteResult<F, G>;\n}\n","import { CB, dynamicValue } from 'vest-utils';\nimport { TIsolate } from 'vestjs-runtime';\n\nimport { SuiteContext, useSkipped } from '../core/context/SuiteContext';\nimport {\n createVestIsolate,\n VestIsolateType,\n} from '../core/isolate/VestIsolateType';\nimport { TDraftCondition } from '../suite/getTypedMethods';\nimport { TFieldName, TGroupName } from '../suiteResult/SuiteResultTypes';\nimport { LazyDraft } from '../suiteResult/selectors/LazyDraft';\n\n/**\n * Conditionally skips running tests within the callback.\n *\n * Unlike `omitWhen`, skipped tests **retain their previous result** from\n * the last run. Use `skipWhen` when you want to avoid re-evaluating\n * tests that already have a known result (e.g., skip an async uniqueness\n * check while the field still has synchronous validation errors).\n *\n * @example\n *\n * // Skip the async check while there are sync errors on the field\n * skipWhen(res => res.hasErrors('username'), () => {\n * test('username', 'User already taken', async () => await doesUserExist(username));\n * });\n */\n// @vx-allow use-use\nexport function skipWhen<F extends TFieldName, G extends TGroupName>(\n condition: TDraftCondition<F, G>,\n callback: CB,\n): TIsolate {\n return createVestIsolate(\n VestIsolateType.SkipWhen,\n () => {\n SuiteContext.run(\n {\n skipped:\n // Checking for nested conditional. If we're in a nested skipWhen,\n // we should skip the test if the parent conditional is true.\n useIsExcludedIndividually() ||\n // Otherwise, we should skip the test if the conditional is true.\n dynamicValue(condition, LazyDraft<F, G>()),\n },\n callback,\n );\n },\n {\n tests: [],\n },\n );\n}\n\nexport function useIsExcludedIndividually(): boolean {\n return useSkipped();\n}\n","import { asArray, dynamicValue, isNotEmptySet } from 'vest-utils';\nimport {\n TIsolate,\n Walker,\n FocusSelectors,\n TIsolateFocused,\n VestRuntime,\n} from 'vestjs-runtime';\n\nimport { SuiteContext, useInclusion } from '../../core/context/SuiteContext';\nimport { TIsolateTest } from '../../core/isolate/IsolateTest/IsolateTest';\nimport { VestTest } from '../../core/isolate/IsolateTest/VestTest';\nimport { useIsExcludedIndividually } from '../../isolates/skipWhen';\n\n/**\n * Finds the closest focus isolate that matches a given field name.\n *\n * Uses `Walker.findClosest` starting from `testObject`. Since `findClosest`\n * walks UP through ancestors and searches each level's CHILDREN (siblings),\n * starting from the test ensures we correctly find sibling `IsolateFocused`\n * nodes created by `only()` and `skip()`.\n *\n * Starting from `useIsolate()` (the parent context) would be one level too\n * high, missing focus isolates at the test's own sibling level.\n */\nfunction useClosestMatchingFocus(\n testObject: TIsolateTest,\n fieldName: string,\n): TIsolateFocused | null {\n return Walker.findClosest<TIsolateFocused>(testObject, (child: TIsolate) => {\n if (!FocusSelectors.isIsolateFocused(child)) return false;\n\n const data = child.data;\n if (!data) return false;\n\n return data.matchAll || asArray(data.match).includes(fieldName);\n });\n}\n\n/**\n * Checks whether a specific test profile should be excluded by any of the exclusion conditions.\n *\n * Evaluates in order:\n * 1. `skipWhen` rule.\n * 2. Group targeting (`onlyGroup` excluding top level tests).\n * 3. Field targeting (`only` / `skip`).\n *\n * @param {TIsolateTest} testObject - The test node to evaluate.\n * @returns {boolean} `true` if the test should jump straight to a skipped status.\n */\nexport function useIsExcluded(testObject: TIsolateTest): boolean {\n if (useIsExcludedIndividually()) return true;\n\n if (useIsExcludedByGroup(testObject)) return true;\n\n return useIsExcludedByField(testObject);\n}\n\n/**\n * Checks if a specific test should be excluded because it does not belong to a targeted group.\n *\n * When `suite.focus({ onlyGroup: 'groupName' })` is used, ANY test that is NOT inside\n * the targeted group(s) must be skipped. This function specifically handles tests\n * that have NO group at all (top-level tests). Tests inside other groups are handled\n * collectively at the group isolate level in `group.ts`.\n *\n * @param {TIsolateTest} testObject - The test node to evaluate.\n * @returns {boolean} `true` if the test is outside of `onlyGroup` targeting.\n */\nfunction useIsExcludedByGroup(testObject: TIsolateTest): boolean {\n const groupName = VestTest.getGroupName(testObject);\n const { modifiers } = SuiteContext.useX();\n\n // If `onlyGroup` is applied, ANY test outside of a group is excluded.\n return isNotEmptySet(modifiers.onlyGroup) && !groupName;\n}\n\n/**\n * Checks if a specific test should be excluded by field-level focus rules.\n *\n * 1. Explicit focus: find the closest `IsolateFocused` sibling from the test's\n * perspective. If found, skip/only takes immediate effect.\n * 2. Implicit only: if no explicit match was found, query the centralized\n * `implicitOnlyNodes` registry on the runtime StateRef. If an ancestor\n * has been flagged (because it contains an ONLY child), the test is excluded\n * unless it has a matching `include()` rule.\n */\nfunction useIsExcludedByField(testObject: TIsolateTest): boolean {\n const { fieldName } = VestTest.getData(testObject);\n const focusMatch = useClosestMatchingFocus(testObject, fieldName);\n\n if (FocusSelectors.isSkipFocused(focusMatch, fieldName)) return true;\n if (FocusSelectors.isOnlyFocused(focusMatch, fieldName)) return false;\n\n // No explicit focus match for this field.\n // Check the centralized runtime registry for implicit ONLY exclusion.\n if (VestRuntime.hasImplicitOnly()) {\n const inclusion = useInclusion();\n return !dynamicValue(inclusion[fieldName], testObject);\n }\n\n return false;\n}\n","import { either, makeResult, Result } from 'vest-utils';\n\nimport { Severity } from '../../../suiteResult/Severity';\nimport { TIsolateTest } from '../../isolate/IsolateTest/IsolateTest';\nimport { VestTest } from '../../isolate/IsolateTest/VestTest';\n\n/**\n * Checks that a given test object matches the currently specified severity level\n */\nexport function nonMatchingSeverityProfile(\n severity: Severity,\n testObject: TIsolateTest,\n): Result<boolean> {\n return makeResult.Ok(\n either(severity === Severity.WARNINGS, VestTest.warns(testObject).unwrap()),\n );\n}\n","import { VestRuntime } from 'vestjs-runtime';\n\nimport { TIsolateTest } from '../../core/isolate/IsolateTest/IsolateTest';\nimport { VestTest } from '../../core/isolate/IsolateTest/VestTest';\nimport { isVestIsolate } from '../../core/isolate/VestIsolateType';\nimport { nonMatchingFieldName } from '../../core/test/helpers/matchingFieldName';\nimport { nonMatchingSeverityProfile } from '../../core/test/helpers/nonMatchingSeverityProfile';\nimport { useHasFromRegistry } from '../../core/test/TestRegistry';\nimport { Severity } from '../Severity';\nimport { TFieldName } from '../SuiteResultTypes';\n\n/**\n * Checks if a specific field (or the entire suite) has error-severity failures.\n *\n * @param fieldName - Optional field name to check.\n * @returns `true` if failures exist.\n */\nexport function useHasErrorsByTestObjects(fieldName?: TFieldName): boolean {\n return useHasFailuresByTestObjects(Severity.ERRORS, fieldName);\n}\n\n/**\n * Shared logic to check for failures of a specific severity.\n *\n * @param severityKey - The severity to check (ERRORS or WARNINGS).\n * @param fieldName - Optional field name to check.\n */\nfunction useHasFailuresByTestObjects(\n severityKey: Severity,\n fieldName?: TFieldName,\n): boolean {\n // First, check the reactive status indices for an instant result\n if (useIsFailing(severityKey, fieldName)) {\n return true;\n }\n\n // Fallback: If not found in indices, check all tests (handles edge cases\n // where indices might not yet be fully populated or during reprocessing).\n return useAllFailuresByTestObjects(severityKey, fieldName);\n}\n\n/**\n * Checks if any test has the specified failure status using the TestRegistry.\n */\nfunction useIsFailing(severityKey: Severity, fieldName?: TFieldName): boolean {\n if (severityKey === Severity.ERRORS) {\n return useHasFromRegistry('failed', fieldName);\n }\n\n if (severityKey === Severity.WARNINGS) {\n return useHasFromRegistry('warning', fieldName);\n }\n\n return false;\n}\n\n/**\n * Iterates through all tests in the root isolate to find failures matching the criteria.\n * This is used as a fallback or for more complex checks that indices don't cover.\n */\nfunction useAllFailuresByTestObjects(\n severityKey: Severity,\n fieldName?: TFieldName,\n): boolean {\n const root = VestRuntime.useAvailableRoot();\n\n if (!isVestIsolate(root)) {\n return false;\n }\n\n const tests = root.data.tests;\n\n return tests.some(testObject => {\n return hasFailuresByTestObject(testObject, severityKey, fieldName);\n });\n}\n\n/**\n * Determines whether a specific test object matches the failure criteria\n * (field name and severity profile).\n */\nexport function hasFailuresByTestObject(\n testObject: TIsolateTest,\n severityKey: Severity,\n fieldName?: TFieldName,\n): boolean {\n if (!VestTest.hasFailures(testObject).unwrap()) {\n return false;\n }\n\n if (nonMatchingFieldName(VestTest.getData(testObject), fieldName).unwrap()) {\n return false;\n }\n\n if (nonMatchingSeverityProfile(severityKey, testObject).unwrap()) {\n return false;\n }\n\n return true;\n}\n","import { makeResult, Result } from 'vest-utils';\n\nimport { useMode } from '../../core/context/SuiteContext';\nimport { WithFieldName } from '../../core/test/TestTypes';\nimport { useHasErrorsByTestObjects } from '../../suiteResult/selectors/hasFailuresByTestObjects';\n\nimport { Modes } from './Modes';\n\n/**\n * Sets the current execution mode for the current suite.\n *\n * Supported modes:\n * - `EAGER` - (default) Runs all tests, but stops on first failure for each given field.\n * - `ALL` - Runs all tests, regardless of failures.\n * - `ONE` - Stops suite execution on first failure of any field.\n *\n * @example\n * ```js\n * import {Modes, create} from 'vest';\n *\n * const suite = create('suite_name', () => {\n * vest.mode(Modes.ALL);\n *\n * // ...\n * });\n * ```\n * @param 'ALL' | 'EAGER' | 'ONE' mode - The mode to set.\n */\n\n// @vx-allow use-use\nexport function mode(mode: Modes): void {\n const [, setMode] = useMode();\n\n setMode(mode);\n}\n\nfunction useIsMode(mode: Modes): Result<boolean> {\n const [currentMode] = useMode();\n\n return makeResult.Ok(currentMode === mode);\n}\n\nfunction useIsEager(): Result<boolean> {\n return useIsMode(Modes.EAGER);\n}\n\nfunction useIsOne(): Result<boolean> {\n return useIsMode(Modes.ONE);\n}\n\nexport function useShouldSkipBasedOnMode(testData: WithFieldName): boolean {\n if (useIsOne().unwrap()) {\n return useHasErrorsByTestObjects();\n }\n\n if (useIsEager().unwrap()) {\n return useHasErrorsByTestObjects(testData.fieldName);\n }\n\n return false;\n}\n","import { makeResult, Result } from 'vest-utils';\n\nimport { useIsExcluded } from '../../../hooks/focused/useIsExcluded';\nimport { useShouldSkipBasedOnMode } from '../../../hooks/optional/mode';\nimport { useIsOptionalFieldApplied } from '../../../hooks/optional/optional';\nimport { useIsExcludedIndividually } from '../../../isolates/skipWhen';\nimport { TFieldName } from '../../../suiteResult/SuiteResultTypes';\nimport { TIsolateTest } from '../../isolate/IsolateTest/IsolateTest';\nimport { VestTest } from '../../isolate/IsolateTest/VestTest';\n\n// eslint-disable-next-line complexity\nexport function useVerifyTestRun(\n testObject: TIsolateTest,\n collisionResult: TIsolateTest = testObject,\n): TIsolateTest {\n const testData = VestTest.getData(testObject);\n if (VestTest.isStartedStatus(testObject)) {\n // If the test is pending, we don't want to run it again.\n // We just return the test object as is.\n return testObject;\n }\n\n if (useShouldSkipBasedOnMode(testData)) {\n return skipTestAndReturn(testObject).unwrap();\n }\n\n if (useShouldOmit(testData.fieldName).unwrap()) {\n return omitTestAndReturn(testObject).unwrap();\n }\n\n if (useIsExcluded(testObject)) {\n return useForceSkipIfInSkipWhen(collisionResult).unwrap();\n }\n\n return testObject;\n}\n\nfunction useShouldOmit(fieldName: TFieldName): Result<boolean> {\n return makeResult.Ok(useIsOptionalFieldApplied(fieldName).unwrap());\n}\n\nfunction skipTestAndReturn(testNode: TIsolateTest): Result<TIsolateTest> {\n VestTest.skip(testNode);\n return makeResult.Ok(testNode);\n}\n\nfunction omitTestAndReturn(testNode: TIsolateTest): Result<TIsolateTest> {\n VestTest.omit(testNode);\n return makeResult.Ok(testNode);\n}\n\nfunction useForceSkipIfInSkipWhen(\n testNode: TIsolateTest,\n): Result<TIsolateTest> {\n // We're forcing skipping the pending test\n // if we're directly within a skipWhen block\n // This mostly means that we're probably giving\n // up on this async test intentionally.\n VestTest.skip(testNode, useIsExcludedIndividually());\n return makeResult.Ok(testNode);\n}\n","import { makeResult, Result } from 'vest-utils';\n\nimport matchingFieldName from '../../test/helpers/matchingFieldName';\n\nimport { TIsolateTest } from './IsolateTest';\nimport { VestTest } from './VestTest';\n\nexport function isSameProfileTest(\n testObject1: TIsolateTest,\n testObject2: TIsolateTest,\n): Result<boolean> {\n const gn1 = VestTest.getGroupName(testObject1);\n const { fieldName: fn2 } = VestTest.getData(testObject2);\n const gn2 = VestTest.getGroupName(testObject2);\n return makeResult.Ok(\n matchingFieldName(VestTest.getData(testObject1), fn2).unwrap() &&\n gn1 === gn2 &&\n // Specifically using == here. The reason is that when serializing\n // suite result, empty key gets removed, but it can also be null.\n testObject1.key == testObject2.key,\n );\n}\n","import { makeResult, Result } from 'vest-utils';\n\nimport { TIsolateTest } from './IsolateTest';\nimport { VestTest } from './VestTest';\nimport { isSameProfileTest } from './isSameProfileTest';\n\nexport default function cancelOverriddenPendingTest(\n prevRunTestObject: TIsolateTest,\n currentRunTestObject: TIsolateTest,\n): Result<void> {\n if (\n currentRunTestObject !== prevRunTestObject &&\n isSameProfileTest(prevRunTestObject, currentRunTestObject).unwrap() &&\n VestTest.isStartedStatus(prevRunTestObject)\n ) {\n VestTest.cancel(prevRunTestObject);\n }\n return makeResult.Ok(undefined);\n}\n","import { Nullable, makeResult } from 'vest-utils';\nimport { Walker, VestRuntime, TIsolate } from 'vestjs-runtime';\n\nimport { TFieldName } from '../../../suiteResult/SuiteResultTypes';\nimport matchingFieldName from '../../test/helpers/matchingFieldName';\n\nimport { TIsolateTest } from './IsolateTest';\nimport { VestTest } from './VestTest';\n\nimport { useTestObjects } from '../registerTests';\n\ntype MaybeRoot = Nullable<TIsolate>;\n\nexport class TestWalker {\n static defaultRoot = VestRuntime.useAvailableRoot;\n\n static someTests(\n predicate: (test: TIsolateTest) => boolean,\n root: MaybeRoot = TestWalker.defaultRoot(),\n ): boolean {\n if (!root) return false;\n return Walker.some(\n root,\n isolate => {\n const test = VestTest.cast(isolate).unwrap();\n\n return predicate(test);\n },\n VestTest.is,\n );\n }\n\n static walkTests<F extends TFieldName>(\n callback: (test: TIsolateTest<F>, breakout: () => void) => void,\n root: MaybeRoot = TestWalker.defaultRoot(),\n ): void {\n if (!root) return;\n Walker.walk(\n root,\n isolate => {\n let broken = false;\n callback(VestTest.cast<F>(isolate).unwrap(), () => {\n broken = true;\n });\n if (broken) {\n return makeResult.Err(undefined);\n }\n return makeResult.Ok(undefined);\n },\n VestTest.is,\n );\n }\n\n static pluckTests(\n predicate: (test: TIsolateTest) => boolean,\n root: MaybeRoot = TestWalker.defaultRoot(),\n ): void {\n if (!root) return;\n Walker.pluck(\n root,\n isolate => {\n const test = VestTest.cast(isolate).unwrap();\n\n return predicate(test);\n },\n VestTest.is,\n );\n }\n\n static resetField(fieldName: TFieldName): void {\n TestWalker.walkTests(testObject => {\n if (matchingFieldName(VestTest.getData(testObject), fieldName).unwrap()) {\n VestTest.reset(testObject);\n }\n }, TestWalker.defaultRoot());\n }\n\n static removeTestByFieldName(\n fieldName: TFieldName,\n root: MaybeRoot = TestWalker.defaultRoot(),\n ): void {\n TestWalker.pluckTests(testObject => {\n return matchingFieldName(\n VestTest.getData(testObject),\n fieldName,\n ).unwrap();\n }, root);\n\n const [, setTests] = useTestObjects();\n\n setTests(tests =>\n tests.filter((testObject: TIsolateTest) => {\n return (\n !VestTest.is(testObject) ||\n !matchingFieldName(VestTest.getData(testObject), fieldName).unwrap()\n );\n }),\n );\n }\n}\n","import { isEmpty, dynamicValue } from 'vest-utils';\nimport { useEmit } from '../../core/VestBus/VestBus';\nimport { VestRuntime } from 'vestjs-runtime';\n\nimport {\n SuiteOptionalFields,\n TIsolateSuite,\n} from '../../core/isolate/IsolateSuite/IsolateSuite';\nimport { TIsolateTest } from '../../core/isolate/IsolateTest/IsolateTest';\nimport { TestWalker } from '../../core/isolate/IsolateTest/TestWalker';\nimport { VestTest } from '../../core/isolate/IsolateTest/VestTest';\n\n/**\n * This module gets triggered once the suite is done running its sync tests.\n *\n * It goes over all the tests in the state, and checks if they need to be omitted.\n */\n\nexport function useOmitOptionalFields(): void {\n const root = VestRuntime.useAvailableRoot<TIsolateSuite>();\n\n const optionalFields = SuiteOptionalFields.getOptionalFields(root);\n\n // If there are no optional fields, we don't need to do anything\n if (isEmpty(optionalFields)) {\n return;\n }\n\n // Create an object to store the fields that need to be omitted\n const shouldOmit = new Set<string>();\n\n // iterate over each of the tests in the state\n TestWalker.walkTests(testObject => {\n if (VestTest.isStartedStatus(testObject)) {\n return;\n }\n const { fieldName } = VestTest.getData(testObject);\n\n // If we already added the current field (not this test specifically)\n // no need for further checks, go and omit the test\n if (shouldOmit.has(fieldName)) {\n verifyAndOmit(testObject);\n } else {\n // check if the field has an optional function\n // if so, run it and verify/omit the test\n runOptionalConfig(testObject);\n }\n });\n\n useEmit('DONE_TEST_OMISSION_PASS');\n\n function verifyAndOmit(testObject: TIsolateTest) {\n const { fieldName } = VestTest.getData(testObject);\n if (shouldOmit.has(fieldName)) {\n VestTest.omit(testObject);\n SuiteOptionalFields.setOptionalField(root, fieldName, current => ({\n ...current,\n applied: true,\n }));\n }\n }\n\n function runOptionalConfig(testObject: TIsolateTest) {\n const { fieldName } = VestTest.getData(testObject);\n\n // Ge the optional configuration for the given field\n const optionalConfig = SuiteOptionalFields.getOptionalField(\n root,\n fieldName,\n );\n\n // If the optional was set to a function or a boolean, run it and verify/omit the test\n if (dynamicValue(optionalConfig.rule) === true) {\n shouldOmit.add(fieldName);\n }\n\n verifyAndOmit(testObject);\n }\n}\n","import { isArray, callEach, greaterThan } from 'vest-utils';\n\nimport { useDoneCallbacks, useFieldCallbacks } from '../core/Runtime';\nimport { TFieldName } from '../suiteResult/SuiteResultTypes';\nimport { useCreateSuiteResult } from '../suiteResult/suiteResult';\n\n/**\n * Runs done callback per field when async tests are finished running.\n */\nexport function useRunFieldCallbacks(fieldName: TFieldName): void {\n const [fieldCallbacks] = useFieldCallbacks();\n\n if (isArray(fieldCallbacks[fieldName])) {\n callEach(fieldCallbacks[fieldName]);\n }\n}\n\n/**\n * Runs field callbacks (done callbacks) that can be executed immediately.\n * This happens when a field has non-pending tests (synchronous tests).\n */\nexport function useRunSyncFieldCallbacks(): void {\n const [fieldCallbacks] = useFieldCallbacks();\n const result = useCreateSuiteResult();\n\n // Iterate over all fields that have registered done callbacks\n for (const fieldName in fieldCallbacks) {\n // Get the array of callbacks for the current field\n const callbacks = fieldCallbacks[fieldName];\n\n if (isArray(callbacks)) {\n // Get the summary stats for this field from the suite result\n const testSummary = result.tests[fieldName];\n\n // Check if the field has any tests that are NOT pending.\n // testCount is the total number of tests for the field.\n // pendingCount is the number of tests currently running (async).\n // If testCount > pendingCount, it means there is at least one test\n // that has already finished (synchronous), so we can run the callbacks.\n if (\n testSummary &&\n greaterThan(testSummary.testCount, testSummary.pendingCount)\n ) {\n // Execute all registered callbacks for this field.\n // This is the \"nested loop\" that iterates over the callbacks array.\n callEach(callbacks);\n }\n }\n }\n}\n\n/**\n * Runs unlabelled done callback when async tests are finished running.\n */\nexport function useRunDoneCallbacks() {\n const [doneCallbacks] = useDoneCallbacks();\n\n callEach(doneCallbacks);\n}\n","import { CB, BusType, Failure, deferThrow } from 'vest-utils';\nimport { Bus, RuntimeEvents, TIsolate, VestRuntime } from 'vestjs-runtime';\n\nimport { useOmitOptionalFields } from '../../hooks/optional/omitOptionalFields';\nimport { TIsolateSuite } from '../isolate/IsolateSuite/IsolateSuite';\nimport {\n useRunDoneCallbacks,\n useRunFieldCallbacks,\n useRunSyncFieldCallbacks,\n} from '../../suite/runCallbacks';\nimport { TFieldName } from '../../suiteResult/SuiteResultTypes';\nimport {\n useExpireSuiteResultCache,\n useResetCallbacks,\n useResetSuite,\n} from '../Runtime';\nimport { TestWalker } from '../isolate/IsolateTest/TestWalker';\nimport { VestTest } from '../isolate/IsolateTest/VestTest';\n\nimport { useOnTestStart, useRegisterSubtree } from '../isolate/registerTests';\nimport { useRegistryBusEvents } from '../test/TestRegistry';\n\nimport { Events } from './BusEvents';\n\n// eslint-disable-next-line max-statements, max-lines-per-function\nexport function useInitVestBus() {\n const VestBus = Bus.useBus<VestEvents>();\n\n useRegistryBusEvents(VestBus);\n\n // Invalidate suite result cache on test start to prevent stale cache from\n // affecting test exclusion logic (see https://github.com/ealush/vest/issues/1157).\n VestBus.on('TEST_RUN_STARTED', () => {\n useExpireSuiteResultCache();\n });\n\n VestBus.on('ISOLATE_ENTER', (isolate: TIsolate) => {\n if (VestTest.is(isolate)) {\n useOnTestStart(isolate);\n }\n });\n\n VestBus.on('ISOLATE_RECONCILED', (isolate: TIsolate) => {\n useRegisterSubtree(isolate);\n });\n\n VestBus.on('ISOLATE_DONE', (isolate: TIsolate) => {\n if (VestTest.is(isolate)) {\n VestBus.emit('TEST_COMPLETED', isolate);\n }\n });\n\n VestBus.on('TEST_COMPLETED', () => {\n useExpireSuiteResultCache();\n });\n\n VestBus.on('ASYNC_ISOLATE_DONE', (isolate: TIsolate) => {\n if (VestTest.is(isolate)) {\n if (!VestTest.isCanceled(isolate).unwrap()) {\n const { fieldName } = VestTest.getData(isolate);\n\n useRunFieldCallbacks(fieldName);\n useRunDoneCallbacks();\n }\n }\n\n if (VestRuntime.useIsStable()) {\n // When no more async tests are running, emit the done event\n VestBus.emit('ALL_RUNNING_TESTS_FINISHED');\n }\n });\n\n VestBus.on('DONE_TEST_OMISSION_PASS', () => {\n /* We NEED to refresh the cache here. Don't ask */\n useExpireSuiteResultCache();\n });\n\n // Called when all the tests, including async, are done running\n VestBus.on('ALL_RUNNING_TESTS_FINISHED', () => {\n // Small optimization. We don't need to run this if there are no async tests\n // The reason is that we run this function immediately after the suite callback\n // is run, so if the suite is only comprised of sync tests, we don't need to\n // run this function twice since we know for a fact the state is up to date\n if (TestWalker.someTests(VestTest.isAsyncTest)) {\n useOmitOptionalFields();\n }\n\n // resolve the suite's promise\n const root = VestRuntime.useAvailableRoot<TIsolateSuite>();\n if (root) {\n root.data.resolver();\n }\n });\n\n VestBus.on('DEFER_THROW', (failure: Failure<any, any>) => {\n failure.mapError(deferThrow);\n });\n\n VestBus.on('RESET_FIELD', (fieldName: TFieldName) => {\n useExpireSuiteResultCache();\n\n TestWalker.resetField(fieldName);\n });\n\n VestBus.on('SUITE_RUN_STARTED', () => {});\n\n VestBus.on('INITIALIZING_CALLBACKS', () => {\n useExpireSuiteResultCache();\n useResetCallbacks();\n });\n\n VestBus.on('SUITE_CALLBACK_RUN_FINISHED', () => {\n useExpireSuiteResultCache();\n\n if (VestRuntime.useIsStable()) {\n // When no more async tests are running, emit the done event\n VestBus.emit('ALL_RUNNING_TESTS_FINISHED');\n }\n\n useOmitOptionalFields();\n useRunSyncFieldCallbacks();\n useRunDoneCallbacks();\n });\n\n VestBus.on('REMOVE_FIELD', (fieldName: TFieldName) => {\n useExpireSuiteResultCache();\n\n TestWalker.removeTestByFieldName(fieldName);\n });\n\n VestBus.on('RESET_SUITE', () => {\n useResetSuite();\n });\n\n return {\n subscribe,\n };\n\n function subscribe<T extends keyof VestEvents>(\n event: T,\n cb: (payload: VestEvents[T]) => void,\n ): CB<void>;\n function subscribe(cb: CB): CB<void>;\n function subscribe(\n ...args: [event: keyof VestEvents, cb: CB] | [cb: CB]\n ): CB<void> {\n const [cb, event] = args.reverse() as [CB, keyof VestEvents];\n\n // @ts-ignore - Argument type mismatch due to wildcard handling complexity\n return VestBus.on(event ?? '*', () => {\n cb();\n }).off;\n }\n}\n\nexport function useEmit(): BusType<VestEvents>['emit'];\nexport function useEmit<T extends keyof VestEvents>(\n event: T,\n ...args: VestEvents[T] extends void\n ? [payload?: VestEvents[T]]\n : [payload: VestEvents[T]]\n): void;\nexport function useEmit(event?: keyof VestEvents, data?: any): any {\n return Bus.useEmit<VestEvents>(event!, data);\n}\n\nexport function usePrepareEmitter<T extends keyof VestEvents>(\n event: T,\n): (arg: VestEvents[T]) => void {\n return Bus.usePrepareEmitter<VestEvents>(event);\n}\n\nexport type VestEvents = Events & RuntimeEvents;\n\nexport type Subscribe = {\n <T extends keyof VestEvents>(\n event: T,\n cb: (payload: VestEvents[T]) => void,\n ): CB<void>;\n (cb: CB): CB<void>;\n};\n","import { Maybe, Result, makeResult, text } from 'vest-utils';\nimport { IsolateInspector, Reconciler } from 'vestjs-runtime';\nimport type { TIsolate } from 'vestjs-runtime';\n\nimport { ErrorStrings } from '../../../errors/ErrorStrings';\nimport { useIsExcluded } from '../../../hooks/focused/useIsExcluded';\nimport { useVerifyTestRun } from '../../test/testLevelFlowControl/verifyTestRun';\n\nimport type { TIsolateTest } from './IsolateTest';\nimport { VestTest } from './VestTest';\nimport cancelOverriddenPendingTest from './cancelOverriddenPendingTest';\nimport { isSameProfileTest } from './isSameProfileTest';\nimport { useEmit } from '../../VestBus/VestBus';\n\nexport class IsolateTestReconciler {\n static match(currentNode: TIsolate, historyNode: TIsolate): boolean {\n return VestTest.is(currentNode) && VestTest.is(historyNode);\n }\n\n static reconcile(\n currentNode: TIsolateTest,\n historyNode: TIsolateTest,\n ): TIsolateTest {\n const reconcilerOutput = usePickNode(currentNode, historyNode).unwrap();\n\n const nextNode = useVerifyTestRun(currentNode, reconcilerOutput);\n\n cancelOverriddenPendingTestOnTestReRun(nextNode, currentNode, historyNode);\n\n return nextNode;\n }\n}\n\n// eslint-disable-next-line max-statements\nfunction usePickNode(\n newNode: TIsolateTest,\n prevNode: TIsolateTest,\n): Result<TIsolateTest> {\n if (IsolateInspector.usesKey(newNode)) {\n return useHandleTestWithKey(newNode);\n }\n\n const newNodeResult = makeResult.Ok(newNode);\n\n if (\n Reconciler.dropNextNodesOnReorder(nodeReorderDetected, newNode, prevNode)\n ) {\n useOrderResult(newNode, prevNode);\n return newNodeResult;\n }\n\n if (!VestTest.is(prevNode)) {\n // I believe we cannot actually reach this point.\n // Because it should already be handled by nodeReorderDetected.\n /* istanbul ignore next */\n return newNodeResult;\n }\n\n // Re-run previously omitted tests to avoid stale \"optional\" identification.\n // An omitted test has no result, so reusing it would cause the optional\n // system to incorrectly treat the field as optional (since no test ran).\n // Re-evaluation is conservative but correct.\n if (VestTest.isOmitted(prevNode).unwrap()) {\n return newNodeResult;\n }\n\n return makeResult.Ok(prevNode);\n}\n\nfunction useHandleTestWithKey(newNode: TIsolateTest): Result<TIsolateTest> {\n return VestTest.cast(\n Reconciler.handleIsolateNodeWithKey(newNode, (prevNode: TIsolateTest) => {\n // This is the revoke callback. it determines whether we should revoke the previous node and use the new one.\n if (VestTest.isNonActionable(prevNode).unwrap()) {\n return true;\n }\n\n if (useIsExcluded(newNode)) {\n return false;\n }\n\n return true;\n }),\n );\n}\n\nfunction cancelOverriddenPendingTestOnTestReRun(\n nextNode: TIsolate,\n currentNode: TIsolate,\n prevTestObject: TIsolateTest,\n) {\n if (nextNode === currentNode && VestTest.is(currentNode)) {\n cancelOverriddenPendingTest(prevTestObject, currentNode).unwrap();\n }\n}\n\nfunction nodeReorderDetected(\n newNode: TIsolateTest,\n prevNode: Maybe<TIsolate>,\n): boolean {\n return (\n VestTest.is(prevNode) && !isSameProfileTest(prevNode, newNode).unwrap()\n );\n}\n\nfunction useOrderResult(\n newNode: TIsolateTest,\n prevNode: Maybe<TIsolate>,\n): Result<void> {\n if (IsolateInspector.canReorder(newNode)) {\n return makeResult.Ok(undefined);\n }\n\n const err = makeResult.Err(\n text(ErrorStrings.TESTS_CALLED_IN_DIFFERENT_ORDER, {\n fieldName: VestTest.getData(newNode).fieldName,\n prevName: VestTest.is(prevNode)\n ? VestTest.getData(prevNode).fieldName\n : undefined,\n }),\n );\n\n useEmit('DEFER_THROW', err);\n return err;\n}\n","import { Nullable } from 'vest-utils';\nimport { TIsolate } from 'vestjs-runtime';\n\nimport { IsolateTestReconciler } from './IsolateTest/IsolateTestReconciler';\n\nconst reconcilers: IsolateReconciler[] = [IsolateTestReconciler];\n\nexport function registerReconciler(reconciler: IsolateReconciler) {\n if (reconcilers.includes(reconciler)) {\n return;\n }\n\n reconcilers.push(reconciler);\n}\n\nexport function VestReconciler(\n currentNode: TIsolate,\n historyNode: TIsolate,\n): Nullable<TIsolate> {\n return (\n reconcilers\n .find(reconciler => reconciler.match(currentNode, historyNode))\n ?.reconcile(currentNode, historyNode) ?? null\n );\n}\n\ntype IsolateReconciler = {\n match(currentNode: TIsolate, historyNode: TIsolate): boolean;\n reconcile(currentNode: TIsolate, historyNode: TIsolate): TIsolate;\n};\n","import { CB, Maybe } from 'vest-utils';\nimport { TIsolate, Isolate, IsolateKey } from 'vestjs-runtime';\n\nimport { TestSeverity } from '../../../suiteResult/Severity';\nimport { TFieldName } from '../../../suiteResult/SuiteResultTypes';\nimport {\n IsolateTestStateMachine,\n TestStatus,\n} from '../../StateMachines/IsolateTestStateMachine';\nimport { AsyncTest, TestFn } from '../../test/TestTypes';\nimport { VestIsolateType } from '../VestIsolateType';\n\nexport type TIsolateTest<F extends TFieldName = TFieldName> = TIsolate<\n CommonTestFields<F> & IsolateTestPayload\n>;\n\nexport function IsolateTest<F extends TFieldName = TFieldName>(\n callback: CB,\n input: CommonTestFields<F>,\n key?: IsolateKey,\n): TIsolateTest<F> {\n const payload: IsolateTestPayload = {\n ...IsolateTestBase(),\n fieldName: input.fieldName,\n testFn: input.testFn,\n };\n\n if (input.message) {\n payload.message = input.message;\n }\n\n const isolate = Isolate.create<IsolateTestPayload>(\n VestIsolateType.Test,\n callback,\n payload,\n key ?? null,\n );\n\n return isolate as TIsolateTest<F>;\n}\n\nexport function IsolateTestBase() {\n return {\n severity: TestSeverity.Error,\n testStatus: IsolateTestStateMachine.initial(),\n };\n}\n\nexport type IsolateTestPayload<F extends TFieldName = TFieldName> =\n CommonTestFields<F> & {\n severity: TestSeverity;\n testStatus: TestStatus;\n asyncTest?: AsyncTest;\n };\n\ntype CommonTestFields<F extends TFieldName = TFieldName> = {\n message?: Maybe<string>;\n fieldName: F;\n testFn: TestFn;\n};\n","import {\n Maybe,\n isStringValue,\n isUndefined,\n makeResult,\n Result,\n} from 'vest-utils';\n\nexport function shouldUseErrorAsMessage(\n message: Maybe<string>,\n error: unknown,\n): Result<boolean> {\n // kind of cheating with this safe guard, but it does the job\n return makeResult.Ok(isUndefined(message) && isStringValue(error));\n}\n","import { TIsolate } from 'vestjs-runtime';\n\nimport { TIsolateTest } from '../isolate/IsolateTest/IsolateTest';\n\nconst TEST_REF = Symbol('vest_test_ref');\n\ntype AbortSignalWithTestRef = AbortSignal & {\n [TEST_REF]?: TIsolateTest;\n};\n\nexport function getAbortController(isolate: TIsolate): AbortController {\n if (isolate.abortController) {\n return isolate.abortController;\n }\n\n isolate.abortController = new AbortController();\n\n (isolate.abortController.signal as AbortSignalWithTestRef)[TEST_REF] =\n isolate as TIsolateTest;\n\n return isolate.abortController;\n}\n\nexport function getTestFromAbortSignal(\n signal?: AbortSignal,\n): TIsolateTest | undefined {\n return (signal as AbortSignalWithTestRef | undefined)?.[TEST_REF];\n}\n","import {\n isPromise,\n isStringValue,\n text,\n deferThrow,\n makeResult,\n Result,\n isUndefined,\n} from 'vest-utils';\nimport { VestRuntime } from 'vestjs-runtime';\n\nimport { ErrorStrings } from '../../../errors/ErrorStrings';\nimport { SuiteContext } from '../../context/SuiteContext';\nimport { TIsolateTest } from '../../isolate/IsolateTest/IsolateTest';\nimport { VestTest } from '../../isolate/IsolateTest/VestTest';\nimport { TestResult } from '../TestTypes';\nimport { shouldUseErrorAsMessage } from '../helpers/shouldUseErrorMessage';\nimport { getAbortController } from '../Abortable';\n\nimport { useVerifyTestRun } from './verifyTestRun';\n\n/**\n * Attempts to run a test.\n * This function verifies if the test should run, and if so, runs it.\n * @param testObject - The test isolate to run.\n */\nexport function useAttemptRunTest(testObject: TIsolateTest) {\n useVerifyTestRun(testObject);\n\n if (VestTest.isUntested(testObject).unwrap()) {\n return useRunTest(testObject).unwrap();\n }\n\n if (!VestTest.isNonActionable(testObject).unwrap()) {\n // Probably unreachable. If we get here, it means that\n // something was really wrong and should be reported.\n /* istanbul ignore next */\n deferThrow(\n text(ErrorStrings.UNEXPECTED_TEST_REGISTRATION_ERROR, {\n testObject: JSON.stringify(testObject),\n }),\n );\n }\n}\n\n/**\n * Runs a synchronous test.\n * @param testObject - The test isolate to run.\n * @returns The result of the test run.\n */\nfunction useRunSyncTest(testObject: TIsolateTest): Result<TestResult> {\n return makeResult.Ok(\n SuiteContext.run({ currentTest: testObject }, () => {\n const result = runTestCallback(testObject);\n\n if (result === false) {\n VestTest.fail(testObject);\n }\n\n return result;\n }),\n );\n}\n\nfunction runTestCallback(testObject: TIsolateTest): TestResult {\n const { message, testFn } = VestTest.getData(testObject);\n\n try {\n return testFn({ signal: getAbortController(testObject).signal });\n } catch (error) {\n if (shouldUseErrorAsMessage(message, error).unwrap()) {\n VestTest.getData(testObject).message = error as string;\n }\n return false;\n }\n}\n\n/**\n * Runs a test, handling both synchronous and asynchronous tests.\n * If the test returns a promise, it is marked as async and added to the pending list.\n * @param testObject - The test isolate to run.\n * @returns A promise if the test is async, or undefined if it's sync.\n */\nfunction useRunTest(\n testObject: TIsolateTest,\n): Result<Promise<void> | undefined> {\n // Run test callback.\n // If a promise is returned, set as async and\n // Move to pending list.\n const result = useRunSyncTest(testObject).unwrap();\n try {\n // try catch for safe property access\n // in case object is an enforce chain\n if (isPromise(result)) {\n VestTest.getData(testObject).asyncTest = result;\n return useRunAsyncTest(testObject);\n }\n\n onTestCompleted(testObject).unwrap();\n return makeResult.Ok(undefined);\n } catch (e) {\n // Probably unreachable. If we get here, it means that\n // something was really wrong and should be reported.\n /* istanbul ignore next */\n throw new Error(\n text(ErrorStrings.UNEXPECTED_TEST_REGISTRATION_ERROR, {\n testObject: JSON.stringify(testObject),\n error: e,\n }),\n );\n }\n}\n\n/**\n * Runs an asynchronous test.\n * Sets up the success and failure callbacks for the promise.\n * @param testObject - The test isolate to run.\n * @returns The promise of the async test.\n */\nfunction useRunAsyncTest(\n testObject: TIsolateTest,\n): Result<Promise<void> | undefined> {\n const { asyncTest, message } = VestTest.getData(testObject);\n\n if (!isPromise(asyncTest)) return makeResult.Ok(undefined);\n VestTest.setStarted(testObject);\n\n const done = VestRuntime.persist(() => {\n onTestCompleted(testObject).unwrap();\n });\n const fail = VestRuntime.persist((rejectionMessage?: unknown) => {\n if (VestTest.isCanceled(testObject).unwrap()) {\n return;\n }\n\n const errorMessage = isStringValue(rejectionMessage)\n ? rejectionMessage\n : rejectionMessage instanceof Error\n ? rejectionMessage.message\n : undefined;\n\n VestTest.getData(testObject).message = isUndefined(message)\n ? errorMessage\n : message;\n VestTest.fail(testObject);\n\n done();\n });\n\n return makeResult.Ok(asyncTest.then(done, fail));\n}\n\nfunction onTestCompleted(testObject: TIsolateTest): Result<void> {\n // Attempts passing if the test is not already failed.\n // or is not canceled/omitted.\n VestTest.pass(testObject);\n return makeResult.Ok(undefined);\n}\n","import {\n isFunction,\n isStringValue,\n makeBrand,\n makeResult,\n Result,\n text,\n} from 'vest-utils';\nimport { IsolateKey } from 'vestjs-runtime';\n\nimport { ErrorStrings } from '../../errors/ErrorStrings';\nimport { TFieldName } from '../../suiteResult/SuiteResultTypes';\n\nimport { TestFn, TestMessage } from './TestTypes';\n\nexport type TestParams<F extends TFieldName = TFieldName> = {\n fieldName: F;\n key?: IsolateKey;\n message?: TestMessage;\n testFn: TestFn;\n};\n\nexport function validateTestParams(\n fieldName: string,\n ...rest: any[]\n): Result<TestParams, string> {\n if (!isStringValue(fieldName)) {\n return makeResult.Err(\n text(ErrorStrings.INVALID_PARAM_PASSED_TO_FUNCTION, {\n fn_name: 'test',\n param: 'fieldName',\n expected: 'string',\n }),\n );\n }\n\n const [message, testFn, key] = (\n isFunction(rest[1]) ? rest : [undefined, ...rest]\n ) as [TestMessage, TestFn, IsolateKey | undefined];\n\n if (!isFunction(testFn)) {\n return makeResult.Err(\n text(ErrorStrings.INVALID_PARAM_PASSED_TO_FUNCTION, {\n fn_name: 'test',\n param: 'callback',\n expected: 'function',\n }),\n );\n }\n\n return makeResult.Ok({\n fieldName: makeBrand<TFieldName>(fieldName),\n key,\n message,\n testFn,\n });\n}\n","import { IsolateKey } from 'vestjs-runtime';\nimport { useEmit } from '../VestBus/VestBus';\n\nimport { IsolateTest, TIsolateTest } from '../isolate/IsolateTest/IsolateTest';\n\nimport { TestFn, TestMessage } from './TestTypes';\nimport { useAttemptRunTest } from './testLevelFlowControl/runTest';\nimport { validateTestParams } from './validateTestParams';\n\nfunction vestTest(\n fieldName: string,\n message: TestMessage,\n cb: TestFn,\n): TIsolateTest;\nfunction vestTest(fieldName: string, cb: TestFn): TIsolateTest;\nfunction vestTest(\n fieldName: string,\n message: TestMessage,\n cb: TestFn,\n key: IsolateKey,\n): TIsolateTest;\nfunction vestTest(fieldName: string, cb: TestFn, key: IsolateKey): TIsolateTest;\n// eslint-disable-next-line vest-internal/use-use\nfunction vestTest(\n fieldName: string,\n ...args:\n | [message: TestMessage, cb: TestFn]\n | [cb: TestFn]\n | [message: TestMessage, cb: TestFn, key: IsolateKey]\n | [cb: TestFn, key: IsolateKey]\n): TIsolateTest {\n const {\n fieldName: safeFieldName,\n message,\n testFn,\n key,\n } = validateTestParams(fieldName, ...args).unwrap();\n\n const testObjectInput = { fieldName: safeFieldName, message, testFn };\n\n // This invalidates the suite cache.\n useEmit('TEST_RUN_STARTED');\n\n return IsolateTest(useAttemptRunTest, testObjectInput, key);\n}\n\nexport const test = vestTest;\n","import { Maybe, OneOrMoreOf, Result, makeResult } from 'vest-utils';\nimport {\n IsolateFocused as VestRuntimeIsolateFocused,\n FocusModes,\n FocusSelectors,\n type TIsolateFocused,\n} from 'vestjs-runtime';\n\nimport { TFieldName } from '../../suiteResult/SuiteResultTypes';\n\nexport { FocusModes, FocusSelectors, type TIsolateFocused };\n\nexport type FieldExclusion<F extends string = TFieldName> = Maybe<\n OneOrMoreOf<F>\n>;\n\n/**\n * Adds a field or a list of fields into the inclusion list\n *\n * @example\n *\n * only('username');\n */\nexport function only(match: FieldExclusion<string> | false) {\n return VestRuntimeIsolateFocused(\n FocusModes.ONLY,\n defaultMatch(match).unwrap(),\n );\n}\n/**\n * Adds a field or a list of fields into the exclusion list\n *\n * @example\n *\n * skip('username');\n */\nexport function skip(match: FieldExclusion<string> | boolean) {\n return VestRuntimeIsolateFocused(\n FocusModes.SKIP,\n defaultMatch(match).unwrap(),\n );\n}\n\nfunction defaultMatch(\n match: FieldExclusion<string> | boolean,\n): Result<FieldExclusion<string> | true> {\n return makeResult.Ok(match === false ? [] : match);\n}\n","import { isNotNullish } from 'vest-utils';\nimport {\n TIsolate,\n Walker,\n FocusSelectors,\n TIsolateFocused,\n} from 'vestjs-runtime';\n\nimport { TIsolateTest } from '../../core/isolate/IsolateTest/IsolateTest';\n\n/**\n * Checks if context has included tests\n */\nexport function useHasOnliedTests(\n testObject: TIsolateTest,\n fieldName?: string,\n): boolean {\n return isNotNullish(\n Walker.findClosest<TIsolateFocused>(testObject, (child: TIsolate) => {\n if (!FocusSelectors.isIsolateFocused(child)) return false;\n\n return FocusSelectors.isOnlyFocused(child, fieldName);\n }),\n );\n}\n","import { dynamicValue, invariant, isStringValue, makeBrand } from 'vest-utils';\nimport { IsolateTransient, type TIsolate } from 'vestjs-runtime';\n\nimport { useInclusion } from '../core/context/SuiteContext';\nimport { TIsolateTest } from '../core/isolate/IsolateTest/IsolateTest';\nimport { ErrorStrings } from '../errors/ErrorStrings';\nimport { TDraftCondition } from '../suite/getTypedMethods';\nimport { TFieldName, TGroupName } from '../suiteResult/SuiteResultTypes';\nimport { useCreateSuiteResult } from '../suiteResult/suiteResult';\n\nimport { useHasOnliedTests } from './focused/useHasOnliedTests';\n\nconst INCLUDE_UNSET = Symbol('include_unset');\n\n/**\n * Conditionally includes a field for testing, based on specified criteria.\n *\n * @param {string} fieldName - The name of the field to include for testing.\n *\n * @example\n * include('confirm').when('password');\n * // Includes the \"confirm\" field for testing when the \"password\" field is included\n *\n * include('confirm').when(someValue);\n * // Includes the \"confirm\" field for testing when the value of `someValue` is true\n *\n * include('confirm').when(() => someValue);\n * // Includes the \"confirm\" field for testing when the callback function returns true\n *\n * include('username').when(result => result.hasErrors('username'));\n * // Includes the \"username\" field for testing when there are errors associated with it in the current suite result\n */\n// @vx-allow use-use\nexport function include<F extends TFieldName, G extends TGroupName>(\n fieldName: F | string,\n): {\n when: (condition: F | string | TFieldName | TDraftCondition<F, G>) => void;\n} {\n invariant(isStringValue(fieldName));\n const safeFieldName = makeBrand<TFieldName>(fieldName);\n const conditionRef: IncludeConditionRef<F, G> = {\n current: INCLUDE_UNSET,\n };\n\n IsolateTransient(useSetIncluded, 'Include', {\n conditionRef,\n fieldName: safeFieldName,\n });\n\n return { when };\n\n /**\n * Specifies the inclusion criteria for the field in `include` function.\n */\n function when(\n condition: F | string | TFieldName | TDraftCondition<F, G>,\n ): void {\n invariant(condition !== fieldName, ErrorStrings.INCLUDE_SELF);\n\n conditionRef.current = condition;\n }\n}\n\ntype IncludeCondition<F extends TFieldName, G extends TGroupName> =\n | F\n | string\n | TFieldName\n | TDraftCondition<F, G>;\n\ntype IncludeConditionRef<F extends TFieldName, G extends TGroupName> = {\n current: IncludeCondition<F, G> | typeof INCLUDE_UNSET;\n};\n\ntype IncludePayload<F extends TFieldName, G extends TGroupName> = {\n conditionRef: IncludeConditionRef<F, G>;\n fieldName: TFieldName;\n};\n\nfunction useSetIncluded<F extends TFieldName, G extends TGroupName>(\n isolate: TIsolate<IncludePayload<F, G>>,\n): void {\n const inclusion = useInclusion();\n const { fieldName, conditionRef } = isolate.data;\n\n // This callback will run as part of the \"isExcluded\" series of checks\n inclusion[fieldName] = function isIncluded(\n currentNode: TIsolateTest,\n ): boolean {\n const condition = conditionRef.current;\n\n if (condition === INCLUDE_UNSET) {\n return true;\n }\n\n if (isStringValue(condition)) {\n return useHasOnliedTests(currentNode, makeBrand<TFieldName>(condition));\n }\n\n return dynamicValue(condition, () =>\n useCreateSuiteResult(undefined, undefined),\n );\n };\n}\n","import { invariant } from 'vest-utils';\n\nimport { useCurrentTest } from '../core/context/SuiteContext';\nimport { VestTest } from '../core/isolate/IsolateTest/VestTest';\nimport { ErrorStrings } from '../errors/ErrorStrings';\nimport { TestSeverity } from '../suiteResult/Severity';\n\nexport function useWarn() {\n const currentTest = useCurrentTest(ErrorStrings.HOOK_CALLED_OUTSIDE);\n\n invariant(currentTest, ErrorStrings.USE_WARN_MUST_BE_CALLED_FROM_TEST);\n\n return function setWarn(): void {\n VestTest.setSeverity(currentTest, TestSeverity.Warning);\n };\n}\n","import { useWarn } from './useWarn';\n\n/**\n * Sets the severity level of a test to `warn`, allowing it to fail without marking the suite as invalid.\n * Use this function within the body of a test to create warn-only tests.\n *\n * @returns {void}\n *\n * @example\n * test('password', 'Your password strength is: WEAK', () => {\n * warn();\n *\n * enforce(data.password).matches(/0-9/);\n * });\n *\n * @limitations\n * - The `warn` function should only be used within the body of a `test` function.\n * - When using `warn()` in an async test, it should be called in the synchronous portion of the test, not after an `await` call or in the Promise body (see `useWarn`).\n * - It is recommended to call `warn()` at the top of the test function.\n */\n// @vx-allow use-use\nexport function warn(): void {\n const setWarn = useWarn();\n setWarn();\n}\n","import { CB } from 'vest-utils';\n\nimport { IsolateReorderable } from 'vestjs-runtime';\n\nimport { TVestIsolate, VestIsolateType } from '../VestIsolateType';\n\nexport type TIsolateEach = TVestIsolate;\n\nexport function IsolateEach<Callback extends CB = CB>(\n callback: Callback,\n): TIsolateEach {\n return IsolateReorderable(callback, VestIsolateType.Each, {\n tests: [],\n }) as TIsolateEach;\n}\n","import { invariant, isFunction } from 'vest-utils';\n\nimport {\n IsolateEach,\n TIsolateEach,\n} from '../core/isolate/IsolateEach/IsolateEach';\nimport { ErrorStrings } from '../errors/ErrorStrings';\n\n/**\n * Iterates over an array of items, allowing to run tests individually per item.\n *\n * Requires setting a \"key\" property on each item tested.\n *\n * @example\n *\n * each(itemsArray, (item) => {\n * test(item.name, 'Item value must not be empty', () => {\n * enforce(item.value).isNotEmpty();\n * }, item.id)\n * })\n */\nexport function each<T>(\n list: T[],\n callback: (arg: T, index: number) => void,\n): TIsolateEach {\n invariant(\n isFunction(callback),\n ErrorStrings.EACH_CALLBACK_MUST_BE_A_FUNCTION,\n );\n\n return IsolateEach(() => {\n list.forEach((arg, index) => {\n callback(arg, index);\n });\n });\n}\n","import { CB, makeBrand, isNotEmptySet } from 'vest-utils';\nimport { TIsolate } from 'vestjs-runtime';\n\nimport { SuiteContext } from '../core/context/SuiteContext';\nimport {\n createVestIsolate,\n TVestIsolate,\n VestIsolateType,\n} from '../core/isolate/VestIsolateType';\nimport { skip } from '../hooks/focused/focused';\nimport { TGroupName } from '../suiteResult/SuiteResultTypes';\n\nexport function group(groupName: string, callback: CB<void>): TIsolate;\nexport function group(callback: CB<void>): TIsolate;\nexport function group(\n ...args: [groupName: string, callback: CB<void>] | [callback: CB<void>]\n): TIsolateGroup<TGroupName> {\n const [callback, groupName] = args.reverse() as [\n CB<void>,\n string | undefined,\n ];\n const safeGroupName =\n groupName === undefined ? undefined : makeBrand<TGroupName>(groupName);\n\n return createVestIsolate(\n VestIsolateType.Group,\n () => {\n // When `skipGroup` is set via `suite.focus({ skipGroup: ... })`, inject\n // a `skip(true)` call at the top of the matching group's callback.\n // This creates a transient Focused isolate inside the group scope with\n // `matchAll: true`, causing all tests in this group to be excluded.\n // Because the isolate is transient, it is not persisted in the suite\n // state and adds zero overhead between runs.\n if (groupName && shouldSkipGroup(groupName)) {\n skip(true);\n }\n callback();\n },\n {\n groupName: safeGroupName as TGroupName,\n },\n );\n}\n\n/**\n * Evaluates whether an entire group should be skipped based on `suite.focus()` modifiers.\n *\n * This function enforces the precedence rules: `skipGroup` > `onlyGroup`.\n *\n * 1. If `skipGroup` contains the group name, it is unconditionally skipped (destructive block-list).\n * 2. If `onlyGroup` is active (has items), and the group name is NOT in it, it is skipped (constructive allow-list).\n * 3. Otherwise, the group is allowed to run.\n *\n * @param {string} groupName - The name of the group being evaluated.\n * @returns {boolean} `true` if the group should be skipped, `false` otherwise.\n */\nfunction shouldSkipGroup(groupName: string): boolean {\n const { modifiers } = SuiteContext.useX();\n\n // 1. Destructive block-list takes absolute precedence\n if (\n isNotEmptySet(modifiers.skipGroup) &&\n modifiers.skipGroup.has(groupName)\n ) {\n return true;\n }\n\n // 2. Constructive allow-list pruning\n if (\n isNotEmptySet(modifiers.onlyGroup) &&\n !modifiers.onlyGroup.has(groupName)\n ) {\n return true;\n }\n\n return false;\n}\n\nexport type TIsolateGroup<G extends TGroupName = TGroupName> = TVestIsolate<{\n groupName: G;\n}>;\n","import type { CB } from 'vest-utils';\nimport { dynamicValue } from 'vest-utils';\nimport { TIsolate } from 'vestjs-runtime';\n\nimport {\n createVestIsolate,\n VestIsolateType,\n} from '../core/isolate/VestIsolateType';\nimport { TDraftCondition } from '../suite/getTypedMethods';\nimport { TFieldName, TGroupName } from '../suiteResult/SuiteResultTypes';\nimport { LazyDraft } from '../suiteResult/selectors/LazyDraft';\n\n/**\n * Conditionally omits tests from the suite.\n *\n * Unlike `skipWhen`, omitted tests are **completely removed** from the\n * result — they do not retain their previous state and are not counted\n * in `testCount`, `errorCount`, or validity checks. Use `omitWhen` when\n * the tests are irrelevant to the current form state (e.g., omit\n * \"confirm password\" tests when the password field is empty).\n *\n * @example\n *\n * // Don't validate confirmation when password is empty\n * omitWhen(!data.password, () => {\n * test('confirm', 'Passwords do not match', () => {\n * enforce(data.confirm).equals(data.password);\n * });\n * });\n */\n// @vx-allow use-use\nexport function omitWhen<F extends TFieldName, G extends TGroupName>(\n conditional: TDraftCondition<F, G>,\n callback: CB,\n): TIsolate {\n return createVestIsolate(\n VestIsolateType.OmitWhen,\n () => {\n const isOmitted = dynamicValue(conditional, LazyDraft<F, G>());\n\n if (!isOmitted) {\n callback();\n }\n },\n {\n tests: [],\n },\n );\n}\n","import { assign } from 'vest-utils';\n\nimport {\n DoneCallback,\n useDoneCallbacks,\n useFieldCallbacks,\n} from '../../core/Runtime';\nimport { TFieldName } from '../../suiteResult/SuiteResultTypes';\n\nexport function useDeferDoneCallback(\n doneCallback: DoneCallback,\n fieldName?: TFieldName,\n): void {\n const [, setFieldCallbacks] = useFieldCallbacks();\n const [, setDoneCallbacks] = useDoneCallbacks();\n\n if (fieldName) {\n setFieldCallbacks(fieldCallbacks =>\n assign(fieldCallbacks, {\n [fieldName]: (fieldCallbacks[fieldName] || []).concat(doneCallback),\n }),\n );\n\n return;\n }\n\n setDoneCallbacks(doneCallbacks => doneCallbacks.concat(doneCallback));\n}\n","import { StandardSchemaV1 } from 'vest-utils/standardSchemaSpec';\n\nimport { InferSchemaData, TSchema } from '../suiteResult/SuiteResultTypes';\n\nexport function getStandardSchema<S extends TSchema = undefined>(\n staticRunner: any,\n): StandardSchemaV1.Props<InferSchemaData<S>, InferSchemaData<S>> {\n return {\n types: undefined,\n validate: (value: unknown) => {\n const result = staticRunner(value);\n if (!result.hasErrors()) {\n return { value: value as InferSchemaData<S> };\n }\n return {\n issues: result.errors.map((error: any) => ({\n ...(error.message === undefined ? {} : { message: error.message }),\n path: error.fieldName ? error.fieldName.split('.') : undefined,\n })),\n };\n },\n vendor: 'vest',\n version: 1,\n };\n}\n","import { CB, DynamicValue } from 'vest-utils';\nimport { TIsolate, IsolateKey } from 'vestjs-runtime';\n\nimport { TIsolateTest } from '../core/isolate/IsolateTest/IsolateTest';\nimport { TestFn, TestMessage } from '../core/test/TestTypes';\nimport { test } from '../core/test/test';\nimport { FieldExclusion, only, skip } from '../hooks/focused/focused';\nimport { include } from '../hooks/include';\nimport { OptionalsInput } from '../hooks/optional/OptionalTypes';\nimport { optional } from '../hooks/optional/optional';\nimport { group } from '../isolates/group';\nimport { omitWhen } from '../isolates/omitWhen';\nimport { skipWhen } from '../isolates/skipWhen';\nimport {\n SuiteResult,\n TFieldName,\n TGroupName,\n} from '../suiteResult/SuiteResultTypes';\n\nexport function getTypedMethods<\n F extends TFieldName,\n G extends TGroupName,\n>(): TTypedMethods<F, G> {\n return {\n group,\n include,\n omitWhen,\n only,\n optional,\n skip,\n skipWhen,\n test,\n };\n}\n\nexport type TTypedMethods<F extends TFieldName, G extends TGroupName> = {\n include: (fieldName: F) => {\n when: (condition: F | TDraftCondition<F, G>) => void;\n };\n\n omitWhen: (conditional: TDraftCondition<F, G>, callback: CB) => void;\n only: {\n (item: FieldExclusion<F>): void;\n };\n optional: (optionals: OptionalsInput<F>) => void;\n skip: {\n (item: FieldExclusion<F>): void;\n };\n skipWhen: (condition: TDraftCondition<F, G>, callback: CB) => void;\n test: {\n (fieldName: F, message: TestMessage, cb: TestFn): TIsolateTest;\n (fieldName: F, cb: TestFn): TIsolateTest;\n (\n fieldName: F,\n message: TestMessage,\n cb: TestFn,\n key: IsolateKey,\n ): TIsolateTest;\n (fieldName: F, cb: TestFn, key: IsolateKey): TIsolateTest;\n };\n group: {\n (callback: () => void): TIsolate;\n (groupName: G, callback: () => void): TIsolate;\n };\n};\n\nexport type TDraftCondition<\n F extends TFieldName,\n G extends TGroupName,\n> = DynamicValue<boolean, [draft: SuiteResult<F, G>]>;\n","import { enforce } from 'n4s';\nimport {\n assign,\n asArray,\n CB,\n freezeAssign,\n isArray,\n isFunction,\n isObject,\n withResolvers,\n} from 'vest-utils';\n\nimport { useEmit } from '../core/VestBus/VestBus';\n\nimport { SuiteContext } from '../core/context/SuiteContext';\nimport { IsolateReorderable } from 'vestjs-runtime';\nimport { IsolateSuite } from '../core/isolate/IsolateSuite/IsolateSuite';\nimport { test } from '../core/test/test';\nimport { only, skip } from '../hooks/focused/focused';\nimport {\n SuiteResult,\n TFieldName,\n TGroupName,\n InferSchemaData,\n TSchema,\n InferSchemaOutput,\n} from '../suiteResult/SuiteResultTypes';\nimport { useCreateSuiteResult } from '../suiteResult/suiteResult';\n\nimport { SuiteModifiers, SuiteCallbackWithSchema } from './SuiteTypes';\n\ntype SchemaRunResult = {\n readonly message?: string;\n readonly pass: boolean;\n readonly path?: readonly string[];\n readonly type?: unknown;\n};\n\n/**\n * Creates the suite runner bound to a callback, modifiers and (optional) schema.\n *\n * The runner performs schema preprocessing once per run, stores the original input\n * and parsed output, and then executes the suite callback within SuiteContext.\n */\n// eslint-disable-next-line max-lines-per-function\nexport function useCreateSuiteRunner<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(\n suiteCallback: SuiteCallbackWithSchema<S, T>,\n modifiers: SuiteModifiers<F, G>,\n schema?: S,\n) {\n const transformedModifiers = useTransformedModifiers<F, G>(modifiers);\n\n return function runSuite(\n ...args: S extends undefined\n ? Parameters<T>\n : [data: InferSchemaData<S>, ...args: any[]]\n ): SuiteResult<F, G, S> {\n const runTime = new Date();\n const { resolve, promise } = withResolvers<SuiteResult<F, G, S>>();\n\n const schemaInput = args[0];\n const schemaRunResult = shouldRunSchema(schema)\n ? runSchemaWithParse(schema, schemaInput, transformedModifiers)\n : undefined;\n\n const parsedDataChunk = getParsedDataChunk(schemaRunResult);\n\n const parsedData = (\n schema ? snapshotParsedData(parsedDataChunk) : undefined\n ) as Partial<InferSchemaOutput<S>> | undefined;\n\n const callbackInput = getCallbackInput(schemaRunResult, schemaInput);\n const callbackArgs = [callbackInput, ...args.slice(1)] as Parameters<T>;\n const runData = callbackInput;\n\n const suiteResult = SuiteContext.run(\n {\n suiteParams: callbackArgs,\n schema,\n modifiers: transformedModifiers,\n },\n () => {\n useEmit('SUITE_RUN_STARTED');\n\n const useResolver = () => {\n const result = useCreateSuiteResult<F, G, S>(\n schema,\n callbackInput,\n runData,\n runTime,\n parsedData,\n snapshotFocus(transformedModifiers),\n );\n\n if (!result.isPending()) {\n resolve(result);\n }\n\n return result;\n };\n\n return IsolateSuite(\n useRunSuiteCallback<F, T, S, G>({\n args: callbackArgs,\n modifiers: transformedModifiers,\n schema,\n schemaRunResult,\n suiteCallback,\n useResolver,\n }),\n useResolver,\n ).output;\n },\n );\n\n return bindSuiteResultMethods(promise, suiteResult, runData, runTime);\n };\n}\n\n/**\n * Resolves the partial parsed data chunk from the schema run payload.\n */\nfunction getParsedDataChunk(\n schemaRunResult: SchemaRunResult[] | undefined,\n): unknown {\n if (!schemaRunResult || schemaRunResult.some(result => !result.pass)) {\n return {};\n }\n\n const [firstResult] = schemaRunResult;\n return firstResult?.type ?? {};\n}\n\n/**\n * Creates a defensive snapshot of the parsed data to prevent mutations\n * in the suite callback from affecting the result object.\n */\nfunction snapshotParsedData(data: unknown): unknown {\n if (isArray(data)) {\n return Object.freeze([...(data as unknown[])]);\n }\n if (isObject(data)) {\n return freezeAssign({}, data as object);\n }\n return data;\n}\n\n/**\n * Resolves the value that should be passed into the suite callback.\n */\nfunction getCallbackInput(\n schemaRunResult: SchemaRunResult[] | undefined,\n fallback: unknown,\n): unknown {\n if (!schemaRunResult || schemaRunResult.some(result => !result.pass)) {\n return fallback;\n }\n\n const [firstResult] = schemaRunResult;\n return firstResult?.type ?? fallback;\n}\n\n/**\n * Wraps suite callback execution and schema failure emission into an isolate callback.\n */\nfunction useRunSuiteCallback<\n F extends TFieldName,\n T extends CB = CB,\n S extends TSchema = undefined,\n G extends TGroupName = TGroupName,\n D = unknown,\n>(params: {\n args: any[];\n modifiers: ReturnType<typeof useTransformedModifiers<F, G>>;\n schema: S | undefined;\n schemaRunResult?: SchemaRunResult[];\n suiteCallback: SuiteCallbackWithSchema<S, T>;\n useResolver: () => SuiteResult<F, G, S, D>;\n}) {\n const {\n args,\n modifiers,\n schema,\n schemaRunResult,\n suiteCallback,\n useResolver,\n } = params;\n\n return () => {\n // Focused modifiers are applied before user callback so every test in this run\n // observes the same focus context.\n only(modifiers.only);\n skip(modifiers.skip);\n (suiteCallback as CB)(...args);\n\n IsolateReorderable(\n runSchemaValidation(schema, schemaRunResult),\n undefined,\n {\n tests: [],\n },\n );\n\n useEmit('SUITE_CALLBACK_RUN_FINISHED');\n return useResolver();\n };\n}\n\n/**\n * Normalizes user-provided modifiers into deterministic sets for O(1) membership checks.\n */\nfunction useTransformedModifiers<F extends TFieldName, G extends TGroupName>(\n modifiers: SuiteModifiers<F, G>,\n) {\n return {\n ...modifiers,\n onlyGroup: new Set(modifiers.onlyGroup ? asArray(modifiers.onlyGroup) : []),\n skipGroup: new Set(modifiers.skipGroup ? asArray(modifiers.skipGroup) : []),\n };\n}\n\n/**\n * Normalizes internal focus Sets back into the external Array representation\n * and freezes the structure explicitly for immutability in the results.\n */\nfunction snapshotFocus<F extends TFieldName, G extends TGroupName>(\n modifiers: ReturnType<typeof useTransformedModifiers<F, G>>,\n): SuiteModifiers<F, G> {\n return freezeAssign<SuiteModifiers<F, G>>(\n {},\n snapshotField(modifiers, 'only'),\n snapshotField(modifiers, 'skip'),\n snapshotGroup(modifiers, 'onlyGroup'),\n snapshotGroup(modifiers, 'skipGroup'),\n );\n}\n\nfunction snapshotField<F extends TFieldName, G extends TGroupName>(\n modifiers: ReturnType<typeof useTransformedModifiers<F, G>>,\n key: 'only' | 'skip',\n): Partial<SuiteModifiers<F, G>> {\n const original = modifiers[key];\n\n if (!original) {\n return {};\n }\n const value = asArray(original);\n return value.length > 0 ? { [key]: Object.freeze([...value]) } : {};\n}\n\nfunction snapshotGroup<F extends TFieldName, G extends TGroupName>(\n modifiers: ReturnType<typeof useTransformedModifiers<F, G>>,\n key: 'onlyGroup' | 'skipGroup',\n): Partial<SuiteModifiers<F, G>> {\n const value = modifiers[key];\n return value.size > 0 ? { [key]: Object.freeze([...value]) } : {};\n}\n\n/**\n * Emits schema failures into vest test tree.\n */\nfunction runSchemaValidation<S extends TSchema = undefined>(\n schema: S | undefined,\n schemaRunResult?: SchemaRunResult[],\n) {\n // eslint-disable-next-line complexity\n return () => {\n if (!shouldRunSchema(schema) || !schemaRunResult) {\n return;\n }\n\n for (let i = 0; i < schemaRunResult.length; i++) {\n const error = schemaRunResult[i];\n if (error.pass) {\n continue;\n }\n\n const fieldName = error.path?.length ? error.path.join('.') : '__root__';\n const testKey = `${fieldName}_${i}`;\n test(fieldName, error.message, () => false, testKey);\n }\n };\n}\n\n/**\n * Attempts to parse the schema. Returns null if parse fails gracefully,\n * so the caller can fall back to schema.run.\n */\nfunction tryParseSchema(\n executableSchema: any,\n data: unknown,\n): SchemaRunResult[] | null {\n if (!isFunction(executableSchema.parse)) return null;\n\n try {\n const parsedValue = executableSchema.parse(data);\n\n return shouldRunAfterParse(executableSchema)\n ? normalizeSchemaRunResult(executableSchema.run(parsedValue), parsedValue)\n : [{ pass: true, type: parsedValue }];\n } catch (error) {\n if (isExpectedSchemaParseError(error)) return null;\n throw error;\n }\n}\n\n/**\n * Runs schema parsing/validation in a safe order:\n * 1) try parse\n * 2) if parse succeeds, treat it as the authoritative validation output\n * 3) on expected parse validation failures, fallback to run(raw)\n */\nfunction runSchemaWithParse(\n schema: any,\n data: unknown,\n modifiers: { only?: unknown; skip?: unknown },\n): SchemaRunResult[] {\n const executableSchema = applySchemaFocus(schema, modifiers);\n\n const parseResult = tryParseSchema(executableSchema, data);\n if (parseResult) {\n return parseResult;\n }\n\n if (isFunction(executableSchema.run)) {\n return normalizeSchemaRunResult(executableSchema.run(data), data);\n }\n\n return [\n {\n pass: true,\n type: data,\n },\n ];\n}\n\nconst N4S_VENDOR = 'n4s';\n\nfunction isN4sSchema(schema: any): boolean {\n return schema?.['~standard']?.vendor === N4S_VENDOR && !!schema?.__schema;\n}\n\nfunction applySchemaFocus(\n schema: any,\n modifiers: { only?: unknown; skip?: unknown },\n): any {\n if (!isN4sSchema(schema)) {\n return schema;\n }\n\n const only = buildArrayProp(modifiers.only);\n const skip = buildArrayProp(modifiers.skip);\n\n return buildFocusedSchemaInstance(schema, only, skip);\n}\n\nfunction buildArrayProp(prop: unknown): string[] | null {\n if (!prop) return null;\n const arr = asArray(prop) as string[];\n return arr.length > 0 ? arr : null;\n}\n\nfunction buildIntersectedSchemaInstance(\n schema: any,\n only: string[],\n skip: string[],\n): any {\n const skipSet = new Set(skip);\n return enforce.pick(\n schema.__schema,\n only.filter(f => !skipSet.has(f)),\n );\n}\n\nfunction buildFocusedSchemaInstance(\n schema: any,\n only: string[] | null,\n skip: string[] | null,\n): any {\n if (only) {\n return skip\n ? buildIntersectedSchemaInstance(schema, only, skip)\n : enforce.pick(schema.__schema, only);\n }\n\n return skip ? enforce.omit(schema.__schema, skip) : schema;\n}\n\n/**\n * Converts unknown schema.run return value into a stable internal representation.\n */\nfunction normalizeSchemaRunResult(\n candidate: unknown,\n fallbackType: unknown,\n): SchemaRunResult[] {\n if (isArray(candidate)) {\n return candidate.map(entry =>\n normalizeSingleSchemaRunResult(entry, fallbackType),\n );\n }\n\n return [normalizeSingleSchemaRunResult(candidate, fallbackType)];\n}\n\n/**\n * Converts a single unknown run payload into a safe result shape.\n */\nfunction normalizeSingleSchemaRunResult(\n candidate: unknown,\n fallbackType: unknown,\n): SchemaRunResult {\n if (!isSchemaRunResult(candidate)) {\n return {\n pass: false,\n type: fallbackType,\n };\n }\n\n return {\n message: candidate.message,\n pass: candidate.pass,\n path: candidate.path,\n type: candidate.type ?? fallbackType,\n };\n}\n\n/**\n * Runtime type guard for schema run payloads.\n */\nfunction isSchemaRunResult(candidate: unknown): candidate is SchemaRunResult {\n if (!isObject(candidate)) {\n return false;\n }\n\n const value = candidate as Partial<SchemaRunResult>;\n\n const hasPass = typeof value.pass === 'boolean';\n const hasPath =\n value.path === undefined ||\n (isArray(value.path) && value.path.every(item => typeof item === 'string'));\n\n return hasPass && hasPath;\n}\n\n/**\n * Detects parse errors that represent expected validation failures.\n */\nfunction isExpectedSchemaParseError(error: unknown): boolean {\n if (error instanceof TypeError) {\n return true;\n }\n\n if (!isObject(error)) {\n return false;\n }\n\n const typedError = error as { isValidation?: unknown; name?: unknown };\n return typedError.isValidation === true || typedError.name === 'TypeError';\n}\n\n/**\n * Determines whether schema.run should execute after a successful parse call.\n *\n * For n4s StandardSchema-backed rules, parse already performs full validation.\n * Re-running run(parsed) can break coercion chains where post-parse types differ\n * from pre-parse input expectations.\n */\nfunction shouldRunAfterParse(schema: any): boolean {\n if (!isFunction(schema.run)) {\n return false;\n }\n\n return schema?.['~standard']?.vendor !== N4S_VENDOR;\n}\n\nfunction shouldRunSchema(schema: unknown): boolean {\n return !!schema;\n}\n\nfunction bindSuiteResultMethods<\n F extends TFieldName,\n G extends TGroupName,\n S extends TSchema,\n>(\n promise: Promise<SuiteResult<F, G, S>>,\n suiteResult: SuiteResult<F, G, S>,\n runData: unknown,\n runTime: Date,\n): SuiteResult<F, G, S> {\n const result = assign(promise, suiteResult);\n\n Object.defineProperty(result, 'run', {\n configurable: true,\n enumerable: false,\n value: Object.freeze({\n data: Object.freeze({\n raw: runData,\n parsed: suiteResult.run.data.parsed,\n }),\n focus: suiteResult.run.focus,\n time: runTime,\n }),\n writable: true,\n });\n\n return result;\n}\n","import { CB, makeBrand, withCatch } from 'vest-utils';\nimport { VestRuntime } from 'vestjs-runtime';\n\nimport { useEmit, usePrepareEmitter, Subscribe } from '../core/VestBus/VestBus';\n\nimport { useLoadSuite } from '../core/Runtime';\nimport { TIsolateSuite } from '../core/isolate/IsolateSuite/IsolateSuite';\nimport {\n TFieldName,\n TGroupName,\n TSchema,\n InferSchemaData,\n} from '../suiteResult/SuiteResultTypes';\nimport { bindSuiteSelectors } from '../suiteResult/selectors/suiteSelectors';\nimport { useCreateSuiteResult } from '../suiteResult/suiteResult';\n\nimport { SuiteModifiers, SuiteCallbackWithSchema } from './SuiteTypes';\nimport { useDeferDoneCallback } from './after/deferDoneCallback';\nimport { createSuite } from './createSuite';\nimport { getStandardSchema } from './getStandardSchema';\nimport { getTypedMethods } from './getTypedMethods';\nimport { useCreateSuiteRunner } from './useCreateSuiteRunner';\n\n/**\n * Creates the methods available on the Suite object (e.g., run, get, reset).\n *\n * @param {Function} suiteCallback - The body of the suite.\n * @param {Object} modifiers - The modifiers for the suite (e.g., only).\n * @param {Function} subscribe - The subscribe function for the suite bus.\n * @returns {Object} - The suite methods.\n */\nexport function useCreateSuiteMethods<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(\n suiteCallback: SuiteCallbackWithSchema<S, T>,\n modifiers: SuiteModifiers<F, G>,\n subscribe: Subscribe,\n schema?: S,\n) {\n const persistedRun = VestRuntime.persist(\n useCreateSuiteRunner<F, G, T, S>(suiteCallback, modifiers, schema),\n );\n const staticRunner = VestRuntime.persist(\n createStaticRunner<F, G, T, S>(suiteCallback, schema),\n );\n\n return useCreateSuiteMethodsHelper({\n modifiers,\n persistedRun,\n schema,\n staticRunner,\n subscribe,\n suiteCallback,\n });\n}\n\nfunction useCreateSuiteMethodsHelper<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(ctx: {\n suiteCallback: SuiteCallbackWithSchema<S, T>;\n modifiers: SuiteModifiers<F, G>;\n subscribe: Subscribe;\n schema?: S;\n persistedRun: any;\n staticRunner: any;\n}): ReturnType<typeof useGetSuiteMethods<F, G, T, S>> & {\n '~standard': ReturnType<typeof getStandardSchema<S>>;\n} {\n const suiteMethods = useGetSuiteMethods<F, G, T, S>(ctx);\n\n return {\n ...suiteMethods,\n '~standard': getStandardSchema<S>(ctx.staticRunner),\n };\n}\n\nfunction useGetSuiteMethods<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(ctx: {\n suiteCallback: SuiteCallbackWithSchema<S, T>;\n modifiers: SuiteModifiers<F, G>;\n subscribe: Subscribe;\n schema?: S;\n persistedRun: any;\n staticRunner: any;\n}): any {\n const { suiteCallback, modifiers, subscribe, schema } = ctx;\n\n const get = VestRuntime.persist(() => useCreateSuiteResult<F, G, S>(schema));\n return {\n ...useGetLifecycleMethods(ctx),\n dump: VestRuntime.persist(VestRuntime.useAvailableRoot<TIsolateSuite>),\n get,\n ...bindSuiteSelectors<F, G, S>(get),\n ...getTypedMethods<F, G>(),\n // focus and only must come after the spreads to prevent spread keys from overriding them\n focus: VestRuntime.persist(\n useCreateFocus<F, G, T, S>(suiteCallback, modifiers, subscribe, schema),\n ),\n only: VestRuntime.persist(\n useCreateOnly<F, G, T, S>(suiteCallback, modifiers, subscribe, schema),\n ),\n };\n}\n\nfunction useGetLifecycleMethods<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(ctx: {\n suiteCallback: SuiteCallbackWithSchema<S, T>;\n modifiers: SuiteModifiers<F, G>;\n subscribe: Subscribe;\n schema?: S;\n persistedRun: any;\n staticRunner: any;\n}) {\n const { persistedRun, staticRunner, subscribe } = ctx;\n\n return {\n afterEach: VestRuntime.persist((cb: CB) =>\n useAddAfterHelper<F, G, T, S>(ctx, cb),\n ),\n afterField: VestRuntime.persist((fieldName: F | string, cb: CB) =>\n useAddAfterHelper<F, G, T, S>(\n ctx,\n cb,\n makeBrand<TFieldName>(fieldName) as F,\n ),\n ),\n remove: VestRuntime.persist((fieldName: F | string) =>\n useEmit('REMOVE_FIELD', makeBrand<TFieldName>(fieldName)),\n ),\n reset: VestRuntime.persist(usePrepareEmitter('RESET_SUITE')),\n resetField: VestRuntime.persist((fieldName: F | string) =>\n useEmit('RESET_FIELD', makeBrand<TFieldName>(fieldName)),\n ),\n resume: VestRuntime.persist(useLoadSuite),\n run: persistedRun,\n runStatic: staticRunner,\n subscribe,\n validate: createValidate<T, S>(staticRunner),\n };\n}\n\nfunction useAddAfterHelper<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(\n ctx: {\n suiteCallback: SuiteCallbackWithSchema<S, T>;\n modifiers: SuiteModifiers<F, G>;\n subscribe: Subscribe;\n schema?: S;\n persistedRun: any;\n staticRunner: any;\n },\n cb: CB,\n fieldName?: F,\n): any {\n useDeferDoneCallback(withCatch(cb), fieldName);\n return useCreateSuiteMethodsHelper(ctx);\n}\n\n/**\n * Binds the lifecycle methods to the suite methods.\n * e.g. after, afterField, run...\n *\n * @param {Object} methods - The suite methods.\n * @returns {Object} - The suite methods with lifecycle methods bound.\n */\nexport function useBindSuiteLifecycle<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(\n methods: ReturnType<typeof useCreateSuiteMethods<F, G, T, S>>,\n): ReturnType<typeof useCreateSuiteMethods<F, G, T, S>> {\n return {\n ...methods,\n afterEach: VestRuntime.persist(useInitCallback(methods.afterEach)),\n afterField: VestRuntime.persist(useInitCallback(methods.afterField)),\n run: VestRuntime.persist(useInitCallback(methods.run)),\n };\n}\n\n/**\n * Creates a focus function that can be used to create a focused suite.\n *\n * @param {Function} suiteCallback - The body of the suite.\n * @param {Object} modifiers - The modifiers for the suite (e.g., only).\n * @param {Function} subscribe - The subscribe function for the suite bus.\n * @param {Object} schema - The optional schema for the suite.\n * @returns {Function} - The focus function.\n */\nfunction useCreateFocus<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(\n suiteCallback: SuiteCallbackWithSchema<S, T>,\n modifiers: SuiteModifiers<F, G>,\n subscribe: Subscribe,\n schema?: S,\n) {\n return function focus(config: SuiteModifiers<F, G>) {\n return useCreateSuiteMethods<F, G, T, S>(\n suiteCallback,\n { ...modifiers, ...config },\n subscribe,\n schema,\n );\n };\n}\n\n/**\n * Creates an only function that can be used to create a focused suite on a specific field.\n * This is a shorthand for suite.focus({ only: 'fieldName' }).\n *\n * @param {Function} suiteCallback - The body of the suite.\n * @param {Object} modifiers - The modifiers for the suite (e.g., only).\n * @param {Function} subscribe - The subscribe function for the suite bus.\n * @param {Object} schema - The optional schema for the suite.\n * @returns {Function} - The only function.\n */\nfunction useCreateOnly<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(\n suiteCallback: SuiteCallbackWithSchema<S, T>,\n modifiers: SuiteModifiers<F, G>,\n subscribe: Subscribe,\n schema?: S,\n) {\n const focus = useCreateFocus<F, G, T, S>(\n suiteCallback,\n modifiers,\n subscribe,\n schema,\n );\n return function only(onlyField: NonNullable<SuiteModifiers<F, G>['only']>) {\n return focus({ only: onlyField });\n };\n}\n\n/**\n * Creates a static runner for the suite.\n *\n * @param {Function} suiteCallback - The body of the suite.\n * @param {Object} schema - The optional schema for the suite.\n * @returns {Function} - The static runner.\n */\nfunction createStaticRunner<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(suiteCallback: SuiteCallbackWithSchema<S, T>, schema?: S) {\n return function runStatic(\n ...runArgs: S extends undefined\n ? Parameters<T>\n : [data: InferSchemaData<S>, ...args: any[]]\n ) {\n const suite = createSuite<F, G, T, S>(suiteCallback, schema);\n return suite.run(...(runArgs as Parameters<typeof suite.run>));\n };\n}\n\n/**\n * Wraps a callback to emit the 'INITIALIZING_CALLBACKS' event before execution.\n * This is used to ensure that any previous callbacks are cleared or handled correctly\n * before the new one runs.\n *\n * @param {Function} cb - The callback to wrap.\n * @returns {Function} - The wrapped callback.\n */\nfunction useInitCallback<U extends (...args: any[]) => any>(cb: U): U {\n return ((...args: Parameters<U>) => {\n useEmit('INITIALIZING_CALLBACKS');\n return cb(...args);\n }) as U;\n}\n\nfunction createValidate<T extends CB = CB, S extends TSchema = undefined>(\n staticRunner: any,\n) {\n return (\n ...args: S extends undefined\n ? [value: Parameters<T>[0]]\n : [data: InferSchemaData<S>, ...args: any[]]\n ) => (staticRunner as (...args: any[]) => any)(...args);\n}\n","import { CB, isFunction, makeResult, Result } from 'vest-utils';\n\nimport { ErrorStrings } from '../../errors/ErrorStrings';\n\nexport function validateSuiteCallback<T extends CB>(\n suiteCallback: T,\n): Result<T, string> {\n if (!isFunction(suiteCallback)) {\n return makeResult.Err(ErrorStrings.SUITE_MUST_BE_INITIALIZED_WITH_FUNCTION);\n }\n\n return makeResult.Ok(suiteCallback);\n}\n","import { CB, makeResult, Result } from 'vest-utils';\nimport { VestRuntime } from 'vestjs-runtime';\n\nimport { useCreateVestState } from '../core/Runtime';\nimport { useInitVestBus } from '../core/VestBus/VestBus';\nimport { VestReconciler } from '../core/isolate/VestReconciler';\nimport {\n InferSchemaOutput,\n TFieldName,\n TGroupName,\n TSchema,\n} from '../suiteResult/SuiteResultTypes';\n\nimport { Suite, SuiteCallbackWithSchema } from './SuiteTypes';\nimport {\n useBindSuiteLifecycle,\n useCreateSuiteMethods,\n} from './useCreateSuiteMethods';\nimport { validateSuiteCallback } from './validateSuiteCallback/validateSuiteCallback';\n\nexport type SuiteConfig = {\n fields: string;\n groups?: string;\n};\n\n// @vx-allow use-use\nfunction createSuite<_Escape>(\n suiteCallback: [_Escape] extends [null] ? CB : never,\n schema?: any,\n): [_Escape] extends [null] ? Suite<TFieldName, TGroupName, CB, any> : never;\n// @vx-allow use-use\nfunction createSuite<\n C extends SuiteConfig,\n Data = any,\n T extends (data: Data, ...args: any[]) => void = (\n data: Data,\n ...args: any[]\n ) => void,\n>(\n suiteCallback: T,\n schema?: undefined,\n): Suite<\n C['fields'],\n C['groups'] extends string ? C['groups'] : string,\n T,\n undefined\n>;\n// @vx-allow use-use\nfunction createSuite<\n S extends TSchema,\n T extends (data: InferSchemaOutput<S>, ...args: any[]) => void = (\n data: InferSchemaOutput<S>,\n ...args: any[]\n ) => void,\n>(\n suiteCallback: T,\n schema: S,\n): Suite<Extract<keyof InferSchemaOutput<S>, string>, TGroupName, T, S>;\n// @vx-allow use-use\nfunction createSuite<\n F extends TFieldName = TFieldName,\n G extends TGroupName = TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(suiteCallback: SuiteCallbackWithSchema<S, T>, schema?: S): Suite<F, G, T, S>;\n// @vx-allow use-use\nfunction createSuite<\n F extends TFieldName = TFieldName,\n G extends TGroupName = TGroupName,\n T extends CB = CB,\n S extends TSchema = undefined,\n>(suiteCallback: T, schema?: S): Suite<F, G, T, S> {\n const suiteCallbackResult = validateSuiteCallback(suiteCallback).unwrap();\n\n const stateRef = useCreateVestState({ VestReconciler });\n\n return VestRuntime.Run(stateRef, () => {\n const VestBus = useInitVestBus();\n\n return createSuiteInstance().unwrap();\n\n function createSuiteInstance(): Result<Suite<F, G, T, S>> {\n const methods = useCreateSuiteMethods<F, G, T, S>(\n suiteCallbackResult as SuiteCallbackWithSchema<S, T>,\n {},\n VestBus.subscribe,\n schema,\n );\n\n return makeResult.Ok(useBindSuiteLifecycle(methods));\n }\n });\n}\n\nexport { createSuite };\n"],"mappings":"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"}