aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js
diff options
context:
space:
mode:
authorGravatar Ashcon Partovi <ashcon@partovi.net> 2023-07-25 23:55:39 -0700
committerGravatar Ashcon Partovi <ashcon@partovi.net> 2023-07-25 23:55:39 -0700
commit57928f7e8061783bb7a4fb41f68d32b4b9c7bca2 (patch)
tree03c1205d6fb930ed45d41f949ebddf33de51215f /src/bun.js
parent6bfee02301a2e2a0b79339974af0445eb5a2688f (diff)
downloadbun-57928f7e8061783bb7a4fb41f68d32b4b9c7bca2.tar.gz
bun-57928f7e8061783bb7a4fb41f68d32b4b9c7bca2.tar.zst
bun-57928f7e8061783bb7a4fb41f68d32b4b9c7bca2.zip
Implement `fs.watchFile()`fs-watch-file
Closes #3812
Diffstat (limited to 'src/bun.js')
-rw-r--r--src/bun.js/bindings/bindings.zig21
-rw-r--r--src/bun.js/node/node_fs_watcher.zig5
-rw-r--r--src/bun.js/node/types.zig47
3 files changed, 59 insertions, 14 deletions
diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig
index 924eb27a1..f6b9f3ce1 100644
--- a/src/bun.js/bindings/bindings.zig
+++ b/src/bun.js/bindings/bindings.zig
@@ -3461,6 +3461,7 @@ pub const JSValue = enum(JSValueReprInt) {
i8 => @as(i8, @truncate(toInt32(this))),
i32 => @as(i32, @truncate(toInt32(this))),
i64 => this.toInt64(),
+ f64 => this.asNumber(),
bool => this.toBoolean(),
else => @compileError("Not implemented yet"),
};
@@ -3989,6 +3990,10 @@ pub const JSValue = enum(JSValueReprInt) {
return FFI.JSVALUE_IS_NUMBER(.{ .asJSValue = this });
}
+ pub fn isNumeric(this: JSValue) bool {
+ return this.isNumber() or this.isBigInt();
+ }
+
pub fn isError(this: JSValue) bool {
if (!this.isCell())
return false;
@@ -5211,15 +5216,21 @@ pub const CallFrame = opaque {
var ptr = self.argumentsPtr();
return switch (@as(u4, @min(len, max))) {
0 => .{ .ptr = undefined, .len = 0 },
- 4 => Arguments(max).init(comptime @min(4, max), ptr),
+ 1 => Arguments(max).init(comptime @min(1, max), ptr),
2 => Arguments(max).init(comptime @min(2, max), ptr),
- 6 => Arguments(max).init(comptime @min(6, max), ptr),
3 => Arguments(max).init(comptime @min(3, max), ptr),
- 8 => Arguments(max).init(comptime @min(8, max), ptr),
+ 4 => Arguments(max).init(comptime @min(4, max), ptr),
5 => Arguments(max).init(comptime @min(5, max), ptr),
- 1 => Arguments(max).init(comptime @min(1, max), ptr),
+ 6 => Arguments(max).init(comptime @min(6, max), ptr),
7 => Arguments(max).init(comptime @min(7, max), ptr),
- else => unreachable,
+ 8 => Arguments(max).init(comptime @min(8, max), ptr),
+ 9 => Arguments(max).init(comptime @min(9, max), ptr),
+ 10 => Arguments(max).init(comptime @min(10, max), ptr),
+ 11 => Arguments(max).init(comptime @min(11, max), ptr),
+ 12 => Arguments(max).init(comptime @min(12, max), ptr),
+ 13 => Arguments(max).init(comptime @min(13, max), ptr),
+ 14 => Arguments(max).init(comptime @min(14, max), ptr),
+ 15 => Arguments(max).init(comptime @min(15, max), ptr),
};
}
diff --git a/src/bun.js/node/node_fs_watcher.zig b/src/bun.js/node/node_fs_watcher.zig
index d0af350c0..4819b61fe 100644
--- a/src/bun.js/node/node_fs_watcher.zig
+++ b/src/bun.js/node/node_fs_watcher.zig
@@ -364,11 +364,6 @@ pub const FSWatcher = struct {
}
},
.directory => {
- // macOS should use FSEvents for directories
- if (comptime Environment.isMac) {
- @panic("Unexpected directory watch");
- }
-
const affected = event.names(changed_files);
for (affected) |changed_name_| {
diff --git a/src/bun.js/node/types.zig b/src/bun.js/node/types.zig
index 23d693d69..1f8964e2a 100644
--- a/src/bun.js/node/types.zig
+++ b/src/bun.js/node/types.zig
@@ -1302,6 +1302,29 @@ fn StatsDataType(comptime T: type) type {
@as(Date, @enumFromInt(@as(u64, @intCast(@max(stat_.birthtime().tv_sec, 0))))),
};
}
+
+ pub fn fromJS(args: []JSC.JSValue) @This() {
+ return @This(){
+ .dev = if (args.len > 0 and args[0].isNumeric()) args[0].to(T) else 0,
+ .ino = if (args.len > 1 and args[1].isNumeric()) args[1].to(T) else 0,
+ .mode = if (args.len > 2 and args[2].isNumeric()) args[2].to(T) else 0,
+ .nlink = if (args.len > 3 and args[3].isNumeric()) args[3].to(T) else 0,
+ .uid = if (args.len > 4 and args[4].isNumeric()) args[4].to(T) else 0,
+ .gid = if (args.len > 5 and args[5].isNumeric()) args[5].to(T) else 0,
+ .rdev = if (args.len > 6 and args[6].isNumeric()) args[6].to(T) else 0,
+ .size = if (args.len > 7 and args[7].isNumeric()) args[7].to(T) else 0,
+ .blksize = if (args.len > 8 and args[8].isNumeric()) args[8].to(T) else 0,
+ .blocks = if (args.len > 9 and args[9].isNumeric()) args[9].to(T) else 0,
+ .atime_ms = if (args.len > 10 and args[10].isNumeric()) args[10].to(f64) else 0,
+ .mtime_ms = if (args.len > 11 and args[11].isNumeric()) args[11].to(f64) else 0,
+ .ctime_ms = if (args.len > 12 and args[12].isNumeric()) args[12].to(f64) else 0,
+ .birthtime_ms = if (args.len > 13 and args[13].isNumeric()) args[13].to(T) else 0,
+ .atime = @as(Date, @enumFromInt(if (args.len > 10 and args[10].isNumeric()) args[10].to(u64) else 0)),
+ .mtime = @as(Date, @enumFromInt(if (args.len > 11 and args[11].isNumeric()) args[11].to(u64) else 0)),
+ .ctime = @as(Date, @enumFromInt(if (args.len > 12 and args[12].isNumeric()) args[12].to(u64) else 0)),
+ .birthtime = @as(Date, @enumFromInt(if (args.len > 13 and args[13].isNumeric()) args[13].to(u64) else 0)),
+ };
+ }
};
}
@@ -1431,10 +1454,26 @@ pub const Stats = union(enum) {
return this;
}
- pub fn constructor(globalThis: *JSC.JSGlobalObject, _: *JSC.CallFrame) callconv(.C) ?*Stats {
- globalThis.throw("Stats is not constructable. use fs.stat()", .{});
-
- return null;
+ pub fn constructor(_: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) ?*This {
+ var this = bun.default_allocator.create(Stats) catch unreachable;
+ var arguments = callframe.arguments(15);
+ var args = arguments.ptr[0..arguments.len];
+ if (args.len > 0 and args[0].isBoolean()) {
+ if (args[0].toBoolean()) {
+ this.* = .{
+ .big = StatsDataType(i64).fromJS(args[1..]),
+ };
+ } else {
+ this.* = .{
+ .small = StatsDataType(i32).fromJS(args[1..]),
+ };
+ }
+ } else {
+ this.* = .{
+ .small = StatsDataType(i32).fromJS(args),
+ };
+ }
+ return this;
}
comptime {