From 5eea8dbc8c789d981237ca5c57d014c6f5d3e518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristofer=20Borgstr=C3=B6m?= Date: Tue, 10 Oct 2023 11:32:00 +0200 Subject: [PATCH] feat(data): support parent matching for arrays --- src/scrubber.test.ts | 10 ++++++++++ src/scrubber.ts | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/scrubber.test.ts b/src/scrubber.test.ts index b77e378..508ac1a 100644 --- a/src/scrubber.test.ts +++ b/src/scrubber.test.ts @@ -386,6 +386,16 @@ test('Support scrubbing based on parent', () => { }) }) +test('Support scrubbing array based on parent', () => { + const data = { nested: { encryption: [{ key: 'secret' }] } } + const scrubber = new Scrubber(configParentScrubbersMock()) + const result = scrubber.scrub(data) + + expect(result).toEqual({ + nested: { encryption: [{ key: 'replaced' }] }, + }) +}) + test('Support scrubbing based on multi-level parent', () => { const data = { multi: { api: { secret: 'notsosecret' }, interim: { secret: '123456' } } } const scrubber = new Scrubber(configParentScrubbersMock()) diff --git a/src/scrubber.ts b/src/scrubber.ts index 9a38f8a..5f62866 100644 --- a/src/scrubber.ts +++ b/src/scrubber.ts @@ -73,6 +73,7 @@ export class Scrubber { } private applyScrubbers(data: T, parents: string[] = []): T { + const isArray = Array.isArray(data) const dataCopy: any = Array.isArray(data) ? [...data] : { ...data } Object.keys(dataCopy).forEach(key => { @@ -102,7 +103,8 @@ export class Scrubber { // Deep traverse if (typeof dataCopy[key] === 'object' && dataCopy[key]) { - const parentsNext = [...parents, key] + // Don't append array keys to parent array as it breaks parent matching + const parentsNext = isArray ? parents : [...parents, key] dataCopy[key] = this.applyScrubbers(dataCopy[key], parentsNext) }