@@ -103,18 +103,25 @@ export class FirebaseError extends Error {
103
103
}
104
104
}
105
105
106
- export class ErrorFactory < ErrorCode extends string > {
106
+ export class ErrorFactory <
107
+ ErrorCode extends string ,
108
+ ErrorParams extends { readonly [ K in ErrorCode ] ?: ErrorData } = { }
109
+ > {
107
110
constructor (
108
111
private readonly service : string ,
109
112
private readonly serviceName : string ,
110
113
private readonly errors : ErrorMap < ErrorCode >
111
114
) { }
112
115
113
- create ( code : ErrorCode , data : ErrorData = { } ) : FirebaseError {
116
+ create < K extends ErrorCode > (
117
+ code : K ,
118
+ ...data : K extends keyof ErrorParams ? [ ErrorParams [ K ] ] : [ ]
119
+ ) : FirebaseError {
120
+ const customData = data [ 0 ] || { } ;
114
121
const fullCode = `${ this . service } /${ code } ` ;
115
122
const template = this . errors [ code ] ;
116
123
117
- const message = template ? replaceTemplate ( template , data ) : 'Error' ;
124
+ const message = template ? replaceTemplate ( template , customData ) : 'Error' ;
118
125
// Service Name: Error message (service/code).
119
126
const fullMessage = `${ this . serviceName } : ${ message } (${ fullCode } ).` ;
120
127
@@ -123,14 +130,14 @@ export class ErrorFactory<ErrorCode extends string> {
123
130
// Keys with an underscore at the end of their name are not included in
124
131
// error.data for some reason.
125
132
// TODO: Replace with Object.entries when lib is updated to es2017.
126
- for ( const key of Object . keys ( data ) ) {
133
+ for ( const key of Object . keys ( customData ) ) {
127
134
if ( key . slice ( - 1 ) !== '_' ) {
128
135
if ( key in error ) {
129
136
console . warn (
130
137
`Overwriting FirebaseError base field "${ key } " can cause unexpected behavior.`
131
138
) ;
132
139
}
133
- error [ key ] = data [ key ] ;
140
+ error [ key ] = customData [ key ] ;
134
141
}
135
142
}
136
143
0 commit comments