Skip to content

Commit f88955b

Browse files
committed
feat(language-service): Make mdx nodes typed with MDX.IntrinsicElements
1 parent 5c96eac commit f88955b

1 file changed

Lines changed: 30 additions & 2 deletions

File tree

packages/language-service/lib/virtual-code.js

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,25 @@ import {isInjectableComponent, isInjectableEstree} from './jsx-utils.js'
2424
*/
2525
const jsPrefix = (jsxImportSource) => `/* @jsxRuntime automatic
2626
@jsxImportSource ${jsxImportSource} */
27+
28+
/**
29+
* @internal
30+
* @template T
31+
* @typedef {void extends MDX.IntrinsicElements ? any : T extends keyof MDX.IntrinsicElements ? MDX.IntrinsicElements[T] : any} _MDXProps
32+
*/
33+
34+
/**
35+
* @internal
36+
* @typedef {void extends MDX.Element ? JSX.Element : MDX.Element} _MDXElement
37+
*/
38+
39+
/**
40+
* @internal
41+
* @type {{
42+
* [Name in keyof _MDXNodeNames]: (props: _MDXProps<Name>) => _MDXElement
43+
* }}
44+
*/
45+
const _MDXNodes = /** @type {any} */(0);
2746
`
2847

2948
/**
@@ -247,6 +266,8 @@ function getEmbeddedCodes(
247266
let jsxVariables = ''
248267
let markdown = ''
249268
let nextMarkdownSourceStart = 0
269+
/** @type {Set<string>} */
270+
const foundMdxNodeNames = new Set()
250271

251272
const plugins = virtualCodePlugins.map((plugin) => plugin())
252273
/** @type {CodeMapping[]} */
@@ -739,7 +760,8 @@ function getEmbeddedCodes(
739760
}
740761

741762
default: {
742-
jsx += jsxIndent + '<>'
763+
foundMdxNodeNames.add(node.type)
764+
jsx += jsxIndent + `<_MDXNodes.${node.type}>`
743765
break
744766
}
745767
}
@@ -789,7 +811,7 @@ function getEmbeddedCodes(
789811
}
790812

791813
default: {
792-
jsx += jsxIndent + '</>'
814+
jsx += jsxIndent + `</_MDXNodes.${node.type}>`
793815
break
794816
}
795817
}
@@ -820,6 +842,12 @@ function getEmbeddedCodes(
820842
esmMapping.lengths.unshift(0)
821843
}
822844

845+
esm += `/**
846+
* @typedef {object} _MDXNodeNames
847+
${[...foundMdxNodeNames].map((name) => ` * @property {unknown} ${name}`).join('\n')}
848+
*/
849+
`
850+
823851
updateMarkdownFromOffsets(mdx.length, mdx.length)
824852
esm += componentStart(hasAwait, programScope)
825853

0 commit comments

Comments
 (0)