diff --git a/cli/theme_vars_check.php b/cli/theme_vars_check.php index 428b448..8f14cc0 100644 --- a/cli/theme_vars_check.php +++ b/cli/theme_vars_check.php @@ -137,6 +137,45 @@ if (is_file($manifest)) { isset($xml->dlid) ? $ok(' license-key field present') : $fail(' is missing'); + + // Required manifest fields + foreach (['name', 'element', 'author', 'creationDate'] as $field) { + (isset($xml->$field) && trim((string) $xml->$field) !== '') + ? $ok("<$field> present") + : $fail("<$field> is missing or empty"); + } + + // scriptfile (if declared) must exist + if (isset($xml->scriptfile)) { + $sf = trim((string) $xml->scriptfile); + is_file("$src/$sf") ? $ok("scriptfile '$sf' present") + : $fail(" references '$sf' which is not in src/"); + } + + // Fileset integrity — every referenced file/folder must exist in src/ + if (isset($xml->fileset)) { + $missingFs = []; + foreach ($xml->fileset->files as $files) { + $folder = trim((string) ($files['folder'] ?? '')); + $baseDir = $folder !== '' ? "$src/$folder" : $src; + foreach ($files->filename as $fn) { + $rel = ($folder !== '' ? "$folder/" : '') . trim((string) $fn); + if (!is_file("$baseDir/" . trim((string) $fn))) { $missingFs[] = $rel; } + } + foreach ($files->folder as $fd) { + $rel = ($folder !== '' ? "$folder/" : '') . trim((string) $fd) . '/'; + if (!is_dir("$baseDir/" . trim((string) $fd))) { $missingFs[] = $rel; } + } + } + if ($missingFs) { + $shown = array_slice($missingFs, 0, 10); + $more = count($missingFs) - count($shown); + $fail('fileset references ' . count($missingFs) . ' missing path(s): ' + . implode(', ', $shown) . ($more > 0 ? " (+$more more)" : '')); + } else { + $ok('all fileset paths exist in src/'); + } + } } }