@@ -8,7 +8,7 @@ export interface PII<T> {
8
8
9
9
// eslint-disable-next-line @typescript-eslint/no-explicit-any
10
10
const isPIIType = < T > ( val : any ) : val is PII < T > =>
11
- isPojo ( val ) && val . __brand === "PII"
11
+ isRecord ( val ) && val . __brand === "PII"
12
12
13
13
export const PII = < T > ( val : T , msg = "REDACTED" ) : PII < T > =>
14
14
isPIIType < T > ( val )
@@ -83,46 +83,58 @@ export const zip4With = <A, B, C, D, E>(
83
83
const proto = Object . prototype
84
84
const gpo = Object . getPrototypeOf
85
85
86
- // POJO: Plain Old Javascript Object
87
- const isPojo = ( obj : unknown ) : obj is Record < string , unknown > =>
86
+ const isRecord = ( obj : unknown ) : obj is Record < string , unknown > =>
88
87
obj === null || typeof obj !== "object" ? false : gpo ( obj ) === proto
89
88
89
+ // Function, regex, object, Number, String, etc
90
+ const isObject = ( value : unknown ) : boolean => {
91
+ const type = typeof value
92
+ return value != null && ( type == "object" || type == "function" )
93
+ }
94
+
90
95
// Does not handle Set or Map for now.
91
- const visitPII = < A , T > (
96
+ export const visitPII = < A , T > (
92
97
input : A ,
93
98
visitors : {
94
- object : ( value : Record < string , unknown > ) => T
99
+ record : ( value : Record < string , unknown > ) => T
100
+ object : ( value : unknown ) => T
95
101
array : ( value : Array < unknown > ) => T
96
102
primitive : ( value : A ) => T
97
103
} ,
98
104
) : T => {
99
- if ( isPojo ( input ) ) {
100
- return visitors . object ( input )
105
+ if ( isRecord ( input ) ) {
106
+ return visitors . record ( input )
101
107
}
102
108
103
109
if ( Array . isArray ( input ) ) {
104
110
return visitors . array ( input )
105
111
}
106
112
113
+ if ( isObject ( input ) ) {
114
+ return visitors . object ( input )
115
+ }
116
+
107
117
return visitors . primitive ( input )
108
118
}
109
119
110
120
export const containsPII = ( input : unknown ) : boolean =>
111
121
isPIIType ( input )
112
122
? true
113
123
: visitPII ( input , {
114
- object : o => Object . values ( o ) . some ( containsPII ) ,
124
+ record : o => Object . values ( o ) . some ( containsPII ) ,
115
125
array : a => a . some ( containsPII ) ,
116
126
primitive : p => isPIIType ( p ) ,
127
+ object : p => isPIIType ( p ) ,
117
128
} )
118
129
119
130
export const unwrapObject = ( input : unknown ) : unknown =>
120
131
visitPII ( isPIIType ( input ) ? unwrap ( input ) : input , {
121
- object : o =>
132
+ record : o =>
122
133
Object . keys ( o ) . reduce ( ( sum , key ) => {
123
134
sum [ key ] = unwrapObject ( o [ key ] )
124
135
return sum
125
136
} , { } as Record < string , unknown > ) ,
126
137
array : a => a . map ( unwrapObject ) ,
127
138
primitive : p => p ,
139
+ object : p => p ,
128
140
} )
0 commit comments