aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/javascript/jsc/base.zig167
-rw-r--r--src/javascript/jsc/javascript.zig9
-rw-r--r--src/javascript/jsc/node/node_fs_binding.zig3
-rw-r--r--src/javascript/jsc/test/jest.zig4
-rw-r--r--src/javascript/jsc/typescript.zig45
5 files changed, 139 insertions, 89 deletions
diff --git a/src/javascript/jsc/base.zig b/src/javascript/jsc/base.zig
index 679af874a..664dc0486 100644
--- a/src/javascript/jsc/base.zig
+++ b/src/javascript/jsc/base.zig
@@ -443,8 +443,14 @@ fn hasTypeScript(comptime Type: type) bool {
}
fn getTypeScript(comptime Type: type, value: Type) d.ts.or_decl {
+ if (comptime !@hasDecl(Type, "ts") and !@hasField(Type, "ts")) {
+ return d.ts.or_decl{
+ .ts = .{ .name = @typeName(Type) },
+ };
+ }
+
if (comptime hasTypeScriptField(Type)) {
- if (@TypeOf(Type.ts) == d.ts.decl) {
+ if (@TypeOf(value.ts) == d.ts.decl) {
return d.ts.or_decl{ .decl = value };
} else {
return d.ts.or_decl{ .ts = value.ts };
@@ -795,7 +801,7 @@ pub const d = struct {
comptime var buf: string = "";
comptime brk: {
- var splitter = std.mem.split(str, "\n");
+ var splitter = std.mem.split(u8, str, "\n");
const first = splitter.next() orelse break :brk;
const second = splitter.next() orelse {
@@ -1113,13 +1119,14 @@ pub fn NewClass(
switch (@typeInfo(Func)) {
.Struct => {
+ var total: usize = 1;
if (hasTypeScript(Func)) {
if (std.meta.trait.isIndexable(@TypeOf(func.ts))) {
- count += func.ts.len;
- } else {
- count += 1;
+ total = func.ts.len;
}
}
+
+ count += total;
},
else => continue,
}
@@ -1128,38 +1135,44 @@ pub fn NewClass(
var funcs = std.mem.zeroes([count]d.ts);
class.functions = std.mem.span(&funcs);
var func_i: usize = 0;
-
+ @setEvalBranchQuota(99999);
inline for (function_name_literals) |_, i| {
const func = @field(staticFunctions, function_names[i]);
const Func = @TypeOf(func);
switch (@typeInfo(Func)) {
.Struct => {
- if (hasTypeScript(Func)) {
- var ts_functions: []const d.ts = &[_]d.ts{};
+ var ts_functions: []const d.ts = &[_]d.ts{};
+ if (hasTypeScript(Func)) {
if (std.meta.trait.isIndexable(@TypeOf(func.ts))) {
ts_functions = std.mem.span(func.ts);
- } else {
- var funcs1 = std.mem.zeroes([1]d.ts);
- funcs1[0] = func.ts;
- ts_functions = std.mem.span(&funcs1);
}
+ }
- for (ts_functions) |ts_function_| {
- var ts_function = ts_function_;
- if (ts_function.name.len == 0) {
- ts_function.name = function_names[i];
- }
-
- if (ts_function.read_only == null) {
- ts_function.read_only = class.read_only;
- }
+ if (ts_functions.len == 0 and hasTypeScript(Func)) {
+ var funcs1 = std.mem.zeroes([1]d.ts);
+ funcs1[0] = func.ts;
+ ts_functions = std.mem.span(&funcs1);
+ } else {
+ var funcs1 = std.mem.zeroes([1]d.ts);
+ funcs1[0] = .{ .name = function_names[i] };
+ ts_functions = std.mem.span(&funcs1);
+ }
- class.functions[func_i] = ts_function;
+ for (ts_functions) |ts_function_| {
+ var ts_function = ts_function_;
+ if (ts_function.name.len == 0) {
+ ts_function.name = function_names[i];
+ }
- func_i += 1;
+ if (ts_function.read_only == null) {
+ ts_function.read_only = class.read_only;
}
+
+ class.functions[func_i] = ts_function;
+
+ func_i += 1;
}
},
else => continue,
@@ -1253,9 +1266,17 @@ pub fn NewClass(
decl.module = typescriptModuleDeclaration();
},
.class => {
- decl.class = typescriptClassDeclaration();
+ decl.class = typescriptClassDeclaration(decl.class);
+ },
+ .empty => {
+ decl = d.ts.decl{
+ .class = typescriptClassDeclaration(
+ d.ts.class{
+ .name = options.name,
+ },
+ ),
+ };
},
- .empty => {},
};
return decl;
@@ -1297,8 +1318,8 @@ pub fn NewClass(
}
// This should only be run at comptime
- pub fn typescriptClassDeclaration() d.ts.class {
- comptime var class = options.ts.class;
+ pub fn typescriptClassDeclaration(comptime original: d.ts.class) d.ts.class {
+ comptime var class = original;
comptime {
if (class.name.len == 0) {
@@ -1317,13 +1338,14 @@ pub fn NewClass(
switch (@typeInfo(Func)) {
.Struct => {
+ var total: usize = 1;
if (hasTypeScript(Func)) {
if (std.meta.trait.isIndexable(@TypeOf(func.ts))) {
- count += func.ts.len;
- } else {
- count += 1;
+ total = func.ts.len;
}
}
+
+ count += total;
},
else => continue,
}
@@ -1339,35 +1361,41 @@ pub fn NewClass(
switch (@typeInfo(Func)) {
.Struct => {
- if (hasTypeScript(Func)) {
- var ts_functions: []const d.ts = &[_]d.ts{};
+ var ts_functions: []const d.ts = &[_]d.ts{};
+ if (hasTypeScript(Func)) {
if (std.meta.trait.isIndexable(@TypeOf(func.ts))) {
ts_functions = std.mem.span(func.ts);
- } else {
- var funcs1 = std.mem.zeroes([1]d.ts);
- funcs1[0] = func.ts;
- ts_functions = std.mem.span(&funcs1);
}
+ }
- for (ts_functions) |ts_function_| {
- var ts_function = ts_function_;
- if (ts_function.name.len == 0) {
- ts_function.name = function_names[i];
- }
-
- if (class.interface and strings.eqlComptime(ts_function.name, "constructor")) {
- ts_function.name = "new";
- }
+ if (ts_functions.len == 0 and hasTypeScript(Func)) {
+ var funcs1 = std.mem.zeroes([1]d.ts);
+ funcs1[0] = func.ts;
+ ts_functions = std.mem.span(&funcs1);
+ } else {
+ var funcs1 = std.mem.zeroes([1]d.ts);
+ funcs1[0] = .{ .name = function_names[i] };
+ ts_functions = std.mem.span(&funcs1);
+ }
- if (ts_function.read_only == null) {
- ts_function.read_only = class.read_only;
- }
+ for (ts_functions) |ts_function_| {
+ var ts_function = ts_function_;
+ if (ts_function.name.len == 0) {
+ ts_function.name = function_names[i];
+ }
- class.functions[func_i] = ts_function;
+ if (class.interface and strings.eqlComptime(ts_function.name, "constructor")) {
+ ts_function.name = "new";
+ }
- func_i += 1;
+ if (ts_function.read_only == null) {
+ ts_function.read_only = class.read_only;
}
+
+ class.functions[func_i] = ts_function;
+
+ func_i += 1;
}
},
else => continue,
@@ -1376,14 +1404,7 @@ pub fn NewClass(
}
if (property_names.len > 0) {
- var count: usize = 0;
- inline for (property_names) |_, i| {
- const field = @field(properties, property_names[i]);
-
- if (hasTypeScript(@TypeOf(field))) {
- count += 1;
- }
- }
+ var count: usize = property_names.len;
var props = std.mem.zeroes([count]d.ts);
class.properties = std.mem.span(&props);
@@ -1392,24 +1413,26 @@ pub fn NewClass(
inline for (property_names) |property_name, i| {
const field = @field(properties, property_names[i]);
- if (hasTypeScript(@TypeOf(field))) {
- var ts_field: d.ts = field.ts;
- if (ts_field.name.len == 0) {
- ts_field.name = property_name;
- }
+ var ts_field: d.ts = .{};
- if (ts_field.read_only == null) {
- if (hasReadOnly(@TypeOf(field))) {
- ts_field.read_only = field.ro;
- } else {
- ts_field.read_only = class.read_only;
- }
- }
+ if (hasTypeScript(@TypeOf(field))) {
+ ts_field = field.ts;
+ }
- class.properties[property_i] = ts_field;
+ if (ts_field.name.len == 0) {
+ ts_field.name = property_name;
+ }
- property_i += 1;
+ if (ts_field.read_only == null) {
+ if (hasReadOnly(@TypeOf(field))) {
+ ts_field.read_only = field.ro;
+ } else {
+ ts_field.read_only = class.read_only;
+ }
}
+
+ class.properties[property_i] = ts_field;
+ property_i += 1;
}
}
}
diff --git a/src/javascript/jsc/javascript.zig b/src/javascript/jsc/javascript.zig
index a6a85c4db..648653332 100644
--- a/src/javascript/jsc/javascript.zig
+++ b/src/javascript/jsc/javascript.zig
@@ -3190,10 +3190,11 @@ pub const BuildError = struct {
pub const Class = NewClass(
BuildError,
- .{
- .name = "BuildError",
- .read_only = true,
- },
+ .{ .name = "BuildError", .read_only = true, .ts = .{
+ .class = .{
+ .name = "BuildError",
+ },
+ } },
.{},
.{
.@"message" = .{
diff --git a/src/javascript/jsc/node/node_fs_binding.zig b/src/javascript/jsc/node/node_fs_binding.zig
index ae29f202a..ea3376ffb 100644
--- a/src/javascript/jsc/node/node_fs_binding.zig
+++ b/src/javascript/jsc/node/node_fs_binding.zig
@@ -7,6 +7,7 @@ const Maybe = JSC.Node.Maybe;
const Encoding = JSC.Node.Encoding;
const FeatureFlags = @import("../../../global.zig").FeatureFlags;
const Args = JSC.Node.NodeFS.Arguments;
+const d = JSC.d;
const NodeFSFunction = fn (
*JSC.Node.NodeFS,
@@ -138,7 +139,7 @@ fn call(comptime Function: NodeFSFunctionEnum) NodeFSFunction {
pub const NodeFSBindings = JSC.NewClass(
JSC.Node.NodeFS,
- .{ .name = "fs" },
+ .{ .name = "fs", .ts = .{ .module = .{ .path = "fs" } } },
.{
.access = .{
diff --git a/src/javascript/jsc/test/jest.zig b/src/javascript/jsc/test/jest.zig
index 11b2d7b8e..459d3b9eb 100644
--- a/src/javascript/jsc/test/jest.zig
+++ b/src/javascript/jsc/test/jest.zig
@@ -40,6 +40,7 @@ const VirtualMachine = @import("../javascript.zig").VirtualMachine;
const Task = @import("../javascript.zig").Task;
const Fs = @import("../../../fs.zig");
+const is_bindgen: bool = std.meta.globalOption("bindgen", bool) orelse false;
fn notImplementedFn(_: *anyopaque, ctx: js.JSContextRef, _: js.JSObjectRef, _: js.JSObjectRef, _: []const js.JSValueRef, exception: js.ExceptionRef) js.JSValueRef {
JSError(getAllocator(ctx), "Not implemented yet!", .{}, ctx, exception);
@@ -660,6 +661,7 @@ pub const TestScope = struct {
pub fn run(
this: *TestScope,
) Result {
+ if (comptime is_bindgen) return undefined;
var vm = VirtualMachine.vm;
defer {
js.JSValueUnprotect(vm.global.ref(), this.callback);
@@ -799,6 +801,7 @@ pub const DescribeScope = struct {
}
pub fn run(this: *DescribeScope, thisObject: js.JSObjectRef, ctx: js.JSContextRef, callback: js.JSObjectRef, exception: js.ExceptionRef) js.JSObjectRef {
+ if (comptime is_bindgen) return undefined;
js.JSValueProtect(ctx, callback);
defer js.JSValueUnprotect(ctx, callback);
var original_active = active;
@@ -881,6 +884,7 @@ pub const DescribeScope = struct {
// }
pub fn runCallbacks(this: *DescribeScope, ctx: js.JSContextRef, callbacks: std.ArrayListUnmanaged(js.JSObjectRef), exception: js.ExceptionRef) bool {
+ if (comptime is_bindgen) return undefined;
var i: usize = 0;
while (i < callbacks.items.len) : (i += 1) {
var callback = callbacks.items[i];
diff --git a/src/javascript/jsc/typescript.zig b/src/javascript/jsc/typescript.zig
index eabf36328..a2690b8a0 100644
--- a/src/javascript/jsc/typescript.zig
+++ b/src/javascript/jsc/typescript.zig
@@ -1,8 +1,6 @@
const d = @import("./base.zig").d;
const std = @import("std");
-const Api = @import("../../api/schema.zig").Api;
const Router = @import("./api/router.zig");
-const JavaScript = @import("./javascript.zig");
const builtin = @import("builtin");
const io = std.io;
const fs = std.fs;
@@ -14,18 +12,39 @@ const mem = std.mem;
const testing = std.testing;
const Allocator = std.mem.Allocator;
const resolve_path = @import("../../resolver/resolve_path.zig");
+const JSC = @import("../../jsc.zig");
+const _global = @import("../../global.zig");
+const string = _global.string;
+const strings = _global.strings;
+const default_allocator = _global.default_allocator;
-const modules = [_]d.ts.decl{
- Router.Class.typescriptDeclaration(),
-};
+pub const bindgen = true;
-const hidden_globals = [_]d.ts.decl{
- FetchEvent.Class.typescriptDeclaration(),
-};
+pub fn main() anyerror!void {
+ const modules = comptime [_]d.ts.decl{
+ JSC.Node.NodeFSBindings.typescriptDeclaration(),
+ };
-const global = JavaScript.GlobalObject.GlobalClass.typescriptDeclaration();
+ const hidden_globals = comptime [_]d.ts.decl{
+ JSC.WebCore.FetchEvent.Class.typescriptDeclaration(),
+ };
+
+ const globals = comptime [_]d.ts.decl{
+ Router.Instance.typescriptDeclaration(),
+ JSC.Bun.Class.typescriptDeclaration(),
+ JSC.BuildError.Class.typescriptDeclaration(),
+ JSC.ResolveError.Class.typescriptDeclaration(),
+ JSC.WebCore.Response.Class.typescriptDeclaration(),
+ JSC.WebCore.Headers.Class.typescriptDeclaration(),
+ JSC.EventListenerMixin.addEventListener(JSC.VirtualMachine).typescriptDeclaration(),
+ JSC.WebCore.Fetch.Class.typescriptDeclaration(),
+ JSC.Performance.Class.typescriptDeclaration(),
+ JSC.Crypto.Class.typescriptDeclaration(),
+ JSC.WebCore.TextEncoder.Class.typescriptDeclaration(),
+ JSC.WebCore.TextDecoder.Class.typescriptDeclaration(),
+ JSC.API.Transpiler.Class.typescriptDeclaration(),
+ };
-pub fn main() anyerror!void {
var allocator = default_allocator;
var argv = std.mem.span(std.os.argv);
var dest = [_]string{ std.mem.span(argv[argv.len - 2]), std.mem.span(argv[argv.len - 1]) };
@@ -53,7 +72,9 @@ pub fn main() anyerror!void {
\\
\\
);
- try global_file.writeAll(comptime d.ts.class.Printer.printDecl(global, 0));
+ inline for (globals) |global| {
+ try global_file.writeAll(comptime d.ts.class.Printer.printDecl(global, 0));
+ }
var module_file = try dir.createFile("modules.d.ts", .{});
try module_file.writeAll(
@@ -78,7 +99,7 @@ pub fn main() anyerror!void {
inline for (modules) |decl| {
comptime var module: d.ts.module = decl.module;
- const basepath = comptime module.path["bun.js/".len..];
+ const basepath = comptime module.path;
if (std.fs.path.dirname(basepath)) |dirname| {
try dir.makePath(dirname);
}