{"record":{"id":"7ae0fe3771f0b493","repo":"vitejs/vite","slug":"option-build-lib-name-is-required-when-output-fo","errorCode":null,"errorMessage":"Option \"build.lib.name\" is required when output formats include \"umd\" or \"iife\".","messagePattern":"Option \"build\\.lib\\.name\" is required when output formats include \"umd\" or \"iife\"\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vite/src/node/build.ts","lineNumber":1071,"sourceCode":"  if (libOptions) {\n    const libHasMultipleEntries =\n      typeof libOptions.entry !== 'string' &&\n      libOptions.entry &&\n      Object.values(libOptions.entry).length > 1\n    const libFormats =\n      libOptions.formats ||\n      (libHasMultipleEntries ? ['es', 'cjs'] : ['es', 'umd'])\n\n    if (!Array.isArray(outputs)) {\n      if (libFormats.includes('umd') || libFormats.includes('iife')) {\n        if (libHasMultipleEntries) {\n          throw new Error(\n            'Multiple entry points are not supported when output formats include \"umd\" or \"iife\".',\n          )\n        }\n\n        if (!libOptions.name) {\n          throw new Error(\n            'Option \"build.lib.name\" is required when output formats include \"umd\" or \"iife\".',\n          )\n        }\n      }\n\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) => {","sourceCodeStart":1053,"sourceCodeEnd":1089,"githubUrl":"https://github.com/vitejs/vite/blob/b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab/packages/vite/src/node/build.ts#L1053-L1089","documentation":"UMD and IIFE bundles attach the export to a global variable whose name comes from build.lib.name. Without that name, Rolldown cannot generate a valid umd/iife wrapper, so resolveBuildOutputs throws when formats include umd or iife but lib.name is unset.","triggerScenarios":"Setting build.lib.formats to ['umd'] or ['iife'] (or letting it default to ['es','umd'] for a single-entry lib) without setting build.lib.name.","commonSituations":"Library configs copied from an ESM-only example then extended with umd for script-tag distribution; forgetting the name field after switching formats.","solutions":["Add build.lib.name with a valid JS identifier, e.g. name: 'MyLib'.","If you do not need a global, drop 'umd'/'iife' from formats and use 'es'/'cjs'.","Ensure the name has no spaces or hyphens; it becomes a global variable name."],"exampleFix":"// before\nbuild: { lib: { entry: 'src/index.ts', formats: ['umd'] } }\n// after\nbuild: { lib: { entry: 'src/index.ts', formats: ['umd'], name: 'MyLib' } }","handlingStrategy":"validation","validationCode":"function requireLibNameForUmd(libOptions) {\n  const formats = libOptions?.formats || ['es', 'umd'];\n  if ((formats.includes('umd') || formats.includes('iife')) && !libOptions?.name) {\n    return 'build.lib.name is required for umd/iife';\n  }\n  return null;\n}","typeGuard":"function isValidLibName(name) {\n  return typeof name === 'string' && /^[A-Za-z_$][\\w$]*$/.test(name);\n}","tryCatchPattern":null,"preventionTips":["Always set build.lib.name when formats include umd or iife.","Use a valid JS identifier for the name (it becomes a global)."],"tags":["build","library","umd","iife","config"],"backgroundTag":null,"analyzedSha":"b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab","analyzedAt":"2026-08-11T11:49:19.515Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}