Files
metabuilder/packages/package_validator/seed/scripts/validate_package.lua
2025-12-31 00:19:04 +00:00

144 lines
4.8 KiB
Lua

local validate_metadata = require("validate_metadata")
local validate_components = require("validate_components")
local validate_package_structure = require("validate_package_structure")
local validate_script_exports = require("validate_script_exports")
local validate_styles = require("validate_styles")
local format_results = require("format_results")
--- Validates a complete package
---@param package_path string Path to the package
---@param options? ValidationOptions Validation options
---@return ValidationResult results Validation results
local function validate_package(package_path, options)
options = options or {}
local results = {
valid = true,
errors = {},
warnings = {}
}
-- Load and validate metadata.json
local metadata_path = package_path .. "/metadata.json"
local metadata_file = io.open(metadata_path, "r")
if not metadata_file then
table.insert(results.errors, "Failed to load metadata.json")
results.valid = false
return results
end
local metadata_content = metadata_file:read("*a")
metadata_file:close()
-- Parse JSON (using global parse_json if available)
local metadata = parse_json and parse_json(metadata_content) or nil
if not metadata then
table.insert(results.errors, "Failed to parse metadata.json")
results.valid = false
return results
end
-- 1. Validate metadata schema
local metadata_valid, metadata_errors = validate_metadata(metadata)
if not metadata_valid then
for _, err in ipairs(metadata_errors) do
table.insert(results.errors, "metadata.json: " .. err)
end
results.valid = false
end
-- 2. Validate components.json
local components_path = package_path .. "/components.json"
local components_file = io.open(components_path, "r")
if components_file then
local components_content = components_file:read("*a")
components_file:close()
local components = parse_json and parse_json(components_content) or nil
if components then
local components_valid, component_errors = validate_components(components)
if not components_valid then
for _, err in ipairs(component_errors) do
table.insert(results.errors, "components.json: " .. err)
end
results.valid = false
end
else
table.insert(results.errors, "Failed to parse components.json")
results.valid = false
end
else
table.insert(results.warnings, "components.json not found (optional)")
end
-- 3. Validate folder structure
if not options.skipStructure then
local structure_results = validate_package_structure(package_path, metadata)
if not structure_results.valid then
results.valid = false
end
for _, err in ipairs(structure_results.errors) do
table.insert(results.errors, "Structure: " .. err)
end
for _, warn in ipairs(structure_results.warnings) do
table.insert(results.warnings, "Structure: " .. warn)
end
end
-- 4. Validate Lua script exports
if not options.skipLua and metadata.exports and metadata.exports.scripts then
local script_errors, script_warnings = validate_script_exports(package_path, metadata)
for _, err in ipairs(script_errors) do
table.insert(results.errors, "Lua: " .. err)
results.valid = false
end
for _, warn in ipairs(script_warnings) do
table.insert(results.warnings, "Lua: " .. warn)
end
end
-- 5. Validate styles.json (optional)
if not options.skipStyles then
local styles_result = validate_styles(package_path)
if not styles_result.success then
results.valid = false
end
for _, msg in ipairs(styles_result.messages or {}) do
if styles_result.success then
table.insert(results.warnings, "Styles: " .. msg)
else
table.insert(results.errors, "Styles: " .. msg)
end
end
for _, warn in ipairs(styles_result.warnings or {}) do
table.insert(results.warnings, "Styles: " .. warn)
end
end
return results
end
--- Validates just metadata
---@param metadata Metadata Metadata to validate
---@return boolean valid Whether metadata is valid
---@return string[] errors List of errors
local function validate_metadata_only(metadata)
return validate_metadata(metadata)
end
--- Validates just components
---@param components Component[] Components to validate
---@return boolean valid Whether components are valid
---@return string[] errors List of errors
local function validate_components_only(components)
return validate_components(components)
end
-- Return module with all functions
return {
validate_package = validate_package,
validate_metadata_only = validate_metadata_only,
validate_components_only = validate_components_only,
format_results = format_results
}