@ogcio/building-blocks-sdk 0.2.38 → 0.2.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +7 -0
- package/dist/client/utils/client-utils.d.ts +15 -0
- package/dist/client/utils/client-utils.d.ts.map +1 -1
- package/dist/client/utils/client-utils.js +35 -1
- package/dist/client/utils/client-utils.js.map +1 -1
- package/dist/client/utils/client-utils.test.d.ts +2 -0
- package/dist/client/utils/client-utils.test.d.ts.map +1 -0
- package/dist/client/utils/client-utils.test.js +118 -0
- package/dist/client/utils/client-utils.test.js.map +1 -0
- package/package.json +1 -1
- package/src/client/utils/client-utils.test.ts +136 -0
- package/src/client/utils/client-utils.ts +45 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.2.39](https://github.com/ogcio/building-blocks-sdk/compare/@ogcio/building-blocks-sdk@v0.2.38...@ogcio/building-blocks-sdk@v0.2.39) (2025-06-24)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* AB[#29456](https://github.com/ogcio/building-blocks-sdk/issues/29456) redact PII fields from formatted response logger ([#223](https://github.com/ogcio/building-blocks-sdk/issues/223)) ([3447aa6](https://github.com/ogcio/building-blocks-sdk/commit/3447aa624258b28176c6d2debbdbef908b70e64f))
|
|
9
|
+
|
|
3
10
|
## [0.2.38](https://github.com/ogcio/building-blocks-sdk/compare/@ogcio/building-blocks-sdk@v0.2.37...@ogcio/building-blocks-sdk@v0.2.38) (2025-05-28)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -13,6 +13,21 @@ export declare function preparePaginationParams(paginationParams?: PaginationPar
|
|
|
13
13
|
offset?: string;
|
|
14
14
|
limit?: string;
|
|
15
15
|
};
|
|
16
|
+
/**
|
|
17
|
+
* Performs shallow redaction of specified fields from the input data.
|
|
18
|
+
*
|
|
19
|
+
* Behavior:
|
|
20
|
+
* - If `data` is an object, returns a new object with keys in `keysToRemove` removed (shallow only).
|
|
21
|
+
* - If `data` is an array, returns a new array where:
|
|
22
|
+
* - Each element that is an object has keys in `keysToRemove` removed.
|
|
23
|
+
* - Non-object elements are omitted from the output array.
|
|
24
|
+
* - For all other types (including null/undefined), returns an empty object.
|
|
25
|
+
*
|
|
26
|
+
* @param {unknown} data - The input data to redact fields from. Can be an object, array, or any other type.
|
|
27
|
+
* @param {string[]} keysToRemove - Array of keys to be removed from the object(s).
|
|
28
|
+
* @returns {Record<string, unknown> | Record<string, unknown>[]} The redacted data: a new object or array of objects without the specified keys, or an empty object.
|
|
29
|
+
*/
|
|
30
|
+
export declare function redactFields(data: unknown, keysToRemove: string[]): Record<string, unknown> | Record<string, unknown>[];
|
|
16
31
|
export declare function formatResponse<G extends Record<string | number, any>, O>(response: FetchResponse<G, O, "application/json">, serviceName: string, logger?: Logger): DataResponseValue<G, O>;
|
|
17
32
|
export declare function formatError<G, O>(reason: unknown, serviceName: string, logger?: Logger): DataResponseValue<G, O>;
|
|
18
33
|
export declare function parseJwtToken(token: string): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-utils.d.ts","sourceRoot":"","sources":["../../../src/client/utils/client-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,QAAQ,EACR,eAAe,EACf,iBAAiB,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI,eAAe,CACnD,UAAU,CACR,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAC3D,kBAAkB,CACnB,EACD,CAAC,CACF,GAAG;IACF,KAAK,EAAE,eAAe,CACpB,UAAU,CACR,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAC9D,kBAAkB,CACnB,EACD,CAAC,CACF,CAAC;CACH,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,sBAEzE;AAED,wBAAgB,uBAAuB,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,GAAG;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAYA;AAGD,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EACtE,QAAQ,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,EACjD,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"client-utils.d.ts","sourceRoot":"","sources":["../../../src/client/utils/client-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,QAAQ,EACR,eAAe,EACf,iBAAiB,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI,eAAe,CACnD,UAAU,CACR,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAC3D,kBAAkB,CACnB,EACD,CAAC,CACF,GAAG;IACF,KAAK,EAAE,eAAe,CACpB,UAAU,CACR,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAC9D,kBAAkB,CACnB,EACD,CAAC,CACF,CAAC;CACH,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,sBAEzE;AAED,wBAAgB,uBAAuB,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,GAAG;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAYA;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,uDAoBjE;AAGD,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EACtE,QAAQ,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,EACjD,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAwCzB;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAC9B,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAKzB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAeA;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,GACV,MAAM,CAcR;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIhD"}
|
|
@@ -11,6 +11,35 @@ export function preparePaginationParams(paginationParams) {
|
|
|
11
11
|
}
|
|
12
12
|
return output;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Performs shallow redaction of specified fields from the input data.
|
|
16
|
+
*
|
|
17
|
+
* Behavior:
|
|
18
|
+
* - If `data` is an object, returns a new object with keys in `keysToRemove` removed (shallow only).
|
|
19
|
+
* - If `data` is an array, returns a new array where:
|
|
20
|
+
* - Each element that is an object has keys in `keysToRemove` removed.
|
|
21
|
+
* - Non-object elements are omitted from the output array.
|
|
22
|
+
* - For all other types (including null/undefined), returns an empty object.
|
|
23
|
+
*
|
|
24
|
+
* @param {unknown} data - The input data to redact fields from. Can be an object, array, or any other type.
|
|
25
|
+
* @param {string[]} keysToRemove - Array of keys to be removed from the object(s).
|
|
26
|
+
* @returns {Record<string, unknown> | Record<string, unknown>[]} The redacted data: a new object or array of objects without the specified keys, or an empty object.
|
|
27
|
+
*/
|
|
28
|
+
export function redactFields(data, keysToRemove) {
|
|
29
|
+
let redactedData = {};
|
|
30
|
+
if (Array.isArray(data)) {
|
|
31
|
+
redactedData = [];
|
|
32
|
+
for (const d of data) {
|
|
33
|
+
if (d && typeof d === "object") {
|
|
34
|
+
redactedData.push(Object.fromEntries(Object.entries(d).filter(([key]) => !keysToRemove.includes(key))));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (data && typeof data === "object") {
|
|
39
|
+
redactedData = Object.fromEntries(Object.entries(data).filter(([key]) => !keysToRemove.includes(key)));
|
|
40
|
+
}
|
|
41
|
+
return redactedData;
|
|
42
|
+
}
|
|
14
43
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
15
44
|
export function formatResponse(response, serviceName, logger) {
|
|
16
45
|
let outputData = undefined;
|
|
@@ -36,7 +65,12 @@ export function formatResponse(response, serviceName, logger) {
|
|
|
36
65
|
metadata: outputMetadata,
|
|
37
66
|
error: response.error,
|
|
38
67
|
};
|
|
39
|
-
logger?.trace({
|
|
68
|
+
logger?.trace({
|
|
69
|
+
formattedResponse: redactFields(formattedResponse, [
|
|
70
|
+
"receiverFullName",
|
|
71
|
+
"subject",
|
|
72
|
+
]),
|
|
73
|
+
}, `${serviceName} - Formatted response`);
|
|
40
74
|
return formattedResponse;
|
|
41
75
|
}
|
|
42
76
|
export function formatError(reason, serviceName, logger) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-utils.js","sourceRoot":"","sources":["../../../src/client/utils/client-utils.ts"],"names":[],"mappings":"AA+BA,MAAM,UAAU,mBAAmB,CAAC,QAAsC;IACxE,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,gBAAmC;IAIzE,MAAM,MAAM,GAAwC,EAAE,CAAC;IAEvD,IAAI,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,gBAAgB,EAAE,KAAK,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,cAAc,CAC5B,QAAiD,EACjD,WAAmB,EACnB,MAAe;IAEf,IAAI,UAAU,GAAG,SAAS,CAAC;IAC3B,IAAI,cAAc,GAAG,SAAS,CAAC;IAE/B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,EAAE,KAAK,CAAC,GAAG,WAAW,uBAAuB,CAAC,CAAC;QACrD,OAAO,EAA6B,CAAC;IACvC,CAAC;IAED,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,GAAG,WAAW,iBAAiB,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClD,2CAA2C;QAC3C,sCAAsC;QACtC,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;QAC9D,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;QAEtE,IAAI,gBAAgB,EAAE,CAAC;YACrB,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED,MAAM,iBAAiB,GAAG;QACxB,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,cAAc;QACxB,KAAK,EAAE,QAAQ,CAAC,KAAK;KACgB,CAAC;IAExC,MAAM,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"client-utils.js","sourceRoot":"","sources":["../../../src/client/utils/client-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-utils.test.d.ts","sourceRoot":"","sources":["../../../src/client/utils/client-utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { redactFields } from "./client-utils.js";
|
|
3
|
+
describe(redactFields.name, () => {
|
|
4
|
+
describe("object input", () => {
|
|
5
|
+
it("removes specified keys from an object (happy case)", () => {
|
|
6
|
+
const obj = { a: 1, b: 2, c: 3 };
|
|
7
|
+
const result = redactFields(obj, ["b", "c"]);
|
|
8
|
+
expect(result).toEqual({ a: 1 });
|
|
9
|
+
});
|
|
10
|
+
it("returns full object if keysToRemove is empty", () => {
|
|
11
|
+
const obj = { a: 1, b: 2 };
|
|
12
|
+
const result = redactFields(obj, []);
|
|
13
|
+
expect(result).toEqual(obj);
|
|
14
|
+
});
|
|
15
|
+
it("returns full object if keysToRemove keys are not in object", () => {
|
|
16
|
+
const obj = { a: 1, b: 2 };
|
|
17
|
+
const result = redactFields(obj, ["x", "y"]);
|
|
18
|
+
expect(result).toEqual(obj);
|
|
19
|
+
});
|
|
20
|
+
it("works with keysToRemove partially present", () => {
|
|
21
|
+
const obj = { a: 1, b: 2, c: 3 };
|
|
22
|
+
const result = redactFields(obj, ["b", "x"]);
|
|
23
|
+
expect(result).toEqual({ a: 1, c: 3 });
|
|
24
|
+
});
|
|
25
|
+
it("returns empty object if all keys removed", () => {
|
|
26
|
+
const obj = { a: 1 };
|
|
27
|
+
const result = redactFields(obj, ["a"]);
|
|
28
|
+
expect(result).toEqual({});
|
|
29
|
+
});
|
|
30
|
+
it("handles non-object input (string) gracefully", () => {
|
|
31
|
+
const result = redactFields("string", ["a"]);
|
|
32
|
+
expect(result).toEqual({});
|
|
33
|
+
});
|
|
34
|
+
it("handles non-object input (number) gracefully", () => {
|
|
35
|
+
const result = redactFields(123, ["a"]);
|
|
36
|
+
expect(result).toEqual({});
|
|
37
|
+
});
|
|
38
|
+
it("does not throw if keysToRemove contains duplicates", () => {
|
|
39
|
+
const obj = { a: 1, b: 2, c: 3 };
|
|
40
|
+
const result = redactFields(obj, ["b", "b", "c"]);
|
|
41
|
+
expect(result).toEqual({ a: 1 });
|
|
42
|
+
});
|
|
43
|
+
it("returns empty object if input is empty object", () => {
|
|
44
|
+
const obj = {};
|
|
45
|
+
const result = redactFields(obj, ["a"]);
|
|
46
|
+
expect(result).toEqual({});
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe("array input", () => {
|
|
50
|
+
it("removes specified keys from array of objects (happy case)", () => {
|
|
51
|
+
const arr = [
|
|
52
|
+
{ a: 1, b: 2, c: 3 },
|
|
53
|
+
{ a: 4, b: 5, c: 6 },
|
|
54
|
+
];
|
|
55
|
+
const result = redactFields(arr, ["b", "c"]);
|
|
56
|
+
expect(result).toEqual([{ a: 1 }, { a: 4 }]);
|
|
57
|
+
});
|
|
58
|
+
it("returns full array if keysToRemove is empty", () => {
|
|
59
|
+
const arr = [
|
|
60
|
+
{ a: 1, b: 2 },
|
|
61
|
+
{ a: 3, b: 4 },
|
|
62
|
+
];
|
|
63
|
+
const result = redactFields(arr, []);
|
|
64
|
+
expect(result).toEqual(arr);
|
|
65
|
+
});
|
|
66
|
+
it("returns full array if keysToRemove keys are not in objects", () => {
|
|
67
|
+
const arr = [
|
|
68
|
+
{ a: 1, b: 2 },
|
|
69
|
+
{ a: 3, b: 4 },
|
|
70
|
+
];
|
|
71
|
+
const result = redactFields(arr, ["x", "y"]);
|
|
72
|
+
expect(result).toEqual(arr);
|
|
73
|
+
});
|
|
74
|
+
it("works with keysToRemove partially present", () => {
|
|
75
|
+
const arr = [
|
|
76
|
+
{ a: 1, b: 2, c: 3 },
|
|
77
|
+
{ a: 4, b: 5, c: 6 },
|
|
78
|
+
];
|
|
79
|
+
const result = redactFields(arr, ["b", "x"]);
|
|
80
|
+
expect(result).toEqual([
|
|
81
|
+
{ a: 1, c: 3 },
|
|
82
|
+
{ a: 4, c: 6 },
|
|
83
|
+
]);
|
|
84
|
+
});
|
|
85
|
+
it("returns array of empty objects if all keys removed", () => {
|
|
86
|
+
const arr = [{ a: 1 }, { a: 2 }];
|
|
87
|
+
const result = redactFields(arr, ["a"]);
|
|
88
|
+
expect(result).toEqual([{}, {}]);
|
|
89
|
+
});
|
|
90
|
+
it("handles non-object items in array gracefully", () => {
|
|
91
|
+
const arr = [{ a: 1, b: 2 }, "string", 123, null, { a: 3, b: 4 }];
|
|
92
|
+
const result = redactFields(arr, ["b"]);
|
|
93
|
+
expect(result).toEqual([{ a: 1 }, { a: 3 }]);
|
|
94
|
+
});
|
|
95
|
+
it("does not throw if keysToRemove contains duplicates", () => {
|
|
96
|
+
const arr = [
|
|
97
|
+
{ a: 1, b: 2, c: 3 },
|
|
98
|
+
{ a: 4, b: 5, c: 6 },
|
|
99
|
+
];
|
|
100
|
+
const result = redactFields(arr, ["b", "b", "c"]);
|
|
101
|
+
expect(result).toEqual([{ a: 1 }, { a: 4 }]);
|
|
102
|
+
});
|
|
103
|
+
it("returns empty array if input is empty array", () => {
|
|
104
|
+
const arr = [];
|
|
105
|
+
const result = redactFields(arr, ["a"]);
|
|
106
|
+
expect(result).toEqual([]);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
it("handles null input gracefully", () => {
|
|
110
|
+
const result = redactFields(null, ["a"]);
|
|
111
|
+
expect(result).toEqual({});
|
|
112
|
+
});
|
|
113
|
+
it("handles undefined input gracefully", () => {
|
|
114
|
+
const result = redactFields(undefined, ["a"]);
|
|
115
|
+
expect(result).toEqual({});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=client-utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-utils.test.js","sourceRoot":"","sources":["../../../src/client/utils/client-utils.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { redactFields } from "./client-utils.js";
|
|
3
|
+
|
|
4
|
+
describe(redactFields.name, () => {
|
|
5
|
+
describe("object input", () => {
|
|
6
|
+
it("removes specified keys from an object (happy case)", () => {
|
|
7
|
+
const obj = { a: 1, b: 2, c: 3 };
|
|
8
|
+
const result = redactFields(obj, ["b", "c"]);
|
|
9
|
+
expect(result).toEqual({ a: 1 });
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it("returns full object if keysToRemove is empty", () => {
|
|
13
|
+
const obj = { a: 1, b: 2 };
|
|
14
|
+
const result = redactFields(obj, []);
|
|
15
|
+
expect(result).toEqual(obj);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("returns full object if keysToRemove keys are not in object", () => {
|
|
19
|
+
const obj = { a: 1, b: 2 };
|
|
20
|
+
const result = redactFields(obj, ["x", "y"]);
|
|
21
|
+
expect(result).toEqual(obj);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("works with keysToRemove partially present", () => {
|
|
25
|
+
const obj = { a: 1, b: 2, c: 3 };
|
|
26
|
+
const result = redactFields(obj, ["b", "x"]);
|
|
27
|
+
expect(result).toEqual({ a: 1, c: 3 });
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("returns empty object if all keys removed", () => {
|
|
31
|
+
const obj = { a: 1 };
|
|
32
|
+
const result = redactFields(obj, ["a"]);
|
|
33
|
+
expect(result).toEqual({});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("handles non-object input (string) gracefully", () => {
|
|
37
|
+
const result = redactFields("string", ["a"]);
|
|
38
|
+
expect(result).toEqual({});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("handles non-object input (number) gracefully", () => {
|
|
42
|
+
const result = redactFields(123, ["a"]);
|
|
43
|
+
expect(result).toEqual({});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("does not throw if keysToRemove contains duplicates", () => {
|
|
47
|
+
const obj = { a: 1, b: 2, c: 3 };
|
|
48
|
+
const result = redactFields(obj, ["b", "b", "c"]);
|
|
49
|
+
expect(result).toEqual({ a: 1 });
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("returns empty object if input is empty object", () => {
|
|
53
|
+
const obj = {};
|
|
54
|
+
const result = redactFields(obj, ["a"]);
|
|
55
|
+
expect(result).toEqual({});
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe("array input", () => {
|
|
60
|
+
it("removes specified keys from array of objects (happy case)", () => {
|
|
61
|
+
const arr = [
|
|
62
|
+
{ a: 1, b: 2, c: 3 },
|
|
63
|
+
{ a: 4, b: 5, c: 6 },
|
|
64
|
+
];
|
|
65
|
+
const result = redactFields(arr, ["b", "c"]);
|
|
66
|
+
expect(result).toEqual([{ a: 1 }, { a: 4 }]);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("returns full array if keysToRemove is empty", () => {
|
|
70
|
+
const arr = [
|
|
71
|
+
{ a: 1, b: 2 },
|
|
72
|
+
{ a: 3, b: 4 },
|
|
73
|
+
];
|
|
74
|
+
const result = redactFields(arr, []);
|
|
75
|
+
expect(result).toEqual(arr);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("returns full array if keysToRemove keys are not in objects", () => {
|
|
79
|
+
const arr = [
|
|
80
|
+
{ a: 1, b: 2 },
|
|
81
|
+
{ a: 3, b: 4 },
|
|
82
|
+
];
|
|
83
|
+
const result = redactFields(arr, ["x", "y"]);
|
|
84
|
+
expect(result).toEqual(arr);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("works with keysToRemove partially present", () => {
|
|
88
|
+
const arr = [
|
|
89
|
+
{ a: 1, b: 2, c: 3 },
|
|
90
|
+
{ a: 4, b: 5, c: 6 },
|
|
91
|
+
];
|
|
92
|
+
const result = redactFields(arr, ["b", "x"]);
|
|
93
|
+
expect(result).toEqual([
|
|
94
|
+
{ a: 1, c: 3 },
|
|
95
|
+
{ a: 4, c: 6 },
|
|
96
|
+
]);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("returns array of empty objects if all keys removed", () => {
|
|
100
|
+
const arr = [{ a: 1 }, { a: 2 }];
|
|
101
|
+
const result = redactFields(arr, ["a"]);
|
|
102
|
+
expect(result).toEqual([{}, {}]);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("handles non-object items in array gracefully", () => {
|
|
106
|
+
const arr = [{ a: 1, b: 2 }, "string", 123, null, { a: 3, b: 4 }];
|
|
107
|
+
const result = redactFields(arr, ["b"]);
|
|
108
|
+
expect(result).toEqual([{ a: 1 }, { a: 3 }]);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("does not throw if keysToRemove contains duplicates", () => {
|
|
112
|
+
const arr = [
|
|
113
|
+
{ a: 1, b: 2, c: 3 },
|
|
114
|
+
{ a: 4, b: 5, c: 6 },
|
|
115
|
+
];
|
|
116
|
+
const result = redactFields(arr, ["b", "b", "c"]);
|
|
117
|
+
expect(result).toEqual([{ a: 1 }, { a: 4 }]);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("returns empty array if input is empty array", () => {
|
|
121
|
+
const arr: unknown[] = [];
|
|
122
|
+
const result = redactFields(arr, ["a"]);
|
|
123
|
+
expect(result).toEqual([]);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it("handles null input gracefully", () => {
|
|
128
|
+
const result = redactFields(null, ["a"]);
|
|
129
|
+
expect(result).toEqual({});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("handles undefined input gracefully", () => {
|
|
133
|
+
const result = redactFields(undefined, ["a"]);
|
|
134
|
+
expect(result).toEqual({});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
@@ -50,6 +50,42 @@ export function preparePaginationParams(paginationParams?: PaginationParams): {
|
|
|
50
50
|
return output;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Performs shallow redaction of specified fields from the input data.
|
|
55
|
+
*
|
|
56
|
+
* Behavior:
|
|
57
|
+
* - If `data` is an object, returns a new object with keys in `keysToRemove` removed (shallow only).
|
|
58
|
+
* - If `data` is an array, returns a new array where:
|
|
59
|
+
* - Each element that is an object has keys in `keysToRemove` removed.
|
|
60
|
+
* - Non-object elements are omitted from the output array.
|
|
61
|
+
* - For all other types (including null/undefined), returns an empty object.
|
|
62
|
+
*
|
|
63
|
+
* @param {unknown} data - The input data to redact fields from. Can be an object, array, or any other type.
|
|
64
|
+
* @param {string[]} keysToRemove - Array of keys to be removed from the object(s).
|
|
65
|
+
* @returns {Record<string, unknown> | Record<string, unknown>[]} The redacted data: a new object or array of objects without the specified keys, or an empty object.
|
|
66
|
+
*/
|
|
67
|
+
export function redactFields(data: unknown, keysToRemove: string[]) {
|
|
68
|
+
let redactedData: Record<string, unknown> | Record<string, unknown>[] = {};
|
|
69
|
+
if (Array.isArray(data)) {
|
|
70
|
+
redactedData = [];
|
|
71
|
+
for (const d of data) {
|
|
72
|
+
if (d && typeof d === "object") {
|
|
73
|
+
redactedData.push(
|
|
74
|
+
Object.fromEntries(
|
|
75
|
+
Object.entries(d).filter(([key]) => !keysToRemove.includes(key)),
|
|
76
|
+
),
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
} else if (data && typeof data === "object") {
|
|
81
|
+
redactedData = Object.fromEntries(
|
|
82
|
+
Object.entries(data).filter(([key]) => !keysToRemove.includes(key)),
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return redactedData;
|
|
87
|
+
}
|
|
88
|
+
|
|
53
89
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
54
90
|
export function formatResponse<G extends Record<string | number, any>, O>(
|
|
55
91
|
response: FetchResponse<G, O, "application/json">,
|
|
@@ -84,7 +120,15 @@ export function formatResponse<G extends Record<string | number, any>, O>(
|
|
|
84
120
|
error: response.error,
|
|
85
121
|
} as unknown as DataResponseValue<G, O>;
|
|
86
122
|
|
|
87
|
-
logger?.trace(
|
|
123
|
+
logger?.trace(
|
|
124
|
+
{
|
|
125
|
+
formattedResponse: redactFields(formattedResponse, [
|
|
126
|
+
"receiverFullName",
|
|
127
|
+
"subject",
|
|
128
|
+
]),
|
|
129
|
+
},
|
|
130
|
+
`${serviceName} - Formatted response`,
|
|
131
|
+
);
|
|
88
132
|
|
|
89
133
|
return formattedResponse;
|
|
90
134
|
}
|