{"record":{"id":"ea791fbd642af19f","repo":"windmill-labs/windmill","slug":"bundle-produced-no-javascript-n-buildoutput","errorCode":null,"errorMessage":"bundle produced no javascript:\\n${buildOutput}","messagePattern":"bundle produced no javascript:\\\\n(.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"backend/windmill-api/src/apps_raw_bundler.ts","lineNumber":124,"sourceCode":"\t\t} else if (!/Unknown command|Usage:\\s+wmill app\\b/.test(plain)) {\n\t\t\tthrow new Error(`bundle failed:\\n${attempt.output}`)\n\t\t}\n\t}\n\tif (buildOutput === undefined) {\n\t\tbuildOutput = run([...cli_command, dir, '--out', outDir], 'bundle')\n\t}\n\n\tconst read = async (name: string) => {\n\t\ttry {\n\t\t\treturn await fs.readFile(path.join(outDir, name), 'utf8')\n\t\t} catch {\n\t\t\treturn ''\n\t\t}\n\t}\n\tconst js = await read('bundle.js')\n\tconst css = await read('bundle.css')\n\tif (js === '') {\n\t\tthrow new Error('bundle produced no javascript:\\n' + buildOutput)\n\t}\n\n\t// A runnable the derivation can't fully classify still yields a key, just an\n\t// unusable one (`r:undefined/undefined`, or the hash of an absent script), and\n\t// the deploy would then succeed with grants no run can ever match. The tool\n\t// schema describes `runnables` only as an object and the on-disk format has no\n\t// discriminator at all (`wmill app push` adds it), so these shapes are all\n\t// reachable: check them before deriving and name the ones at fault. An\n\t// explicitly empty entry is a runnable nobody configured yet, and needs no\n\t// grant.\n\tconst nonEmpty = (v: unknown) => typeof v === 'string' && v.length > 0\n\t// The prefixes `execute_component` resolves a run against; anything else is a\n\t// grant no run can match.\n\tconst RUN_TYPES = ['script', 'flow', 'hubscript']\n\tconst malformed = Object.entries(runnables ?? {})\n\t\t.filter(([, r]) => r != null)\n\t\t.filter(([, r]) => {\n\t\t\tif (typeof r !== 'object') return true","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/backend/windmill-api/src/apps_raw_bundler.ts#L106-L142","documentation":"Windmill rewrites Gemfile `source` lines to route through its internal gem proxy, and inline credentials (user:password embedded in the source URL) cannot be carried through that rewriting. The error redacts the credentials and names the offending source line.","triggerScenarios":"A Gemfile inside a ruby job contains a source URL of the form scheme://user:password@host — matched by UNSUPPORTED_SOURCE_RE during resolve.","commonSituations":"Private Gemfury/Artifactory/rubygems-hosting URLs pasted with embedded basic-auth credentials; scripts migrated from CI setups where credentialed URLs were the norm.","solutions":["Configure the gem source credentials (host, user, password) in Windmill instance settings so the proxy injects them","Remove the user:password portion from the source URL in the Gemfile and reference the plain host","Ask an administrator to add the credentials if you lack instance-settings access","Contact Windmill support/feature requests if inline credentials are essential to your workflow"],"exampleFix":"// before\nsource 'https://user:secret@gems.example.com'\n// after\nsource 'https://gems.example.com'  # credentials configured in instance settings","handlingStrategy":"validation","validationCode":"function validateGemfile(gemfile) {\n  const m = gemfile.match(/^\\s*source\\s*['\"]\\S+:\\/\\/[^/'\"]+:[^/'\"]+@/m);\n  if (m) throw new Error('Gemfile contains inline source credentials — configure them in instance settings instead');\n}","typeGuard":null,"tryCatchPattern":"try {\n  await runRubyJob(gemfile);\n} catch (e) {\n  if (/inline source credentials are not supported/.test(e.message)) {\n    throw new Error('Strip user:password from the source URL and add credentials in instance settings');\n  }\n  throw e;\n}","preventionTips":["Never embed user:password in Gemfile source URLs","Register private gem server credentials in instance settings","Use env-var or credential-store patterns locally too"],"tags":["ruby","bundler","credentials","security"],"backgroundTag":"inline-source-credentials-unsupported","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}