diff --git a/README.md b/README.md index 28041dd..d8ee11d 100644 --- a/README.md +++ b/README.md @@ -165,6 +165,8 @@ Default: `null` An object of configuration files to find. Each property is keyed by the default basename of the file being found, and the value is an array of [path arguments](#path-arguments) of which the order indicates priority to find. +When specified, users can override the `configPath` via their config files. For example, the `hackerfile` property in a `configFile` will resolve the `configPath` and `configBase` against the path. + **Note:** This option is useful if, for example, you want to support an `.apprc` file in addition to an `appfile.js`. If you only need a single configuration file, you probably don't need this. In addition to letting you find multiple files, this option allows more fine-grained control over how configuration files are located. Type: `Object` @@ -337,11 +339,7 @@ const onExecute = function (env, argv) { }; const onPrepare = function (env) { const config = env.config['.hacker']; - if (config.hackerfile) { - env.configPath = path.resolve(config.hackerfile); - env.configBase = path.dirname(env.configPath); - } - Hacker.execute(env, onExecute); + Hacker.execute(env, config.forcedFlags, onExecute); }; Hacker.prepare({}, onPrepare); ``` @@ -457,6 +455,7 @@ A function called after your environment is prepared. A good place to modify the - `modulePath`: the full path to the local module your project relies on (if found) - `modulePackage`: the contents of the local module's package.json (if found) - `configFiles`: an object of filepaths for each found config file (filepath values will be null if not found) +- `config`: an object with keys matching `configFiles` but with the loaded config object ### execute(env, [forcedFlags], callback(env, argv)) @@ -492,6 +491,7 @@ A function called after your application is executed. When invoked, `this` will - `modulePath`: the full path to the local module your project relies on (if found) - `modulePackage`: the contents of the local module's package.json (if found) - `configFiles`: an object of filepaths for each found config file (filepath values will be null if not found) +- `config`: an object with keys matching `configFiles` but with the loaded config object ### events diff --git a/index.js b/index.js index 92c437b..5d74742 100644 --- a/index.js +++ b/index.js @@ -146,6 +146,15 @@ Liftoff.prototype.buildEnvironment = function (opts) { return loadConfig(cwd, startingLocation, defaultConfig); }); + var configName = this.configName; + + var configPathOverride = arrayFind(Object.keys(config), function (key) { + var cfg = config[key]; + if (Object.prototype.hasOwnProperty.call(cfg, configName)) { + return cfg[configName]; + } + }); + // if cwd was provided explicitly, only use it for searching config if (opts.cwd) { searchPaths = [cwd]; @@ -156,7 +165,7 @@ Liftoff.prototype.buildEnvironment = function (opts) { // calculate the regex to use for finding the config file var configNameSearch = buildConfigName({ - configName: this.configName, + configName: configName, extensions: Object.keys(this.extensions), }); @@ -164,7 +173,7 @@ Liftoff.prototype.buildEnvironment = function (opts) { var configPath = findConfig({ configNameSearch: configNameSearch, searchPaths: searchPaths, - configPath: opts.configPath, + configPath: opts.configPath || configPathOverride, }); // if we have a config path, save the directory it resides in. diff --git a/test/fixtures/configfiles/override-config-path.js b/test/fixtures/configfiles/override-config-path.js new file mode 100644 index 0000000..7d9b36a --- /dev/null +++ b/test/fixtures/configfiles/override-config-path.js @@ -0,0 +1,5 @@ +var path = require('path'); + +module.exports = { + myappfile: path.join(__dirname, "../override-the-config-path.js"), +}; diff --git a/test/fixtures/override-the-config-path.js b/test/fixtures/override-the-config-path.js new file mode 100644 index 0000000..e69de29 diff --git a/test/index.js b/test/index.js index aa6264e..4517d2f 100644 --- a/test/index.js +++ b/test/index.js @@ -571,6 +571,21 @@ describe('Liftoff', function () { ); }); + it('overrides the configPath if the configName key exists in the config', function (done) { + var app = new Liftoff({ + name: 'myapp', + configFiles: { + 'override-config-path': [ + { path: 'test/fixtures/configfiles', extensions: ['.js', '.json'] } + ], + }, + }); + app.prepare({}, function (env) { + expect(env.configPath).toMatch(/override-the-config-path\.js$/); + done(); + }); + }); + it('should use dirname of configPath if no cwd is specified', function (done) { var app = new Liftoff({ name: 'myapp',