use ESM for HTML/CSS/JSON language servers#309566
Merged
Conversation
Contributor
Contributor
There was a problem hiding this comment.
Pull request overview
Updates the built-in HTML/CSS/JSON language server packages to align with an ESM build/output model, including ESM-style import specifiers and ESM esbuild bundles. This fits into the ongoing ESM modernization effort and unblocks newer *-languageservice “next” packages for the servers.
Changes:
- Switch server TypeScript compilation targets to ESM (
module: "esnext") and update internal relative imports to include.js. - Build node + browser server bundles as ESM via esbuild (
format: "esm") and add a NodecreateRequirebanner for CJS dependencies. - Bump
vscode-*-languageservicedependencies to*-next.*versions for HTML/CSS/JSON servers.
Show a summary per file
| File | Description |
|---|---|
| extensions/json-language-features/server/tsconfig.json | Switch JSON server TS emit to ESM (module: esnext). |
| extensions/json-language-features/server/src/utils/validation.ts | Update relative imports to .js for ESM compatibility. |
| extensions/json-language-features/server/src/utils/runner.ts | Update relative import to .js for ESM compatibility. |
| extensions/json-language-features/server/src/node/jsonServerMain.ts | Update relative imports to .js for ESM compatibility. |
| extensions/json-language-features/server/src/jsonServer.ts | Update relative imports to .js for ESM compatibility. |
| extensions/json-language-features/server/src/browser/jsonServerMain.ts | Update relative import to .js for ESM compatibility. |
| extensions/json-language-features/server/package.json | Bump vscode-json-languageservice to 6.0.0-next.1; adjust install script to @next. |
| extensions/json-language-features/server/package-lock.json | Lockfile updates for vscode-json-languageservice@6.0.0-next.1 and transitive deps. |
| extensions/json-language-features/esbuild.mts | Build JSON node server bundle as ESM + add createRequire banner/externalization. |
| extensions/json-language-features/esbuild.browser.mts | Build JSON browser worker bundle as ESM. |
| extensions/html-language-features/server/tsconfig.json | Switch HTML server TS emit to ESM (module: esnext). |
| extensions/html-language-features/server/test/index.js | Convert HTML server test runner to ESM (import + import.meta.dirname). |
| extensions/html-language-features/server/src/utils/validation.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/utils/runner.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/src/utils/positions.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/src/utils/documentContext.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/src/test/words.test.ts | Update imports and path resolution for ESM (import.meta.dirname). |
| extensions/html-language-features/server/src/test/semanticTokens.test.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/test/selectionRanges.test.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/test/rename.test.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/test/formatting.test.ts | Update imports and fixture paths for ESM (import.meta.dirname). |
| extensions/html-language-features/server/src/test/folding.test.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/test/embedded.test.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/test/documentContext.test.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/src/test/completions.test.ts | Update relative imports and fixture root path for ESM (import.meta.dirname). |
| extensions/html-language-features/server/src/requests.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/src/node/nodeFs.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/src/node/htmlServerMain.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/modes/semanticTokens.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/modes/selectionRanges.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/modes/languageModes.ts | Update relative imports to .js and adjust capability typing/exports. |
| extensions/html-language-features/server/src/modes/javascriptSemanticTokens.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/src/modes/javascriptMode.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/modes/javascriptLibs.ts | Switch __dirname usage to import.meta.dirname for ESM. |
| extensions/html-language-features/server/src/modes/htmlMode.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/src/modes/htmlFolding.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/src/modes/formatting.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/modes/embeddedSupport.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/src/modes/cssMode.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/htmlServer.ts | Update relative imports to .js for ESM compatibility. |
| extensions/html-language-features/server/src/customData.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/src/browser/htmlServerMain.ts | Update relative import to .js for ESM compatibility. |
| extensions/html-language-features/server/package.json | Mark HTML server package as ESM (type: module) and bump language service deps to next. |
| extensions/html-language-features/server/package-lock.json | Lockfile updates for bumped HTML/CSS language service deps. |
| extensions/html-language-features/esbuild.mts | Build HTML node server bundle as ESM + add createRequire banner/externalization. |
| extensions/html-language-features/esbuild.browser.mts | Build HTML browser worker bundle as ESM. |
| extensions/html-language-features/client/tsconfig.json | Switch HTML client TS config to nodenext module + resolution. |
| extensions/css-language-features/server/tsconfig.json | Switch CSS server TS emit to ESM (module: esnext). |
| extensions/css-language-features/server/src/utils/validation.ts | Update relative imports to .js for ESM compatibility. |
| extensions/css-language-features/server/src/utils/runner.ts | Update relative import to .js for ESM compatibility. |
| extensions/css-language-features/server/src/utils/documentContext.ts | Update relative import to .js for ESM compatibility. |
| extensions/css-language-features/server/src/test/links.test.ts | Update imports and path resolution for ESM (import.meta.dirname). |
| extensions/css-language-features/server/src/test/completion.test.ts | Update imports and path resolution for ESM (import.meta.dirname). |
| extensions/css-language-features/server/src/requests.ts | Update relative import to .js for ESM compatibility. |
| extensions/css-language-features/server/src/node/nodeFs.ts | Update relative import to .js for ESM compatibility. |
| extensions/css-language-features/server/src/node/cssServerMain.ts | Update relative imports to .js for ESM compatibility. |
| extensions/css-language-features/server/src/customData.ts | Update relative import to .js for ESM compatibility. |
| extensions/css-language-features/server/src/cssServer.ts | Update relative imports to .js for ESM compatibility. |
| extensions/css-language-features/server/src/browser/cssServerMain.ts | Update relative import to .js for ESM compatibility. |
| extensions/css-language-features/server/package.json | Bump vscode-css-languageservice to 7.0.0-next.1; adjust install script to @next. |
| extensions/css-language-features/server/package-lock.json | Lockfile updates for bumped CSS language service deps. |
| extensions/css-language-features/esbuild.mts | Build CSS node server bundle as ESM + add createRequire banner/externalization. |
| extensions/css-language-features/esbuild.browser.mts | Build CSS browser worker bundle as ESM. |
Copilot's findings
Files not reviewed (3)
- extensions/css-language-features/server/package-lock.json: Language not supported
- extensions/html-language-features/server/package-lock.json: Language not supported
- extensions/json-language-features/server/package-lock.json: Language not supported
Comments suppressed due to low confidence (7)
extensions/html-language-features/esbuild.browser.mts:113
- The browser server bundle is now built as ESM (
format: 'esm'), but the web extension clients create the worker usingnew Worker(url)(classic worker). Classic workers cannot execute ESM output. Either switch the worker creation to{ type: 'module' }in the browser client, or keep the browser server build in a classic-script format.
// Build server
run({
platform: 'browser',
format: 'esm',
entryPoints: {
'htmlServerMain': path.join(extensionRoot, 'server', 'src', 'browser', 'htmlServerWorkerMain.ts'),
},
srcDir: path.join(extensionRoot, 'server', 'src'),
outdir: path.join(extensionRoot, 'server', 'dist', 'browser'),
additionalOptions: {
tsconfig: path.join(extensionRoot, 'server', 'tsconfig.browser.json'),
plugins: [javaScriptLibsPlugin()],
},
}, process.argv),
]);
extensions/css-language-features/server/tsconfig.json:16
- With
module: "esnext"and the new relative imports using explicit.jsextensions in this project, TypeScript needs Node-style ESM resolution (e.g.moduleResolution: "nodenext"/"node16", or switchingmoduleto"nodenext"). Without that, TS will try to resolve./foo.jsas an actual.jssource file and the build is expected to fail.
"lib": [
"ES2024",
"WebWorker"
],
"module": "esnext",
"types": [
"node"
],
"typeRoots": [
"../node_modules/@types"
]
extensions/html-language-features/server/tsconfig.json:17
- With
module: "esnext"and the new relative imports using explicit.jsextensions in this project, TypeScript needs Node-style ESM resolution (e.g.moduleResolution: "nodenext"/"node16", or switchingmoduleto"nodenext"). Without that, TS will try to resolve./foo.jsas an actual.jssource file and the build is expected to fail.
extensions/css-language-features/esbuild.browser.mts:33 - The browser server bundle is now built as ESM (
format: 'esm'), but the web extension clients create the worker usingnew Worker(url)(classic worker). Classic workers cannot execute ESM output. Either switch the worker creation to{ type: 'module' }in the browser client, or keep the browser server build in a classic-script format.
// Build server
run({
platform: 'browser',
format: 'esm',
entryPoints: {
'cssServerMain': path.join(extensionRoot, 'server', 'src', 'browser', 'cssServerWorkerMain.ts'),
},
srcDir: path.join(extensionRoot, 'server', 'src'),
outdir: path.join(extensionRoot, 'server', 'dist', 'browser'),
additionalOptions: {
extensions/json-language-features/esbuild.browser.mts:35
- The browser server bundle is now built as ESM (
format: 'esm'), but the web extension clients create the worker usingnew Worker(url)(classic worker). Classic workers cannot execute ESM output. Either switch the worker creation to{ type: 'module' }in the browser client, or keep the browser server build in a classic-script format.
extensions/json-language-features/server/tsconfig.json:18 - With
module: "esnext"and the new relative imports using explicit.jsextensions in this project, TypeScript needs Node-style ESM resolution (e.g.moduleResolution: "nodenext"/"node16", or switchingmoduleto"nodenext"). Without that, TS will try to resolve./foo.jsas an actual.jssource file and the build is expected to fail.
extensions/json-language-features/server/package.json:22 - This server package is now being built/emitted as ESM (tsconfig
module: esnext,.jsimport specifiers, and esbuildformat: 'esm'), but the package remains CommonJS (notype: "module"). This is also incompatible with the current CLI entrypoint (bin/vscode-json-languageserver) which usesrequire('../out/node/jsonServerMain'). Either switch the package + bin wrapper to ESM (or add a.cjswrapper), or keep the emitted server entrypoint as CJS.
- Files reviewed: 60/63 changed files
- Comments generated: 4
roblourens
approved these changes
Apr 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.