UNPKG

2.94 kBJavaScriptView Raw
1/**
2 * SPDX-FileCopyrightText: © 2017 Liferay, Inc. <https://liferay.com>
3 * SPDX-License-Identifier: LGPL-3.0-or-later
4 */
5
6import PkgDesc from 'liferay-npm-build-tools-common/lib/pkg-desc';
7import project from 'liferay-npm-build-tools-common/lib/project';
8import path from 'path';
9import readJsonSync from 'read-json-sync';
10import resolveModule from 'resolve';
11
12import report from './report';
13
14const pkgJson = project.pkgJson;
15const rootPkg = new PkgDesc(pkgJson.name, pkgJson.version);
16
17/**
18 * Get root package descriptor
19 * @return {PkgDesc} the root package descriptor
20 */
21export function getRootPkg() {
22 return rootPkg;
23}
24
25/**
26 * Recursively find the dependencies of a package and return them as PkgDesc
27 * objects.
28 * @param {object} collectedDependencies a hash of objects where key is the
29 * package id and values are PkgDesc objects
30 * @param {string} basedirPath directory where package lives in
31 * @param {Array} extraDependencies an array of package names to add to
32 * dependencies collected from package.json
33 * @return {{[pkgId:string]: PkgDesc}} the given collectedDependencies object
34 */
35export function addPackageDependencies(
36 collectedDependencies,
37 basedirPath,
38 extraDependencies = []
39) {
40 const packageJson = readJsonSync(path.join(basedirPath, '/package.json'));
41 const pkg = new PkgDesc(
42 packageJson.name,
43 packageJson.version,
44 path.resolve(basedirPath) == path.resolve(project.dir.asNative)
45 ? null
46 : basedirPath
47 );
48
49 if (collectedDependencies[pkg.id]) {
50 return;
51 }
52
53 collectedDependencies[pkg.id] = pkg;
54
55 let dependencies = packageJson.dependencies || {};
56 dependencies = Object.keys(dependencies);
57 dependencies = dependencies.concat(extraDependencies);
58
59 const dependencyDirs = dependencies
60 .map(dependency => {
61 return resolveDependencyDir(basedirPath, packageJson, dependency);
62 })
63 .filter(dependencyDir => {
64 return dependencyDir != null;
65 });
66
67 dependencyDirs.forEach(dependencyDir => {
68 addPackageDependencies(collectedDependencies, dependencyDir);
69 });
70
71 return collectedDependencies;
72}
73
74/**
75 * Resolves a dependency package and returns its directory.
76 * @param {String} packageDir the base directory used for resolution
77 * @param {Object} packageJson the package.json object
78 * @param {String} dependency a package name
79 * @return {String} the path of the directory containing the dependency package
80 */
81function resolveDependencyDir(packageDir, packageJson, dependency) {
82 try {
83 const pkgJsonFile = resolveModule.sync(dependency + '/package.json', {
84 basedir: packageDir,
85 });
86
87 return path.dirname(pkgJsonFile);
88 } catch (err) {
89 if (
90 packageJson.optionalDependencies &&
91 packageJson.optionalDependencies[dependency]
92 ) {
93 report.warn(
94 `Optional dependency '${dependency}' of ` +
95 `'${packageJson.name}' could not be found in ` +
96 `node_modules: it will be missing in the output bundle.`
97 );
98
99 return null;
100 } else {
101 throw err;
102 }
103 }
104}