Skip to content

use ESM for HTML/CSS/JSON language servers#309566

Merged
aeschli merged 11 commits intomainfrom
aeschli/elated-wallaby-901
Apr 13, 2026
Merged

use ESM for HTML/CSS/JSON language servers#309566
aeschli merged 11 commits intomainfrom
aeschli/elated-wallaby-901

Conversation

@aeschli
Copy link
Copy Markdown
Contributor

@aeschli aeschli commented Apr 13, 2026

No description provided.

Copilot AI review requested due to automatic review settings April 13, 2026 18:00
@aeschli aeschli self-assigned this Apr 13, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 13, 2026

Screenshot Changes

Base: 985aca65 Current: d8ede0af

Changed (1)

agentSessionsViewer/NeedsInput/Dark
Before After
before after

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 Node createRequire banner for CJS dependencies.
  • Bump vscode-*-languageservice dependencies 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 using new 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 .js extensions in this project, TypeScript needs Node-style ESM resolution (e.g. moduleResolution: "nodenext" / "node16", or switching module to "nodenext"). Without that, TS will try to resolve ./foo.js as an actual .js source 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 .js extensions in this project, TypeScript needs Node-style ESM resolution (e.g. moduleResolution: "nodenext" / "node16", or switching module to "nodenext"). Without that, TS will try to resolve ./foo.js as an actual .js source 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 using new 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 using new 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 .js extensions in this project, TypeScript needs Node-style ESM resolution (e.g. moduleResolution: "nodenext" / "node16", or switching module to "nodenext"). Without that, TS will try to resolve ./foo.js as an actual .js source 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, .js import specifiers, and esbuild format: 'esm'), but the package remains CommonJS (no type: "module"). This is also incompatible with the current CLI entrypoint (bin/vscode-json-languageserver) which uses require('../out/node/jsonServerMain'). Either switch the package + bin wrapper to ESM (or add a .cjs wrapper), or keep the emitted server entrypoint as CJS.
  • Files reviewed: 60/63 changed files
  • Comments generated: 4

Comment thread extensions/css-language-features/server/package.json
Comment thread extensions/css-language-features/server/src/test/links.test.ts
Comment thread extensions/html-language-features/server/test/index.js
Comment thread extensions/css-language-features/server/src/test/completion.test.ts
@aeschli aeschli marked this pull request as ready for review April 13, 2026 20:11
@aeschli aeschli enabled auto-merge (squash) April 13, 2026 20:12
@aeschli aeschli merged commit 91b02ef into main Apr 13, 2026
26 checks passed
@aeschli aeschli deleted the aeschli/elated-wallaby-901 branch April 13, 2026 20:51
@vs-code-engineering vs-code-engineering bot added this to the 1.117.0 milestone Apr 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants