Skip to content

Fix asconfig merge order #1406

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Jul 24, 2020
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 28 additions & 23 deletions cli/asc.js
Original file line number Diff line number Diff line change
Expand Up @@ -193,10 +193,11 @@ exports.main = function main(argv, options, callback) {
if (!stdout) throw Error("'options.stdout' must be specified");
if (!stderr) throw Error("'options.stderr' must be specified");

const opts = optionsUtil.parse(argv, exports.options);
// Parse command line options but do not populate option defaults yet
const opts = optionsUtil.parse(argv, exports.options, false);
let args = opts.options;

argv = opts.arguments;

if (args.noColors) {
colorsUtil.stdout.supported =
colorsUtil.stderr.supported = false;
Expand All @@ -205,16 +206,18 @@ exports.main = function main(argv, options, callback) {
colorsUtil.stderr = colorsUtil.from(stderr);
}

// Check for unknown arguments
if (opts.unknown.length) {
opts.unknown.forEach(arg => {
// Check for unknown options
const unknownOpts = opts.unknown;
if (unknownOpts.length) {
unknownOpts.forEach(arg => {
stderr.write(colorsUtil.stderr.yellow("WARNING ") + "Unknown option '" + arg + "'" + EOL);
});
}

// Check for trailing arguments
if (opts.trailing.length) {
stderr.write(colorsUtil.stderr.yellow("WARNING ") + "Unsupported trailing arguments: " + opts.trailing.join(" ") + EOL);
const trailingArgv = opts.trailing;
if (trailingArgv.length) {
stderr.write(colorsUtil.stderr.yellow("WARNING ") + "Unsupported trailing arguments: " + trailingArgv.join(" ") + EOL);
}

// Use default callback if none is provided
Expand Down Expand Up @@ -271,23 +274,25 @@ exports.main = function main(argv, options, callback) {

// Set up base directory
const baseDir = args.baseDir ? path.resolve(args.baseDir) : ".";
const target = args.target;

// Once the baseDir is calculated, we can resolve the config, and its extensions
let asconfig = getAsconfig(args.config, baseDir, readFile);
// Load additional options from asconfig.json
let asconfigFile = args.config || "asconfig.json";
let asconfig = getAsconfig(asconfigFile, baseDir, readFile);
let asconfigDir = baseDir;

const seenAsconfig = new Set();
seenAsconfig.add(path.join(baseDir, args.config));
seenAsconfig.add(path.join(baseDir, asconfigFile));

const target = args.target || "release";
while (asconfig) {
// merge target first, then merge options, then merge extended asconfigs
// Merge target first
if (asconfig.targets && asconfig.targets[target]) {
args = optionsUtil.merge(exports.options, asconfig.targets[target], args);
args = optionsUtil.merge(exports.options, args, asconfig.targets[target]);
}
// Merge general options
if (asconfig.options) {
if (asconfig.options.transform) {
// ensure that a transform's path is relative to the current config
// ensure that a transform's path is relative to the current asconfig
asconfig.options.transform = asconfig.options.transform.map(p => {
if (!path.isAbsolute(p)) {
if (p.startsWith(".")) {
Expand All @@ -301,25 +306,22 @@ exports.main = function main(argv, options, callback) {
args = optionsUtil.merge(exports.options, args, asconfig.options);
}

// entries are added to the compilation
// Append entries
if (asconfig.entries) {
for (const entry of asconfig.entries) {
argv.push(
path.isAbsolute(entry)
? entry
// the entry is relative to the asconfig directory
: path.join(asconfigDir, entry)
: path.join(asconfigDir, entry) // relative to current asconfig
);
}
}

// asconfig "extends" another config, merging options of it's parent
// Look up extended asconfig and repeat
if (asconfig.extends) {
asconfigDir = path.isAbsolute(asconfig.extends)
// absolute extension path means we know the exact directory and location
? path.dirname(asconfig.extends)
// relative means we need to calculate a relative asconfigDir
: path.join(asconfigDir, path.dirname(asconfig.extends));
: path.join(asconfigDir, path.dirname(asconfig.extends)); // relative to current asconfig
const fileName = path.basename(asconfig.extends);
const filePath = path.join(asconfigDir, fileName);
if (seenAsconfig.has(filePath)) {
Expand All @@ -329,11 +331,14 @@ exports.main = function main(argv, options, callback) {
asconfig = getAsconfig(fileName, asconfigDir, readFile);
}
} else {
asconfig = null; // finished resolving the configuration chain
asconfig = null;
}
}

// If showConfig print args and exit
// Populate option defaults once user-defined options are set
optionsUtil.addDefaults(exports.options, args);

// If showConfig print options and exit
if (args.showConfig) {
stderr.write(JSON.stringify(args, null, 2));
return callback(null);
Expand Down
6 changes: 2 additions & 4 deletions cli/asc.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,12 @@
"config": {
"category": "General",
"description": "Configuration file to apply. CLI arguments take precedence.",
"type": "s",
"default": "asconfig.json"
"type": "s"
},
"target": {
"category": "General",
"description": "Target configuration to use. Defaults to 'release'.",
"type": "s",
"default": "release"
"type": "s"
},

"optimize": {
Expand Down
2 changes: 1 addition & 1 deletion cli/util/options.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,4 @@ export function help(config: Config, options?: HelpOptions): string;
export function merge(config: Config, currentOptions: OptionSet, parentOptions: OptionSet): OptionSet;

/** Populates default values on a parsed options result. */
export function addDefaults(config: Config, options: OptionSet): OptionSet;
export function addDefaults(config: Config, options: OptionSet): void;
3 changes: 1 addition & 2 deletions cli/util/options.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ function parse(argv, config, propagateDefaults = true) {
if (typeof option.alias === "string") aliases[option.alias] = key;
else if (Array.isArray(option.alias)) option.alias.forEach(alias => aliases[alias] = key);
}
if (option.default != null) options[key] = option.default;
if (propagateDefaults && option.default != null) options[key] = option.default;
});

// iterate over argv
Expand Down Expand Up @@ -229,7 +229,6 @@ function addDefaults(config, options) {
options[key] = defaultValue;
}
}
return options;
}

exports.addDefaults = addDefaults;