@@ -42,11 +42,12 @@ function* lookup(cwd: string = process.cwd()): Generator<string> {
4242
4343async function parsePackageJson (
4444 filepath : string ,
45- onUnknown : DetectOptions [ 'onUnknown' ] ,
45+ options : DetectOptions ,
4646) : Promise < DetectResult | null > {
47- return ( ! filepath || ! pathExists ( filepath , 'file' ) )
48- ? null
49- : await handlePackageManager ( filepath , onUnknown )
47+ if ( ! filepath || ! ( await pathExists ( filepath , 'file' ) ) )
48+ return null
49+
50+ return await handlePackageManager ( filepath , options )
5051}
5152
5253/**
@@ -58,7 +59,6 @@ export async function detect(options: DetectOptions = {}): Promise<DetectResult
5859 const {
5960 cwd,
6061 strategies = [ 'lockfile' , 'packageManager-field' , 'devEngines-field' ] ,
61- onUnknown,
6262 } = options
6363
6464 let stopDir : ( ( dir : string ) => boolean ) | undefined
@@ -78,7 +78,7 @@ export async function detect(options: DetectOptions = {}): Promise<DetectResult
7878 for ( const lock of Object . keys ( LOCKS ) ) {
7979 if ( await pathExists ( path . join ( directory , lock ) , 'file' ) ) {
8080 const name = LOCKS [ lock ]
81- const result = await parsePackageJson ( path . join ( directory , 'package.json' ) , onUnknown )
81+ const result = await parsePackageJson ( path . join ( directory , 'package.json' ) , options )
8282 if ( result )
8383 return result
8484 else
@@ -90,7 +90,7 @@ export async function detect(options: DetectOptions = {}): Promise<DetectResult
9090 case 'packageManager-field' :
9191 case 'devEngines-field' : {
9292 // Look up for package.json
93- const result = await parsePackageJson ( path . join ( directory , 'package.json' ) , onUnknown )
93+ const result = await parsePackageJson ( path . join ( directory , 'package.json' ) , options )
9494 if ( result )
9595 return result
9696 break
@@ -137,11 +137,15 @@ function getNameAndVer(pkg: { packageManager?: string, devEngines?: { packageMan
137137
138138async function handlePackageManager (
139139 filepath : string ,
140- onUnknown : DetectOptions [ 'onUnknown' ] ,
140+ options : DetectOptions ,
141141) {
142- // read `packageManager` field in package.json
142+ // read `packageManager` field in package.json using an optional custom parser
143143 try {
144- const pkg = JSON . parse ( await fs . readFile ( filepath , 'utf8' ) )
144+ const content = await fs . readFile ( filepath , 'utf8' )
145+ const pkg = options . packageJsonParser
146+ ? await options . packageJsonParser ( content , filepath )
147+ : JSON . parse ( content )
148+
145149 let agent : Agent | undefined
146150 const nameAndVer = getNameAndVer ( pkg )
147151 if ( nameAndVer ) {
@@ -163,7 +167,7 @@ async function handlePackageManager(
163167 return { name, agent, version }
164168 }
165169 else {
166- return onUnknown ?.( pkg . packageManager ) ?? null
170+ return options . onUnknown ?.( pkg . packageManager ) ?? null
167171 }
168172 }
169173 }
0 commit comments