@friggframework/schemas
Version:
Canonical JSON Schema definitions for Frigg Framework
173 lines (151 loc) • 4.88 kB
JavaScript
/**
* @friggframework/schemas - Canonical JSON Schema definitions for Frigg Framework
*
* This package provides formal JSON Schema definitions for all core Frigg configuration
* objects, along with runtime validation utilities.
*/
const Ajv = require('ajv');
const addFormats = require('ajv-formats');
const fs = require('fs');
const path = require('path');
// Initialize AJV with formats
const ajv = new Ajv({
allErrors: true,
verbose: true,
strict: false
});
addFormats(ajv);
// Load all schemas
const schemas = {};
const schemaDir = path.join(__dirname, 'schemas');
// Load schema files
const schemaFiles = [
'app-definition.schema.json',
'integration-definition.schema.json',
'api-module-definition.schema.json',
'serverless-config.schema.json',
'environment-config.schema.json',
'core-models.schema.json'
];
schemaFiles.forEach(file => {
const schemaPath = path.join(schemaDir, file);
const schemaContent = JSON.parse(fs.readFileSync(schemaPath, 'utf8'));
const schemaName = file.replace('.schema.json', '');
schemas[schemaName] = schemaContent;
ajv.addSchema(schemaContent, schemaName);
});
/**
* Validate an object against a schema
* @param {string} schemaName - Name of the schema to validate against
* @param {object} data - Data to validate
* @returns {object} - Validation result with { valid: boolean, errors?: array }
*/
function validate(schemaName, data) {
const validator = ajv.getSchema(schemaName);
if (!validator) {
throw new Error(`Schema '${schemaName}' not found. Available schemas: ${Object.keys(schemas).join(', ')}`);
}
const valid = validator(data);
return {
valid,
errors: valid ? null : validator.errors,
data
};
}
/**
* Validate App Definition
* @param {object} appDefinition - App definition object to validate
* @returns {object} - Validation result
*/
function validateAppDefinition(appDefinition) {
return validate('app-definition', appDefinition);
}
/**
* Validate Integration Definition
* @param {object} integrationDefinition - Integration definition object to validate
* @returns {object} - Validation result
*/
function validateIntegrationDefinition(integrationDefinition) {
return validate('integration-definition', integrationDefinition);
}
/**
* Validate API Module Definition
* @param {object} apiModuleDefinition - API module definition object to validate
* @returns {object} - Validation result
*/
function validateApiModuleDefinition(apiModuleDefinition) {
return validate('api-module-definition', apiModuleDefinition);
}
/**
* Validate Serverless Configuration
* @param {object} serverlessConfig - Serverless configuration object to validate
* @returns {object} - Validation result
*/
function validateServerlessConfig(serverlessConfig) {
return validate('serverless-config', serverlessConfig);
}
/**
* Validate Environment Configuration
* @param {object} environmentConfig - Environment configuration object to validate
* @returns {object} - Validation result
*/
function validateEnvironmentConfig(environmentConfig) {
return validate('environment-config', environmentConfig);
}
/**
* Validate Core Models
* @param {object} coreModels - Core models object to validate
* @returns {object} - Validation result
*/
function validateCoreModels(coreModels) {
return validate('core-models', coreModels);
}
/**
* Get all available schemas
* @returns {object} - Object containing all loaded schemas
*/
function getSchemas() {
return { ...schemas };
}
/**
* Get a specific schema by name
* @param {string} schemaName - Name of the schema to retrieve
* @returns {object} - Schema object
*/
function getSchema(schemaName) {
if (!schemas[schemaName]) {
throw new Error(`Schema '${schemaName}' not found. Available schemas: ${Object.keys(schemas).join(', ')}`);
}
return schemas[schemaName];
}
/**
* Format validation errors for human-readable output
* @param {array} errors - AJV validation errors
* @returns {string} - Formatted error message
*/
function formatErrors(errors) {
if (!errors || errors.length === 0) {
return 'No errors';
}
return errors.map(error => {
const instancePath = error.instancePath || 'root';
const message = error.message;
const allowedValues = error.params?.allowedValues ?
` (allowed: ${error.params.allowedValues.join(', ')})` : '';
return `${instancePath}: ${message}${allowedValues}`;
}).join('\n');
}
module.exports = {
validate,
validateAppDefinition,
validateIntegrationDefinition,
validateApiModuleDefinition,
validateServerlessConfig,
validateEnvironmentConfig,
validateCoreModels,
getSchemas,
getSchema,
formatErrors,
schemas,
ajv
};