diff --git a/lib/conditionals.js b/lib/conditionals.js index 165d588b6..ed96ac495 100644 --- a/lib/conditionals.js +++ b/lib/conditionals.js @@ -34,10 +34,12 @@ * * These conditions can also be negated via: * - * import 'es5-shim#?~./conditions.js|es6' + * import 'es5-shim#?./conditions.js|~es6' * */ + var sysConditions = ['browser', 'node', 'dev', 'production', 'default']; + function parseCondition(condition) { var conditionExport, conditionModule, negation; @@ -45,11 +47,23 @@ var conditionExportIndex = condition.lastIndexOf('|'); if (conditionExportIndex != -1) { conditionExport = condition.substr(conditionExportIndex + 1); - conditionModule = condition.substr(negation, conditionExportIndex - negation) || '@system-env'; + conditionModule = condition.substr(negation, conditionExportIndex - negation); + + if (negation) + warn.call(this, 'Condition negation form "' + condition + '" is deprecated for "' + conditionModule + '|~' + conditionExport + '"'); + + if (conditionExport[0] == '~') { + negation = true; + conditionExport = conditionExport.substr(1); + } } else { conditionExport = null; conditionModule = condition.substr(negation); + if (sysConditions.indexOf(conditionModule) != -1) { + conditionExport = conditionModule; + conditionModule = '@system-env'; + } } return { @@ -60,7 +74,7 @@ } function serializeCondition(conditionObj) { - return (conditionObj.negate ? '~' : '') + conditionObj.module + (conditionObj.prop ? '|' + conditionObj.prop : ''); + return conditionObj.module + (conditionObj.prop ? '|' + conditionObj.prop : ''); } function resolveCondition(conditionObj, parentName, bool) { @@ -86,7 +100,7 @@ if (!conditionalMatch) return Promise.resolve(name); - var conditionObj = parseCondition(conditionalMatch[0].substr(2, conditionalMatch[0].length - 3)); + var conditionObj = parseCondition.call(this, conditionalMatch[0].substr(2, conditionalMatch[0].length - 3)); // in builds, return normalized conditional if (this.builder) @@ -115,7 +129,7 @@ if (booleanIndex == -1) return Promise.resolve(name); - var conditionObj = parseCondition(name.substr(booleanIndex + 2)); + var conditionObj = parseCondition.call(this, name.substr(booleanIndex + 2)); // in builds, return normalized conditional if (this.builder) diff --git a/lib/core.js b/lib/core.js index 005664423..5996c720a 100644 --- a/lib/core.js +++ b/lib/core.js @@ -293,7 +293,7 @@ hook('instantiate', function(instantiate) { For easy normalization canonicalization with latest URL support. */ -SystemJSLoader.prototype.env = 'development'; +SystemJSLoader.prototype.env = 'dev'; var curCurScript; SystemJSLoader.prototype.config = function(cfg, isEnvConfig) { @@ -314,8 +314,8 @@ SystemJSLoader.prototype.config = function(cfg, isEnvConfig) { if (cfg.transpilerRuntime === false) loader._loader.loadedTranspilerRuntime = true; - if (cfg.production) - setProduction.call(loader, true); + if ('production' in cfg) + setProduction.call(loader, cfg.production); if (!isEnvConfig) { // if using nodeConfig / browserConfig / productionConfig, take baseURL from there diff --git a/lib/package.js b/lib/package.js index 5e3498fb8..02669f3a9 100644 --- a/lib/package.js +++ b/lib/package.js @@ -26,7 +26,8 @@ * * // environment-specific map configurations * './index.js': { - * '~browser': './index-node.js' + * '~browser': './index-node.js', + * './custom-condition.js|~export': './index-custom.js' * } * }, * // allows for setting package-prefixed depCache @@ -284,17 +285,27 @@ if (loader.builder) return Promise.resolve(pkgName + '/#:' + path); + // we load all conditions upfront + var conditionPromises = []; + var conditions = []; + for (var e in mapped) { + var c = parseCondition(e); + conditions.push({ + condition: c, + map: mapped[e] + }); + conditionPromises.push(loader['import'](c.module, pkgName)); + } + // map object -> conditional map - return loader['import'](pkg.map['@env'] || '@system-env', pkgName) - .then(function(env) { + return Promise.all(conditionPromises) + .then(function(conditionValues) { // first map condition to match is used - for (var e in mapped) { - var negate = e[0] == '~'; - - var value = readMemberExpression(negate ? e.substr(1) : e, env); - - if (!negate && value || negate && !value) - return mapped[e]; + for (var i = 0; i < conditions.length; i++) { + var c = conditions[i].condition; + var value = readMemberExpression(c.prop, conditionValues[i]); + if (!c.negate && value || c.negate && !value) + return conditions[i].map; } }) .then(function(mapped) {