Skip to content

Commit 77ecb69

Browse files
Merge pull request #1 from angular-libs/source_map_config
Source map config
2 parents a1799db + a00a6c6 commit 77ecb69

File tree

19 files changed

+13339
-59
lines changed

19 files changed

+13339
-59
lines changed

.jshintrc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
"unused": true,
1313
"globals": {
1414
"angular": false,
15-
"moment":false
15+
"moment":false,
16+
"jQuery": true,
17+
"$": true
1618
}
1719
}

Gruntfile.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,14 @@ module.exports = function (grunt) {
223223
app: {
224224
src: ['<%= yeoman.app %>/index.html'],
225225
exclude: ['bower_components/source-map/source-map.js'],
226-
include: ['bower_components/source-map/dist/source-map.js'],
227-
ignorePath: /\.\.\//
226+
//include: ['bower_components/source-map/dist/source-map.js'],
227+
ignorePath: /\.\.\//,
228+
onMainNotFound: function(pkg) {
229+
console.log(pkg);
230+
},
231+
overrides: {
232+
"source-map": "bower_components/source-map/dist/source-map.js"
233+
}
228234
}
229235
},
230236

app/index.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464

6565
<!-- build:js(.) scripts/vendor.js -->
6666
<!-- bower:js -->
67+
<script src="bower_components/jquery/dist/jquery.js"></script>
6768
<script src="bower_components/angular/angular.js"></script>
6869
<script src="bower_components/moment/moment.js"></script>
6970
<script src="bower_components/stackframe/stackframe.js"></script>
@@ -72,15 +73,21 @@
7273
<script src="bower_components/stacktrace-gps/dist/stacktrace-gps.js"></script>
7374
<script src="bower_components/stacktrace-js/dist/stacktrace.js"></script>
7475
<!-- endbower -->
76+
<script src="bower_components/source-map/dist/source-map.js"></script>
77+
7578
<!-- endbuild -->
7679

7780
<!-- build:js({.tmp,app}) scripts/ui.logger.js -->
78-
<script src="scripts/app.js"></script>
81+
82+
83+
<script src="scripts/app.js"></script>
7984
<script src="scripts/decorators/$log-decorator.js"></script>
8085
<script src="scripts/services/StackTrace.js"></script>
8186
<script src="scripts/services/logger-utils.js"></script>
8287
<script src="scripts/services/logger-levels.js"></script>
8388
<script src="scripts/services/logger.js"></script>
89+
<script src="scripts/services/source-map.js"></script>
90+
<script src="scripts/services/source-map-util.js"></script>
8491
<!-- endbuild -->
8592
</body>
8693
</html>

app/scripts/app.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@
1010
*/
1111
angular.module('ui.logger', []);
1212

13-
14-
/*angular.module('ui.logger').config(function(loggerProvider,StackTraceProvider){
13+
/*
14+
angular.module('ui.logger').config(function(loggerProvider){
1515
loggerProvider.setLevel('debug');
1616
loggerProvider.setInterceptor(function(data){
1717
console.log(data);
1818
});
1919
loggerProvider.disableConsoleLogging(true);
20-
StackTraceProvider.setOptions({a:1,b:2});
20+
//StackTraceProvider.setOptions({offline:true});
2121
});
22-
angular.module('ui.logger').run(function(logger){
22+
angular.module('ui.logger').run(function testRun(logger){
2323
var _logger=logger.getInstance();
2424
var _logger1=logger.getInstance('run');
2525
_logger.info(_logger===_logger1);
@@ -29,4 +29,5 @@ angular.module('ui.logger').run(function(logger){
2929
}catch(err){
3030
_logger.debug(err);
3131
}
32-
});*/
32+
});
33+
*/

app/scripts/services/StackTrace.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
window.StackTrace.$options=self.options;
1616
return window.StackTrace;
1717
}
18-
this.options={};
18+
this.options={
19+
offline:true
20+
};
1921
this.$get=Service;
2022
}
2123
function SetOptions(opts){

app/scripts/services/logger-utils.js

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Service in the ui.logger.
99
*/
1010
angular.module('ui.logger')
11-
.service('logUtils', function (StackTrace, $window,loggerLevels,$injector) {
11+
.service('logUtils', function (StackTrace, $window,loggerLevels,$injector,sourceMapUtil) {
1212
var $defaultLogger;
1313
function errback(err) {
1414
$defaultLogger.warn("Error server-side logging failed");
@@ -17,28 +17,36 @@ angular.module('ui.logger')
1717
function log(logger,exception) {
1818
var errorMessage = exception.toString();
1919
var eventLogDateTime = moment().format('LLL');
20-
20+
var $q;
2121
if(!(exception instanceof Error)){
22-
var $q=$injector.get('$q');
22+
$q=$injector.get('$q');
2323
return $q.resolve({
2424
name:logger.name,
2525
time:eventLogDateTime,
2626
url: $window.location.href,
2727
message: errorMessage
2828
});
2929
}else{
30+
$q=$injector.get('$q');
31+
3032
return StackTrace.fromError(exception,StackTrace.$options).then(function(stackframes){
31-
var stringifiedStack = stackframes.map(function(sf) {
32-
return sf.toString();
33-
}).join('\n');
34-
return {
35-
name:logger.name,
36-
time:eventLogDateTime,
37-
url: $window.location.href,
38-
message: errorMessage,
39-
stackframes: stringifiedStack//,
40-
//cause: ( cause || "")
41-
};
33+
var _promises=[];
34+
for(var a=0;a<stackframes.length;a++){
35+
_promises.push(sourceMapUtil.getOriginalLocation(stackframes[a]));
36+
}
37+
return $q.all(_promises).then(function(results){
38+
var stringifiedStack = results.map(function(sf) {
39+
return sf.toString();
40+
});//.join('\n');
41+
return {
42+
name:logger.name,
43+
time:eventLogDateTime,
44+
url: $window.location.href,
45+
message: errorMessage,
46+
stackframes: stringifiedStack
47+
};
48+
});
49+
4250
}).catch(errback);
4351
}
4452

app/scripts/services/logger.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
function SetDefaultName(name) {
2424
this._defaultName=name;
2525
}
26+
2627
function format() {
2728
var str = arguments[0];
2829
for (var i = 1; i < arguments.length; i++) {
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
'use strict';
2+
3+
/**
4+
* @ngdoc service
5+
* @name ui.logger.sourceMapUtil
6+
* @description
7+
* # sourceMapUtil
8+
* Factory in the ui.logger.
9+
*/
10+
(function(){
11+
function _findSourceMappingURL(source) {
12+
var m = /\/\/[#@] ?sourceMappingURL=([^\s'"]+)\s*$/.exec(source);
13+
if (m && m[1]) {
14+
return m[1];
15+
}
16+
}
17+
function Configure(options) {
18+
angular.extend(this.options,options);
19+
}
20+
function validURL(str) {
21+
var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
22+
return regexp.test(str);
23+
}
24+
//function format() {
25+
// var str = arguments[0];
26+
// for (var i = 1; i < arguments.length; i++) {
27+
// var regEx = new RegExp("\\{" + (i - 1) + "\\}", "gm");
28+
// str = str.replace(regEx, arguments[i]);
29+
// }
30+
// return str;
31+
//}
32+
function _findFunctionName(source, lineNumber) {
33+
// function {name}({args}) m[1]=name m[2]=args
34+
var reFunctionDeclaration = /function\s+([^(]*?)\s*\(([^)]*)\)/;
35+
// {name} = function ({args})
36+
var reFunctionExpression = /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*function\b/;
37+
// {name} = eval()
38+
var reFunctionEvaluation = /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*(?:eval|new Function)\b/;
39+
var lines = source.split('\n');
40+
41+
// Walk backwards in the source lines until we find the line which matches one of the patterns above
42+
var code = '', line, maxLines = Math.min(lineNumber, 20), m, commentPos;
43+
for (var i = 0; i < maxLines; ++i) {
44+
// lineNo is 1-based, source[] is 0-based
45+
line = lines[lineNumber - i - 1];
46+
if(line){
47+
commentPos = line.indexOf('//');
48+
if (commentPos >= 0) {
49+
line = line.substr(0, commentPos);
50+
}
51+
}
52+
53+
54+
if (line) {
55+
code = line + code;
56+
m = reFunctionExpression.exec(code);
57+
if (m && m[1]) {
58+
return m[1];
59+
}
60+
m = reFunctionDeclaration.exec(code);
61+
if (m && m[1]) {
62+
return m[1];
63+
}
64+
m = reFunctionEvaluation.exec(code);
65+
if (m && m[1]) {
66+
return m[1];
67+
}
68+
}
69+
}
70+
return undefined;
71+
}
72+
function Provider(sourceMap) {
73+
this.options={
74+
offline:true
75+
};
76+
var _self=this;
77+
function factory($injector) {
78+
var _cache={};
79+
function Service(){
80+
function getSourceFileUrl(url){
81+
var $q=$injector.get('$q');
82+
var def=$q.defer();
83+
$.ajax(url).then(function(content) {
84+
def.resolve(_findSourceMappingURL(content));
85+
}).fail(function(error) {
86+
def.reject(error);
87+
});
88+
return def.promise;
89+
}
90+
function getOriginalLocation(stack){
91+
var $q=$injector.get('$q');
92+
var url=stack.fileName;
93+
var def=$q.defer();
94+
if(!_self.options.offline){
95+
def.resolve(stack);
96+
return;
97+
}
98+
//check if map exist in cache for the file else get the map and update the cache
99+
if(!_cache[url]){
100+
_cache[url]={
101+
exist:false,
102+
_map:{},
103+
_file:''
104+
};
105+
getSourceFileUrl(url).then(function(mapUrl){
106+
if(mapUrl && !validURL(mapUrl)){
107+
mapUrl=url.substring(0,url.lastIndexOf('/')+1)+mapUrl;
108+
}
109+
$.getJSON(mapUrl, function(map) {
110+
_cache[url].exist=true;
111+
_cache[url]._map=new sourceMap.SourceMapConsumer(map);
112+
var loc=_cache[url]._map.originalPositionFor({
113+
line: stack.lineNumber,
114+
column: stack.columnNumber
115+
});
116+
if(_cache[url]._file){
117+
loc.name=_findFunctionName(_cache[url]._file,loc.line, loc.column);
118+
_stack=new window.StackFrame(loc.name, stack.args, loc.source, loc.line, loc.column);
119+
def.resolve(_stack);
120+
}else{
121+
var sourceFileUlr=url.substring(0,url.lastIndexOf('/')+1)+loc.source;
122+
$.ajax(sourceFileUlr).then(function(content) {
123+
_cache[url]._file=content;
124+
loc.name=_findFunctionName(_cache[url]._file,loc.line, loc.column);
125+
_stack=new window.StackFrame(loc.name, stack.args, loc.source, loc.line, loc.column);
126+
def.resolve(_stack);
127+
}).fail(function() {
128+
_cache[url]._file=null;
129+
def.resolve(stack);
130+
});
131+
}
132+
133+
134+
}).fail(function() {
135+
_cache[url].exist=false;
136+
_cache[url]._map=null;
137+
def.resolve(stack);
138+
});
139+
},function(){
140+
_cache[url].exist=false;
141+
_cache[url]._map=null;
142+
def.resolve(stack);
143+
});
144+
145+
}else{
146+
if(_cache[url].exist){
147+
//read map and return stack from source
148+
var _stack=_cache[url]._map.originalPositionFor(stack);
149+
def.resolve(_stack);
150+
}else{
151+
def.resolve(stack);
152+
}
153+
}
154+
return def.promise;
155+
}
156+
return {
157+
getOriginalLocation: getOriginalLocation
158+
};
159+
}
160+
return new Service();
161+
}
162+
// Method for instantiating
163+
this.$get = ['$injector',factory];
164+
}
165+
166+
Provider.prototype.configure=Configure;
167+
angular.module('ui.logger').provider('sourceMapUtil',['sourceMap',Provider]);
168+
})();

app/scripts/services/source-map.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
'use strict';
2+
3+
/**
4+
* @ngdoc service
5+
* @name ui.logger.sourceMap
6+
* @description
7+
* # sourceMap
8+
* Constant in the ui.logger.
9+
*/
10+
angular.module('ui.logger').constant('sourceMap', window.sourceMap);

bower.json

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
"dependencies": {
55
"angular": "^1.4.0",
66
"moment": "~2.10.6",
7-
"stacktrace-js": "~1.0.1"
7+
"stacktrace-js": "~1.0.1",
8+
"source-map": "mozilla/source-map#0.5.1",
9+
"jquery": "~2.2.0"
810
},
9-
"main": ["dist/scripts/ui.logger.js"],
11+
"main": [
12+
"dist/scripts/ui.logger.js"
13+
],
1014
"devDependencies": {
1115
"angular-mocks": "^1.4.0"
1216
},
@@ -20,7 +24,9 @@
2024
},
2125
"description": "ui-logger for angular js",
2226
"keywords": [
23-
"ui-logger","front-end-logger","angularjs-logger",
27+
"ui-logger",
28+
"front-end-logger",
29+
"angularjs-logger",
2430
"angularjs",
2531
"logger"
2632
],

0 commit comments

Comments
 (0)