@@ -14,19 +14,20 @@ export async function detect(options: DetectOptions = {}): Promise<DetectResult
14
14
const { cwd, onUnknown } = options
15
15
16
16
for ( const directory of lookup ( cwd ) ) {
17
- // Look up for lock files
17
+ const pkg = await parsePackageJson ( path . join ( directory , 'package.json' ) )
18
+ // Look for lock files
18
19
for ( const lock of Object . keys ( LOCKS ) ) {
19
20
if ( await fileExists ( path . join ( directory , lock ) ) ) {
20
21
const name = LOCKS [ lock ]
21
- const result = await parsePackageJson ( path . join ( directory , 'package.json' ) , onUnknown )
22
+ const result = getFromPackageManagerField ( pkg , onUnknown )
22
23
if ( result )
23
24
return result
24
25
else
25
26
return { name, agent : name }
26
27
}
27
28
}
28
- // Look up for package.json
29
- const result = await parsePackageJson ( path . join ( directory , 'package.json' ) , onUnknown )
29
+ // Look in package.json
30
+ const result = getFromPackageManagerField ( pkg , onUnknown )
30
31
if ( result )
31
32
return result
32
33
}
@@ -43,19 +44,20 @@ export function detectSync(options: DetectOptions = {}): DetectResult | null {
43
44
const { cwd, onUnknown } = options
44
45
45
46
for ( const directory of lookup ( cwd ) ) {
46
- // Look up for lock files
47
+ const pkg = parsePackageJsonSync ( path . join ( directory , 'package.json' ) )
48
+ // Look for lock files
47
49
for ( const lock of Object . keys ( LOCKS ) ) {
48
50
if ( fileExistsSync ( path . join ( directory , lock ) ) ) {
49
51
const name = LOCKS [ lock ]
50
- const result = parsePackageJsonSync ( path . join ( directory , 'package.json' ) , onUnknown )
52
+ const result = getFromPackageManagerField ( pkg , onUnknown )
51
53
if ( result )
52
54
return result
53
55
else
54
56
return { name, agent : name }
55
57
}
56
58
}
57
- // Look up for package.json
58
- const result = parsePackageJsonSync ( path . join ( directory , 'package.json' ) , onUnknown )
59
+ // Look in package.json
60
+ const result = getFromPackageManagerField ( pkg , onUnknown )
59
61
if ( result )
60
62
return result
61
63
}
@@ -89,27 +91,26 @@ function * lookup(cwd: string = process.cwd()): Generator<string> {
89
91
}
90
92
}
91
93
92
- async function parsePackageJson (
93
- filepath : string ,
94
- onUnknown : DetectOptions [ 'onUnknown' ] ,
95
- ) : Promise < DetectResult | null > {
96
- return ! filepath || ! await fileExists ( filepath ) ? null : handlePackageManager ( filepath , onUnknown )
94
+ async function parsePackageJson ( filepath : string ) : Promise < any > {
95
+ if ( ! filepath || ! await fileExists ( filepath ) ) {
96
+ return null
97
+ }
98
+ return JSON . parse ( await fsPromises . readFile ( filepath , 'utf8' ) )
97
99
}
98
100
99
- function parsePackageJsonSync (
100
- filepath : string ,
101
- onUnknown : DetectOptions [ 'onUnknown' ] ,
102
- ) : DetectResult | null {
103
- return ! filepath || ! fileExistsSync ( filepath ) ? null : handlePackageManager ( filepath , onUnknown )
101
+ function parsePackageJsonSync ( filepath : string ) : any | null {
102
+ if ( ! filepath || ! fileExists ( filepath ) ) {
103
+ return null
104
+ }
105
+ return JSON . parse ( fs . readFileSync ( filepath , 'utf8' ) )
104
106
}
105
107
106
- function handlePackageManager (
107
- filepath : string ,
108
+ function getFromPackageManagerField (
109
+ pkg : any ,
108
110
onUnknown : DetectOptions [ 'onUnknown' ] ,
109
111
) {
110
112
// read `packageManager` field in package.json
111
113
try {
112
- const pkg = JSON . parse ( fs . readFileSync ( filepath , 'utf8' ) )
113
114
let agent : Agent | undefined
114
115
if ( typeof pkg . packageManager === 'string' ) {
115
116
const [ name , ver ] = pkg . packageManager . replace ( / ^ \^ / , '' ) . split ( '@' )
0 commit comments