From e49ed3007665fb49f822d42018eb2a2028d728ae Mon Sep 17 00:00:00 2001 From: Pat Herlihy Date: Wed, 12 Aug 2020 21:10:45 -0400 Subject: [PATCH 1/2] Fixed a bug where configurations did not actually support extends --- lib/cli/options.js | 24 +++++++++++++++++-- .../config/mocharc-extended/base.json | 6 +++++ .../config/mocharc-extended/extends.json | 3 +++ .../config/mocharc-extended/modifiers.json | 5 ++++ test/integration/options.spec.js | 23 ++++++++++++++++++ 5 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 test/integration/fixtures/config/mocharc-extended/base.json create mode 100644 test/integration/fixtures/config/mocharc-extended/extends.json create mode 100644 test/integration/fixtures/config/mocharc-extended/modifiers.json create mode 100644 test/integration/options.spec.js diff --git a/lib/cli/options.js b/lib/cli/options.js index 95428c4f96..457b24bdcd 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -8,7 +8,10 @@ */ const fs = require('fs'); +const path = require('path'); const ansi = require('ansi-colors'); +const {cwd} = require('../utils'); +const applyExtends = require('yargs/lib/apply-extends'); const yargsParser = require('yargs-parser'); const {types, aliases} = require('./run-option-metadata'); const {ONE_AND_DONE_ARGS} = require('./one-and-dones'); @@ -124,7 +127,19 @@ const parse = (args = [], defaultValues = {}, ...configObjects) => { const result = yargsParser.detailed(args, { configuration, - configObjects, + configObjects: configObjects.map(configObject => { + // '_configPath' gets set by config.loadConfig() + const config = configObject || {}; + const configPath = + typeof config._configPath === 'string' + ? path.dirname(config._configPath) + : cwd(); + + // Remove the internal property + delete config._configPath; + + return applyExtends(config, configPath, true); + }), default: defaultValues, coerce: coerceOpts, narg: nargOpts, @@ -158,7 +173,12 @@ const parse = (args = [], defaultValues = {}, ...configObjects) => { const loadRc = (args = {}) => { if (args.config !== false) { const config = args.config || findConfig(); - return config ? loadConfig(config) : {}; + const configObject = config ? loadConfig(config) : {}; + + // Set _configPath for use by parse() + configObject._configPath = config; + + return configObject; } }; diff --git a/test/integration/fixtures/config/mocharc-extended/base.json b/test/integration/fixtures/config/mocharc-extended/base.json new file mode 100644 index 0000000000..89c92825f9 --- /dev/null +++ b/test/integration/fixtures/config/mocharc-extended/base.json @@ -0,0 +1,6 @@ +{ + "require": ["foo", "bar"], + "bail": true, + "reporter": "dot", + "slow": 60 +} diff --git a/test/integration/fixtures/config/mocharc-extended/extends.json b/test/integration/fixtures/config/mocharc-extended/extends.json new file mode 100644 index 0000000000..715639efd7 --- /dev/null +++ b/test/integration/fixtures/config/mocharc-extended/extends.json @@ -0,0 +1,3 @@ +{ + "extends": "./modifiers.json" +} diff --git a/test/integration/fixtures/config/mocharc-extended/modifiers.json b/test/integration/fixtures/config/mocharc-extended/modifiers.json new file mode 100644 index 0000000000..8e6dcb1d3c --- /dev/null +++ b/test/integration/fixtures/config/mocharc-extended/modifiers.json @@ -0,0 +1,5 @@ +{ + "extends": "./base.json", + "reporter": "html", + "slow": 30 +} diff --git a/test/integration/options.spec.js b/test/integration/options.spec.js new file mode 100644 index 0000000000..f4674b7543 --- /dev/null +++ b/test/integration/options.spec.js @@ -0,0 +1,23 @@ +'use strict'; + +var path = require('path'); +var loadOptions = require('../../lib/cli/options').loadOptions; + +describe('options', function() { + it('Should support extended options', function() { + var configDir = path.join( + __dirname, + 'fixtures', + 'config', + 'mocharc-extended' + ); + var extended = loadOptions([ + '--config', + path.join(configDir, 'extends.json') + ]); + expect(extended.require, 'to equal', ['foo', 'bar']); + expect(extended.bail, 'to equal', true); + expect(extended.reporter, 'to equal', 'html'); + expect(extended.slow, 'to equal', 30); + }); +}); From f07d42739990bf7a51ffb418ff97751616ba9a84 Mon Sep 17 00:00:00 2001 From: juergba Date: Sat, 13 Feb 2021 11:38:55 +0100 Subject: [PATCH 2/2] require public helper --- lib/cli/options.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cli/options.js b/lib/cli/options.js index 457b24bdcd..473d17a91d 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -11,7 +11,7 @@ const fs = require('fs'); const path = require('path'); const ansi = require('ansi-colors'); const {cwd} = require('../utils'); -const applyExtends = require('yargs/lib/apply-extends'); +const {applyExtends} = require('yargs/helpers'); const yargsParser = require('yargs-parser'); const {types, aliases} = require('./run-option-metadata'); const {ONE_AND_DONE_ARGS} = require('./one-and-dones');