UNPKG

2.28 kBJavaScriptView Raw
1var traceur = require('traceur');
2
3var traceurGet = require('./utils').traceurGet;
4
5var ParseTreeTransformer = traceurGet('codegeneration/ParseTreeTransformer.js').ParseTreeTransformer;
6
7var getCanonicalName = require('./utils').getCanonicalName;
8
9var Promise = require('bluebird');
10
11function DeferredImportsTransformer(map) {
12 this.imports = [];
13 return ParseTreeTransformer.apply(this, arguments);
14}
15
16DeferredImportsTransformer.prototype = Object.create(ParseTreeTransformer.prototype);
17
18DeferredImportsTransformer.prototype.transformCallExpression = function(tree) {
19 tree = ParseTreeTransformer.prototype.transformCallExpression.call(this, tree);
20
21 if (tree.operand.type == 'MEMBER_EXPRESSION'
22 && tree.operand.memberName.value == 'import'
23 && tree.operand.operand.type == 'IDENTIFIER_EXPRESSION'
24 && tree.operand.operand.identifierToken.value == 'System'
25 && tree.args.args.length == 1) {
26
27 if (tree.args.args[0].type === 'LITERAL_EXPRESSION')
28 this.imports.push(tree.args.args[0].literalToken.processedValue);
29 }
30
31 return tree;
32}
33
34module.exports = function(builder, trace) {
35 var deferredImports = [];
36
37 return Promise.all(Object.keys(trace).map(function(name) {
38 var load = trace[name];
39
40 if (load.deferredImports) {
41 deferredImports = deferredImports.concat(load.deferredImports);
42 return;
43 }
44
45 var curDeferredImports = [];
46
47 if (!load || load.conditional)
48 return;
49
50 var compiler = new traceur.Compiler({ script: load.metadata.format !== 'esm' });
51
52 var tree = compiler.parse(load.source, load.path);
53
54 var transformer = new DeferredImportsTransformer();
55
56 tree = transformer.transformAny(tree);
57
58 return Promise.all(transformer.imports.map(function(impt) {
59 return builder.loader.normalize(impt)
60 .then(function(moduleName) {
61 var canonical = getCanonicalName(builder.loader, moduleName);
62
63 curDeferredImports.push({
64 name: canonical,
65 parent: name
66 });
67 });
68 }))
69 .then(function() {
70 // store on the load record itself to allow caching
71 load.deferredImports = curDeferredImports;
72 deferredImports = deferredImports.concat(curDeferredImports);
73 });
74 }))
75 .then(function() {
76 return deferredImports;
77 });
78};
\No newline at end of file