diff options
Diffstat (limited to 'src/javascript')
| -rw-r--r-- | src/javascript/jsc/bindings/bindings.zig | 27 | ||||
| -rw-r--r-- | src/javascript/jsc/bindings/exports.zig | 25 |
2 files changed, 51 insertions, 1 deletions
diff --git a/src/javascript/jsc/bindings/bindings.zig b/src/javascript/jsc/bindings/bindings.zig index 0eaf2a277..8116a6ffd 100644 --- a/src/javascript/jsc/bindings/bindings.zig +++ b/src/javascript/jsc/bindings/bindings.zig @@ -152,6 +152,15 @@ pub const ZigString = extern struct { return ZigString{ .ptr = slice_.ptr, .len = slice_.len }; } + pub fn toBase64DataURL(this: ZigString, allocator: std.mem.Allocator) ![]const u8 { + const slice_ = this.slice(); + const size = std.base64.standard.Encoder.calcSize(slice_.len); + var buf = try allocator.alloc(u8, size + "data:;base64,".len); + var encoded = std.base64.url_safe.Encoder.encode(buf["data:;base64,".len..], slice_); + buf[0.."data:;base64,".len].* = "data:;base64,".*; + return buf[0 .. "data:;base64,".len + encoded.len]; + } + pub fn detectEncoding(this: *ZigString) void { for (this.slice()) |char| { if (char > 127) { @@ -1928,6 +1937,24 @@ pub const JSValue = enum(i64) { }); } + pub fn toFmt( + this: JSValue, + global: *JSGlobalObject, + formatter: *Exports.ZigConsoleClient.Formatter, + ) Exports.ZigConsoleClient.Formatter.ZigFormatter { + formatter.remaining_values = &[_]JSValue{}; + if (formatter.map_node) |node| { + node.release(); + formatter.map_node = null; + } + + return Exports.ZigConsoleClient.Formatter.ZigFormatter{ + .formatter = formatter, + .value = this, + .global = global, + }; + } + pub fn asObject(this: JSValue) JSObject { return cppFn("asObject", .{ this, diff --git a/src/javascript/jsc/bindings/exports.zig b/src/javascript/jsc/bindings/exports.zig index ebf6ce47f..de20758b1 100644 --- a/src/javascript/jsc/bindings/exports.zig +++ b/src/javascript/jsc/bindings/exports.zig @@ -943,11 +943,34 @@ pub const ZigConsoleClient = struct { } pub const Formatter = struct { - remaining_values: []JSValue, + remaining_values: []JSValue = &[_]JSValue{}, map: Visited.Map = undefined, map_node: ?*Visited.Pool.Node = null, hide_native: bool = false, + pub const ZigFormatter = struct { + formatter: *Formatter, + global: *JSGlobalObject, + value: JSValue, + + pub const WriteError = error{UhOh}; + pub fn format(self: ZigFormatter, comptime _: []const u8, _: std.fmt.FormatOptions, writer: anytype) !void { + self.formatter.remaining_values = &[_]JSValue{self.value}; + defer { + self.formatter.remaining_values = &[_]JSValue{}; + } + + self.formatter.format( + Tag.get(self.value, self.global), + @TypeOf(writer), + writer, + self.value, + self.global, + false, + ); + } + }; + // For detecting circular references pub const Visited = struct { const ObjectPool = @import("../../../pool.zig").ObjectPool; |
