@accounter/shaam-uniform-format-generator
Version:
Fully typed application that generates, parses, and validates SHAAM uniform format tax reports (INI.TXT and BKMVDATA.TXT).
69 lines (59 loc) • 1.85 kB
text/typescript
/**
* Input validation utilities
*/
import { ZodError } from 'zod';
import type { ReportInput, ValidationError } from '../types/index.js';
import { ReportInputSchema } from '../types/index.js';
import { ShaamFormatError } from './errors.js';
/**
* Converts Zod errors to ValidationError format
*/
function convertZodErrorsToValidationErrors(zodError: ZodError): ValidationError[] {
return zodError.issues.map((issue, index) => ({
recordType: 'input',
recordIndex: index,
field: issue.path.join('.') || 'unknown',
message: issue.message,
value: issue.input,
}));
}
/**
* Validates report input data against the schema
*
* @param input - The input data to validate
* @param mode - Validation mode ('fail-fast' or 'collect-all')
* @returns Array of validation errors (empty if valid)
*/
export function validateInput(
input: ReportInput,
mode: 'fail-fast' | 'collect-all' = 'fail-fast',
): ValidationError[] {
const errors: ValidationError[] = [];
try {
ReportInputSchema.parse(input);
} catch (error) {
if (error instanceof ZodError) {
const validationErrors = convertZodErrorsToValidationErrors(error);
if (mode === 'fail-fast') {
throw new ShaamFormatError(
`Validation failed: ${validationErrors[0]?.message || 'Unknown error'}`,
validationErrors,
);
}
errors.push(...validationErrors);
} else {
// Handle non-Zod errors
const unknownError: ValidationError = {
recordType: 'unknown',
recordIndex: 0,
field: 'unknown',
message: error instanceof Error ? error.message : 'Unknown validation error',
};
if (mode === 'fail-fast') {
throw new ShaamFormatError('Validation failed', [unknownError]);
}
errors.push(unknownError);
}
}
return errors;
}