diff options
Diffstat (limited to 'src/install/dependency.zig')
-rw-r--r-- | src/install/dependency.zig | 62 |
1 files changed, 47 insertions, 15 deletions
diff --git a/src/install/dependency.zig b/src/install/dependency.zig index ca0d702aa..813ec9ac5 100644 --- a/src/install/dependency.zig +++ b/src/install/dependency.zig @@ -2,6 +2,7 @@ const bun = @import("root").bun; const logger = bun.logger; const Environment = @import("../env.zig"); const Install = @import("./install.zig"); +const PackageManager = Install.PackageManager; const ExternalStringList = Install.ExternalStringList; const Features = Install.Features; const PackageNameHash = Install.PackageNameHash; @@ -92,6 +93,7 @@ pub fn cloneWithDifferentBuffers(this: *const Dependency, name_buf: []const u8, .version = Dependency.parseWithTag( builder.lockfile.allocator, new_name, + String.Builder.stringHash(new_name.slice(out_slice)), new_literal.slice(out_slice), this.version.tag, &sliced, @@ -144,11 +146,12 @@ pub fn toDependency( const name = String{ .bytes = this[0..8].*, }; + const name_hash: u64 = @bitCast(this[8..16].*); return Dependency{ .name = name, - .name_hash = @as(u64, @bitCast(this[8..16].*)), + .name_hash = name_hash, .behavior = @bitCast(this[16]), - .version = Dependency.Version.toVersion(name, this[17..this.len].*, ctx), + .version = Dependency.Version.toVersion(name, name_hash, this[17..this.len].*, ctx), }; } @@ -297,6 +300,7 @@ pub const Version = struct { pub fn toVersion( alias: String, + alias_hash: PackageNameHash, bytes: Version.External, ctx: Dependency.Context, ) Dependency.Version { @@ -306,6 +310,7 @@ pub const Version = struct { return Dependency.parseWithTag( ctx.allocator, alias, + alias_hash, sliced.slice, tag, sliced, @@ -617,6 +622,7 @@ pub const Version = struct { pub const NpmInfo = struct { name: String, version: Semver.Query.Group, + is_alias: bool = false, fn eql(this: NpmInfo, that: NpmInfo, this_buf: []const u8, that_buf: []const u8) bool { return this.name.eql(that.name, this_buf, that_buf) and this.version.eql(that.version); @@ -670,17 +676,19 @@ pub fn eql( pub inline fn parse( allocator: std.mem.Allocator, alias: String, + alias_hash: ?PackageNameHash, dependency: string, sliced: *const SlicedString, log: ?*logger.Log, ) ?Version { const dep = std.mem.trimLeft(u8, dependency, " \t\n\r"); - return parseWithTag(allocator, alias, dep, Version.Tag.infer(dep), sliced, log); + return parseWithTag(allocator, alias, alias_hash, dep, Version.Tag.infer(dep), sliced, log); } pub fn parseWithOptionalTag( allocator: std.mem.Allocator, alias: String, + alias_hash: ?PackageNameHash, dependency: string, tag: ?Dependency.Version.Tag, sliced: *const SlicedString, @@ -690,6 +698,7 @@ pub fn parseWithOptionalTag( return parseWithTag( allocator, alias, + alias_hash, dep, tag orelse Version.Tag.infer(dep), sliced, @@ -700,6 +709,7 @@ pub fn parseWithOptionalTag( pub fn parseWithTag( allocator: std.mem.Allocator, alias: String, + alias_hash: ?PackageNameHash, dependency: string, tag: Dependency.Version.Tag, sliced: *const SlicedString, @@ -710,19 +720,30 @@ pub fn parseWithTag( switch (tag) { .npm => { var input = dependency; - const name = if (strings.hasPrefixComptime(input, "npm:")) sliced.sub(brk: { - var str = input["npm:".len..]; - var i: usize = @intFromBool(str.len > 0 and str[0] == '@'); - - while (i < str.len) : (i += 1) { - if (str[i] == '@') { - input = str[i + 1 ..]; - break :brk str[0..i]; + + var is_alias = false; + const name = brk: { + if (strings.hasPrefixComptime(input, "npm:")) { + is_alias = true; + var str = input["npm:".len..]; + var i: usize = @intFromBool(str.len > 0 and str[0] == '@'); + + while (i < str.len) : (i += 1) { + if (str[i] == '@') { + input = str[i + 1 ..]; + break :brk sliced.sub(str[0..i]).value(); + } } + + input = str[i..]; + + break :brk sliced.sub(str[0..i]).value(); } - input = str[i..]; - break :brk str[0..i]; - }).value() else alias; + + break :brk alias; + }; + + is_alias = is_alias and alias_hash != null; // Strip single leading v // v1.0.0 -> 1.0.0 @@ -740,16 +761,27 @@ pub fn parseWithTag( return null; }; - return .{ + const result = Version{ .literal = sliced.value(), .value = .{ .npm = .{ + .is_alias = is_alias, .name = name, .version = version, }, }, .tag = .npm, }; + + if (is_alias) { + PackageManager.instance.known_npm_aliases.put( + allocator, + alias_hash.?, + result, + ) catch unreachable; + } + + return result; }, .dist_tag => { var tag_to_use = sliced.value(); |