File size: 2,278 Bytes
bc20498
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"use strict";
/**
 * refer: https://github.com/mysticatea/eslint-plugin-node/blob/f45c6149be7235c0f7422d1179c25726afeecd83/lib/util/get-package-json.js
 */
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPackageJson = getPackageJson;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const cache_1 = require("./cache");
const isRunOnBrowser = !fs_1.default.readFileSync;
const cache = (0, cache_1.createCache)();
/**
 * 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) {
    if (isRunOnBrowser)
        return null;
    const filePath = path_1.default.join(dir, 'package.json');
    try {
        const text = fs_1.default.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`.
 */
function getPackageJson(startPath = 'a.js') {
    if (isRunOnBrowser)
        return null;
    const startDir = path_1.default.dirname(path_1.default.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_1.default.resolve(dir, '..');
    } while (dir !== prevDir);
    cache.set(startDir, null);
    return null;
}