import { assign } from 'vest-utils'; import { StandardSchemaV1 } from 'vest-utils/standardSchemaSpec'; import { VestRuntime } from 'vestjs-runtime'; import { useSuiteResultCache } from '../core/Runtime'; import { TIsolateSuite } from '../core/isolate/IsolateSuite/IsolateSuite'; import { SuiteModifiers } from '../suite/SuiteTypes'; import { Severity } from './Severity'; import { SuiteResult, SuiteSummary, TFieldName, TGroupName, TSchema, InferSchemaOutput, } from './SuiteResultTypes'; import { suiteSelectors } from './selectors/suiteSelectors'; import { useProduceSuiteSummary } from './selectors/useProduceSuiteSummary'; export function useCreateSuiteResult< F extends TFieldName, G extends TGroupName, S extends TSchema = undefined, D = unknown, >( schema?: S, outputData?: any, inputData?: D, runTime: Date = new Date(), parsedData?: Partial>, focus?: SuiteModifiers, ): SuiteResult { return useSuiteResultCache(() => { // @vx-allow use-use const summary = useProduceSuiteSummary(); summary.run = { data: { raw: inputData, parsed: parsedData, }, focus, time: runTime, }; const resultBody = constructSuiteResultObject( summary, outputData, ); const result = assign(resultBody as SuiteResult, { dump: VestRuntime.persist(VestRuntime.useAvailableRoot), types: (schema ? { input: inputData, output: outputData } : undefined) as SuiteResult['types'], }) as SuiteResult; const runMeta = Object.freeze({ ...summary.run }); Object.defineProperty(result, 'run', { configurable: true, enumerable: false, value: runMeta, writable: true, }); return Object.freeze(result); }); } export function constructSuiteResultObject< F extends TFieldName, G extends TGroupName, S extends TSchema = undefined, D = unknown, >( summary: SuiteSummary, outputData?: any, ): Omit, 'dump' | 'types'> { const { valid, ...summaryWithoutValid } = summary; const selectors = suiteSelectors(summary); const common = assign(summaryWithoutValid, selectors); if (valid === true) { return { ...common, valid: true, value: outputData, }; } else if (valid === false) { const issues = summary[Severity.ERRORS].reduce((acc, failure) => { if (failure.message) { acc.push({ message: failure.message, path: [failure.fieldName], }); } return acc; }, [] as StandardSchemaV1.Issue[]); return { ...common, valid: false, issues, }; } // valid is null return { ...common, valid: null as null, }; }