From c16e79616a5dbcd820cf3416f1a1a1460ea51c0b Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 15 Feb 2023 09:43:04 -0500 Subject: [PATCH] Revert "feat: support `.md` overrides for content collections" This reverts commit c06f83ef85146831457fde1f2126b338f656b093. --- .../src/content/docs/{intro.md => intro.mdoc} | 4 +-- packages/astro/src/@types/astro.ts | 1 - packages/astro/src/content/consts.ts | 1 - packages/astro/src/content/index.ts | 8 +---- packages/astro/src/content/markdown.ts | 29 ------------------- .../src/content/template/markdown-types.d.ts | 9 ------ .../astro/src/content/template/types.d.ts | 10 +++++++ packages/astro/src/content/utils.ts | 12 +------- packages/astro/src/core/config/settings.ts | 3 +- packages/astro/src/integrations/index.ts | 8 ----- .../content-entry-type.ts | 16 ++++++++++ .../astro/src/vite-plugin-markdown/index.ts | 10 ------- packages/integrations/markdoc/src/index.ts | 7 ++--- .../template/content-module-types.d.ts | 15 ++++------ packages/integrations/mdx/src/index.ts | 1 - 15 files changed, 40 insertions(+), 94 deletions(-) rename examples/with-markdoc/src/content/docs/{intro.md => intro.mdoc} (81%) delete mode 100644 packages/astro/src/content/markdown.ts delete mode 100644 packages/astro/src/content/template/markdown-types.d.ts create mode 100644 packages/astro/src/vite-plugin-markdown/content-entry-type.ts diff --git a/examples/with-markdoc/src/content/docs/intro.md b/examples/with-markdoc/src/content/docs/intro.mdoc similarity index 81% rename from examples/with-markdoc/src/content/docs/intro.md rename to examples/with-markdoc/src/content/docs/intro.mdoc index 175ed0bb6..1b7f27daa 100644 --- a/examples/with-markdoc/src/content/docs/intro.md +++ b/examples/with-markdoc/src/content/docs/intro.mdoc @@ -2,13 +2,13 @@ title: Welcome to Markdoc 👋 --- -This simple starter showcases Markdoc's features with Content Collections. All Markdoc features are supported, including this nifty built-in `{% table %}` tag: +This simple starter showcases Markdoc with Content Collections. All Markdoc features are supported, including this nifty built-in `{% table %}` tag: {% table %} * Feature * Supported --- -* `.mdoc` + `.md` in Content Collections +* `.mdoc` in Content Collections * ✅ --- * Markdoc transform configuration diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 2ea0490c3..818384c99 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -979,7 +979,6 @@ export interface AstroConfig extends z.output { } export interface ContentEntryType { - name: string; extensions: string[]; getEntryInfo(params: { fileUrl: URL; contents: string }): Promise<{ data: Record; diff --git a/packages/astro/src/content/consts.ts b/packages/astro/src/content/consts.ts index 3c671102d..1f0470d5a 100644 --- a/packages/astro/src/content/consts.ts +++ b/packages/astro/src/content/consts.ts @@ -6,4 +6,3 @@ export const STYLES_PLACEHOLDER = '@@ASTRO-STYLES@@'; export const SCRIPTS_PLACEHOLDER = '@@ASTRO-SCRIPTS@@'; export const CONTENT_TYPES_FILE = 'types.d.ts'; -export const MARKDOWN_CONTENT_ENTRY_TYPE_NAME = 'astro:markdown'; diff --git a/packages/astro/src/content/index.ts b/packages/astro/src/content/index.ts index d77a26b64..f12106b0a 100644 --- a/packages/astro/src/content/index.ts +++ b/packages/astro/src/content/index.ts @@ -1,12 +1,6 @@ export { attachContentServerListeners } from './server-listeners.js'; export { createContentTypesGenerator } from './types-generator.js'; -export { - contentObservable, - getContentPaths, - getDotAstroTypeReference, - hasMdContentEntryTypeOverride, -} from './utils.js'; -export { getMarkdownContentEntryType } from './markdown.js'; +export { contentObservable, getContentPaths, getDotAstroTypeReference } from './utils.js'; export { astroContentAssetPropagationPlugin } from './vite-plugin-content-assets.js'; export { astroContentImportPlugin } from './vite-plugin-content-imports.js'; export { astroContentVirtualModPlugin } from './vite-plugin-content-virtual-mod.js'; diff --git a/packages/astro/src/content/markdown.ts b/packages/astro/src/content/markdown.ts deleted file mode 100644 index 8d342d5b3..000000000 --- a/packages/astro/src/content/markdown.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type fsMod from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import { AstroConfig, ContentEntryType } from '../@types/astro.js'; -import { getContentPaths, parseFrontmatter } from './utils.js'; -import { MARKDOWN_CONTENT_ENTRY_TYPE_NAME } from './consts.js'; - -export async function getMarkdownContentEntryType( - config: Pick, - fs: typeof fsMod -): Promise { - const contentPaths = getContentPaths(config, fs); - return { - name: MARKDOWN_CONTENT_ENTRY_TYPE_NAME, - extensions: ['.md'], - async getEntryInfo({ fileUrl, contents }: { fileUrl: URL; contents: string }) { - const parsed = parseFrontmatter(contents, fileURLToPath(fileUrl)); - return { - data: parsed.data, - body: parsed.content, - slug: parsed.data.slug, - rawData: parsed.matter, - }; - }, - contentModuleTypes: await fs.promises.readFile( - new URL('./markdown-types.d.ts', contentPaths.templateDir), - 'utf-8' - ), - }; -} diff --git a/packages/astro/src/content/template/markdown-types.d.ts b/packages/astro/src/content/template/markdown-types.d.ts deleted file mode 100644 index 74eea096e..000000000 --- a/packages/astro/src/content/template/markdown-types.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare module 'astro:content' { - interface Render { - '.md': Promise<{ - Content: import('astro').MarkdownInstance<{}>['Content']; - headings: import('astro').MarkdownHeading[]; - remarkPluginFrontmatter: Record; - }>; - } -} diff --git a/packages/astro/src/content/template/types.d.ts b/packages/astro/src/content/template/types.d.ts index b85ba8423..abe187a33 100644 --- a/packages/astro/src/content/template/types.d.ts +++ b/packages/astro/src/content/template/types.d.ts @@ -1,3 +1,13 @@ +declare module 'astro:content' { + interface Render { + '.md': Promise<{ + Content: import('astro').MarkdownInstance<{}>['Content']; + headings: import('astro').MarkdownHeading[]; + remarkPluginFrontmatter: Record; + }>; + } +} + declare module 'astro:content' { export { z } from 'astro/zod'; export type CollectionEntry = diff --git a/packages/astro/src/content/utils.ts b/packages/astro/src/content/utils.ts index 30841a9fd..ba767c30f 100644 --- a/packages/astro/src/content/utils.ts +++ b/packages/astro/src/content/utils.ts @@ -7,7 +7,7 @@ import { ErrorPayload as ViteErrorPayload, normalizePath, ViteDevServer } from ' import { z } from 'zod'; import { AstroConfig, AstroSettings } from '../@types/astro.js'; import { AstroError, AstroErrorData } from '../core/errors/index.js'; -import { CONTENT_TYPES_FILE, MARKDOWN_CONTENT_ENTRY_TYPE_NAME } from './consts.js'; +import { CONTENT_TYPES_FILE } from './consts.js'; export const collectionConfigParser = z.object({ schema: z.any().optional(), @@ -315,7 +315,6 @@ export function contentObservable(initialCtx: ContentCtx): ContentObservable { } export type ContentPaths = { - templateDir: URL; contentDir: URL; cacheDir: URL; typesTemplate: URL; @@ -333,7 +332,6 @@ export function getContentPaths( const configStats = search(fs, srcDir); const templateDir = new URL('../../src/content/template/', import.meta.url); return { - templateDir, cacheDir: new URL('.astro/', root), contentDir: new URL('./content/', srcDir), typesTemplate: new URL('types.d.ts', templateDir), @@ -352,11 +350,3 @@ function search(fs: typeof fsMod, srcDir: URL) { } return { exists: false, url: paths[0] }; } - -export function hasMdContentEntryTypeOverride(settings: Pick) { - return settings.contentEntryTypes.some( - (contentEntryType) => - contentEntryType.name !== MARKDOWN_CONTENT_ENTRY_TYPE_NAME && - contentEntryType.extensions.includes('.md') - ); -} diff --git a/packages/astro/src/core/config/settings.ts b/packages/astro/src/core/config/settings.ts index c95a9fd19..c92222b04 100644 --- a/packages/astro/src/core/config/settings.ts +++ b/packages/astro/src/core/config/settings.ts @@ -6,6 +6,7 @@ import jsxRenderer from '../../jsx/renderer.js'; import { createDefaultDevConfig } from './config.js'; import { AstroTimer } from './timer.js'; import { loadTSConfig } from './tsconfig.js'; +import { markdownContentEntryType } from '../../vite-plugin-markdown/content-entry-type.js'; export function createBaseSettings(config: AstroConfig): AstroSettings { return { @@ -16,7 +17,7 @@ export function createBaseSettings(config: AstroConfig): AstroSettings { adapter: undefined, injectedRoutes: [], pageExtensions: ['.astro', '.html', ...SUPPORTED_MARKDOWN_FILE_EXTENSIONS], - contentEntryTypes: [], + contentEntryTypes: [markdownContentEntryType], renderers: [jsxRenderer], scripts: [], watchFiles: [], diff --git a/packages/astro/src/integrations/index.ts b/packages/astro/src/integrations/index.ts index f817a66ee..0c69355c9 100644 --- a/packages/astro/src/integrations/index.ts +++ b/packages/astro/src/integrations/index.ts @@ -12,12 +12,10 @@ import { HookParameters, RouteData, } from '../@types/astro.js'; -import { hasMdContentEntryTypeOverride } from '../content/utils.js'; import type { SerializedSSRManifest } from '../core/app/types'; import type { PageBuildData } from '../core/build/types'; import { mergeConfig } from '../core/config/config.js'; import { info, LogOptions } from '../core/logger/core.js'; -import { getMarkdownContentEntryType } from '../content/index.js'; async function withTakingALongTimeMsg({ name, @@ -128,12 +126,6 @@ export async function runHookConfigSetup({ } updatedSettings.config = updatedConfig; - if (!hasMdContentEntryTypeOverride(updatedSettings)) { - updatedSettings.contentEntryTypes.push( - await getMarkdownContentEntryType(updatedSettings.config, fs) - ); - } - return updatedSettings; } diff --git a/packages/astro/src/vite-plugin-markdown/content-entry-type.ts b/packages/astro/src/vite-plugin-markdown/content-entry-type.ts new file mode 100644 index 000000000..01a67e033 --- /dev/null +++ b/packages/astro/src/vite-plugin-markdown/content-entry-type.ts @@ -0,0 +1,16 @@ +import { fileURLToPath } from 'node:url'; +import { ContentEntryType } from '../@types/astro.js'; +import { parseFrontmatter } from '../content/utils.js'; + +export const markdownContentEntryType: ContentEntryType = { + extensions: ['.md'], + async getEntryInfo({ fileUrl, contents }: { fileUrl: URL; contents: string }) { + const parsed = parseFrontmatter(contents, fileURLToPath(fileUrl)); + return { + data: parsed.data, + body: parsed.content, + slug: parsed.data.slug, + rawData: parsed.matter, + }; + }, +}; diff --git a/packages/astro/src/vite-plugin-markdown/index.ts b/packages/astro/src/vite-plugin-markdown/index.ts index 39f5d1903..746bfde36 100644 --- a/packages/astro/src/vite-plugin-markdown/index.ts +++ b/packages/astro/src/vite-plugin-markdown/index.ts @@ -10,7 +10,6 @@ import type { Plugin } from 'vite'; import { normalizePath } from 'vite'; import type { AstroSettings } from '../@types/astro'; import { getContentPaths } from '../content/index.js'; -import { hasMdContentEntryTypeOverride } from '../content/index.js'; import { AstroError, AstroErrorData, MarkdownError } from '../core/errors/index.js'; import type { LogOptions } from '../core/logger/core.js'; import { warn } from '../core/logger/core.js'; @@ -67,15 +66,6 @@ export default function markdown({ settings, logging }: AstroPluginOptions): Plu async load(id) { if (isMarkdownFile(id)) { const { fileId, fileUrl } = getFileInfo(id, settings.config); - if ( - // Integrations can override the Markdown parser for content collections. - // If an override is present, skip this file. - fileId.startsWith(getContentPaths(settings.config).contentDir.pathname) && - hasMdContentEntryTypeOverride(settings) - ) { - return; - } - const rawFile = await fs.promises.readFile(fileId, 'utf-8'); const raw = safeMatter(rawFile, id); const renderResult = await renderMarkdown(raw.content, { diff --git a/packages/integrations/markdoc/src/index.ts b/packages/integrations/markdoc/src/index.ts index 9778ef40e..ed260563b 100644 --- a/packages/integrations/markdoc/src/index.ts +++ b/packages/integrations/markdoc/src/index.ts @@ -6,16 +6,13 @@ import { parseFrontmatter } from './utils.js'; import { fileURLToPath } from 'node:url'; import fs from 'node:fs'; -const DEFAULT_MARKDOC_EXTS = ['.mdoc', '.md']; - export default function markdoc(): AstroIntegration { return { name: '@astrojs/markdoc', hooks: { 'astro:config:setup': async ({ updateConfig, config, addContentEntryType, command }: any) => { const contentEntryType = { - name: 'astro:markdoc', - extensions: DEFAULT_MARKDOC_EXTS, + extensions: ['.mdoc'], async getEntryInfo({ fileUrl, contents }: { fileUrl: URL; contents: string }) { const parsed = parseFrontmatter(contents, fileURLToPath(fileUrl)); return { @@ -37,7 +34,7 @@ export default function markdoc(): AstroIntegration { { name: '@astrojs/markdoc', async transform(code, id) { - if (!DEFAULT_MARKDOC_EXTS.some((ext) => id.endsWith(ext))) return; + if (!id.endsWith('.mdoc')) return; return `import { jsx as h } from 'astro/jsx-runtime';\nimport { Markdoc } from '@astrojs/markdoc';\nimport { Renderer } from '@astrojs/markdoc/components';\nexport const body = ${JSON.stringify( code )};\nexport function getParsed() { return Markdoc.parse(body); }\nexport function getTransformed(inlineConfig) { return Markdoc.transform(getParsed(), inlineConfig) }\nexport async function Content ({ config, components }) { return h(Renderer, { content: getTransformed(config), components }); }\nContent[Symbol.for('astro.needsHeadRendering')] = true;`; diff --git a/packages/integrations/markdoc/template/content-module-types.d.ts b/packages/integrations/markdoc/template/content-module-types.d.ts index 02be3fa27..528c7db7e 100644 --- a/packages/integrations/markdoc/template/content-module-types.d.ts +++ b/packages/integrations/markdoc/template/content-module-types.d.ts @@ -9,15 +9,12 @@ declare module 'astro:content' { }): Record; }; - type RenderResult = Promise<{ - Content(props: { - config?: import('@astrojs/markdoc').MarkdocConfig; - components?: Record; - }): import('astro').MarkdownInstance<{}>['Content']; - }>; - interface Render { - '.md': RenderResult; - '.mdoc': RenderResult; + '.mdoc': Promise<{ + Content(props: { + config?: import('@astrojs/markdoc').MarkdocConfig; + components?: Record; + }): import('astro').MarkdownInstance<{}>['Content']; + }>; } } diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index 660a28c86..f1f8044a9 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -35,7 +35,6 @@ export default function mdx(partialMdxOptions: Partial = {}): AstroI command, }: any) => { const contentEntryType = { - name: 'astro:mdx', extensions: ['.mdx'], async getEntryInfo({ fileUrl, contents }: { fileUrl: URL; contents: string }) { const parsed = parseFrontmatter(contents, fileURLToPath(fileUrl));