This repository has been archived by the owner on Oct 9, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 122
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
upgraded register transformer to babel transform-system-register
- Loading branch information
Showing
6 changed files
with
38 additions
and
120 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
}); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"} |
Oops, something went wrong.