{"id":"46cb2d25a0309bb4","repo":"vitejs/vite","slug":"entries-in-build-rolldownoptions-output-must-spe","errorCode":null,"errorMessage":"Entries in \"build.rolldownOptions.output\" must specify \"name\" when the format is \"umd\" or \"iife\".","messagePattern":"Entries in \"build\\.rolldownOptions\\.output\" must specify \"name\" when the format is \"umd\" or \"iife\"\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vite/src/node/build.ts","lineNumber":1090,"sourceCode":"\n      return libFormats.map((format) => ({ ...outputs, format }))\n    }\n\n    // By this point, we know \"outputs\" is an Array.\n    if (libOptions.formats) {\n      logger.warn(\n        colors.yellow(\n          '\"build.lib.formats\" will be ignored because \"build.rolldownOptions.output\" is already an array format.',\n        ),\n      )\n    }\n\n    outputs.forEach((output) => {\n      if (\n        (output.format === 'umd' || output.format === 'iife') &&\n        !output.name\n      ) {\n        throw new Error(\n          'Entries in \"build.rolldownOptions.output\" must specify \"name\" when the format is \"umd\" or \"iife\".',\n        )\n      }\n    })\n  }\n\n  return outputs\n}\n\nconst warningIgnoreList = [`CIRCULAR_DEPENDENCY`, `THIS_IS_UNDEFINED`]\nconst dynamicImportWarningIgnoreList = [\n  `Unsupported expression`,\n  `statically analyzed`,\n]\n\nexport function clearLine(): void {\n  const tty = process.stdout.isTTY && !process.env.CI\n  if (tty) {","sourceCodeStart":1072,"sourceCodeEnd":1108,"githubUrl":"https://github.com/vitejs/vite/blob/89620f09afcfef6b35e7bb8660132ab5b4d0cd3b/packages/vite/src/node/build.ts#L1072-L1108","documentation":"In resolveBuildOutputs (build.ts:1085-1094), when build.rolldownOptions.output is an array, Vite iterates each output and requires that any entry whose format is 'umd' or 'iife' also specifies a name. Unlike the single-output path it cannot fall back to build.lib.name, so each array entry needs its own.","triggerScenarios":"Providing build.rolldownOptions.output as an array where one element has format: 'umd' or 'iife' but omits the name property.","commonSituations":"Generating multiple output bundles (e.g. es + umd) via an output array and forgetting name on the UMD element.","solutions":["Add a name property to every array element whose format is 'umd' or 'iife'.","Alternatively avoid the array form and rely on build.lib.formats + build.lib.name for the single-output path.","Double-check each output entry has format-appropriate required fields."],"exampleFix":"// before\nbuild: { lib: { entry: 'src/index.ts', name: 'MyLib' }, rolldownOptions: { output: [{ format: 'es' }, { format: 'umd' }] } }\n// after\nbuild: { lib: { entry: 'src/index.ts', name: 'MyLib' }, rolldownOptions: { output: [{ format: 'es' }, { format: 'umd', name: 'MyLib' }] } }","handlingStrategy":"validation","validationCode":"const outputs = config.build?.rolldownOptions?.output\nif (Array.isArray(outputs)) {\n  outputs.forEach((o: any) => {\n    if ((o.format === 'umd' || o.format === 'iife') && !o.name) {\n      throw new Error(`Output with format ${o.format} needs a name`)\n    }\n  })\n}","typeGuard":"function outputsHaveNames(outputs: any[]): boolean {\n  return outputs.every((o) => (o.format !== 'umd' && o.format !== 'iife') || Boolean(o.name))\n}","tryCatchPattern":null,"preventionTips":["When using an output array, set name on every umd/iife element.","Prefer build.lib.formats + build.lib.name over the array form when possible.","Add a config validator that scans output array entries."],"tags":["build","library-mode","umd","output","config"],"analyzedSha":"89620f09afcfef6b35e7bb8660132ab5b4d0cd3b","analyzedAt":"2026-08-03T19:28:02.920Z","schemaVersion":2}