@@ -206,25 +206,8 @@ export class DataMasking {
206206 }
207207 if ( obj == null || typeof obj !== 'object' ) return ;
208208
209- if ( segments [ i ] === '*' ) {
210- if ( Array . isArray ( obj ) ) {
211- for ( let j = 0 ; j < obj . length ; j ++ ) {
212- walk ( obj [ j ] , i + 1 , [ ...current , String ( j ) ] ) ;
213- }
214- } else {
215- for ( const key of Object . keys ( obj as Record < string , unknown > ) ) {
216- if ( RESERVED_KEYS . has ( key ) ) continue ;
217- walk ( ( obj as Record < string , unknown > ) [ key ] , i + 1 , [
218- ...current ,
219- key ,
220- ] ) ;
221- }
222- }
223- } else {
224- const next = ( obj as Record < string , unknown > ) [ segments [ i ] ] ;
225- if ( next !== undefined ) {
226- walk ( next , i + 1 , [ ...current , segments [ i ] ] ) ;
227- }
209+ for ( const [ key , child ] of resolveWildcardEntries ( obj , segments [ i ] ) ) {
210+ walk ( child , i + 1 , [ ...current , key ] ) ;
228211 }
229212 } ;
230213
@@ -236,32 +219,50 @@ export class DataMasking {
236219
237220const RESERVED_KEYS = new Set ( [ '__proto__' , 'constructor' , 'prototype' ] ) ;
238221
239- function getAtPath ( data : unknown , path : string [ ] ) : unknown {
222+ const resolveWildcardEntries = (
223+ obj : object ,
224+ segment : string
225+ ) : [ string , unknown ] [ ] => {
226+ if ( segment !== '*' ) {
227+ const next = ( obj as Record < string , unknown > ) [ segment ] ;
228+
229+ return next !== undefined ? [ [ segment , next ] ] : [ ] ;
230+ }
231+ if ( Array . isArray ( obj ) ) {
232+ return obj . map ( ( v , i ) => [ String ( i ) , v ] ) ;
233+ }
234+
235+ return Object . keys ( obj )
236+ . filter ( ( k ) => ! RESERVED_KEYS . has ( k ) )
237+ . map ( ( k ) => [ k , ( obj as Record < string , unknown > ) [ k ] ] ) ;
238+ } ;
239+
240+ const getAtPath = ( data : unknown , path : string [ ] ) : unknown => {
240241 let current = data as Record < string , unknown > ;
241242 for ( const key of path ) {
242243 if ( RESERVED_KEYS . has ( key ) ) return undefined ;
243244 current = current [ key ] as Record < string , unknown > ;
244245 }
245246
246247 return current ;
247- }
248+ } ;
248249
249- function setAtPath ( data : unknown , path : string [ ] , value : unknown ) : void {
250+ const setAtPath = ( data : unknown , path : string [ ] , value : unknown ) : void => {
250251 let current = data as Record < string , unknown > ;
251252 for ( let i = 0 ; i < path . length - 1 ; i ++ ) {
252253 current = current [ path [ i ] ] as Record < string , unknown > ;
253254 }
254255 const lastKey = path . at ( - 1 ) ;
255256 if ( ! lastKey || RESERVED_KEYS . has ( lastKey ) ) return ;
256257 current [ lastKey ] = value ;
257- }
258+ } ;
258259
259- function applyMaskingRule ( value : string , rule : MaskingRule ) : string {
260+ const applyMaskingRule = ( value : string , rule : MaskingRule ) : string => {
260261 if ( rule . regexPattern && rule . maskFormat ) {
261262 return value . replace ( rule . regexPattern , rule . maskFormat ) ;
262263 }
263264 if ( rule . dynamicMask ) return '*' . repeat ( value . length ) ;
264265 if ( rule . customMask !== undefined ) return rule . customMask ;
265266
266267 return DEFAULT_MASK_VALUE ;
267- }
268+ } ;
0 commit comments