55 *
66 * Please refer to license text included with this package for license details.
77 */
8+ import path from 'path' ;
9+ import packageJson from 'package-json' ;
10+ import httpsProxyAgent from 'https-proxy-agent' ;
11+ import { getProxy } from '@cloudbase/toolbox' ;
12+ import getLogger from '../logger' ;
13+
814import { spawnPromise } from '../utils/spawn' ;
915
16+ export async function npmInstallWithCheck (
17+ packageInfo : Record < string , string > ,
18+ options ?: Record < string , any >
19+ ) {
20+ let needUpdatePackageInfo : Record < string , string > = { } ;
21+ const logger = getLogger ( ) ;
22+
23+ await Promise . all (
24+ Object . entries ( packageInfo ) . map ( async ( [ name , version ] ) => {
25+ const startTime = new Date ( ) ;
26+ const checkResult = await checkNeedUpdate (
27+ name ,
28+ version ,
29+ options ?. cwd || process . cwd ( )
30+ ) ;
31+
32+ if ( checkResult . isNeedUpdate ) {
33+ needUpdatePackageInfo [ name ] = checkResult . resolvedVersion ;
34+ }
35+ logger . debug (
36+ `resolve plugin ${ name } @${ version } : use ${ (
37+ ( new Date ( ) . valueOf ( ) - startTime . valueOf ( ) ) /
38+ 1000
39+ ) . toFixed ( 2 ) } s, mismatch:${
40+ checkResult . isNeedUpdate
41+ } , resolved version:${ checkResult . resolvedVersion } `
42+ ) ;
43+ } )
44+ ) ;
45+
46+ const args = [ 'install' ] ;
47+ const packageList = getPackageList ( needUpdatePackageInfo ) ;
48+
49+ if ( packageList . length === 0 ) {
50+ return ;
51+ }
52+
53+ const npmOptions = [ '--no-audit' , '--progress=false' ] ;
54+ // 支持node8
55+ return spawnPromise ( 'npm' , [ ...args , ...packageList , ...npmOptions ] , {
56+ cwd : options ?. cwd || process . cwd ( ) ,
57+ } ) ;
58+ }
59+
60+ async function checkNeedUpdate ( name : string , version : string , cwd : string ) {
61+ const isResolvedVersion = / ^ \d / . test ( version ) ;
62+ let resolvedVersion ;
63+
64+ if ( isResolvedVersion ) {
65+ resolvedVersion = version ;
66+ } else {
67+ const proxy = getProxy ( ) ;
68+ const meta = await packageJson ( name , {
69+ version,
70+ ...( proxy ? { agent : httpsProxyAgent ( proxy ) } : { } ) ,
71+ } ) ;
72+ resolvedVersion = meta . version as string ;
73+ }
74+ const localVersion = checkLocalVersion ( name , cwd ) ;
75+ return {
76+ isNeedUpdate : resolvedVersion !== localVersion ,
77+ resolvedVersion : resolvedVersion ,
78+ } ;
79+ }
80+
81+ function checkLocalVersion ( name : string , cwd : string ) {
82+ let version ;
83+ try {
84+ const localPackageJson = require ( path . join (
85+ cwd ,
86+ 'node_modules' ,
87+ name ,
88+ 'package.json'
89+ ) ) ;
90+ version = localPackageJson . version ;
91+ } catch ( e ) { }
92+
93+ return version ;
94+ }
95+
1096export function install (
1197 packageInfo : Record < string , string > ,
1298 options ?: Record < string , any >
@@ -15,7 +101,7 @@ export function install(
15101
16102 const args = [ 'install' ] ;
17103
18- const npmOptions = [ '--prefer-offline' , '--no-audit' , '--progress=false' ] ;
104+ const npmOptions = [ '--prefer-offline' , '--no-audit' , '--progress=false' ] ;
19105
20106 // 支持node8
21107 return spawnPromise ( 'npm' , [ ...args , ...packageList , ...npmOptions ] , {
0 commit comments