aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/api')
-rw-r--r--src/bun.js/api/JSBundler.classes.ts (renamed from src/bun.js/api/transpiler.classes.ts)24
-rw-r--r--src/bun.js/api/JSBundler.zig332
-rw-r--r--src/bun.js/api/JSTranspiler.zig (renamed from src/bun.js/api/transpiler.zig)12
-rw-r--r--src/bun.js/api/bun.zig18
-rw-r--r--src/bun.js/api/ffi.zig1
-rw-r--r--src/bun.js/api/server.zig8
6 files changed, 378 insertions, 17 deletions
diff --git a/src/bun.js/api/transpiler.classes.ts b/src/bun.js/api/JSBundler.classes.ts
index f016a1844..5eeed30f0 100644
--- a/src/bun.js/api/transpiler.classes.ts
+++ b/src/bun.js/api/JSBundler.classes.ts
@@ -27,14 +27,24 @@ export default [
length: 2,
},
},
- custom: {
- onLoadPlugins: {
- extraHeaderIncludes: ["BunPlugin.h"],
- impl: "JSTranspiler+BunPlugin-impl.h",
- type: `WTF::Vector<std::unique_ptr<BunPlugin::OnLoad>>`,
+ }),
+
+ define({
+ name: "Bundler",
+ construct: true,
+ finalize: true,
+ hasPendingActivity: true,
+ configurable: false,
+ klass: {},
+ JSType: "0b11101110",
+ proto: {
+ handle: {
+ fn: "handleRequest",
+ length: 2,
},
- onResolvePlugins: {
- type: `WTF::Vector<std::unique_ptr<BunPlugin::OnResolve>>`,
+ write: {
+ fn: "write",
+ length: 1,
},
},
}),
diff --git a/src/bun.js/api/JSBundler.zig b/src/bun.js/api/JSBundler.zig
new file mode 100644
index 000000000..e8ce7a0e5
--- /dev/null
+++ b/src/bun.js/api/JSBundler.zig
@@ -0,0 +1,332 @@
+const std = @import("std");
+const Api = @import("../../api/schema.zig").Api;
+const http = @import("../../http.zig");
+const JavaScript = @import("../javascript.zig");
+const QueryStringMap = @import("../../url.zig").QueryStringMap;
+const CombinedScanner = @import("../../url.zig").CombinedScanner;
+const bun = @import("bun");
+const string = bun.string;
+const JSC = bun.JSC;
+const js = JSC.C;
+const WebCore = @import("../webcore/response.zig");
+const Bundler = bun.bundler;
+const options = @import("../../options.zig");
+const VirtualMachine = JavaScript.VirtualMachine;
+const ScriptSrcStream = std.io.FixedBufferStream([]u8);
+const ZigString = JSC.ZigString;
+const Fs = @import("../../fs.zig");
+const Base = @import("../base.zig");
+const getAllocator = Base.getAllocator;
+const JSObject = JSC.JSObject;
+const JSError = Base.JSError;
+const JSValue = bun.JSC.JSValue;
+const JSGlobalObject = JSC.JSGlobalObject;
+const strings = bun.strings;
+const NewClass = Base.NewClass;
+const To = Base.To;
+const Request = WebCore.Request;
+
+const FetchEvent = WebCore.FetchEvent;
+const MacroMap = @import("../../resolver/package_json.zig").MacroMap;
+const TSConfigJSON = @import("../../resolver/tsconfig_json.zig").TSConfigJSON;
+const PackageJSON = @import("../../resolver/package_json.zig").PackageJSON;
+const logger = bun.logger;
+const Loader = options.Loader;
+const Platform = options.Platform;
+const JSAst = bun.JSAst;
+const JSParser = bun.js_parser;
+const JSPrinter = bun.js_printer;
+const ScanPassResult = JSParser.ScanPassResult;
+const Mimalloc = @import("../../mimalloc_arena.zig");
+const Runtime = @import("../../runtime.zig").Runtime;
+const JSLexer = bun.js_lexer;
+const Expr = JSAst.Expr;
+
+pub const JSBundler = struct {
+ heap: Mimalloc.Arena,
+ allocator: std.mem.Allocator,
+ configs: Config.List = .{},
+ has_pending_activity: std.atomic.Atomic(bool) = std.atomic.Atomic(bool).init(true),
+
+ pub usingnamespace JSC.Codegen.JSBundler;
+
+ const OwnedString = bun.MutableString;
+
+ pub const Config = struct {
+ target: options.Platform = options.Platform.browser,
+ entry_points: std.BufSet = std.BufSet.init(bun.default_allocator),
+ hot: bool = false,
+ define: std.BufMap = std.BufMap.init(bun.default_allocator),
+ dir: OwnedString = OwnedString.initEmpty(bun.default_allocator),
+ serve: Serve = .{},
+ jsx: options.JSX.Pragma = .{},
+ code_splitting: bool = false,
+ minify: Minify = .{},
+ server_components: ServerComponents = ServerComponents{},
+ plugins: PluginDeclaration.List = .{},
+
+ names: Names = .{},
+ label: OwnedString = OwnedString.initEmpty(bun.default_allocator),
+
+ pub const List = bun.StringArrayHashMapUnmanaged(Config);
+
+ ///
+ /// { name: "", setup: (build) {} }
+ pub const PluginDeclaration = struct {
+ name: OwnedString = OwnedString.initEmpty(bun.default_allocator),
+ setup: JSC.Strong = .{},
+
+ pub const List = std.ArrayListUnmanaged(PluginDeclaration);
+
+ pub fn deinit(this: *PluginDeclaration) void {
+ this.name.deinit();
+ this.setup.deinit();
+ }
+ };
+
+ pub fn fromJS(globalThis: *JSC.JSGlobalObject, config: JSC.JSValue, allocator: std.mem.Allocator) !Config {
+ var this = Config{
+ .entry_points = std.BufSet.init(allocator),
+ .define = std.BufMap.init(allocator),
+ .dir = OwnedString.initEmpty(allocator),
+ .label = OwnedString.initEmpty(allocator),
+ .names = .{
+ .owned_entry_point = OwnedString.initEmpty(allocator),
+ .owned_chunk = OwnedString.initEmpty(allocator),
+ },
+ };
+ errdefer this.deinit(allocator);
+
+ if (try config.getOptionalEnum(globalThis, "target", options.Platform)) |target| {
+ this.target = target;
+ }
+
+ if (try config.getOptional(globalThis, "hot", bool)) |hot| {
+ this.hot = hot;
+ }
+
+ if (try config.getOptional(globalThis, "splitting", bool)) |hot| {
+ this.code_splitting = hot;
+ }
+
+ if (try config.getOptional(globalThis, "minifyWhitespace", bool)) |hot| {
+ this.minify.whitespace = hot;
+ }
+
+ if (try config.getArray(globalThis, "entrypoints")) |entry_points| {
+ var iter = entry_points.arrayIterator(globalThis);
+ while (iter.next()) |entry_point| {
+ var slice = entry_point.toSliceOrNull(globalThis, allocator) orelse {
+ globalThis.throwInvalidArguments("Expected entrypoints to be an array of strings", .{});
+ return error.JSException;
+ };
+ defer slice.deinit();
+ try this.entry_points.insert(slice.slice());
+ }
+ } else {
+ globalThis.throwInvalidArguments("Expected entrypoints to be an array of strings", .{});
+ return error.JSException;
+ }
+
+ if (try config.getOptional(globalThis, "name", ZigString.Slice)) |slice| {
+ defer slice.deinit();
+ this.label.appendSliceExact(slice.slice()) catch unreachable;
+ }
+
+ if (try config.getOptional(globalThis, "dir", ZigString.Slice)) |slice| {
+ defer slice.deinit();
+ this.dir.appendSliceExact(slice.slice()) catch unreachable;
+ } else {
+ this.dir.appendSliceExact(globalThis.bunVM().bundler.fs.top_level_dir) catch unreachable;
+ }
+
+ if (try config.getOptional(globalThis, "entryNames", ZigString.Slice)) |slice| {
+ defer slice.deinit();
+ this.names.owned_entry_point.appendSliceExact(slice.slice()) catch unreachable;
+ this.names.entry_point.data = this.names.owned_entry_point.list.items;
+ }
+
+ if (try config.getOptional(globalThis, "chunkNames", ZigString.Slice)) |slice| {
+ defer slice.deinit();
+ this.names.owned_chunk.appendSliceExact(slice.slice()) catch unreachable;
+ this.names.chunk.data = this.names.owned_chunk.list.items;
+ }
+
+ if (try config.getArray(globalThis, "plugins")) |array| {
+ var iter = array.arrayIterator(globalThis);
+ while (iter.next()) |plugin| {
+ var decl = PluginDeclaration{
+ .name = OwnedString.initEmpty(allocator),
+ .setup = .{},
+ };
+ errdefer decl.deinit();
+
+ if (plugin.getObject(globalThis, "SECRET_SERVER_COMPONENTS_INTERNALS")) |internals| {
+ if (try internals.get(globalThis, "router")) |router_value| {
+ if (router_value.as(JSC.API.FileSystemRouter) != null) {
+ this.server_components.router.set(globalThis, router_value);
+ } else {
+ globalThis.throwInvalidArguments("Expected router to be a Bun.FileSystemRouter", .{});
+ return error.JSError;
+ }
+ }
+
+ const directive_object = (try internals.getObject(globalThis, "directive")) orelse {
+ globalThis.throwInvalidArguments("Expected directive to be an object", .{});
+ return error.JSError;
+ };
+
+ if (try directive_object.getArray(globalThis, "client")) |client_names_array| {
+ var array_iter = client_names_array.arrayIterator(globalThis);
+ while (array_iter.next()) |client_name| {
+ var slice = client_name.toSliceOrNull(globalThis, allocator) orelse {
+ globalThis.throwInvalidArguments("Expected directive.client to be an array of strings", .{});
+ return error.JSException;
+ };
+ defer slice.deinit();
+ try this.server_components.client.append(allocator, OwnedString.initCopy(allocator, slice.slice()) catch unreachable);
+ }
+ } else {
+ globalThis.throwInvalidArguments("Expected directive.client to be an array of strings", .{});
+ return error.JSException;
+ }
+
+ if (try directive_object.getArray(globalThis, "server")) |server_names_array| {
+ var array_iter = server_names_array.arrayIterator(globalThis);
+ while (array_iter.next()) |server_name| {
+ var slice = server_name.toSliceOrNull(globalThis, allocator) orelse {
+ globalThis.throwInvalidArguments("Expected directive.server to be an array of strings", .{});
+ return error.JSException;
+ };
+ defer slice.deinit();
+ try this.server_components.server.append(allocator, OwnedString.initCopy(allocator, slice.slice()) catch unreachable);
+ }
+ } else {
+ globalThis.throwInvalidArguments("Expected directive.server to be an array of strings", .{});
+ return error.JSException;
+ }
+ }
+
+ if (try plugin.getOptional(globalThis, "name", ZigString.Slice)) |slice| {
+ defer slice.deinit();
+ decl.name.appendSliceExact(slice.slice()) catch unreachable;
+ }
+
+ if (try plugin.getFunction(globalThis, "setup", JSC.JSValue)) |setup| {
+ decl.setup.set(globalThis, setup);
+ } else {
+ globalThis.throwInvalidArguments("Expected plugin to have a setup() function", .{});
+ return error.JSError;
+ }
+
+ try this.plugins.append(allocator, decl);
+ }
+ }
+
+ return config;
+ }
+
+ pub const Names = struct {
+ owned_entry_point: OwnedString = OwnedString.initEmpty(bun.default_allocator),
+ entry_point: options.PathTemplate = options.PathTemplate.file,
+ owned_chunk: OwnedString = OwnedString.initEmpty(bun.default_allocator),
+ chunk: options.PathTemplate = options.PathTemplate.chunk,
+
+ pub fn deinit(self: *Names) void {
+ self.owned_entry_point.deinit();
+ self.owned_chunk.deinit();
+ }
+ };
+
+ pub const ServerComponents = struct {
+ router: JSC.Strong = .{},
+ client: std.ArrayListUnmanaged(OwnedString) = .{},
+ server: std.ArrayListUnmanaged(OwnedString) = .{},
+
+ pub fn deinit(self: *ServerComponents, allocator: std.mem.Allocator) void {
+ self.router.deinit();
+ self.client.clearAndFree(allocator);
+ self.server.clearAndFree(allocator);
+ }
+ };
+
+ pub const Minify = struct {
+ whitespace: bool = false,
+ };
+
+ pub const Serve = struct {
+ handler_path: OwnedString = OwnedString.initEmpty(bun.default_allocator),
+ prefix: OwnedString = OwnedString.initEmpty(bun.default_allocator),
+
+ pub fn deinit(self: *Serve, allocator: std.mem.Allocator) void {
+ _ = allocator;
+ self.handler_path.deinit();
+ self.prefix.deinit();
+ }
+ };
+
+ pub fn deinit(self: *Config, allocator: std.mem.Allocator) void {
+ self.entry_points.deinit();
+ self.define.deinit();
+ self.dir.deinit();
+ self.serve.deinit(allocator);
+ self.plugins.deinit();
+ self.server_components.deinit(allocator);
+ self.names.deinit();
+ self.label.deinit();
+ }
+ };
+
+ pub fn constructor(
+ globalThis: *JSC.JSGlobalObject,
+ callframe: *JSC.CallFrame,
+ ) callconv(.C) ?*JSBundler {
+ var temp = std.heap.ArenaAllocator.init(getAllocator(globalThis));
+ const arguments = callframe.arguments(3);
+ var args = JSC.Node.ArgumentsSlice.init(
+ globalThis.bunVM(),
+ arguments.ptr[0..arguments.len],
+ );
+ _ = args;
+
+ defer temp.deinit();
+
+ return null;
+ }
+
+ pub fn handleRequest(
+ this: *JSBundler,
+ globalThis: *JSC.JSGlobalObject,
+ callframe: *JSC.CallFrame,
+ ) callconv(.C) JSValue {
+ _ = callframe;
+ _ = globalThis;
+ _ = this;
+
+ return .zero;
+ }
+
+ pub fn write(
+ this: *JSBundler,
+ globalThis: *JSC.JSGlobalObject,
+ callframe: *JSC.CallFrame,
+ ) callconv(.C) JSValue {
+ _ = callframe;
+ _ = globalThis;
+ _ = this;
+
+ return .zero;
+ }
+
+ pub fn hasPendingActivity(this: *JSBundler) callconv(.C) bool {
+ @fence(.Acquire);
+ return this.has_pending_activity.load(.Acquire);
+ }
+
+ pub fn finalize(
+ this: *JSBundler,
+ ) callconv(.C) void {
+ this.heap.deinit();
+ JSC.VirtualMachine.get().allocator.destroy(this);
+ }
+};
diff --git a/src/bun.js/api/transpiler.zig b/src/bun.js/api/JSTranspiler.zig
index 8562a3204..465ab0ad4 100644
--- a/src/bun.js/api/transpiler.zig
+++ b/src/bun.js/api/JSTranspiler.zig
@@ -6,7 +6,7 @@ const QueryStringMap = @import("../../url.zig").QueryStringMap;
const CombinedScanner = @import("../../url.zig").CombinedScanner;
const bun = @import("bun");
const string = bun.string;
-const JSC = @import("bun").JSC;
+const JSC = bun.JSC;
const js = JSC.C;
const WebCore = @import("../webcore/response.zig");
const Bundler = bun.bundler;
@@ -19,9 +19,9 @@ const Base = @import("../base.zig");
const getAllocator = Base.getAllocator;
const JSObject = JSC.JSObject;
const JSError = Base.JSError;
-const JSValue = JSC.JSValue;
+const JSValue = bun.JSC.JSValue;
const JSGlobalObject = JSC.JSGlobalObject;
-const strings = @import("bun").strings;
+const strings = bun.strings;
const NewClass = Base.NewClass;
const To = Base.To;
const Request = WebCore.Request;
@@ -30,7 +30,7 @@ const FetchEvent = WebCore.FetchEvent;
const MacroMap = @import("../../resolver/package_json.zig").MacroMap;
const TSConfigJSON = @import("../../resolver/tsconfig_json.zig").TSConfigJSON;
const PackageJSON = @import("../../resolver/package_json.zig").PackageJSON;
-const logger = @import("bun").logger;
+const logger = bun.logger;
const Loader = options.Loader;
const Platform = options.Platform;
const JSAst = bun.JSAst;
@@ -838,7 +838,7 @@ fn getParseResult(this: *Transpiler, allocator: std.mem.Allocator, code: []const
// necessary because we don't run the linker
if (parse_result) |*res| {
- for (res.ast.import_records) |*import| {
+ for (res.ast.import_records.slice()) |*import| {
if (import.kind.isCommonJS()) {
import.do_commonjs_transform_in_printer = true;
import.module_id = @truncate(u32, std.hash.Wyhash.hash(0, import.path.pretty));
@@ -923,7 +923,7 @@ pub fn scan(
const imports_label = JSC.ZigString.static("imports");
const named_imports_value = namedImportsToJS(
globalThis,
- parse_result.ast.import_records,
+ parse_result.ast.import_records.slice(),
exception,
);
if (exception.* != null) {
diff --git a/src/bun.js/api/bun.zig b/src/bun.js/api/bun.zig
index 5dc3abcf9..7c6473727 100644
--- a/src/bun.js/api/bun.zig
+++ b/src/bun.js/api/bun.zig
@@ -71,7 +71,8 @@ const VM = @import("bun").JSC.VM;
const JSFunction = @import("bun").JSC.JSFunction;
const Config = @import("../config.zig");
const URL = @import("../../url.zig").URL;
-const Transpiler = @import("./transpiler.zig");
+const Transpiler = bun.JSC.API.JSTranspiler;
+const JSBundler = bun.JSC.API.JSBundler;
const VirtualMachine = JSC.VirtualMachine;
const IOTask = JSC.IOTask;
const zlib = @import("../../zlib.zig");
@@ -1319,6 +1320,9 @@ pub const Class = NewClass(
.Transpiler = .{
.get = getTranspilerConstructor,
},
+ .Bundler = .{
+ .get = getBundlerConstructor,
+ },
.hash = .{
.get = getHashObject,
},
@@ -2339,6 +2343,16 @@ pub fn mmapFile(
}.x, @intToPtr(?*anyopaque, map.len), exception);
}
+pub fn getBundlerConstructor(
+ _: void,
+ ctx: js.JSContextRef,
+ _: js.JSValueRef,
+ _: js.JSStringRef,
+ _: js.ExceptionRef,
+) js.JSValueRef {
+ return JSC.API.JSBundler.getConstructor(ctx).asObjectRef();
+}
+
pub fn getTranspilerConstructor(
_: void,
ctx: js.JSContextRef,
@@ -2346,7 +2360,7 @@ pub fn getTranspilerConstructor(
_: js.JSStringRef,
_: js.ExceptionRef,
) js.JSValueRef {
- return JSC.API.Bun.Transpiler.getConstructor(ctx).asObjectRef();
+ return JSC.API.JSTranspiler.getConstructor(ctx).asObjectRef();
}
pub fn getFileSystemRouter(
diff --git a/src/bun.js/api/ffi.zig b/src/bun.js/api/ffi.zig
index 89192dc85..6e2ad4242 100644
--- a/src/bun.js/api/ffi.zig
+++ b/src/bun.js/api/ffi.zig
@@ -71,7 +71,6 @@ const VM = @import("bun").JSC.VM;
const JSFunction = @import("bun").JSC.JSFunction;
const Config = @import("../config.zig");
const URL = @import("../../url.zig").URL;
-const Transpiler = @import("./transpiler.zig");
const VirtualMachine = JSC.VirtualMachine;
const IOTask = JSC.IOTask;
const ComptimeStringMap = @import("../../comptime_string_map.zig").ComptimeStringMap;
diff --git a/src/bun.js/api/server.zig b/src/bun.js/api/server.zig
index 11237844a..bc83a021b 100644
--- a/src/bun.js/api/server.zig
+++ b/src/bun.js/api/server.zig
@@ -70,7 +70,6 @@ const VM = @import("bun").JSC.VM;
const JSFunction = @import("bun").JSC.JSFunction;
const Config = @import("../config.zig");
const URL = @import("../../url.zig").URL;
-const Transpiler = @import("./transpiler.zig");
const VirtualMachine = JSC.VirtualMachine;
const IOTask = JSC.IOTask;
const is_bindgen = JSC.is_bindgen;
@@ -5173,4 +5172,11 @@ pub const SSLServer = NewServer(true, false);
pub const DebugServer = NewServer(false, true);
pub const DebugSSLServer = NewServer(true, true);
+pub const AnyServer = union(enum) {
+ Server: *Server,
+ SSLServer: *SSLServer,
+ DebugServer: *DebugServer,
+ DebugSSLServer: *DebugSSLServer,
+};
+
const welcome_page_html_gz = @embedFile("welcome-page.html.gz");