expose file url to markdown renderer
This commit is contained in:
parent
3f231cefed
commit
993c085952
4 changed files with 22 additions and 8 deletions
|
@ -30,7 +30,7 @@ type RawContentEvent = { name: ChokidarEvent; entry: string };
|
||||||
type ContentEvent = { name: ChokidarEvent; entry: URL };
|
type ContentEvent = { name: ChokidarEvent; entry: URL };
|
||||||
|
|
||||||
type DataEntryMetadata = Record<string, never>;
|
type DataEntryMetadata = Record<string, never>;
|
||||||
type ContentEntryMetadata = { slug: string };
|
type ContentEntryMetadata = { slug: string, path: string };
|
||||||
type CollectionEntryMap = {
|
type CollectionEntryMap = {
|
||||||
[collection: string]:
|
[collection: string]:
|
||||||
| {
|
| {
|
||||||
|
@ -276,7 +276,7 @@ export async function createContentTypesGenerator({
|
||||||
if (!(entryKey in collectionEntryMap[collectionKey].entries)) {
|
if (!(entryKey in collectionEntryMap[collectionKey].entries)) {
|
||||||
collectionEntryMap[collectionKey] = {
|
collectionEntryMap[collectionKey] = {
|
||||||
type: 'content',
|
type: 'content',
|
||||||
entries: { ...collectionInfo.entries, [entryKey]: { slug: addedSlug } },
|
entries: { ...collectionInfo.entries, [entryKey]: { slug: addedSlug, path: event.entry.toString() } },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return { shouldGenerateTypes: true };
|
return { shouldGenerateTypes: true };
|
||||||
|
@ -453,7 +453,15 @@ async function writeContentFiles({
|
||||||
)}] }`;
|
)}] }`;
|
||||||
|
|
||||||
const slugType = JSON.stringify(entryMetadata.slug);
|
const slugType = JSON.stringify(entryMetadata.slug);
|
||||||
contentTypesStr += `${entryKey}: {\n id: ${entryKey};\n slug: ${slugType};\n body: string;\n collection: ${collectionKey};\n data: ${dataType}\n} & ${renderType};\n`;
|
contentTypesStr += [
|
||||||
|
`${entryKey}: {`,
|
||||||
|
` id: ${entryKey};`,
|
||||||
|
` slug: ${slugType};`,
|
||||||
|
` path: ${JSON.stringify(entryMetadata.path)};`,
|
||||||
|
` body: string;`,
|
||||||
|
` collection: ${collectionKey};`,
|
||||||
|
` data: ${dataType}`,
|
||||||
|
`} & ${renderType};`].join("\n");
|
||||||
}
|
}
|
||||||
contentTypesStr += `};\n`;
|
contentTypesStr += `};\n`;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -116,14 +116,14 @@ export default function mdx(partialMdxOptions: Partial<MdxOptions> = {}): AstroI
|
||||||
if (!id.endsWith('.mdx')) return;
|
if (!id.endsWith('.mdx')) return;
|
||||||
|
|
||||||
// Read code from file manually to prevent Vite from parsing `import.meta.env` expressions
|
// Read code from file manually to prevent Vite from parsing `import.meta.env` expressions
|
||||||
const { fileId } = getFileInfo(id, config);
|
const { fileId, fileUrl } = getFileInfo(id, config);
|
||||||
const code = await fs.readFile(fileId, 'utf-8');
|
const code = await fs.readFile(fileId, 'utf-8');
|
||||||
|
|
||||||
const { data: frontmatter, content: pageContent } = parseFrontmatter(code, id);
|
const { data: frontmatter, content: pageContent } = parseFrontmatter(code, id);
|
||||||
|
|
||||||
const vfile = new VFile({ value: pageContent, path: id });
|
const vfile = new VFile({ value: pageContent, path: id });
|
||||||
// Ensure `data.astro` is available to all remark plugins
|
// Ensure `data.astro` is available to all remark plugins
|
||||||
setVfileFrontmatter(vfile, frontmatter);
|
setVfileFrontmatter(vfile, frontmatter, { fileURL: new URL(fileUrl) });
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const compiled = await processor.process(vfile);
|
const compiled = await processor.process(vfile);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import type { VFileData as Data, VFile } from 'vfile';
|
import type { VFileData as Data, VFile } from 'vfile';
|
||||||
import type { MarkdownAstroData } from './types.js';
|
import type { MarkdownAstroData, MarkdownProcessorRenderOptions } from './types.js';
|
||||||
|
|
||||||
function isValidAstroData(obj: unknown): obj is MarkdownAstroData {
|
function isValidAstroData(obj: unknown): obj is MarkdownAstroData {
|
||||||
if (typeof obj === 'object' && obj !== null && obj.hasOwnProperty('frontmatter')) {
|
if (typeof obj === 'object' && obj !== null && obj.hasOwnProperty('frontmatter')) {
|
||||||
|
@ -27,10 +27,15 @@ export function safelyGetAstroData(vfileData: Data): MarkdownAstroData | Invalid
|
||||||
return astro;
|
return astro;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setVfileFrontmatter(vfile: VFile, frontmatter: Record<string, any>) {
|
export function setVfileFrontmatter(
|
||||||
|
vfile: VFile,
|
||||||
|
frontmatter: Record<string, any>,
|
||||||
|
renderOpts: MarkdownProcessorRenderOptions | undefined
|
||||||
|
) {
|
||||||
vfile.data ??= {};
|
vfile.data ??= {};
|
||||||
vfile.data.astro ??= {};
|
vfile.data.astro ??= {};
|
||||||
(vfile.data.astro as any).frontmatter = frontmatter;
|
(vfile.data.astro as any).frontmatter = frontmatter;
|
||||||
|
(vfile.data.astro as any).fileURL = renderOpts?.fileURL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -124,8 +124,9 @@ export async function createMarkdownProcessor(
|
||||||
|
|
||||||
return {
|
return {
|
||||||
async render(content, renderOpts) {
|
async render(content, renderOpts) {
|
||||||
|
console.log('url', renderOpts?.fileURL);
|
||||||
const vfile = new VFile({ value: content, path: renderOpts?.fileURL });
|
const vfile = new VFile({ value: content, path: renderOpts?.fileURL });
|
||||||
setVfileFrontmatter(vfile, renderOpts?.frontmatter ?? {});
|
setVfileFrontmatter(vfile, renderOpts?.frontmatter ?? {}, renderOpts);
|
||||||
|
|
||||||
const result: MarkdownVFile = await parser.process(vfile).catch((err) => {
|
const result: MarkdownVFile = await parser.process(vfile).catch((err) => {
|
||||||
// Ensure that the error message contains the input filename
|
// Ensure that the error message contains the input filename
|
||||||
|
|
Loading…
Reference in a new issue