Skip to content

Commit 7b8a829

Browse files
authored
Add support for SpecialComponents to be any ComponentType
Reviewed-by: Christian Murphy <christian.murphy.42@gmail.com> Reviewed-by: Titus Wormer <tituswormer@gmail.com> Closes GH-640.
1 parent 84308d1 commit 7b8a829

File tree

2 files changed

+20
-26
lines changed

2 files changed

+20
-26
lines changed

lib/ast-to-react.js

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* @template T
3+
* @typedef {import('react').ComponentType<T>} ComponentType<T>
4+
*/
5+
16
/**
27
* @typedef {import('react').ReactNode} ReactNode
38
* @typedef {import('unist').Position} Position
@@ -44,33 +49,21 @@
4449
*
4550
* To do: is `data-sourcepos` typeable?
4651
*
47-
* @callback CodeComponent
48-
* @param {JSX.IntrinsicElements['code'] & ReactMarkdownProps & {inline?: boolean}} props
49-
* @returns {ReactNode}
50-
*
51-
* @callback HeadingComponent
52-
* @param {JSX.IntrinsicElements['h1'] & ReactMarkdownProps & {level: number}} props
53-
* @returns {ReactNode}
54-
*
55-
* @callback LiComponent
56-
* @param {JSX.IntrinsicElements['li'] & ReactMarkdownProps & {checked: boolean|null, index: number, ordered: boolean}} props
57-
* @returns {ReactNode}
58-
*
59-
* @callback OrderedListComponent
60-
* @param {JSX.IntrinsicElements['ol'] & ReactMarkdownProps & {depth: number, ordered: true}} props
61-
* @returns {ReactNode}
62-
*
63-
* @callback TableCellComponent
64-
* @param {JSX.IntrinsicElements['table'] & ReactMarkdownProps & {style?: Object.<string, unknown>, isHeader: boolean}} props
65-
* @returns {ReactNode}
66-
*
67-
* @callback TableRowComponent
68-
* @param {JSX.IntrinsicElements['tr'] & ReactMarkdownProps & {isHeader: boolean}} props
69-
* @returns {ReactNode}
52+
* @typedef {JSX.IntrinsicElements['code'] & ReactMarkdownProps & {inline?: boolean}} CodeProps
53+
* @typedef {JSX.IntrinsicElements['h1'] & ReactMarkdownProps & {level: number}} HeadingProps
54+
* @typedef {JSX.IntrinsicElements['li'] & ReactMarkdownProps & {checked: boolean|null, index: number, ordered: boolean}} LiProps
55+
* @typedef {JSX.IntrinsicElements['ol'] & ReactMarkdownProps & {depth: number, ordered: true}} OrderedListProps
56+
* @typedef {JSX.IntrinsicElements['table'] & ReactMarkdownProps & {style?: Object.<string, unknown>, isHeader: boolean}} TableCellProps
57+
* @typedef {JSX.IntrinsicElements['tr'] & ReactMarkdownProps & {isHeader: boolean}} TableRowProps
58+
* @typedef {JSX.IntrinsicElements['ul'] & ReactMarkdownProps & {depth: number, ordered: false}} UnorderedListProps
7059
*
71-
* @callback UnorderedListComponent
72-
* @param {JSX.IntrinsicElements['ul'] & ReactMarkdownProps & {depth: number, ordered: false}} props
73-
* @returns {ReactNode}
60+
* @typedef {ComponentType<CodeProps>} CodeComponent
61+
* @typedef {ComponentType<HeadingProps>} HeadingComponent
62+
* @typedef {ComponentType<LiProps>} LiComponent
63+
* @typedef {ComponentType<OrderedListProps>} OrderedListComponent
64+
* @typedef {ComponentType<TableCellProps>} TableCellComponent
65+
* @typedef {ComponentType<TableRowProps>} TableRowComponent
66+
* @typedef {ComponentType<UnorderedListProps>} UnorderedListComponent
7467
*
7568
* @typedef SpecialComponents
7669
* @property {CodeComponent|ReactMarkdownNames} code

test/test.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,6 +1195,7 @@ test('should pass `node` as prop to all non-tag/non-fragment components', () =>
11951195
<Markdown
11961196
children={input}
11971197
components={{
1198+
// @ts-expect-error JSX types currently only handle element returns not string returns
11981199
h1(props) {
11991200
let text = ''
12001201
visit(props.node, 'text', (child) => {

0 commit comments

Comments
 (0)