Context
During the ESM migration (#226), we had to use createRequire workarounds to avoid two VS Code ESM loader bugs:
-
vscode module deadlock (microsoft/vscode#285297): VS Code's ESM resolve hook uses MessageChannel to intercept import 'vscode', but this deadlocks under certain conditions. Workaround: use createRequire(import.meta.url)('vscode') instead of import * as vscode from 'vscode'.
-
fs module interception: VS Code's ESM loader hook rewrites import 'fs' to node:original-fs (a stripped-down version missing methods like createWriteStream, readFile). This breaks fs-extra when loaded via ESM since its ESM entry point imports fs. Workaround: use createRequire(import.meta.url)('fs-extra') to load via CJS path, and import from 'node:fs' for bare fs imports.
Files affected
src/vscode-util/Progress.ts — createRequire for vscode
src/dependencies/FileDownloader.ts — createRequire for fs-extra
src/dependencies/ZipExtractor.ts — createRequire for fs-extra
src/dependencies/LocalReference.ts — createRequire for fs-extra
src/util/Location.ts — createRequire for fs-extra
src/util/Platform.ts — createRequire for fs-extra
src/test/runTest.ts — node:fs prefix
src/test/dependencies.test.ts — node:fs prefix
Cleanup
Once microsoft/vscode#285297 is resolved and the minimum VS Code version is bumped accordingly, these workarounds can be replaced with standard ESM imports:
// Before (workaround)
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const vscode = require('vscode') as typeof import('vscode');
// After (clean)
import * as vscode from 'vscode';
// Before (workaround)
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const fs = require('fs-extra') as typeof import('fs-extra');
// After (clean)
import * as fs from 'fs-extra';
🤖 Generated with Claude Code
Context
During the ESM migration (#226), we had to use
createRequireworkarounds to avoid two VS Code ESM loader bugs:vscodemodule deadlock (microsoft/vscode#285297): VS Code's ESM resolve hook usesMessageChannelto interceptimport 'vscode', but this deadlocks under certain conditions. Workaround: usecreateRequire(import.meta.url)('vscode')instead ofimport * as vscode from 'vscode'.fsmodule interception: VS Code's ESM loader hook rewritesimport 'fs'tonode:original-fs(a stripped-down version missing methods likecreateWriteStream,readFile). This breaksfs-extrawhen loaded via ESM since its ESM entry point importsfs. Workaround: usecreateRequire(import.meta.url)('fs-extra')to load via CJS path, andimport from 'node:fs'for barefsimports.Files affected
src/vscode-util/Progress.ts—createRequireforvscodesrc/dependencies/FileDownloader.ts—createRequireforfs-extrasrc/dependencies/ZipExtractor.ts—createRequireforfs-extrasrc/dependencies/LocalReference.ts—createRequireforfs-extrasrc/util/Location.ts—createRequireforfs-extrasrc/util/Platform.ts—createRequireforfs-extrasrc/test/runTest.ts—node:fsprefixsrc/test/dependencies.test.ts—node:fsprefixCleanup
Once microsoft/vscode#285297 is resolved and the minimum VS Code version is bumped accordingly, these workarounds can be replaced with standard ESM imports:
🤖 Generated with Claude Code