diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/install/npm.zig | 238 |
1 files changed, 120 insertions, 118 deletions
diff --git a/src/install/npm.zig b/src/install/npm.zig index 796a88c7b..8ea89b20a 100644 --- a/src/install/npm.zig +++ b/src/install/npm.zig @@ -1191,142 +1191,158 @@ pub const PackageManifest = struct { inline for (dependency_groups) |pair| { if (prop.value.?.asProperty(comptime pair.prop)) |versioned_deps| { - const items = versioned_deps.expr.data.e_object.properties.slice(); - var count = items.len; - - var this_names = dependency_names[0..count]; - var this_versions = dependency_values[0..count]; + if (versioned_deps.expr.data == .e_object) { + const items = versioned_deps.expr.data.e_object.properties.slice(); + var count = items.len; - var name_hasher = std.hash.Wyhash.init(0); - var version_hasher = std.hash.Wyhash.init(0); + var this_names = dependency_names[0..count]; + var this_versions = dependency_values[0..count]; - const is_peer = comptime strings.eqlComptime(pair.prop, "peerDependencies"); + var name_hasher = std.hash.Wyhash.init(0); + var version_hasher = std.hash.Wyhash.init(0); - if (comptime is_peer) { - optional_peer_dep_names.clearRetainingCapacity(); + const is_peer = comptime strings.eqlComptime(pair.prop, "peerDependencies"); - if (prop.value.?.asProperty("peerDependenciesMeta")) |meta| { - if (meta.expr.data == .e_object) { - const meta_props = meta.expr.data.e_object.properties.slice(); - try optional_peer_dep_names.ensureUnusedCapacity(meta_props.len); - for (meta_props) |meta_prop| { - if (meta_prop.value.?.asProperty("optional")) |optional| { - if (optional.expr.data != .e_boolean or !optional.expr.data.e_boolean.value) { - continue; + if (comptime is_peer) { + optional_peer_dep_names.clearRetainingCapacity(); + + if (prop.value.?.asProperty("peerDependenciesMeta")) |meta| { + if (meta.expr.data == .e_object) { + const meta_props = meta.expr.data.e_object.properties.slice(); + try optional_peer_dep_names.ensureUnusedCapacity(meta_props.len); + for (meta_props) |meta_prop| { + if (meta_prop.value.?.asProperty("optional")) |optional| { + if (optional.expr.data != .e_boolean or !optional.expr.data.e_boolean.value) { + continue; + } + + optional_peer_dep_names.appendAssumeCapacity(String.Builder.stringHash(meta_prop.key.?.asString(allocator) orelse unreachable)); } - - optional_peer_dep_names.appendAssumeCapacity(String.Builder.stringHash(meta_prop.key.?.asString(allocator) orelse unreachable)); } } } } - } - var i: usize = 0; + var i: usize = 0; - for (items) |item| { - const name_str = item.key.?.asString(allocator) orelse if (comptime Environment.allow_assert) unreachable else continue; - const version_str = item.value.?.asString(allocator) orelse if (comptime Environment.allow_assert) unreachable else continue; + for (items) |item| { + const name_str = item.key.?.asString(allocator) orelse if (comptime Environment.allow_assert) unreachable else continue; + const version_str = item.value.?.asString(allocator) orelse if (comptime Environment.allow_assert) unreachable else continue; - this_names[i] = string_builder.append(ExternalString, name_str); - this_versions[i] = string_builder.append(ExternalString, version_str); + this_names[i] = string_builder.append(ExternalString, name_str); + this_versions[i] = string_builder.append(ExternalString, version_str); - if (comptime is_peer) { - if (std.mem.indexOfScalar(u64, optional_peer_dep_names.items, this_names[i].hash) != null) { - // For optional peer dependencies, we store a length instead of a whole separate array - // To make that work, we have to move optional peer dependencies to the front of the array - // - if (peer_dependency_len != i) { - const current_name = this_names[i]; - this_names[i] = this_names[peer_dependency_len]; - this_names[peer_dependency_len] = current_name; - - const current_version = this_versions[i]; - this_versions[i] = this_versions[peer_dependency_len]; - this_versions[peer_dependency_len] = current_version; - - peer_dependency_len += 1; + if (comptime is_peer) { + if (std.mem.indexOfScalar(u64, optional_peer_dep_names.items, this_names[i].hash) != null) { + // For optional peer dependencies, we store a length instead of a whole separate array + // To make that work, we have to move optional peer dependencies to the front of the array + // + if (peer_dependency_len != i) { + const current_name = this_names[i]; + this_names[i] = this_names[peer_dependency_len]; + this_names[peer_dependency_len] = current_name; + + const current_version = this_versions[i]; + this_versions[i] = this_versions[peer_dependency_len]; + this_versions[peer_dependency_len] = current_version; + + peer_dependency_len += 1; + } } - } - if (optional_peer_dep_names.items.len == 0) { + if (optional_peer_dep_names.items.len == 0) { + const names_hash_bytes = @bitCast([8]u8, this_names[i].hash); + name_hasher.update(&names_hash_bytes); + const versions_hash_bytes = @bitCast([8]u8, this_versions[i].hash); + version_hasher.update(&versions_hash_bytes); + } + } else { const names_hash_bytes = @bitCast([8]u8, this_names[i].hash); name_hasher.update(&names_hash_bytes); const versions_hash_bytes = @bitCast([8]u8, this_versions[i].hash); version_hasher.update(&versions_hash_bytes); } - } else { - const names_hash_bytes = @bitCast([8]u8, this_names[i].hash); - name_hasher.update(&names_hash_bytes); - const versions_hash_bytes = @bitCast([8]u8, this_versions[i].hash); - version_hasher.update(&versions_hash_bytes); - } - - i += 1; - } - count = i; + i += 1; + } - var name_list = ExternalStringList.init(all_extern_strings, this_names); - var version_list = ExternalStringList.init(version_extern_strings, this_versions); + count = i; - if (comptime is_peer) { - package_version.optional_peer_dependencies_len = @truncate(u32, peer_dependency_len); - } + var name_list = ExternalStringList.init(all_extern_strings, this_names); + var version_list = ExternalStringList.init(version_extern_strings, this_versions); - if (count > 0 and - ((comptime !is_peer) or - optional_peer_dep_names.items.len == 0)) - { - const name_map_hash = name_hasher.final(); - const version_map_hash = version_hasher.final(); - - var name_entry = try external_string_maps.getOrPut(name_map_hash); - if (name_entry.found_existing) { - name_list = name_entry.value_ptr.*; - this_names = name_list.mut(all_extern_strings); - } else { - name_entry.value_ptr.* = name_list; - dependency_names = dependency_names[count..]; + if (comptime is_peer) { + package_version.optional_peer_dependencies_len = @truncate(u32, peer_dependency_len); } - var version_entry = try external_string_maps.getOrPut(version_map_hash); - if (version_entry.found_existing) { - version_list = version_entry.value_ptr.*; - this_versions = version_list.mut(version_extern_strings); - } else { - version_entry.value_ptr.* = version_list; - dependency_values = dependency_values[count..]; - } - } + if (count > 0 and + ((comptime !is_peer) or + optional_peer_dep_names.items.len == 0)) + { + const name_map_hash = name_hasher.final(); + const version_map_hash = version_hasher.final(); + + var name_entry = try external_string_maps.getOrPut(name_map_hash); + if (name_entry.found_existing) { + name_list = name_entry.value_ptr.*; + this_names = name_list.mut(all_extern_strings); + } else { + name_entry.value_ptr.* = name_list; + dependency_names = dependency_names[count..]; + } - if (comptime is_peer) { - if (optional_peer_dep_names.items.len > 0) { - dependency_names = dependency_names[count..]; - dependency_values = dependency_values[count..]; + var version_entry = try external_string_maps.getOrPut(version_map_hash); + if (version_entry.found_existing) { + version_list = version_entry.value_ptr.*; + this_versions = version_list.mut(version_extern_strings); + } else { + version_entry.value_ptr.* = version_list; + dependency_values = dependency_values[count..]; + } } - } - @field(package_version, pair.field) = ExternalStringMap{ - .name = name_list, - .value = version_list, - }; - - if (comptime Environment.allow_assert) { - const dependencies_list = @field(package_version, pair.field); + if (comptime is_peer) { + if (optional_peer_dep_names.items.len > 0) { + dependency_names = dependency_names[count..]; + dependency_values = dependency_values[count..]; + } + } - std.debug.assert(dependencies_list.name.off < all_extern_strings.len); - std.debug.assert(dependencies_list.value.off < all_extern_strings.len); - std.debug.assert(dependencies_list.name.off + dependencies_list.name.len < all_extern_strings.len); - std.debug.assert(dependencies_list.value.off + dependencies_list.value.len < all_extern_strings.len); + @field(package_version, pair.field) = ExternalStringMap{ + .name = name_list, + .value = version_list, + }; + + if (comptime Environment.allow_assert) { + const dependencies_list = @field(package_version, pair.field); + + std.debug.assert(dependencies_list.name.off < all_extern_strings.len); + std.debug.assert(dependencies_list.value.off < all_extern_strings.len); + std.debug.assert(dependencies_list.name.off + dependencies_list.name.len < all_extern_strings.len); + std.debug.assert(dependencies_list.value.off + dependencies_list.value.len < all_extern_strings.len); + + std.debug.assert(std.meta.eql(dependencies_list.name.get(all_extern_strings), this_names)); + std.debug.assert(std.meta.eql(dependencies_list.value.get(version_extern_strings), this_versions)); + var j: usize = 0; + const name_dependencies = dependencies_list.name.get(all_extern_strings); + + if (comptime is_peer) { + if (optional_peer_dep_names.items.len == 0) { + while (j < name_dependencies.len) : (j += 1) { + const dep_name = name_dependencies[j]; + std.debug.assert(std.mem.eql(u8, dep_name.slice(string_buf), this_names[j].slice(string_buf))); + std.debug.assert(std.mem.eql(u8, dep_name.slice(string_buf), items[j].key.?.asString(allocator).?)); + } - std.debug.assert(std.meta.eql(dependencies_list.name.get(all_extern_strings), this_names)); - std.debug.assert(std.meta.eql(dependencies_list.value.get(version_extern_strings), this_versions)); - var j: usize = 0; - const name_dependencies = dependencies_list.name.get(all_extern_strings); + j = 0; + while (j < dependencies_list.value.len) : (j += 1) { + const dep_name = dependencies_list.value.get(version_extern_strings)[j]; - if (comptime is_peer) { - if (optional_peer_dep_names.items.len == 0) { + std.debug.assert(std.mem.eql(u8, dep_name.slice(string_buf), this_versions[j].slice(string_buf))); + std.debug.assert(std.mem.eql(u8, dep_name.slice(string_buf), items[j].value.?.asString(allocator).?)); + } + } + } else { while (j < name_dependencies.len) : (j += 1) { const dep_name = name_dependencies[j]; std.debug.assert(std.mem.eql(u8, dep_name.slice(string_buf), this_names[j].slice(string_buf))); @@ -1341,20 +1357,6 @@ pub const PackageManifest = struct { std.debug.assert(std.mem.eql(u8, dep_name.slice(string_buf), items[j].value.?.asString(allocator).?)); } } - } else { - while (j < name_dependencies.len) : (j += 1) { - const dep_name = name_dependencies[j]; - std.debug.assert(std.mem.eql(u8, dep_name.slice(string_buf), this_names[j].slice(string_buf))); - std.debug.assert(std.mem.eql(u8, dep_name.slice(string_buf), items[j].key.?.asString(allocator).?)); - } - - j = 0; - while (j < dependencies_list.value.len) : (j += 1) { - const dep_name = dependencies_list.value.get(version_extern_strings)[j]; - - std.debug.assert(std.mem.eql(u8, dep_name.slice(string_buf), this_versions[j].slice(string_buf))); - std.debug.assert(std.mem.eql(u8, dep_name.slice(string_buf), items[j].value.?.asString(allocator).?)); - } } } } |