{"record":{"id":"e8ba86b732d3cd7c","repo":"withastro/astro","slug":"astro-names-isplural-are-is-deprec","errorCode":null,"errorMessage":"[astro] ${names} ${isPlural ? 'are' : 'is'} deprecated. Move ${isPlural ? 'them' : 'it'} onto your processor instead (e.g. `satteri({ features: { gfm: false, smartPunctuation: false } })`, or `unified({ gfm: false, smartypants: false })` from `@astrojs/markdown-remark`). Will be removed in a future major.","messagePattern":"\\[astro\\] (.+?) (.+?) deprecated\\. Move (.+?) onto your processor instead \\(e\\.g\\. `satteri\\((.+?) \\}\\)`, or `unified\\((.+?)\\)` from `@astrojs/markdown-remark`\\)\\. Will be removed in a future major\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/astro/src/core/config/validate.ts","lineNumber":46,"sourceCode":"\t\t}),\n\t);\n}\n\nlet didWarnAboutDeprecatedMarkdownOptions = false;\n\nfunction warnDeprecatedMarkdownOptions(\n\tconfig: Pick<AstroUserConfig, 'markdown'> | undefined,\n): void {\n\tif (didWarnAboutDeprecatedMarkdownOptions) return;\n\tconst md = config?.markdown;\n\tif (!md) return;\n\tconst deprecated = (['gfm', 'smartypants'] as const).filter((k) => md[k] !== undefined);\n\tif (deprecated.length === 0) return;\n\tdidWarnAboutDeprecatedMarkdownOptions = true;\n\n\tconst names = deprecated.map((key) => `\\`markdown.${key}\\``).join(' and ');\n\tconst isPlural = deprecated.length > 1;\n\tconsole.warn(\n\t\t`[astro] ${names} ${isPlural ? 'are' : 'is'} deprecated. Move ${isPlural ? 'them' : 'it'} onto your processor instead (e.g. \\`satteri({ features: { gfm: false, smartPunctuation: false } })\\`, or \\`unified({ gfm: false, smartypants: false })\\` from \\`@astrojs/markdown-remark\\`). Will be removed in a future major.`,\n\t);\n}\n\nlet didWarnAboutLegacyMarkdownPlugins = false;\nlet didWarnAboutProcessorMismatch = false;\n\nconst migratedLegacyPluginCounts = new WeakMap<object, { remark: number; rehype: number }>();\n/**\n * Folds legacy `markdown.{remark,rehype}Plugins` / `remarkRehype` into the unified\n * processor (mutates `config`). Runs on every validate pass to catch integration-added\n * legacy plugins.\n */\nasync function coerceLegacyMarkdownPlugins(\n\tconfig: Pick<AstroUserConfig, 'markdown'>,\n): Promise<void> {\n\tconst md = config?.markdown;\n\tif (!md) return;","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/withastro/astro/blob/52e6c34790cc8ac4e69e6135ace06049867e5c4a/packages/astro/src/core/config/validate.ts#L28-L64","documentation":"The top-level markdown.gfm and markdown.smartypants options are deprecated; they are only mapped onto the markdown processor's feature flags. When either key is set (any value other than undefined), Astro warns once (module-level flag) and points you at configuring the processor directly via unified({ features: ... }) or satteri({ features: ... }) from @astrojs/markdown-remark.","triggerScenarios":"astro.config contains markdown: { gfm: ... } and/or markdown: { smartypants: ... } with any explicit value — including explicitly re-setting the defaults.","commonSituations":"Long-standing configs carried over from Astro v4 and earlier; disabling smartypants or gfm the old way; integration code that mutates the markdown config with these keys.","solutions":["Remove markdown.gfm / markdown.smartypants from the config","Configure features on the processor: markdown: { processor: unified({ features: { gfm: false, smartPunctuation: false } }) }","If you only wanted the default behavior, simply delete the keys"],"exampleFix":"// before — astro.config.mjs\nexport default defineConfig({\n  markdown: { gfm: false, smartypants: false },\n});\n\n// after\nimport { unified } from '@astrojs/markdown-remark';\nexport default defineConfig({\n  markdown: {\n    processor: unified({ features: { gfm: false, smartPunctuation: false } }),\n  },\n});","handlingStrategy":"validation","validationCode":"// fail CI when deprecated markdown option keys are present\nconst deprecated = ['gfm', 'smartypants', 'remarkPlugins', 'rehypePlugins', 'remarkRehype'];\nconst present = deprecated.filter((k) => config.markdown?.[k] !== undefined);\nif (present.length) throw new Error(`Deprecated markdown options: ${present.join(', ')}`);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Migrate markdown options to processor-level config on every major upgrade","Keep the markdown config minimal — only set what differs from defaults","Watch for deprecation warnings in dev output after upgrading Astro or integrations"],"tags":["markdown","deprecation","config"],"backgroundTag":"deprecated-config-option","analyzedSha":"52e6c34790cc8ac4e69e6135ace06049867e5c4a","analyzedAt":"2026-08-18T18:48:03.901Z","contentChangedAt":"2026-08-18T18:48:03.901Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}