{"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":1067,"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":1049,"sourceCodeEnd":1085,"githubUrl":"https://github.com/vitejs/vite/blob/89620f09afcfef6b35e7bb8660132ab5b4d0cd3b/packages/vite/src/node/build.ts#L1049-L1085","documentation":"In resolveBuildOutputs (build.ts:1066), UMD and IIFE formats require a global variable name to attach the bundle to. If the formats include 'umd' or 'iife' (and outputs is not an array) but build.lib.name is unset, Vite throws.","triggerScenarios":"Setting build.lib.formats to include 'umd'/'iife' (or defaulting into 'umd' for a single entry) without providing build.lib.name.","commonSituations":"Switching a library config to UMD/IIFE and forgetting the global name; relying on defaults which add 'umd' for single-entry libs.","solutions":["Set build.lib.name to the desired global variable name, e.g. name: 'MyLib'.","If you don't need a browser global, drop 'umd'/'iife' from formats and use 'es'/'cjs'.","Ensure the name is a valid JS identifier (no hyphens)."],"exampleFix":"// before\nbuild: { lib: { entry: 'src/index.ts', formats: ['umd'] } }\n// after\nbuild: { lib: { entry: 'src/index.ts', name: 'MyLib', formats: ['umd'] } }","handlingStrategy":"validation","validationCode":"const lib = config.build?.lib\nconst fmts = lib?.formats\nif (lib && (fmts?.includes('umd') || fmts?.includes('iife')) && !lib.name) {\n  throw new Error('build.lib.name is required for umd/iife formats')\n}","typeGuard":"function hasUmdName(lib: any): boolean {\n  const fmts = lib.formats\n  return !(fmts?.includes('umd') || fmts?.includes('iife')) || Boolean(lib.name)\n}","tryCatchPattern":null,"preventionTips":["Whenever you add 'umd'/'iife' to formats, set build.lib.name simultaneously.","Use a valid JS identifier (no hyphens) for the global name.","Consider es/cjs if you don't need a browser global."],"tags":["build","library-mode","umd","config"],"analyzedSha":"89620f09afcfef6b35e7bb8660132ab5b4d0cd3b","analyzedAt":"2026-08-03T19:28:02.920Z","schemaVersion":2}