/
config.ts
57 lines (47 loc) 路 1.62 KB
/
config.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import fs from 'node:fs'
import path from 'node:path'
import ini from 'ini'
import { findUp } from 'find-up'
import type { Agent } from './agents'
import { LOCKS } from './agents'
const customRcPath = process.env.NI_CONFIG_FILE
const home = process.platform === 'win32'
? process.env.USERPROFILE
: process.env.HOME
const defaultRcPath = path.join(home || '~/', '.nirc')
const rcPath = customRcPath || defaultRcPath
interface Config {
defaultAgent: Agent | 'prompt'
globalAgent: Agent
}
const defaultConfig: Config = {
defaultAgent: 'prompt',
globalAgent: 'npm',
}
let config: Config | undefined
export async function getConfig(): Promise<Config> {
if (!config) {
const result = await findUp('package.json') || ''
let packageManager = ''
if (result)
packageManager = JSON.parse(fs.readFileSync(result, 'utf8')).packageManager ?? ''
const [, agent, version] = packageManager.match(new RegExp(`^(${Object.values(LOCKS).join('|')})@(\d).*?$`)) || []
if (agent)
config = Object.assign({}, defaultConfig, { defaultAgent: (agent === 'yarn' && parseInt(version) > 1) ? 'yarn@berry' : agent })
else if (!fs.existsSync(rcPath))
config = defaultConfig
else
config = Object.assign({}, defaultConfig, ini.parse(fs.readFileSync(rcPath, 'utf-8')))
}
return config
}
export async function getDefaultAgent(programmatic?: boolean) {
const { defaultAgent } = await getConfig()
if (defaultAgent === 'prompt' && (programmatic || process.env.CI))
return 'npm'
return defaultAgent
}
export async function getGlobalAgent() {
const { globalAgent } = await getConfig()
return globalAgent
}