From ddff088627917480591c525122eea602866a4dd0 Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Thu, 2 Jun 2022 16:41:38 +1000 Subject: [PATCH 1/4] feat(types): expose `MarkdownParsedContent` for improved markdown type generics --- .../3.guide/2.displaying/4.typescript.md | 21 +++++++++++++++++++ src/runtime/server/transformers/markdown.ts | 3 ++- src/runtime/types.d.ts | 16 ++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) 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/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..2614c1835 100644 --- a/src/runtime/types.d.ts +++ b/src/runtime/types.d.ts @@ -103,6 +103,22 @@ export interface Toc { links: TocLink[] } +export interface MarkdownParsedContent extends ParsedContent { + _type: 'markdown', + /** + * Content is empty + */ + _empty?: boolean + /** + * Content description + */ + description: string + excerpt?: MarkdownRoot + body: MarkdownRoot & { + toc?: Toc + } +} + export interface ContentTransformer { name: string extentions: string[] From 7b32fe2e501533da145844ab6e43dae364689168 Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Thu, 2 Jun 2022 16:48:46 +1000 Subject: [PATCH 2/4] fix: add type for markdown-parser result --- src/runtime/markdown-parser/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From f0194aaad2504df54e7da32711ae3e39a392ed55 Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Thu, 2 Jun 2022 16:50:17 +1000 Subject: [PATCH 3/4] fix: add doc to types --- src/runtime/types.d.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/runtime/types.d.ts b/src/runtime/types.d.ts index 2614c1835..7eaa8709a 100644 --- a/src/runtime/types.d.ts +++ b/src/runtime/types.d.ts @@ -113,7 +113,13 @@ export interface MarkdownParsedContent extends ParsedContent { * Content description */ description: string + /** + * Content excerpt, generated from content + */ excerpt?: MarkdownRoot + /** + * Parsed Markdown body with included table of contents. + */ body: MarkdownRoot & { toc?: Toc } From 7ccec6e73d8e7436320fce4bfe0150184435224c Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Thu, 2 Jun 2022 16:57:53 +1000 Subject: [PATCH 4/4] fix: _empty is always provided --- src/runtime/types.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/types.d.ts b/src/runtime/types.d.ts index 7eaa8709a..2f01a80d8 100644 --- a/src/runtime/types.d.ts +++ b/src/runtime/types.d.ts @@ -108,7 +108,7 @@ export interface MarkdownParsedContent extends ParsedContent { /** * Content is empty */ - _empty?: boolean + _empty: boolean /** * Content description */