Skip to content

Commit

Permalink
Meta tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
sindresorhus committed Mar 28, 2019
1 parent 0b26655 commit f075bc5
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 89 deletions.
4 changes: 2 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ 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 configDirectory = 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};
Expand All @@ -19,7 +19,7 @@ class Configstore {
path.join(id, 'config.json') :
path.join('configstore', `${id}.json`);

this.path = options.configPath || path.join(configDir, pathPrefix);
this.path = options.configPath || path.join(configDirectory, pathPrefix);

if (defaults) {
this.all = Object.assign({}, defaults, this.all);
Expand Down
7 changes: 3 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
"config",
"store",
"storage",
"conf",
"configuration",
"settings",
"preferences",
Expand All @@ -35,13 +34,13 @@
"dependencies": {
"dot-prop": "^4.1.0",
"graceful-fs": "^4.1.2",
"make-dir": "^1.0.0",
"make-dir": "^2.1.0",
"unique-string": "^1.0.0",
"write-file-atomic": "^2.0.0",
"xdg-basedir": "^3.0.0"
},
"devDependencies": {
"ava": "*",
"xo": "*"
"ava": "^1.3.1",
"xo": "^0.24.0"
}
}
31 changes: 12 additions & 19 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> Easily load and persist config without having to think about where and how
Config is stored in a JSON file located in `$XDG_CONFIG_HOME` or `~/.config`.<br>
The config is stored in a JSON file located in `$XDG_CONFIG_HOME` or `~/.config`.<br>
Example: `~/.config/configstore/some-id.json`

*If you need this for Electron, check out [`electron-store`](https://github.com/sindresorhus/electron-store) instead.*<br>
Expand All @@ -20,26 +20,25 @@ $ npm install configstore

```js
const Configstore = require('configstore');
const pkg = require('./package.json');
const packageJson = require('./package.json');

// create a Configstore instance with an unique ID e.g.
// Package name and optionally some default values
const conf = new Configstore(pkg.name, {foo: 'bar'});
// Create a Configstore instance
const config = new Configstore(packageJson.name, {foo: 'bar'});

console.log(conf.get('foo'));
console.log(config.get('foo'));
//=> 'bar'

conf.set('awesome', true);
console.log(conf.get('awesome'));
config.set('awesome', true);
console.log(config.get('awesome'));
//=> true

// Use dot-notation to access nested properties
conf.set('bar.baz', true);
console.log(conf.get('bar'));
config.set('bar.baz', true);
console.log(config.get('bar'));
//=> {baz: true}

conf.delete('awesome');
console.log(conf.get('awesome'));
config.delete('awesome');
console.log(config.get('awesome'));
//=> undefined
```

Expand Down Expand Up @@ -135,7 +134,7 @@ Get the path to the config file. Can be used to show the user where the config f
Get all the config as an object or replace the current config with an object:

```js
conf.all = {
config.all = {
hello: 'world'
};
```
Expand All @@ -144,9 +143,3 @@ conf.all = {
## Security

To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.


## License

[BSD license](http://opensource.org/licenses/bsd-license.php)<br>
Copyright Google
132 changes: 68 additions & 64 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,20 @@ const cleanUpFile = () => {

test.beforeEach(t => {
cleanUpFile();
t.context.conf = new Configstore('configstore-test');
t.context.config = new Configstore('configstore-test');
});

test('.set() and .get()', t => {
const {conf} = t.context;
conf.set('foo', 'bar');
conf.set('baz.boo', true);
t.is(conf.get('foo'), 'bar');
t.is(conf.get('baz.boo'), true);
const {config} = t.context;
config.set('foo', 'bar');
config.set('baz.boo', true);
t.is(config.get('foo'), 'bar');
t.is(config.get('baz.boo'), true);
});

test('.set() with object and .get()', t => {
const {conf} = t.context;
conf.set({
const {config} = t.context;
config.set({
foo1: 'bar1',
foo2: 'bar2',
baz: {
Expand All @@ -37,101 +37,105 @@ test('.set() with object and .get()', t => {
}
}
});
t.is(conf.get('foo1'), 'bar1');
t.is(conf.get('foo2'), 'bar2');
t.deepEqual(conf.get('baz'), {
t.is(config.get('foo1'), 'bar1');
t.is(config.get('foo2'), 'bar2');
t.deepEqual(config.get('baz'), {
boo: 'foo',
foo: {
bar: 'baz'
}
});
t.is(conf.get('baz.boo'), 'foo');
t.deepEqual(conf.get('baz.foo'), {bar: 'baz'});
t.is(conf.get('baz.foo.bar'), 'baz');
t.is(config.get('baz.boo'), 'foo');
t.deepEqual(config.get('baz.foo'), {bar: 'baz'});
t.is(config.get('baz.foo.bar'), 'baz');
});

test('.has()', t => {
const {conf} = t.context;
conf.set('foo', '🦄');
conf.set('baz.boo', '🦄');
t.true(conf.has('foo'));
t.true(conf.has('baz.boo'));
t.false(conf.has('missing'));
const {config} = t.context;
config.set('foo', '🦄');
config.set('baz.boo', '🦄');
t.true(config.has('foo'));
t.true(config.has('baz.boo'));
t.false(config.has('missing'));
});

test('.delete()', t => {
const {conf} = t.context;
conf.set('foo', 'bar');
conf.set('baz.boo', true);
conf.set('baz.foo.bar', 'baz');
conf.delete('foo');
t.not(conf.get('foo'), 'bar');
conf.delete('baz.boo');
t.not(conf.get('baz.boo'), true);
conf.delete('baz.foo');
t.not(conf.get('baz.foo'), {bar: 'baz'});
conf.set('foo.bar.baz', {awesome: 'icecream'});
conf.set('foo.bar.zoo', {awesome: 'redpanda'});
conf.delete('foo.bar.baz');
t.is(conf.get('foo.bar.zoo.awesome'), 'redpanda');
const {config} = t.context;
config.set('foo', 'bar');
config.set('baz.boo', true);
config.set('baz.foo.bar', 'baz');
config.delete('foo');
t.not(config.get('foo'), 'bar');
config.delete('baz.boo');
t.not(config.get('baz.boo'), true);
config.delete('baz.foo');
t.not(config.get('baz.foo'), {bar: 'baz'});
config.set('foo.bar.baz', {awesome: 'icecream'});
config.set('foo.bar.zoo', {awesome: 'redpanda'});
config.delete('foo.bar.baz');
t.is(config.get('foo.bar.zoo.awesome'), 'redpanda');
});

test('.clear()', t => {
const {conf} = t.context;
conf.set('foo', 'bar');
conf.set('foo1', 'bar1');
conf.set('baz.boo', true);
conf.clear();
t.is(conf.size, 0);
const {config} = t.context;
config.set('foo', 'bar');
config.set('foo1', 'bar1');
config.set('baz.boo', true);
config.clear();
t.is(config.size, 0);
});

test('.all', t => {
const {conf} = t.context;
conf.set('foo', 'bar');
conf.set('baz.boo', true);
t.is(conf.all.foo, 'bar');
t.deepEqual(conf.all.baz, {boo: true});
const {config} = t.context;
config.set('foo', 'bar');
config.set('baz.boo', true);
t.is(config.all.foo, 'bar');
t.deepEqual(config.all.baz, {boo: true});
});

test('.size', t => {
const {conf} = t.context;
conf.set('foo', 'bar');
t.is(conf.size, 1);
const {config} = t.context;
config.set('foo', 'bar');
t.is(config.size, 1);
});

test('.path', t => {
const {conf} = t.context;
conf.set('foo', 'bar');
t.true(fs.existsSync(conf.path));
const {config} = t.context;
config.set('foo', 'bar');
t.true(fs.existsSync(config.path));
});

test('use default value', t => {
const conf = new Configstore('configstore-test', {foo: 'bar'});
t.is(conf.get('foo'), 'bar');
const config = new Configstore('configstore-test', {foo: 'bar'});
t.is(config.get('foo'), 'bar');
});

test('support `globalConfigPath` option', t => {
const conf = new Configstore('configstore-test', {}, {globalConfigPath: true});
const regex = /configstore-test(\/|\\)config.json$/;
t.true(regex.test(conf.path));
const config = new Configstore('configstore-test', {}, {globalConfigPath: true});
t.regex(config.path, /configstore-test(\/|\\)config.json$/);
});

test('support `configPath` option', t => {
const customPath = path.join(os.tmpdir(), 'configstore-custom-path', 'foo.json');
const conf = new Configstore('ignored-namespace', {}, {globalConfigPath: true, configPath: customPath});
const regex = /configstore-custom-path(\/|\\)foo.json$/;
t.true(regex.test(conf.path));
const config = new Configstore('ignored-namespace', {}, {
globalConfigPath: true,
configPath: customPath
});
t.regex(config.path, /configstore-custom-path(\/|\\)foo.json$/);
});

test('ensure `.all` is always an object', t => {
cleanUpFile();
t.notThrows(() => t.context.conf.get('foo'));

t.notThrows(() => {
t.context.config.get('foo');
});
});

test('the store is NOT created until write', t => {
cleanUpFile();
const conf = new Configstore('configstore-test');
t.false(fs.existsSync(conf.path));
conf.set('foo', 'bar');
t.true(fs.existsSync(conf.path));
const config = new Configstore('configstore-test');
t.false(fs.existsSync(config.path));
config.set('foo', 'bar');
t.true(fs.existsSync(config.path));
});

0 comments on commit f075bc5

Please sign in to comment.