diff options
author | Minteck <contact@minteck.org> | 2022-04-09 16:39:03 +0200 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2022-04-09 16:40:02 +0200 |
commit | 0f8967b9113d698cdeb2d05ca85d2d9a80461c24 (patch) | |
tree | 00664ddd9c55a2c33631fd1bd33e556cea9c67e5 /node_modules/configstore/index.js | |
parent | dac03ac82bc0f8044a4b339c27b5390e4dcecf2f (diff) | |
download | voicer-trunk.tar.gz voicer-trunk.tar.bz2 voicer-trunk.zip |
Diffstat (limited to 'node_modules/configstore/index.js')
-rw-r--r-- | node_modules/configstore/index.js | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/node_modules/configstore/index.js b/node_modules/configstore/index.js new file mode 100644 index 0000000..cd8f19f --- /dev/null +++ b/node_modules/configstore/index.js @@ -0,0 +1,106 @@ +'use strict'; +const path = require('path'); +const os = require('os'); +const fs = require('graceful-fs'); +const makeDir = require('make-dir'); +const xdgBasedir = require('xdg-basedir'); +const writeFileAtomic = require('write-file-atomic'); +const dotProp = require('dot-prop'); +const uniqueString = require('unique-string'); + +const configDir = xdgBasedir.config || path.join(os.tmpdir(), uniqueString()); +const permissionError = 'You don\'t have access to this file.'; +const makeDirOptions = {mode: 0o0700}; +const writeFileOptions = {mode: 0o0600}; + +class Configstore { + constructor(id, defaults, options = {}) { + const pathPrefix = options.globalConfigPath ? + path.join(id, 'config.json') : + path.join('configstore', `${id}.json`); + + this.path = options.configPath || path.join(configDir, pathPrefix); + + if (defaults) { + this.all = Object.assign({}, defaults, this.all); + } + } + + get all() { + try { + return JSON.parse(fs.readFileSync(this.path, 'utf8')); + } catch (error) { + // Create directory if it doesn't exist + if (error.code === 'ENOENT') { + return {}; + } + + // Improve the message of permission errors + if (error.code === 'EACCES') { + error.message = `${error.message}\n${permissionError}\n`; + } + + // Empty the file if it encounters invalid JSON + if (error.name === 'SyntaxError') { + writeFileAtomic.sync(this.path, '', writeFileOptions); + return {}; + } + + throw error; + } + } + + set all(value) { + try { + // Make sure the folder exists as it could have been deleted in the meantime + makeDir.sync(path.dirname(this.path), makeDirOptions); + + writeFileAtomic.sync(this.path, JSON.stringify(value, null, '\t'), writeFileOptions); + } catch (error) { + // Improve the message of permission errors + if (error.code === 'EACCES') { + error.message = `${error.message}\n${permissionError}\n`; + } + + throw error; + } + } + + get size() { + return Object.keys(this.all || {}).length; + } + + get(key) { + return dotProp.get(this.all, key); + } + + set(key, value) { + const config = this.all; + + if (arguments.length === 1) { + for (const k of Object.keys(key)) { + dotProp.set(config, k, key[k]); + } + } else { + dotProp.set(config, key, value); + } + + this.all = config; + } + + has(key) { + return dotProp.has(this.all, key); + } + + delete(key) { + const config = this.all; + dotProp.delete(config, key); + this.all = config; + } + + clear() { + this.all = {}; + } +} + +module.exports = Configstore; |