@@ -59,6 +59,36 @@ function safeSelf() {
59
59
if ( `${ args [ 0 ] } ` === '' ) { return ; }
60
60
this . log ( '[uBO]' , ...args ) ;
61
61
} ,
62
+ 'initPattern' : function ( pattern , options = { } ) {
63
+ if ( pattern === '' ) {
64
+ return { matchAll : true } ;
65
+ }
66
+ const expect = ( options . canNegate && pattern . startsWith ( '!' ) === false ) ;
67
+ if ( expect === false ) {
68
+ pattern = pattern . slice ( 1 ) ;
69
+ }
70
+ const match = / ^ \/ ( .+ ) \/ ( [ g i m s u ] * ) $ / . exec ( pattern ) ;
71
+ if ( match !== null ) {
72
+ return {
73
+ re : new this . RegExp (
74
+ match [ 1 ] ,
75
+ match [ 2 ] || options . flags
76
+ ) ,
77
+ expect,
78
+ } ;
79
+ }
80
+ return {
81
+ re : new this . RegExp ( pattern . replace (
82
+ / [ . * + ? ^ $ { } ( ) | [ \] \\ ] / g, '\\$&' ) ,
83
+ options . flags
84
+ ) ,
85
+ expect,
86
+ } ;
87
+ } ,
88
+ 'testPattern' : function ( details , haystack ) {
89
+ if ( details . matchAll ) { return true ; }
90
+ return this . RegExp_test . call ( details . re , haystack ) === details . expect ;
91
+ } ,
62
92
} ;
63
93
scriptletGlobals . set ( 'safeSelf' , safe ) ;
64
94
return safe ;
@@ -636,7 +666,7 @@ function objectPrune(
636
666
obj ,
637
667
rawPrunePaths ,
638
668
rawNeedlePaths ,
639
- stackNeedle = ''
669
+ stackNeedleDetails = { matchAll : true }
640
670
) {
641
671
if ( typeof rawPrunePaths !== 'string' ) { return obj ; }
642
672
const prunePaths = rawPrunePaths !== ''
@@ -657,9 +687,8 @@ function objectPrune(
657
687
log = console . log . bind ( console ) ;
658
688
reLogNeedle = patternToRegex ( rawNeedlePaths ) ;
659
689
}
660
- if ( stackNeedle !== '' ) {
661
- const reStackNeedle = patternToRegex ( stackNeedle ) ;
662
- if ( matchesStackTrace ( reStackNeedle , extraArgs . logstack ) === false ) {
690
+ if ( stackNeedleDetails . matchAll !== true ) {
691
+ if ( matchesStackTrace ( stackNeedleDetails , extraArgs . logstack ) === false ) {
663
692
return obj ;
664
693
}
665
694
}
@@ -828,10 +857,9 @@ builtinScriptlets.push({
828
857
] ,
829
858
} ) ;
830
859
function matchesStackTrace (
831
- reNeedle ,
860
+ needleDetails ,
832
861
logLevel = 0
833
862
) {
834
- if ( reNeedle === undefined ) { return false ; }
835
863
const safe = safeSelf ( ) ;
836
864
const exceptionToken = getExceptionToken ( ) ;
837
865
const error = new safe . Error ( exceptionToken ) ;
@@ -861,7 +889,7 @@ function matchesStackTrace(
861
889
}
862
890
lines [ 0 ] = `stackDepth:${ lines . length - 1 } ` ;
863
891
const stack = lines . join ( '\t' ) ;
864
- const r = safe . RegExp_test . call ( reNeedle , stack ) ;
892
+ const r = safe . testPattern ( needleDetails , stack ) ;
865
893
if (
866
894
logLevel === 1 ||
867
895
logLevel === 2 && r ||
@@ -1004,29 +1032,30 @@ builtinScriptlets.push({
1004
1032
'get-extra-args.fn' ,
1005
1033
'matches-stack-trace.fn' ,
1006
1034
'pattern-to-regex.fn' ,
1035
+ 'safe-self.fn' ,
1007
1036
] ,
1008
1037
} ) ;
1009
- // Status is currently experimental
1010
1038
function abortOnStackTrace (
1011
1039
chain = '' ,
1012
1040
needle = ''
1013
1041
) {
1014
1042
if ( typeof chain !== 'string' ) { return ; }
1015
- const reNeedle = patternToRegex ( needle ) ;
1043
+ const safe = safeSelf ( ) ;
1044
+ const needleDetails = safe . initPattern ( needle , { canNegate : true } ) ;
1016
1045
const extraArgs = getExtraArgs ( Array . from ( arguments ) , 2 ) ;
1017
1046
const makeProxy = function ( owner , chain ) {
1018
1047
const pos = chain . indexOf ( '.' ) ;
1019
1048
if ( pos === - 1 ) {
1020
1049
let v = owner [ chain ] ;
1021
1050
Object . defineProperty ( owner , chain , {
1022
1051
get : function ( ) {
1023
- if ( matchesStackTrace ( reNeedle , extraArgs . log ) ) {
1052
+ if ( matchesStackTrace ( needleDetails , extraArgs . log ) ) {
1024
1053
throw new ReferenceError ( getExceptionToken ( ) ) ;
1025
1054
}
1026
1055
return v ;
1027
1056
} ,
1028
1057
set : function ( a ) {
1029
- if ( matchesStackTrace ( reNeedle , extraArgs . log ) ) {
1058
+ if ( matchesStackTrace ( needleDetails , extraArgs . log ) ) {
1030
1059
throw new ReferenceError ( getExceptionToken ( ) ) ;
1031
1060
}
1032
1061
v = a ;
@@ -1132,6 +1161,7 @@ builtinScriptlets.push({
1132
1161
fn : jsonPrune ,
1133
1162
dependencies : [
1134
1163
'object-prune.fn' ,
1164
+ 'safe-self.fn' ,
1135
1165
] ,
1136
1166
} ) ;
1137
1167
// When no "prune paths" argument is provided, the scriptlet is
@@ -1145,14 +1175,16 @@ function jsonPrune(
1145
1175
rawNeedlePaths = '' ,
1146
1176
stackNeedle = ''
1147
1177
) {
1178
+ const safe = safeSelf ( ) ;
1179
+ const stackNeedleDetails = safe . initPattern ( stackNeedle , { canNegate : true } ) ;
1148
1180
const extraArgs = Array . from ( arguments ) . slice ( 3 ) ;
1149
1181
JSON . parse = new Proxy ( JSON . parse , {
1150
1182
apply : function ( target , thisArg , args ) {
1151
1183
return objectPrune (
1152
1184
Reflect . apply ( target , thisArg , args ) ,
1153
1185
rawPrunePaths ,
1154
1186
rawNeedlePaths ,
1155
- stackNeedle ,
1187
+ stackNeedleDetails ,
1156
1188
...extraArgs
1157
1189
) ;
1158
1190
} ,
@@ -1164,7 +1196,7 @@ function jsonPrune(
1164
1196
o ,
1165
1197
rawPrunePaths ,
1166
1198
rawNeedlePaths ,
1167
- stackNeedle ,
1199
+ stackNeedleDetails ,
1168
1200
...extraArgs
1169
1201
)
1170
1202
) ;
0 commit comments