lib/licensed/sources/npm.rb in licensed-3.3.0 vs lib/licensed/sources/npm.rb in licensed-3.3.1

- old
+ new

@@ -64,19 +64,21 @@ end end # Recursively parse dependency JSON data. Returns a hash mapping the # package name to it's metadata - def recursive_dependencies(dependencies, result = {}) + def recursive_dependencies(dependencies, result = {}, parent = nil) dependencies.each do |name, dependency| - next if dependency["peerMissing"] + next if missing_peer?(parent, dependency, name) next if yarn_lock_present && dependency["missing"] next if dependency["extraneous"] && dependency["missing"] dependency["name"] = name + dependency["version"] ||= extract_version(parent, name) if dependency["missing"] + (result[name] ||= []) << dependency - recursive_dependencies(dependency["dependencies"] || {}, result) + recursive_dependencies(dependency["dependencies"] || {}, result, dependency) end result end # Returns parsed package metadata returned from `npm list` @@ -132,9 +134,21 @@ end # Returns whether to include non production dependencies based on the licensed configuration settings def include_non_production? config.dig("npm", "production_only") == false + end + + def missing_peer?(parent, dependency, name) + dependency["peerMissing"] || (dependency["missing"] && peer_dependency(parent, name)) + end + + def peer_dependency(parent, name) + parent&.dig("peerDependencies", name) + end + + def extract_version(parent, name) + parent&.dig("_dependencies", name) || peer_dependency(parent, name) end end end end