halo-dev/halo · error · IllegalArgumentException
Provider manifest must contain format, entry, and optional…
Error message
Provider manifest must contain format, entry, and optional style only
What it means
Error "Provider manifest must contain format, entry, and optional style only" thrown in halo-dev/halo.
Solutions
- Remove any extra keys from the provider manifest; only 'format', 'entry', and optionally 'style' are allowed.
- Regenerate the bundle with the official bundler kit instead of hand-editing the manifest.
- Verify the manifest was not corrupted or merged with other configuration during the build.
When it happens
Trigger: Thrown at application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java:223 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of halo-dev/halo@d2f5165f9c (2026-08-14).
Data as JSON: /api/errors/c2d178cdb0e424e1.
Report an issue: GitHub.
Appendix: source
Thrown at application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java:223
} catch (Exception e) {
return ClassifiedProvider.invalid(
candidate, Objects.toString(e.getMessage(), e.getClass().getSimpleName()));
}
}
private ProviderManifest readManifest(ProviderCandidate candidate, Resource resource) throws IOException {
JsonNode manifest;
try (var inputStream = resource.getInputStream()) {
manifest = JSON_MAPPER.readTree(inputStream);
}
if (!manifest.isObject()) {
throw new IllegalArgumentException("Provider manifest must be an object");
}
var fields = new HashSet<String>();
fields.addAll(manifest.propertyNames());
if (!fields.containsAll(Set.of("format", "entry"))
|| !Set.of("format", "entry", "style").containsAll(fields)) {
throw new IllegalArgumentException("Provider manifest must contain format, entry, and optional style only");
}
if (!"esm".equals(manifest.path("format").textValue())) {
throw new IllegalArgumentException("Provider manifest format must be esm");
}
var entry = validateManifestResource(candidate, manifest.path("entry"));
var style = manifest.has("style") ? validateManifestResource(candidate, manifest.path("style")) : null;
return new ProviderManifest(entry, style);
}
private String validateManifestResource(ProviderCandidate candidate, JsonNode value) {
if (!value.isTextual()) {
throw new IllegalArgumentException("Provider resource path must be a string");
}
var resourcePath = normalizeResourcePath(value.textValue());
var resource = providerResource(candidate, resourcePath);
if (resource == null || !resource.isReadable()) {
throw new IllegalArgumentException(
"Provider resource does not exist inside its root: " + value.textValue());View on GitHub (pinned to d2f5165f9c)