diff --git a/.travis.yml b/.travis.yml
index 6830f42aa67b..a678cd782dcb 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,12 @@
sudo: false
language: node_js
node_js:
- - "4"
+ - "8"
+dist: trusty
+addons:
+ chrome: stable
+cache:
+ directories:
+ - node_modules
script:
- - npm test
+ - npm test
diff --git a/Gruntfile.js b/Gruntfile.js
index 027e44d923d1..9945fe2ff6ab 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,7 +1,6 @@
'use strict';
module.exports = function(grunt) {
- var _ = require('lodash');
var path = require('path');
var os = require('os');
var through = require('through2');
@@ -14,7 +13,7 @@ module.exports = function(grunt) {
var plugins = grunt.option('plugins');
// Create plugin paths and verify they exist
- plugins = _.map(plugins ? plugins.split(',') : [], function(plugin) {
+ plugins = (plugins ? plugins.split(',') : []).map(function(plugin) {
var p = 'plugins/' + plugin + '.js';
if (!grunt.file.exists(p))
@@ -51,12 +50,12 @@ module.exports = function(grunt) {
}
};
- var excluded = _.map(excludedPlugins, function(plugin) {
+ var excluded = excludedPlugins.map(function(plugin) {
return 'plugins/' + plugin + '.js';
});
// Remove the plugins that we don't want to build
- a = _.filter(a, function(n) {
+ a = a.filter(function(n) {
return excluded.indexOf(n) === -1;
});
@@ -88,21 +87,17 @@ module.exports = function(grunt) {
});
var pluginCombinations = combine(plugins);
- var pluginConcatFiles = _.reduce(
- pluginCombinations,
- function(dict, comb) {
- var key = _.map(comb, function(plugin) {
- return path.basename(plugin, '.js');
- });
- key.sort();
+ var pluginConcatFiles = pluginCombinations.reduce(function(dict, comb) {
+ var key = comb.map(function(plugin) {
+ return path.basename(plugin, '.js');
+ });
+ key.sort();
- var dest = path.join('build/', key.join(','), '/raven.js');
- dict[dest] = ['src/singleton.js'].concat(comb);
+ var dest = path.join('build/', key.join(','), '/raven.js');
+ dict[dest] = ['src/singleton.js'].concat(comb);
- return dict;
- },
- {}
- );
+ return dict;
+ }, {});
var browserifyConfig = {
options: {
@@ -202,30 +197,6 @@ module.exports = function(grunt) {
}
},
- eslint: {
- target: ['.']
- },
-
- mocha: {
- options: {
- mocha: {
- ignoreLeaks: true,
- grep: grunt.option('grep')
- },
- log: true,
- reporter: 'Dot',
- run: true
- },
- unit: {
- src: ['test/index.html'],
- nonull: true
- },
- integration: {
- src: ['test/integration/index.html'],
- nonull: true
- }
- },
-
release: {
options: {
npm: false,
@@ -338,12 +309,10 @@ module.exports = function(grunt) {
// 3rd party Grunt tasks
grunt.loadNpmTasks('grunt-browserify');
- grunt.loadNpmTasks('grunt-mocha');
grunt.loadNpmTasks('grunt-release');
grunt.loadNpmTasks('grunt-s3');
grunt.loadNpmTasks('grunt-gitinfo');
grunt.loadNpmTasks('grunt-sri');
- grunt.loadNpmTasks('grunt-eslint');
// Build tasks
grunt.registerTask('_prep', ['clean', 'gitinfo', 'version']);
@@ -355,7 +324,7 @@ module.exports = function(grunt) {
'_prep',
'browserify:plugins-combined'
]);
- grunt.registerTask('build.test', ['_prep', 'browserify:test']);
+ grunt.registerTask('build.test', ['_prep', 'browserify.core', 'browserify:test']);
grunt.registerTask('build.core', ['browserify.core', 'uglify', 'sri:dist']);
grunt.registerTask('build.plugins-combined', [
'browserify.plugins-combined',
@@ -366,13 +335,9 @@ module.exports = function(grunt) {
grunt.registerTask('build', ['build.plugins-combined']);
grunt.registerTask('dist', ['build.core', 'copy:dist']);
- // Test task
- grunt.registerTask('test', ['eslint', 'browserify.core', 'browserify:test', 'mocha']);
-
// Webserver tasks
grunt.registerTask('run:test', ['connect:test']);
grunt.registerTask('run:docs', ['connect:docs']);
- grunt.registerTask('publish', ['test', 'build.plugins-combined', 's3']);
- grunt.registerTask('default', ['test']);
+ grunt.registerTask('publish', ['build.plugins-combined', 's3']);
};
diff --git a/package.json b/package.json
index 73093fd3ab9c..8918ca22de03 100644
--- a/package.json
+++ b/package.json
@@ -17,9 +17,11 @@
"scripts": {
"lint": "eslint .",
"precommit": "lint-staged",
- "pretest": "npm install",
- "test": "grunt test && npm run-script test-typescript",
- "test-typescript": "node_modules/typescript/bin/tsc --noEmit --noImplicitAny typescript/raven-tests.ts"
+ "publish": "npm run test && grunt publish",
+ "test": "npm run lint && grunt build.test && npm run test:unit && npm run test:integration && npm run test:typescript",
+ "test:unit": "mocha-chrome test/index.html",
+ "test:integration": "mocha-chrome test/integration/index.html --chrome-flags '[\"--disable-web-security\"]' --ignore-resource-errors --ignore-exceptions",
+ "test:typescript": "tsc --noEmit --noImplicitAny typescript/raven-tests.ts"
},
"devDependencies": {
"bluebird": "^3.4.1",
@@ -28,27 +30,23 @@
"chai": "2.3.0",
"derequire": "2.0.3",
"es6-promise": "^4.0.5",
+ "eslint": "^4.6.1",
"eslint-config-prettier": "^2.3.0",
"grunt": "^0.4.5",
"grunt-browserify": "^4.0.1",
"grunt-cli": "^0.1.13",
"grunt-contrib-clean": "^0.7.0",
- "grunt-contrib-concat": "^0.5.1",
"grunt-contrib-connect": "^0.11.2",
"grunt-contrib-copy": "^0.8.2",
- "grunt-contrib-jshint": "^0.11.3",
"grunt-contrib-uglify": "^0.11.0",
- "grunt-eslint": "^20.0.0",
"grunt-gitinfo": "^0.1.7",
- "grunt-mocha": "1.0.4",
"grunt-release": "^0.13.0",
"grunt-s3": "0.2.0-alpha.3",
"grunt-sri": "mattrobenolt/grunt-sri#pretty",
"husky": "^0.14.3",
- "jquery": "^2.1.4",
"lint-staged": "^4.0.4",
- "lodash": "^3.10.1",
"mocha": "2.5.3",
+ "mocha-chrome": "^0.2.1",
"prettier": "^1.6.1",
"proxyquireify": "^3.0.2",
"sinon": "1.7.3",
diff --git a/src/raven.js b/src/raven.js
index 78991f21e5cc..4d35c28ca4d2 100644
--- a/src/raven.js
+++ b/src/raven.js
@@ -1369,7 +1369,7 @@ Raven.prototype = {
var frames = [];
if (stackInfo.stack && stackInfo.stack.length) {
each(stackInfo.stack, function(i, stack) {
- var frame = self._normalizeFrame(stack);
+ var frame = self._normalizeFrame(stack, stackInfo.url);
if (frame) {
frames.push(frame);
}
@@ -1386,9 +1386,7 @@ Raven.prototype = {
return frames;
},
- _normalizeFrame: function(frame) {
- if (!frame.url) return;
-
+ _normalizeFrame: function(frame, stackInfoUrl) {
// normalize the frames data
var normalized = {
filename: frame.url,
@@ -1397,6 +1395,15 @@ Raven.prototype = {
function: frame.func || '?'
};
+ // Case when we don't have any information about the error
+ // E.g. throwing a string or raw object, instead of an `Error` in Firefox
+ // Generating synthetic error doesn't add any value here
+ //
+ // We should probably somehow let a user know that they should fix their code
+ if (!frame.url) {
+ normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler
+ }
+
normalized.in_app = !// determine if an exception came from outside of our app
// first we check the global includePaths list.
(
diff --git a/test/index.html b/test/index.html
index c273d684532b..7f8b0464afe6 100644
--- a/test/index.html
+++ b/test/index.html
@@ -33,29 +33,27 @@