{"record":{"id":"3832fc16e4f4308e","repo":"gohugoio/hugo","slug":"invalid-loader-q","errorCode":null,"errorMessage":"invalid loader: %q","messagePattern":"invalid loader: %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/esbuild/options.go","lineNumber":318,"sourceCode":"\t\ttarget = api.ESNext\n\t}\n\n\tvar loaders map[string]api.Loader\n\tif opts.IsCSS {\n\t\tloaders = make(map[string]api.Loader)\n\t\t// Add default CSS file loaders.\n\t\t// May be overridden by opts.Loaders.\n\t\tmaps.Copy(loaders, extensionToLoaderMapCSS)\n\t}\n\tif opts.Loaders != nil {\n\t\tif loaders == nil {\n\t\t\tloaders = make(map[string]api.Loader)\n\t\t}\n\n\t\tfor k, v := range opts.Loaders {\n\t\t\tloader, found := nameLoader[v]\n\t\t\tif !found {\n\t\t\t\terr = fmt.Errorf(\"invalid loader: %q\", v)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tloaders[k] = loader\n\t\t}\n\t}\n\n\tmediaType := opts.MediaType\n\tif mediaType.IsZero() {\n\t\tmediaType = media.Builtin.JavascriptType\n\t}\n\n\tvar loader api.Loader\n\tswitch mediaType.SubType {\n\tcase media.Builtin.JavascriptType.SubType:\n\t\tloader = api.LoaderJS\n\tcase media.Builtin.TypeScriptType.SubType:\n\t\tloader = api.LoaderTS\n\tcase media.Builtin.TSXType.SubType:","sourceCodeStart":300,"sourceCodeEnd":336,"githubUrl":"https://github.com/gohugoio/hugo/blob/52c9bd7908b4d02d4d0ff8f82a888834d6ee10d2/internal/js/esbuild/options.go#L300-L336","documentation":"Thrown when a value in the Loaders map (mapping file extensions to loaders) is not one of the supported loader names in nameLoader. Loaders configure how esbuild treats a given file extension.","triggerScenarios":"Setting Loaders: {\".png\": \"image\"} where \"image\" is not a known loader name. The lookup at options.go:316 fails and the invalid value is reported.","commonSituations":"User invents loader names; copy-paste from esbuild docs with a typo; case mismatch — loaders are lowercase, so \"JS\" or \"DataURL\" won't match.","solutions":["Use a supported loader name: none, base64, binary, copy, css, dataurl, default, empty, file, global-css, js, json, jsx, local-css, text, ts, tsx."],"exampleFix":"// before\n{{ $opts := dict \"loaders\" (dict \".png\" \"image\") }}\n\n// after\n{{ $opts := dict \"loaders\" (dict \".png\" \"dataurl\") }}","handlingStrategy":"validation","validationCode":"validLoaders := map[string]bool{\"none\": true, \"base64\": true, \"binary\": true, \"copy\": true, \"css\": true, \"dataurl\": true, \"default\": true, \"empty\": true, \"file\": true, \"global-css\": true, \"js\": true, \"json\": true, \"jsx\": true, \"local-css\": true, \"text\": true, \"ts\": true, \"tsx\": true}\nfor ext, l := range opts.Loaders {\n    if !validLoaders[l] {\n        return fmt.Errorf(\"invalid loader %q for extension %q\", l, ext)\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Cross-check loader names against esbuild's documented list.","Lowercase all loader values before validation.","Reject unknown loader names at config load."],"tags":["esbuild","options","loader","validation"],"backgroundTag":null,"analyzedSha":"52c9bd7908b4d02d4d0ff8f82a888834d6ee10d2","analyzedAt":"2026-08-09T21:49:36.660Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}