Skip to content

Commit 25a89a7

Browse files
fix: Ignore missing optionalDependencies
1 parent 363e276 commit 25a89a7

File tree

1 file changed

+31
-10
lines changed

1 file changed

+31
-10
lines changed

src/packageUtils.ts

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ interface PackageJson {
1616
peerDependencies: {
1717
[key: string]: string;
1818
};
19+
optionalDependencies: {
20+
[key: string]: string;
21+
};
1922

2023
// What is a peerDevDependency? This is not a standard.
2124
// This is an array of package names found in `peerDependencies` which should be installed as devDependencies.
@@ -43,6 +46,7 @@ interface PackageDependencies {
4346
dependencies: Dependency[];
4447
devDependencies: Dependency[];
4548
peerDependencies: Dependency[];
49+
optionalDependencies: Dependency[];
4650
peerDevDependencies: string[];
4751
}
4852

@@ -90,15 +94,24 @@ export function walkPackageDependencyTree(packagePath: string, visitor: Dependen
9094
}
9195

9296
const dependencyPath = resolvePackageDir(packagePath, dependency.name);
93-
if (dependencyPath) {
94-
walkPackageDependencyTree(dependencyPath, visitor, visitedPaths, options);
95-
} else {
96-
console.log(`WARN: Unable to resolve package ${dependency.name} from ${packagePath}`)
97+
98+
if (!dependencyPath) {
99+
if (packageDependencies.optionalDependencies.some(x => x.name === dependency.name)) {
100+
// don't fail if the missing dependency is in optionalDependencies
101+
if (options.debug) {
102+
console.log(`Ignoring missing optional dependency ${dependency.name} from ${packagePath}`);
103+
}
104+
return;
105+
} else {
106+
throw new Error(`WARN: Unable to resolve package ${dependency.name} from ${packagePath}`)
107+
}
97108
}
109+
110+
walkPackageDependencyTree(dependencyPath, visitor, visitedPaths, options);
98111
}
99-
100-
if (isRootPackage) packageDependencies.devDependencies.forEach(walkDependency);
101-
if ((isRootPackage) || (!options.runOnlyOnRootDependencies)) packageDependencies.dependencies.forEach(walkDependency)
112+
113+
if (isRootPackage) packageDependencies.devDependencies.forEach(walkDependency);
114+
if (isRootPackage || !options.runOnlyOnRootDependencies) packageDependencies.dependencies.forEach(walkDependency)
102115
}
103116

104117
function buildDependencyArray(packagePath: string, packageJson: PackageJson, dependenciesObject: any): Dependency[] {
@@ -112,15 +125,23 @@ function buildDependencyArray(packagePath: string, packageJson: PackageJson, dep
112125
}
113126

114127
export function getPackageDependencies(packagePath: string, packageJson: PackageJson): PackageDependencies {
115-
const { name, dependencies = {}, devDependencies = {}, peerDependencies = {}, peerDevDependencies = [] } = packageJson;
116-
117-
const applyPeerDevDependencies= (dep: Dependency): Dependency =>
128+
const {
129+
name,
130+
dependencies = {},
131+
devDependencies = {},
132+
optionalDependencies = {},
133+
peerDependencies = {},
134+
peerDevDependencies = []
135+
} = packageJson;
136+
137+
const applyPeerDevDependencies = (dep: Dependency): Dependency =>
118138
({ ...dep, isPeerDevDependency: peerDevDependencies.includes && peerDevDependencies.includes(dep.name) });
119139

120140
return {
121141
packageName: name,
122142
dependencies: buildDependencyArray(packagePath, packageJson, dependencies),
123143
devDependencies: buildDependencyArray(packagePath, packageJson, devDependencies),
144+
optionalDependencies: buildDependencyArray(packagePath, packageJson, optionalDependencies),
124145
peerDependencies: buildDependencyArray(packagePath, packageJson, peerDependencies).map(applyPeerDevDependencies),
125146
peerDevDependencies,
126147
};

0 commit comments

Comments
 (0)