{"record":{"id":"ab6dfe62f617e4f0","repo":"halo-dev/halo","slug":"provider-resource-path-must-be-provider-root-relat-ab6dfe","errorCode":null,"errorMessage":"Provider resource path must be provider-root-relative: {resourcePath}","messagePattern":"Provider resource path must be provider-root-relative: (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java","lineNumber":256,"sourceCode":"        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    }\n\n    private UiPluginProviderDescriptor createDescriptor(String version, List<KeyedProvider> keyedProviders) {\n        var hasLegacyProvider = keyedProviders.stream()\n                .map(KeyedProvider::provider)\n                .anyMatch(provider -> provider.kind() == ProviderKind.LEGACY);\n        return new UiPluginProviderDescriptor(\n                keyedProviders.stream().map(this::describeProvider).toList(),\n                hasLegacyProvider ? versionedBundleUrl(\"bundle.js\", version) : null);","sourceCodeStart":238,"sourceCodeEnd":274,"githubUrl":"https://github.com/halo-dev/halo/blob/d2f5165f9c8f055ffcb3fa9c3f4032821a7b68c8/application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java#L238-L274","documentation":"Error \"Provider resource path must be provider-root-relative: {resourcePath}\" thrown in halo-dev/halo.","triggerScenarios":"Thrown at application/src/main/java/run/halo/app/plugin/UiPluginBundleServiceImpl.java:256 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use a path relative to the provider root (no leading '/' or absolute path) for the manifest entry/style values.","Rebuild the plugin with the official bundler kit, which emits root-relative paths.","Remove any URL or absolute filesystem path mistakenly placed in the manifest."],"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"}