Skip to content

Commit 7539a98

Browse files
Migrate to TS Plugin (#371)
Use a TypeScript plugin in the Visual Studio Code extension instead of providing TypeScript integration via the language server. This reduces the memory footprint and enables interoperability with other TypeScript plugin based integrations, such as Vue. TypeScript support is still supported in the language server, but it must be enabled explicitly via initialize options. Signed-off-by: Johnson Chu <[email protected]> Co-authored-by: Remco Haszing <[email protected]>
1 parent d078833 commit 7539a98

20 files changed

+158
-59
lines changed

.changeset/green-waves-travel.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@mdx-js/language-server": minor
3+
---
4+
5+
Disable TypeScript support by default. The user can opt-in to TypeScript support by explicitly enabling the `typescript.enable` compiler option.

.changeset/wicked-comics-sort.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"vscode-mdx": minor
3+
---
4+
5+
Use a TypeScript plugin for TypeScript integration.

packages/language-server/README.md

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ features specific to MDX.
6969

7070
MDX language server supports the following LSP initialization options:
7171

72+
* `typescript.enabled` (`boolean`, default: `false`) —
73+
If true, enable TypeScript.
7274
* `typescript.tsdk` (`string`, required) —
7375
The path from which to load TypeScript.
7476
* `locale` (`string`, optional) —

packages/language-server/index.js

+16-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
import {
1818
createConnection,
1919
createServer,
20+
createSimpleProjectProviderFactory,
2021
createTypeScriptProjectProviderFactory,
2122
loadTsdkByPath
2223
} from '@volar/language-server/node.js'
@@ -35,19 +36,24 @@ const server = createServer(connection)
3536

3637
connection.onInitialize((parameters) => {
3738
const tsdk = parameters.initializationOptions?.typescript?.tsdk
39+
const tsEnabled = Boolean(
40+
parameters.initializationOptions?.typescript?.enabled
41+
)
3842
assert(
3943
typeof tsdk === 'string',
4044
'Missing initialization option typescript.tsdk'
4145
)
4246

43-
const {diagnosticMessages, typescript} = loadTsdkByPath(
47+
const {typescript, diagnosticMessages} = loadTsdkByPath(
4448
tsdk,
4549
parameters.locale
4650
)
4751

4852
return server.initialize(
4953
parameters,
50-
createTypeScriptProjectProviderFactory(typescript, diagnosticMessages),
54+
tsEnabled
55+
? createTypeScriptProjectProviderFactory(typescript, diagnosticMessages)
56+
: createSimpleProjectProviderFactory(),
5157
{
5258
watchFileExtensions: [
5359
'cjs',
@@ -63,15 +69,20 @@ connection.onInitialize((parameters) => {
6369
],
6470

6571
getServicePlugins() {
66-
return [
72+
const plugins = [
6773
createMarkdownServicePlugin({
6874
getDiagnosticOptions(document, context) {
6975
return context.env.getConfiguration?.('mdx.validate')
7076
}
7177
}),
72-
createMdxServicePlugin(),
73-
createTypeScriptServicePlugin(typescript)
78+
createMdxServicePlugin()
7479
]
80+
81+
if (tsEnabled) {
82+
plugins.push(createTypeScriptServicePlugin(typescript))
83+
}
84+
85+
return plugins
7586
},
7687

7788
async getLanguagePlugins(serviceEnvironment, projectContext) {

packages/language-server/test/completion.test.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ let serverHandle
1111

1212
beforeEach(async () => {
1313
serverHandle = createServer()
14-
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
15-
await serverHandle.initialize(fixtureUri('node16'), {typescript: {tsdk}})
14+
await serverHandle.initialize(fixtureUri('node16'), {
15+
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
16+
typescript: {enabled: true, tsdk}
17+
})
1618
})
1719

1820
afterEach(() => {

packages/language-server/test/definitions.test.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ let serverHandle
1010

1111
beforeEach(async () => {
1212
serverHandle = createServer()
13-
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
14-
await serverHandle.initialize(fixtureUri('node16'), {typescript: {tsdk}})
13+
await serverHandle.initialize(fixtureUri('node16'), {
14+
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
15+
typescript: {enabled: true, tsdk}
16+
})
1517
})
1618

1719
afterEach(() => {

packages/language-server/test/diagnostics.test.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ let serverHandle
1010

1111
beforeEach(async () => {
1212
serverHandle = createServer()
13-
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
14-
await serverHandle.initialize(fixtureUri('node16'), {typescript: {tsdk}})
13+
await serverHandle.initialize(fixtureUri('node16'), {
14+
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
15+
typescript: {enabled: true, tsdk}
16+
})
1517
})
1618

1719
afterEach(() => {

packages/language-server/test/document-link.test.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ let serverHandle
1010

1111
beforeEach(async () => {
1212
serverHandle = createServer()
13-
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
14-
await serverHandle.initialize(fixtureUri('node16'), {typescript: {tsdk}})
13+
await serverHandle.initialize(fixtureUri('node16'), {
14+
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
15+
typescript: {enabled: true, tsdk}
16+
})
1517
})
1618

1719
afterEach(() => {

packages/language-server/test/document-symbols.test.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ let serverHandle
1111

1212
beforeEach(async () => {
1313
serverHandle = createServer()
14-
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
15-
await serverHandle.initialize(fixtureUri('node16'), {typescript: {tsdk}})
14+
await serverHandle.initialize(fixtureUri('node16'), {
15+
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
16+
typescript: {enabled: true, tsdk}
17+
})
1618
})
1719

1820
afterEach(() => {

packages/language-server/test/folding-ranges.test.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ let serverHandle
1010

1111
beforeEach(async () => {
1212
serverHandle = createServer()
13-
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
14-
await serverHandle.initialize(fixtureUri('node16'), {typescript: {tsdk}})
13+
await serverHandle.initialize(fixtureUri('node16'), {
14+
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
15+
typescript: {enabled: true, tsdk}
16+
})
1517
})
1618

1719
afterEach(() => {

packages/language-server/test/hover.test.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ let serverHandle
1010

1111
beforeEach(async () => {
1212
serverHandle = createServer()
13-
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
14-
await serverHandle.initialize(fixtureUri('node16'), {typescript: {tsdk}})
13+
await serverHandle.initialize(fixtureUri('node16'), {
14+
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
15+
typescript: {enabled: true, tsdk}
16+
})
1517
})
1618

1719
afterEach(() => {

packages/language-server/test/initialize.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ test('initialize', async () => {
2020
const {serverInfo, ...initializeResponse} = await serverHandle.initialize(
2121
fixtureUri('node16'),
2222
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
23-
{typescript: {tsdk}}
23+
{typescript: {enabled: true, tsdk}}
2424
)
2525
assert.deepEqual(initializeResponse, {
2626
capabilities: {

packages/language-server/test/no-tsconfig.test.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ let serverHandle
1010

1111
beforeEach(async () => {
1212
serverHandle = createServer()
13-
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
14-
await serverHandle.initialize(fixtureUri('no-tsconfig'), {typescript: {tsdk}})
13+
await serverHandle.initialize(fixtureUri('no-tsconfig'), {
14+
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
15+
typescript: {enabled: true, tsdk}
16+
})
1517
})
1618

1719
afterEach(() => {

packages/language-server/test/prepare-rename.test.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ let serverHandle
1010

1111
beforeEach(async () => {
1212
serverHandle = createServer()
13-
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
14-
await serverHandle.initialize(fixtureUri('node16'), {typescript: {tsdk}})
13+
await serverHandle.initialize(fixtureUri('node16'), {
14+
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
15+
typescript: {enabled: true, tsdk}
16+
})
1517
})
1618

1719
afterEach(() => {

packages/language-server/test/rename.test.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ let serverHandle
1010

1111
beforeEach(async () => {
1212
serverHandle = createServer()
13-
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
14-
await serverHandle.initialize(fixtureUri('node16'), {typescript: {tsdk}})
13+
await serverHandle.initialize(fixtureUri('node16'), {
14+
// @ts-expect-error https://github.com/volarjs/volar.js/pull/142
15+
typescript: {enabled: true, tsdk}
16+
})
1517
})
1618

1719
afterEach(() => {

packages/vscode-mdx/.vscodeignore

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
# Workaround for https://github.com/microsoft/vscode-vsce/issues/580
2+
../../
3+
14
.*
25
.*/
36
*.log
47
*.map
58
*.ts
69
*.tsbuildinfo
10+
node_modules/**
11+
!node_modules/@mdx-js/typescript-plugin.js
712
fixtures/
8-
node_modules/
913
packages/
1014
script/

packages/vscode-mdx/package.json

+15-15
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,23 @@
3434
"onLanguage:typescript",
3535
"onLanguage:typescriptreact"
3636
],
37-
"vsce": {
38-
"dependencies": false
39-
},
4037
"scripts": {
4138
"build": "node ./script/build.mjs",
4239
"build:debug": "npm run build debug",
4340
"generate": "node --conditions development ./script/generate.mjs",
4441
"vscode:prepublish": "npm run build"
4542
},
4643
"devDependencies": {
44+
"@mdx-js/language-service": "0.5.3",
4745
"@types/vscode": "^1.82.0",
4846
"@volar/language-server": "~2.1.0",
4947
"@volar/vscode": "~2.1.0",
5048
"@vscode/vsce": "^2.0.0",
5149
"esbuild": "^0.20.0",
52-
"ovsx": "^0.8.0"
50+
"load-plugin": "^5.0.0",
51+
"ovsx": "^0.8.0",
52+
"remark-frontmatter": "^5.0.0",
53+
"remark-gfm": "^4.0.0"
5354
},
5455
"galleryBanner": {
5556
"color": "#fcb32c",
@@ -196,11 +197,6 @@
196197
}
197198
],
198199
"commands": [
199-
{
200-
"command": "mdx.selectTypescriptVersion",
201-
"title": "Select TypeScript version…",
202-
"category": "MDX"
203-
},
204200
{
205201
"command": "mdx.toggleDelete",
206202
"title": "Toggle Delete",
@@ -223,12 +219,6 @@
223219
}
224220
],
225221
"menus": {
226-
"commandPalette": [
227-
{
228-
"command": "mdx.selectTypescriptVersion",
229-
"when": "editorLangId == mdx"
230-
}
231-
],
232222
"editor/context": [
233223
{
234224
"command": "mdx.toggleDelete",
@@ -310,6 +300,16 @@
310300
"meta.embedded.block.mdx": "mdx"
311301
}
312302
}
303+
],
304+
"typescriptServerPlugins": [
305+
{
306+
"name": "@mdx-js/typescript-plugin",
307+
"enableForWorkspaceTypeScriptVersions": true,
308+
"configNamespace": "typescript",
309+
"languages": [
310+
"mdx"
311+
]
312+
}
313313
]
314314
}
315315
}

packages/vscode-mdx/script/build.mjs

+6-3
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@ const debug = process.argv.includes('debug')
1111
await build({
1212
bundle: true,
1313
entryPoints: {
14-
extension: require.resolve('../src/extension.js'),
15-
'language-server': require.resolve('@mdx-js/language-server')
14+
'out/extension': require.resolve('../src/extension.js'),
15+
'out/language-server': require.resolve('@mdx-js/language-server'),
16+
'node_modules/@mdx-js/typescript-plugin': require.resolve(
17+
'../src/typescript-plugin.js'
18+
)
1619
},
1720
external: ['vscode'],
1821
logLevel: 'info',
1922
minify: !debug,
20-
outdir: fileURLToPath(new URL('../out/', import.meta.url)),
23+
outdir: fileURLToPath(new URL('../', import.meta.url)),
2124
platform: 'node',
2225
sourcemap: debug,
2326
target: 'node16',

packages/vscode-mdx/src/extension.js

+6-14
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import * as languageServerProtocol from '@volar/language-server/protocol.js'
88
import {
99
activateAutoInsertion,
1010
activateDocumentDropEdit,
11-
activateTsVersionStatusItem,
1211
createLabsInfo,
1312
getTsdk
1413
} from '@volar/vscode'
1514
import {
1615
commands,
16+
extensions,
1717
window,
1818
workspace,
1919
Disposable,
@@ -43,6 +43,8 @@ let disposable
4343
* extension.
4444
*/
4545
export async function activate(context) {
46+
extensions.getExtension('vscode.typescript-language-features')?.activate()
47+
4648
const {tsdk} = await getTsdk(context)
4749

4850
client = new LanguageClient(
@@ -81,7 +83,7 @@ export async function activate(context) {
8183
async function tryRestartServer() {
8284
await stopServer()
8385
if (workspace.getConfiguration('mdx').get('server.enable')) {
84-
await startServer(context)
86+
await startServer()
8587
}
8688
}
8789
}
@@ -103,11 +105,8 @@ async function stopServer() {
103105

104106
/**
105107
* Start the language server and client integrations.
106-
*
107-
* @param {ExtensionContext} context
108-
* The extension context as given by VSCode.
109108
*/
110-
async function startServer(context) {
109+
async function startServer() {
111110
if (client.needsStart()) {
112111
await window.withProgress(
113112
{
@@ -123,14 +122,7 @@ async function startServer(context) {
123122
activateMdxToggleCommand('toggleDelete'),
124123
activateMdxToggleCommand('toggleEmphasis'),
125124
activateMdxToggleCommand('toggleInlineCode'),
126-
activateMdxToggleCommand('toggleStrong'),
127-
activateTsVersionStatusItem(
128-
'mdx',
129-
'mdx.selectTypescriptVersion',
130-
context,
131-
client,
132-
(text) => 'TS ' + text
133-
)
125+
activateMdxToggleCommand('toggleStrong')
134126
)
135127
}
136128
)

0 commit comments

Comments
 (0)