-
Notifications
You must be signed in to change notification settings - Fork 0
/
CBLoadApplication.js
165 lines (122 loc) · 5.21 KB
/
CBLoadApplication.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/**
* Include this file so you can work on CBKit itself without having to rebuild
* it or have it watch your files, for example, if you don't have node.js.
*/
(function (window, document) {
var totalLineCount = 0;
var files = [];
function between(x, min, max) {
return x >= min && x <= max;
}
function injectDebugScript(source) {
var header = "data:text/javascript;charset=utf-8,";
var src = header + source;
var scriptElement = document.createElement("script");
scriptElement.type = "text/javascript";//"text/x-javascript-debug";
scriptElement.text = source;
//scriptElement.src = src;
var headElement = document.getElementsByTagName("head")[0];
headElement && headElement.appendChild(scriptElement);
return src;
}
function CBImport(filePath) {
var pathname = window.location.pathname;
var currentPath = CBImport.currentPath || location.origin + pathname.substring(0, pathname.lastIndexOf('/')) + "/";
var fullPath = currentPath + filePath;
if (CBImport[fullPath]) {
return '';
}
// @TODO add support for stupid IE...
var request = new XMLHttpRequest();
request.open("GET", fullPath, false);
request.send(null);
// Check for 200 status for HTTP, but also catch if responseText
// contains anything for local file:// access that return zero status
if (request.status !== 200 && !request.responseText) {
throw new Error("Importing file failed: " + filePath + " with status code: " + request.status);
}
//totalLineCount;
var sourceCode = request.responseText;
var lineCount = sourceCode.match(/(\r\n|\n|\r)/gm).length + 1;
var startLineNumber = totalLineCount;
totalLineCount += lineCount;
files.push({
path: filePath,
lines: lineCount,
start: startLineNumber,
end: totalLineCount
});
var oldPath = CBImport.currentPath;
CBImport.currentPath = fullPath.split("/").slice(0, -1).join("/") + "/";
var exp = /.*CBImport\s*\(\s*['|"]([a-zA-Z0-9_\.\-\/]*)['|"]\s*\)\s*;?/g;
var preprocessedCode = sourceCode.replace(exp, function (match, filePath) {
if ( !match.match(/\s*\/\//) ) {
return CBImport(filePath);
}
return match;
});
CBImport.currentPath = oldPath;
CBImport[fullPath] = true;
return preprocessedCode;
}
function shimError(msg, lineNumber) {
console.log(totalLineCount, lineNumber);
var file;
for (var i = 0, l = files.length; i < l; i++) {
file = files[i];
if ( between(lineNumber, file.start, file.end) ) {
console.log(file.path, lineNumber-file.start, file.start, file.lines);
break;
}
}
var err = TypeError(msg);
console.log('adsf', err, err.stack);
err.sourceURL = "file:///Users/jayphelps/Projects/cowbell/src/" + file.path;
err.fileName = "http://localhost/test/todos/" + file.path;
err.lineNumber = 346;
err.line = 346;
err.column = 10;
throw err;
//throw Error("ADSF");
}
function CBLoadApplication(filePath) {
var pathname = window.location.pathname;
var currentPath = CBImport.currentPath || location.origin + pathname.substring(0, pathname.lastIndexOf('/')) + "/";
var fullPath = currentPath + filePath;
fucker = fullPath;
var preprocessedCode = CBImport(filePath);
// We inject a script tag with a bogus type so we can reference the
// correct line if an exception is thrown during eval. A neat trick
// I figured out playing around. Likely only works in WebKit though.
//var debugSrc = injectDebugScript(preprocessedCode);
//console.log(preprocessedCode + "\n//@ sourceURL=" + "fuck.js")
//console.log(files.length, files);
window.onerror = function (msg, path, lineNumber) {
window.onerror = null;
setTimeout(function () {
shimError(msg, lineNumber);
}, 0);
return true;
};
try {
// So we eval in the global context
//document.write(preprocessedCode);
eval(preprocessedCode + "//@ sourceURL=" + fullPath);
//eval("(function () { function foo() { bar } bar()})();");
} catch (e) {
// In some browsers (WebKit at least) syntax errors show this file
// and the actual eval line as the error, and setting the sourceURL
// doesn't work, so we'll generate our own generic error instead
if (e.name === "SyntaxError") {
var err = Error(e.message);
err.name = "CBImport SyntaxError";
err.sourceURL = "fuck.js";
throw err;
}
// This is so the correct file is shown in WebKit debuggers. Neat eh?
e.sourceURL = fullPath;
throw e;
}
}
window.CBLoadApplication = CBLoadApplication;
})(window, document);