@@ -2,7 +2,8 @@ import process from 'node:process';
22import chalk from 'chalk' ;
33import { mainActor } from '../api/actors.js' ;
44import { Config } from '../types.js' ;
5- import { getDepName } from '../helpers/get-dep-name.js' ;
5+ import { getDepName , getDepPinnedVersion } from '../helpers/get-dep-name.js' ;
6+ import { SemverPart } from '../declarations/main/main.did.js' ;
67
78// [pkg, oldVersion, newVersion]
89export async function getAvailableUpdates ( config : Config , pkg ?: string ) : Promise < Array < [ string , string , string ] > > {
@@ -11,25 +12,37 @@ export async function getAvailableUpdates(config : Config, pkg ?: string) : Prom
1112 let allDeps = [ ...deps , ...devDeps ] . filter ( ( dep ) => dep . version ) ;
1213 let depsToUpdate = pkg ? allDeps . filter ( ( dep ) => dep . name === pkg ) : allDeps ;
1314
14- // skip pinned dependencies
15- depsToUpdate = depsToUpdate . filter ( ( dep ) => getDepName ( dep . name ) === dep . name ) ;
15+ // skip hard pinned dependencies (e.g. "base@X.Y.Z")
16+ depsToUpdate = depsToUpdate . filter ( ( dep ) => getDepName ( dep . name ) === dep . name || getDepPinnedVersion ( dep . name ) . split ( '.' ) . length !== 3 ) ;
1617
17- let getCurrentVersion = ( pkg : string ) => {
18+ let getCurrentVersion = ( pkg : string , updateVersion : string ) => {
1819 for ( let dep of allDeps ) {
19- if ( dep . name === pkg && dep . version ) {
20+ if ( getDepName ( dep . name ) === pkg && dep . version ) {
21+ let pinnedVersion = getDepPinnedVersion ( dep . name ) ;
22+ if ( pinnedVersion && ! updateVersion . startsWith ( pinnedVersion ) ) {
23+ continue ;
24+ }
2025 return dep . version ;
2126 }
2227 }
2328 return '' ;
2429 } ;
2530
2631 let actor = await mainActor ( ) ;
27- let res = await actor . getHighestSemverBatch ( depsToUpdate . map ( ( dep ) => [ dep . name , dep . version || '' , { major : null } ] ) ) ;
32+ let res = await actor . getHighestSemverBatch ( depsToUpdate . map ( ( dep ) => {
33+ let semverPart : SemverPart = { major : null } ;
34+ let name = getDepName ( dep . name ) ;
35+ let pinnedVersion = getDepPinnedVersion ( dep . name ) ;
36+ if ( pinnedVersion ) {
37+ semverPart = pinnedVersion . split ( '.' ) . length === 1 ? { minor : null } : { patch : null } ;
38+ }
39+ return [ name , dep . version || '' , semverPart ] ;
40+ } ) ) ;
2841
2942 if ( 'err' in res ) {
3043 console . log ( chalk . red ( 'Error:' ) , res . err ) ;
3144 process . exit ( 1 ) ;
3245 }
3346
34- return res . ok . filter ( ( dep ) => dep [ 1 ] !== getCurrentVersion ( dep [ 0 ] ) ) . map ( ( dep ) => [ dep [ 0 ] , getCurrentVersion ( dep [ 0 ] ) , dep [ 1 ] ] ) ;
47+ return res . ok . filter ( ( dep ) => dep [ 1 ] !== getCurrentVersion ( dep [ 0 ] , dep [ 1 ] ) ) . map ( ( dep ) => [ dep [ 0 ] , getCurrentVersion ( dep [ 0 ] , dep [ 1 ] ) , dep [ 1 ] ] ) ;
3548}
0 commit comments