@hookflo/tern
Version:
A robust, scalable webhook verification framework supporting multiple platforms and signature algorithms
57 lines (56 loc) • 2.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SchemaValidator = void 0;
class SchemaValidator {
validateSchema(userSchema, baseTemplate) {
const errors = [];
// Ensure required base fields exist and are enabled or have defaults
for (const baseField of baseTemplate.fields) {
if (!baseField.required)
continue;
const userField = userSchema.fields.find((f) => f.id === baseField.id);
if (!userField) {
errors.push(`Missing required field in schema: ${baseField.id}`);
continue;
}
if (!userField.enabled && baseField.defaultValue === undefined) {
errors.push(`Required field disabled without default: ${baseField.id}`);
}
if (userField.type !== baseField.type) {
errors.push(`Type mismatch for field ${baseField.id}: expected ${baseField.type}, got ${userField.type}`);
}
}
return { valid: errors.length === 0, errors };
}
validateOutput(output, userSchema, baseTemplate) {
const errors = [];
for (const field of userSchema.fields) {
if (!field.enabled)
continue;
const value = output[field.name];
if (value === undefined) {
if (field.required)
errors.push(`Missing required field in output: ${field.name}`);
continue;
}
if (!this.matchesType(value, field.type)) {
errors.push(`Type mismatch for output field ${field.name}`);
}
}
return { valid: errors.length === 0, errors };
}
matchesType(value, type) {
if (type === 'number')
return typeof value === 'number' && !Number.isNaN(value);
if (type === 'string')
return typeof value === 'string';
if (type === 'boolean')
return typeof value === 'boolean';
if (type === 'object')
return typeof value === 'object' && value !== null && !Array.isArray(value);
if (type === 'array')
return Array.isArray(value);
return true;
}
}
exports.SchemaValidator = SchemaValidator;