Skip to content

Commit ca98dd0

Browse files
committed
fix: reinstall missing and linked deps
1 parent c885278 commit ca98dd0

4 files changed

Lines changed: 129 additions & 126 deletions

File tree

lib/commands/package/update-dependencies.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export default class extends Command {
7171
},
7272
"reinstall-linked": {
7373
"short": "r",
74-
"description": "reinstall linked packages",
74+
"description": "reinstall linked or missing dependencies",
7575
"default": false,
7676
"schema": {
7777
"type": "boolean",

lib/commands/workspace/update-dependencies.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export default class extends Command {
7474
},
7575
"reinstall-linked": {
7676
"short": "r",
77-
"description": "reinstall linked packages",
77+
"description": "reinstall linked or missing dependencies",
7878
"default": false,
7979
"schema": {
8080
"type": "boolean",

lib/package.js

Lines changed: 61 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export default class Package {
4646
#localization;
4747
#rootSlug;
4848
#parentSlug;
49+
#dependencies;
4950

5051
constructor ( root, { rootPackage, parentPackage } = {} ) {
5152
this.#root = root;
@@ -318,8 +319,21 @@ export default class Package {
318319
return fs.existsSync( this.root + "/npm-shrinkwrap.json" );
319320
}
320321

322+
get dependencies () {
323+
if ( !this.#dependencies ) {
324+
this.#dependencies = new Map( Object.entries( {
325+
...this.config.dependencies,
326+
...this.config.devDependencies,
327+
...this.config.peerDependencies,
328+
...this.config.optionalDependencies,
329+
} ) );
330+
}
331+
332+
return this.#dependencies;
333+
}
334+
321335
get hasDependencies () {
322-
return Object.keys( this.config.dependencies || {} ).length || Object.keys( this.config.devDependencies || {} ).length || Object.keys( this.config.peerDependencies || {} ).length || Object.keys( this.config.optionalDependencies || {} ).length;
336+
return Boolean( this.dependencies.size );
323337
}
324338

325339
// public
@@ -425,45 +439,38 @@ export default class Package {
425439
}
426440

427441
hasPreReleaseDependencies () {
428-
const config = this.config;
429-
430-
for ( const name of [ "dependencies", "devDependencies", "peerDependencies", "optionalDependencies" ] ) {
431-
if ( !config[ name ] ) continue;
442+
for ( const [ name, version ] of this.dependencies.entries() ) {
432443

433-
for ( const dependencyName in config[ name ] ) {
434-
const version = config[ name ][ dependencyName ];
435-
436-
// process known tags
437-
if ( version === "latest" ) {
438-
continue;
439-
}
440-
else if ( version === "next" ) {
441-
return result( [ 500, `Package "${ this.name }" has pre-release dependency "${ dependencyName }@${ version }"` ] );
442-
}
444+
// process known tags
445+
if ( version === "latest" ) {
446+
continue;
447+
}
448+
else if ( version === "next" ) {
449+
return result( [ 500, `Package "${ this.name }" has pre-release dependency "${ name }@${ version }"` ] );
450+
}
443451

444-
let dependencyRange;
452+
let dependencyRange;
445453

446-
// detect git url
447-
const match = version.match( /#semver:(.+)$/ );
454+
// detect git url
455+
const match = version.match( /#semver:(.+)$/ );
448456

449-
if ( match ) {
450-
dependencyRange = match[ 1 ];
451-
}
452-
else {
453-
dependencyRange = version;
454-
}
457+
if ( match ) {
458+
dependencyRange = match[ 1 ];
459+
}
460+
else {
461+
dependencyRange = version;
462+
}
455463

456-
dependencyRange = new SemanticVersionRange( dependencyRange );
464+
dependencyRange = new SemanticVersionRange( dependencyRange );
457465

458-
try {
459-
if ( dependencyRange.isPreRelease ) {
460-
return result( [ 500, `Package "${ this.name }" has pre-release dependency "${ dependencyName }@${ version }"` ] );
461-
}
462-
}
463-
catch {
464-
return result( [ 500, `Unable to parse dependency version "${ dependencyName }@ ${ version }"` ] );
466+
try {
467+
if ( dependencyRange.isPreRelease ) {
468+
return result( [ 500, `Package "${ this.name }" has pre-release dependency "${ name }@${ version }"` ] );
465469
}
466470
}
471+
catch {
472+
return result( [ 500, `Unable to parse dependency version "${ name }@ ${ version }"` ] );
473+
}
467474
}
468475

469476
return result( 200 );
@@ -694,7 +701,9 @@ export default class Package {
694701
var res;
695702

696703
if ( install && reinstallLinked && !reinstall ) {
697-
reinstall = await this.#hasLinkedPackages();
704+
const missedDependencies = await this.#getMissedDependencies();
705+
706+
reinstall = Boolean( missedDependencies.size );
698707
}
699708

700709
// get outdated dependencies
@@ -1195,6 +1204,7 @@ export default class Package {
11951204
this.#version = undefined;
11961205
this.#workspaces = undefined;
11971206
this.#subPackages = undefined;
1207+
this.#dependencies = undefined;
11981208
}
11991209

12001210
async #updateMetadata ( { dependabot, commit } = {} ) {
@@ -1467,33 +1477,26 @@ export default class Package {
14671477
);
14681478
}
14691479

1470-
async #hasLinkedPackages () {
1471-
const dirs = await glob(
1472-
[
1473-
1474-
//
1475-
"*",
1476-
"@*/*",
1477-
],
1478-
{
1479-
"cwd": this.root + "/node_modules",
1480-
"absolute": true,
1481-
"files": false,
1482-
"directories": true,
1483-
}
1484-
);
1480+
async #getMissedDependencies () {
1481+
const dependencies = new Map();
14851482

1486-
var hasLinkedPackages = false;
1483+
await Promise.all( [ ...this.dependencies.keys() ].map( name =>
1484+
fs.promises
1485+
.readlink( `${ this.root }/node_modules/${ name }` )
1486+
.then( link => dependencies.set( name, link ) )
1487+
.catch( e => {
14871488

1488-
await Promise.all( dirs.map( dir => {
1489-
return fs.promises
1490-
.readlink( dir )
1491-
.then( link => {
1492-
hasLinkedPackages = true;
1493-
} )
1494-
.catch( e => {} );
1495-
} ) );
1489+
// not exists
1490+
if ( e.code === "ENOENT" ) {
1491+
dependencies.set( name, null );
1492+
}
1493+
1494+
// other error
1495+
else if ( e.code !== "EINVAL" ) {
1496+
console.log( e );
1497+
}
1498+
} ) ) );
14961499

1497-
return hasLinkedPackages;
1500+
return dependencies;
14981501
}
14991502
}

0 commit comments

Comments
 (0)