From 55efcddb44976850a65c869a97ec07ee5f0dd0ff Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Thu, 3 Feb 2022 20:25:14 -0300 Subject: [PATCH 1/8] Replaced "UnifiedPluginImport" for a function --- packages/markdown/remark/src/load-plugins.ts | 13 +++++++------ packages/markdown/remark/src/types.ts | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/markdown/remark/src/load-plugins.ts b/packages/markdown/remark/src/load-plugins.ts index b1e72ae361f5..a965297a7994 100644 --- a/packages/markdown/remark/src/load-plugins.ts +++ b/packages/markdown/remark/src/load-plugins.ts @@ -1,26 +1,27 @@ import * as unified from 'unified'; import type { Plugin, UnifiedPluginImport } from './types'; -async function importPlugin(p: string | UnifiedPluginImport): UnifiedPluginImport { +async function importPlugin(p: string | unified.Plugin): Promise { if (typeof p === 'string') { - return await import(p); + const importResult = await import(p); + return importResult.default; } - return await p; + return p; } -export function loadPlugins(items: Plugin[]): Promise<[unified.Plugin] | [unified.Plugin, any]>[] { +export function loadPlugins(items: Plugin[]): Promise<[unified.Plugin, any?]>[] { return items.map((p) => { return new Promise((resolve, reject) => { if (Array.isArray(p)) { const [plugin, opts] = p; return importPlugin(plugin) - .then((m) => resolve([m.default, opts])) + .then((m) => resolve([m, opts])) .catch((e) => reject(e)); } return importPlugin(p) - .then((m) => resolve([m.default])) + .then((m) => resolve([m])) .catch((e) => reject(e)); }); }); diff --git a/packages/markdown/remark/src/types.ts b/packages/markdown/remark/src/types.ts index 043594c9cbbb..88cb3e5f031d 100644 --- a/packages/markdown/remark/src/types.ts +++ b/packages/markdown/remark/src/types.ts @@ -2,7 +2,7 @@ import type * as unified from 'unified'; import type * as shiki from 'shiki'; export type UnifiedPluginImport = Promise<{ default: unified.Plugin }>; -export type Plugin = string | [string, any] | UnifiedPluginImport | [UnifiedPluginImport, any]; +export type Plugin = string | [string, any] | unified.Plugin | [unified.Plugin, any]; export interface AstroMarkdownOptions { mode?: 'md' | 'mdx'; From bcd523e1cb8df773c131b520bf5c456ed718884c Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Thu, 3 Feb 2022 20:25:29 -0300 Subject: [PATCH 2/8] Updated tests --- packages/astro/test/astro-markdown-plugins.test.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/astro/test/astro-markdown-plugins.test.js b/packages/astro/test/astro-markdown-plugins.test.js index aca9fcf7b1fe..adf0e719d724 100644 --- a/packages/astro/test/astro-markdown-plugins.test.js +++ b/packages/astro/test/astro-markdown-plugins.test.js @@ -2,6 +2,7 @@ import { expect } from 'chai'; import cheerio from 'cheerio'; import { loadFixture } from './test-utils.js'; import markdownRemark from '@astrojs/markdown-remark'; +import addClasses from '../../../examples/with-markdown-plugins/add-classes.mjs'; describe('Astro Markdown plugins', () => { let fixture; @@ -15,11 +16,7 @@ describe('Astro Markdown plugins', () => { markdownRemark, { remarkPlugins: ['remark-code-titles', ['rehype-autolink-headings', { behavior: 'prepend' }]], - rehypePlugins: [ - [import('rehype-toc'), { headings: ['h2', 'h3'] }], - [import('../../../examples/with-markdown-plugins/add-classes.mjs'), { 'h1,h2,h3': 'title' }], - 'rehype-slug', - ], + rehypePlugins: [[(await import('rehype-toc')).default, { headings: ['h2', 'h3'] }], [addClasses, { 'h1,h2,h3': 'title' }], 'rehype-slug'], }, ], }, From 9dfa2db46334497dd2a02630f1b8e6af963941d8 Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Thu, 3 Feb 2022 20:25:33 -0300 Subject: [PATCH 3/8] Updated docs --- docs/src/pages/en/guides/markdown-content.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/src/pages/en/guides/markdown-content.md b/docs/src/pages/en/guides/markdown-content.md index b5e33d5b28f3..6eb80d5e1f69 100644 --- a/docs/src/pages/en/guides/markdown-content.md +++ b/docs/src/pages/en/guides/markdown-content.md @@ -69,6 +69,8 @@ export default { You can provide names of the plugins as well as import them: ```js +import autolinkHeadings from 'remark-autolink-headings' + // astro.config.mjs export default { markdownOptions: { @@ -76,7 +78,7 @@ export default { '@astrojs/markdown-remark', { remarkPlugins: [ - [import('remark-autolink-headings'), { behavior: 'prepend' }], + [autolinkHeadings, { behavior: 'prepend' }], ], }, ], From 9c1ec9a05c9fac56b24c1fdd6cd8a5991d8b5626 Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Thu, 3 Feb 2022 20:25:38 -0300 Subject: [PATCH 4/8] Updated examples --- examples/with-markdown-plugins/astro.config.mjs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/examples/with-markdown-plugins/astro.config.mjs b/examples/with-markdown-plugins/astro.config.mjs index 0fbb40de63b3..908b64cb0365 100644 --- a/examples/with-markdown-plugins/astro.config.mjs +++ b/examples/with-markdown-plugins/astro.config.mjs @@ -6,6 +6,7 @@ // helpful tooltips, and warnings if your exported object is invalid. // You can disable this by removing "@ts-check" and `@type` comments below. import astroRemark from '@astrojs/markdown-remark'; +import addClasses from './add-classes.mjs'; // @ts-check export default /** @type {import('astro').AstroUserConfig} */ ({ @@ -15,12 +16,7 @@ export default /** @type {import('astro').AstroUserConfig} */ ({ astroRemark, { remarkPlugins: ['remark-code-titles'], - rehypePlugins: [ - ['rehype-autolink-headings', { behavior: 'prepend' }], - ['rehype-toc', { headings: ['h2', 'h3'] }], - [new URL('./add-classes.mjs', import.meta.url).pathname, { 'h1,h2,h3': 'title' }], - 'rehype-slug', - ], + rehypePlugins: [['rehype-autolink-headings', { behavior: 'prepend' }], ['rehype-toc', { headings: ['h2', 'h3'] }], [addClasses, { 'h1,h2,h3': 'title' }], 'rehype-slug'], }, ], }, From 4e08c405f3e9a05ca8df1fb7e455f0582db47ff1 Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Thu, 3 Feb 2022 20:37:11 -0300 Subject: [PATCH 5/8] Added changeset --- .changeset/curly-wasps-sin.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/curly-wasps-sin.md diff --git a/.changeset/curly-wasps-sin.md b/.changeset/curly-wasps-sin.md new file mode 100644 index 000000000000..274738d66bca --- /dev/null +++ b/.changeset/curly-wasps-sin.md @@ -0,0 +1,5 @@ +--- +'@astrojs/markdown-remark': patch +--- + +Now you can use local plugins by passing a function instead of an `import` From a5938099fe7e6a6060aad798448a07734f929f40 Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Thu, 3 Feb 2022 20:52:48 -0300 Subject: [PATCH 6/8] Fixed tests --- packages/astro/test/astro-markdown-plugins.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/test/astro-markdown-plugins.test.js b/packages/astro/test/astro-markdown-plugins.test.js index adf0e719d724..e5e5a809bd97 100644 --- a/packages/astro/test/astro-markdown-plugins.test.js +++ b/packages/astro/test/astro-markdown-plugins.test.js @@ -16,7 +16,7 @@ describe('Astro Markdown plugins', () => { markdownRemark, { remarkPlugins: ['remark-code-titles', ['rehype-autolink-headings', { behavior: 'prepend' }]], - rehypePlugins: [[(await import('rehype-toc')).default, { headings: ['h2', 'h3'] }], [addClasses, { 'h1,h2,h3': 'title' }], 'rehype-slug'], + rehypePlugins: [['rehype-toc', { headings: ['h2', 'h3'] }], [addClasses, { 'h1,h2,h3': 'title' }], 'rehype-slug'], }, ], }, From 7b6eb59113a6fce03180f048ee61ed456657f93b Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Thu, 3 Feb 2022 21:15:30 -0300 Subject: [PATCH 7/8] Removed unused "UnifiedPluginImport" --- packages/markdown/remark/src/load-plugins.ts | 2 +- packages/markdown/remark/src/types.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/markdown/remark/src/load-plugins.ts b/packages/markdown/remark/src/load-plugins.ts index a965297a7994..139eeaf19d7b 100644 --- a/packages/markdown/remark/src/load-plugins.ts +++ b/packages/markdown/remark/src/load-plugins.ts @@ -1,5 +1,5 @@ import * as unified from 'unified'; -import type { Plugin, UnifiedPluginImport } from './types'; +import type { Plugin } from './types'; async function importPlugin(p: string | unified.Plugin): Promise { if (typeof p === 'string') { diff --git a/packages/markdown/remark/src/types.ts b/packages/markdown/remark/src/types.ts index 88cb3e5f031d..94c3e78a3257 100644 --- a/packages/markdown/remark/src/types.ts +++ b/packages/markdown/remark/src/types.ts @@ -1,7 +1,6 @@ import type * as unified from 'unified'; import type * as shiki from 'shiki'; -export type UnifiedPluginImport = Promise<{ default: unified.Plugin }>; export type Plugin = string | [string, any] | unified.Plugin | [unified.Plugin, any]; export interface AstroMarkdownOptions { From 12e2aee545d01c256831ed3c1e8a48f0284b0edd Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Fri, 4 Feb 2022 13:03:01 -0300 Subject: [PATCH 8/8] Duplicated add-classes.mjs --- packages/astro/package.json | 1 + .../astro/test/astro-markdown-plugins.test.js | 2 +- .../astro-markdown-plugins/add-classes.mjs | 18 ++++++++++++++++++ yarn.lock | 2 +- 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 packages/astro/test/fixtures/astro-markdown-plugins/add-classes.mjs diff --git a/packages/astro/package.json b/packages/astro/package.json index 09df48cbe067..ceac177e805e 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -125,6 +125,7 @@ "@types/yargs-parser": "^20.2.1", "chai": "^4.3.4", "cheerio": "^1.0.0-rc.10", + "hast-util-select": "^5.0.1", "mocha": "^9.1.3", "vite": "~2.6.10" }, diff --git a/packages/astro/test/astro-markdown-plugins.test.js b/packages/astro/test/astro-markdown-plugins.test.js index e5e5a809bd97..ee780a738ef5 100644 --- a/packages/astro/test/astro-markdown-plugins.test.js +++ b/packages/astro/test/astro-markdown-plugins.test.js @@ -2,7 +2,7 @@ import { expect } from 'chai'; import cheerio from 'cheerio'; import { loadFixture } from './test-utils.js'; import markdownRemark from '@astrojs/markdown-remark'; -import addClasses from '../../../examples/with-markdown-plugins/add-classes.mjs'; +import addClasses from './fixtures/astro-markdown-plugins/add-classes.mjs'; describe('Astro Markdown plugins', () => { let fixture; diff --git a/packages/astro/test/fixtures/astro-markdown-plugins/add-classes.mjs b/packages/astro/test/fixtures/astro-markdown-plugins/add-classes.mjs new file mode 100644 index 000000000000..39acabd52670 --- /dev/null +++ b/packages/astro/test/fixtures/astro-markdown-plugins/add-classes.mjs @@ -0,0 +1,18 @@ +import { selectAll } from 'hast-util-select'; + +export default (additions) => { + const adders = Object.entries(additions).map(adder); + return (node) => adders.forEach((a) => a(node)); +}; + +const adder = ([selector, className]) => { + const writer = write(className); + return (node) => selectAll(selector, node).forEach(writer); +}; + +const write = + (className) => + ({ properties }) => { + if (!properties.className) properties.className = className; + else properties.className += ` ${className}`; + }; diff --git a/yarn.lock b/yarn.lock index fce23a986f99..57fa86926325 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4978,7 +4978,7 @@ hast-util-raw@^7.2.0: web-namespaces "^2.0.0" zwitch "^2.0.0" -hast-util-select@5.0.1: +hast-util-select@5.0.1, hast-util-select@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/hast-util-select/-/hast-util-select-5.0.1.tgz#ed3788ad1a8d2d7f16a6bf8153ce9378edbe9d6d" integrity sha512-cxnImmR/tN/ipvbwGrKtEErmy83K1xWx8Bu7nImiwTOJ7X/fW1X6L1241ux+MYUXDwx8GxrE4LVmXRlEnbQsQA==