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

Commit

Permalink
upgraded register transformer to babel transform-system-register
Browse files Browse the repository at this point in the history
  • Loading branch information
asapach committed Jul 23, 2016
1 parent cb94933 commit b474ee7
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 120 deletions.
146 changes: 32 additions & 114 deletions compilers/register.js
Original file line number Diff line number Diff line change
@@ -1,121 +1,39 @@
var traceur = require('traceur');
var traceurGet = require('../lib/utils').traceurGet;
var path = require('path');
var babel = require('babel-core');

var ParseTreeTransformer = traceurGet('codegeneration/ParseTreeTransformer.js').ParseTreeTransformer;
var CallExpression = traceurGet('syntax/trees/ParseTrees.js').CallExpression;
var ArgumentList = traceurGet('syntax/trees/ParseTrees.js').ArgumentList;
var ArrayLiteral = traceurGet('syntax/trees/ParseTrees.js').ArrayLiteral;
var createStringLiteral = traceurGet('codegeneration/ParseTreeFactory.js').createStringLiteral;
var parseExpression = traceurGet('codegeneration/PlaceholderParser.js').parseExpression;
var FunctionBody = traceurGet('syntax/trees/ParseTrees.js').FunctionBody;

// converts anonymous System.register([] into named System.register('name', [], ...
// NB need to add that if no anon, last named must define this module
// also this should be rewritten with a proper parser!
function RegisterTransformer(moduleName, map, systemGlobal) {
this.name = moduleName;
this.hasAnonRegister = false;
this.map = map;
this.systemOperand = parseExpression([systemGlobal + '.register']);
this.usesModuleName = false;
return ParseTreeTransformer.call(this);
function pathToUrl(p) {
return p.replace(/\\/g, '/');
}

RegisterTransformer.prototype = Object.create(ParseTreeTransformer.prototype);
RegisterTransformer.prototype.transformCallExpression = function(tree) {
tree = ParseTreeTransformer.prototype.transformCallExpression.call(this, tree);

if (tree.operand.type == 'MEMBER_EXPRESSION'
&& tree.operand.memberName.value == 'register'
&& tree.operand.operand.type == 'IDENTIFIER_EXPRESSION'
&& tree.operand.operand.identifierToken.value == 'System'
&& tree.args) {

var firstArg = tree.args.args[0];

var declare;
if (firstArg.type == 'ARRAY_LITERAL')
declare = tree.args.args[1];
else
declare = tree.args.args[2];

// contains a __moduleName reference, while System.register declare function doesn't have a __moduleName argument
// so add it
// this is backwards compatibility for https://github.com/systemjs/builder/issues/416
if (this.usesModuleName && declare && declare.parameterList && declare.parameterList.parameters.length == 1) {
var newDeclare = parseExpression(['function() {}']);
newDeclare.location = declare.location;
newDeclare.body = new FunctionBody(declare.body.location, declare.body.statements);
newDeclare.parameterList.parameters.push(declare.parameterList.parameters[0]);
newDeclare.parameterList.parameters.push(parseExpression(['__moduleName']));
declare = newDeclare;
}

// System.register(deps, declare)
if (firstArg.type == 'ARRAY_LITERAL') {

if (this.hasAnonRegister) {
throw 'Source ' + this.name + ' has multiple anonymous System.register calls.';
}

// normalize dependencies in array
// NB add metadata.deps here too
var map = this.map;
var normalizedDepArray = new ArrayLiteral(firstArg.location, firstArg.elements.map(function(el) {
var str = el.literalToken.value.toString();
return createStringLiteral(map(str.substr(1, str.length - 2)));
}));

this.hasAnonRegister = true;

var newArgs = this.name ? [createStringLiteral(this.name), normalizedDepArray, declare] : [normalizedDepArray, declare];

return new CallExpression(tree.location, this.systemOperand, new ArgumentList(tree.args.location, newArgs));
}
// System.register(name, deps, declare)
else {
var args = tree.args.args.concat([]);
args.splice(2, 1, declare);
return new CallExpression(tree.location, this.systemOperand, args);
}
}

return tree;
};
RegisterTransformer.prototype.transformIdentifierExpression = function(tree) {
if (tree.identifierToken.value == '__moduleName')
this.usesModuleName = true;
return ParseTreeTransformer.prototype.transformIdentifierExpression.call(this, tree);
};

exports.compile = function(load, opts, loader) {
var options = { script: true, sourceRoot: true };

if (opts.sourceMaps)
options.sourceMaps = 'memory';
if (opts.lowResSourceMaps)
options.lowResolutionSourceMap = true;

if (load.metadata.sourceMap)
options.inputSourceMap = load.metadata.sourceMap;

var compiler = new traceur.Compiler(options);
var tree = compiler.parse(load.source, load.path);

var transformer = new RegisterTransformer(!opts.anonymous && load.name, function(dep) { return opts.normalize ? load.depMap[dep] : dep; }, opts.systemGlobal);
tree = transformer.transformAny(tree);

// if the transformer didn't find an anonymous System.register
// then this is a bundle itself
// so we need to reconstruct files with load.metadata.execute etc
// if this comes up, we can tackle it or work around it
if (!transformer.hasAnonRegister)
throw new TypeError('Source ' + load.path + ' is already a bundle file, so can\'t be built as a module.');

var output = compiler.write(tree, load.path);
exports.compile = function (load, opts, loader) {
var sourceRoot = pathToUrl(path.dirname(load.path) + '/');
var options = {
babelrc: false,
filename: pathToUrl(load.path),
filenameRelative: path.basename(load.path),
inputSourceMap: load.metadata.sourceMap,
sourceFileName: path.basename(load.path),
sourceMaps: opts.sourceMaps,
sourceRoot: sourceRoot,
plugins: [
['transform-system-register', {
moduleName: !opts.anonymous && load.name,
map: function (dep) {
return opts.normalize ? load.depMap[dep] : dep;
},
systemGlobal: opts.systemGlobal
}]
]
};

var output = babel.transform(load.source, options);

var sourceMap = output.map;
if (sourceMap && !sourceMap.sourceRoot) // if input source map doesn't have sourceRoot - add it
sourceMap.sourceRoot = sourceRoot;

return Promise.resolve({
source: output,
sourceMap: compiler.getSourceMap()
source: output.code,
sourceMap: sourceMap
});
};
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"dependencies": {
"babel-core": "^6.9.0",
"babel-plugin-transform-es2015-modules-systemjs": "^6.6.5",
"babel-plugin-transform-system-register": "0.0.1",
"bluebird": "^3.3.4",
"data-uri-to-buffer": "0.0.4",
"es6-template-strings": "^2.0.0",
Expand Down
2 changes: 1 addition & 1 deletion test/anon-compile.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ suite('Anonymous Compilation', function() {

test('Register', function(done) {
builder.compile('third.js').then(function(output) {
assert.match(output.source, /System\.register\(\["\.\/second.js"\]/);
assert.match(output.source, /System\.register\(\['\.\/second.js'\]/);
})
.then(done, done);
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"version":3,"sources":["test/fixtures/test-tree/third.js","test/fixtures/test-tree/cjs.js","test/fixtures/test-tree/second.js","test/fixtures/test-tree/jquery.js","test/fixtures/test-tree/global.js","test/fixtures/test-tree/some.js","test/fixtures/test-tree/text.txt","test/fixtures/test-tree/amd.js","test/fixtures/test-tree/component.jsx","test/fixtures/test-tree/file.json","test/fixtures/test-tree/first.js"],"names":[],"mappings":"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","file":"output.js"}
{"version":3,"sources":["test/fixtures/test-tree/third.js","test/fixtures/test-tree/cjs.js","test/fixtures/test-tree/second.js","test/fixtures/test-tree/jquery.js","test/fixtures/test-tree/global.js","test/fixtures/test-tree/some.js","test/fixtures/test-tree/text.txt","test/fixtures/test-tree/amd.js","test/fixtures/test-tree/unknown","test/fixtures/test-tree/file.json","test/fixtures/test-tree/first.js"],"names":[],"mappings":"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","file":"output.js"}

0 comments on commit b474ee7

Please sign in to comment.