Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .jshintrc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
"unused": true,
"globals": {
"angular": false,
"moment":false
"moment":false,
"jQuery": true,
"$": true
}
}
10 changes: 8 additions & 2 deletions Gruntfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,14 @@ module.exports = function (grunt) {
app: {
src: ['<%= yeoman.app %>/index.html'],
exclude: ['bower_components/source-map/source-map.js'],
include: ['bower_components/source-map/dist/source-map.js'],
ignorePath: /\.\.\//
//include: ['bower_components/source-map/dist/source-map.js'],
ignorePath: /\.\.\//,
onMainNotFound: function(pkg) {
console.log(pkg);
},
overrides: {
"source-map": "bower_components/source-map/dist/source-map.js"
}
}
},

Expand Down
9 changes: 8 additions & 1 deletion app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@

<!-- build:js(.) scripts/vendor.js -->
<!-- bower:js -->
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/angular/angular.js"></script>
<script src="bower_components/moment/moment.js"></script>
<script src="bower_components/stackframe/stackframe.js"></script>
Expand All @@ -72,15 +73,21 @@
<script src="bower_components/stacktrace-gps/dist/stacktrace-gps.js"></script>
<script src="bower_components/stacktrace-js/dist/stacktrace.js"></script>
<!-- endbower -->
<script src="bower_components/source-map/dist/source-map.js"></script>

<!-- endbuild -->

<!-- build:js({.tmp,app}) scripts/ui.logger.js -->
<script src="scripts/app.js"></script>


<script src="scripts/app.js"></script>
<script src="scripts/decorators/$log-decorator.js"></script>
<script src="scripts/services/StackTrace.js"></script>
<script src="scripts/services/logger-utils.js"></script>
<script src="scripts/services/logger-levels.js"></script>
<script src="scripts/services/logger.js"></script>
<script src="scripts/services/source-map.js"></script>
<script src="scripts/services/source-map-util.js"></script>
<!-- endbuild -->
</body>
</html>
11 changes: 6 additions & 5 deletions app/scripts/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@
*/
angular.module('ui.logger', []);


/*angular.module('ui.logger').config(function(loggerProvider,StackTraceProvider){
/*
angular.module('ui.logger').config(function(loggerProvider){
loggerProvider.setLevel('debug');
loggerProvider.setInterceptor(function(data){
console.log(data);
});
loggerProvider.disableConsoleLogging(true);
StackTraceProvider.setOptions({a:1,b:2});
//StackTraceProvider.setOptions({offline:true});
});
angular.module('ui.logger').run(function(logger){
angular.module('ui.logger').run(function testRun(logger){
var _logger=logger.getInstance();
var _logger1=logger.getInstance('run');
_logger.info(_logger===_logger1);
Expand All @@ -29,4 +29,5 @@ angular.module('ui.logger').run(function(logger){
}catch(err){
_logger.debug(err);
}
});*/
});
*/
4 changes: 3 additions & 1 deletion app/scripts/services/StackTrace.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@
window.StackTrace.$options=self.options;
return window.StackTrace;
}
this.options={};
this.options={
offline:true
};
this.$get=Service;
}
function SetOptions(opts){
Expand Down
36 changes: 22 additions & 14 deletions app/scripts/services/logger-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* Service in the ui.logger.
*/
angular.module('ui.logger')
.service('logUtils', function (StackTrace, $window,loggerLevels,$injector) {
.service('logUtils', function (StackTrace, $window,loggerLevels,$injector,sourceMapUtil) {
var $defaultLogger;
function errback(err) {
$defaultLogger.warn("Error server-side logging failed");
Expand All @@ -17,28 +17,36 @@ angular.module('ui.logger')
function log(logger,exception) {
var errorMessage = exception.toString();
var eventLogDateTime = moment().format('LLL');

var $q;
if(!(exception instanceof Error)){
var $q=$injector.get('$q');
$q=$injector.get('$q');
return $q.resolve({
name:logger.name,
time:eventLogDateTime,
url: $window.location.href,
message: errorMessage
});
}else{
$q=$injector.get('$q');

return StackTrace.fromError(exception,StackTrace.$options).then(function(stackframes){
var stringifiedStack = stackframes.map(function(sf) {
return sf.toString();
}).join('\n');
return {
name:logger.name,
time:eventLogDateTime,
url: $window.location.href,
message: errorMessage,
stackframes: stringifiedStack//,
//cause: ( cause || "")
};
var _promises=[];
for(var a=0;a<stackframes.length;a++){
_promises.push(sourceMapUtil.getOriginalLocation(stackframes[a]));
}
return $q.all(_promises).then(function(results){
var stringifiedStack = results.map(function(sf) {
return sf.toString();
});//.join('\n');
return {
name:logger.name,
time:eventLogDateTime,
url: $window.location.href,
message: errorMessage,
stackframes: stringifiedStack
};
});

}).catch(errback);
}

Expand Down
1 change: 1 addition & 0 deletions app/scripts/services/logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
function SetDefaultName(name) {
this._defaultName=name;
}

function format() {
var str = arguments[0];
for (var i = 1; i < arguments.length; i++) {
Expand Down
168 changes: 168 additions & 0 deletions app/scripts/services/source-map-util.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
'use strict';

/**
* @ngdoc service
* @name ui.logger.sourceMapUtil
* @description
* # sourceMapUtil
* Factory in the ui.logger.
*/
(function(){
function _findSourceMappingURL(source) {
var m = /\/\/[#@] ?sourceMappingURL=([^\s'"]+)\s*$/.exec(source);
if (m && m[1]) {
return m[1];
}
}
function Configure(options) {
angular.extend(this.options,options);
}
function validURL(str) {
var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
return regexp.test(str);
}
//function format() {
// var str = arguments[0];
// for (var i = 1; i < arguments.length; i++) {
// var regEx = new RegExp("\\{" + (i - 1) + "\\}", "gm");
// str = str.replace(regEx, arguments[i]);
// }
// return str;
//}
function _findFunctionName(source, lineNumber) {
// function {name}({args}) m[1]=name m[2]=args
var reFunctionDeclaration = /function\s+([^(]*?)\s*\(([^)]*)\)/;
// {name} = function ({args})
var reFunctionExpression = /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*function\b/;
// {name} = eval()
var reFunctionEvaluation = /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*(?:eval|new Function)\b/;
var lines = source.split('\n');

// Walk backwards in the source lines until we find the line which matches one of the patterns above
var code = '', line, maxLines = Math.min(lineNumber, 20), m, commentPos;
for (var i = 0; i < maxLines; ++i) {
// lineNo is 1-based, source[] is 0-based
line = lines[lineNumber - i - 1];
if(line){
commentPos = line.indexOf('//');
if (commentPos >= 0) {
line = line.substr(0, commentPos);
}
}


if (line) {
code = line + code;
m = reFunctionExpression.exec(code);
if (m && m[1]) {
return m[1];
}
m = reFunctionDeclaration.exec(code);
if (m && m[1]) {
return m[1];
}
m = reFunctionEvaluation.exec(code);
if (m && m[1]) {
return m[1];
}
}
}
return undefined;
}
function Provider(sourceMap) {
this.options={
offline:true
};
var _self=this;
function factory($injector) {
var _cache={};
function Service(){
function getSourceFileUrl(url){
var $q=$injector.get('$q');
var def=$q.defer();
$.ajax(url).then(function(content) {
def.resolve(_findSourceMappingURL(content));
}).fail(function(error) {
def.reject(error);
});
return def.promise;
}
function getOriginalLocation(stack){
var $q=$injector.get('$q');
var url=stack.fileName;
var def=$q.defer();
if(!_self.options.offline){
def.resolve(stack);
return;
}
//check if map exist in cache for the file else get the map and update the cache
if(!_cache[url]){
_cache[url]={
exist:false,
_map:{},
_file:''
};
getSourceFileUrl(url).then(function(mapUrl){
if(mapUrl && !validURL(mapUrl)){
mapUrl=url.substring(0,url.lastIndexOf('/')+1)+mapUrl;
}
$.getJSON(mapUrl, function(map) {
_cache[url].exist=true;
_cache[url]._map=new sourceMap.SourceMapConsumer(map);
var loc=_cache[url]._map.originalPositionFor({
line: stack.lineNumber,
column: stack.columnNumber
});
if(_cache[url]._file){
loc.name=_findFunctionName(_cache[url]._file,loc.line, loc.column);
_stack=new window.StackFrame(loc.name, stack.args, loc.source, loc.line, loc.column);
def.resolve(_stack);
}else{
var sourceFileUlr=url.substring(0,url.lastIndexOf('/')+1)+loc.source;
$.ajax(sourceFileUlr).then(function(content) {
_cache[url]._file=content;
loc.name=_findFunctionName(_cache[url]._file,loc.line, loc.column);
_stack=new window.StackFrame(loc.name, stack.args, loc.source, loc.line, loc.column);
def.resolve(_stack);
}).fail(function() {
_cache[url]._file=null;
def.resolve(stack);
});
}


}).fail(function() {
_cache[url].exist=false;
_cache[url]._map=null;
def.resolve(stack);
});
},function(){
_cache[url].exist=false;
_cache[url]._map=null;
def.resolve(stack);
});

}else{
if(_cache[url].exist){
//read map and return stack from source
var _stack=_cache[url]._map.originalPositionFor(stack);
def.resolve(_stack);
}else{
def.resolve(stack);
}
}
return def.promise;
}
return {
getOriginalLocation: getOriginalLocation
};
}
return new Service();
}
// Method for instantiating
this.$get = ['$injector',factory];
}

Provider.prototype.configure=Configure;
angular.module('ui.logger').provider('sourceMapUtil',['sourceMap',Provider]);
})();
10 changes: 10 additions & 0 deletions app/scripts/services/source-map.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
'use strict';

/**
* @ngdoc service
* @name ui.logger.sourceMap
* @description
* # sourceMap
* Constant in the ui.logger.
*/
angular.module('ui.logger').constant('sourceMap', window.sourceMap);
12 changes: 9 additions & 3 deletions bower.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,13 @@
"dependencies": {
"angular": "^1.4.0",
"moment": "~2.10.6",
"stacktrace-js": "~1.0.1"
"stacktrace-js": "~1.0.1",
"source-map": "mozilla/source-map#0.5.1",
"jquery": "~2.2.0"
},
"main": ["dist/scripts/ui.logger.js"],
"main": [
"dist/scripts/ui.logger.js"
],
"devDependencies": {
"angular-mocks": "^1.4.0"
},
Expand All @@ -20,7 +24,9 @@
},
"description": "ui-logger for angular js",
"keywords": [
"ui-logger","front-end-logger","angularjs-logger",
"ui-logger",
"front-end-logger",
"angularjs-logger",
"angularjs",
"logger"
],
Expand Down
Loading