@vooodooo/magic
Version:
Vooodooo - AI orchestration platform
159 lines • 6.06 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PluginValidator = void 0;
exports.createPluginValidator = createPluginValidator;
const semver_1 = __importDefault(require("semver"));
/**
* System for validating Vooodooo plugins
*/
class PluginValidator {
constructor(options) {
this.rules = [];
this.options = {
// Default options
strict: false,
// Override with user-provided options
...options,
};
// Set up default validation rules
this.setupDefaultRules();
// Add custom rules if provided
if (options.customRules) {
this.rules.push(...options.customRules);
}
}
/**
* Validate a plugin
*/
validatePlugin(plugin) {
const errors = [];
const warnings = [];
// Run all validation rules
for (const rule of this.rules) {
const result = rule.validate(plugin);
if (!result.valid) {
errors.push(result.error || `Failed validation rule: ${rule.name}`);
}
else if (result.warning) {
warnings.push(result.warning);
}
}
return {
valid: errors.length === 0,
pluginId: plugin.id,
errors,
warnings,
};
}
/**
* Set up default validation rules
*/
setupDefaultRules() {
// Rule 1: Plugin must have a valid manifest
this.rules.push({
name: 'valid-manifest',
description: 'Plugin must have a valid manifest',
validate: (plugin) => {
if (!plugin.manifest) {
return { valid: false, error: 'Plugin manifest is missing' };
}
// Check required fields
const requiredFields = ['id', 'name', 'version', 'description'];
const missingFields = requiredFields.filter((field) => !plugin.manifest[field]);
if (missingFields.length > 0) {
return {
valid: false,
error: `Plugin manifest is missing required fields: ${missingFields.join(', ')}`,
};
}
return { valid: true };
},
});
// Rule 2: Plugin version must be valid
this.rules.push({
name: 'valid-version',
description: 'Plugin must have a valid version',
validate: (plugin) => {
const version = plugin.manifest.version;
if (!version) {
return { valid: false, error: 'Plugin version is missing' };
}
if (!semver_1.default.valid(version)) {
return {
valid: false,
error: `Plugin version "${version}" is not a valid semantic version`,
};
}
return { valid: true };
},
});
// Rule 3: Plugin must be compatible with current platform version
this.rules.push({
name: 'platform-compatibility',
description: 'Plugin must be compatible with current platform version',
validate: (plugin) => {
const minPlatformVersion = plugin.manifest.minPlatformVersion;
if (!minPlatformVersion) {
return {
valid: !this.options.strict,
error: 'Plugin does not specify a minimum platform version',
warning: 'Plugin does not specify a minimum platform version',
};
}
if (!semver_1.default.valid(minPlatformVersion)) {
return {
valid: false,
error: `Plugin minimum platform version "${minPlatformVersion}" is not a valid semantic version`,
};
}
if (semver_1.default.gt(minPlatformVersion, this.options.platformVersion)) {
return {
valid: false,
error: `Plugin requires platform version ${minPlatformVersion} but current version is ${this.options.platformVersion}`,
};
}
return { valid: true };
},
});
// Rule 4: Plugin main file must exist
this.rules.push({
name: 'main-file-exists',
description: 'Plugin main file must exist',
validate: (plugin) => {
// This check is already done in the loader, so we assume it's valid
return { valid: true };
},
});
// Rule 5: Plugin dependencies must be valid
this.rules.push({
name: 'valid-dependencies',
description: 'Plugin dependencies must be valid',
validate: (plugin) => {
const dependencies = plugin.manifest.dependencies;
if (!dependencies) {
return { valid: true };
}
if (typeof dependencies !== 'object') {
return {
valid: false,
error: 'Plugin dependencies must be an object',
};
}
// Further dependency validation would require checking if dependencies are installed
// This is typically done by the plugin manager during loading
return { valid: true };
},
});
}
}
exports.PluginValidator = PluginValidator;
/**
* Create a plugin validator instance
*/
function createPluginValidator(options) {
return new PluginValidator(options);
}
//# sourceMappingURL=plugin-validator.js.map