Skip to content

Commit

Permalink
fix: attach deps meta to pkg-lock resolved entries
Browse files Browse the repository at this point in the history
closes #55
  • Loading branch information
antongolub committed Sep 26, 2020
1 parent 68ae030 commit 51db17f
Show file tree
Hide file tree
Showing 8 changed files with 2,034 additions and 2,012 deletions.
108 changes: 67 additions & 41 deletions lib/lockfileV1/entry.js
Expand Up @@ -3,7 +3,6 @@
const url = require('url')
const { findPackageInYarnLock, findEntryInPackageLock } = require('../../util/traverse')
const { formatNpmIntegrity, formatYarnIntegrity, parseIntegrity, sha1ToHexChecksum, hexChecksumToSha1 } = require('./integrity')
const { npmRequires } = require('./dependencies')

const parse = (input) => url.parse ? url.parse(input) : new url.URL(input) // eslint-disable-line
const GITHUB_REGEX = /^\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/
Expand Down Expand Up @@ -65,46 +64,73 @@ function npmToYarnResolved (resolved, integrity) {
return result
}

module.exports = {
npmEntry (nodeModulesTree, yarnObject, mPath) {
const { name, version, dependencies } = nodeModulesTree[mPath]
const { request, entry: entryInYarnFile } = findPackageInYarnLock(name, version, yarnObject)
if (!entryInYarnFile) return null // likely a bundled dependency
const yarnResolved = entryInYarnFile.resolved
const entry = yarnToNpmResolved(version, yarnResolved, request, entryInYarnFile.integrity)
if (dependencies && Object.keys(dependencies).length > 0) {
entry.requires = npmRequires(dependencies, yarnObject)
const npmEntry = (nodeModulesTree, yarnObject, mPath) => {
const { name, version, dependencies } = nodeModulesTree[mPath]
const { request, entry: entryInYarnFile } = findPackageInYarnLock(name, version, yarnObject)
if (!entryInYarnFile) return null // likely a bundled dependency
const yarnResolved = entryInYarnFile.resolved
const entry = yarnToNpmResolved(version, yarnResolved, request, entryInYarnFile.integrity)

if (dependencies && Object.keys(dependencies).length > 0) {
const resolvedDeps = Object.keys(dependencies).reduce((m, name) => {
const childPath = `${mPath}/node_modules/${name}`

if (nodeModulesTree[childPath]) {
const childEntry = npmEntry(nodeModulesTree, yarnObject, childPath)

if (childEntry) {
m[name] = {
version: childEntry.version,
resolved: childEntry.resolved,
integrity: childEntry.integrity,
requires: childEntry.requires
}
}
}

return m
}, {})

entry.requires = dependencies

if (Object.keys(resolvedDeps).length) {
entry.dependencies = resolvedDeps
}

return entry
},
yarnEntry (entry, allDeps, flattenedPackageLock, tree) {
const { name, version } = entry
const entryInNpmFile = findEntryInPackageLock(entry, flattenedPackageLock)
if (!entryInNpmFile) return null // likely a bundled dependency
const {
resolved,
integrity
} = entryInNpmFile
const integrityChunks = parseIntegrity(integrity)
const yarnStyleResolved = npmToYarnResolved(resolved || version, integrityChunks.sha1)
const existingPackage = tree[name] || {}
const existingPackageVersion = tree[name] && tree[name][version]
? tree[name][version]
: {}
const { dependencies, optionalDependencies } = allDeps
const hasDeps = dependencies && Object.keys(dependencies).length > 0
const hasOptionalDeps = optionalDependencies &&
Object.keys(optionalDependencies).length > 0

return Object.assign({}, existingPackage, {
[version]: Object.assign({}, existingPackageVersion, {
resolved: yarnStyleResolved,
integrity: formatYarnIntegrity(integrityChunks.sha512 || integrityChunks.sha1)
},
hasDeps ? { dependencies } : {},
hasOptionalDeps ? { optionalDependencies } : {}
)
})
}

return entry
}
const yarnEntry = (entry, allDeps, flattenedPackageLock, tree) => {
const { name, version } = entry
const entryInNpmFile = findEntryInPackageLock(entry, flattenedPackageLock)
if (!entryInNpmFile) return null // likely a bundled dependency
const {
resolved,
integrity
} = entryInNpmFile
const integrityChunks = parseIntegrity(integrity)
const yarnStyleResolved = npmToYarnResolved(resolved || version, integrityChunks.sha1)
const existingPackage = tree[name] || {}
const existingPackageVersion = tree[name] && tree[name][version]
? tree[name][version]
: {}
const { dependencies, optionalDependencies } = allDeps
const hasDeps = dependencies && Object.keys(dependencies).length > 0
const hasOptionalDeps = optionalDependencies &&
Object.keys(optionalDependencies).length > 0

return Object.assign({}, existingPackage, {
[version]: Object.assign({}, existingPackageVersion, {
resolved: yarnStyleResolved,
integrity: formatYarnIntegrity(integrityChunks.sha512 || integrityChunks.sha1)
},
hasDeps ? { dependencies } : {},
hasOptionalDeps ? { optionalDependencies } : {}
)
})
}

module.exports = {
npmEntry,
yarnEntry
}
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -46,7 +46,7 @@
"@semantic-release/npm": "^7.0.6",
"coveralls": "^3.1.0",
"nyc": "15.1.0",
"semantic-release": "^17.1.1",
"semantic-release": "^17.1.2",
"sinon": "^9.0.3",
"standard": "^14.3.4",
"tape": "^5.0.1"
Expand Down

0 comments on commit 51db17f

Please sign in to comment.