// Shim for node:module in Cloudflare Workers // Provides a createRequire that returns pre-imported modules import * as assert from 'node:assert'; import * as async_hooks from 'node:async_hooks'; import * as buffer from 'node:buffer'; import * as console_module from 'node:console'; import * as constants from 'node:constants'; import * as crypto from 'node:crypto'; import * as diagnostics_channel from 'node:diagnostics_channel'; import * as dns from 'node:dns'; // For events, we need the default export (EventEmitter class) for CJS compatibility // CJS require('events') returns EventEmitter class directly import events, * as eventsNamespace from 'node:events'; // Pre-import Node.js builtins that CJS modules might require import * as fs from 'node:fs'; import * as fs_promises from 'node:fs/promises'; import * as http from 'node:http'; import * as https from 'node:https'; import * as net from 'node:net'; import * as os from 'node:os'; import path from 'node:path'; import * as perf_hooks from 'node:perf_hooks'; import * as process from 'node:process'; import * as punycode from 'node:punycode'; import * as querystring from 'node:querystring'; import * as readline from 'node:readline'; import * as stream from 'node:stream'; import * as stream_promises from 'node:stream/promises'; import * as stream_web from 'node:stream/web'; import * as string_decoder from 'node:string_decoder'; import * as timers from 'node:timers'; import * as timers_promises from 'node:timers/promises'; import * as tls from 'node:tls'; import * as tty from 'node:tty'; import * as url from 'node:url'; // eslint-disable-next-line unicorn/import-style -- need full util module for CJS compatibility import * as util from 'node:util'; import * as util_types from 'node:util/types'; import * as worker_threads from 'node:worker_threads'; import * as zlib from 'node:zlib'; // VM shim for Cloudflare Workers // JSDOM and some other libraries require vm module class ScriptShim { private code: string; constructor(code: string) { this.code = code; } runInContext() { throw new Error('vm.Script.runInContext is not supported in Workers'); } runInNewContext() { throw new Error('vm.Script.runInNewContext is not supported in Workers'); } runInThisContext() { throw new Error('vm.Script.runInThisContext is not supported in Workers'); } } const vmShim = { createContext: (sandbox?: object) => sandbox || {}, runInContext: () => { throw new Error('vm.runInContext is not supported in Workers'); }, runInNewContext: () => { throw new Error('vm.runInNewContext is not supported in Workers'); }, runInThisContext: () => { throw new Error('vm.runInThisContext is not supported in Workers'); }, Script: ScriptShim, isContext: () => false, compileFunction: () => { throw new Error('vm.compileFunction is not supported in Workers'); }, }; // Child process shim (inline to avoid import cycle) const child_process = { execSync: (_command: string): Buffer => Buffer.from(''), exec: () => { throw new Error('exec is not supported in Cloudflare Workers'); }, spawn: () => { throw new Error('spawn is not supported in Cloudflare Workers'); }, fork: () => { throw new Error('fork is not supported in Cloudflare Workers'); }, execFile: () => { throw new Error('execFile is not supported in Cloudflare Workers'); }, execFileSync: () => { throw new Error('execFileSync is not supported in Cloudflare Workers'); }, spawnSync: () => { throw new Error('spawnSync is not supported in Cloudflare Workers'); }, }; // Create a CJS-compatible events module // In CJS, require('events') returns EventEmitter class directly (the default export) // but also has named exports attached to it const eventsModule = Object.assign(events, eventsNamespace); // Map of module names to their exports const builtinModules: Record = { fs, path, util, stream, events: eventsModule, buffer, crypto, http, https, url, querystring, zlib, os, assert, tty, net, dns, child_process, string_decoder, timers, process, perf_hooks, async_hooks, worker_threads, tls, readline, punycode, constants, diagnostics_channel, console: console_module, vm: vmShim, // Also support node: prefix 'node:fs': fs, 'node:path': path, 'node:util': util, 'node:stream': stream, 'node:events': eventsModule, 'node:buffer': buffer, 'node:crypto': crypto, 'node:http': http, 'node:https': https, 'node:url': url, 'node:querystring': querystring, 'node:zlib': zlib, 'node:os': os, 'node:assert': assert, 'node:tty': tty, 'node:net': net, 'node:dns': dns, 'node:child_process': child_process, 'node:string_decoder': string_decoder, 'node:timers': timers, 'node:process': process, 'node:perf_hooks': perf_hooks, 'node:async_hooks': async_hooks, 'node:worker_threads': worker_threads, 'node:tls': tls, 'node:readline': readline, 'node:punycode': punycode, 'node:constants': constants, 'node:diagnostics_channel': diagnostics_channel, 'node:console': console_module, 'node:fs/promises': fs_promises, 'fs/promises': fs_promises, 'node:stream/promises': stream_promises, 'stream/promises': stream_promises, 'node:stream/web': stream_web, 'stream/web': stream_web, 'node:util/types': util_types, 'util/types': util_types, 'node:timers/promises': timers_promises, 'timers/promises': timers_promises, 'node:vm': vmShim, }; export function createRequire(_filename: string | URL) { return function require(id: string): unknown { if (id in builtinModules) { return builtinModules[id]; } // For non-builtin modules, throw an error throw new Error(`require() is not available in Workers. Attempted to require: ${id}`); }; } export default { createRequire, };