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
- Change the import to `import { getContainerRenderer } from '@astrojs/mdx/container-renderer'`
- Audit the rest of your container setup: sibling framework renderers use the same <pkg>/container-renderer convention
- 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
- Prefer the subpath exports documented in each integration's package.json exports map
- Add a CI grep for `from '@astrojs/mdx'` imports that pull getContainerRenderer
- Track deprecation notes when consuming experimental Container APIs
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
- [@astrojs/vue] Importing `getContainerRenderer` from `@astro
- ${names} on `mdx({...})` ${isPlural ? 'are' : 'is'} deprecat
- Could not render `${node.name}`. No matching import has been
- [MDX] A remark or rehype plugin attempted to inject invalid
- Expected a matching import for component `${tagName}`. Did y
AI-assisted analysis of withastro/astro@e294953aa8 (2026-08-18).
Data as JSON: /api/errors/c12540765558701e.
Report an issue: GitHub.