马宇豪
2024-07-16 f591c27b57e2418c9495bc02ae8cfff84d35bc18
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
'use strict';
const path = require('path');
const os = require('os');
 
const homedir = os.homedir();
const tmpdir = os.tmpdir();
const {env} = process;
 
const macos = name => {
    const library = path.join(homedir, 'Library');
 
    return {
        data: path.join(library, 'Application Support', name),
        config: path.join(library, 'Preferences', name),
        cache: path.join(library, 'Caches', name),
        log: path.join(library, 'Logs', name),
        temp: path.join(tmpdir, name)
    };
};
 
const windows = name => {
    const appData = env.APPDATA || path.join(homedir, 'AppData', 'Roaming');
    const localAppData = env.LOCALAPPDATA || path.join(homedir, 'AppData', 'Local');
 
    return {
        // Data/config/cache/log are invented by me as Windows isn't opinionated about this
        data: path.join(localAppData, name, 'Data'),
        config: path.join(appData, name, 'Config'),
        cache: path.join(localAppData, name, 'Cache'),
        log: path.join(localAppData, name, 'Log'),
        temp: path.join(tmpdir, name)
    };
};
 
// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
const linux = name => {
    const username = path.basename(homedir);
 
    return {
        data: path.join(env.XDG_DATA_HOME || path.join(homedir, '.local', 'share'), name),
        config: path.join(env.XDG_CONFIG_HOME || path.join(homedir, '.config'), name),
        cache: path.join(env.XDG_CACHE_HOME || path.join(homedir, '.cache'), name),
        // https://wiki.debian.org/XDGBaseDirectorySpecification#state
        log: path.join(env.XDG_STATE_HOME || path.join(homedir, '.local', 'state'), name),
        temp: path.join(tmpdir, username, name)
    };
};
 
const envPaths = (name, options) => {
    if (typeof name !== 'string') {
        throw new TypeError(`Expected string, got ${typeof name}`);
    }
 
    options = Object.assign({suffix: 'nodejs'}, options);
 
    if (options.suffix) {
        // Add suffix to prevent possible conflict with native apps
        name += `-${options.suffix}`;
    }
 
    if (process.platform === 'darwin') {
        return macos(name);
    }
 
    if (process.platform === 'win32') {
        return windows(name);
    }
 
    return linux(name);
};
 
module.exports = envPaths;
// TODO: Remove this for the next major release
module.exports.default = envPaths;