UNPKG

@hookflo/tern

Version:

A robust, scalable webhook verification framework supporting multiple platforms and signature algorithms

57 lines (56 loc) 2.29 kB
"use strict"; 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;