forked from sveltejs/eslint-plugin-svelte
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathget-package-json.ts
77 lines (66 loc) · 1.82 KB
/
get-package-json.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/**
* refer: https://github.com/mysticatea/eslint-plugin-node/blob/f45c6149be7235c0f7422d1179c25726afeecd83/lib/util/get-package-json.js
*/
import fs from "fs"
import path from "path"
import { createCache } from "./cache"
type PackageJson = Record<string, any> & { filePath: string }
const isRunOnBrowser = !fs.readFileSync
const cache = createCache<PackageJson | null>()
/**
* Reads the `package.json` data in a given path.
*
* Don't cache the data.
*
* @param dir The path to a directory to read.
* @returns The read `package.json` data, or null.
*/
function readPackageJson(dir: string): PackageJson | null {
if (isRunOnBrowser) return null
const filePath = path.join(dir, "package.json")
try {
const text = fs.readFileSync(filePath, "utf8")
const data = JSON.parse(text)
if (typeof data === "object" && data !== null) {
data.filePath = filePath
return data
}
} catch (_err) {
// do nothing.
}
return null
}
/**
* Gets a `package.json` data.
* The data is cached if found, then it's used after.
* @param startPath A file path to lookup.
* @returns A found `package.json` data or `null`.
* This object have additional property `filePath`.
*/
export function getPackageJson(startPath = "a.js"): PackageJson | null {
if (isRunOnBrowser) return null
const startDir = path.dirname(path.resolve(startPath))
let dir = startDir
let prevDir = ""
let data = null
do {
data = cache.get(dir)
if (data) {
if (dir !== startDir) {
cache.set(startDir, data)
}
return data
}
data = readPackageJson(dir)
if (data) {
cache.set(dir, data)
cache.set(startDir, data)
return data
}
// Go to next.
prevDir = dir
dir = path.resolve(dir, "..")
} while (dir !== prevDir)
cache.set(startDir, null)
return null
}