aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/javascript.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/javascript/jsc/javascript.zig')
-rw-r--r--src/javascript/jsc/javascript.zig43
1 files changed, 37 insertions, 6 deletions
diff --git a/src/javascript/jsc/javascript.zig b/src/javascript/jsc/javascript.zig
index 9b1d22a05..b37fd7125 100644
--- a/src/javascript/jsc/javascript.zig
+++ b/src/javascript/jsc/javascript.zig
@@ -27,6 +27,8 @@ const Router = @import("./api/router.zig");
const ImportRecord = ast.ImportRecord;
const DotEnv = @import("../../env_loader.zig");
const ParseResult = @import("../../bundler.zig").ParseResult;
+const PackageJSON = @import("../../resolver/package_json.zig").PackageJSON;
+const MacroRemap = @import("../../resolver/package_json.zig").MacroMap;
pub const GlobalClasses = [_]type{
Request.Class,
Response.Class,
@@ -567,6 +569,8 @@ pub const VirtualMachine = struct {
macro_entry_points: std.AutoArrayHashMap(i32, *MacroEntryPoint),
macro_mode: bool = false,
+ has_any_macro_remappings: bool = false,
+
pub const MacroMap = std.AutoArrayHashMap(i32, js.JSObjectRef);
pub threadlocal var vm_loaded = false;
@@ -807,10 +811,12 @@ pub const VirtualMachine = struct {
var allocator = if (vm.has_loaded) &vm.arena.allocator else vm.allocator;
var fd: ?StoredFileDescriptorType = null;
+ var package_json: ?*PackageJSON = null;
if (vm.watcher) |watcher| {
if (watcher.indexOf(hash)) |index| {
fd = watcher.watchlist.items(.fd)[index];
+ package_json = watcher.watchlist.items(.package_json)[index];
}
}
@@ -825,13 +831,31 @@ pub const VirtualMachine = struct {
vm.bundler.resolver.log = old;
}
+ const macro_remappings = if (vm.macro_mode or !vm.has_any_macro_remappings)
+ MacroRemap{}
+ else brk: {
+ if (package_json) |pkg| {
+ break :brk pkg.macros;
+ }
+
+ // TODO: find a way to pass the package_json through the resolve
+ const resolve_result = vm.bundler.resolver.resolve(vm.bundler.fs.top_level_dir, specifier, .stmt) catch break :brk MacroRemap{};
+
+ break :brk resolve_result.getMacroRemappings();
+ };
+
+ var parse_options = Bundler.ParseOptions{
+ .allocator = allocator,
+ .path = path,
+ .loader = loader,
+ .dirname_fd = 0,
+ .file_descriptor = fd,
+ .file_hash = hash,
+ .macro_remappings = macro_remappings,
+ };
+
var parse_result = vm.bundler.parse(
- allocator,
- path,
- loader,
- 0,
- fd,
- hash,
+ parse_options,
null,
) orelse {
return error.ParseError;
@@ -916,6 +940,13 @@ pub const VirtualMachine = struct {
.stmt,
);
+ if (!vm.macro_mode) {
+ vm.has_any_macro_remappings = vm.has_any_macro_remappings or brk: {
+ if (result.package_json == null) break :brk false;
+
+ break :brk result.package_json.?.macros.count() > 0;
+ };
+ }
ret.result = result;
const result_path = result.pathConst() orelse return error.ModuleNotFound;
vm.resolved_count += 1;