eae5d8c807
These conflicts will be resolved in the following commits. We do it this way so that PR review is possible.
61 lines
2.5 KiB
JavaScript
61 lines
2.5 KiB
JavaScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
'use strict';
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.getProductionDependencies = void 0;
|
|
const path = require("path");
|
|
const cp = require("child_process");
|
|
const _ = require("underscore");
|
|
const parseSemver = require('parse-semver');
|
|
function asYarnDependency(prefix, tree) {
|
|
let parseResult;
|
|
try {
|
|
parseResult = parseSemver(tree.name);
|
|
}
|
|
catch (err) {
|
|
err.message += `: ${tree.name}`;
|
|
console.warn(`Could not parse semver: ${tree.name}`);
|
|
return null;
|
|
}
|
|
// not an actual dependency in disk
|
|
if (parseResult.version !== parseResult.range) {
|
|
return null;
|
|
}
|
|
const name = parseResult.name;
|
|
const version = parseResult.version;
|
|
const dependencyPath = path.join(prefix, name);
|
|
const children = [];
|
|
for (const child of (tree.children || [])) {
|
|
const dep = asYarnDependency(path.join(prefix, name, 'node_modules'), child);
|
|
if (dep) {
|
|
children.push(dep);
|
|
}
|
|
}
|
|
return { name, version, path: dependencyPath, children };
|
|
}
|
|
function getYarnProductionDependencies(cwd) {
|
|
const raw = cp.execSync('yarn list --json', { cwd, encoding: 'utf8', env: Object.assign(Object.assign({}, process.env), { NODE_ENV: 'production' }), stdio: [null, null, 'inherit'] });
|
|
const match = /^{"type":"tree".*$/m.exec(raw);
|
|
if (!match || match.length !== 1) {
|
|
throw new Error('Could not parse result of `yarn list --json`');
|
|
}
|
|
const trees = JSON.parse(match[0]).data.trees;
|
|
return trees
|
|
.map(tree => asYarnDependency(path.join(cwd, 'node_modules'), tree))
|
|
.filter((dep) => !!dep);
|
|
}
|
|
function getProductionDependencies(cwd) {
|
|
const result = [];
|
|
const deps = getYarnProductionDependencies(cwd);
|
|
const flatten = (dep) => { result.push({ name: dep.name, version: dep.version, path: dep.path }); dep.children.forEach(flatten); };
|
|
deps.forEach(flatten);
|
|
return _.uniq(result);
|
|
}
|
|
exports.getProductionDependencies = getProductionDependencies;
|
|
if (require.main === module) {
|
|
const root = path.dirname(path.dirname(__dirname));
|
|
console.log(JSON.stringify(getProductionDependencies(root), null, ' '));
|
|
}
|