Skip to content
This repository has been archived by the owner on Oct 9, 2020. It is now read-only.

Commit

Permalink
complete package conditionals upgrade
Browse files Browse the repository at this point in the history
  • Loading branch information
guybedford committed May 14, 2016
1 parent 88b4b28 commit 61c5e21
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 19 deletions.
37 changes: 19 additions & 18 deletions lib/trace.js
Expand Up @@ -10,6 +10,8 @@ var Promise = require('bluebird');
var getPackage = require('./utils').getPackage;
var getPackageConfigPath = require('./utils').getPackageConfigPath;
var isPackageConfig = require('./utils').isPackageConfig;
var parseCondition = require('./utils').parseCondition;
var serializeCondition = require('./utils').serializeCondition;

module.exports = Trace;

Expand Down Expand Up @@ -135,7 +137,7 @@ Trace.prototype.getLoadRecord = function(canonical, excludeURLs, parentStack) {
// boolean conditional
var booleanIndex = canonical.lastIndexOf('#?');
if (booleanIndex != -1) {
var condition = canonical.substr(booleanIndex + 2)
var condition = canonical.substr(booleanIndex + 2);
if (condition.indexOf('|') == -1)
condition += '|default';
return {
Expand Down Expand Up @@ -261,23 +263,22 @@ Trace.prototype.getLoadRecord = function(canonical, excludeURLs, parentStack) {
})
.then(function(fallback) {
// environment trace
return loader.normalize(pkg.map['@env'] || '@system-env')
.then(function(normalizedCondition) {
var conditionModule = getCanonicalName(loader, normalizedCondition);

return Promise.all(Object.keys(envMap).map(function(envCondition) {
var mapping = envMap[envCondition];
var negate = envCondition[0] == '~';

return toPackagePath(mapping, false)
.then(function(normalizedMapping) {
return {
condition: (negate ? '~' : '') + conditionModule + '|' + (negate ? envCondition.substr(1) : envCondition),
branch: getCanonicalName(loader, normalizedMapping)
};
});
}));
})
return Promise.all(Object.keys(envMap).map(function(envCondition) {
var mapping = envMap[envCondition];
var conditionObj = parseCondition(envCondition);

return loader.normalize(conditionObj.module, normalizedPkgName)
.then(function(conditionModule) {
conditionObj.module = getCanonicalName(loader, conditionModule);
return toPackagePath(mapping, false);
})
.then(function(normalizedMapping) {
return {
condition: serializeCondition(conditionObj),
branch: getCanonicalName(loader, normalizedMapping)
};
});
}))
.then(function(envs) {
return {
name: canonical,
Expand Down
40 changes: 40 additions & 0 deletions lib/utils.js
Expand Up @@ -327,4 +327,44 @@ function normalizePath(loader, path, skipExtension) {
return normalized;
}

var sysConditions = ['browser', 'node', 'dev', 'production', 'default'];

exports.parseCondition = parseCondition;
function parseCondition(condition) {
var conditionExport, conditionModule, negation;

var negation = condition[0] == '~';
var conditionExportIndex = condition.lastIndexOf('|');
if (conditionExportIndex != -1) {
conditionExport = condition.substr(conditionExportIndex + 1);
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 = 'default';
conditionModule = condition.substr(negation);
if (sysConditions.indexOf(conditionModule) != -1) {
conditionExport = conditionModule;
conditionModule = '@system-env';
}
}

return {
module: conditionModule,
prop: conditionExport,
negate: negation
};
}

exports.serializeCondition = serializeCondition;
function serializeCondition(conditionObj) {
return conditionObj.module + '|' + (conditionObj.negate ? '~' : '') + conditionObj.prop;
}

2 changes: 1 addition & 1 deletion test/conditional-builds.js
Expand Up @@ -20,7 +20,7 @@ suite('Conditional Builds', function() {
});

test('Boolean conditional', function() {
return builder.trace('interpolated-1.js#?|browser')
return builder.trace('interpolated-1.js#?browser')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['interpolated-1.js#?@system-env|browser', 'interpolated-1.js', 'interpolate-1-dep.js'].sort());
});
Expand Down

0 comments on commit 61c5e21

Please sign in to comment.