Created
May 31, 2018 00:46
-
-
Save sebinsua/ec481497a388568edb9ae72cba9c934e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
const path = require("path"); | |
const findUp = require("find-up"); | |
const globby = require("globby"); | |
const getLernaRoot = () => findUp.sync("lerna.json"); | |
const getPackageJsonRoot = () => findUp.sync("package.json"); | |
const toPackageJsonPath = originalPath => | |
path.relative(path.dirname(originalPath), "package.json"); | |
const DEFAULT_WORKSPACES = ["packages/*"]; | |
const getPackages = ({ resolvePackageJsons = true } = {}) => { | |
const lernaRoot = getLernaRoot(); | |
if (!lernaRoot) { | |
const packageJsonRoot = getPackageJsonRoot(); | |
if (packageJsonRoot) { | |
return resolvePackageJsons ? require(packageJsonRoot) : packageJsonRoot; | |
} else { | |
throw new Error("getPackages() could not find any packages at all..."); | |
} | |
} | |
const lernaJson = require(lernaRoot); | |
let workspaces = DEFAULT_WORKSPACES; | |
if (lernaJson.useWorkspaces) { | |
const npmClient = lernaJson.npmClient || "npm"; | |
switch (npmClient) { | |
case "yarn": { | |
const rootPackageJson = require(toPackageJsonPath(lernaRoot)); | |
workspaces = | |
(Array.isArray(rootPackageJson.workspaces) | |
? rootPackageJson.workspaces | |
: rootPackageJson.packages) || DEFAULT_WORKSPACES; | |
break; | |
} | |
default: | |
case "npm": { | |
workspaces = lernaJson.workspaces || DEFAULT_WORKSPACES; | |
break; | |
} | |
} | |
} | |
const packageJsonPaths = globby | |
.sync(workspaces) | |
.map(pkgDir => toPackageJsonPath(pkgDir)); | |
return resolvePackageJsons | |
? packageJsonPaths.map(pkgJsonPath => require(pkgJsonPath) || {}) | |
: packageJsonPaths; | |
}; | |
const toDependencyList = (packageJsons = []) => { | |
const dependencyList = Object.values( | |
packageJsons.reduce((totalDependencies, pkgJson) => { | |
const { dependencies = {}, devDependencies = {} } = pkgJson; | |
for (let [name, version] of Object.entries(dependencies)) { | |
const tag = `${name}@${version}`; | |
if (!totalDependencies[tag]) { | |
totalDependencies[tag] = { | |
type: ["dependencies"], | |
name, | |
version | |
}; | |
} else if ( | |
totalDependencies[tag].type.includes("dependencies") === false | |
) { | |
totalDependencies[tag].type.push("dependencies"); | |
} | |
} | |
for (let [name, version] of Object.entries(devDependencies)) { | |
const tag = `${name}@${version}`; | |
if (!totalDependencies[tag]) { | |
totalDependencies[tag] = { | |
type: ["devDependencies"], | |
name, | |
version | |
}; | |
} else if ( | |
totalDependencies[tag].type.includes("devDependencies") === false | |
) { | |
totalDependencies[tag].type.push("devDependencies"); | |
} | |
} | |
return totalDependencies; | |
}, {}) | |
); | |
return dependencyList; | |
}; | |
const packages = getPackages(); | |
const dependencyList = toDependencyList(packages); | |
console.log("dependency list:"); | |
console.log(dependencyList); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment