Skip to content

Commit 2f82ecd

Browse files
committed
fix(monaco): type inference
1 parent fca4a6d commit 2f82ecd

File tree

5 files changed

+36
-19
lines changed

5 files changed

+36
-19
lines changed

packages/client/builtin/Monaco.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const props = defineProps({
4141
})
4242
4343
const id = nanoid()
44-
const code = ref(decode(props.code))
44+
const code = ref(decode(props.code).trimEnd())
4545
const height = computed(() => props.height === 'auto' ? `${code.value.split(/\r?\n/g).length * 18 + 20}px` : props.height)
4646
const isReady = ref(false)
4747

packages/client/iframes/monaco/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import '/@slidev/styles'
2+
import './index.css'
3+
14
import type * as monaco from 'monaco-editor'
25
import { formatCode } from '../../setup/prettier'
36
import setupMonaco from '../../setup/monaco'
4-
import '/@slidev/styles'
5-
import './index.css'
7+
import '/@slidev/monaco-types'
68

79
const props = {
810
id: Math.random().toString(),

packages/parser/src/core.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import YAML from 'js-yaml'
2-
import { isObject, objectPick, range, uniq } from '@antfu/utils'
2+
import { isObject, isTruthy, objectPick, range, uniq } from '@antfu/utils'
33
import { SlideInfo, SlidevConfig, SlidevMarkdown } from '@slidev/types'
44

55
export function stringify(data: SlidevMarkdown) {
@@ -185,3 +185,22 @@ export function parseRangeString(total: number, rangeStr?: string) {
185185

186186
return uniq(pages).filter(i => i <= total).sort((a, b) => a - b)
187187
}
188+
189+
// types auto discovery for TypeScript monaco
190+
export function scanMonacoModules(md: string) {
191+
const typeModules = new Set<string>()
192+
193+
md.replace(/^```(\w+?)\s*{monaco([\w:,-]*)}[\s\n]*([\s\S]+?)^```/mg, (full, lang = 'ts', options: string, code: string) => {
194+
options = options || ''
195+
lang = lang.trim()
196+
if (lang === 'ts' || lang === 'typescript') {
197+
Array.from(code.matchAll(/\s+from\s+(["'])([\/\w@-]+)\1/g))
198+
.map(i => i[2])
199+
.filter(isTruthy)
200+
.map(i => typeModules.add(i))
201+
}
202+
return ''
203+
})
204+
205+
return Array.from(typeModules)
206+
}

packages/slidev/node/plugins/loaders.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,10 @@ export function createSlidesLoader(
201201
if (id === '/@slidev/styles')
202202
return generateUserStyles()
203203

204+
// styles
205+
if (id === '/@slidev/monaco-types')
206+
return generateMonacoTypes()
207+
204208
// configs
205209
if (id === '/@slidev/configs')
206210
return generateConfigs()
@@ -315,6 +319,10 @@ export function createSlidesLoader(
315319
return imports.join('\n')
316320
}
317321

322+
async function generateMonacoTypes() {
323+
return `void 0; ${parser.scanMonacoModules(data.raw).map(i => `import('/@slidev-monaco-types/${i}')`).join('\n')}`
324+
}
325+
318326
async function generateLayouts() {
319327
const imports: string[] = []
320328
const layouts = objectMap(

packages/slidev/node/plugins/markdown.ts

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import Markdown from 'vite-plugin-md'
2-
// @ts-expect-error
3-
import mila from 'markdown-it-link-attributes'
42
import { Plugin } from 'vite'
53
import type { ShikiOptions } from '@slidev/types'
64
import type MarkdownIt from 'markdown-it'
75
import base64 from 'js-base64'
8-
import { isTruthy, slash } from '@antfu/utils'
6+
import { slash } from '@antfu/utils'
7+
// @ts-expect-error
8+
import mila from 'markdown-it-link-attributes'
99
// @ts-expect-error
1010
import Katex from 'markdown-it-katex'
1111
import { ResolvedSlidevOptions, SlidevPluginOptions } from '../options'
@@ -82,26 +82,14 @@ export async function createMarkdownPlugin(
8282
}
8383

8484
export function transformMarkdownMonaco(md: string) {
85-
const typeModules = new Set<string>()
86-
8785
// transform monaco
8886
md = md.replace(/^```(\w+?)\s*{monaco([\w:,-]*)}[\s\n]*([\s\S]+?)^```/mg, (full, lang = 'ts', options: string, code: string) => {
8987
options = options || ''
9088
lang = lang.trim()
91-
if (lang === 'ts' || lang === 'typescript') {
92-
Array.from(code.matchAll(/\s+from\s+(["'])([\/\w@-]+)\1/g))
93-
.map(i => i[2])
94-
.filter(isTruthy)
95-
.map(i => typeModules.add(i))
96-
}
9789
const encoded = base64.encode(code, true)
9890
return `<Monaco :code="'${encoded}'" lang="${lang}" :readonly="${options.includes('readonly')}" />`
9991
})
10092

101-
// types auto discovery for TypeScript monaco
102-
if (typeModules.size)
103-
md += `\n<script setup>\n${Array.from(typeModules).map(i => `import('/@slidev-monaco-types/${i}')`).join('\n')}\n</script>\n`
104-
10593
return md
10694
}
10795

0 commit comments

Comments
 (0)