From 16107b6a10514ef1b563e585ec9add4b14f42b94 Mon Sep 17 00:00:00 2001 From: Chris Swithinbank Date: Mon, 9 Jan 2023 10:23:21 +0100 Subject: [PATCH] Remove Astro-flavored Markdown from `@astrojs/markdown-remark` (#5785) --- .changeset/poor-chicken-film.md | 5 + .../astro/src/vite-plugin-markdown/index.ts | 1 - packages/markdown/remark/package.json | 10 -- packages/markdown/remark/src/index.ts | 29 +--- .../markdown/remark/src/mdast-util-mdxish.ts | 12 -- packages/markdown/remark/src/mdxjs.ts | 27 ---- .../remark/src/rehype-collect-headings.ts | 21 +-- packages/markdown/remark/src/rehype-escape.ts | 22 --- .../markdown/remark/src/rehype-expressions.ts | 18 --- .../markdown/remark/src/rehype-islands.ts | 43 ------ packages/markdown/remark/src/rehype-jsx.ts | 65 --------- packages/markdown/remark/src/remark-escape.ts | 15 --- .../remark/src/remark-mark-and-unravel.ts | 72 ---------- packages/markdown/remark/src/remark-mdxish.ts | 61 --------- packages/markdown/remark/src/remark-unwrap.ts | 44 ------ packages/markdown/remark/src/types.ts | 1 - .../markdown/remark/test/autolinking.test.js | 72 ---------- .../markdown/remark/test/components.test.js | 78 ----------- .../markdown/remark/test/entities.test.js | 15 +-- .../markdown/remark/test/expressions.test.js | 125 ------------------ .../markdown/remark/test/strictness.test.js | 98 -------------- pnpm-lock.yaml | 20 --- 22 files changed, 12 insertions(+), 842 deletions(-) create mode 100644 .changeset/poor-chicken-film.md delete mode 100644 packages/markdown/remark/src/mdast-util-mdxish.ts delete mode 100644 packages/markdown/remark/src/mdxjs.ts delete mode 100644 packages/markdown/remark/src/rehype-escape.ts delete mode 100644 packages/markdown/remark/src/rehype-expressions.ts delete mode 100644 packages/markdown/remark/src/rehype-islands.ts delete mode 100644 packages/markdown/remark/src/rehype-jsx.ts delete mode 100644 packages/markdown/remark/src/remark-escape.ts delete mode 100644 packages/markdown/remark/src/remark-mark-and-unravel.ts delete mode 100644 packages/markdown/remark/src/remark-mdxish.ts delete mode 100644 packages/markdown/remark/src/remark-unwrap.ts delete mode 100644 packages/markdown/remark/test/components.test.js delete mode 100644 packages/markdown/remark/test/expressions.test.js delete mode 100644 packages/markdown/remark/test/strictness.test.js diff --git a/.changeset/poor-chicken-film.md b/.changeset/poor-chicken-film.md new file mode 100644 index 000000000000..ecbc3b44caa7 --- /dev/null +++ b/.changeset/poor-chicken-film.md @@ -0,0 +1,5 @@ +--- +'@astrojs/markdown-remark': major +--- + +Drop support for legacy Astro-flavored Markdown diff --git a/packages/astro/src/vite-plugin-markdown/index.ts b/packages/astro/src/vite-plugin-markdown/index.ts index 10e4cb8c0743..34ed3647b1ff 100644 --- a/packages/astro/src/vite-plugin-markdown/index.ts +++ b/packages/astro/src/vite-plugin-markdown/index.ts @@ -71,7 +71,6 @@ export default function markdown({ settings, logging }: AstroPluginOptions): Plu const renderResult = await renderMarkdown(raw.content, { ...settings.config.markdown, fileURL: new URL(`file://${fileId}`), - isAstroFlavoredMd: false, isExperimentalContentCollections: settings.config.experimental.contentCollections, contentDir: getContentPaths(settings.config).contentDir, frontmatter: raw.data, diff --git a/packages/markdown/remark/package.json b/packages/markdown/remark/package.json index 8e60a06c3dbe..f8d2ec35e819 100644 --- a/packages/markdown/remark/package.json +++ b/packages/markdown/remark/package.json @@ -25,19 +25,11 @@ "test": "mocha --exit --timeout 20000" }, "dependencies": { - "@astrojs/micromark-extension-mdx-jsx": "^1.0.3", "@astrojs/prism": "^1.0.0", "acorn": "^8.7.1", - "acorn-jsx": "^5.3.2", "github-slugger": "^1.4.0", "hast-util-to-html": "^8.0.3", "import-meta-resolve": "^2.1.0", - "mdast-util-from-markdown": "^1.2.0", - "mdast-util-mdx-expression": "^1.2.1", - "mdast-util-mdx-jsx": "^1.2.0", - "micromark-extension-mdx-expression": "^1.0.3", - "micromark-extension-mdx-md": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", "rehype-raw": "^6.1.1", "rehype-stringify": "^9.0.3", "remark-gfm": "^3.0.1", @@ -46,7 +38,6 @@ "remark-smartypants": "^2.0.0", "shiki": "^0.11.1", "unified": "^10.1.2", - "unist-util-map": "^3.1.1", "unist-util-visit": "^4.1.0", "vfile": "^5.3.2" }, @@ -59,7 +50,6 @@ "@types/unist": "^2.0.6", "astro-scripts": "workspace:*", "chai": "^4.3.6", - "micromark-util-types": "^1.0.2", "mocha": "^9.2.2" } } diff --git a/packages/markdown/remark/src/index.ts b/packages/markdown/remark/src/index.ts index 24cffa287b9d..91680f3fd848 100644 --- a/packages/markdown/remark/src/index.ts +++ b/packages/markdown/remark/src/index.ts @@ -8,18 +8,10 @@ import type { import { toRemarkInitializeAstroData } from './frontmatter-injection.js'; import { loadPlugins } from './load-plugins.js'; import { rehypeHeadingIds } from './rehype-collect-headings.js'; -import rehypeEscape from './rehype-escape.js'; -import rehypeExpressions from './rehype-expressions.js'; -import rehypeIslands from './rehype-islands.js'; -import rehypeJsx from './rehype-jsx.js'; import toRemarkContentRelImageError from './remark-content-rel-image-error.js'; -import remarkEscape from './remark-escape.js'; -import remarkMarkAndUnravel from './remark-mark-and-unravel.js'; -import remarkMdxish from './remark-mdxish.js'; import remarkPrism from './remark-prism.js'; import scopedStyles from './remark-scoped-styles.js'; import remarkShiki from './remark-shiki.js'; -import remarkUnwrap from './remark-unwrap.js'; import rehypeRaw from 'rehype-raw'; import rehypeStringify from 'rehype-stringify'; @@ -61,7 +53,6 @@ export async function renderMarkdown( remarkRehype = markdownConfigDefaults.remarkRehype, gfm = markdownConfigDefaults.gfm, smartypants = markdownConfigDefaults.smartypants, - isAstroFlavoredMd = false, isExperimentalContentCollections = false, contentDir, frontmatter: userFrontmatter = {}, @@ -72,7 +63,7 @@ export async function renderMarkdown( let parser = unified() .use(markdown) .use(toRemarkInitializeAstroData({ userFrontmatter })) - .use(isAstroFlavoredMd ? [remarkMdxish, remarkMarkAndUnravel, remarkUnwrap, remarkEscape] : []); + .use([]); if (gfm) { parser.use(remarkGfm); @@ -109,15 +100,7 @@ export async function renderMarkdown( markdownToHtml as any, { allowDangerousHtml: true, - passThrough: isAstroFlavoredMd - ? [ - 'raw', - 'mdxFlowExpression', - 'mdxJsxFlowElement', - 'mdxJsxTextElement', - 'mdxTextExpression', - ] - : [], + passThrough: [], ...remarkRehype, }, ], @@ -127,13 +110,7 @@ export async function renderMarkdown( parser.use([[plugin, pluginOpts]]); }); - parser - .use( - isAstroFlavoredMd - ? [rehypeJsx, rehypeExpressions, rehypeEscape, rehypeIslands, rehypeHeadingIds] - : [rehypeHeadingIds, rehypeRaw] - ) - .use(rehypeStringify, { allowDangerousHtml: true }); + parser.use([rehypeHeadingIds, rehypeRaw]).use(rehypeStringify, { allowDangerousHtml: true }); let vfile: MarkdownVFile; try { diff --git a/packages/markdown/remark/src/mdast-util-mdxish.ts b/packages/markdown/remark/src/mdast-util-mdxish.ts deleted file mode 100644 index 10b19f5be0c9..000000000000 --- a/packages/markdown/remark/src/mdast-util-mdxish.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { mdxExpressionFromMarkdown, mdxExpressionToMarkdown } from 'mdast-util-mdx-expression'; -import { mdxJsxFromMarkdown, mdxJsxToMarkdown } from 'mdast-util-mdx-jsx'; - -export function mdxFromMarkdown(): any { - return [mdxExpressionFromMarkdown, mdxJsxFromMarkdown]; -} - -export function mdxToMarkdown(): any { - return { - extensions: [mdxExpressionToMarkdown, mdxJsxToMarkdown], - }; -} diff --git a/packages/markdown/remark/src/mdxjs.ts b/packages/markdown/remark/src/mdxjs.ts deleted file mode 100644 index c3a9849ea97a..000000000000 --- a/packages/markdown/remark/src/mdxjs.ts +++ /dev/null @@ -1,27 +0,0 @@ -// Note: The code in this file is based on `micromark-extension-mdxjs` -// and was adapted to use our fork `@astrojs/micromark-extension-mdx-jsx` -// instead of `micromark-extension-mdx-jsx` to allow some extended syntax. -// See `@astrojs/micromark-extension-mdx-jsx` on NPM for more details. -// Also, support for ESM imports & exports in Markdown content was removed. - -import { mdxJsx } from '@astrojs/micromark-extension-mdx-jsx'; -import { Parser } from 'acorn'; -import acornJsx from 'acorn-jsx'; -import type { Options } from 'micromark-extension-mdx-expression'; -import { mdxExpression } from 'micromark-extension-mdx-expression'; -import { mdxMd } from 'micromark-extension-mdx-md'; -import { combineExtensions } from 'micromark-util-combine-extensions'; -import type { Extension } from 'micromark-util-types'; - -export function mdxjs(options: Options): Extension { - const settings: any = Object.assign( - { - acorn: Parser.extend(acornJsx()), - acornOptions: { ecmaVersion: 2020, sourceType: 'module' }, - addResult: true, - }, - options - ); - - return combineExtensions([mdxExpression(settings), mdxJsx(settings), mdxMd]); -} diff --git a/packages/markdown/remark/src/rehype-collect-headings.ts b/packages/markdown/remark/src/rehype-collect-headings.ts index 03a3c6a23eae..142f796d6490 100644 --- a/packages/markdown/remark/src/rehype-collect-headings.ts +++ b/packages/markdown/remark/src/rehype-collect-headings.ts @@ -21,7 +21,6 @@ export function rehypeHeadingIds(): ReturnType { const depth = Number.parseInt(level); let text = ''; - let isJSX = false; visit(node, (child, __, parent) => { if (child.type === 'element' || parent == null) { return; @@ -36,31 +35,17 @@ export function rehypeHeadingIds(): ReturnType { text += child.value; } else { text += child.value.replace(/\{/g, '${'); - isJSX = isJSX || child.value.includes('{'); } } }); node.properties = node.properties || {}; if (typeof node.properties.id !== 'string') { - if (isJSX) { - // HACK: serialized JSX from internal plugins, ignore these for slug - const raw = toHtml(node.children, { allowDangerousHtml: true }) - .replace(/\n(<)/g, '<') - .replace(/(>)\n/g, '>'); - // HACK: for ids that have JSX content, use $$slug helper to generate slug at runtime - node.properties.id = `$$slug(\`${text}\`)`; - (node as any).type = 'raw'; - ( - node as any - ).value = `<${node.tagName} id={${node.properties.id}}>${raw}`; - } else { - let slug = slugger.slug(text); + let slug = slugger.slug(text); - if (slug.endsWith('-')) slug = slug.slice(0, -1); + if (slug.endsWith('-')) slug = slug.slice(0, -1); - node.properties.id = slug; - } + node.properties.id = slug; } headings.push({ depth, slug: node.properties.id, text }); diff --git a/packages/markdown/remark/src/rehype-escape.ts b/packages/markdown/remark/src/rehype-escape.ts deleted file mode 100644 index a4cc32cf724a..000000000000 --- a/packages/markdown/remark/src/rehype-escape.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { SKIP, visit } from 'unist-util-visit'; - -export function escapeEntities(value: string): string { - return value.replace(/&/g, '&').replace(//g, '>'); -} - -export default function rehypeEscape(): any { - return function (node: any): any { - return visit(node, 'element', (el) => { - if (el.tagName === 'code' || el.tagName === 'pre') { - el.properties['is:raw'] = true; - // Visit all raw children and escape HTML tags to prevent Markdown code - // like "This is a `