-
Notifications
You must be signed in to change notification settings - Fork 0
/
module-server.js
123 lines (114 loc) · 3.49 KB
/
module-server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
* Copyright 2012 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var path = require('path');
var fs = require('fs');
function JsModuleFile(pathPrefix, name, onSource, onSourceMap) {
var self = this;
self.filename = path.join(pathPrefix, name + '.js');
self.js = null;
self.map = null;
fs.readFile(this.filename, 'utf8', function(err, data) {
if (err) {
return onSource(err);
}
self.js = data;
onSource(null, self);
});
fs.readFile(this.filename + '.map', 'utf8', function(err, data) {
if (err) {
return onSourceMap(err);
}
self.map = data;
onSourceMap(null, self);
});
}
JsModuleFile.prototype.getNumberOfLines = function() {
return this.js.split(/\n/).length;
};
JsModuleFile.prototype.getMap = function() {
// Return a fresh copy every time.
return JSON.parse(this.map);
};
function makeServer(graph, modules) {
return function(moduleNames, excludeNames, onJs, options) {
options = options || {};
var debug = options.debug;
var log = options.onLog || function() {};
var createSourceMap = !!options.createSourceMap;
log('Module request', moduleNames, excludeNames);
try {
var names = graph.getModules(moduleNames, excludeNames);
} catch(e) {
return onJs(e)
}
log('Serving modules', names);
var js = '';
var lineNumber = 1;
var sourceMapSections = createSourceMap ? [] : null;
for (var i = 0; i < names.length; i++) {
var name = names[i];
if (debug) {
js += '/* Module: ' + name + ' */\n';
lineNumber++;
}
var file = modules[name];
js += file.js + '\n';
js += 'ModuleServer.m.' + name + '=' + name + ';\n';
if (createSourceMap) {
var map = file.getMap();
map.sourceRoot = options.sourceMapSourceRootUrlPrefix;
sourceMapSections.push({
offset: {
line: lineNumber,
column: 0, // That is why we always add an extra line.
},
map: map
});
lineNumber = lineNumber + file.getNumberOfLines()
+ 1 // The ModuleServer.m… line;
}
}
var sourceMap = createSourceMap ? {
version: 3,
file: "just-the-container.js",
sections: sourceMapSections
} : null;
onJs(null, js.length, js, sourceMap);
}
};
exports.from = function(pathPrefix, graphFilename, initCompleteCb) {
require('./module-graph').fromFilename(graphFilename, function(err, graph) {
if (err) {
return initCompleteCb(err);
}
var modules = {};
var allModules = graph.getAllModules();
allModules.forEach(function(name) {
modules[name] = new JsModuleFile(pathPrefix, name, onFile, onFile);
});
var fn = makeServer(graph, modules);
fn.NotFoundException = graph.NotFoundException;
var loaded = 0;
function onFile(err) {
if (err) {
return initCompleteCb(err);
}
if (++loaded == allModules.length * 2) {
initCompleteCb(null, fn);
}
}
});
}