Add VISA backend foundation

This commit is contained in:
jerryW123
2026-06-24 22:45:34 +08:00
parent f51f64f3bd
commit e1df743eb2
17 changed files with 1999 additions and 3 deletions
+80
View File
@@ -0,0 +1,80 @@
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,
};
},
};
}