blob: 824063931076658f4ff365d86c42d8838fadf6db [file] [log] [blame]
/* @flow */
"use strict";
const augmentConfigFull = require("./augmentConfig").augmentConfigFull;
const configurationError = require("./utils/configurationError");
const path = require("path");
/*:: type configPromise = Promise<?{ config: stylelint$config, filepath: string }>*/
module.exports = function(
stylelint /*: stylelint$internalApi*/,
searchPath /*:: ?: string*/
) /*: configPromise*/ {
searchPath = searchPath || process.cwd();
const optionsConfig = stylelint._options.config;
if (optionsConfig !== undefined) {
const cached /*: configPromise*/ = stylelint._specifiedConfigCache.get(
optionsConfig
);
if (cached) return cached;
// stylelint._fullExplorer (cosmiconfig) is already configured to
// run augmentConfigFull; but since we're making up the result here,
// we need to manually run the transform
const augmentedResult = augmentConfigFull(stylelint, {
config: optionsConfig,
// Add the extra path part so that we can get the directory without being
// confused
filepath: path.join(process.cwd(), "argument-config")
});
stylelint._specifiedConfigCache.set(optionsConfig, augmentedResult);
return augmentedResult;
}
const searchForConfig = stylelint._options.configFile
? stylelint._fullExplorer.load(stylelint._options.configFile)
: stylelint._fullExplorer.search(searchPath);
return searchForConfig
.then(config => {
// If no config was found, try looking from process.cwd
if (!config) return stylelint._fullExplorer.search(process.cwd());
return config;
})
.then(config => {
if (!config) {
const ending = searchPath ? ` for ${searchPath}` : "";
throw configurationError(`No configuration provided${ending}`);
}
return config;
});
};