Skip to content

Commit 616619c

Browse files
authored
Release 2.3.0 (#20)
Release 2.3.0
2 parents fe65956 + c5b5af7 commit 616619c

8 files changed

Lines changed: 159 additions & 39 deletions

File tree

.eslintrc.yml

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,40 @@
22
root: true
33

44
parserOptions:
5-
ecmaVersion: 7
6-
5+
ecmaVersion: 2018
6+
77
env:
88
node: true
99
es6: true
1010
mocha: true
11-
jasmine: true
12-
11+
1312
extends: 'eslint:recommended'
14-
13+
1514
rules:
1615
indent: [2, 4, { "SwitchCase": 1 }]
16+
strict: 1
1717
linebreak-style: [2, "unix"]
1818
semi: [2, "always"]
19+
semi-spacing: [1, { "before": false }]
20+
semi-style: [1, "last"]
1921
comma-dangle: [2, "never"]
22+
comma-spacing: [1, { "after": true }]
23+
comma-style: [2, "last"]
2024
consistent-return: 0
21-
no-plusplus: [2, { "allowForLoopAfterthoughts": true }]
25+
eol-last: [1, "always"]
2226
eqeqeq: [2, "smart"]
2327
wrap-iife: [2, "any"]
28+
no-plusplus: [2, { "allowForLoopAfterthoughts": true }]
2429
no-empty-function: 2
2530
no-console: 0
2631
no-mixed-spaces-and-tabs: 2
27-
no-whitespace-before-property: 2
32+
no-whitespace-before-property: 1
2833
space-before-function-paren: [2, { "anonymous": "never", "named": "never", "asyncArrow": "always" }]
2934
space-in-parens: [2, "never"]
3035
array-callback-return: 2
3136
class-methods-use-this: 0
3237
dot-notation: [2, { "allowKeywords": true }]
38+
new-parens: 0
3339
no-alert: 1
3440
no-caller: 2
3541
no-else-return: 2
@@ -52,9 +58,35 @@ rules:
5258
no-useless-escape: 2
5359
no-useless-return: 2
5460
no-with: 2
61+
no-var: 2
5562
yoda: 2
5663
no-dupe-keys: 2
5764
use-isnan: 2
5865
no-unreachable: 2
5966
no-tabs: 2
6067
object-curly-spacing: [2, "always"]
68+
global-require: 1
69+
no-buffer-constructor: 2
70+
no-mixed-requires: 1
71+
no-new-require: 2
72+
array-bracket-newline: [1, { "multiline": true, "minItems": 6 }]
73+
array-element-newline: [1, { "multiline": true, "minItems": 6 }]
74+
block-spacing: [1, "always"]
75+
brace-style: [1, "1tbs", { "allowSingleLine": true }]
76+
func-call-spacing: [1, "never"]
77+
implicit-arrow-linebreak: [1, "beside"]
78+
key-spacing: [1, { "mode": "minimum" }]
79+
keyword-spacing: ["error", { "overrides": { "if": { "after": false }, "for": { "after": false }, "while": { "after": false }, "catch": { "after": false } } }]
80+
object-curly-newline: [1, { "minProperties": 5, "multiline": true, "consistent": true }]
81+
lines-between-class-members: [1, "always", { "exceptAfterSingleLine": true }]
82+
space-before-blocks: [1, "always"]
83+
switch-colon-spacing: 1
84+
arrow-spacing: 1
85+
constructor-super: 2
86+
no-useless-computed-key: 1
87+
prefer-numeric-literals: 1
88+
prefer-rest-params: 2
89+
prefer-spread: 1
90+
prefer-template: 2
91+
rest-spread-spacing: 1
92+
template-curly-spacing: 1

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,6 @@ node_modules/
4343

4444
# package-lock
4545
package-lock.json
46+
47+
# DS_Store file
48+
.DS_Store

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ dist: trusty
22
sudo: required
33
language: node_js
44
node_js:
5+
- "12"
56
- "11"
67
- "10"
78
- "8"

lib/LambdaLog.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,37 @@ class LambdaLog extends EventEmitter {
189189
* //=> false
190190
*/
191191
assert(test, msg, meta = {}, tags = []) {
192-
if (test) return false;
192+
if(test) return false;
193193
return this.log('error', msg, meta, tags);
194194
}
195+
196+
/**
197+
* Generates a log message with the result or error provided by a promise. Useful for debugging and testing.
198+
* @since 2.3.0
199+
* @param {Promise} promise A promise or promise-like object to retrieve a value from.
200+
* @param {Object} [meta={}] Optional meta data to attach to the log.
201+
* @param {Array} [tags=[]] Additional tags to append to this log.
202+
* @return {Promise<LogMessage>} A new Promise that resolves with the LogMessage object after the promise completes.
203+
*
204+
* @example
205+
* let promise = new Promise(resolve => resolve('this is a test'));
206+
*
207+
* log.result(promise);
208+
* // => { "msg": "this is a test" ... }
209+
*/
210+
result(promise, meta = {}, tags = []) {
211+
if(!promise || typeof promise.then !== 'function') {
212+
throw new Error('A promise must be provided as the first argument');
213+
}
214+
215+
let wrapper = new Promise((resolve) => {
216+
promise
217+
.then(value => resolve(this.log('info', value, meta, tags)))
218+
.catch(err => resolve(this.log('error', err, meta, tags)));
219+
});
220+
221+
return wrapper;
222+
}
195223
}
196224

197225
module.exports = LambdaLog;

lib/LogMessage.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"use strict";
2-
const stringify = require('json-stringify-safe');
2+
const stringify = require('fast-safe-stringify');
33

44
/**
55
* The LogMessage class is a private/internal class that is used for generating log messages. All log methods return an instance of LogMessage allowing for a chainable api.
@@ -45,7 +45,7 @@ class LogMessage {
4545
let errorMeta = {};
4646

4747
// If `msg` is an Error-like object, use the message and add the `stack` to `meta`
48-
if (LogMessage.isError(msg)) {
48+
if(LogMessage.isError(msg)) {
4949
this._error = msg;
5050
errorMeta.stack = msg.stack;
5151
msg = msg.message;
@@ -66,7 +66,7 @@ class LogMessage {
6666

6767
this.meta = Object.assign({}, meta || {}, opts.meta, errorMeta);
6868

69-
if (opts.dynamicMeta && typeof opts.dynamicMeta === 'function') {
69+
if(opts.dynamicMeta && typeof opts.dynamicMeta === 'function') {
7070
let dynMeta = opts.dynamicMeta(this, opts);
7171

7272
if(typeof dynMeta === 'object') {

package.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,18 @@
6363
"node": ">= 6.10.0"
6464
},
6565
"devDependencies": {
66-
"@commitlint/cli": "^7.5.2",
67-
"@commitlint/config-conventional": "^7.5.0",
68-
"@semantic-release/changelog": "^3.0.2",
69-
"@semantic-release/git": "^7.0.8",
70-
"coveralls": "^3.0.3",
71-
"husky": "^1.3.1",
72-
"jsdoc-to-markdown": "^4.0.1",
73-
"mocha": "^5.2.0",
74-
"nyc": "^13.3.0",
75-
"semantic-release": "^15.13.3"
66+
"@commitlint/cli": "^8.0.0",
67+
"@commitlint/config-conventional": "^8.0.0",
68+
"@semantic-release/changelog": "^3.0.4",
69+
"@semantic-release/git": "^7.0.12",
70+
"coveralls": "^3.0.4",
71+
"husky": "^2.4.1",
72+
"jsdoc-to-markdown": "^5.0.0",
73+
"mocha": "^6.1.4",
74+
"nyc": "^14.1.1",
75+
"semantic-release": "^15.13.16"
7676
},
7777
"dependencies": {
78-
"json-stringify-safe": "^5.0.1"
78+
"fast-safe-stringify": "^2.0.6"
7979
}
8080
}

test/lambdaLog.js

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const LogMessage = require('../lib/LogMessage');
66

77
describe('LambdaLog', function() {
88
describe('Constructor', function() {
9-
it ('should have default options', () => {
9+
it('should have default options', () => {
1010
let log = new LambdaLog();
1111

1212
assert(typeof log.options.meta === 'object');
@@ -19,7 +19,7 @@ describe('LambdaLog', function() {
1919
assert(log.options.logHandler === console);
2020
});
2121

22-
it ('should override default options', () => {
22+
it('should override default options', () => {
2323
let log = new LambdaLog({
2424
meta: { test: true },
2525
tags: ['test'],
@@ -34,18 +34,18 @@ describe('LambdaLog', function() {
3434
});
3535

3636
describe('Log Levels', function() {
37-
describe ('Default', () => {
37+
describe('Default', () => {
3838
let log = new LambdaLog();
3939

40-
it ('should have default log levels', () => {
40+
it('should have default log levels', () => {
4141
assert(typeof log._logLevels === 'object');
4242
assert(log._logLevels.info === 'info');
4343
assert(log._logLevels.warn === 'warn');
4444
assert(log._logLevels.error === 'error');
4545
assert(typeof log._logLevels.debug === 'function');
4646
});
4747

48-
it ('should have array of log levels', () => {
48+
it('should have array of log levels', () => {
4949
assert(Array.isArray(log._levels));
5050
assert(log._levels.length === 4);
5151
});
@@ -56,7 +56,7 @@ describe('LambdaLog', function() {
5656
});
5757
});
5858

59-
describe ('Custom', () => {
59+
describe('Custom', () => {
6060
let log = new LambdaLog({}, {
6161
info: 'log',
6262
fatal: 'error',
@@ -115,9 +115,7 @@ describe('LambdaLog', function() {
115115
let log = new LambdaLog({
116116
meta: { test: true },
117117
dynamicMeta: function() {
118-
return {
119-
timestamp: new Date().toISOString()
120-
};
118+
return { timestamp: new Date().toISOString() };
121119
},
122120
tags: ['test'],
123121
silent: true
@@ -287,6 +285,64 @@ describe('LambdaLog', function() {
287285
assert.equal(logData.level, 'error');
288286
});
289287
});
288+
289+
describe('result()', function() {
290+
it('should have result method', function() {
291+
assert.equal(typeof log.result, 'function');
292+
});
293+
294+
it('should return a promise', function() {
295+
let promise = new Promise(resolve => resolve('test')),
296+
res = log.result(promise);
297+
assert.equal(typeof res.then, 'function');
298+
});
299+
300+
it('should throw an error when a promise is not provided', function() {
301+
assert.throws(function() {
302+
log.result();
303+
}, function(err) {
304+
if((err instanceof Error) && err.message === 'A promise must be provided as the first argument') return true;
305+
});
306+
});
307+
308+
it('should throw an error when a non-valid promise is provided', function() {
309+
assert.throws(function() {
310+
log.result({});
311+
}, function(err) {
312+
if((err instanceof Error) && err.message === 'A promise must be provided as the first argument') return true;
313+
});
314+
});
315+
316+
it('should return a promise the resolves with log message', function(done) {
317+
let promise = new Promise(resolve => resolve('test')),
318+
res = log.result(promise);
319+
320+
res.then(logData => {
321+
assert.equal(logData.msg, 'test');
322+
done();
323+
});
324+
});
325+
326+
it('should set the level to info on resolve', function(done) {
327+
let promise = new Promise(resolve => resolve('test')),
328+
res = log.result(promise);
329+
330+
res.then(logData => {
331+
assert.equal(logData.level, 'info');
332+
done();
333+
});
334+
});
335+
336+
it('should set the level to error on rejection', function(done) {
337+
let promise = new Promise((resolve, reject) => reject('test')),
338+
res = log.result(promise);
339+
340+
res.then(logData => {
341+
assert.equal(logData.level, 'error');
342+
done();
343+
});
344+
});
345+
});
290346
});
291347

292348
describe('Events', function() {

test/logMessage.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const LogMessage = require('../lib/LogMessage');
55
const logMsg = new LogMessage({
66
level: 'error',
77
msg: new Error('Test'),
8-
meta: { hello: 'world', arr: [1,2,3] },
8+
meta: { hello: 'world', arr: [1, 2, 3] },
99
tags: ['test']
1010
}, {
1111
meta: { test: true },
@@ -17,15 +17,15 @@ const logMsg = new LogMessage({
1717
},
1818
replacer: function(key, value) {
1919
if(key === 'ssn') {
20-
return value.substr(0,3) + '-**-****';
20+
return `${value.substr(0, 3)}-**-****`;
2121
}
2222
return value;
2323
},
2424
silent: true
2525
});
2626

27-
describe ('LogMessage', () => {
28-
describe ('Constructor', () => {
27+
describe('LogMessage', () => {
28+
describe('Constructor', () => {
2929
it('should create instance of LogMessage', () => {
3030
assert(logMsg instanceof LogMessage);
3131
});
@@ -54,7 +54,7 @@ describe ('LogMessage', () => {
5454
});
5555
});
5656

57-
describe ('Properties', () => {
57+
describe('Properties', () => {
5858
it('should have level', () => {
5959
assert(typeof logMsg.level === 'string');
6060
assert(logMsg.level === 'error');
@@ -68,15 +68,15 @@ describe ('LogMessage', () => {
6868
assert(Array.isArray(logMsg.tags));
6969
});
7070

71-
it ('should have msg', () => {
71+
it('should have msg', () => {
7272
assert(typeof logMsg.msg === 'string');
7373
});
7474

75-
it ('should have _error', () => {
75+
it('should have _error', () => {
7676
assert(logMsg._error instanceof Error);
7777
});
7878

79-
it ('should have _replacer', () => {
79+
it('should have _replacer', () => {
8080
assert(typeof logMsg._replacer === 'function');
8181
});
8282
});

0 commit comments

Comments
 (0)