aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bun.js/child_process.exports.js3
-rw-r--r--src/bun.js/https.exports.js1
-rw-r--r--src/bun.js/javascript.zig133
-rw-r--r--src/bun.js/net.exports.js61
-rw-r--r--src/bun_js.zig6
5 files changed, 169 insertions, 35 deletions
diff --git a/src/bun.js/child_process.exports.js b/src/bun.js/child_process.exports.js
index e69de29bb..7ed515927 100644
--- a/src/bun.js/child_process.exports.js
+++ b/src/bun.js/child_process.exports.js
@@ -0,0 +1,3 @@
+
+export {};
+
diff --git a/src/bun.js/https.exports.js b/src/bun.js/https.exports.js
new file mode 100644
index 000000000..d79deedb3
--- /dev/null
+++ b/src/bun.js/https.exports.js
@@ -0,0 +1 @@
+export * from "node:http";
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;
}
diff --git a/src/bun.js/net.exports.js b/src/bun.js/net.exports.js
new file mode 100644
index 000000000..ce70c3ee1
--- /dev/null
+++ b/src/bun.js/net.exports.js
@@ -0,0 +1,61 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// IPv4 Segment
+const v4Seg = "(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])";
+const v4Str = `(${v4Seg}[.]){3}${v4Seg}`;
+const IPv4Reg = new RegExp(`^${v4Str}$`);
+
+// IPv6 Segment
+const v6Seg = "(?:[0-9a-fA-F]{1,4})";
+const IPv6Reg = new RegExp(
+ "^(" +
+ `(?:${v6Seg}:){7}(?:${v6Seg}|:)|` +
+ `(?:${v6Seg}:){6}(?:${v4Str}|:${v6Seg}|:)|` +
+ `(?:${v6Seg}:){5}(?::${v4Str}|(:${v6Seg}){1,2}|:)|` +
+ `(?:${v6Seg}:){4}(?:(:${v6Seg}){0,1}:${v4Str}|(:${v6Seg}){1,3}|:)|` +
+ `(?:${v6Seg}:){3}(?:(:${v6Seg}){0,2}:${v4Str}|(:${v6Seg}){1,4}|:)|` +
+ `(?:${v6Seg}:){2}(?:(:${v6Seg}){0,3}:${v4Str}|(:${v6Seg}){1,5}|:)|` +
+ `(?:${v6Seg}:){1}(?:(:${v6Seg}){0,4}:${v4Str}|(:${v6Seg}){1,6}|:)|` +
+ `(?::((?::${v6Seg}){0,5}:${v4Str}|(?::${v6Seg}){1,7}|:))` +
+ ")(%[0-9a-zA-Z-.:]{1,})?$"
+);
+
+export function isIPv4(s) {
+ return IPv4Reg.test(s);
+}
+
+export function isIPv6(s) {
+ return IPv6Reg.test(s);
+}
+
+export function isIP(s) {
+ if (isIPv4(s)) return 4;
+ if (isIPv6(s)) return 6;
+ return 0;
+}
+
+export default {
+ isIP,
+ isIPv4,
+ isIPv6,
+ [Symbol.for("CommonJS")]: 0,
+};
diff --git a/src/bun_js.zig b/src/bun_js.zig
index dc65cc391..f4073ee15 100644
--- a/src/bun_js.zig
+++ b/src/bun_js.zig
@@ -110,6 +110,12 @@ pub const Run = struct {
}
}
+ if (run.vm.bundler.env.map.get("BUN_OVERRIDE_MODULE_PATH")) |override_path| {
+ if (override_path.len > 0) {
+ run.vm.load_builtins_from_path = override_path;
+ }
+ }
+
var callback = OpaqueWrap(Run, Run.start);
run.vm.global.vm().holdAPILock(&run, callback);
}