const bun = @import("root").bun; const string = bun.string; const Output = bun.Output; const Global = bun.Global; const Environment = bun.Environment; const strings = bun.strings; const MutableString = bun.MutableString; const stringZ = bun.stringZ; const default_allocator = bun.default_allocator; const C = bun.C; const std = @import("std"); const lex = bun.js_lexer; const logger = @import("root").bun.logger; const options = @import("options.zig"); const js_parser = bun.js_parser; const json_parser = bun.JSON; const js_printer = bun.js_printer; const js_ast = bun.JSAst; const linker = @import("linker.zig"); const sync = @import("./sync.zig"); const Api = @import("api/schema.zig").Api; const resolve_path = @import("./resolver/resolve_path.zig"); const configureTransformOptionsForBun = @import("./bun.js/config.zig").configureTransformOptionsForBun; const Command = @import("cli.zig").Command; const bundler = bun.bundler; const DotEnv = @import("env_loader.zig"); const which = @import("which.zig").which; const JSC = @import("root").bun.JSC; const AsyncHTTP = @import("root").bun.HTTP.AsyncHTTP; const Arena = @import("./mimalloc_arena.zig").Arena; const OpaqueWrap = JSC.OpaqueWrap; const VirtualMachine = JSC.VirtualMachine; var run: Run = undefined; pub const Run = struct { ctx: Command.Context, vm: *VirtualMachine, entry_path: string, arena: Arena = undefined, any_unhandled: bool = false, pub fn bootStandalone(ctx_: Command.Context, entry_path: string, graph: bun.StandaloneModuleGraph) !void { var ctx = ctx_; JSC.markBinding(@src()); bun.JSC.initialize(); var graph_ptr = try bun.default_allocator.create(bun.StandaloneModuleGraph); graph_ptr.* = graph; js_ast.Expr.Data.Store.create(default_allocator); js_ast.Stmt.Data.Store.create(default_allocator); var arena = try Arena.init(); if (!ctx.debug.loaded_bunfig) { try bun.CLI.Arguments.loadConfigPath(ctx.allocator, true, "bunfig.toml", &ctx, .RunCommand); } run = .{ .vm = try VirtualMachine.initWithModuleGraph(.{ .allocator = arena.allocator(), .log = ctx.log, .graph = graph_ptr, }), .arena = arena, .ctx = ctx, .entry_path = entry_path, }; var vm = run.vm; var b = &vm.bundler; vm.preload = ctx.preloads; vm.argv = ctx.passthrough; vm.arena = &run.arena; vm.allocator = arena.allocator(); b.options.install = ctx.install; b.resolver.opts.install = ctx.install; b.resolver.opts.global_cache = ctx.debug.global_cache; b.resolver.opts.prefer_offline_install = (ctx.debug.offline_mode_setting orelse .online) == .offline; b.resolver.opts.prefer_latest_install = (ctx.debug.offline_mode_setting orelse .online) == .latest; b.options.global_cache = b.resolver.opts.global_cache; b.options.prefer_offline_install = b.resolver.opts.prefer_offline_install; b.options.prefer_latest_install = b.resolver.opts.prefer_latest_install; b.resolver.env_loader = b.env; b.options.minify_identifiers = ctx.bundler_options.minify_identifiers; b.options.minify_whitespace = ctx.bundler_options.minify_whitespace; b.resolver.opts.minify_identifiers = ctx.bundler_options.minify_identifiers; b.resolver.opts.minify_whitespace = ctx.bundler_options.minify_whitespace; // b.options.minify_syntax = ctx.bundler_options.minify_syntax; switch (ctx.debug.macros) { .disable => { b.options.no_macros = true; }, .map => |macros| { b.options.macro_remap = macros; }, .unspecified => {}, } b.configureRouter(false) catch { if (Output.enable_ansi_colors_stderr) { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true) catch {}; } else { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false) catch {}; } Output.prettyErrorln("\n", .{}); Global.exit(1); }; b.configureDefines() catch { if (Output.enable_ansi_colors_stderr) { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true) catch {}; } else { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false) catch {}; } Output.prettyErrorln("\n", .{}); Global.exit(1); }; AsyncHTTP.loadEnv(vm.allocator, vm.log, b.env); vm.loadExtraEnv(); vm.is_main_thread = true; JSC.VirtualMachine.is_main_thread_vm = true; var callback = OpaqueWrap(Run, Run.start); vm.global.vm().holdAPILock(&run, callback); } pub fn boot(ctx_: Command.Context, entry_path: string) !void { var ctx = ctx_; JSC.markBinding(@src()); bun.JSC.initialize(); js_ast.Expr.Data.Store.create(default_allocator); js_ast.Stmt.Data.Store.create(default_allocator); var arena = try Arena.init(); if (!ctx.debug.loaded_bunfig) { try bun.CLI.Arguments.loadConfigPath(ctx.allocator, true, "bunfig.toml", &ctx, .RunCommand); } run = .{ .vm = try VirtualMachine.init( .{ .allocator = arena.allocator(), .log = ctx.log, .args = ctx.args, .store_fd = ctx.debug.hot_reload != .none, .smol = ctx.runtime_options.smol, .debugger = ctx.runtime_options.debugger, }, ), .arena = arena, .ctx = ctx, .entry_path = entry_path, }; var vm = run.vm; var b = &vm.bundler; vm.preload = ctx.preloads; vm.argv = ctx.passthrough; vm.arena = &run.arena; vm.allocator = arena.allocator(); b.options.install = ctx.install; b.resolver.opts.install = ctx.install; b.resolver.opts.global_cache = ctx.debug.global_cache; b.resolver.opts.prefer_offline_install = (ctx.debug.offline_mode_setting orelse .online) == .offline; b.resolver.opts.prefer_latest_install = (ctx.debug.offline_mode_setting orelse .online) == .latest; b.options.global_cache = b.resolver.opts.global_cache; b.options.prefer_offline_install = b.resolver.opts.prefer_offline_install; b.options.prefer_latest_install = b.resolver.opts.prefer_latest_install; b.resolver.env_loader = b.env; b.options.minify_identifiers = ctx.bundler_options.minify_identifiers; b.options.minify_whitespace = ctx.bundler_options.minify_whitespace; b.resolver.opts.minify_identifiers = ctx.bundler_options.minify_identifiers; b.resolver.opts.minify_whitespace = ctx.bundler_options.minify_whitespace; // b.options.minify_syntax = ctx.bundler_options.minify_syntax; switch (ctx.debug.macros) { .disable => { b.options.no_macros = true; }, .map => |macros| { b.options.macro_remap = macros; }, .unspecified => {}, } b.configureRouter(false) catch { if (Output.enable_ansi_colors_stderr) { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true) catch {}; } else { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false) catch {}; } Output.prettyErrorln("\n", .{}); Global.exit(1); }; b.configureDefines() catch { if (Output.enable_ansi_colors_stderr) { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true) catch {}; } else { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false) catch {}; } Output.prettyErrorln("\n", .{}); Global.exit(1); }; AsyncHTTP.loadEnv(vm.allocator, vm.log, b.env); vm.loadExtraEnv(); vm.is_main_thread = true; JSC.VirtualMachine.is_main_thread_vm = true; // Allow setting a custom timezone if (vm.bundler.env.get("TZ")) |tz| { if (tz.len > 0) { _ = vm.global.setTimeZone(&JSC.ZigString.init(tz)); } } vm.bundler.env.loadTracy(); var callback = OpaqueWrap(Run, Run.start); vm.global.vm().holdAPILock(&run, callback); } fn onUnhandledRejectionBeforeClose(this: *JSC.VirtualMachine, _: *JSC.JSGlobalObject, value: JSC.JSValue) void { this.runErrorHandler(value, null); run.any_unhandled = true; } pub fn start(this: *Run) void { var vm = this.vm; vm.hot_reload = this.ctx.debug.hot_reload; if (this.ctx.debug.hot_reload != .none) { JSC.HotReloader.enableHotModuleReloading(vm); } if (strings.eqlComptime(this.entry_path, ".") and vm.bundler.fs.top_level_dir.len > 0) { this.entry_path = vm.bundler.fs.top_level_dir; } if (vm.loadEntryPoint(this.entry_path)) |promise| { if (promise.status(vm.global.vm()) == .Rejected) { vm.runErrorHandler(promise.result(vm.global.vm()), null); if (vm.hot_reload != .none) { vm.eventLoop().tick(); vm.eventLoop().tickPossiblyForever(); } else { vm.exit_handler.exit_code = 1; vm.onExit(); Global.exit(1); } } _ = promise.result(vm.global.vm()); if (vm.log.msgs.items.len > 0) { if (Output.enable_ansi_colors) { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true) catch {}; } else { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false) catch {}; } Output.prettyErrorln("\n", .{}); Output.flush(); } } else |err| { if (vm.log.msgs.items.len > 0) { if (Output.enable_ansi_colors) { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true) catch {}; } else { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false) catch {}; } Output.flush(); } else { Output.prettyErrorln("Error occurred loading entry point: {s}", .{@errorName(err)}); } if (vm.hot_reload != .none) { vm.eventLoop().tick(); vm.eventLoop().tickPossiblyForever(); } else { vm.exit_handler.exit_code = 1; vm.onExit(); Global.exit(1); } } // don't run the GC if we don't actually need to if (vm.eventLoop().tasks.count > 0 or vm.active_tasks > 0 or vm.uws_event_loop.?.active > 0 or vm.eventLoop().tickConcurrentWithCount() > 0) { vm.global.vm().releaseWeakRefs(); _ = vm.arena.gc(false); _ = vm.global.vm().runGC(false); vm.tick(); } { if (this.vm.isWatcherEnabled()) { var prev_promise = this.vm.pending_internal_promise; if (prev_promise.status(vm.global.vm()) == .Rejected) { vm.onUnhandledError(this.vm.global, this.vm.pending_internal_promise.result(vm.global.vm())); } while (true) { while (vm.eventLoop().tasks.count > 0 or vm.active_tasks > 0 or vm.uws_event_loop.?.active > 0) { vm.tick(); // Report exceptions in hot-reloaded modules if (this.vm.pending_internal_promise.status(vm.global.vm()) == .Rejected and prev_promise != this.vm.pending_internal_promise) { prev_promise = this.vm.pending_internal_promise; vm.onUnhandledError(this.vm.global, this.vm.pending_internal_promise.result(vm.global.vm())); continue; } vm.eventLoop().autoTickActive(); } vm.onBeforeExit(); if (this.vm.pending_internal_promise.status(vm.global.vm()) == .Rejected and prev_promise != this.vm.pending_internal_promise) { prev_promise = this.vm.pending_internal_promise; vm.onUnhandledError(this.vm.global, this.vm.pending_internal_promise.result(vm.global.vm())); } vm.eventLoop().tickPossiblyForever(); } if (this.vm.pending_internal_promise.status(vm.global.vm()) == .Rejected and prev_promise != this.vm.pending_internal_promise) { prev_promise = this.vm.pending_internal_promise; vm.onUnhandledError(this.vm.global, this.vm.pending_internal_promise.result(vm.global.vm())); } } else { while (vm.eventLoop().tasks.count > 0 or vm.active_tasks > 0 or vm.uws_event_loop.?.active > 0) { vm.tick(); vm.eventLoop().autoTickActive(); } vm.onBeforeExit(); } if (vm.log.msgs.items.len > 0) { if (Output.enable_ansi_colors) { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true) catch {}; } else { vm.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false) catch {}; } Output.prettyErrorln("\n", .{}); Output.flush(); } } vm.onUnhandledRejection = &onUnhandledRejectionBeforeClose; vm.global.handleRejectedPromises(); if (this.any_unhandled and this.vm.exit_handler.exit_code == 0) { this.vm.exit_handler.exit_code = 1; } const exit_code = this.vm.exit_handler.exit_code; vm.onExit(); if (!JSC.is_bindgen) JSC.napi.fixDeadCodeElimination(); Global.exit(exit_code); } }; bun/commit/packages/bun-types/globals.d.ts?h=bun-v0.8.0&id=3556fa3b1e80c9e3587c053a7761d07e65e2dcd8&follow=1'>Update globals.d.ts (#4276)Gravatar VietnamecDevelopment 1-1/+1 2023-08-23Fix ffi type (#4265)Gravatar Code Hz 2-49/+272 2023-08-23Bunch of streams fixes (#4251)Gravatar Jarred Sumner 31-548/+866 2023-08-23docs: remove broken DNS link which is also not present in the official docs (...Gravatar Quentin 1-1/+0 2023-08-23Fix more types. (#4273)Gravatar xxxhussein 8-16/+22 2023-08-23ask for bun --revision instead bun -v (#4256)Gravatar Jozef Steinhübl 1-1/+1 2023-08-22fix yield (#4264)Gravatar dave caruso 2-1/+17 2023-08-22Fix Bun.inspect typesGravatar Colin McDonnell 1-1/+1 2023-08-21fix fsevents and stub for qwikcity (#4247)Gravatar dave caruso 9-64/+24 2023-08-21fix stdin stream unref and resuming (#4250)Gravatar Dylan Conway 4-19/+26 2023-08-21Docs and types for v0.8.0 (#4199)Gravatar Colin McDonnell 10-37/+487 2023-08-21Bun v0.8Gravatar Jarred Sumner 5-5/+5 2023-08-21Make the code generator less duplicativeGravatar Jarred Sumner 2-84/+39 2023-08-21import errors have `code` set to `ERR_MODULE_NOT_FOUND` and `require` errors ...Gravatar Jarred Sumner 11-19/+122 2023-08-21fetch(stream) add stream support for compressed and uncompressed data (#4127)Gravatar Ciro Spaciari 19-156/+1876 2023-08-21Fix inquirer (#4245)Gravatar dave caruso 2-3/+6 2023-08-21Update module_loader.zigGravatar Jarred Sumner 1-1/+1 2023-08-21Fix(bundler): allow generating exe file in nested path. (#4226)Gravatar Ai Hoshino 3-7/+49 2023-08-21Fix typoGravatar Colin McDonnell 1-1/+1 2023-08-21Fix crypto.EC constructor (#4242)Gravatar dave caruso 2-3/+4 2023-08-21Implement `napi_ref_threadsafe_function` (#4156)Gravatar dave caruso 10-7/+65 2023-08-21feat: Implement Bun.inspect.custom (#4243)Gravatar dave caruso 6-8/+26 2023-08-21Fixes #4089 (#4105)Gravatar Jarred Sumner 3-36/+136 2023-08-2140x faster .toString('hex') (#4237)Gravatar Jarred Sumner 3-17/+105 2023-08-21Fix memory leak in `buffer.toString("hex")` (#4235)Gravatar Jarred Sumner 2-1/+6 2023-08-21Update README.md (#4232)Gravatar xxxhussein 1-1/+1 2023-08-21Add missing header changeGravatar Jarred Sumner 1-1/+1 2023-08-21Add LazyPropertyGravatar Jarred Sumner 1-0/+3 2023-08-21Fix BigIntStats generated classGravatar Jarred Sumner 1-1/+1 2023-08-21RegenerateGravatar Jarred Sumner 1-8/+15 2023-08-21Implement FileGravatar Jarred Sumner 12-12/+387 2023-08-20Fixes #1675 (#4230)Gravatar Jarred Sumner 8-70/+297 2023-08-20Implement `--inspect-brk` (#4222)Gravatar Jarred Sumner 17-41/+101 2023-08-20Fix test failures from 3a9a6c63a (#4231)Gravatar Jarred Sumner 4-32/+34 2023-08-20Fix(bundler): use different alias mappings based on the target. (#4163)Gravatar Ai Hoshino 8-18/+90 2023-08-19Update BunDebugger.cppGravatar Jarred Sumner 1-1/+3 2023-08-19Introduce `bun --inspect-wait`Gravatar Jarred Sumner 3-19/+47 2023-08-19misc non-posix fixesGravatar Jarred Sumner 2-3/+3 2023-08-19Update lockfile.mdGravatar Jarred Sumner 1-1/+8 2023-08-19Update lockfile.mdGravatar Jarred Sumner 1-4/+4 2023-08-19Update lockfile.mdGravatar Jarred Sumner 1-1/+29 2023-08-19Update Dockerfile-distroless (#4210)Gravatar Omar 1-0/+1 2023-08-19Fix symbol visibilityGravatar Jarred Sumner 1-0/+1 2023-08-19[napi] Implement `node_api_create_syntax_error`, `node_api_symbol_for`, `nod...Gravatar Jarred Sumner 5-1/+70 2023-08-19Fix crash impacting sharp & resvg (#4221)Gravatar Jarred Sumner 5-73/+73 2023-08-19Fixes #172 (#4220)Gravatar Jarred Sumner 7-9/+87 2023-08-19Add inline sourcemaps when `--inspect` is enabled (#4213)Gravatar Jarred Sumner 3-3/+64 2023-08-19tty `ReadStream`, `WriteStream`, and readline rawmode (#4179)Gravatar Dylan Conway 23-722/+821 2023-08-18Fix make headers (again)Gravatar Jarred Sumner 1-0/+2