Skip to content

Commit 5208fc7

Browse files
committed
refactor(data-masking): extract resolveWildcardEntries and use arrow functions
Reduce cyclomatic complexity in walk by extracting wildcard/literal segment resolution into a helper. Convert module-level functions to arrow expressions per project code standards.
1 parent e0d9c71 commit 5208fc7

1 file changed

Lines changed: 26 additions & 25 deletions

File tree

packages/data-masking/src/DataMasking.ts

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

237220
const 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

Comments
 (0)