From 578594bbd7c545b62f18267d640a605f8e07a53a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 28 Apr 2020 09:47:03 -0400 Subject: [PATCH] Improve logging capabilities of json-prune scriptlet Specifically: - Log entries as received by client code - Prettier and more readable console output - Ability to only log entries matching a specific needle As per internal discussion at ; limited logging capabilities of json-prune originally raised by . --- assets/resources/scriptlets.js | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 29973d8e8..87e44ea67 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -249,16 +249,35 @@ /// json-prune.js +// +// When no "prune paths" argument is provided, the scriptlet is +// used for logging purpose and the "needle paths" argument is +// used to filter logging output. (function() { - const log = console.log.bind(console); const rawPrunePaths = '{{1}}'; const rawNeedlePaths = '{{2}}'; const prunePaths = rawPrunePaths !== '{{1}}' && rawPrunePaths !== '' ? rawPrunePaths.split(/ +/) : []; - const needlePaths = rawNeedlePaths !== '{{2}}' && rawNeedlePaths !== '' - ? rawNeedlePaths.split(/ +/) - : []; + let needlePaths; + let log, reLogNeedle; + if ( prunePaths.length !== 0 ) { + needlePaths = prunePaths.length !== 0 && + rawNeedlePaths !== '{{2}}' && rawNeedlePaths !== '' + ? rawNeedlePaths.split(/ +/) + : []; + } else { + log = console.log.bind(console); + let needle; + if ( rawNeedlePaths === '' || rawNeedlePaths === '{{2}}' ) { + needle = '.?'; + } else if ( rawNeedlePaths.charAt(0) === '/' && rawNeedlePaths.slice(-1) === '/' ) { + needle = rawNeedlePaths.slice(1, -1); + } else { + needle = rawNeedlePaths.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + reLogNeedle = new RegExp(needle); + } const findOwner = function(root, path) { let owner = root; let chain = path; @@ -286,8 +305,11 @@ JSON.parse = new Proxy(JSON.parse, { apply: function() { const r = Reflect.apply(...arguments); - if ( prunePaths.length === 0 ) { - log(location.hostname, r); + if ( log !== undefined ) { + const json = JSON.stringify(r, null, 2); + if ( reLogNeedle.test(json) ) { + log(location.hostname, json); + } return r; } if ( mustProcess(r) === false ) { return r; }