diff options
author | 2022-10-27 18:25:43 -0700 | |
---|---|---|
committer | 2022-10-27 18:25:43 -0700 | |
commit | 5c8cbf9806ed27e3d50d67bdfacd23fec9434b41 (patch) | |
tree | 718d4a961382c6645cc67925820cebe774d25c4f /src/bun.js/javascript.zig | |
parent | 57342459ddaa335587cbada508cbba2eb41f00f1 (diff) | |
download | bun-5c8cbf9806ed27e3d50d67bdfacd23fec9434b41.tar.gz bun-5c8cbf9806ed27e3d50d67bdfacd23fec9434b41.tar.zst bun-5c8cbf9806ed27e3d50d67bdfacd23fec9434b41.zip |
Allow overriding node polyfills via `BUN_OVERRIDE_MODULE_PATH`
Diffstat (limited to 'src/bun.js/javascript.zig')
-rw-r--r-- | src/bun.js/javascript.zig | 133 |
1 files changed, 98 insertions, 35 deletions
diff --git a/src/bun.js/javascript.zig b/src/bun.js/javascript.zig index 1736ca444..7a78db237 100644 --- a/src/bun.js/javascript.zig +++ b/src/bun.js/javascript.zig @@ -404,6 +404,9 @@ pub const VirtualMachine = struct { us_loop_reference_count: usize = 0, is_us_loop_entered: bool = false, pending_internal_promise: *JSC.JSInternalPromise = undefined, + + load_builtins_from_path: []const u8 = "", + pub fn reload(this: *VirtualMachine) void { Output.debug("Reloading...", .{}); this.global.reload(); @@ -853,17 +856,35 @@ pub const VirtualMachine = struct { .@"bun:jsc" => { return ResolvedSource{ .allocator = null, - .source_code = ZigString.init(jsModuleFromFile("bun-jsc.exports.js")), + .source_code = ZigString.init(jsModuleFromFile(jsc_vm.load_builtins_from_path, "bun-jsc.exports.js")), .specifier = ZigString.init("bun:jsc"), .source_url = ZigString.init("bun:jsc"), .hash = 0, }; }, + .@"node:child_process" => { + return ResolvedSource{ + .allocator = null, + .source_code = ZigString.init(jsModuleFromFile(jsc_vm.load_builtins_from_path, "child_process.exports.js")), + .specifier = ZigString.init("node:child_process"), + .source_url = ZigString.init("node:child_process"), + .hash = 0, + }; + }, + .@"node:net" => { + return ResolvedSource{ + .allocator = null, + .source_code = ZigString.init(jsModuleFromFile(jsc_vm.load_builtins_from_path, "net.exports.js")), + .specifier = ZigString.init("node:net"), + .source_url = ZigString.init("node:net"), + .hash = 0, + }; + }, .@"node:fs" => { if (comptime Environment.isDebug) { return ResolvedSource{ .allocator = null, - .source_code = ZigString.init(strings.append(bun.default_allocator, jsModuleFromFile("fs.exports.js"), JSC.Node.fs.constants_string) catch unreachable), + .source_code = ZigString.init(strings.append(bun.default_allocator, jsModuleFromFile(jsc_vm.load_builtins_from_path, "fs.exports.js"), JSC.Node.fs.constants_string) catch unreachable), .specifier = ZigString.init("node:fs"), .source_url = ZigString.init("node:fs"), .hash = 0, @@ -886,7 +907,7 @@ pub const VirtualMachine = struct { .@"node:stream" => { return ResolvedSource{ .allocator = null, - .source_code = ZigString.init(jsModuleFromFile("streams.exports.js")), + .source_code = ZigString.init(jsModuleFromFile(jsc_vm.load_builtins_from_path, "streams.exports.js")), .specifier = ZigString.init("node:stream"), .source_url = ZigString.init("node:stream"), .hash = 0, @@ -905,7 +926,7 @@ pub const VirtualMachine = struct { .@"node:path" => { return ResolvedSource{ .allocator = null, - .source_code = ZigString.init(jsModuleFromFile("path.exports.js")), + .source_code = ZigString.init(jsModuleFromFile(jsc_vm.load_builtins_from_path, "path.exports.js")), .specifier = ZigString.init("node:path"), .source_url = ZigString.init("node:path"), .hash = 0, @@ -914,7 +935,7 @@ pub const VirtualMachine = struct { .@"node:path/win32" => { return ResolvedSource{ .allocator = null, - .source_code = ZigString.init(jsModuleFromFile("path-win32.exports.js")), + .source_code = ZigString.init(jsModuleFromFile(jsc_vm.load_builtins_from_path, "path-win32.exports.js")), .specifier = ZigString.init("node:path/win32"), .source_url = ZigString.init("node:path/win32"), .hash = 0, @@ -923,7 +944,7 @@ pub const VirtualMachine = struct { .@"node:path/posix" => { return ResolvedSource{ .allocator = null, - .source_code = ZigString.init(jsModuleFromFile("path-posix.exports.js")), + .source_code = ZigString.init(jsModuleFromFile(jsc_vm.load_builtins_from_path, "path-posix.exports.js")), .specifier = ZigString.init("node:path/posix"), .source_url = ZigString.init("node:path/posix"), .hash = 0, @@ -933,7 +954,7 @@ pub const VirtualMachine = struct { .@"node:os" => { return ResolvedSource{ .allocator = null, - .source_code = ZigString.init(jsModuleFromFile("os.exports.js")), + .source_code = ZigString.init(jsModuleFromFile(jsc_vm.load_builtins_from_path, "os.exports.js")), .specifier = ZigString.init("node:os"), .source_url = ZigString.init("node:os"), .hash = 0, @@ -970,7 +991,7 @@ pub const VirtualMachine = struct { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("url.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "url.exports.js")), ), .specifier = ZigString.init("node:url"), .source_url = ZigString.init("node:url"), @@ -981,7 +1002,7 @@ pub const VirtualMachine = struct { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("assert.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "assert.exports.js")), ), .specifier = ZigString.init("node:assert"), .source_url = ZigString.init("node:assert"), @@ -992,7 +1013,7 @@ pub const VirtualMachine = struct { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("./bindings/sqlite/sqlite.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "./bindings/sqlite/sqlite.exports.js")), ), .specifier = ZigString.init("bun:sqlite"), .source_url = ZigString.init("bun:sqlite"), @@ -1003,7 +1024,7 @@ pub const VirtualMachine = struct { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("./perf_hooks.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "./perf_hooks.exports.js")), ), .specifier = ZigString.init("node:perf_hooks"), .source_url = ZigString.init("node:perf_hooks"), @@ -1014,7 +1035,7 @@ pub const VirtualMachine = struct { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("./ws.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "./ws.exports.js")), ), .specifier = ZigString.init("ws"), .source_url = ZigString.init("ws"), @@ -1025,7 +1046,7 @@ pub const VirtualMachine = struct { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("./node_timers.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "./node_timers.exports.js")), ), .specifier = ZigString.init("node:timers"), .source_url = ZigString.init("node:timers"), @@ -1036,7 +1057,7 @@ pub const VirtualMachine = struct { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("./node_timers_promises.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "./node_timers_promises.exports.js")), ), .specifier = ZigString.init("node:timers/promises"), .source_url = ZigString.init("node:timers/promises"), @@ -1047,7 +1068,7 @@ pub const VirtualMachine = struct { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("./node_streams_web.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "./node_streams_web.exports.js")), ), .specifier = ZigString.init("node:stream/web"), .source_url = ZigString.init("node:stream/web"), @@ -1058,7 +1079,7 @@ pub const VirtualMachine = struct { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("./node_streams_consumer.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "./node_streams_consumer.exports.js")), ), .specifier = ZigString.init("node:stream/consumer"), .source_url = ZigString.init("node:stream/consumer"), @@ -1069,7 +1090,7 @@ pub const VirtualMachine = struct { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("./undici.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "./undici.exports.js")), ), .specifier = ZigString.init("undici"), .source_url = ZigString.init("undici"), @@ -1080,18 +1101,29 @@ pub const VirtualMachine = struct { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("./http.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "./http.exports.js")), ), .specifier = ZigString.init("node:http"), .source_url = ZigString.init("node:http"), .hash = 0, }; }, + .@"node:https" => { + return ResolvedSource{ + .allocator = null, + .source_code = ZigString.init( + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "./https.exports.js")), + ), + .specifier = ZigString.init("node:https"), + .source_url = ZigString.init("node:https"), + .hash = 0, + }; + }, .@"depd" => { return ResolvedSource{ .allocator = null, .source_code = ZigString.init( - @as(string, jsModuleFromFile("./depd.exports.js")), + @as(string, jsModuleFromFile(jsc_vm.load_builtins_from_path, "./depd.exports.js")), ), .specifier = ZigString.init("depd"), .source_url = ZigString.init("depd"), @@ -2632,11 +2664,14 @@ pub const HardcodedModule = enum { @"detect-libc", @"node:assert", @"node:buffer", + @"node:child_process", @"node:events", @"node:fs", @"node:fs/promises", @"node:http", + @"node:https", @"node:module", + @"node:net", @"node:os", @"node:path", @"node:path/posix", @@ -2653,7 +2688,6 @@ pub const HardcodedModule = enum { @"node:url", @"undici", @"ws", - /// Already resolved modules go in here. /// This does not remap the module name, it is just a hash table. /// Do not put modules that have aliases in here @@ -2670,11 +2704,14 @@ pub const HardcodedModule = enum { .{ "detect-libc", HardcodedModule.@"detect-libc" }, .{ "node:assert", HardcodedModule.@"node:assert" }, .{ "node:buffer", HardcodedModule.@"node:buffer" }, + .{ "node:child_process", HardcodedModule.@"node:child_process" }, .{ "node:events", HardcodedModule.@"node:events" }, .{ "node:fs", HardcodedModule.@"node:fs" }, .{ "node:fs/promises", HardcodedModule.@"node:fs/promises" }, .{ "node:http", HardcodedModule.@"node:http" }, + .{ "node:https", HardcodedModule.@"node:https" }, .{ "node:module", HardcodedModule.@"node:module" }, + .{ "node:net", HardcodedModule.@"node:net" }, .{ "node:os", HardcodedModule.@"node:os" }, .{ "node:path", HardcodedModule.@"node:path" }, .{ "node:path/posix", HardcodedModule.@"node:path/posix" }, @@ -2703,6 +2740,7 @@ pub const HardcodedModule = enum { .{ "bun:jsc", "bun:jsc" }, .{ "bun:sqlite", "bun:sqlite" }, .{ "bun:wrap", "bun:wrap" }, + .{ "child_process", "node:child_process" }, .{ "depd", "depd" }, .{ "detect-libc", "detect-libc" }, .{ "detect-libc/lib/detect-libc.js", "detect-libc" }, @@ -2711,14 +2749,19 @@ pub const HardcodedModule = enum { .{ "fs", "node:fs" }, .{ "fs/promises", "node:fs/promises" }, .{ "http", "node:http" }, + .{ "https", "node:https" }, .{ "module", "node:module" }, + .{ "net", "node:net" }, .{ "node:assert", "node:assert" }, .{ "node:buffer", "node:buffer" }, + .{ "node:child_process", "node:child_process" }, .{ "node:events", "node:events" }, .{ "node:fs", "node:fs" }, .{ "node:fs/promises", "node:fs/promises" }, .{ "node:http", "node:http" }, + .{ "node:https", "node:https" }, .{ "node:module", "node:module" }, + .{ "node:net", "node:net" }, .{ "node:os", "node:os" }, .{ "node:path", "node:path" }, .{ "node:path/posix", "node:path/posix" }, @@ -2757,10 +2800,6 @@ pub const HardcodedModule = enum { pub const DisabledModule = bun.ComptimeStringMap( void, .{ - .{"child_process"}, - .{"https"}, - .{"node:child_process"}, - .{"node:https"}, .{"node:tls"}, .{"node:worker_threads"}, .{"tls"}, @@ -2769,28 +2808,52 @@ pub const DisabledModule = bun.ComptimeStringMap( ); // This exists to make it so we can reload these quicker in development -fn jsModuleFromFile(comptime input: string) string { +fn jsModuleFromFile(from_path: string, comptime input: string) string { const absolute_path = comptime std.fs.path.dirname(@src().file).? ++ "/" ++ input; const Holder = struct { pub const file = @embedFile(absolute_path); }; if (comptime !Environment.allow_assert) { - return Holder.file; + if (from_path.len == 0) { + return Holder.file; + } } - var file = std.fs.openFileAbsoluteZ(absolute_path, .{ .mode = .read_only }) catch { - const WarnOnce = struct { - pub var warned = false; + var file: std.fs.File = undefined; + + if (comptime Environment.allow_assert) { + file = std.fs.openFileAbsoluteZ(absolute_path, .{ .mode = .read_only }) catch { + const WarnOnce = struct { + pub var warned = false; + }; + if (!WarnOnce.warned) { + WarnOnce.warned = true; + Output.prettyErrorln("Could not find file: " ++ absolute_path ++ " - using embedded version", .{}); + } + return Holder.file; }; - if (!WarnOnce.warned) { - WarnOnce.warned = true; - Output.prettyErrorln("Could not find file: " ++ absolute_path ++ " - using embedded version", .{}); - } - return Holder.file; - }; + } else { + var parts = [_]string{ from_path, input }; + var buf: [bun.MAX_PATH_BYTES]u8 = undefined; + var absolute_path_to_use = Fs.FileSystem.instance.absBuf(&parts, &buf); + buf[absolute_path_to_use.len] = 0; + file = std.fs.openFileAbsoluteZ(std.meta.assumeSentinel(absolute_path_to_use.ptr, 0), .{ .mode = .read_only }) catch { + const WarnOnce = struct { + pub var warned = false; + }; + if (!WarnOnce.warned) { + WarnOnce.warned = true; + Output.prettyErrorln("Could not find file: {s}, so using embedded version", .{absolute_path_to_use}); + } + return Holder.file; + }; + } var contents = file.readToEndAlloc(bun.default_allocator, std.math.maxInt(usize)) catch @panic("Cannot read file: " ++ absolute_path); + if (comptime !Environment.allow_assert) { + file.close(); + } return contents; } |