aboutsummaryrefslogtreecommitdiff
path: root/src/resolver/resolver.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/resolver/resolver.zig')
-rw-r--r--src/resolver/resolver.zig77
1 files changed, 76 insertions, 1 deletions
diff --git a/src/resolver/resolver.zig b/src/resolver/resolver.zig
index 45f110e95..7f95dffae 100644
--- a/src/resolver/resolver.zig
+++ b/src/resolver/resolver.zig
@@ -207,6 +207,7 @@ threadlocal var _open_dirs: [256]std.fs.Dir = undefined;
threadlocal var resolve_without_remapping_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
threadlocal var index_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
threadlocal var dir_info_uncached_filename_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
+threadlocal var node_bin_path: [std.fs.MAX_PATH_BYTES]u8 = undefined;
threadlocal var dir_info_uncached_path_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
threadlocal var tsconfig_base_url_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
threadlocal var relative_abs_path_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
@@ -324,6 +325,12 @@ pub const LoadResult = struct {
// This is a global so even if multiple resolvers are created, the mutex will still work
var resolver_Mutex: Mutex = undefined;
var resolver_Mutex_loaded: bool = false;
+
+const BinFolderArray = std.BoundedArray(string, 128);
+var bin_folders: BinFolderArray = undefined;
+var bin_folders_lock: Mutex = Mutex.init();
+var bin_folders_loaded: bool = false;
+
// TODO:
// - Fix "browser" field mapping
// - Consider removing the string list abstraction?
@@ -336,6 +343,9 @@ pub const Resolver = struct {
node_module_bundle: ?*NodeModuleBundle,
extension_order: []const string = undefined,
+ care_about_bin_folder: bool = false,
+ care_about_scripts: bool = false,
+
debug_logs: ?DebugLogs = null,
elapsed: i128 = 0, // tracing
@@ -1361,8 +1371,19 @@ pub const Resolver = struct {
return path.text;
}
+ pub fn binDirs(r: *const ThisResolver) []const string {
+ if (!bin_folders_loaded) return &[_]string{};
+ return bin_folders.constSlice();
+ }
+
pub fn parsePackageJSON(r: *ThisResolver, file: string, dirname_fd: StoredFileDescriptorType) !?*PackageJSON {
- const pkg = PackageJSON.parse(ThisResolver, r, file, dirname_fd, true) orelse return null;
+ var pkg: PackageJSON = undefined;
+ if (!r.care_about_scripts) {
+ pkg = PackageJSON.parse(ThisResolver, r, file, dirname_fd, true, false) orelse return null;
+ } else {
+ pkg = PackageJSON.parse(ThisResolver, r, file, dirname_fd, true, true) orelse return null;
+ }
+
var _pkg = try r.allocator.create(PackageJSON);
_pkg.* = pkg;
return _pkg;
@@ -2477,6 +2498,60 @@ pub const Resolver = struct {
info.has_node_modules = (entry.entry.kind(rfs)) == .dir;
}
}
+
+ if (r.care_about_bin_folder) {
+ append_bin_dir: {
+ if (info.has_node_modules) {
+ if (entries.getComptimeQuery("node_modules")) |q| {
+ if (!bin_folders_loaded) {
+ bin_folders_loaded = true;
+ bin_folders = BinFolderArray.init(0) catch unreachable;
+ }
+
+ const this_dir = std.fs.Dir{ .fd = fd };
+ var file = this_dir.openDirZ("node_modules/.bin", .{}) catch break :append_bin_dir;
+ defer file.close();
+ var bin_path = std.os.getFdPath(file.fd, &node_bin_path) catch break :append_bin_dir;
+ bin_folders_lock.lock();
+ defer bin_folders_lock.unlock();
+
+ for (bin_folders.constSlice()) |existing_folder| {
+ if (strings.eql(existing_folder, bin_path)) {
+ break :append_bin_dir;
+ }
+ }
+
+ bin_folders.append(r.fs.dirname_store.append([]u8, bin_path) catch break :append_bin_dir) catch {};
+ }
+ }
+
+ if (info.is_node_modules) {
+ if (entries.getComptimeQuery(".bin")) |q| {
+ if (q.entry.kind(rfs) == .dir) {
+ if (!bin_folders_loaded) {
+ bin_folders_loaded = true;
+ bin_folders = BinFolderArray.init(0) catch unreachable;
+ }
+
+ const this_dir = std.fs.Dir{ .fd = fd };
+ var file = this_dir.openDirZ(".bin", .{}) catch break :append_bin_dir;
+ defer file.close();
+ var bin_path = std.os.getFdPath(file.fd, &node_bin_path) catch break :append_bin_dir;
+ bin_folders_lock.lock();
+ defer bin_folders_lock.unlock();
+
+ for (bin_folders.constSlice()) |existing_folder| {
+ if (strings.eql(existing_folder, bin_path)) {
+ break :append_bin_dir;
+ }
+ }
+
+ bin_folders.append(r.fs.dirname_store.append([]u8, bin_path) catch break :append_bin_dir) catch {};
+ }
+ }
+ }
+ }
+ }
// }
if (parent != null) {