Merge pull request #87 from strongloop/update-deps

Update dependencies to their latest versions, replace "var" with "const"
This commit is contained in:
Miroslav Bajtoš 2019-10-12 09:53:27 +02:00 committed by GitHub
commit 875809d76d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 102 additions and 102 deletions

View File

@ -15,10 +15,10 @@ module.exports = cloneAllProperties;
function cloneAllProperties(data, err) {
data.name = err.name;
data.message = err.message;
for (var p in err) {
for (const p in err) {
if ((p in data)) continue;
data[p] = err[p];
}
// stack is appended last to ensure order is the same for response
data.stack = err.stack;
};
}

View File

@ -4,12 +4,12 @@
// License text available at https://opensource.org/licenses/MIT
'use strict';
var accepts = require('accepts');
var debug = require('debug')('strong-error-handler:http-response');
var sendJson = require('./send-json');
var sendHtml = require('./send-html');
var sendXml = require('./send-xml');
var util = require('util');
const accepts = require('accepts');
const debug = require('debug')('strong-error-handler:http-response');
const sendJson = require('./send-json');
const sendHtml = require('./send-html');
const sendXml = require('./send-xml');
const util = require('util');
module.exports = negotiateContentProducer;
@ -23,14 +23,14 @@ module.exports = negotiateContentProducer;
* @returns {Function} Operation function with signature `fn(res, data)`
*/
function negotiateContentProducer(req, logWarning, options) {
var SUPPORTED_TYPES = [
const SUPPORTED_TYPES = [
'application/json', 'json',
'text/html', 'html',
'text/xml', 'xml',
];
options = options || {};
var defaultType = 'json';
let defaultType = 'json';
// checking if user provided defaultType is supported
if (options.defaultType) {
@ -52,9 +52,9 @@ function negotiateContentProducer(req, logWarning, options) {
// Accepts: */*, application/json, text/html ---> will resolve as application/json
// eg. Chrome accepts defaults to `text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*`
// In this case `resolvedContentType` will result as: `text/html` due to the order given
var resolvedContentType = accepts(req).types(SUPPORTED_TYPES);
const resolvedContentType = accepts(req).types(SUPPORTED_TYPES);
debug('Resolved content-type', resolvedContentType);
var contentType = resolvedContentType || defaultType;
let contentType = resolvedContentType || defaultType;
if (options.negotiateContentType === false) {
if (SUPPORTED_TYPES.indexOf(options.defaultType) > -1) {
@ -71,13 +71,13 @@ function negotiateContentProducer(req, logWarning, options) {
// to receive _format from user's url param to overide the content type
// req.query (eg /api/Users/1?_format=json will overide content negotiation
// https://github.com/strongloop/strong-remoting/blob/ac3093dcfbb787977ca0229b0f672703859e52e1/lib/http-context.js#L643-L645
var query = req.query || {};
const query = req.query || {};
if (query._format) {
if (SUPPORTED_TYPES.indexOf(query._format) > -1) {
contentType = query._format;
} else {
// format passed through query but not supported
var msg = util.format('Response _format "%s" is not supported' +
const msg = util.format('Response _format "%s" is not supported' +
'used "%s" instead"', query._format, defaultType);
logWarning(msg);
}

View File

@ -5,8 +5,8 @@
'use strict';
var cloneAllProperties = require('../lib/clone.js');
var httpStatus = require('http-status');
const cloneAllProperties = require('../lib/clone.js');
const httpStatus = require('http-status');
module.exports = buildResponseData;
@ -44,7 +44,7 @@ function buildResponseData(err, options) {
fillSafeFields(data, err, safeFields);
return data;
};
}
function serializeArrayOfErrors(errors, options) {
const details = errors.map(e => buildResponseData(e, options));

View File

@ -5,14 +5,14 @@
'use strict';
var path = require('path');
var SG = require('strong-globalize');
const path = require('path');
const SG = require('strong-globalize');
SG.SetRootDir(path.resolve(__dirname, '..'));
var buildResponseData = require('./data-builder');
var debug = require('debug')('strong-error-handler');
var format = require('util').format;
var logToConsole = require('./logger');
var negotiateContentProducer = require('./content-negotiation');
const buildResponseData = require('./data-builder');
const debug = require('debug')('strong-error-handler');
const format = require('util').format;
const logToConsole = require('./logger');
const negotiateContentProducer = require('./content-negotiation');
function noop() {
}
@ -29,13 +29,13 @@ function createStrongErrorHandler(options) {
debug('Initializing with options %j', options);
// Log all errors via console.error (enabled by default)
var logError = options.log !== false ? logToConsole : noop;
const logError = options.log !== false ? logToConsole : noop;
return function strongErrorHandler(err, req, res, next) {
logError(req, err);
writeErrorToResponse(err, req, res, options);
};
};
}
/**
* Writes thrown error to response
@ -59,20 +59,20 @@ function writeErrorToResponse(err, req, res, options) {
if (!err.status && !err.statusCode && res.statusCode >= 400)
err.statusCode = res.statusCode;
var data = buildResponseData(err, options);
const data = buildResponseData(err, options);
debug('Response status %s data %j', data.statusCode, data);
res.setHeader('X-Content-Type-Options', 'nosniff');
res.statusCode = data.statusCode;
var sendResponse = negotiateContentProducer(req, warn, options);
const sendResponse = negotiateContentProducer(req, warn, options);
sendResponse(res, data);
function warn(msg) {
res.header('X-Warning', msg);
debug(msg);
}
};
}
exports = module.exports = createStrongErrorHandler;
exports.writeErrorToResponse = writeErrorToResponse;

View File

@ -5,8 +5,8 @@
'use strict';
var format = require('util').format;
var g = require('strong-globalize')();
const format = require('util').format;
const g = require('strong-globalize')();
module.exports = function logToConsole(req, err) {
if (!Array.isArray(err)) {
@ -15,9 +15,9 @@ module.exports = function logToConsole(req, err) {
return;
}
var errMsg = g.f('Unhandled array of errors for request %s %s\n',
const errMsg = g.f('Unhandled array of errors for request %s %s\n',
req.method, req.url);
var errors = err.map(formatError).join('\n');
const errors = err.map(formatError).join('\n');
console.error(errMsg, errors);
};

View File

@ -4,12 +4,12 @@
// License text available at https://opensource.org/licenses/MIT
'use strict';
var ejs = require('ejs');
var fs = require('fs');
var path = require('path');
const ejs = require('ejs');
const fs = require('fs');
const path = require('path');
var assetDir = path.resolve(__dirname, '../views');
var compiledTemplates = {
const assetDir = path.resolve(__dirname, '../views');
const compiledTemplates = {
// loading default template and stylesheet
default: loadDefaultTemplates(),
};
@ -17,9 +17,9 @@ var compiledTemplates = {
module.exports = sendHtml;
function sendHtml(res, data, options) {
var toRender = {options: {}, data: data};
const toRender = {options: {}, data: data};
// TODO: ability to call non-default template functions from options
var body = compiledTemplates.default(toRender);
const body = compiledTemplates.default(toRender);
sendReponse(res, body);
}
@ -30,14 +30,14 @@ function sendHtml(res, data, options) {
* @returns {Function} render function with signature fn(data);
*/
function compileTemplate(filepath) {
var options = {cache: true, filename: filepath};
var fileContent = fs.readFileSync(filepath, 'utf8');
const options = {cache: true, filename: filepath};
const fileContent = fs.readFileSync(filepath, 'utf8');
return ejs.compile(fileContent, options);
}
// loads and cache default error templates
function loadDefaultTemplates() {
var defaultTemplate = path.resolve(assetDir, 'default-error.ejs');
const defaultTemplate = path.resolve(assetDir, 'default-error.ejs');
return compileTemplate(defaultTemplate);
}

View File

@ -5,10 +5,10 @@
'use strict';
var safeStringify = require('fast-safe-stringify');
const safeStringify = require('fast-safe-stringify');
module.exports = function sendJson(res, data) {
var content = safeStringify({error: data});
const content = safeStringify({error: data});
res.setHeader('Content-Type', 'application/json; charset=utf-8');
res.end(content, 'utf-8');
};

View File

@ -5,10 +5,10 @@
'use strict';
var js2xmlparser = require('js2xmlparser');
const js2xmlparser = require('js2xmlparser');
module.exports = function sendXml(res, data) {
var content = js2xmlparser.parse('error', data);
const content = js2xmlparser.parse('error', data);
res.setHeader('Content-Type', 'text/xml; charset=utf-8');
res.end(content, 'utf-8');
};

View File

@ -19,20 +19,20 @@
"dependencies": {
"@types/express": "^4.16.0",
"accepts": "^1.3.3",
"debug": "^3.1.0",
"debug": "^4.1.1",
"ejs": "^2.6.1",
"fast-safe-stringify": "^2.0.6",
"http-status": "^1.1.2",
"js2xmlparser": "^3.0.0",
"strong-globalize": "^4.1.0"
"js2xmlparser": "^4.0.0",
"strong-globalize": "^5.0.2"
},
"devDependencies": {
"chai": "^4.1.2",
"eslint": "^4.19.1",
"eslint-config-loopback": "^10.0.0",
"eslint": "^6.5.1",
"eslint-config-loopback": "^13.1.0",
"express": "^4.16.3",
"mocha": "^5.2.0",
"supertest": "^3.1.0"
"mocha": "^6.2.1",
"supertest": "^4.0.2"
},
"browser": {
"strong-error-handler": false

View File

@ -5,13 +5,13 @@
'use strict';
var cloneAllProperties = require('../lib/clone.js');
var debug = require('debug')('test');
var expect = require('chai').expect;
var express = require('express');
var strongErrorHandler = require('..');
var supertest = require('supertest');
var util = require('util');
const cloneAllProperties = require('../lib/clone.js');
const debug = require('debug')('test');
const expect = require('chai').expect;
const express = require('express');
const strongErrorHandler = require('..');
const supertest = require('supertest');
const util = require('util');
describe('strong-error-handler', function() {
before(setupHttpServerAndClient);
@ -27,7 +27,7 @@ describe('strong-error-handler', function() {
it('handles response headers already sent', function(done) {
givenErrorHandlerForError();
var handler = _requestHandler;
const handler = _requestHandler;
_requestHandler = function(req, res, next) {
res.end('empty');
process.nextTick(function() {
@ -70,7 +70,7 @@ describe('strong-error-handler', function() {
it('handles error from `res.statusCode`', function(done) {
givenErrorHandlerForError();
var handler = _requestHandler;
const handler = _requestHandler;
_requestHandler = function(req, res, next) {
res.statusCode = 507;
handler(req, res, next);
@ -84,7 +84,7 @@ describe('strong-error-handler', function() {
});
context('logging', function() {
var logs;
let logs;
beforeEach(redirectConsoleError);
afterEach(restoreConsoleError);
@ -129,7 +129,7 @@ describe('strong-error-handler', function() {
request.get('/api').end(function(err) {
if (err) return done(err);
var msg = logs[0];
const msg = logs[0];
// the request method
expect(msg).to.contain('GET');
// the request path
@ -152,7 +152,7 @@ describe('strong-error-handler', function() {
request.get('/api').end(function(err) {
if (err) return done(err);
var msg = logs[0];
const msg = logs[0];
// the request method
expect(msg).to.contain('GET');
// the request path
@ -171,17 +171,17 @@ describe('strong-error-handler', function() {
givenErrorHandlerForError('STRING ERROR', {log: true});
request.get('/').end(function(err) {
if (err) return done(err);
var msg = logs[0];
const msg = logs[0];
expect(msg).to.contain('STRING ERROR');
done();
});
});
var _consoleError = console.error;
const _consoleError = console.error;
function redirectConsoleError() {
logs = [];
console.error = function() {
var msg = util.format.apply(util, arguments);
const msg = util.format.apply(util, arguments);
logs.push(msg);
};
}
@ -194,7 +194,7 @@ describe('strong-error-handler', function() {
context('JSON response', function() {
it('contains all error properties when debug=true', function(done) {
var error = new ErrorWithProps({
const error = new ErrorWithProps({
message: 'a test error message',
code: 'MACHINE_READABLE_CODE',
details: 'some details',
@ -205,7 +205,7 @@ describe('strong-error-handler', function() {
requestJson().end(function(err, res) {
if (err) return done(err);
var expectedData = {
const expectedData = {
statusCode: 500,
message: 'a test error message',
name: 'ErrorWithProps',
@ -222,7 +222,7 @@ describe('strong-error-handler', function() {
it('includes code property for 4xx status codes when debug=false',
function(done) {
var error = new ErrorWithProps({
const error = new ErrorWithProps({
statusCode: 400,
message: 'error with code',
name: 'ErrorWithCode',
@ -233,7 +233,7 @@ describe('strong-error-handler', function() {
requestJson().end(function(err, res) {
if (err) return done(err);
var expectedData = {
const expectedData = {
statusCode: 400,
message: 'error with code',
name: 'ErrorWithCode',
@ -247,7 +247,7 @@ describe('strong-error-handler', function() {
it('excludes code property for 5xx status codes when debug=false',
function(done) {
var error = new ErrorWithProps({
const error = new ErrorWithProps({
statusCode: 500,
code: 'MACHINE_READABLE_CODE',
});
@ -256,7 +256,7 @@ describe('strong-error-handler', function() {
requestJson().end(function(err, res) {
if (err) return done(err);
var expectedData = {
const expectedData = {
statusCode: 500,
message: 'Internal Server Error',
};
@ -268,12 +268,12 @@ describe('strong-error-handler', function() {
it('contains non-enumerable Error properties when debug=true',
function(done) {
var error = new Error('a test error message');
const error = new Error('a test error message');
givenErrorHandlerForError(error, {debug: true});
requestJson().end(function(err, res) {
if (err) return done(err);
expect(res.body).to.have.property('error');
var resError = res.body.error;
const resError = res.body.error;
expect(resError).to.have.property('name', 'Error');
expect(resError).to.have.property('message',
'a test error message');
@ -283,7 +283,7 @@ describe('strong-error-handler', function() {
});
it('should allow setting safe fields when status=5xx', function(done) {
var error = new ErrorWithProps({
const error = new ErrorWithProps({
name: 'Error',
safeField: 'SAFE',
unsafeField: 'UNSAFE',
@ -304,7 +304,7 @@ describe('strong-error-handler', function() {
});
it('safe fields falls back to existing data', function(done) {
var error = new ErrorWithProps({
const error = new ErrorWithProps({
name: 'Error',
isSafe: false,
});
@ -322,7 +322,7 @@ describe('strong-error-handler', function() {
});
it('should allow setting safe fields when status=4xx', function(done) {
var error = new ErrorWithProps({
const error = new ErrorWithProps({
name: 'Error',
statusCode: 422,
safeField: 'SAFE',
@ -344,7 +344,7 @@ describe('strong-error-handler', function() {
});
it('contains subset of properties when status=4xx', function(done) {
var error = new ErrorWithProps({
const error = new ErrorWithProps({
name: 'ValidationError',
message: 'The model instance is not valid.',
statusCode: 422,
@ -370,7 +370,7 @@ describe('strong-error-handler', function() {
it('contains only safe info when status=5xx', function(done) {
// Mock an error reported by fs.readFile
var error = new ErrorWithProps({
const error = new ErrorWithProps({
name: 'Error',
message: 'ENOENT: no such file or directory, open "/etc/passwd"',
errno: -2,
@ -394,7 +394,7 @@ describe('strong-error-handler', function() {
});
it('handles array argument as 500 when debug=false', function(done) {
var errors = [new Error('ERR1'), new Error('ERR2'), 'ERR STRING'];
const errors = [new Error('ERR1'), new Error('ERR2'), 'ERR STRING'];
givenErrorHandlerForError(errors);
requestJson().expect(500).end(function(err, res) {
@ -521,9 +521,9 @@ describe('strong-error-handler', function() {
});
it('handles Error objects containing circular properties', function(done) {
var circularObject = {};
const circularObject = {};
circularObject.recursiveProp = circularObject;
var error = new ErrorWithProps({
const error = new ErrorWithProps({
statusCode: 422,
message: 'The model instance is not valid.',
name: 'ValidationError',
@ -550,7 +550,7 @@ describe('strong-error-handler', function() {
context('HTML response', function() {
it('contains all error properties when debug=true', function(done) {
var error = new ErrorWithProps({
const error = new ErrorWithProps({
message: 'a test error message',
details: 'some details',
extra: 'sensitive data',
@ -607,7 +607,7 @@ describe('strong-error-handler', function() {
});
it('contains subset of properties when status=4xx', function(done) {
var error = new ErrorWithProps({
const error = new ErrorWithProps({
name: 'ValidationError',
message: 'The model instance is not valid.',
statusCode: 422,
@ -618,7 +618,7 @@ describe('strong-error-handler', function() {
requestHTML()
.end(function(err, res) {
expect(res.statusCode).to.eql(422);
var body = res.error.text;
const body = res.error.text;
expect(body).to.match(/some details/);
expect(body).to.not.match(/sensitive data/);
expect(body).to.match(/<title>ValidationError<\/title>/);
@ -629,7 +629,7 @@ describe('strong-error-handler', function() {
it('contains only safe info when status=5xx', function(done) {
// Mock an error reported by fs.readFile
var error = new ErrorWithProps({
const error = new ErrorWithProps({
name: 'Error',
message: 'ENOENT: no such file or directory, open "/etc/passwd"',
errno: -2,
@ -642,7 +642,7 @@ describe('strong-error-handler', function() {
requestHTML()
.end(function(err, res) {
expect(res.statusCode).to.eql(500);
var body = res.error.text;
const body = res.error.text;
expect(body).to.not.match(/\/etc\/password/);
expect(body).to.not.match(/-2/);
expect(body).to.not.match(/ENOENT/);
@ -662,7 +662,7 @@ describe('strong-error-handler', function() {
context('XML response', function() {
it('contains all error properties when debug=true', function(done) {
var error = new ErrorWithProps({
const error = new ErrorWithProps({
message: 'a test error message',
details: 'some details',
extra: 'sensitive data',
@ -680,7 +680,7 @@ describe('strong-error-handler', function() {
});
it('contains subset of properties when status=4xx', function(done) {
var error = new ErrorWithProps({
const error = new ErrorWithProps({
name: 'ValidationError',
message: 'The model instance is not valid.',
statusCode: 422,
@ -691,7 +691,7 @@ describe('strong-error-handler', function() {
requestXML()
.end(function(err, res) {
expect(res.statusCode).to.eql(422);
var body = res.error.text;
const body = res.error.text;
expect(body).to.match(/<details>some details<\/details>/);
expect(body).to.not.match(/<extra>sensitive data<\/extra>/);
expect(body).to.match(/<name>ValidationError<\/name>/);
@ -704,7 +704,7 @@ describe('strong-error-handler', function() {
it('contains only safe info when status=5xx', function(done) {
// Mock an error reported by fs.readFile
var error = new ErrorWithProps({
const error = new ErrorWithProps({
name: 'Error',
message: 'ENOENT: no such file or directory, open "/etc/passwd"',
errno: -2,
@ -717,7 +717,7 @@ describe('strong-error-handler', function() {
requestXML()
.end(function(err, res) {
expect(res.statusCode).to.eql(500);
var body = res.error.text;
const body = res.error.text;
expect(body).to.not.match(/\/etc\/password/);
expect(body).to.not.match(/-2/);
expect(body).to.not.match(/ENOENT/);
@ -848,7 +848,7 @@ describe('strong-error-handler', function() {
});
it('does not modify "options" argument', function(done) {
var options = {log: false, debug: false};
const options = {log: false, debug: false};
givenErrorHandlerForError(new Error(), options);
request.get('/').end(function(err) {
if (err) return done(err);
@ -858,7 +858,7 @@ describe('strong-error-handler', function() {
});
});
var app, _requestHandler, request, server;
let app, _requestHandler, request, server;
function resetRequestHandler() {
_requestHandler = null;
}
@ -874,7 +874,7 @@ function givenErrorHandlerForError(error, options) {
options.log = false;
}
var handler = strongErrorHandler(options);
const handler = strongErrorHandler(options);
_requestHandler = function(req, res, next) {
debug('Invoking strong-error-handler');
handler(error, req, res, next);
@ -885,7 +885,7 @@ function setupHttpServerAndClient(done) {
app = express();
app.use(function(req, res, next) {
if (!_requestHandler) {
var msg = 'Error handler middleware was not setup in this test';
const msg = 'Error handler middleware was not setup in this test';
console.error(msg);
res.statusCode = 500;
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
@ -907,7 +907,7 @@ function setupHttpServerAndClient(done) {
});
server = app.listen(0, function() {
var url = 'http://127.0.0.1:' + this.address().port;
const url = 'http://127.0.0.1:' + this.address().port;
debug('Test server listening on %s', url);
request = supertest(app);
done();
@ -924,7 +924,7 @@ function stopHttpServerAndClient() {
function ErrorWithProps(props) {
this.name = props.name || 'ErrorWithProps';
for (var p in props) {
for (const p in props) {
this[p] = props[p];
}
@ -936,7 +936,7 @@ function ErrorWithProps(props) {
util.inherits(ErrorWithProps, Error);
function getExpectedErrorData(err) {
var data = {};
const data = {};
cloneAllProperties(data, err);
return data;
}