withastro/astro · warning

[@astrojs/mdx] Importing `getContainerRenderer` from `@astro

Error message

[@astrojs/mdx] Importing `getContainerRenderer` from `@astrojs/mdx` is deprecated. Import it from `@astrojs/mdx/container-renderer` instead.

What it means

The @astrojs/mdx package used to export getContainerRenderer from its root entry for Astro's Containers API. That root export is now a deprecation shim: it logs this console.warn and delegates to the internal getContainerRendererImpl(). The supported import is the @astrojs/mdx/container-renderer subpath export, which returns the renderer directly.

Source

Thrown at packages/integrations/mdx/src/index.ts:89

 * MDX pipeline options. Excludes user-only control fields (`extendMarkdownConfig`, `processor`).
 * @internal
 */
export type ResolvedMdxOptions = SharedMarkdownOptions & {
	optimize: boolean | OptimizeOptions;
};

type SetupHookParams = HookParameters<'astro:config:setup'> & {
	// `addPageExtension` and `contentEntryType` are not a public APIs
	// Add type defs here
	addPageExtension: (extension: string) => void;
	addContentEntryType: (contentEntryType: ContentEntryType) => void;
};

/**
 * @deprecated Import `getContainerRenderer` from `@astrojs/mdx/container-renderer` instead.
 */
export function getContainerRenderer(): AstroRenderer {
	console.warn(
		'[@astrojs/mdx] Importing `getContainerRenderer` from `@astrojs/mdx` is deprecated. Import it from `@astrojs/mdx/container-renderer` instead.',
	);
	return getContainerRendererImpl();
}

export default function mdx(partialMdxOptions: Partial<MdxOptions> = {}): AstroIntegration {
	// @ts-expect-error Temporarily assign an empty object here, which will be re-assigned by the
	// `astro:config:done` hook later. This is so that `vitePluginMdx` can get hold of a reference earlier.
	let vitePluginMdxOptions: VitePluginMdxOptions = {};

	return {
		name: '@astrojs/mdx',
		hooks: {
			'astro:config:setup': async (params) => {
				const { updateConfig, config, addPageExtension, addContentEntryType, addRenderer } =
					params as SetupHookParams;

				addRenderer({

View on GitHub (pinned to e294953aa8)

Solutions

  1. Change the import to `import { getContainerRenderer } from '@astrojs/mdx/container-renderer'`
  2. Audit the rest of your container setup: sibling framework renderers use the same <pkg>/container-renderer convention
  3. Delete any local re-exports of the root getContainerRenderer so call sites cannot regress

Example fix

// before
import { getContainerRenderer } from '@astrojs/mdx';

// after
import { getContainerRenderer } from '@astrojs/mdx/container-renderer';
Defensive patterns

Strategy: validation

Validate before calling

import { getContainerRenderer } from '@astrojs/mdx/container-renderer'; // supported subpath
export const renderers = [getContainerRenderer()];

Prevention

When it happens

Trigger: Code like `import { getContainerRenderer } from '@astrojs/mdx'` — typically inside a container-renderer.ts for the experimental Containers API (passed to experimental_AstroContainer.create({ renderers: [...] })) — on any version where the package exposes the container-renderer subpath.

Common situations: Following older Containers API docs or examples; upgrading @astrojs/mdx alongside sibling renderer packages (@astrojs/react, vue, svelte, solid) which all moved container renderers to subpath exports.

Related errors


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