withastro/astro · error · Error

Integration ${integration.name} has an unnamed renderer.

Error message

Integration ${integration.name} has an unnamed renderer.

What it means

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.

Source

Thrown at packages/astro/src/integrations/hooks.ts:229

		 *   import.meta.env.production ? compress() : null
		 * ]
		 * ```
		 */

		let isLoggerUpdated = false;

		const { integrationLogger } = await runHookInternal({
			integration,
			hookName: 'astro:config:setup',
			logger,
			params: () => {
				const hooks: Omit<HookParameters<'astro:config:setup'>, 'logger'> = {
					config: updatedConfig,
					command,
					isRestart,
					addRenderer(renderer: AstroRenderer) {
						if (!renderer.name) {
							throw new Error(
								`Integration ${colors.bold(integration.name)} has an unnamed renderer.`,
							);
						}

						if (!renderer.serverEntrypoint) {
							throw new Error(
								`Renderer ${colors.bold(renderer.name)} does not provide a serverEntrypoint.`,
							);
						}

						if (renderer.name === 'astro:jsx') {
							astroJSXRenderer = renderer;
						} else {
							updatedSettings.renderers.push(renderer);
						}
					},
					injectScript: (stage, content) => {
						updatedSettings.scripts.push({ stage, content });

View on GitHub (pinned to d081033d5f)

Solutions

  1. Set a non-empty `name` on the renderer object passed to `addRenderer` (e.g. `'@astrojs/react'`).
  2. Verify the renderer object shape against `AstroRenderer` (requires `name` and `serverEntrypoint`).
  3. Update the integration package if using a third-party renderer that omits the name.

Example fix

// before
addRenderer({ serverEntrypoint: '@my/framework/server.js' })

// after
addRenderer({ name: '@my/framework', serverEntrypoint: '@my/framework/server.js' })
Defensive patterns

Strategy: validation

Validate before calling

function assertRendererHasName(renderer) {
  if (!renderer || typeof renderer.name !== 'string' || renderer.name === '') {
    throw new Error('Renderer must have a non-empty name');
  }
}

Type guard

function rendererHasName(renderer) {
  return !!renderer && typeof renderer.name === 'string' && renderer.name.length > 0;
}

Try / catch

null

Prevention

When it happens

Trigger: An integration calls `addRenderer({ serverEntrypoint, ... })` without setting `name`, or sets `name: ''` / `name: undefined`.

Common situations: 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.

Related errors


AI-assisted analysis of withastro/astro@d081033d5f (2026-08-12). Data as JSON: /api/errors/de200cb5999f16aa. Report an issue: GitHub.