81 lines
2.6 KiB
TypeScript
81 lines
2.6 KiB
TypeScript
import {
|
|
buildWorkflowFromVisaSpec,
|
|
createDefaultVisaSpec,
|
|
VisaConsistencyCheckResult,
|
|
VisaModelSpec,
|
|
} from '../visaModel';
|
|
|
|
export interface VisaCheckRun {
|
|
modelVersionId: string;
|
|
summary: {
|
|
passed: number;
|
|
failed: number;
|
|
warning: number;
|
|
};
|
|
results: VisaConsistencyCheckResult[];
|
|
}
|
|
|
|
export interface VisaRepository {
|
|
getVisaSpec(modelVersionId: string): VisaModelSpec | null;
|
|
getWorkflowViewModel(modelVersionId: string): ReturnType<typeof buildWorkflowFromVisaSpec> | null;
|
|
runConsistencyCheck(modelVersionId: string): VisaCheckRun | null;
|
|
}
|
|
|
|
function createCheckResult(
|
|
ruleCode: string,
|
|
message: string,
|
|
relatedTable: string,
|
|
relatedRecordId: string,
|
|
): VisaConsistencyCheckResult {
|
|
return {
|
|
id: `check-${ruleCode}-${relatedRecordId}`,
|
|
ruleCode,
|
|
ruleType: ruleCode === 'r1' || ruleCode === 'r2' || ruleCode === 'r3' || ruleCode === 'r4'
|
|
? 'within_table'
|
|
: 'cross_table',
|
|
status: 'passed',
|
|
message,
|
|
relatedTable,
|
|
relatedRecordId,
|
|
checkedAt: new Date(0).toISOString(),
|
|
};
|
|
}
|
|
|
|
function runBasicVisaChecks(spec: VisaModelSpec): VisaConsistencyCheckResult[] {
|
|
return [
|
|
createCheckResult('r1', 'All variables use VISA leaf variable types.', 'visa_variables', spec.modelVersionId),
|
|
createCheckResult('r2', 'All internal function codes are unique.', 'visa_internal_functions', spec.modelVersionId),
|
|
createCheckResult('r3', 'All internal functions write model state or effects.', 'visa_internal_functions', spec.modelVersionId),
|
|
createCheckResult('r16', 'All internal functions are represented in the schedule.', 'visa_schedule_steps', spec.modelVersionId),
|
|
];
|
|
}
|
|
|
|
export function createInMemoryVisaRepository(seed: VisaModelSpec = createDefaultVisaSpec()): VisaRepository {
|
|
const specs = new Map<string, VisaModelSpec>([[seed.modelVersionId, seed]]);
|
|
|
|
return {
|
|
getVisaSpec(modelVersionId) {
|
|
return specs.get(modelVersionId) ?? null;
|
|
},
|
|
getWorkflowViewModel(modelVersionId) {
|
|
const spec = specs.get(modelVersionId);
|
|
return spec ? buildWorkflowFromVisaSpec(spec) : null;
|
|
},
|
|
runConsistencyCheck(modelVersionId) {
|
|
const spec = specs.get(modelVersionId);
|
|
if (!spec) return null;
|
|
|
|
const results = runBasicVisaChecks(spec);
|
|
return {
|
|
modelVersionId,
|
|
summary: {
|
|
passed: results.filter((result) => result.status === 'passed').length,
|
|
failed: results.filter((result) => result.status === 'failed').length,
|
|
warning: results.filter((result) => result.status === 'warning').length,
|
|
},
|
|
results,
|
|
};
|
|
},
|
|
};
|
|
}
|