{"record":{"id":"4cd75e093c0a400e","repo":"withastro/astro","slug":"renderer-colors-bold-renderer-name-does-not-pr","errorCode":null,"errorMessage":"Renderer ${colors.bold(renderer.name)} does not provide a serverEntrypoint.","messagePattern":"Renderer (.+?) does not provide a serverEntrypoint\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/astro/src/integrations/hooks.ts","lineNumber":235,"sourceCode":"\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 });\n\t\t\t\t\t},\n\t\t\t\t\tupdateConfig: (newConfig) => {\n\t\t\t\t\t\t// Logger destination is updated later because it's async\n\t\t\t\t\t\tif (newConfig.logger?.entrypoint) {\n\t\t\t\t\t\t\tisLoggerUpdated = true;\n\t\t\t\t\t\t}","sourceCodeStart":217,"sourceCodeEnd":253,"githubUrl":"https://github.com/withastro/astro/blob/52e6c34790cc8ac4e69e6135ace06049867e5c4a/packages/astro/src/integrations/hooks.ts#L217-L253","documentation":"When an integration registers a renderer via `addRenderer`, Astro requires a `serverEntrypoint` - the module that renders the framework to markup on the server (or at build time). The addRenderer callback throws this plain Error when serverEntrypoint is missing, after the name check has passed.","triggerScenarios":"An integration calling addRenderer({ name: '@myorg/solid' }) with no serverEntrypoint; entry point variables that resolve to undefined due to a bad import or string; renderers assembled from partial objects where the entry point key was misspelled (e.g. serverEntry).","commonSituations":"Authoring a renderer integration and forgetting the required field; renames or refactors leaving the key undefined; integrations adapted from examples that omitted it.","solutions":["Provide serverEntrypoint pointing at the server rendering module: addRenderer({ name: '@myorg/solid', serverEntrypoint: '@myorg/solid/server.js' }).","Verify the package/specifier actually exists; a typo resolves to undefined only if you build the object dynamically.","Type the renderer object as AstroRenderer so missing required fields fail at compile time."],"exampleFix":"// before\naddRenderer({ name: '@myorg/solid', clientEntrypoint: '@myorg/solid/client.js' });\n\n// after\naddRenderer({\n  name: '@myorg/solid',\n  serverEntrypoint: '@myorg/solid/server.js',\n  clientEntrypoint: '@myorg/solid/client.js',\n});","handlingStrategy":"validation","validationCode":"// before calling addRenderer in your integration\nif (!renderer.serverEntrypoint) {\n  throw new Error('renderer.serverEntrypoint is required');\n}\naddRenderer(renderer);","typeGuard":"import type { AstroRenderer } from 'astro';\nfunction isCompleteRenderer(r: Partial<AstroRenderer>): r is AstroRenderer {\n  return typeof r.name === 'string' && !!r.serverEntrypoint;\n}","tryCatchPattern":null,"preventionTips":["Type renderer objects as AstroRenderer; serverEntrypoint is required.","Verify entry point specifiers resolve (import or resolve.sync) in integration tests.","Watch for misspelled keys like serverEntry when porting renderers from other systems."],"tags":["integrations","renderers","plugin-api"],"backgroundTag":"invalid-integration-contract","analyzedSha":"52e6c34790cc8ac4e69e6135ace06049867e5c4a","analyzedAt":"2026-08-18T18:48:03.901Z","contentChangedAt":"2026-08-18T18:48:03.901Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}