Skip to content

Commit 6598d2d

Browse files
committed
chore: fix sonarqube findings
1 parent 91a05a1 commit 6598d2d

2 files changed

Lines changed: 26 additions & 16 deletions

File tree

packages/data-masking/src/DataMasking.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import {
88
import type {
99
DataMaskingConstructorOptions,
1010
DecryptOptions,
11-
EncryptOptions,
1211
EncryptionProvider,
12+
EncryptOptions,
1313
EraseOptions,
1414
MaskingRule,
1515
} from './types.js';
@@ -52,7 +52,10 @@ export class DataMasking {
5252

5353
if (options.maskingRules) {
5454
for (const [field, rule] of Object.entries(options.maskingRules)) {
55-
for (const path of this.#resolveFieldPaths(copy as Record<string, unknown>, field)) {
55+
for (const path of this.#resolveFieldPaths(
56+
copy as Record<string, unknown>,
57+
field
58+
)) {
5659
const value = getAtPath(copy, path);
5760
if (typeof value !== 'string') {
5861
throw new DataMaskingUnsupportedTypeError(
@@ -67,7 +70,10 @@ export class DataMasking {
6770
}
6871

6972
for (const field of options.fields ?? []) {
70-
const paths = this.#resolveFieldPaths(copy as Record<string, unknown>, field);
73+
const paths = this.#resolveFieldPaths(
74+
copy as Record<string, unknown>,
75+
field
76+
);
7177
if (paths.length === 0 && this.#throwOnMissingField) {
7278
throw new DataMaskingFieldNotFoundError(`Field not found: '${field}'`);
7379
}
@@ -164,7 +170,10 @@ export class DataMasking {
164170
const operations: Promise<void>[] = [];
165171

166172
for (const field of fields) {
167-
for (const path of this.#resolveFieldPaths(data as Record<string, unknown>, field)) {
173+
for (const path of this.#resolveFieldPaths(
174+
data as Record<string, unknown>,
175+
field
176+
)) {
168177
operations.push(
169178
transform(getAtPath(data, path)).then((result) =>
170179
setAtPath(data, path, result)
@@ -176,7 +185,10 @@ export class DataMasking {
176185
await Promise.all(operations);
177186
}
178187

179-
#resolveFieldPaths(data: Record<string, unknown>, expression: string): string[][] {
188+
#resolveFieldPaths(
189+
data: Record<string, unknown>,
190+
expression: string
191+
): string[][] {
180192
// JMESPath validates the expression and checks if it matches anything
181193
const matched = search(expression, data);
182194
if (matched == null || (Array.isArray(matched) && matched.length === 0)) {
@@ -234,8 +246,8 @@ function setAtPath(data: unknown, path: string[], value: unknown): void {
234246
if (current == null || typeof current !== 'object') return;
235247
current = (current as Record<string, unknown>)[path[i]];
236248
}
237-
const lastKey = path[path.length - 1];
238-
if (RESERVED_KEYS.has(lastKey)) return;
249+
const lastKey = path.at(-1);
250+
if (!lastKey || RESERVED_KEYS.has(lastKey)) return;
239251
if (current != null && typeof current === 'object') {
240252
(current as Record<string, unknown>)[lastKey] = value;
241253
}

packages/data-masking/tests/unit/AWSEncryptionSDKProvider.test.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@ vi.mock('@aws-crypto/client-node', () => {
55
const mockEncrypt = vi.fn(async (_cmm: unknown, plaintext: Uint8Array) => ({
66
result: plaintext,
77
}));
8-
const mockDecrypt = vi.fn(
9-
async (_cmm: unknown, ciphertext: Uint8Array) => ({
10-
plaintext: ciphertext,
11-
messageHeader: { encryptionContext: {} },
12-
})
13-
);
14-
15-
class MockKmsKeyringNode {}
16-
class MockNodeCachingMaterialsManager {}
8+
const mockDecrypt = vi.fn(async (_cmm: unknown, ciphertext: Uint8Array) => ({
9+
plaintext: ciphertext,
10+
messageHeader: { encryptionContext: {} },
11+
}));
12+
13+
const MockKmsKeyringNode = vi.fn();
14+
const MockNodeCachingMaterialsManager = vi.fn();
1715

1816
return {
1917
buildEncrypt: () => ({ encrypt: mockEncrypt }),

0 commit comments

Comments
 (0)