@middy/input-output-logger 3.0.0-alpha.2 → 3.0.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +4 -4
  2. package/index.js +48 -23
  3. package/package.json +8 -4
package/README.md CHANGED
@@ -41,10 +41,10 @@ npm install --save @middy/input-output-logger
41
41
 
42
42
  ## Options
43
43
 
44
- - `logger` function (default `console.log`): logging function that accepts an object
45
- - `awsContext` boolean (default `false`): Include [AWS Lambda context object](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html) to the logger
46
- - `omitPaths` string[] (default `[]`): property accepts an array of paths that will be used to remove particular fields import the logged objects. This could serve as a simple way to redact sensitive data from logs (default []).
47
-
44
+ - `logger` (function) (default `console.log`): logging function that accepts an object
45
+ - `awsContext` (boolean) (default `false`): Include [AWS Lambda context object](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html) to the logger
46
+ - `omitPaths` (string[]) (default `[]`): property accepts an array of paths that will be used to remove particular fields import the logged objects. This could serve as a simple way to redact sensitive data from logs (default []).
47
+ - `replacer` (function) (default undefined): A [replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Parameters) parameter may be passed which will be used `JSON.stringify`ing the request during cloning.
48
48
 
49
49
  ## Sample usage
50
50
 
package/index.js CHANGED
@@ -1,18 +1,22 @@
1
+ import { jsonSafeParse, jsonSafeStringify } from '@middy/util';
1
2
  const defaults = {
2
- logger: data => console.log(JSON.stringify(data, null, 2)),
3
+ logger: console.log,
3
4
  awsContext: false,
4
- omitPaths: []
5
+ omitPaths: [],
6
+ replacer: undefined
5
7
  };
6
8
 
7
9
  const inputOutputLoggerMiddleware = (opts = {}) => {
8
10
  let {
9
11
  logger,
10
12
  awsContext,
11
- omitPaths
13
+ omitPaths,
14
+ replacer
12
15
  } = { ...defaults,
13
16
  ...opts
14
17
  };
15
18
  if (typeof logger !== 'function') logger = null;
19
+ const omitPathTree = buildPathOmitTree(omitPaths);
16
20
 
17
21
  const omitAndLog = (param, request) => {
18
22
  const message = {
@@ -23,15 +27,22 @@ const inputOutputLoggerMiddleware = (opts = {}) => {
23
27
  message.context = pick(request.context, awsContextKeys);
24
28
  }
25
29
 
26
- const redactedMessage = omit(JSON.parse(JSON.stringify(message)), omitPaths);
27
- logger(redactedMessage);
30
+ const cloneMessage = jsonSafeParse(jsonSafeStringify(message, replacer));
31
+ omit(cloneMessage, {
32
+ [param]: omitPathTree[param]
33
+ });
34
+ logger(cloneMessage);
28
35
  };
29
36
 
30
37
  const inputOutputLoggerMiddlewareBefore = async request => omitAndLog('event', request);
31
38
 
32
39
  const inputOutputLoggerMiddlewareAfter = async request => omitAndLog('response', request);
33
40
 
34
- const inputOutputLoggerMiddlewareOnError = inputOutputLoggerMiddlewareAfter;
41
+ const inputOutputLoggerMiddlewareOnError = async request => {
42
+ if (request.response === undefined) return;
43
+ return omitAndLog('response', request);
44
+ };
45
+
35
46
  return {
36
47
  before: logger ? inputOutputLoggerMiddlewareBefore : undefined,
37
48
  after: logger ? inputOutputLoggerMiddlewareAfter : undefined,
@@ -53,28 +64,42 @@ const pick = (originalObject = {}, keysToPick = []) => {
53
64
  return newObject;
54
65
  };
55
66
 
56
- const omit = (originalObject = {}, keysToOmit = []) => {
57
- const clonedObject = { ...originalObject
58
- };
59
-
60
- for (const path of keysToOmit) {
61
- deleteKey(clonedObject, path);
67
+ const buildPathOmitTree = paths => {
68
+ const tree = {};
69
+
70
+ for (let path of paths.sort().reverse()) {
71
+ if (!Array.isArray(path)) path = path.split('.');
72
+ if (path.includes('__proto__')) continue;
73
+ path.slice(0).reduce((a, b, idx) => {
74
+ if (idx < path.length - 1) {
75
+ a[b] ?? (a[b] = {});
76
+ return a[b];
77
+ }
78
+
79
+ a[b] = true;
80
+ return true;
81
+ }, tree);
62
82
  }
63
83
 
64
- return clonedObject;
84
+ return tree;
65
85
  };
66
86
 
67
- const deleteKey = (obj, key) => {
68
- if (!Array.isArray(key)) key = key.split('.');
69
- const rootKey = key.shift();
70
-
71
- if (key.length && obj[rootKey]) {
72
- deleteKey(obj[rootKey], key);
73
- } else {
74
- delete obj[rootKey];
87
+ const omit = (obj, pathTree = {}) => {
88
+ if (Array.isArray(obj) && pathTree['[]']) {
89
+ for (const value of obj) {
90
+ omit(value, pathTree['[]']);
91
+ }
92
+ } else if (isObject(obj)) {
93
+ for (const key in pathTree) {
94
+ if (pathTree[key] === true) {
95
+ delete obj[key];
96
+ } else {
97
+ omit(obj[key], pathTree[key]);
98
+ }
99
+ }
75
100
  }
76
-
77
- return obj;
78
101
  };
79
102
 
103
+ const isObject = value => value && typeof value === 'object' && value.constructor === Object;
104
+
80
105
  export default inputOutputLoggerMiddleware;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@middy/input-output-logger",
3
- "version": "3.0.0-alpha.2",
3
+ "version": "3.0.0-alpha.6",
4
4
  "description": "Input and output logger middleware for the middy framework",
5
5
  "type": "module",
6
6
  "engines": {
@@ -18,7 +18,8 @@
18
18
  ],
19
19
  "scripts": {
20
20
  "test": "npm run test:unit",
21
- "test:unit": "ava"
21
+ "test:unit": "ava",
22
+ "test:benchmark": "node __benchmarks__/index.js"
22
23
  },
23
24
  "license": "MIT",
24
25
  "keywords": [
@@ -46,9 +47,12 @@
46
47
  "url": "https://github.com/middyjs/middy/issues"
47
48
  },
48
49
  "homepage": "https://github.com/middyjs/middy#readme",
50
+ "dependencies": {
51
+ "@middy/util": "^3.0.0-alpha.6"
52
+ },
49
53
  "devDependencies": {
50
- "@middy/core": "^3.0.0-alpha.2",
54
+ "@middy/core": "^3.0.0-alpha.6",
51
55
  "@types/node": "^17.0.0"
52
56
  },
53
- "gitHead": "de30419273ecbff08f367f47c7e320ec981cf145"
57
+ "gitHead": "176660ed3e0716d6bfb635c77251b301e0e24720"
54
58
  }