Skip to content

Commit d4cdf35

Browse files
committed
perf: read pkg only once. do async read in async methods
1 parent d865517 commit d4cdf35

File tree

1 file changed

+22
-21
lines changed

1 file changed

+22
-21
lines changed

src/detect.ts

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,20 @@ export async function detect(options: DetectOptions = {}): Promise<DetectResult
1414
const { cwd, onUnknown } = options
1515

1616
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
1819
for (const lock of Object.keys(LOCKS)) {
1920
if (await fileExists(path.join(directory, lock))) {
2021
const name = LOCKS[lock]
21-
const result = await parsePackageJson(path.join(directory, 'package.json'), onUnknown)
22+
const result = getFromPackageManagerField(pkg, onUnknown)
2223
if (result)
2324
return result
2425
else
2526
return { name, agent: name }
2627
}
2728
}
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)
3031
if (result)
3132
return result
3233
}
@@ -43,19 +44,20 @@ export function detectSync(options: DetectOptions = {}): DetectResult | null {
4344
const { cwd, onUnknown } = options
4445

4546
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
4749
for (const lock of Object.keys(LOCKS)) {
4850
if (fileExistsSync(path.join(directory, lock))) {
4951
const name = LOCKS[lock]
50-
const result = parsePackageJsonSync(path.join(directory, 'package.json'), onUnknown)
52+
const result = getFromPackageManagerField(pkg, onUnknown)
5153
if (result)
5254
return result
5355
else
5456
return { name, agent: name }
5557
}
5658
}
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)
5961
if (result)
6062
return result
6163
}
@@ -89,27 +91,26 @@ function * lookup(cwd: string = process.cwd()): Generator<string> {
8991
}
9092
}
9193

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'))
9799
}
98100

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'))
104106
}
105107

106-
function handlePackageManager(
107-
filepath: string,
108+
function getFromPackageManagerField(
109+
pkg: any,
108110
onUnknown: DetectOptions['onUnknown'],
109111
) {
110112
// read `packageManager` field in package.json
111113
try {
112-
const pkg = JSON.parse(fs.readFileSync(filepath, 'utf8'))
113114
let agent: Agent | undefined
114115
if (typeof pkg.packageManager === 'string') {
115116
const [name, ver] = pkg.packageManager.replace(/^\^/, '').split('@')

0 commit comments

Comments
 (0)