diff --git a/.travis.yml b/.travis.yml index f28113a..dedfdd4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,5 @@ os: language: node_js node_js: - node - - '6' - - '5' - - '0.12' - - '0.10' + - '9' + - '8' diff --git a/.verb.md b/.verb.md index 9b25dd1..9088a2a 100644 --- a/.verb.md +++ b/.verb.md @@ -1,10 +1,10 @@ ## Usage ```js -var parse = require('{%= name %}'); +const parse = require('{%= name %}'); // sync -var config = parse.sync(); +const config = parse.sync(); // or async parse(function (err, config) { @@ -51,8 +51,8 @@ Converts ini-style keys into objects: **Example 1** ```js -var parse = require('parse-git-config'); -var config = { +const parse = require('parse-git-config'); +const config = { 'foo "bar"': { doStuff: true }, 'foo "baz"': { doStuff: true } }; @@ -74,8 +74,8 @@ Results in: **Example 2** ```js -var parse = require('parse-git-config'); -var config = { +const parse = require('parse-git-config'); +const config = { 'remote "origin"': { url: 'https://github.com/jonschlinkert/normalize-pkg.git', fetch: '+refs/heads/*:refs/remotes/origin/*' diff --git a/README.md b/README.md index 2244ccc..48c7ffc 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ -# parse-git-config [![NPM version](https://img.shields.io/npm/v/parse-git-config.svg?style=flat)](https://www.npmjs.com/package/parse-git-config) [![NPM monthly downloads](https://img.shields.io/npm/dm/parse-git-config.svg?style=flat)](https://npmjs.org/package/parse-git-config) [![NPM total downloads](https://img.shields.io/npm/dt/parse-git-config.svg?style=flat)](https://npmjs.org/package/parse-git-config) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/parse-git-config.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/parse-git-config) +# parse-git-config [![NPM version](https://img.shields.io/npm/v/parse-git-config.svg?style=flat)](https://www.npmjs.com/package/parse-git-config) [![NPM monthly downloads](https://img.shields.io/npm/dm/parse-git-config.svg?style=flat)](https://npmjs.org/package/parse-git-config) [![NPM total downloads](https://img.shields.io/npm/dt/parse-git-config.svg?style=flat)](https://npmjs.org/package/parse-git-config) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/parse-git-config.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/parse-git-config) > Parse `.git/config` into a JavaScript object. sync or async. +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + ## Install Install with [npm](https://www.npmjs.com/): @@ -13,10 +15,10 @@ $ npm install --save parse-git-config ## Usage ```js -var parse = require('parse-git-config'); +const parse = require('parse-git-config'); // sync -var config = parse.sync(); +const config = parse.sync(); // or async parse(function (err, config) { @@ -55,10 +57,16 @@ Config object will be something like: ## API -### [parse](index.js#L33) +### [parse](index.js#L35) Asynchronously parse a `.git/config` file. If only the callback is passed, the `.git/config` file relative to `process.cwd()` is used. +**Params** + +* `options` **{Object|String|Function}**: Options with `cwd` or `path`, the cwd to use, or the callback function. +* `cb` **{Function}**: callback function if the first argument is options or cwd. +* `returns` **{Object}** + **Example** ```js @@ -68,43 +76,53 @@ parse(function(err, config) { }); ``` -**Params** +### [.sync](index.js#L64) -* `options` **{Object|String|Function}**: Options with `cwd` or `path`, the cwd to use, or the callback function. -* `cb` **{Function}**: callback function if the first argument is options or cwd. -* `returns` **{Object}** +Parse the given -### [.sync](index.js#L71) +**Params** -Synchronously parse a `.git/config` file. If no arguments are passed, the `.git/config` file relative to `process.cwd()` is used. +* `options` **{Object|String}**: Options with `cwd` or `path`, or the cwd to use. +* `returns` **{Object}** **Example** ```js -var config = parse.sync(); +parse.promise({ path: '/path/to/.gitconfig' }) + .then(config => console.log(config)); ``` +### [.sync](index.js#L98) + +Synchronously parse a `.git/config` file. If no arguments are passed, the `.git/config` file relative to `process.cwd()` is used. + **Params** * `options` **{Object|String}**: Options with `cwd` or `path`, or the cwd to use. * `returns` **{Object}** -### [.keys](index.js#L109) - -Returns an object with only the properties that had ini-style keys converted to objects (example below). - **Example** ```js -var config = parse.sync(); -var obj = parse.keys(config); +const config = parse.sync(); ``` +### [.keys](index.js#L150) + +Returns an object with only the properties that had ini-style keys converted to objects (example below). + **Params** * `config` **{Object}**: The parsed git config object. * `returns` **{Object}** +**Example** + +```js +const config = parse.sync(); +const obj = parse.keys(config); +``` + ### .keys examples Converts ini-style keys into objects: @@ -112,8 +130,8 @@ Converts ini-style keys into objects: **Example 1** ```js -var parse = require('parse-git-config'); -var config = { +const parse = require('parse-git-config'); +const config = { 'foo "bar"': { doStuff: true }, 'foo "baz"': { doStuff: true } }; @@ -135,8 +153,8 @@ Results in: **Example 2** ```js -var parse = require('parse-git-config'); -var config = { +const parse = require('parse-git-config'); +const config = { 'remote "origin"': { url: 'https://github.com/jonschlinkert/normalize-pkg.git', fetch: '+refs/heads/*:refs/remotes/origin/*' @@ -181,57 +199,68 @@ Results in: ## About -### Related projects +
+Contributing -* [git-user-name](https://www.npmjs.com/package/git-user-name): Get a user's name from git config at the project or global scope, depending on… [more](https://github.com/jonschlinkert/git-user-name) | [homepage](https://github.com/jonschlinkert/git-user-name "Get a user's name from git config at the project or global scope, depending on what git uses in the current context.") -* [git-username](https://www.npmjs.com/package/git-username): Get the username from a git remote origin URL. | [homepage](https://github.com/jonschlinkert/git-username "Get the username from a git remote origin URL.") -* [parse-author](https://www.npmjs.com/package/parse-author): Parse a string into an object with `name`, `email` and `url` properties following npm conventions… [more](https://github.com/jonschlinkert/parse-author) | [homepage](https://github.com/jonschlinkert/parse-author "Parse a string into an object with `name`, `email` and `url` properties following npm conventions. Useful for the `authors` property in package.json or for parsing an AUTHORS file into an array of authors objects.") -* [parse-authors](https://www.npmjs.com/package/parse-authors): Parse a string into an array of objects with `name`, `email` and `url` properties following… [more](https://github.com/jonschlinkert/parse-authors) | [homepage](https://github.com/jonschlinkert/parse-authors "Parse a string into an array of objects with `name`, `email` and `url` properties following npm conventions. Useful for the `authors` property in package.json or for parsing an AUTHORS file into an array of authors objects.") -* [parse-github-url](https://www.npmjs.com/package/parse-github-url): Parse a github URL into an object. | [homepage](https://github.com/jonschlinkert/parse-github-url "Parse a github URL into an object.") -* [parse-gitignore](https://www.npmjs.com/package/parse-gitignore): Parse a gitignore file into an array of patterns. Comments and empty lines are stripped. | [homepage](https://github.com/jonschlinkert/parse-gitignore "Parse a gitignore file into an array of patterns. Comments and empty lines are stripped.") +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). -### Contributing +
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). +
+Running Tests -### Contributors +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: -| **Commits** | **Contributor**
| -| --- | --- | -| 48 | [jonschlinkert](https://github.com/jonschlinkert) | -| 1 | [sam3d](https://github.com/sam3d) | -| 1 | [jsdnxx](https://github.com/jsdnxx) | +```sh +$ npm install && npm test +``` -### Building docs +
+
+Building docs -_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ -To generate the readme and API documentation with [verb](https://github.com/verbose/verb): +To generate the readme, run the following command: ```sh -$ npm install -g verb verb-generate-readme && verb +$ npm install -g verbose/verb#dev verb-generate-readme && verb ``` -### Running tests +
-Install dev dependencies: +### Related projects -```sh -$ npm install -d && npm test -``` +You might also be interested in these projects: + +* [git-user-name](https://www.npmjs.com/package/git-user-name): Get a user's name from git config at the project or global scope, depending on… [more](https://github.com/jonschlinkert/git-user-name) | [homepage](https://github.com/jonschlinkert/git-user-name "Get a user's name from git config at the project or global scope, depending on what git uses in the current context.") +* [git-username](https://www.npmjs.com/package/git-username): Get the username from a git remote origin URL. | [homepage](https://github.com/jonschlinkert/git-username "Get the username from a git remote origin URL.") +* [parse-author](https://www.npmjs.com/package/parse-author): Parse an author, contributor, maintainer or other 'person' string into an object with name, email… [more](https://github.com/jonschlinkert/parse-author) | [homepage](https://github.com/jonschlinkert/parse-author "Parse an author, contributor, maintainer or other 'person' string into an object with name, email and url properties following npm conventions.") +* [parse-authors](https://www.npmjs.com/package/parse-authors): Parse a string into an array of objects with `name`, `email` and `url` properties following… [more](https://github.com/jonschlinkert/parse-authors) | [homepage](https://github.com/jonschlinkert/parse-authors "Parse a string into an array of objects with `name`, `email` and `url` properties following npm conventions. Useful for the `authors` property in package.json or for parsing an AUTHORS file into an array of authors objects.") +* [parse-github-url](https://www.npmjs.com/package/parse-github-url): Parse a github URL into an object. | [homepage](https://github.com/jonschlinkert/parse-github-url "Parse a github URL into an object.") +* [parse-gitignore](https://www.npmjs.com/package/parse-gitignore): Parse a gitignore file into an array of patterns. Comments and empty lines are stripped. | [homepage](https://github.com/jonschlinkert/parse-gitignore "Parse a gitignore file into an array of patterns. Comments and empty lines are stripped.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 51 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [sam3d](https://github.com/sam3d) | +| 1 | [js-n](https://github.com/js-n) | ### Author **Jon Schlinkert** +* [linkedin/in/jonschlinkert](https://linkedin.com/in/jonschlinkert) * [github/jonschlinkert](https://github.com/jonschlinkert) -* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) ### License -Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). -Released under the [MIT license](https://github.com/jonschlinkert/parse-git-config/blob/master/LICENSE). +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). *** -_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.2.0, on December 14, 2016._ \ No newline at end of file +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on January 23, 2018._ \ No newline at end of file diff --git a/example.js b/example.js index 6ee3ba2..50597f2 100644 --- a/example.js +++ b/example.js @@ -1,7 +1,8 @@ 'use strict'; -var parse = require('./'); -var config = { +const parse = require('./'); +const gitconfig = { + email: 'email', 'remote "origin"': { url: 'https://github.com/jonschlinkert/normalize-pkg.git', fetch: '+refs/heads/*:refs/remotes/origin/*' @@ -14,4 +15,5 @@ var config = { } }; -console.log(parse.keys(config)); +const config = parse.expandKeys(gitconfig); +console.log(config); diff --git a/index.js b/index.js index 4ac85e6..bd3e409 100644 --- a/index.js +++ b/index.js @@ -7,13 +7,14 @@ 'use strict'; -var fs = require('fs'); -var path = require('path'); -var expand = require('expand-tilde'); -var exists = require('fs-exists-sync'); -var extend = require('extend-shallow'); -var configPath = require('git-config-path'); -var ini = require('ini'); +const fs = require('fs'); +const path = require('path'); +const util = require('util'); +const ini = require('ini'); +const configPath = require('git-config-path'); +const expand = require('expand-tilde'); +const read = util.promisify(fs.readFile); +const stat = util.promisify(fs.stat); /** * Asynchronously parse a `.git/config` file. If only the callback is passed, @@ -38,42 +39,54 @@ function parse(options, cb) { } if (typeof cb !== 'function') { - throw new TypeError('expected callback to be a function'); + return parse.promise(options); } - var filepath = parse.resolveConfigPath(options); - if (filepath === null) { - cb(); - return; - } + return parse.promise(options) + .then(config => cb(null, config)) + .catch(cb); +} - fs.stat(filepath, function(err, stat) { - if (err) { - cb(err); - return; - } +/** + * Parse the given + * + * ```js + * parse.promise({ path: '/path/to/.gitconfig' }) + * .then(config => console.log(config)); + * ``` + * + * @name .sync + * @param {Object|String} `options` Options with `cwd` or `path`, or the cwd to use. + * @return {Object} + * @api public + */ - fs.readFile(filepath, 'utf8', function(err, str) { - if (err) { - cb(err); - return; - } +parse.promise = function(options) { + const opts = Object.assign({}, options); + const filepath = parse.resolveConfigPath(opts); - if (options && options.include === true) { + if (!filepath) { + return Promise.resolve(null); + } + + return stat(filepath) + .then(() => { + return read(filepath, 'utf8'); + }) + .then(str => { + if (opts.include === true) { str = injectInclude(str, path.resolve(path.dirname(filepath))); } - - cb(null, ini.parse(str)); + return parseIni(str, opts); }); - }); -} +}; /** * Synchronously parse a `.git/config` file. If no arguments are passed, * the `.git/config` file relative to `process.cwd()` is used. * * ```js - * var config = parse.sync(); + * const config = parse.sync(); * ``` * * @name .sync @@ -82,18 +95,19 @@ function parse(options, cb) { * @api public */ -parse.sync = function parseSync(options) { - var filepath = parse.resolveConfigPath(options); - if (filepath && exists(filepath)) { - var input = fs.readFileSync(filepath, 'utf8'); +parse.sync = function(options) { + const opts = Object.assign({}, options); + const filepath = parse.resolveConfigPath(opts); + if (filepath && fs.existsSync(filepath)) { + const input = fs.readFileSync(filepath, 'utf8'); - if (options && options.include === true) { - var cwd = path.resolve(path.dirname(filepath)); - var str = injectInclude(input, cwd); - return ini.parse(str); + if (opts.include === true) { + const cwd = path.resolve(path.dirname(filepath)); + const str = injectInclude(input, cwd); + return parseIni(str, opts); } - return ini.parse(input); + return parseIni(input, opts); } return {}; }; @@ -106,8 +120,8 @@ parse.resolveConfigPath = function(options) { if (typeof options === 'string') { options = { type: options }; } - var opts = extend({cwd: process.cwd()}, options); - var fp = opts.path ? expand(opts.path) : configPath(opts.type); + const opts = Object.assign({cwd: process.cwd()}, options); + const fp = opts.path ? expand(opts.path) : configPath(opts.type); return fp ? path.resolve(opts.cwd, fp) : null; }; @@ -121,59 +135,57 @@ parse.resolve = function(options) { /** * Returns an object with only the properties that had ini-style keys - * converted to objects (example below). + * converted to objects. * * ```js - * var config = parse.sync(); - * var obj = parse.keys(config); + * const config = parse.sync({ path: '/path/to/.gitconfig' }); + * const obj = parse.expandKeys(config); * ``` - * @name .keys * @param {Object} `config` The parsed git config object. * @return {Object} * @api public */ -parse.keys = function parseKeys(config) { - var res = {}; - for (var key in config) { - var m = /(\S+) "(.*)"/.exec(key); +parse.expandKeys = function(config) { + for (const key of Object.keys(config)) { + const m = /(\S+) "(.*)"/.exec(key); if (!m) continue; - var prop = m[1]; - res[prop] = res[prop] || {}; - res[prop][m[2]] = config[key]; + const prop = m[1]; + config[prop] = config[prop] || {}; + config[prop][m[2]] = config[key]; + delete config[key]; } - return res; + return config; }; +function parseIni(str, options) { + const opts = Object.assign({}, options); + const config = ini.parse(str); + if (opts.expandKeys === true) { + return parse.expandKeys(config); + } + return config; +} + function injectInclude(input, cwd) { - var pathRegex = /^\s*path\s*=\s*/; - var lines = input.split('\n'); - var len = lines.length; - var filepath = ''; - var res = []; + const lines = input.split('\n').filter(function(line) { + return line.trim() !== ''; + }); - for (var i = 0; i < len; i++) { - var line = lines[i]; - var n = i; + const len = lines.length; + const res = []; + for (let i = 0; i < len; i++) { + const line = lines[i]; if (line.indexOf('[include]') === 0) { - while (n < len && !pathRegex.test(filepath)) { - filepath = lines[++n]; - } - - if (!filepath) { - return input; - } - - filepath = filepath.replace(pathRegex, ''); - var fp = path.resolve(cwd, expand(filepath)); + const filepath = lines[i + 1].replace(/^\s*path\s*=\s*/, ''); + const fp = path.resolve(cwd, expand(filepath)); res.push(fs.readFileSync(fp)); } else { res.push(line); } } - return res.join('\n'); } diff --git a/package.json b/package.json index d595282..78c0e35 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ ], "main": "index.js", "engines": { - "node": ">=0.10.0" + "node": ">=8" }, "scripts": { "test": "mocha" @@ -61,9 +61,6 @@ "parse-gitignore" ] }, - "reflinks": [ - "verb" - ], "lint": { "reflinks": true } diff --git a/test/test.js b/test/test.js index c00c66c..61090b0 100644 --- a/test/test.js +++ b/test/test.js @@ -1,108 +1,134 @@ -/*! - * parse-git-config - * - * Copyright (c) 2015-2018 Jon Schlinkert. - * Licensed under the MIT license. - */ - 'use strict'; require('mocha'); -var isTravis = process.env.TRAVIS || process.env.CLI; -var fs = require('fs'); -var os = require('os'); -var assert = require('assert'); -var path = require('path'); -var homedir = require('homedir-polyfill'); -var parse = require('..'); +const isTravis = process.env.TRAVIS || process.env.CLI; +const fs = require('fs'); +const os = require('os'); +const assert = require('assert'); +const path = require('path'); +const homedir = require('homedir-polyfill'); +const parse = require('..'); + +const cwd = (...args) => path.resolve(__dirname, ...args); +const fixture = name => cwd('fixtures', name); function read(filepath) { return fs.readFileSync(path.join(__dirname, filepath), 'utf8'); } -describe('sync:', function() { - it('should return an object', function() { - assert(parse.sync().hasOwnProperty('core')); - }); -}); +describe('parse-git-config', function() { + describe('async', function() { + it('should return a promise when callback is not passed', function(cb) { + parse({ path: fixture('_gitconfig') }) + .then(config => { + assert(config.hasOwnProperty('core')); + cb(); + }) + .catch(cb); + }); -describe('async:', function() { - it('should throw a callback is not passed:', function() { - assert.throws(function() { - parse(); - }, /expected/); - }); + it('should parse .git/config', function(cb) { + parse({ path: fixture('_gitconfig') }, function(err, config) { + assert(!err); + assert(config.hasOwnProperty('core')); + cb(); + }); + }); - it('should parse .git/config', function(cb) { - parse(function(err, config) { - assert(!err); - assert(config.hasOwnProperty('core')); - cb(); + it('should expand keys in config', function(cb) { + parse({ path: fixture('_gitconfig'), expandKeys: true }) + .then(config => { + assert(config.hasOwnProperty('color')); + assert(config.color.hasOwnProperty('diff')); + cb(); + }) + .catch(cb); }); - }); - it('should include other config sources', function() { - var fp = path.join(__dirname, 'fixtures/_gitconfig'); + it('should include other config sources', function(cb) { + parse({ path: fixture('_gitconfig'), include: true }, function(err, config) { + assert(!err); + assert.deepEqual(config, require('./expected/_gitconfig.js')); + cb(); + }); + }); - parse({ path: fp, include: true }, function(err, config) { - assert(!err); - assert.deepEqual(config, require('./expected/_gitconfig.js')); - cb(); + it('should throw an error when .git/config does not exist', function(cb) { + parse({ path: 'foo' }, function(err, config) { + assert(err instanceof Error); + assert(/ENOENT.*parse-git-config/.test(err.message)); + cb(); + }); }); }); - it('should throw an error when .git/config does not exist:', function(cb) { - parse({ path: 'foo' }, function(err, config) { - assert(err instanceof Error); - assert(/ENOENT.*parse-git-config/.test(err.message)); - cb(); + describe('promise', function() { + it('should return a promise', function(cb) { + parse.promise({ path: fixture('_gitconfig') }) + .then(config => { + assert(config.hasOwnProperty('core')); + cb(); + }); }); - }); -}); -describe('resolve:', function() { - it('should resolve the git config in the cwd by default', function() { - assert.equal(parse.resolve(), path.resolve(process.cwd(), '.git/config')); + it('should include other config sources', function() { + return parse.promise({ path: fixture('_gitconfig'), include: true }) + .then(config => { + assert.deepEqual(config, require('./expected/_gitconfig.js')); + }); + }); }); - it('should allow override path', function() { - var fp = path.resolve(homedir(), '.gitconfig'); - assert.equal(parse.resolve({ path: fp }), fp); + describe('sync', function() { + it('should return an object', function() { + assert(parse.sync({path: fixture('_gitconfig') }).hasOwnProperty('core')); + }); }); - it('should include other config sources', function() { - var fp = path.join(__dirname, 'fixtures/_gitconfig'); - var actual = parse.sync({ path: fp, include: true }); - assert.deepEqual(actual, require('./expected/_gitconfig.js')); + describe('.expandKeys', function() { + it('should expand ini-style keys', function() { + const config = { + 'foo "bar"': { doStuff: true }, + 'foo "baz"': { doStuff: true } + }; + + assert.deepEqual(parse.expandKeys(config), { + foo: { + bar: { doStuff: true }, + baz: { doStuff: true } + } + }); + }); }); - it('should resolve relative path to cwd', function() { - assert.equal(parse.resolve({ path: '.config' }), path.resolve(process.cwd(), '.config')); - }); + describe('resolve', function() { + it('should resolve the git config in the cwd by default', function() { + assert.equal(parse.resolve(), path.resolve(process.cwd(), '.git/config')); + }); - it('should resolve relative path to the global git config when `global` is passed', function() { - if (isTravis && os.platform() === 'darwin') return this.skip(); - assert.equal(parse.resolve('global'), path.resolve(homedir(), '.gitconfig')); - }); + it('should allow override path', function() { + const fp = path.resolve(homedir(), '.gitconfig'); + assert.equal(parse.resolve({ path: fp }), fp); + }); - it('should allow override of cwd', function() { - var actual = parse.resolve({ path: '.config', cwd: '/opt/config' }); - assert.equal(actual, path.resolve('/opt/config/.config')); - }); -}); + it('should include other config sources', function() { + const fp = path.join(__dirname, 'fixtures/_gitconfig'); + const actual = parse.sync({ path: fp, include: true }); + assert.deepEqual(actual, require('./expected/_gitconfig.js')); + }); + + it('should resolve relative path to cwd', function() { + assert.equal(parse.resolve({ path: '.config' }), path.resolve(process.cwd(), '.config')); + }); + + it('should resolve relative path to the global git config when `global` is passed', function() { + if (isTravis && os.platform() === 'darwin') return this.skip(); + assert.equal(parse.resolve('global'), path.resolve(homedir(), '.gitconfig')); + }); -describe('.keys:', function() { - it('should parse ini-style keys', function() { - var config = { - 'foo "bar"': { doStuff: true }, - 'foo "baz"': { doStuff: true } - }; - - assert.deepEqual(parse.keys(config), { - foo: { - bar: { doStuff: true }, - baz: { doStuff: true } - } + it('should allow override of cwd', function() { + const actual = parse.resolve({ path: '.config', cwd: '/opt/config' }); + assert.equal(actual, path.resolve('/opt/config/.config')); }); }); });