diff --git a/.changeset/silent-files-promise.md b/.changeset/silent-files-promise.md new file mode 100644 index 000000000..7264be8cf --- /dev/null +++ b/.changeset/silent-files-promise.md @@ -0,0 +1,5 @@ +--- +'@astrojs/mdx': patch +--- + +Ensure file and url are always present in MDX for Astro.glob diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index da10281a7..cb3f7c3fe 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -96,10 +96,14 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { // or otherwise refactored to not require copy-paste handling logic. code += `\nimport "${'astro:scripts/page-ssr.js'}";`; + const { fileUrl, fileId } = getFileInfo(id, config); if (!moduleExports.includes('url')) { - const { fileUrl } = getFileInfo(id, config); code += `\nexport const url = ${JSON.stringify(fileUrl)};`; } + if (!moduleExports.includes('file')) { + code += `\nexport const file = ${JSON.stringify(fileId)};`; + } + if (command === 'dev') { // TODO: decline HMR updates until we have a stable approach code += `\nif (import.meta.hot) { diff --git a/packages/integrations/mdx/src/utils.ts b/packages/integrations/mdx/src/utils.ts index 1091e8511..c824c39c3 100644 --- a/packages/integrations/mdx/src/utils.ts +++ b/packages/integrations/mdx/src/utils.ts @@ -4,16 +4,34 @@ function appendForwardSlash(path: string) { return path.endsWith('/') ? path : path + '/'; } +interface FileInfo { + fileId: string; + fileUrl: string; +} + /** @see 'vite-plugin-utils' for source */ -export function getFileInfo(id: string, config: AstroConfig) { +export function getFileInfo(id: string, config: AstroConfig): FileInfo { const sitePathname = appendForwardSlash( config.site ? new URL(config.base, config.site).pathname : config.base ); + // Try to grab the file's actual URL + let url: URL | undefined = undefined; + try { + url = new URL(`file://${id}`); + } catch {} + const fileId = id.split('?')[0]; - let fileUrl = fileId.includes('/pages/') - ? fileId.replace(/^.*?\/pages\//, sitePathname).replace(/(\/index)?\.mdx$/, '') - : undefined; + let fileUrl: string; + const isPage = fileId.includes('/pages/'); + if(isPage) { + fileUrl = fileId.replace(/^.*?\/pages\//, sitePathname).replace(/(\/index)?\.mdx$/, ''); + } else if(url && url.pathname.startsWith(config.root.pathname)) { + fileUrl = url.pathname.slice(config.root.pathname.length); + } else { + fileUrl = fileId; + } + if (fileUrl && config.trailingSlash === 'always') { fileUrl = appendForwardSlash(fileUrl); } diff --git a/packages/integrations/mdx/test/fixtures/mdx-get-static-paths/src/content/1.mdx b/packages/integrations/mdx/test/fixtures/mdx-get-static-paths/src/content/1.mdx new file mode 100644 index 000000000..7ad64edfe --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/mdx-get-static-paths/src/content/1.mdx @@ -0,0 +1,5 @@ +--- +one: hello +slug: one +--- +First mdx file diff --git a/packages/integrations/mdx/test/fixtures/mdx-get-static-paths/src/pages/[slug].astro b/packages/integrations/mdx/test/fixtures/mdx-get-static-paths/src/pages/[slug].astro new file mode 100644 index 000000000..fe453a8bf --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/mdx-get-static-paths/src/pages/[slug].astro @@ -0,0 +1,34 @@ +--- +export const getStaticPaths = async () => { + const content = await Astro.glob('../content/*.mdx'); + + return content + .filter((page) => !page.frontmatter.draft) // skip drafts + .map(({ default: MdxContent, frontmatter, url, file }) => { + return { + params: { slug: frontmatter.slug || "index" }, + props: { + MdxContent, + file, + frontmatter, + url + } + } + }) +} + +const { MdxContent, frontmatter, url, file } = Astro.props; +--- + + +
+