2026-01-09 04:46:45 +08:00
import assert from "node:assert/strict" ;
import getDependencies from "package-dependencies-tree" ;
2025-12-31 02:17:06 +08:00
/**
2026-01-09 04:46:45 +08:00
@import {PackageJson} from "package-dependencies-tree"
2025-12-31 02:17:06 +08:00
*/
2026-01-09 04:46:45 +08:00
/**
@param {PackageJson} packageJson
@param {{
overrideDependencies: Map<string, string[]>
ignoreDependencies = (name) => boolean,
seen: Set<PackageJson>
}} seen
@returns {Generator<PackageJson>}
*/
function * collectDependencies ( packageJson , options ) {
if ( ! options . seen ) {
options = { ... options , seen : new Set () };
}
const { seen , overrideDependencies , ignoreDependencies } = options ;
if ( overrideDependencies . has ( packageJson . name )) {
yield * overrideDependencies . get ( packageJson . name );
return ;
}
for ( const { type , optional } of [
{ type : "dependencies" , optional : false },
{ type : "peerDependencies" , optional : true },
]) {
for ( const dependency of packageJson [ type ]. values ()) {
if ( ignoreDependencies ( dependency . name )) {
continue ;
}
const { resolved } = dependency ;
if ( ! optional ) {
assert . ok (
resolved ,
`Unable to resolve ${ dependency . type } ' ${ dependency . name } @ ${ dependency . version } ' from ' ${ dependency . base } '.` ,
);
}
if ( resolved && ! seen . has ( resolved )) {
seen . add ( resolved );
yield resolved ;
yield * collectDependencies ( resolved , options );
}
}
}
}
function assertDependenciesUnique ( packageJson , dependencies ) {
const versions = new Map ();
for ( const dependency of dependencies ) {
assert . ok (
! versions . has ( dependency . name ),
`Multiple version of ' ${ dependency . name } ' in dependency tree of ' ${ packageJson . name } ', ' ${ versions . get ( dependency . name ) ? . version } ' and ' ${ dependency . version } '.` ,
);
versions . set ( dependency . name , dependency );
}
}
function getPackageDependencies ({
file ,
exclude ,
2025-12-31 02:17:06 +08:00
overrideDependencies = new Map (),
ignoreDependencies = () => false ,
}) {
2026-01-09 04:46:45 +08:00
return Array . from (
getDependencies ( file ). dependencies . entries (),
([ name , dependency ]) => {
if ( exclude . has ( name )) {
return ;
}
2025-12-31 02:17:06 +08:00
2026-01-09 04:46:45 +08:00
const packageJson = dependency . resolved ;
2025-12-31 02:17:06 +08:00
2026-01-09 04:46:45 +08:00
const dependencies = [
... collectDependencies ( packageJson , {
overrideDependencies ,
ignoreDependencies ,
}),
]. toSorted (({ name : nameA }, { name : nameB }) =>
nameA . localeCompare ( nameB ),
);
2025-12-31 02:17:06 +08:00
2026-01-09 04:46:45 +08:00
assertDependenciesUnique ( packageJson , dependencies );
2025-12-31 02:17:06 +08:00
2026-01-09 04:46:45 +08:00
return {
name ,
packageJson ,
dependencies ,
};
},
). filter ( Boolean );
2025-12-31 02:17:06 +08:00
}
export { getPackageDependencies };