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
<https://github.com/uBlockOrigin/uAssets>; limited
logging capabilities of json-prune originally raised
by <https://github.com/gwarser>.
This commit is contained in:
Raymond Hill 2020-04-28 09:47:03 -04:00
parent 96343ecf1a
commit 578594bbd7
No known key found for this signature in database
GPG key ID: 25E1490B761470C2

View file

@ -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; }