Skip to content

Commit 186af69

Browse files
Upgrade to Volar 2.2 (#431)
Co-authored-by: Remco Haszing <[email protected]>
1 parent ec5191f commit 186af69

File tree

14 files changed

+190
-153
lines changed

14 files changed

+190
-153
lines changed

.changeset/red-timers-love.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"@mdx-js/typescript-plugin": patch
3+
"@mdx-js/language-service": patch
4+
"@mdx-js/language-server": patch
5+
"vscode-mdx": patch
6+
---
7+
8+
Update to Volar 2.2.

packages/language-server/index.js

Lines changed: 82 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ import {
1818
import {
1919
createConnection,
2020
createServer,
21-
createSimpleProjectProviderFactory,
22-
createTypeScriptProjectProviderFactory,
21+
createSimpleProjectProvider,
22+
createTypeScriptProjectProvider,
2323
loadTsdkByPath
2424
} from '@volar/language-server/node.js'
2525
import {loadPlugin} from 'load-plugin'
@@ -36,7 +36,7 @@ const defaultPlugins = [[remarkFrontmatter, ['toml', 'yaml']], remarkGfm]
3636
const connection = createConnection()
3737
const server = createServer(connection)
3838

39-
connection.onInitialize((parameters) => {
39+
connection.onInitialize(async (parameters) => {
4040
const tsdk = parameters.initializationOptions?.typescript?.tsdk
4141
const tsEnabled = Boolean(
4242
parameters.initializationOptions?.typescript?.enabled
@@ -53,85 +53,76 @@ connection.onInitialize((parameters) => {
5353

5454
return server.initialize(
5555
parameters,
56+
getLanguageServicePlugins(),
5657
tsEnabled
57-
? createTypeScriptProjectProviderFactory(typescript, diagnosticMessages)
58-
: createSimpleProjectProviderFactory(),
59-
{
60-
watchFileExtensions: [
61-
'cjs',
62-
'cts',
63-
'js',
64-
'jsx',
65-
'json',
66-
'mdx',
67-
'mjs',
68-
'mts',
69-
'ts',
70-
'tsx'
71-
],
72-
73-
getServicePlugins() {
74-
const plugins = [
75-
createMarkdownServicePlugin({
76-
getDiagnosticOptions(document, context) {
77-
return context.env.getConfiguration?.('mdx.validate')
78-
}
79-
}),
80-
createMdxServicePlugin()
81-
]
82-
83-
if (tsEnabled) {
84-
plugins.push(...createTypeScriptServicePlugin(typescript, {}))
85-
} else {
86-
plugins.push(createTypeScriptSyntacticServicePlugin(typescript))
87-
}
88-
89-
return plugins
90-
},
91-
92-
async getLanguagePlugins(serviceEnvironment, projectContext) {
93-
const configFileName = projectContext?.typescript?.configFileName
94-
95-
/** @type {PluggableList | undefined} */
96-
let plugins
97-
let checkMdx = false
98-
let jsxImportSource = 'react'
58+
? createTypeScriptProjectProvider(
59+
typescript,
60+
diagnosticMessages,
61+
(_, {configFileName}) => getLanguagePlugins(configFileName)
62+
)
63+
: createSimpleProjectProvider(await getLanguagePlugins(undefined))
64+
)
9965

100-
if (configFileName) {
101-
const cwd = path.dirname(configFileName)
102-
const configSourceFile = typescript.readJsonConfigFile(
103-
configFileName,
104-
typescript.sys.readFile
105-
)
106-
const commandLine = typescript.parseJsonSourceFileConfigFileContent(
107-
configSourceFile,
108-
typescript.sys,
109-
cwd,
110-
undefined,
111-
configFileName
112-
)
113-
plugins = await resolveRemarkPlugins(
114-
commandLine.raw?.mdx,
115-
(name) =>
116-
/** @type {Promise<Plugin>} */ (
117-
loadPlugin(name, {prefix: 'remark', from: pathToFileURL(cwd)})
118-
)
119-
)
120-
checkMdx = Boolean(commandLine.raw?.mdx?.checkMdx)
121-
jsxImportSource =
122-
commandLine.options.jsxImportSource || jsxImportSource
66+
function getLanguageServicePlugins() {
67+
const plugins = [
68+
createMarkdownServicePlugin({
69+
getDiagnosticOptions(document, context) {
70+
return context.env.getConfiguration?.('mdx.validate')
12371
}
72+
}),
73+
createMdxServicePlugin()
74+
]
75+
76+
if (tsEnabled) {
77+
plugins.push(...createTypeScriptServicePlugin(typescript, {}))
78+
} else {
79+
plugins.push(createTypeScriptSyntacticServicePlugin(typescript))
80+
}
12481

125-
return [
126-
createMdxLanguagePlugin(
127-
plugins || defaultPlugins,
128-
checkMdx,
129-
jsxImportSource
82+
return plugins
83+
}
84+
85+
/**
86+
* @param {string | undefined} tsconfig
87+
*/
88+
async function getLanguagePlugins(tsconfig) {
89+
/** @type {PluggableList | undefined} */
90+
let plugins
91+
let checkMdx = false
92+
let jsxImportSource = 'react'
93+
94+
if (tsconfig) {
95+
const cwd = path.dirname(tsconfig)
96+
const configSourceFile = typescript.readJsonConfigFile(
97+
tsconfig,
98+
typescript.sys.readFile
99+
)
100+
const commandLine = typescript.parseJsonSourceFileConfigFileContent(
101+
configSourceFile,
102+
typescript.sys,
103+
cwd,
104+
undefined,
105+
tsconfig
106+
)
107+
plugins = await resolveRemarkPlugins(
108+
commandLine.raw?.mdx,
109+
(name) =>
110+
/** @type {Promise<Plugin>} */ (
111+
loadPlugin(name, {prefix: 'remark', from: pathToFileURL(cwd)})
130112
)
131-
]
132-
}
113+
)
114+
checkMdx = Boolean(commandLine.raw?.mdx?.checkMdx)
115+
jsxImportSource = commandLine.options.jsxImportSource || jsxImportSource
133116
}
134-
)
117+
118+
return [
119+
createMdxLanguagePlugin(
120+
plugins || defaultPlugins,
121+
checkMdx,
122+
jsxImportSource
123+
)
124+
]
125+
}
135126
})
136127

137128
connection.onRequest('mdx/toggleDelete', async (parameters) => {
@@ -156,6 +147,20 @@ connection.onRequest('mdx/toggleStrong', async (parameters) => {
156147

157148
connection.onInitialized(() => {
158149
server.initialized()
150+
server.watchFiles([
151+
`**/*.{${[
152+
'cjs',
153+
'cts',
154+
'js',
155+
'jsx',
156+
'json',
157+
'mdx',
158+
'mjs',
159+
'mts',
160+
'ts',
161+
'tsx'
162+
].join(',')}}`
163+
])
159164
})
160165

161166
connection.listen()
@@ -165,7 +170,7 @@ connection.listen()
165170
* @returns {Promise<Commands>}
166171
*/
167172
async function getCommands(uri) {
168-
const project = await server.projects.getProject(uri)
173+
const project = await server.projects.get.call(server, uri)
169174
const service = project.getLanguageService()
170175
return service.context.inject('mdxCommands')
171176
}

packages/language-server/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,17 @@
3333
},
3434
"dependencies": {
3535
"@mdx-js/language-service": "0.5.4",
36-
"@volar/language-server": "~2.1.0",
36+
"@volar/language-server": "~2.2.0",
3737
"load-plugin": "^6.0.0",
3838
"remark-frontmatter": "^5.0.0",
3939
"remark-gfm": "^4.0.0",
40-
"volar-service-markdown": "0.0.34",
41-
"volar-service-typescript": "0.0.34",
40+
"volar-service-markdown": "0.0.42",
41+
"volar-service-typescript": "0.0.42",
4242
"vscode-uri": "^3.0.0"
4343
},
4444
"devDependencies": {
4545
"@types/node": "^20.0.0",
46-
"@volar/test-utils": "~2.1.0",
46+
"@volar/test-utils": "~2.2.0",
4747
"unified": "^11.0.0"
4848
}
4949
}

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

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,21 @@ test('support completion in ESM', async () => {
3636
assert.deepEqual(completion, {
3737
commitCharacters: ['.', ',', ';', '('],
3838
data: {
39+
embeddedDocumentUri:
40+
'volar-embedded-content://jsx/' +
41+
encodeURIComponent(fixtureUri('node16/completion.mdx')),
3942
original: {
4043
data: {
4144
fileName: fixturePath('node16/completion.mdx'),
4245
offset: 81,
4346
originalItem: {name: 'Boolean'},
44-
uri: fixtureUri('node16/completion.mdx?virtualCodeId=jsx')
47+
uri:
48+
'volar-embedded-content://jsx/' +
49+
encodeURIComponent(fixtureUri('node16/completion.mdx'))
4550
}
4651
},
4752
serviceIndex: 2,
48-
uri: fixtureUri('node16/completion.mdx'),
49-
virtualDocumentUri: fixtureUri('node16/completion.mdx?virtualCodeId=jsx')
53+
uri: fixtureUri('node16/completion.mdx')
5054
},
5155
insertTextFormat: InsertTextFormat.PlainText,
5256
kind: CompletionItemKind.Variable,
@@ -61,7 +65,9 @@ test('support completion in ESM', async () => {
6165
fileName: fixturePath('node16/completion.mdx'),
6266
offset: 81,
6367
originalItem: {name: 'Boolean'},
64-
uri: fixtureUri('node16/completion.mdx?virtualCodeId=jsx')
68+
uri:
69+
'volar-embedded-content://jsx/' +
70+
encodeURIComponent(fixtureUri('node16/completion.mdx'))
6571
},
6672
detail: 'interface Boolean\nvar Boolean: BooleanConstructor',
6773
documentation: {kind: 'markdown', value: ''},
@@ -92,17 +98,21 @@ test('support completion in JSX', async () => {
9298
assert.deepEqual(completion, {
9399
commitCharacters: ['.', ',', ';', '('],
94100
data: {
101+
embeddedDocumentUri:
102+
'volar-embedded-content://jsx/' +
103+
encodeURIComponent(fixtureUri('node16/completion.mdx')),
95104
original: {
96105
data: {
97106
fileName: fixturePath('node16/completion.mdx'),
98107
offset: 119,
99108
originalItem: {name: 'Boolean'},
100-
uri: fixtureUri('node16/completion.mdx?virtualCodeId=jsx')
109+
uri:
110+
'volar-embedded-content://jsx/' +
111+
encodeURIComponent(fixtureUri('node16/completion.mdx'))
101112
}
102113
},
103114
serviceIndex: 2,
104-
uri: fixtureUri('node16/completion.mdx'),
105-
virtualDocumentUri: fixtureUri('node16/completion.mdx?virtualCodeId=jsx')
115+
uri: fixtureUri('node16/completion.mdx')
106116
},
107117
insertTextFormat: InsertTextFormat.PlainText,
108118
kind: CompletionItemKind.Variable,
@@ -117,7 +127,9 @@ test('support completion in JSX', async () => {
117127
fileName: fixturePath('node16/completion.mdx'),
118128
offset: 119,
119129
originalItem: {name: 'Boolean'},
120-
uri: fixtureUri('node16/completion.mdx?virtualCodeId=jsx')
130+
uri:
131+
'volar-embedded-content://jsx/' +
132+
encodeURIComponent(fixtureUri('node16/completion.mdx'))
121133
},
122134
detail: 'interface Boolean\nvar Boolean: BooleanConstructor',
123135
documentation: {kind: 'markdown', value: ''},

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@ test('parse errors', async () => {
3535
href: 'https://github.com/micromark/micromark-extension-mdxjs-esm#could-not-parse-importexports-with-acorn'
3636
},
3737
data: {
38-
documentUri: fixtureUri('node16/syntax-error.mdx?virtualCodeId=mdx'),
38+
documentUri:
39+
'volar-embedded-content://mdx/' +
40+
encodeURIComponent(fixtureUri('node16/syntax-error.mdx')),
3941
isFormat: false,
4042
original: {},
4143
serviceIndex: 1,
4244
uri: fixtureUri('node16/syntax-error.mdx'),
43-
version: 1
45+
version: 0
4446
},
4547
message: 'Could not parse import/exports with acorn',
4648
range: {
@@ -73,12 +75,14 @@ test('type errors', async () => {
7375
{
7476
code: 2568,
7577
data: {
76-
documentUri: fixtureUri('node16/type-errors.mdx?virtualCodeId=jsx'),
78+
documentUri:
79+
'volar-embedded-content://jsx/' +
80+
encodeURIComponent(fixtureUri('node16/type-errors.mdx')),
7781
isFormat: false,
7882
original: {},
7983
serviceIndex: 2,
8084
uri: fixtureUri('node16/type-errors.mdx'),
81-
version: 1
85+
version: 0
8286
},
8387
message:
8488
"Property 'counter' may not exist on type '{ readonly count: number; readonly components?: {}; }'. Did you mean 'count'?",
@@ -92,12 +96,14 @@ test('type errors', async () => {
9296
{
9397
code: 2568,
9498
data: {
95-
documentUri: fixtureUri('node16/type-errors.mdx?virtualCodeId=jsx'),
99+
documentUri:
100+
'volar-embedded-content://jsx/' +
101+
encodeURIComponent(fixtureUri('node16/type-errors.mdx')),
96102
isFormat: false,
97103
original: {},
98104
serviceIndex: 2,
99105
uri: fixtureUri('node16/type-errors.mdx'),
100-
version: 1
106+
version: 0
101107
},
102108
message:
103109
"Property 'counts' may not exist on type 'Props'. Did you mean 'count'?",
@@ -149,12 +155,14 @@ test('provided components', async () => {
149155
{
150156
code: 2741,
151157
data: {
152-
documentUri: fixtureUri('provide/solar-system.mdx?virtualCodeId=jsx'),
158+
documentUri:
159+
'volar-embedded-content://jsx/' +
160+
encodeURIComponent(fixtureUri('provide/solar-system.mdx')),
153161
isFormat: false,
154162
original: {},
155163
serviceIndex: 2,
156164
uri: fixtureUri('provide/solar-system.mdx'),
157-
version: 1
165+
version: 0
158166
},
159167
message:
160168
"Property 'distanceFromStar' is missing in type '{ name: string; radius: number; }' but required in type 'PlanetProps'.",

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,9 @@ test('resolve markdown link references', async () => {
4545
pathText: 'mdx',
4646
resource: {
4747
$mid: 1,
48-
path: fixturePath('node16/link-reference.mdx').replace(
49-
/^\/?/,
50-
'/'
51-
),
52-
query: 'virtualCodeId=md',
53-
scheme: 'file'
48+
authority: 'md',
49+
path: '/' + fixtureUri('node16/link-reference.mdx'),
50+
scheme: 'volar-embedded-content'
5451
},
5552
range: {
5653
start: {line: 0, character: 8},

0 commit comments

Comments
 (0)