diff options
-rw-r--r-- | src/resolver/resolver.zig | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/resolver/resolver.zig b/src/resolver/resolver.zig index db8ee6fd3..964864ba5 100644 --- a/src/resolver/resolver.zig +++ b/src/resolver/resolver.zig @@ -371,6 +371,7 @@ pub fn NewResolver(cache_files: bool) type { } var tracing_start: i128 = if (FeatureFlags.tracing) 0 else undefined; + pub const bunFrameworkPackagePrefix = "bun-framework-"; pub fn resolveFramework( r: *ThisResolver, package: string, @@ -379,6 +380,42 @@ pub fn NewResolver(cache_files: bool) type { comptime load_defines: bool, ) !void { + // We want to enable developers to integrate frameworks without waiting on official support. + // But, we still want the command to do the actual framework integration to be succint + // This lets users type "--use next" instead of "--use bun-framework-next" + // If they're using a local file path, we skip this. + if (isPackagePath(package)) { + var prefixed_package_buf: [512]u8 = undefined; + // Prevent the extra lookup if the package is already prefixed, i.e. avoid "bun-framework-next-bun-framework-next" + if (strings.startsWith(package, bunFrameworkPackagePrefix) or package.len + bunFrameworkPackagePrefix.len >= prefixed_package_buf.len) { + return try r._resolveFramework(package, pair, preference, load_defines); + } + + prefixed_package_buf[0..bunFrameworkPackagePrefix.len].* = bunFrameworkPackagePrefix.*; + std.mem.copy(u8, prefixed_package_buf[bunFrameworkPackagePrefix.len..], package); + return r._resolveFramework(prefixed_package_buf[0 .. bunFrameworkPackagePrefix.len + package.len], pair, preference, load_defines) catch |err| { + switch (err) { + error.ModuleNotFound => { + return try r._resolveFramework(package, pair, preference, load_defines); + }, + else => { + return err; + }, + } + }; + } + + return try r._resolveFramework(package, pair, preference, load_defines); + } + + fn _resolveFramework( + r: *ThisResolver, + package: string, + pair: *PackageJSON.FrameworkRouterPair, + comptime preference: PackageJSON.LoadFramework, + comptime load_defines: bool, + ) !void { + // TODO: make this only parse package.json once var result = try r.resolve(r.fs.top_level_dir, package, .internal); // support passing a package.json or path to a package |