{"record":{"id":"de200cb5999f16aa","repo":"withastro/astro","slug":"integration-integration-name-has-an-unnamed-ren","errorCode":null,"errorMessage":"Integration ${integration.name} has an unnamed renderer.","messagePattern":"Integration (.+?) has an unnamed renderer\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/astro/src/integrations/hooks.ts","lineNumber":229,"sourceCode":"\t\t *   import.meta.env.production ? compress() : null\n\t\t * ]\n\t\t * ```\n\t\t */\n\n\t\tlet isLoggerUpdated = false;\n\n\t\tconst { integrationLogger } = await runHookInternal({\n\t\t\tintegration,\n\t\t\thookName: 'astro:config:setup',\n\t\t\tlogger,\n\t\t\tparams: () => {\n\t\t\t\tconst hooks: Omit<HookParameters<'astro:config:setup'>, 'logger'> = {\n\t\t\t\t\tconfig: updatedConfig,\n\t\t\t\t\tcommand,\n\t\t\t\t\tisRestart,\n\t\t\t\t\taddRenderer(renderer: AstroRenderer) {\n\t\t\t\t\t\tif (!renderer.name) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Integration ${colors.bold(integration.name)} has an unnamed renderer.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!renderer.serverEntrypoint) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Renderer ${colors.bold(renderer.name)} does not provide a serverEntrypoint.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (renderer.name === 'astro:jsx') {\n\t\t\t\t\t\t\tastroJSXRenderer = renderer;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tupdatedSettings.renderers.push(renderer);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tinjectScript: (stage, content) => {\n\t\t\t\t\t\tupdatedSettings.scripts.push({ stage, content });","sourceCodeStart":211,"sourceCodeEnd":247,"githubUrl":"https://github.com/withastro/astro/blob/d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca/packages/astro/src/integrations/hooks.ts#L211-L247","documentation":"In the `astro:config:setup` hook, when an integration calls `addRenderer(renderer)`, Astro requires `renderer.name` to be a truthy string. A falsy/empty name is rejected with a plain Error because renderers are keyed and logged by name.","triggerScenarios":"An integration calls `addRenderer({ serverEntrypoint, ... })` without setting `name`, or sets `name: ''` / `name: undefined`.","commonSituations":"Authoring a framework integration (React, Vue, Solid, etc.) and forgetting the `name` field; refactoring a renderer object and dropping the name property; integrating a community renderer with an incomplete definition.","solutions":["Set a non-empty `name` on the renderer object passed to `addRenderer` (e.g. `'@astrojs/react'`).","Verify the renderer object shape against `AstroRenderer` (requires `name` and `serverEntrypoint`).","Update the integration package if using a third-party renderer that omits the name."],"exampleFix":"// before\naddRenderer({ serverEntrypoint: '@my/framework/server.js' })\n\n// after\naddRenderer({ name: '@my/framework', serverEntrypoint: '@my/framework/server.js' })","handlingStrategy":"validation","validationCode":"function assertRendererHasName(renderer) {\n  if (!renderer || typeof renderer.name !== 'string' || renderer.name === '') {\n    throw new Error('Renderer must have a non-empty name');\n  }\n}","typeGuard":"function rendererHasName(renderer) {\n  return !!renderer && typeof renderer.name === 'string' && renderer.name.length > 0;\n}","tryCatchPattern":"null","preventionTips":["Always set renderer.name when calling addRenderer.","Validate the AstroRenderer object before registration.","Write a smoke test that loads your integration in a fixture project."],"tags":["integrations","renderers","config"],"backgroundTag":null,"analyzedSha":"d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca","analyzedAt":"2026-08-12T13:37:29.035Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}