diff --git a/docs/content/3.guide/2.displaying/4.typescript.md b/docs/content/3.guide/2.displaying/4.typescript.md index 019f7aea9..a6bdecbc0 100644 --- a/docs/content/3.guide/2.displaying/4.typescript.md +++ b/docs/content/3.guide/2.displaying/4.typescript.md @@ -39,6 +39,27 @@ const { data } = await useAsyncData( ``` +## Markdown Specific Types + +If you know the content being fetched will be Markdown, then you can extend the `MarkdownParsedContent`{lang="ts"} type for improved +type-safety. + +```vue + +``` + + ## The future TypeScript support is a strong focus for us. diff --git a/src/runtime/markdown-parser/index.ts b/src/runtime/markdown-parser/index.ts index b310efb70..07c44c69b 100644 --- a/src/runtime/markdown-parser/index.ts +++ b/src/runtime/markdown-parser/index.ts @@ -8,7 +8,7 @@ import remarkGfm from 'remark-gfm' import rehypeSortAttributeValues from 'rehype-sort-attribute-values' import rehypeSortAttributes from 'rehype-sort-attributes' import rehypeRaw from 'rehype-raw' -import { MarkdownOptions, Toc } from '../types' +import { MarkdownOptions, MarkdownParsedContent, Toc } from '../types' import { parseFrontMatter } from './remark-mdc/frontmatter' import { generateToc } from './toc' import { contentHeading, generateBody } from './content' @@ -61,7 +61,7 @@ export async function parse (file: string, userOptions: Partial */ const heading = contentHeading(body) - return { + return <{ meta: Partial, body: MarkdownParsedContent['body'] }> { body: { ...body, toc diff --git a/src/runtime/server/transformers/markdown.ts b/src/runtime/server/transformers/markdown.ts index a36f3d5a8..900ff57a7 100644 --- a/src/runtime/server/transformers/markdown.ts +++ b/src/runtime/server/transformers/markdown.ts @@ -1,5 +1,6 @@ import { parse } from '../../markdown-parser' import type { MarkdownOptions } from '../../types' +import { MarkdownParsedContent } from '../../types' import { useRuntimeConfig } from '#imports' const importPlugin = async (p: [string, any]) => ([ @@ -17,7 +18,7 @@ export default { const parsed = await parse(content, config) - return { + return { ...parsed.meta, body: parsed.body, _type: 'markdown', diff --git a/src/runtime/types.d.ts b/src/runtime/types.d.ts index f0df92b64..2f01a80d8 100644 --- a/src/runtime/types.d.ts +++ b/src/runtime/types.d.ts @@ -103,6 +103,28 @@ export interface Toc { links: TocLink[] } +export interface MarkdownParsedContent extends ParsedContent { + _type: 'markdown', + /** + * Content is empty + */ + _empty: boolean + /** + * Content description + */ + description: string + /** + * Content excerpt, generated from content + */ + excerpt?: MarkdownRoot + /** + * Parsed Markdown body with included table of contents. + */ + body: MarkdownRoot & { + toc?: Toc + } +} + export interface ContentTransformer { name: string extentions: string[]