diff options
author | 2023-06-29 16:36:59 -0700 | |
---|---|---|
committer | 2023-06-29 16:37:38 -0700 | |
commit | 70a87e11818d36f5922a495e2aed8618b01e9a73 (patch) | |
tree | 33f09d2eb6a66cb960bfa0a159b2d08e47d5775b | |
parent | 7af757d104763a84e0c6d0b36eb0055afe1c40fa (diff) | |
download | bun-70a87e11818d36f5922a495e2aed8618b01e9a73.tar.gz bun-70a87e11818d36f5922a495e2aed8618b01e9a73.tar.zst bun-70a87e11818d36f5922a495e2aed8618b01e9a73.zip |
Make `node:os` `tmpdir` more consistent with Node.js
-rw-r--r-- | src/bun.js/node/node_os.zig | 28 | ||||
-rw-r--r-- | src/js/node/os.js | 23 | ||||
-rw-r--r-- | src/js/out/modules/node/os.js | 14 | ||||
-rw-r--r-- | test/js/node/os/os.test.js | 5 |
4 files changed, 40 insertions, 30 deletions
diff --git a/src/bun.js/node/node_os.zig b/src/bun.js/node/node_os.zig index 7f9ea2e28..f71143315 100644 --- a/src/bun.js/node/node_os.zig +++ b/src/bun.js/node/node_os.zig @@ -16,7 +16,7 @@ pub const Os = struct { pub const code = @embedFile("../os.exports.js"); pub fn create(globalObject: *JSC.JSGlobalObject) callconv(.C) JSC.JSValue { - const module = JSC.JSValue.createEmptyObject(globalObject, 20); + const module = JSC.JSValue.createEmptyObject(globalObject, 22); module.put(globalObject, JSC.ZigString.static("arch"), JSC.NewFunction(globalObject, JSC.ZigString.static("arch"), 0, arch, true)); module.put(globalObject, JSC.ZigString.static("cpus"), JSC.NewFunction(globalObject, JSC.ZigString.static("cpus"), 0, cpus, true)); @@ -31,7 +31,6 @@ pub const Os = struct { module.put(globalObject, JSC.ZigString.static("platform"), JSC.NewFunction(globalObject, JSC.ZigString.static("platform"), 0, platform, true)); module.put(globalObject, JSC.ZigString.static("release"), JSC.NewFunction(globalObject, JSC.ZigString.static("release"), 0, release, true)); module.put(globalObject, JSC.ZigString.static("setPriority"), JSC.NewFunction(globalObject, JSC.ZigString.static("setPriority"), 2, setPriority, true)); - module.put(globalObject, JSC.ZigString.static("tmpdir"), JSC.NewFunction(globalObject, JSC.ZigString.static("tmpdir"), 0, tmpdir, true)); module.put(globalObject, JSC.ZigString.static("totalmem"), JSC.NewFunction(globalObject, JSC.ZigString.static("totalmem"), 0, totalmem, true)); module.put(globalObject, JSC.ZigString.static("type"), JSC.NewFunction(globalObject, JSC.ZigString.static("type"), 0, Os.type, true)); module.put(globalObject, JSC.ZigString.static("uptime"), JSC.NewFunction(globalObject, JSC.ZigString.static("uptime"), 0, uptime, true)); @@ -485,7 +484,7 @@ pub const Os = struct { std.os.AF.INET => JSC.ZigString.static("IPv4"), std.os.AF.INET6 => JSC.ZigString.static("IPv6"), else => JSC.ZigString.static("unknown"), - }).toValue(globalThis)); + }).toValueGC(globalThis)); // mac <string> The MAC address of the network interface { @@ -620,29 +619,6 @@ pub const Os = struct { return JSC.JSValue.jsUndefined(); } - pub fn tmpdir(globalThis: *JSC.JSGlobalObject, _: *JSC.CallFrame) callconv(.C) JSC.JSValue { - JSC.markBinding(@src()); - - const dir: []const u8 = brk: { - if (comptime Environment.isWindows) { - if (bun.getenvZ("TEMP") orelse bun.getenvZ("TMP")) |tmpdir_| { - break :brk tmpdir_; - } - - if (bun.getenvZ("SYSTEMROOT") orelse bun.getenvZ("WINDIR")) |systemdir_| { - break :brk systemdir_ ++ "\\temp"; - } - } else { - const dir = bun.asByteSlice(bun.getenvZ("TMPDIR") orelse bun.getenvZ("TMP") orelse bun.getenvZ("TEMP") orelse "/tmp"); - break :brk strings.withoutTrailingSlash(dir); - } - - break :brk "unknown"; - }; - - return JSC.ZigString.init(dir).withEncoding().toValueGC(globalThis); - } - pub fn totalmem(_: *JSC.JSGlobalObject, _: *JSC.CallFrame) callconv(.C) JSC.JSValue { JSC.markBinding(@src()); diff --git a/src/js/node/os.js b/src/js/node/os.js index 3315708ad..3cd0288bd 100644 --- a/src/js/node/os.js +++ b/src/js/node/os.js @@ -1,4 +1,22 @@ // Hardcoded module "node:os" + +export var tmpdir = function () { + var lazy = Symbol.for("Bun.lazy"); + var primordials = globalThis[lazy]("primordials"); + + var { Bun } = primordials; + var env = Bun.env; + + tmpdir = function () { + var path = env["TMPDIR"] || env["TMP"] || env["TEMP"] || "/tmp"; + const length = path.length; + if (length > 1 && path[length - 1] === "/") path = path.slice(0, -1); + return path; + }; + + return tmpdir(); +}; + function bound(obj) { return { arch: obj.arch.bind(obj), @@ -13,7 +31,9 @@ function bound(obj) { platform: obj.platform.bind(obj), release: obj.release.bind(obj), setPriority: obj.setPriority.bind(obj), - tmpdir: obj.tmpdir.bind(obj), + get tmpdir() { + return tmpdir; + }, totalmem: obj.totalmem.bind(obj), type: obj.type.bind(obj), uptime: obj.uptime.bind(obj), @@ -42,7 +62,6 @@ export var { platform, release, setPriority, - tmpdir, totalmem, type, uptime, diff --git a/src/js/out/modules/node/os.js b/src/js/out/modules/node/os.js index e27464e15..69c112412 100644 --- a/src/js/out/modules/node/os.js +++ b/src/js/out/modules/node/os.js @@ -12,7 +12,9 @@ var bound = function(obj) { platform: obj.platform.bind(obj), release: obj.release.bind(obj), setPriority: obj.setPriority.bind(obj), - tmpdir: obj.tmpdir.bind(obj), + get tmpdir() { + return tmpdir; + }, totalmem: obj.totalmem.bind(obj), type: obj.type.bind(obj), uptime: obj.uptime.bind(obj), @@ -24,6 +26,15 @@ var bound = function(obj) { constants: obj.constants, [Symbol.for("CommonJS")]: 0 }; +}, tmpdir = function() { + var lazy = Symbol.for("Bun.lazy"), primordials = globalThis[lazy]("primordials"), { Bun: Bun2 } = primordials, env = Bun2.env; + return tmpdir = function() { + var path = env["TMPDIR"] || env["TMP"] || env["TEMP"] || "/tmp"; + const length = path.length; + if (length > 1 && path[length - 1] === "/") + path = path.slice(0, -1); + return path; + }, tmpdir(); }, os = bound(Bun._Os()), { arch, cpus, @@ -37,7 +48,6 @@ var bound = function(obj) { platform, release, setPriority, - tmpdir, totalmem, type, uptime, diff --git a/test/js/node/os/os.test.js b/test/js/node/os/os.test.js index d7229b56d..8b4d54bb7 100644 --- a/test/js/node/os/os.test.js +++ b/test/js/node/os/os.test.js @@ -43,11 +43,16 @@ it("tmpdir", () => { expect(os.tmpdir()).toBe(process.env.TEMP || process.env.TMP); expect(os.tmpdir()).toBe(`${process.env.SystemRoot || process.env.windir}\\temp`); } else { + const originalEnv = process.env.TMPDIR; let dir = process.env.TMPDIR || process.env.TMP || process.env.TEMP || "/tmp"; if (dir.length > 1 && dir.endsWith("/")) { dir = dir.substring(0, dir.length - 1); } expect(realpathSync(os.tmpdir())).toBe(realpathSync(dir)); + + process.env.TMPDIR = "/boop"; + expect(os.tmpdir()).toBe("/boop"); + process.env.TMPDIR = originalEnv; } }); |