1- import { transformerTwoslash } from '@shikijs/twoslash' ;
1+ import {
2+ createTransformerFactory ,
3+ rendererRich ,
4+ transformerTwoslash ,
5+ } from '@shikijs/twoslash' ;
26
37const compose = ( { token, cursor, popup } ) => [
48 {
@@ -10,39 +14,60 @@ const compose = ({ token, cursor, popup }) => [
1014 popup ,
1115] ;
1216
13- export const twoslash = ( options = { } ) =>
14- transformerTwoslash ( {
15- langs : [ 'ts' , 'js' , 'cjs' , 'mjs' ] ,
16- rendererRich : {
17- jsdoc : false ,
18- hast : {
19- hoverToken : { tagName : 'MDXTooltip' } ,
20- hoverPopup : { tagName : 'MDXTooltipContent' } ,
21- hoverCompose : compose ,
22-
23- queryToken : { tagName : 'MDXTooltip' } ,
24- queryPopup : { tagName : 'MDXTooltipContent' } ,
25- queryCompose : compose ,
26-
27- errorToken : { tagName : 'MDXTooltip' } ,
28- errorPopup : { tagName : 'MDXTooltipContent' } ,
29- errorCompose : compose ,
30-
31- completionToken : {
32- tagName : 'MDXTooltip' ,
33- properties : {
34- open : true ,
35- } ,
36- } ,
37- completionPopup : {
38- tagName : 'MDXTooltipContent' ,
39- properties : {
40- align : 'start' ,
41- } ,
42- } ,
43- completionCompose : compose ,
17+ const rendererOptions = {
18+ jsdoc : false ,
19+ hast : {
20+ hoverToken : { tagName : 'MDXTooltip' } ,
21+ hoverPopup : { tagName : 'MDXTooltipContent' } ,
22+ hoverCompose : compose ,
23+
24+ queryToken : { tagName : 'MDXTooltip' } ,
25+ queryPopup : { tagName : 'MDXTooltipContent' } ,
26+ queryCompose : compose ,
27+
28+ errorToken : { tagName : 'MDXTooltip' } ,
29+ errorPopup : { tagName : 'MDXTooltipContent' } ,
30+ errorCompose : compose ,
31+
32+ completionToken : {
33+ tagName : 'MDXTooltip' ,
34+ properties : {
35+ open : true ,
36+ } ,
37+ } ,
38+ completionPopup : {
39+ tagName : 'MDXTooltipContent' ,
40+ properties : {
41+ align : 'start' ,
4442 } ,
4543 } ,
46- throws : false ,
47- ...options ,
48- } ) ;
44+ completionCompose : compose ,
45+ } ,
46+ } ;
47+
48+ const transformerOptions = {
49+ langs : [ 'ts' , 'js' , 'cjs' , 'mjs' ] ,
50+ rendererRich : rendererOptions ,
51+ throws : false ,
52+ } ;
53+
54+ /**
55+ * Creates the Twoslash Shiki transformer.
56+ *
57+ * When `options.twoslasher` is provided, uses `createTransformerFactory`
58+ * directly to avoid importing the default Node.js-dependent twoslasher from
59+ * `twoslash`. This is needed for environments like Cloudflare Workers where
60+ * the filesystem-backed default twoslasher cannot be used.
61+ *
62+ * @param {import('@shikijs/twoslash').TransformerTwoslashIndexOptions } [options]
63+ */
64+ export const twoslash = ( options = { } ) => {
65+ if ( options . twoslasher ) {
66+ return createTransformerFactory (
67+ options . twoslasher ,
68+ rendererRich ( rendererOptions )
69+ ) ( { ...transformerOptions , ...options } ) ;
70+ }
71+
72+ return transformerTwoslash ( { ...transformerOptions , ...options } ) ;
73+ } ;
0 commit comments