synp
Version:
Convert yarn.lock to package-lock.json and vice versa
89 lines (75 loc) • 2.92 kB
JavaScript
const { sep, resolve } = require('path')
const { has } = require('lodash')
const sortObject = require('sort-object-keys')
const { dependenciesForYarn } = require('./dependencies')
const { yarnEntry, npmEntry } = require('./entry')
const { npmEntryFromWorkspace } = require('../lockfileV2/workspace')
const {
splitPathToModules,
parentPackagePath,
getParentPackageInYarnTree
} = require('../../util/traverse')
const {
flattenPackageLock,
mergeDepsToYarnTree,
formatYarnTree
} = require('../../util/format')
module.exports = {
buildYarnTree (nodeModulesTree, packageLock) {
const flattenedPackageLock = flattenPackageLock(packageLock.dependencies || packageLock.packages)
const tree = Object.keys(nodeModulesTree).reduce((tree, path) => {
const nmEntry = nodeModulesTree[path]
const { name } = nmEntry
const allDeps = dependenciesForYarn(nmEntry, packageLock)
if (name !== packageLock.name) {
const entry = yarnEntry(nmEntry, allDeps, flattenedPackageLock, tree)
if (entry) {
tree[name] = entry
}
}
const deps = Object.assign({},
allDeps.dependencies,
allDeps.optionalDependencies,
allDeps.devDependencies
)
const treeWithDeps = mergeDepsToYarnTree(deps, path, nodeModulesTree, tree)
return treeWithDeps
}, {})
const formattedTree = formatYarnTree(tree)
return formattedTree
},
buildNpmTree (nodeModulesTree, yarnObject, workspacesTree) {
const countDepth = (path) => path.split(`${sep}node_modules${sep}`).length - 1
const sortedNodeModules = Object.keys(nodeModulesTree).sort((a, b) => countDepth(a) < countDepth(b) ? -1 : 1)
const basePath = sortedNodeModules[0].split(sep)
return sortObject(sortedNodeModules.slice(1)
.reduce((tree, mPath) => {
const relativePath = mPath.split(sep).slice(basePath.length)
const modulesInPath = splitPathToModules(relativePath)
const { name, dependencies } = nodeModulesTree[mPath]
const entry = npmEntry(nodeModulesTree, yarnObject, mPath) || npmEntryFromWorkspace(workspacesTree, name, modulesInPath, resolve(basePath.join(sep)).split(sep))
if (!entry) {
return tree
}
if (!has(nodeModulesTree[parentPackagePath(mPath)], `dependencies.${name}`)) {
entry.dev = true
}
if (workspacesTree && dependencies) {
entry.requires = sortObject(dependencies)
}
if (modulesInPath.length > 1) {
const parentPackage = getParentPackageInYarnTree(modulesInPath, tree)
parentPackage.dependencies = sortObject(Object.assign({}, parentPackage.dependencies, {
[name]: entry
}))
if (parentPackage.dev) {
entry.dev = true
}
} else {
tree[name] = entry
}
return tree
}, {}))
}
}