Skip to content

Commit

Permalink
Allow provided config object to extend other configs
Browse files Browse the repository at this point in the history
  • Loading branch information
rcoy-v committed Feb 10, 2017
1 parent cef98c8 commit e07fac6
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 0 deletions.
7 changes: 7 additions & 0 deletions .editorconfig
@@ -0,0 +1,7 @@
root = true

[*.js]
end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
19 changes: 19 additions & 0 deletions lib/apply-extends.js
@@ -0,0 +1,19 @@
var fs = require('fs')
var path = require('path')
var assign = require('./assign')

function applyExtends (config, cwd) {
var defaultConfig = {}

if (config.hasOwnProperty('extends')) {
var pathToDefault = path.join(cwd, config.extends)
delete config.extends

defaultConfig = JSON.parse(fs.readFileSync(pathToDefault, 'utf8'))
defaultConfig = applyExtends(defaultConfig, path.dirname(pathToDefault))
}

return assign(defaultConfig, config)
}

module.exports = applyExtends
5 changes: 5 additions & 0 deletions test/fixtures/extends/config_1.json
@@ -0,0 +1,5 @@
{
"a": 30,
"b": 22,
"extends": "./config_2.json"
}
3 changes: 3 additions & 0 deletions test/fixtures/extends/config_2.json
@@ -0,0 +1,3 @@
{
"z": 15
}
15 changes: 15 additions & 0 deletions test/yargs.js
Expand Up @@ -1155,6 +1155,21 @@ describe('yargs dsl tests', function () {
argv.foo.should.equal(1)
argv.bar.should.equal(2)
})

describe('extends', function () {
it('applies default configurations when given config object', function () {
var argv = yargs
.config({
extends: './test/fixtures/extends/config_1.json',
a: 1
})
.argv

argv.a.should.equal(1)
argv.b.should.equal(22)
argv.z.should.equal(15)
})
})
})

describe('normalize', function () {
Expand Down
3 changes: 3 additions & 0 deletions yargs.js
Expand Up @@ -9,6 +9,7 @@ const Validation = require('./lib/validation')
const Y18n = require('y18n')
const objFilter = require('./lib/obj-filter')
const setBlocking = require('set-blocking')
const applyExtends = require('./lib/apply-extends')
const YError = require('./lib/yerror')

var exports = module.exports = Yargs
Expand Down Expand Up @@ -304,6 +305,7 @@ function Yargs (processArgs, cwd, parentRequire) {
argsert('[object|string] [string|function] [function]', [key, msg, parseFn], arguments.length)
// allow a config object to be provided directly.
if (typeof key === 'object') {
key = applyExtends(key, cwd)
options.configObjects = (options.configObjects || []).concat(key)
return self
}
Expand All @@ -319,6 +321,7 @@ function Yargs (processArgs, cwd, parentRequire) {
;(Array.isArray(key) ? key : [key]).forEach(function (k) {
options.config[k] = parseFn || true
})

return self
}

Expand Down

0 comments on commit e07fac6

Please sign in to comment.