aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/resolver/dir_info.zig2
-rw-r--r--src/resolver/package_json.zig21
-rw-r--r--src/resolver/resolver.zig21
-rw-r--r--src/resolver/workspace.zig8
4 files changed, 44 insertions, 8 deletions
diff --git a/src/resolver/dir_info.zig b/src/resolver/dir_info.zig
index 396413327..f27baa922 100644
--- a/src/resolver/dir_info.zig
+++ b/src/resolver/dir_info.zig
@@ -5,6 +5,7 @@ const DirInfo = @This();
const Fs = @import("../fs.zig");
const TSConfigJSON = @import("./tsconfig_json.zig").TSConfigJSON;
const PackageJSON = @import("./package_json.zig").PackageJSON;
+const Workspace = @import("./workspace.zig").Workspace;
pub const Index = allocators.IndexType;
@@ -17,6 +18,7 @@ parent: Index = allocators.NotFound,
enclosing_browser_scope: Index = allocators.NotFound,
package_json_for_browser_field: ?*const PackageJSON = null,
enclosing_tsconfig_json: ?*const TSConfigJSON = null,
+enclosing_workspace: ?*const Workspace = null,
enclosing_package_json: ?*PackageJSON = null,
diff --git a/src/resolver/package_json.zig b/src/resolver/package_json.zig
index 9db39ff7a..f7c6294c1 100644
--- a/src/resolver/package_json.zig
+++ b/src/resolver/package_json.zig
@@ -19,6 +19,7 @@ pub const MacroImportReplacementMap = std.StringArrayHashMap(string);
pub const MacroMap = std.StringArrayHashMapUnmanaged(MacroImportReplacementMap);
const ScriptsMap = std.StringArrayHashMap(string);
+const Workspace = @import("./workspace.zig").Workspace;
pub const PackageJSON = struct {
pub const LoadFramework = enum {
@@ -64,6 +65,8 @@ pub const PackageJSON = struct {
always_bundle: []string = &.{},
macros: MacroMap = MacroMap{},
+ workspace_root: bool = false,
+
// Present if the "browser" field is present. This field is intended to be
// used by bundlers and lets you redirect the paths of certain 3rd-party
// modules that don't work in the browser to other modules that shim that
@@ -695,6 +698,9 @@ pub const PackageJSON = struct {
}
}
+ package_json.workspace_root = json.asProperty("workspaces") != null;
+
+ // used by `bun run`
if (include_scripts) {
read_scripts: {
if (json.asProperty("scripts")) |scripts_prop| {
@@ -730,7 +736,6 @@ pub const PackageJSON = struct {
}
// TODO: side effects
- // TODO: exports map
if (generate_hash) {
if (package_json.name.len > 0 and package_json.version.len > 0) {
@@ -1029,21 +1034,23 @@ pub const ESModule = struct {
name: string,
subpath: string,
- pub fn parse(specifier: string, subpath_buf: []u8) ?Package {
- if (specifier.len == 0) return null;
- var package = Package{ .name = "", .subpath = "" };
-
+ pub fn parseName(specifier: string) ?string {
var slash = strings.indexOfCharNeg(specifier, '/');
if (!strings.startsWithChar(specifier, '@')) {
slash = if (slash == -1) @intCast(i32, specifier.len) else slash;
- package.name = specifier[0..@intCast(usize, slash)];
+ return specifier[0..@intCast(usize, slash)];
} else {
if (slash == -1) return null;
const slash2 = strings.indexOfChar(specifier[@intCast(usize, slash) + 1 ..], '/') orelse
specifier[@intCast(u32, slash + 1)..].len;
- package.name = specifier[0 .. @intCast(usize, slash + 1) + slash2];
+ return specifier[0 .. @intCast(usize, slash + 1) + slash2];
}
+ }
+
+ pub fn parse(specifier: string, subpath_buf: []u8) ?Package {
+ if (specifier.len == 0) return null;
+ var package = Package{ .name = parseName(specifier) orelse return null, .subpath = "" };
if (strings.startsWith(package.name, ".") or strings.indexAnyComptime(package.name, "\\%") != null)
return null;
diff --git a/src/resolver/resolver.zig b/src/resolver/resolver.zig
index 7f95dffae..06b486bb0 100644
--- a/src/resolver/resolver.zig
+++ b/src/resolver/resolver.zig
@@ -18,7 +18,7 @@ const HTTPWatcher = if (isTest) void else @import("../http.zig").Watcher;
const Wyhash = std.hash.Wyhash;
const ResolvePath = @import("./resolve_path.zig");
const NodeFallbackModules = @import("../node_fallbacks.zig");
-
+const Workspace = @import("./workspace.zig").Workspace;
const Mutex = @import("../lock.zig").Lock;
const StringBoolMap = std.StringHashMap(bool);
@@ -2561,6 +2561,7 @@ pub const Resolver = struct {
info.package_json_for_browser_field = parent.?.package_json_for_browser_field;
info.enclosing_tsconfig_json = parent.?.enclosing_tsconfig_json;
info.enclosing_package_json = parent.?.package_json orelse parent.?.enclosing_package_json;
+ info.enclosing_workspace = parent.enclosing_workspace;
// Make sure "absRealPath" is the real path of the directory (resolving any symlinks)
if (!r.opts.preserve_symlinks) {
@@ -2604,6 +2605,24 @@ pub const Resolver = struct {
}
info.enclosing_package_json = pkg;
+ const is_root = pkg.workspace_root or entries.hasComptimeQuery(".pnpm-workspace.yaml");
+
+ pkg.workspace_root = is_root;
+
+ if (is_root) {
+ var workspace = r.allocator.create(Workspace) catch unreachable;
+ workspace.* = Workspace{
+ .import_base_path = info.abs_path,
+ .package_json = pkg,
+ };
+
+ if (info.abs_real_path.len > 0) {
+ workspace.import_base_path = info.abs_real_path;
+ }
+
+ info.enclosing_workspace = workspace;
+ }
+
if (r.debug_logs) |*logs| {
logs.addNoteFmt("Resolved package.json in \"{s}\"", .{
path,
diff --git a/src/resolver/workspace.zig b/src/resolver/workspace.zig
new file mode 100644
index 000000000..938a49016
--- /dev/null
+++ b/src/resolver/workspace.zig
@@ -0,0 +1,8 @@
+pub const Workspace = struct {
+ import_base_path: string,
+ package_json: *PackageJSON,
+
+ // package_path_matchers: []const string,
+ // package_prefixes: []const string,
+
+};