Skip to content

Commit

Permalink
add improved XDG support (CONFIG_DIRS and DATA_DIRS)
Browse files Browse the repository at this point in the history
* includes testing
* includes test polish
  • Loading branch information
rivy committed Jun 29, 2019
1 parent 4d87f8d commit c6a250b
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 13 deletions.
67 changes: 56 additions & 11 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,39 +12,84 @@ const {env} = process;
const macos = name => {
const library = path.join(homedir, 'Library');

const _config = path.join(env.XDG_CONFIG_HOME ? env.XDG_CONFIG_HOME : path.join(library, 'Preferences'), name);
const _data = path.join(env.XDG_DATA_HOME ? env.XDG_DATA_HOME : path.join(library, 'Application Support'), name);

const _configDirs = [_config];
if (env.XDG_CONFIG_DIRS) {
_configDirs.push(...env.XDG_CONFIG_DIRS.split(path.delimiter).map(s => path.join(s, name)));
}

const _dataDirs = [_data];
if (env.XDG_DATA_DIRS) {
_dataDirs.push(...env.XDG_DATA_DIRS.split(path.delimiter).map(s => path.join(s, name)));
}

return {
cache: env.XDG_CACHE_HOME ? path.join(env.XDG_CACHE_HOME, name) : path.join(library, 'Caches', name),
config: env.XDG_CONFIG_HOME ? path.join(env.XDG_CONFIG_HOME, name) : path.join(library, 'Preferences', name),
data: env.XDG_DATA_HOME ? path.join(env.XDG_DATA_HOME, name) : path.join(library, 'Application Support', name),
config: _config,
data: _data,
log: env.XDG_STATE_HOME ? path.join(env.XDG_STATE_HOME, name) : path.join(library, 'Logs', name),
temp: path.join(tmpdir, name)
temp: path.join(tmpdir, name),
configDirs: _configDirs,
dataDirs: _dataDirs
};
};

const windows = name => {
// #ref: <https://www.thewindowsclub.com/local-localnow-roaming-folders-windows-10> @@ <http://archive.is/tDEPl>
const appData = env.APPDATA || path.join(homedir, 'AppData', 'Roaming'); // "AppData/Roaming" data *may* follow user between machines
const localAppData = env.LOCALAPPDATA || path.join(homedir, 'AppData', 'Local'); // "AppData/Local" is local-machine-only user data
const appData = env.APPDATA || path.join(homedir, 'AppData', 'Roaming'); // "AppData/Roaming" contains data which may follow user between machines
const localAppData = env.LOCALAPPDATA || path.join(homedir, 'AppData', 'Local'); // "AppData/Local" contains local-machine-only user data

const _config = env.XDG_CONFIG_HOME ? path.join(env.XDG_CONFIG_HOME, name) : path.join(appData, name, 'Config');
const _data = env.XDG_DATA_HOME ? path.join(env.XDG_DATA_HOME, name) : path.join(appData, name, 'Data');

const _configDirs = [_config];
if (env.XDG_CONFIG_DIRS) {
_configDirs.push(...env.XDG_CONFIG_DIRS.split(path.delimiter).map(s => path.join(s, name)));
}

const _dataDirs = [_data];
if (env.XDG_DATA_DIRS) {
_dataDirs.push(...env.XDG_DATA_DIRS.split(path.delimiter).map(s => path.join(s, name)));
}

return {
// Locations for data/config/cache/log are invented (Windows doesn't have a popular convention)
cache: env.XDG_CACHE_HOME ? path.join(env.XDG_CACHE_HOME, name) : path.join(localAppData, name, 'Cache'),
config: env.XDG_CONFIG_HOME ? path.join(env.XDG_CONFIG_HOME, name) : path.join(appData, name, 'Config'),
data: env.XDG_DATA_HOME ? path.join(env.XDG_DATA_HOME, name) : path.join(appData, name, 'Data'),
config: _config,
data: _data,
log: env.XDG_STATE_HOME ? path.join(env.XDG_STATE_HOME, name) : path.join(localAppData, name, 'Log'),
temp: path.join(tmpdir, name)
temp: path.join(tmpdir, name),
configDirs: _configDirs,
dataDirs: _dataDirs
};
};

const linux = name => {
const username = path.basename(homedir);

const _config = path.join(env.XDG_CONFIG_HOME ? env.XDG_CONFIG_HOME : path.join(homedir, '.config'), name);
const _data = path.join(env.XDG_DATA_HOME ? env.XDG_DATA_HOME : path.join(homedir, '.local', 'share'), name);

const _configDirs = [_config];
if (env.XDG_CONFIG_DIRS) {
_configDirs.push(...env.XDG_CONFIG_DIRS.split(path.delimiter).map(s => path.join(s, name)));
}

const _dataDirs = [_data];
if (env.XDG_DATA_DIRS) {
_dataDirs.push(...env.XDG_DATA_DIRS.split(path.delimiter).map(s => path.join(s, name)));
}

return {
cache: path.join(env.XDG_CACHE_HOME || path.join(homedir, '.cache'), name),
config: path.join(env.XDG_CONFIG_HOME || path.join(homedir, '.config'), name),
data: path.join(env.XDG_DATA_HOME || path.join(homedir, '.local', 'share'), name),
config: _config,
data: _data,
log: path.join(env.XDG_STATE_HOME || path.join(homedir, '.local', 'state'), name),
temp: path.join(tmpdir, username, name)
temp: path.join(tmpdir, username, name),
configDirs: _configDirs,
dataDirs: _dataDirs
};
};

Expand Down
5 changes: 3 additions & 2 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ test('default', t => {
const paths = osPaths(name);

for (const [key, value] of Object.entries(paths)) {
console.log(` ${key}: ${value}`);
t.true(value.endsWith(`${name}-nodejs`));
const vals = [].concat(value); // Convert value (single value or array) to a flat array
t.log(key, ':', value);
t.true(vals.reduce((a, v) => a && v.endsWith(`${name}-nodejs`), true));
}
});

Expand Down

0 comments on commit c6a250b

Please sign in to comment.