From 2b4dabb16b788f9121b29c00656e9052aecf31e4 Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Fri, 21 Oct 2022 21:30:15 +0000 Subject: [PATCH 01/15] fix: add `.markdown ` file extension support adds `.markdown` file extension support for markdown files --- packages/astro-rss/src/index.ts | 4 ++-- packages/astro/client-base.d.ts | 16 ++++++++++++++++ packages/astro/src/@types/astro.ts | 6 ++++-- packages/astro/src/core/build/graph.ts | 2 +- packages/astro/src/core/config/settings.ts | 2 +- packages/astro/src/core/render/dev/vite.ts | 2 +- .../astro/src/core/routing/manifest/create.ts | 7 ++++++- .../src/vite-plugin-astro-postprocess/index.ts | 4 ++-- packages/astro/src/vite-plugin-jsx/index.ts | 2 +- .../src/vite-plugin-markdown-legacy/index.ts | 16 +++++++++++----- packages/astro/src/vite-plugin-markdown/index.ts | 4 ++-- packages/integrations/mdx/src/index.ts | 2 +- 12 files changed, 48 insertions(+), 19 deletions(-) diff --git a/packages/astro-rss/src/index.ts b/packages/astro-rss/src/index.ts index feb4d258c642..806b8c93d660 100644 --- a/packages/astro-rss/src/index.ts +++ b/packages/astro-rss/src/index.ts @@ -17,7 +17,7 @@ type RSSOptions = { /** * List of RSS feed items to render. Accepts either: * a) list of RSSFeedItems - * b) import.meta.glob result. You can only glob ".md" files within src/pages/ when using this method! + * b) import.meta.glob result. You can only glob ".md" or ".markdown" files within src/pages/ when using this method! */ items: RSSFeedItem[] | GlobResult; /** Specify arbitrary metadata on opening tag */ @@ -58,7 +58,7 @@ function mapGlobResult(items: GlobResult): Promise { const { url, frontmatter } = await getInfo(); if (url === undefined || url === null) { throw new Error( - `[RSS] When passing an import.meta.glob result directly, you can only glob ".md" files within /pages! Consider mapping the result to an array of RSSFeedItems. See the RSS docs for usage examples: https://docs.astro.build/en/guides/rss/#2-list-of-rss-feed-objects` + `[RSS] When passing an import.meta.glob result directly, you can only glob ".md" or ".markdown" files within /pages! Consider mapping the result to an array of RSSFeedItems. See the RSS docs for usage examples: https://docs.astro.build/en/guides/rss/#2-list-of-rss-feed-objects` ); } if (!Boolean(frontmatter.title) || !Boolean(frontmatter.pubDate)) { diff --git a/packages/astro/client-base.d.ts b/packages/astro/client-base.d.ts index 829033923bbc..ef1cc5ae6522 100644 --- a/packages/astro/client-base.d.ts +++ b/packages/astro/client-base.d.ts @@ -16,6 +16,22 @@ declare module '*.md' { const load: MD['default']; export default load; } +declare module '*.markdown' { + type MD = import('./dist/@types/astro').MarkdownInstance>; + + export const frontmatter: MD['frontmatter']; + export const file: MD['file']; + export const url: MD['url']; + export const getHeadings: MD['getHeadings']; + /** @deprecated Renamed to `getHeadings()` */ + export const getHeaders: () => void; + export const Content: MD['Content']; + export const rawContent: MD['rawContent']; + export const compiledContent: MD['compiledContent']; + + const load: MD['default']; + export default load; +} declare module '*.mdx' { type MDX = import('./dist/@types/astro').MDXInstance>; diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index e0954afae346..0e077cde6a41 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -264,7 +264,9 @@ export interface AstroGlobalPartial { * [Astro reference](https://docs.astro.build/en/reference/api-reference/#astroglob) */ glob(globStr: `${any}.astro`): Promise; - glob>(globStr: `${any}.md`): Promise[]>; + glob>( + globStr: `${any}.md` | `${any}.markdown` + ): Promise[]>; glob>(globStr: `${any}.mdx`): Promise[]>; glob>(globStr: string): Promise; /** @@ -868,7 +870,7 @@ export interface AstroUserConfig { * @default `false` * @version 1.0.0-rc.1 * @description - * Enable Astro's pre-v1.0 support for components and JSX expressions in `.md` Markdown files. + * Enable Astro's pre-v1.0 support for components and JSX expressions in `.md` and `.markdown` Markdown files. * In Astro `1.0.0-rc`, this original behavior was removed as the default, in favor of our new [MDX integration](/en/guides/integrations-guide/mdx/). * * To enable this behavior, set `legacy.astroFlavoredMarkdown` to `true` in your [`astro.config.mjs` configuration file](/en/guides/configuring-astro/#the-astro-config-file). diff --git a/packages/astro/src/core/build/graph.ts b/packages/astro/src/core/build/graph.ts index 819d76589de5..e168305d5e1d 100644 --- a/packages/astro/src/core/build/graph.ts +++ b/packages/astro/src/core/build/graph.ts @@ -32,7 +32,7 @@ export function moduleIsTopLevelPage(info: ModuleInfo): boolean { } // This function walks the dependency graph, going up until it finds a page component. -// This could be a .astro page or a .md page. +// This could be a .astro page, a .markdown or a .md page. export function* getTopLevelPages( id: string, ctx: { getModuleInfo: GetModuleInfo } diff --git a/packages/astro/src/core/config/settings.ts b/packages/astro/src/core/config/settings.ts index 8b7bfbec88f0..b28b90e7dd89 100644 --- a/packages/astro/src/core/config/settings.ts +++ b/packages/astro/src/core/config/settings.ts @@ -13,7 +13,7 @@ export function createSettings(config: AstroConfig, cwd?: string): AstroSettings adapter: undefined, injectedRoutes: [], - pageExtensions: ['.astro', '.md', '.html'], + pageExtensions: ['.astro', '.md', '.html', '.markdown'], renderers: [jsxRenderer], scripts: [], watchFiles: tsconfig?.exists ? [tsconfig.path, ...tsconfig.extendedPaths] : [], diff --git a/packages/astro/src/core/render/dev/vite.ts b/packages/astro/src/core/render/dev/vite.ts index 479b3b99b5bd..482b3e5d7a6b 100644 --- a/packages/astro/src/core/render/dev/vite.ts +++ b/packages/astro/src/core/render/dev/vite.ts @@ -7,7 +7,7 @@ import { STYLE_EXTENSIONS } from '../util.js'; * List of file extensions signalling we can (and should) SSR ahead-of-time * See usage below */ -const fileExtensionsToSSR = new Set(['.astro', '.md']); +const fileExtensionsToSSR = new Set(['.astro', '.md', '.markdown']); const STRIP_QUERY_PARAMS_REGEX = /\?.*$/; diff --git a/packages/astro/src/core/routing/manifest/create.ts b/packages/astro/src/core/routing/manifest/create.ts index 6a28b33d2b7e..3327dcfb7859 100644 --- a/packages/astro/src/core/routing/manifest/create.ts +++ b/packages/astro/src/core/routing/manifest/create.ts @@ -206,7 +206,12 @@ export function createRouteManifest( ): ManifestData { const components: string[] = []; const routes: RouteData[] = []; - const validPageExtensions: Set = new Set(['.astro', '.md', ...settings.pageExtensions]); + const validPageExtensions: Set = new Set([ + '.astro', + '.md', + '.markdown', + ...settings.pageExtensions, + ]); const validEndpointExtensions: Set = new Set(['.js', '.ts']); function walk(dir: string, parentSegments: RoutePart[][], parentParams: string[]) { diff --git a/packages/astro/src/vite-plugin-astro-postprocess/index.ts b/packages/astro/src/vite-plugin-astro-postprocess/index.ts index 16eab866250e..3c3ab92e9c4e 100644 --- a/packages/astro/src/vite-plugin-astro-postprocess/index.ts +++ b/packages/astro/src/vite-plugin-astro-postprocess/index.ts @@ -16,8 +16,8 @@ export default function astro(_opts: AstroPluginOptions): Plugin { return { name: 'astro:postprocess', async transform(code, id) { - // Currently only supported in ".astro" & ".md" files - if (!id.endsWith('.astro') && !id.endsWith('.md')) { + // Currently only supported in ".astro", ".md" & ".markdown" files + if (!id.endsWith('.astro') && !id.endsWith('.md') && !id.endsWith('.markdown')) { return null; } diff --git a/packages/astro/src/vite-plugin-jsx/index.ts b/packages/astro/src/vite-plugin-jsx/index.ts index 357e441f6c7a..2f56e7fd2a46 100644 --- a/packages/astro/src/vite-plugin-jsx/index.ts +++ b/packages/astro/src/vite-plugin-jsx/index.ts @@ -193,7 +193,7 @@ export default function jsx({ settings, logging }: AstroPluginJSXOptions): Plugi const { mode } = viteConfig; // Shortcut: only use Astro renderer for MD and MDX files - if (id.includes('.mdx') || id.includes('.md')) { + if (id.includes('.mdx') || id.includes('.md') || id.includes('.markdown')) { const { code: jsxCode } = await esbuild.transform(code, { loader: getEsbuildLoader(path.extname(id)) as esbuild.Loader, jsx: 'preserve', diff --git a/packages/astro/src/vite-plugin-markdown-legacy/index.ts b/packages/astro/src/vite-plugin-markdown-legacy/index.ts index 3e0ff307bec3..ba76afbc37a6 100644 --- a/packages/astro/src/vite-plugin-markdown-legacy/index.ts +++ b/packages/astro/src/vite-plugin-markdown-legacy/index.ts @@ -79,10 +79,13 @@ export default function markdown({ settings }: AstroPluginOptions): Plugin { styleTransformer.viteDevServer = server; }, async resolveId(id, importer, options) { - // Resolve any .md files with the `?content` cache buster. This should only come from + // Resolve any .md or .markdown files with the `?content` cache buster. This should only come from // an already-resolved JS module wrapper. Needed to prevent infinite loops in Vite. // Unclear if this is expected or if cache busting is just working around a Vite bug. - if (id.endsWith(`.md${MARKDOWN_CONTENT_FLAG}`)) { + if ( + id.endsWith(`.md${MARKDOWN_CONTENT_FLAG}`) || + id.endsWith(`.markdown${MARKDOWN_CONTENT_FLAG}`) + ) { const resolvedId = await this.resolve(id, importer, { skipSelf: true, ...options }); return resolvedId?.id.replace(MARKDOWN_CONTENT_FLAG, ''); } @@ -90,7 +93,7 @@ export default function markdown({ settings }: AstroPluginOptions): Plugin { // that defers the markdown -> HTML rendering until it is needed. This is especially useful // when fetching and then filtering many markdown files, like with import.meta.glob() or Astro.glob(). // Otherwise, resolve directly to the actual component. - if (id.endsWith('.md') && !isRootImport(importer)) { + if ((id.endsWith('.md') || id.endsWith('.markdown')) && !isRootImport(importer)) { const resolvedId = await this.resolve(id, importer, { skipSelf: true, ...options }); if (resolvedId) { return resolvedId.id + MARKDOWN_IMPORT_FLAG; @@ -103,7 +106,10 @@ export default function markdown({ settings }: AstroPluginOptions): Plugin { // A markdown file has been imported via ESM! // Return the file's JS representation, including all Markdown // frontmatter and a deferred `import() of the compiled markdown content. - if (id.endsWith(`.md${MARKDOWN_IMPORT_FLAG}`)) { + if ( + id.endsWith(`.md${MARKDOWN_IMPORT_FLAG}`) || + id.endsWith(`.markdown${MARKDOWN_IMPORT_FLAG}`) + ) { const { fileId, fileUrl } = getFileInfo(id, config); const source = await fs.promises.readFile(fileId, 'utf8'); @@ -143,7 +149,7 @@ export default function markdown({ settings }: AstroPluginOptions): Plugin { // A markdown file is being rendered! This markdown file was either imported // directly as a page in Vite, or it was a deferred render from a JS module. // This returns the compiled markdown -> astro component that renders to HTML. - if (id.endsWith('.md')) { + if (id.endsWith('.md') || id.endsWith('.markdown')) { const filename = normalizeFilename(id); const source = await fs.promises.readFile(filename, 'utf8'); const renderOpts = config.markdown; diff --git a/packages/astro/src/vite-plugin-markdown/index.ts b/packages/astro/src/vite-plugin-markdown/index.ts index 26757e08401b..7e2b65abf075 100644 --- a/packages/astro/src/vite-plugin-markdown/index.ts +++ b/packages/astro/src/vite-plugin-markdown/index.ts @@ -39,7 +39,7 @@ export default function markdown({ settings, logging }: AstroPluginOptions): Plu // passing to the transform hook. This lets us get the truly raw value // to escape "import.meta.env" ourselves. async load(id) { - if (id.endsWith('.md')) { + if (id.endsWith('.md') || id.endsWith('.markdown')) { const { fileId, fileUrl } = getFileInfo(id, settings.config); const rawFile = await fs.promises.readFile(fileId, 'utf-8'); const raw = safeMatter(rawFile, id); @@ -63,7 +63,7 @@ export default function markdown({ settings, logging }: AstroPluginOptions): Plu warn( logging, 'markdown', - `[${id}] Astro now supports MDX! Support for components in ".md" files using the "setup" frontmatter is no longer enabled by default. Migrate this file to MDX or add the "legacy.astroFlavoredMarkdown" config flag to re-enable support.` + `[${id}] Astro now supports MDX! Support for components in ".md" or ".markdown" files using the "setup" frontmatter is no longer enabled by default. Migrate this file to MDX or add the "legacy.astroFlavoredMarkdown" config flag to re-enable support.` ); } diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index eb769535a4dd..08b6dc41495e 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -66,7 +66,7 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { rehypePlugins: getRehypePlugins(mdxOptions, config), jsx: true, jsxImportSource: 'astro', - // Note: disable `.md` support + // Note: disable `.md` and `.markdown` support format: 'mdx', mdExtensions: [], }; From 56ee093923942a6b43d2859768b94efa4d3e2f4a Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Sat, 22 Oct 2022 00:18:07 +0000 Subject: [PATCH 02/15] test: add test case --- packages/astro/test/astro-markdown.test.js | 6 ++++++ .../src/pages/page-with-markdown-extension.markdown | 3 +++ 2 files changed, 9 insertions(+) create mode 100644 packages/astro/test/fixtures/astro-markdown/src/pages/page-with-markdown-extension.markdown diff --git a/packages/astro/test/astro-markdown.test.js b/packages/astro/test/astro-markdown.test.js index 59eb07822d9c..9bf4e72f8d2c 100644 --- a/packages/astro/test/astro-markdown.test.js +++ b/packages/astro/test/astro-markdown.test.js @@ -14,6 +14,12 @@ describe('Astro Markdown', () => { await fixture.build(); }); + it('Can process `.markdown` files', async () => { + const html = await fixture.readFile('/page-with-markdown-extension/index.html'); + const $ = cheerio.load(html); + expect($('h1').html()).to.equal('Page with markdown extension'); + }); + it('Leaves JSX expressions unprocessed', async () => { const html = await fixture.readFile('/jsx-expressions/index.html'); const $ = cheerio.load(html); diff --git a/packages/astro/test/fixtures/astro-markdown/src/pages/page-with-markdown-extension.markdown b/packages/astro/test/fixtures/astro-markdown/src/pages/page-with-markdown-extension.markdown new file mode 100644 index 000000000000..30b50d000a2a --- /dev/null +++ b/packages/astro/test/fixtures/astro-markdown/src/pages/page-with-markdown-extension.markdown @@ -0,0 +1,3 @@ +# Page with markdown extension + +Hope this loads fine 🤞 From acb3adf9491b33fbcb038b71c6c8e401dca5ec1e Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Sat, 22 Oct 2022 00:48:07 +0000 Subject: [PATCH 03/15] chore: adds changeset --- .changeset/spicy-cameras-rush.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/spicy-cameras-rush.md diff --git a/.changeset/spicy-cameras-rush.md b/.changeset/spicy-cameras-rush.md new file mode 100644 index 000000000000..dca285b6b055 --- /dev/null +++ b/.changeset/spicy-cameras-rush.md @@ -0,0 +1,7 @@ +--- +'astro': patch +'@astrojs/rss': patch +'@astrojs/mdx': patch +--- + +Support `.markdown` file extension for markdown files From 132cef350cf75c0e800f1afd719dcc99950e12af Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Sat, 22 Oct 2022 01:38:22 +0000 Subject: [PATCH 04/15] test: move test and fixture to relevant locations --- packages/astro/test/astro-markdown.test.js | 6 ------ .../src/pages/page-with-markdown-extension.markdown | 0 packages/astro/test/markdown.test.js | 7 +++++++ 3 files changed, 7 insertions(+), 6 deletions(-) rename packages/astro/test/fixtures/{astro-markdown => markdown}/src/pages/page-with-markdown-extension.markdown (100%) diff --git a/packages/astro/test/astro-markdown.test.js b/packages/astro/test/astro-markdown.test.js index 9bf4e72f8d2c..59eb07822d9c 100644 --- a/packages/astro/test/astro-markdown.test.js +++ b/packages/astro/test/astro-markdown.test.js @@ -14,12 +14,6 @@ describe('Astro Markdown', () => { await fixture.build(); }); - it('Can process `.markdown` files', async () => { - const html = await fixture.readFile('/page-with-markdown-extension/index.html'); - const $ = cheerio.load(html); - expect($('h1').html()).to.equal('Page with markdown extension'); - }); - it('Leaves JSX expressions unprocessed', async () => { const html = await fixture.readFile('/jsx-expressions/index.html'); const $ = cheerio.load(html); diff --git a/packages/astro/test/fixtures/astro-markdown/src/pages/page-with-markdown-extension.markdown b/packages/astro/test/fixtures/markdown/src/pages/page-with-markdown-extension.markdown similarity index 100% rename from packages/astro/test/fixtures/astro-markdown/src/pages/page-with-markdown-extension.markdown rename to packages/astro/test/fixtures/markdown/src/pages/page-with-markdown-extension.markdown diff --git a/packages/astro/test/markdown.test.js b/packages/astro/test/markdown.test.js index dd5d089400d0..dfb2c070f10c 100644 --- a/packages/astro/test/markdown.test.js +++ b/packages/astro/test/markdown.test.js @@ -17,6 +17,13 @@ describe('Markdown tests', () => { await fixture.build(); }); + it('Can load a `.markdown` file', async () => { + const html = await fixture.readFile('/page-with-markdown-extension/index.html'); + const $ = cheerio.load(html); + expect($('h1').html()).to.equal('Page with markdown extension'); + expect($('p').html()).to.equal('Hope this loads fine 🤞'); + }); + it('Can load a simple markdown page with Astro', async () => { const html = await fixture.readFile('/post/index.html'); const $ = cheerio.load(html); From 4affcb6a9f27ee20f833cccb5ff5bb8afeb298eb Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Sun, 23 Oct 2022 13:34:43 +0000 Subject: [PATCH 05/15] test: update test --- packages/astro-rss/test/rss.test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/astro-rss/test/rss.test.js b/packages/astro-rss/test/rss.test.js index 5c33905a5404..224fdc586ae0 100644 --- a/packages/astro-rss/test/rss.test.js +++ b/packages/astro-rss/test/rss.test.js @@ -198,7 +198,9 @@ describe('rss', () => { }); chai.expect(false).to.equal(true, 'Should have errored'); } catch (err) { - chai.expect(err.message).to.contain('you can only glob ".md" files within /pages'); + chai + .expect(err.message) + .to.contain('you can only glob ".md" or ".markdown" files within /pages'); } }); }); From 2b62ad1d320de64158bc7b580b21d1864c9fe46b Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Mon, 24 Oct 2022 17:30:06 +0000 Subject: [PATCH 06/15] feat: add multiple markdown file extension support --- packages/astro-rss/src/index.ts | 4 ++-- packages/astro/src/@types/astro.ts | 8 ++++++-- packages/astro/src/core/build/graph.ts | 2 +- packages/astro/src/core/config/settings.ts | 3 ++- packages/astro/src/core/constants.ts | 10 ++++++++++ packages/astro/src/core/render/dev/vite.ts | 3 ++- .../astro/src/core/routing/manifest/create.ts | 4 ++-- packages/astro/src/core/util.ts | 18 ++++++++++++++++++ .../src/vite-plugin-astro-postprocess/index.ts | 5 +++-- packages/astro/src/vite-plugin-jsx/index.ts | 4 ++-- .../src/vite-plugin-markdown-legacy/index.ts | 17 ++++++----------- .../astro/src/vite-plugin-markdown/index.ts | 5 +++-- packages/integrations/mdx/src/index.ts | 2 +- 13 files changed, 58 insertions(+), 27 deletions(-) diff --git a/packages/astro-rss/src/index.ts b/packages/astro-rss/src/index.ts index 806b8c93d660..f90f39287355 100644 --- a/packages/astro-rss/src/index.ts +++ b/packages/astro-rss/src/index.ts @@ -17,7 +17,7 @@ type RSSOptions = { /** * List of RSS feed items to render. Accepts either: * a) list of RSSFeedItems - * b) import.meta.glob result. You can only glob ".md" or ".markdown" files within src/pages/ when using this method! + * b) import.meta.glob result. You can only glob ".md" (or alternative extensions for markdown files like ".markdown") files within src/pages/ when using this method! */ items: RSSFeedItem[] | GlobResult; /** Specify arbitrary metadata on opening tag */ @@ -58,7 +58,7 @@ function mapGlobResult(items: GlobResult): Promise { const { url, frontmatter } = await getInfo(); if (url === undefined || url === null) { throw new Error( - `[RSS] When passing an import.meta.glob result directly, you can only glob ".md" or ".markdown" files within /pages! Consider mapping the result to an array of RSSFeedItems. See the RSS docs for usage examples: https://docs.astro.build/en/guides/rss/#2-list-of-rss-feed-objects` + `[RSS] When passing an import.meta.glob result directly, you can only glob ".md" (or alternative extensions for markdown files like ".markdown") files within /pages! Consider mapping the result to an array of RSSFeedItems. See the RSS docs for usage examples: https://docs.astro.build/en/guides/rss/#2-list-of-rss-feed-objects` ); } if (!Boolean(frontmatter.title) || !Boolean(frontmatter.pubDate)) { diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 0e077cde6a41..5cb6fb857efa 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -1,3 +1,4 @@ +import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from './../core/constants.js'; import type { MarkdownHeading, MarkdownMetadata, @@ -246,6 +247,9 @@ export interface AstroGlobal = Record; glob>( - globStr: `${any}.md` | `${any}.markdown` + globStr: `${any}${MarkdowFileExtension}` ): Promise[]>; glob>(globStr: `${any}.mdx`): Promise[]>; glob>(globStr: string): Promise; @@ -870,7 +874,7 @@ export interface AstroUserConfig { * @default `false` * @version 1.0.0-rc.1 * @description - * Enable Astro's pre-v1.0 support for components and JSX expressions in `.md` and `.markdown` Markdown files. + * Enable Astro's pre-v1.0 support for components and JSX expressions in `.md` (and alternative extensions for markdown files like ".markdown") Markdown files. * In Astro `1.0.0-rc`, this original behavior was removed as the default, in favor of our new [MDX integration](/en/guides/integrations-guide/mdx/). * * To enable this behavior, set `legacy.astroFlavoredMarkdown` to `true` in your [`astro.config.mjs` configuration file](/en/guides/configuring-astro/#the-astro-config-file). diff --git a/packages/astro/src/core/build/graph.ts b/packages/astro/src/core/build/graph.ts index e168305d5e1d..a667ac428234 100644 --- a/packages/astro/src/core/build/graph.ts +++ b/packages/astro/src/core/build/graph.ts @@ -32,7 +32,7 @@ export function moduleIsTopLevelPage(info: ModuleInfo): boolean { } // This function walks the dependency graph, going up until it finds a page component. -// This could be a .astro page, a .markdown or a .md page. +// This could be a .astro page, a .markdown or a .md (or really any file extension for markdown files) page. export function* getTopLevelPages( id: string, ctx: { getModuleInfo: GetModuleInfo } diff --git a/packages/astro/src/core/config/settings.ts b/packages/astro/src/core/config/settings.ts index b28b90e7dd89..017e8e3603be 100644 --- a/packages/astro/src/core/config/settings.ts +++ b/packages/astro/src/core/config/settings.ts @@ -1,3 +1,4 @@ +import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from './../constants'; import type { AstroConfig, AstroSettings } from '../../@types/astro'; import jsxRenderer from '../../jsx/renderer.js'; @@ -13,7 +14,7 @@ export function createSettings(config: AstroConfig, cwd?: string): AstroSettings adapter: undefined, injectedRoutes: [], - pageExtensions: ['.astro', '.md', '.html', '.markdown'], + pageExtensions: ['.astro', '.html', ...SUPPORTED_MARKDOWN_FILE_EXTENSIONS], renderers: [jsxRenderer], scripts: [], watchFiles: tsconfig?.exists ? [tsconfig.path, ...tsconfig.extendedPaths] : [], diff --git a/packages/astro/src/core/constants.ts b/packages/astro/src/core/constants.ts index 15c5d34e4add..16dde75509e4 100644 --- a/packages/astro/src/core/constants.ts +++ b/packages/astro/src/core/constants.ts @@ -1,2 +1,12 @@ // process.env.PACKAGE_VERSION is injected when we build and publish the astro package. export const ASTRO_VERSION = process.env.PACKAGE_VERSION ?? 'development'; + +// possible extensions for markdown files +export const SUPPORTED_MARKDOWN_FILE_EXTENSIONS = [ + '.markdown', + '.mdown', + '.mkdn', + '.mkd', + '.mdwn', + '.md', +] as const; diff --git a/packages/astro/src/core/render/dev/vite.ts b/packages/astro/src/core/render/dev/vite.ts index 482b3e5d7a6b..e98fc87d1c4a 100644 --- a/packages/astro/src/core/render/dev/vite.ts +++ b/packages/astro/src/core/render/dev/vite.ts @@ -1,5 +1,6 @@ import npath from 'path'; import vite from 'vite'; +import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from '../../constants.js'; import { unwrapId } from '../../util.js'; import { STYLE_EXTENSIONS } from '../util.js'; @@ -7,7 +8,7 @@ import { STYLE_EXTENSIONS } from '../util.js'; * List of file extensions signalling we can (and should) SSR ahead-of-time * See usage below */ -const fileExtensionsToSSR = new Set(['.astro', '.md', '.markdown']); +const fileExtensionsToSSR = new Set(['.astro', ...SUPPORTED_MARKDOWN_FILE_EXTENSIONS]); const STRIP_QUERY_PARAMS_REGEX = /\?.*$/; diff --git a/packages/astro/src/core/routing/manifest/create.ts b/packages/astro/src/core/routing/manifest/create.ts index 3327dcfb7859..7a9c62798686 100644 --- a/packages/astro/src/core/routing/manifest/create.ts +++ b/packages/astro/src/core/routing/manifest/create.ts @@ -17,6 +17,7 @@ import { warn } from '../../logger/core.js'; import { removeLeadingForwardSlash } from '../../path.js'; import { resolvePages } from '../../util.js'; import { getRouteGenerator } from './generator.js'; +import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from '../../constants.js'; const require = createRequire(import.meta.url); interface Item { @@ -208,8 +209,7 @@ export function createRouteManifest( const routes: RouteData[] = []; const validPageExtensions: Set = new Set([ '.astro', - '.md', - '.markdown', + ...SUPPORTED_MARKDOWN_FILE_EXTENSIONS, ...settings.pageExtensions, ]); const validEndpointExtensions: Set = new Set(['.js', '.ts']); diff --git a/packages/astro/src/core/util.ts b/packages/astro/src/core/util.ts index 54681f3d09b3..0e76b3f55497 100644 --- a/packages/astro/src/core/util.ts +++ b/packages/astro/src/core/util.ts @@ -7,6 +7,7 @@ import { fileURLToPath, pathToFileURL } from 'url'; import { ErrorPayload, normalizePath, ViteDevServer } from 'vite'; import type { AstroConfig, AstroSettings, RouteType } from '../@types/astro'; import { prependForwardSlash, removeTrailingForwardSlash } from './path.js'; +import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from './constants'; /** Returns true if argument is an object of any prototype/class (but not null). */ export function isObject(value: unknown): value is Record { @@ -17,6 +18,23 @@ export function isObject(value: unknown): value is Record { export function isURL(value: unknown): value is URL { return Object.prototype.toString.call(value) === '[object URL]'; } +/** Check if a file is a markdown file based on its extension */ +export function isMarkdownFile( + fileId: string, + option: { criteria: 'endsWith' | 'includes'; suffix?: string } +): boolean { + const _suffix = option.suffix ?? ''; + if (option.criteria === 'endsWith') { + for (let markdownFileExtension of SUPPORTED_MARKDOWN_FILE_EXTENSIONS) { + if (fileId.endsWith(`${markdownFileExtension}${_suffix}`)) return true; + } + return false; + } + for (let markdownFileExtension of SUPPORTED_MARKDOWN_FILE_EXTENSIONS) { + if (fileId.includes(`${markdownFileExtension}${_suffix}`)) return true; + } + return false; +} /** Wraps an object in an array. If an array is passed, ignore it. */ export function arraify(target: T | T[]): T[] { diff --git a/packages/astro/src/vite-plugin-astro-postprocess/index.ts b/packages/astro/src/vite-plugin-astro-postprocess/index.ts index 3c3ab92e9c4e..4a1a41c5d336 100644 --- a/packages/astro/src/vite-plugin-astro-postprocess/index.ts +++ b/packages/astro/src/vite-plugin-astro-postprocess/index.ts @@ -4,6 +4,7 @@ import type { NodePath } from 'ast-types/lib/node-path'; import { parse, print, types, visit } from 'recast'; import type { Plugin } from 'vite'; import type { AstroSettings } from '../@types/astro'; +import { isMarkdownFile } from '../core/util'; // Check for `Astro.glob()`. Be very forgiving of whitespace. False positives are okay. const ASTRO_GLOB_REGEX = /Astro2?\s*\.\s*glob\s*\(/; @@ -16,8 +17,8 @@ export default function astro(_opts: AstroPluginOptions): Plugin { return { name: 'astro:postprocess', async transform(code, id) { - // Currently only supported in ".astro", ".md" & ".markdown" files - if (!id.endsWith('.astro') && !id.endsWith('.md') && !id.endsWith('.markdown')) { + // Currently only supported in ".astro" and ".md" (or any alternative markdown file extension like `.markdown`) files + if (!id.endsWith('.astro') && !isMarkdownFile(id, { criteria: 'endsWith' })) { return null; } diff --git a/packages/astro/src/vite-plugin-jsx/index.ts b/packages/astro/src/vite-plugin-jsx/index.ts index 2f56e7fd2a46..bd4f0cde5f68 100644 --- a/packages/astro/src/vite-plugin-jsx/index.ts +++ b/packages/astro/src/vite-plugin-jsx/index.ts @@ -11,7 +11,7 @@ import esbuild from 'esbuild'; import * as colors from 'kleur/colors'; import path from 'path'; import { error } from '../core/logger/core.js'; -import { parseNpmName } from '../core/util.js'; +import { isMarkdownFile, parseNpmName } from '../core/util.js'; import tagExportsPlugin from './tag.js'; type FixedCompilerOptions = TsConfigJson.CompilerOptions & { @@ -193,7 +193,7 @@ export default function jsx({ settings, logging }: AstroPluginJSXOptions): Plugi const { mode } = viteConfig; // Shortcut: only use Astro renderer for MD and MDX files - if (id.includes('.mdx') || id.includes('.md') || id.includes('.markdown')) { + if (id.includes('.mdx') || isMarkdownFile(id, { criteria: 'includes' })) { const { code: jsxCode } = await esbuild.transform(code, { loader: getEsbuildLoader(path.extname(id)) as esbuild.Loader, jsx: 'preserve', diff --git a/packages/astro/src/vite-plugin-markdown-legacy/index.ts b/packages/astro/src/vite-plugin-markdown-legacy/index.ts index ba76afbc37a6..0feb3a51709a 100644 --- a/packages/astro/src/vite-plugin-markdown-legacy/index.ts +++ b/packages/astro/src/vite-plugin-markdown-legacy/index.ts @@ -10,6 +10,7 @@ import { pagesVirtualModuleId } from '../core/app/index.js'; import { cachedCompilation, CompileProps } from '../core/compile/index.js'; import { collectErrorMetadata } from '../core/errors.js'; import type { LogOptions } from '../core/logger/core.js'; +import { isMarkdownFile } from '../core/util.js'; import type { PluginMetadata as AstroPluginMetadata } from '../vite-plugin-astro/types'; import { getFileInfo } from '../vite-plugin-utils/index.js'; import { @@ -79,13 +80,10 @@ export default function markdown({ settings }: AstroPluginOptions): Plugin { styleTransformer.viteDevServer = server; }, async resolveId(id, importer, options) { - // Resolve any .md or .markdown files with the `?content` cache buster. This should only come from + // Resolve any .md (or alternative extensions of markdown files like .markdown) files with the `?content` cache buster. This should only come from // an already-resolved JS module wrapper. Needed to prevent infinite loops in Vite. // Unclear if this is expected or if cache busting is just working around a Vite bug. - if ( - id.endsWith(`.md${MARKDOWN_CONTENT_FLAG}`) || - id.endsWith(`.markdown${MARKDOWN_CONTENT_FLAG}`) - ) { + if (isMarkdownFile(id, { criteria: 'endsWith', suffix: MARKDOWN_CONTENT_FLAG })) { const resolvedId = await this.resolve(id, importer, { skipSelf: true, ...options }); return resolvedId?.id.replace(MARKDOWN_CONTENT_FLAG, ''); } @@ -93,7 +91,7 @@ export default function markdown({ settings }: AstroPluginOptions): Plugin { // that defers the markdown -> HTML rendering until it is needed. This is especially useful // when fetching and then filtering many markdown files, like with import.meta.glob() or Astro.glob(). // Otherwise, resolve directly to the actual component. - if ((id.endsWith('.md') || id.endsWith('.markdown')) && !isRootImport(importer)) { + if (isMarkdownFile(id, { criteria: 'endsWith' }) && !isRootImport(importer)) { const resolvedId = await this.resolve(id, importer, { skipSelf: true, ...options }); if (resolvedId) { return resolvedId.id + MARKDOWN_IMPORT_FLAG; @@ -106,10 +104,7 @@ export default function markdown({ settings }: AstroPluginOptions): Plugin { // A markdown file has been imported via ESM! // Return the file's JS representation, including all Markdown // frontmatter and a deferred `import() of the compiled markdown content. - if ( - id.endsWith(`.md${MARKDOWN_IMPORT_FLAG}`) || - id.endsWith(`.markdown${MARKDOWN_IMPORT_FLAG}`) - ) { + if (isMarkdownFile(id, { criteria: 'endsWith', suffix: MARKDOWN_IMPORT_FLAG })) { const { fileId, fileUrl } = getFileInfo(id, config); const source = await fs.promises.readFile(fileId, 'utf8'); @@ -149,7 +144,7 @@ export default function markdown({ settings }: AstroPluginOptions): Plugin { // A markdown file is being rendered! This markdown file was either imported // directly as a page in Vite, or it was a deferred render from a JS module. // This returns the compiled markdown -> astro component that renders to HTML. - if (id.endsWith('.md') || id.endsWith('.markdown')) { + if (isMarkdownFile(id, { criteria: 'endsWith' })) { const filename = normalizeFilename(id); const source = await fs.promises.readFile(filename, 'utf8'); const renderOpts = config.markdown; diff --git a/packages/astro/src/vite-plugin-markdown/index.ts b/packages/astro/src/vite-plugin-markdown/index.ts index 7e2b65abf075..4c9055e6bb34 100644 --- a/packages/astro/src/vite-plugin-markdown/index.ts +++ b/packages/astro/src/vite-plugin-markdown/index.ts @@ -8,6 +8,7 @@ import type { AstroSettings } from '../@types/astro'; import { collectErrorMetadata } from '../core/errors.js'; import type { LogOptions } from '../core/logger/core.js'; import { warn } from '../core/logger/core.js'; +import { isMarkdownFile } from '../core/util.js'; import type { PluginMetadata } from '../vite-plugin-astro/types.js'; import { getFileInfo, safelyGetAstroData } from '../vite-plugin-utils/index.js'; @@ -39,7 +40,7 @@ export default function markdown({ settings, logging }: AstroPluginOptions): Plu // passing to the transform hook. This lets us get the truly raw value // to escape "import.meta.env" ourselves. async load(id) { - if (id.endsWith('.md') || id.endsWith('.markdown')) { + if (isMarkdownFile(id, { criteria: 'endsWith' })) { const { fileId, fileUrl } = getFileInfo(id, settings.config); const rawFile = await fs.promises.readFile(fileId, 'utf-8'); const raw = safeMatter(rawFile, id); @@ -63,7 +64,7 @@ export default function markdown({ settings, logging }: AstroPluginOptions): Plu warn( logging, 'markdown', - `[${id}] Astro now supports MDX! Support for components in ".md" or ".markdown" files using the "setup" frontmatter is no longer enabled by default. Migrate this file to MDX or add the "legacy.astroFlavoredMarkdown" config flag to re-enable support.` + `[${id}] Astro now supports MDX! Support for components in ".md" (or alternative extensions like ".markdown") files using the "setup" frontmatter is no longer enabled by default. Migrate this file to MDX or add the "legacy.astroFlavoredMarkdown" config flag to re-enable support.` ); } diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index 08b6dc41495e..81f91d0c86a5 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -66,7 +66,7 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { rehypePlugins: getRehypePlugins(mdxOptions, config), jsx: true, jsxImportSource: 'astro', - // Note: disable `.md` and `.markdown` support + // Note: disable `.md` (and other alternative extensions for markdown files like `.markdown`) support format: 'mdx', mdExtensions: [], }; From c11e9fc6b833c3b7fd787f934853955637f9dcd0 Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Mon, 24 Oct 2022 17:34:27 +0000 Subject: [PATCH 07/15] feat: add module declaration for different markdown file extensions --- packages/astro/client-base.d.ts | 69 +++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/packages/astro/client-base.d.ts b/packages/astro/client-base.d.ts index ef1cc5ae6522..2baded7a73f0 100644 --- a/packages/astro/client-base.d.ts +++ b/packages/astro/client-base.d.ts @@ -16,6 +16,7 @@ declare module '*.md' { const load: MD['default']; export default load; } + declare module '*.markdown' { type MD = import('./dist/@types/astro').MarkdownInstance>; @@ -33,6 +34,74 @@ declare module '*.markdown' { export default load; } +declare module '*.mkdn' { + type MD = import('./dist/@types/astro').MarkdownInstance>; + + export const frontmatter: MD['frontmatter']; + export const file: MD['file']; + export const url: MD['url']; + export const getHeadings: MD['getHeadings']; + /** @deprecated Renamed to `getHeadings()` */ + export const getHeaders: () => void; + export const Content: MD['Content']; + export const rawContent: MD['rawContent']; + export const compiledContent: MD['compiledContent']; + + const load: MD['default']; + export default load; +} + +declare module '*.mkd' { + type MD = import('./dist/@types/astro').MarkdownInstance>; + + export const frontmatter: MD['frontmatter']; + export const file: MD['file']; + export const url: MD['url']; + export const getHeadings: MD['getHeadings']; + /** @deprecated Renamed to `getHeadings()` */ + export const getHeaders: () => void; + export const Content: MD['Content']; + export const rawContent: MD['rawContent']; + export const compiledContent: MD['compiledContent']; + + const load: MD['default']; + export default load; +} + +declare module '*.mdwn' { + type MD = import('./dist/@types/astro').MarkdownInstance>; + + export const frontmatter: MD['frontmatter']; + export const file: MD['file']; + export const url: MD['url']; + export const getHeadings: MD['getHeadings']; + /** @deprecated Renamed to `getHeadings()` */ + export const getHeaders: () => void; + export const Content: MD['Content']; + export const rawContent: MD['rawContent']; + export const compiledContent: MD['compiledContent']; + + const load: MD['default']; + export default load; +} + +declare module '*.mdown' { + type MD = import('./dist/@types/astro').MarkdownInstance>; + + export const frontmatter: MD['frontmatter']; + export const file: MD['file']; + export const url: MD['url']; + export const getHeadings: MD['getHeadings']; + /** @deprecated Renamed to `getHeadings()` */ + export const getHeaders: () => void; + export const Content: MD['Content']; + export const rawContent: MD['rawContent']; + export const compiledContent: MD['compiledContent']; + + const load: MD['default']; + export default load; +} + declare module '*.mdx' { type MDX = import('./dist/@types/astro').MDXInstance>; From 36d1eb65fe863a08dc6421dfc8b3f344a96c5afe Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Mon, 24 Oct 2022 17:38:40 +0000 Subject: [PATCH 08/15] refactor: markdown module declarations for ease of TS refactoring --- packages/astro/client-base.d.ts | 156 ++++++++++++++++---------------- 1 file changed, 79 insertions(+), 77 deletions(-) diff --git a/packages/astro/client-base.d.ts b/packages/astro/client-base.d.ts index 2baded7a73f0..fa521d0aa4d3 100644 --- a/packages/astro/client-base.d.ts +++ b/packages/astro/client-base.d.ts @@ -1,104 +1,106 @@ /// -declare module '*.md' { - type MD = import('./dist/@types/astro').MarkdownInstance>; - - export const frontmatter: MD['frontmatter']; - export const file: MD['file']; - export const url: MD['url']; - export const getHeadings: MD['getHeadings']; +type MD = import('./dist/@types/astro').MarkdownInstance>; +interface ExportedMarkdownModuleEntities { + frontmatter: MD['frontmatter']; + file: MD['file']; + url: MD['url']; + getHeadings: MD['getHeadings']; /** @deprecated Renamed to `getHeadings()` */ - export const getHeaders: () => void; - export const Content: MD['Content']; - export const rawContent: MD['rawContent']; - export const compiledContent: MD['compiledContent']; + getHeaders: () => void; + Content: MD['Content']; + rawContent: MD['rawContent']; + compiledContent: MD['compiledContent']; + load: MD['default']; +} - const load: MD['default']; +declare module '*.md' { + const { load }: ExportedMarkdownModuleEntities; + export const { + frontmatter, + file, + url, + getHeadings, + getHeaders, + Content, + rawContent, + compiledContent, + }: ExportedMarkdownModuleEntities; export default load; } declare module '*.markdown' { - type MD = import('./dist/@types/astro').MarkdownInstance>; - - export const frontmatter: MD['frontmatter']; - export const file: MD['file']; - export const url: MD['url']; - export const getHeadings: MD['getHeadings']; - /** @deprecated Renamed to `getHeadings()` */ - export const getHeaders: () => void; - export const Content: MD['Content']; - export const rawContent: MD['rawContent']; - export const compiledContent: MD['compiledContent']; - - const load: MD['default']; + const { load }: ExportedMarkdownModuleEntities; + export const { + frontmatter, + file, + url, + getHeadings, + getHeaders, + Content, + rawContent, + compiledContent, + }: ExportedMarkdownModuleEntities; export default load; } declare module '*.mkdn' { - type MD = import('./dist/@types/astro').MarkdownInstance>; - - export const frontmatter: MD['frontmatter']; - export const file: MD['file']; - export const url: MD['url']; - export const getHeadings: MD['getHeadings']; - /** @deprecated Renamed to `getHeadings()` */ - export const getHeaders: () => void; - export const Content: MD['Content']; - export const rawContent: MD['rawContent']; - export const compiledContent: MD['compiledContent']; - - const load: MD['default']; + const { load }: ExportedMarkdownModuleEntities; + export const { + frontmatter, + file, + url, + getHeadings, + getHeaders, + Content, + rawContent, + compiledContent, + }: ExportedMarkdownModuleEntities; export default load; } declare module '*.mkd' { - type MD = import('./dist/@types/astro').MarkdownInstance>; - - export const frontmatter: MD['frontmatter']; - export const file: MD['file']; - export const url: MD['url']; - export const getHeadings: MD['getHeadings']; - /** @deprecated Renamed to `getHeadings()` */ - export const getHeaders: () => void; - export const Content: MD['Content']; - export const rawContent: MD['rawContent']; - export const compiledContent: MD['compiledContent']; - - const load: MD['default']; + const { load }: ExportedMarkdownModuleEntities; + export const { + frontmatter, + file, + url, + getHeadings, + getHeaders, + Content, + rawContent, + compiledContent, + }: ExportedMarkdownModuleEntities; export default load; } declare module '*.mdwn' { - type MD = import('./dist/@types/astro').MarkdownInstance>; - - export const frontmatter: MD['frontmatter']; - export const file: MD['file']; - export const url: MD['url']; - export const getHeadings: MD['getHeadings']; - /** @deprecated Renamed to `getHeadings()` */ - export const getHeaders: () => void; - export const Content: MD['Content']; - export const rawContent: MD['rawContent']; - export const compiledContent: MD['compiledContent']; - - const load: MD['default']; + const { load }: ExportedMarkdownModuleEntities; + export const { + frontmatter, + file, + url, + getHeadings, + getHeaders, + Content, + rawContent, + compiledContent, + }: ExportedMarkdownModuleEntities; export default load; } declare module '*.mdown' { - type MD = import('./dist/@types/astro').MarkdownInstance>; - - export const frontmatter: MD['frontmatter']; - export const file: MD['file']; - export const url: MD['url']; - export const getHeadings: MD['getHeadings']; - /** @deprecated Renamed to `getHeadings()` */ - export const getHeaders: () => void; - export const Content: MD['Content']; - export const rawContent: MD['rawContent']; - export const compiledContent: MD['compiledContent']; - - const load: MD['default']; + const { load }: ExportedMarkdownModuleEntities; + export const { + frontmatter, + file, + url, + getHeadings, + getHeaders, + Content, + rawContent, + compiledContent, + }: ExportedMarkdownModuleEntities; export default load; } From 77659edc3b8e67c7da823e891b63c7c395c1cdac Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Mon, 24 Oct 2022 17:57:25 +0000 Subject: [PATCH 09/15] fix: add .js extension to module imports --- packages/astro/src/core/config/settings.ts | 2 +- packages/astro/src/core/util.ts | 2 +- packages/astro/src/vite-plugin-astro-postprocess/index.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/astro/src/core/config/settings.ts b/packages/astro/src/core/config/settings.ts index 017e8e3603be..48cc4a73b458 100644 --- a/packages/astro/src/core/config/settings.ts +++ b/packages/astro/src/core/config/settings.ts @@ -1,4 +1,4 @@ -import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from './../constants'; +import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from './../constants.js'; import type { AstroConfig, AstroSettings } from '../../@types/astro'; import jsxRenderer from '../../jsx/renderer.js'; diff --git a/packages/astro/src/core/util.ts b/packages/astro/src/core/util.ts index 0e76b3f55497..1213c776c5b5 100644 --- a/packages/astro/src/core/util.ts +++ b/packages/astro/src/core/util.ts @@ -7,7 +7,7 @@ import { fileURLToPath, pathToFileURL } from 'url'; import { ErrorPayload, normalizePath, ViteDevServer } from 'vite'; import type { AstroConfig, AstroSettings, RouteType } from '../@types/astro'; import { prependForwardSlash, removeTrailingForwardSlash } from './path.js'; -import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from './constants'; +import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from './constants.js'; /** Returns true if argument is an object of any prototype/class (but not null). */ export function isObject(value: unknown): value is Record { diff --git a/packages/astro/src/vite-plugin-astro-postprocess/index.ts b/packages/astro/src/vite-plugin-astro-postprocess/index.ts index 4a1a41c5d336..514d6834de87 100644 --- a/packages/astro/src/vite-plugin-astro-postprocess/index.ts +++ b/packages/astro/src/vite-plugin-astro-postprocess/index.ts @@ -4,7 +4,7 @@ import type { NodePath } from 'ast-types/lib/node-path'; import { parse, print, types, visit } from 'recast'; import type { Plugin } from 'vite'; import type { AstroSettings } from '../@types/astro'; -import { isMarkdownFile } from '../core/util'; +import { isMarkdownFile } from '../core/util.js'; // Check for `Astro.glob()`. Be very forgiving of whitespace. False positives are okay. const ASTRO_GLOB_REGEX = /Astro2?\s*\.\s*glob\s*\(/; From f2fc6ff29c48375dfce23df87009b895616e85f7 Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Mon, 24 Oct 2022 17:57:46 +0000 Subject: [PATCH 10/15] test: update test --- packages/astro-rss/test/rss.test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/astro-rss/test/rss.test.js b/packages/astro-rss/test/rss.test.js index 224fdc586ae0..42fb0759d4b6 100644 --- a/packages/astro-rss/test/rss.test.js +++ b/packages/astro-rss/test/rss.test.js @@ -200,7 +200,9 @@ describe('rss', () => { } catch (err) { chai .expect(err.message) - .to.contain('you can only glob ".md" or ".markdown" files within /pages'); + .to.contain( + 'you can only glob ".md" (or alternative extensions for markdown files like ".markdown") files within /pages' + ); } }); }); From 992c601865f9d34e37cf540c18b1428ce0f4c9b9 Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Mon, 24 Oct 2022 19:06:38 +0000 Subject: [PATCH 11/15] chore: update changeset --- .changeset/many-rockets-admire.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .changeset/many-rockets-admire.md diff --git a/.changeset/many-rockets-admire.md b/.changeset/many-rockets-admire.md new file mode 100644 index 000000000000..67af8ed105d3 --- /dev/null +++ b/.changeset/many-rockets-admire.md @@ -0,0 +1,11 @@ +--- +'astro': minor +'@astrojs/rss': patch +--- + +Add support for markdown files with the following extensions: +- `.markdown` +- `.mdown` +- `.mkdn` +- `.mkd` +- `.mdwn` From d6a55d2fabfc1886aa9caad5bba3184056e23a9c Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Mon, 24 Oct 2022 19:07:40 +0000 Subject: [PATCH 12/15] chore: update changeset --- .changeset/many-rockets-admire.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/many-rockets-admire.md b/.changeset/many-rockets-admire.md index 67af8ed105d3..a566b86d1cad 100644 --- a/.changeset/many-rockets-admire.md +++ b/.changeset/many-rockets-admire.md @@ -4,7 +4,7 @@ --- Add support for markdown files with the following extensions: -- `.markdown` +- `.markdown` - `.mdown` - `.mkdn` - `.mkd` From abb121447ee9493bdf2671e6608c0ada94462ed6 Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Mon, 24 Oct 2022 19:54:14 +0000 Subject: [PATCH 13/15] test: add new test cases --- .changeset/spicy-cameras-rush.md | 7 ---- .../src/pages/dot-markdown-page.markdown | 3 ++ .../markdown/src/pages/dot-mdown-page.mdown | 3 ++ .../markdown/src/pages/dot-mdwn-page.mdwn | 3 ++ .../markdown/src/pages/dot-mkd-page.mkd | 3 ++ .../markdown/src/pages/dot-mkdn-page.mkdn | 3 ++ .../page-with-markdown-extension.markdown | 3 -- packages/astro/test/markdown.test.js | 32 +++++++++++++++++-- 8 files changed, 45 insertions(+), 12 deletions(-) delete mode 100644 .changeset/spicy-cameras-rush.md create mode 100644 packages/astro/test/fixtures/markdown/src/pages/dot-markdown-page.markdown create mode 100644 packages/astro/test/fixtures/markdown/src/pages/dot-mdown-page.mdown create mode 100644 packages/astro/test/fixtures/markdown/src/pages/dot-mdwn-page.mdwn create mode 100644 packages/astro/test/fixtures/markdown/src/pages/dot-mkd-page.mkd create mode 100644 packages/astro/test/fixtures/markdown/src/pages/dot-mkdn-page.mkdn delete mode 100644 packages/astro/test/fixtures/markdown/src/pages/page-with-markdown-extension.markdown diff --git a/.changeset/spicy-cameras-rush.md b/.changeset/spicy-cameras-rush.md deleted file mode 100644 index dca285b6b055..000000000000 --- a/.changeset/spicy-cameras-rush.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'astro': patch -'@astrojs/rss': patch -'@astrojs/mdx': patch ---- - -Support `.markdown` file extension for markdown files diff --git a/packages/astro/test/fixtures/markdown/src/pages/dot-markdown-page.markdown b/packages/astro/test/fixtures/markdown/src/pages/dot-markdown-page.markdown new file mode 100644 index 000000000000..baa8967b1f6c --- /dev/null +++ b/packages/astro/test/fixtures/markdown/src/pages/dot-markdown-page.markdown @@ -0,0 +1,3 @@ +# Page with alternative .markdown extension + +Hope this loads fine 🤞 diff --git a/packages/astro/test/fixtures/markdown/src/pages/dot-mdown-page.mdown b/packages/astro/test/fixtures/markdown/src/pages/dot-mdown-page.mdown new file mode 100644 index 000000000000..9d95c8490bf9 --- /dev/null +++ b/packages/astro/test/fixtures/markdown/src/pages/dot-mdown-page.mdown @@ -0,0 +1,3 @@ +# Page with alternative .mdown extension + +Hope this loads fine 🤞 diff --git a/packages/astro/test/fixtures/markdown/src/pages/dot-mdwn-page.mdwn b/packages/astro/test/fixtures/markdown/src/pages/dot-mdwn-page.mdwn new file mode 100644 index 000000000000..28769a4e41e3 --- /dev/null +++ b/packages/astro/test/fixtures/markdown/src/pages/dot-mdwn-page.mdwn @@ -0,0 +1,3 @@ +# Page with alternative .mdwn extension + +Hope this loads fine 🤞 diff --git a/packages/astro/test/fixtures/markdown/src/pages/dot-mkd-page.mkd b/packages/astro/test/fixtures/markdown/src/pages/dot-mkd-page.mkd new file mode 100644 index 000000000000..0e72283d09de --- /dev/null +++ b/packages/astro/test/fixtures/markdown/src/pages/dot-mkd-page.mkd @@ -0,0 +1,3 @@ +# Page with alternative .mkd extension + +Hope this loads fine 🤞 diff --git a/packages/astro/test/fixtures/markdown/src/pages/dot-mkdn-page.mkdn b/packages/astro/test/fixtures/markdown/src/pages/dot-mkdn-page.mkdn new file mode 100644 index 000000000000..701e4d641925 --- /dev/null +++ b/packages/astro/test/fixtures/markdown/src/pages/dot-mkdn-page.mkdn @@ -0,0 +1,3 @@ +# Page with alternative .mkdn extension + +Hope this loads fine 🤞 diff --git a/packages/astro/test/fixtures/markdown/src/pages/page-with-markdown-extension.markdown b/packages/astro/test/fixtures/markdown/src/pages/page-with-markdown-extension.markdown deleted file mode 100644 index 30b50d000a2a..000000000000 --- a/packages/astro/test/fixtures/markdown/src/pages/page-with-markdown-extension.markdown +++ /dev/null @@ -1,3 +0,0 @@ -# Page with markdown extension - -Hope this loads fine 🤞 diff --git a/packages/astro/test/markdown.test.js b/packages/astro/test/markdown.test.js index dfb2c070f10c..1c9286e4aa2a 100644 --- a/packages/astro/test/markdown.test.js +++ b/packages/astro/test/markdown.test.js @@ -18,9 +18,37 @@ describe('Markdown tests', () => { }); it('Can load a `.markdown` file', async () => { - const html = await fixture.readFile('/page-with-markdown-extension/index.html'); + const html = await fixture.readFile('/dot-markdown-page/index.html'); const $ = cheerio.load(html); - expect($('h1').html()).to.equal('Page with markdown extension'); + expect($('h1').html()).to.equal('Page with alternative .markdown extension'); + expect($('p').html()).to.equal('Hope this loads fine 🤞'); + }); + + it('Can load a `.mdwn` file', async () => { + const html = await fixture.readFile('/dot-mdwn-page/index.html'); + const $ = cheerio.load(html); + expect($('h1').html()).to.equal('Page with alternative .mdwn extension'); + expect($('p').html()).to.equal('Hope this loads fine 🤞'); + }); + + it('Can load a `.mkdn` file', async () => { + const html = await fixture.readFile('/dot-mkdn-page/index.html'); + const $ = cheerio.load(html); + expect($('h1').html()).to.equal('Page with alternative .mkdn extension'); + expect($('p').html()).to.equal('Hope this loads fine 🤞'); + }); + + it('Can load a `.mdown` file', async () => { + const html = await fixture.readFile('/dot-mdown-page/index.html'); + const $ = cheerio.load(html); + expect($('h1').html()).to.equal('Page with alternative .mdown extension'); + expect($('p').html()).to.equal('Hope this loads fine 🤞'); + }); + + it('Can load a `.mkd` file', async () => { + const html = await fixture.readFile('/dot-mkd-page/index.html'); + const $ = cheerio.load(html); + expect($('h1').html()).to.equal('Page with alternative .mkd extension'); expect($('p').html()).to.equal('Hope this loads fine 🤞'); }); From d5c2f80bfd51d46e88dbc495062ffa128ab67296 Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Mon, 24 Oct 2022 20:01:28 +0000 Subject: [PATCH 14/15] test: update tests --- packages/astro/test/markdown.test.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/astro/test/markdown.test.js b/packages/astro/test/markdown.test.js index 1c9286e4aa2a..471205844e4d 100644 --- a/packages/astro/test/markdown.test.js +++ b/packages/astro/test/markdown.test.js @@ -17,35 +17,35 @@ describe('Markdown tests', () => { await fixture.build(); }); - it('Can load a `.markdown` file', async () => { + it('Can load a markdown page with the `.markdown` extension', async () => { const html = await fixture.readFile('/dot-markdown-page/index.html'); const $ = cheerio.load(html); expect($('h1').html()).to.equal('Page with alternative .markdown extension'); expect($('p').html()).to.equal('Hope this loads fine 🤞'); }); - it('Can load a `.mdwn` file', async () => { + it('Can load a markdown page with the `.mdwn` extension', async () => { const html = await fixture.readFile('/dot-mdwn-page/index.html'); const $ = cheerio.load(html); expect($('h1').html()).to.equal('Page with alternative .mdwn extension'); expect($('p').html()).to.equal('Hope this loads fine 🤞'); }); - it('Can load a `.mkdn` file', async () => { + it('Can load a markdown page with the `.mkdn` extension', async () => { const html = await fixture.readFile('/dot-mkdn-page/index.html'); const $ = cheerio.load(html); expect($('h1').html()).to.equal('Page with alternative .mkdn extension'); expect($('p').html()).to.equal('Hope this loads fine 🤞'); }); - it('Can load a `.mdown` file', async () => { + it('Can load a markdown page with the `.mdown` extension', async () => { const html = await fixture.readFile('/dot-mdown-page/index.html'); const $ = cheerio.load(html); expect($('h1').html()).to.equal('Page with alternative .mdown extension'); expect($('p').html()).to.equal('Hope this loads fine 🤞'); }); - it('Can load a `.mkd` file', async () => { + it('Can load a markdown page with the `.mkd` extension', async () => { const html = await fixture.readFile('/dot-mkd-page/index.html'); const $ = cheerio.load(html); expect($('h1').html()).to.equal('Page with alternative .mkd extension'); From 7200a692b0963a56463ac843ce7ed52d457d5b05 Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Mon, 24 Oct 2022 21:29:20 +0000 Subject: [PATCH 15/15] fix: correct typo --- packages/astro/src/@types/astro.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 5cb6fb857efa..90c815b3c516 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -247,7 +247,7 @@ export interface AstroGlobal = Record