{"record":{"id":"baedd91b10c256b5","repo":"halo-dev/halo","slug":"provider-manifest-must-be-an-object","errorCode":null,"errorMessage":"Provider manifest must be an object","messagePattern":"Provider manifest must be an object","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java","lineNumber":217,"sourceCode":"        if (manifestResource == null) {\n            return ClassifiedProvider.legacy(candidate);\n        }\n        try {\n            var manifest = readManifest(candidate, manifestResource);\n            return ClassifiedProvider.esm(candidate, manifest);\n        } catch (Exception e) {\n            return ClassifiedProvider.invalid(\n                    candidate, Objects.toString(e.getMessage(), e.getClass().getSimpleName()));\n        }\n    }\n\n    private ProviderManifest readManifest(ProviderCandidate candidate, Resource resource) throws IOException {\n        JsonNode manifest;\n        try (var inputStream = resource.getInputStream()) {\n            manifest = JSON_MAPPER.readTree(inputStream);\n        }\n        if (!manifest.isObject()) {\n            throw new IllegalArgumentException(\"Provider manifest must be an object\");\n        }\n        var fields = new HashSet<String>();\n        fields.addAll(manifest.propertyNames());\n        if (!fields.containsAll(Set.of(\"format\", \"entry\"))\n                || !Set.of(\"format\", \"entry\", \"style\").containsAll(fields)) {\n            throw new IllegalArgumentException(\"Provider manifest must contain format, entry, and optional style only\");\n        }\n        if (!\"esm\".equals(manifest.path(\"format\").textValue())) {\n            throw new IllegalArgumentException(\"Provider manifest format must be esm\");\n        }\n        var entry = validateManifestResource(candidate, manifest.path(\"entry\"));\n        var style = manifest.has(\"style\") ? validateManifestResource(candidate, manifest.path(\"style\")) : null;\n        return new ProviderManifest(entry, style);\n    }\n\n    private String validateManifestResource(ProviderCandidate candidate, JsonNode value) {\n        if (!value.isTextual()) {\n            throw new IllegalArgumentException(\"Provider resource path must be a string\");","sourceCodeStart":199,"sourceCodeEnd":235,"githubUrl":"https://github.com/halo-dev/halo/blob/d2f5165f9c8f055ffcb3fa9c3f4032821a7b68c8/application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java#L199-L235","documentation":"Error \"Provider manifest must be an object\" thrown in halo-dev/halo.","triggerScenarios":"Thrown at application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java:217 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure the UI plugin bundle contains a valid provider manifest JSON object (not an array, string, or empty value).","Rebuild the UI plugin with @halo-dev/ui-plugin-bundler-kit so the manifest is generated correctly.","Check that the manifest file inside the plugin bundle is valid JSON and parses to an object."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"d2f5165f9c8f055ffcb3fa9c3f4032821a7b68c8","analyzedAt":"2026-08-14T00:18:38.915Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}