{"record":{"id":"fbc61a7c9c0f12fa","repo":"halo-dev/halo","slug":"provider-manifest-format-must-be-esm","errorCode":null,"errorMessage":"Provider manifest format must be esm","messagePattern":"Provider manifest format must be esm","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java","lineNumber":226,"sourceCode":"        }\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\");\n        }\n        var resourcePath = normalizeResourcePath(value.textValue());\n        var resource = providerResource(candidate, resourcePath);\n        if (resource == null || !resource.isReadable()) {\n            throw new IllegalArgumentException(\n                    \"Provider resource does not exist inside its root: \" + value.textValue());\n        }\n        return resourcePath;\n    }","sourceCodeStart":208,"sourceCodeEnd":244,"githubUrl":"https://github.com/halo-dev/halo/blob/d2f5165f9c8f055ffcb3fa9c3f4032821a7b68c8/application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java#L208-L244","documentation":"Error \"Provider manifest format must be esm\" thrown in halo-dev/halo.","triggerScenarios":"Thrown at application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java:226 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set the provider manifest 'format' field to \"esm\"; other module formats are not accepted here.","Rebuild the UI plugin with ESM output enabled in the bundler configuration.","If the plugin targets an older Halo, use an older bundler that emits the format supported by that Halo version."],"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"}