{"record":{"id":"84917b50fe9962e0","repo":"halo-dev/halo","slug":"provider-resource-path-must-not-be-blank","errorCode":null,"errorMessage":"Provider resource path must not be blank","messagePattern":"Provider resource path must not be blank","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java","lineNumber":248,"sourceCode":"        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    }\n\n    private static String normalizeResourcePath(String resourcePath) {\n        if (!StringUtils.hasText(resourcePath)) {\n            throw new IllegalArgumentException(\"Provider resource path must not be blank\");\n        }\n        var normalizedSlashes = resourcePath.replace('\\\\', '/');\n        if (normalizedSlashes.startsWith(\"/\")\n                || normalizedSlashes.startsWith(\"//\")\n                || normalizedSlashes.contains(\"?\")\n                || normalizedSlashes.contains(\"#\")\n                || normalizedSlashes.matches(\"^[a-zA-Z][a-zA-Z0-9+.-]*:.*\")) {\n            throw new IllegalArgumentException(\n                    \"Provider resource path must be provider-root-relative: \" + resourcePath);\n        }\n        var normalized = Path.of(normalizedSlashes).normalize();\n        if (normalized.isAbsolute()\n                || normalized.startsWith(\"..\")\n                || normalized.toString().equals(\".\")) {\n            throw new IllegalArgumentException(\"Provider resource path escapes its root: \" + resourcePath);\n        }\n        return normalized.toString().replace('\\\\', '/');\n    }","sourceCodeStart":230,"sourceCodeEnd":266,"githubUrl":"https://github.com/halo-dev/halo/blob/d2f5165f9c8f055ffcb3fa9c3f4032821a7b68c8/application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java#L230-L266","documentation":"Error \"Provider resource path must not be blank\" thrown in halo-dev/halo.","triggerScenarios":"Thrown at application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java:248 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Provide a non-blank path for the provider resource (entry/style) in the manifest.","Rebuild the UI plugin; a blank path usually indicates a failed or incomplete bundling step.","Ensure the bundler configuration specifies an entry point for the plugin."],"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"}