1
1
import * as fs from 'fs' ;
2
- import * as u from 'underscore' ;
2
+ import * as _ from 'underscore' ;
3
+
4
+ export enum ActionOnInvalid {
5
+ THROW = 'throw' ,
6
+ FILTER = 'filter' ,
7
+ }
8
+
9
+ export interface ConfigOptions {
10
+ onInvalidEntry : ActionOnInvalid ;
11
+ }
12
+
13
+ function defaultNewConfigOptions ( ) : ConfigOptions {
14
+ return {
15
+ onInvalidEntry : ActionOnInvalid . THROW ,
16
+ } ;
17
+ }
3
18
4
19
export interface Cluster {
5
20
readonly name : string ;
@@ -9,8 +24,10 @@ export interface Cluster {
9
24
readonly skipTLSVerify : boolean ;
10
25
}
11
26
12
- export function newClusters ( a : any ) : Cluster [ ] {
13
- return u . map ( a , clusterIterator ( ) ) ;
27
+ export function newClusters ( a : any , opts ?: Partial < ConfigOptions > ) : Cluster [ ] {
28
+ const options = Object . assign ( defaultNewConfigOptions ( ) , opts || { } ) ;
29
+
30
+ return _ . compact ( _ . map ( a , clusterIterator ( options . onInvalidEntry ) ) ) ;
14
31
}
15
32
16
33
export function exportCluster ( cluster : Cluster ) : any {
@@ -25,24 +42,34 @@ export function exportCluster(cluster: Cluster): any {
25
42
} ;
26
43
}
27
44
28
- function clusterIterator ( ) : u . ListIterator < any , Cluster > {
29
- return ( elt : any , i : number , list : u . List < any > ) : Cluster => {
30
- if ( ! elt . name ) {
31
- throw new Error ( `clusters[${ i } ].name is missing` ) ;
32
- }
33
- if ( ! elt . cluster ) {
34
- throw new Error ( `clusters[${ i } ].cluster is missing` ) ;
45
+ function clusterIterator ( onInvalidEntry : ActionOnInvalid ) : _ . ListIterator < any , Cluster | null > {
46
+ return ( elt : any , i : number , list : _ . List < any > ) : Cluster | null => {
47
+ try {
48
+ if ( ! elt . name ) {
49
+ throw new Error ( `clusters[${ i } ].name is missing` ) ;
50
+ }
51
+ if ( ! elt . cluster ) {
52
+ throw new Error ( `clusters[${ i } ].cluster is missing` ) ;
53
+ }
54
+ if ( ! elt . cluster . server ) {
55
+ throw new Error ( `clusters[${ i } ].cluster.server is missing` ) ;
56
+ }
57
+ return {
58
+ caData : elt . cluster [ 'certificate-authority-data' ] ,
59
+ caFile : elt . cluster [ 'certificate-authority' ] ,
60
+ name : elt . name ,
61
+ server : elt . cluster . server ,
62
+ skipTLSVerify : elt . cluster [ 'insecure-skip-tls-verify' ] === true ,
63
+ } ;
64
+ } catch ( err ) {
65
+ switch ( onInvalidEntry ) {
66
+ case ActionOnInvalid . FILTER :
67
+ return null ;
68
+ default :
69
+ case ActionOnInvalid . THROW :
70
+ throw err ;
71
+ }
35
72
}
36
- if ( ! elt . cluster . server ) {
37
- throw new Error ( `clusters[${ i } ].cluster.server is missing` ) ;
38
- }
39
- return {
40
- caData : elt . cluster [ 'certificate-authority-data' ] ,
41
- caFile : elt . cluster [ 'certificate-authority' ] ,
42
- name : elt . name ,
43
- server : elt . cluster . server ,
44
- skipTLSVerify : elt . cluster [ 'insecure-skip-tls-verify' ] === true ,
45
- } ;
46
73
} ;
47
74
}
48
75
@@ -59,8 +86,10 @@ export interface User {
59
86
readonly password ?: string ;
60
87
}
61
88
62
- export function newUsers ( a : any ) : User [ ] {
63
- return u . map ( a , userIterator ( ) ) ;
89
+ export function newUsers ( a : any , opts ?: Partial < ConfigOptions > ) : User [ ] {
90
+ const options = Object . assign ( defaultNewConfigOptions ( ) , opts || { } ) ;
91
+
92
+ return _ . compact ( _ . map ( a , userIterator ( options . onInvalidEntry ) ) ) ;
64
93
}
65
94
66
95
export function exportUser ( user : User ) : any {
@@ -80,23 +109,33 @@ export function exportUser(user: User): any {
80
109
} ;
81
110
}
82
111
83
- function userIterator ( ) : u . ListIterator < any , User > {
84
- return ( elt : any , i : number , list : u . List < any > ) : User => {
85
- if ( ! elt . name ) {
86
- throw new Error ( `users[${ i } ].name is missing` ) ;
112
+ function userIterator ( onInvalidEntry : ActionOnInvalid ) : _ . ListIterator < any , User | null > {
113
+ return ( elt : any , i : number , list : _ . List < any > ) : User | null => {
114
+ try {
115
+ if ( ! elt . name ) {
116
+ throw new Error ( `users[${ i } ].name is missing` ) ;
117
+ }
118
+ return {
119
+ authProvider : elt . user ? elt . user [ 'auth-provider' ] : null ,
120
+ certData : elt . user ? elt . user [ 'client-certificate-data' ] : null ,
121
+ certFile : elt . user ? elt . user [ 'client-certificate' ] : null ,
122
+ exec : elt . user ? elt . user . exec : null ,
123
+ keyData : elt . user ? elt . user [ 'client-key-data' ] : null ,
124
+ keyFile : elt . user ? elt . user [ 'client-key' ] : null ,
125
+ name : elt . name ,
126
+ token : findToken ( elt . user ) ,
127
+ password : elt . user ? elt . user . password : null ,
128
+ username : elt . user ? elt . user . username : null ,
129
+ } ;
130
+ } catch ( err ) {
131
+ switch ( onInvalidEntry ) {
132
+ case ActionOnInvalid . FILTER :
133
+ return null ;
134
+ default :
135
+ case ActionOnInvalid . THROW :
136
+ throw err ;
137
+ }
87
138
}
88
- return {
89
- authProvider : elt . user ? elt . user [ 'auth-provider' ] : null ,
90
- certData : elt . user ? elt . user [ 'client-certificate-data' ] : null ,
91
- certFile : elt . user ? elt . user [ 'client-certificate' ] : null ,
92
- exec : elt . user ? elt . user . exec : null ,
93
- keyData : elt . user ? elt . user [ 'client-key-data' ] : null ,
94
- keyFile : elt . user ? elt . user [ 'client-key' ] : null ,
95
- name : elt . name ,
96
- token : findToken ( elt . user ) ,
97
- password : elt . user ? elt . user . password : null ,
98
- username : elt . user ? elt . user . username : null ,
99
- } ;
100
139
} ;
101
140
}
102
141
@@ -118,8 +157,10 @@ export interface Context {
118
157
readonly namespace ?: string ;
119
158
}
120
159
121
- export function newContexts ( a : any ) : Context [ ] {
122
- return u . map ( a , contextIterator ( ) ) ;
160
+ export function newContexts ( a : any , opts ?: Partial < ConfigOptions > ) : Context [ ] {
161
+ const options = Object . assign ( defaultNewConfigOptions ( ) , opts || { } ) ;
162
+
163
+ return _ . compact ( _ . map ( a , contextIterator ( options . onInvalidEntry ) ) ) ;
123
164
}
124
165
125
166
export function exportContext ( ctx : Context ) : any {
@@ -129,22 +170,32 @@ export function exportContext(ctx: Context): any {
129
170
} ;
130
171
}
131
172
132
- function contextIterator ( ) : u . ListIterator < any , Context > {
133
- return ( elt : any , i : number , list : u . List < any > ) : Context => {
134
- if ( ! elt . name ) {
135
- throw new Error ( `contexts[${ i } ].name is missing` ) ;
136
- }
137
- if ( ! elt . context ) {
138
- throw new Error ( `contexts[${ i } ].context is missing` ) ;
139
- }
140
- if ( ! elt . context . cluster ) {
141
- throw new Error ( `contexts[${ i } ].context.cluster is missing` ) ;
173
+ function contextIterator ( onInvalidEntry : ActionOnInvalid ) : _ . ListIterator < any , Context | null > {
174
+ return ( elt : any , i : number , list : _ . List < any > ) : Context | null => {
175
+ try {
176
+ if ( ! elt . name ) {
177
+ throw new Error ( `contexts[${ i } ].name is missing` ) ;
178
+ }
179
+ if ( ! elt . context ) {
180
+ throw new Error ( `contexts[${ i } ].context is missing` ) ;
181
+ }
182
+ if ( ! elt . context . cluster ) {
183
+ throw new Error ( `contexts[${ i } ].context.cluster is missing` ) ;
184
+ }
185
+ return {
186
+ cluster : elt . context . cluster ,
187
+ name : elt . name ,
188
+ user : elt . context . user || undefined ,
189
+ namespace : elt . context . namespace || undefined ,
190
+ } ;
191
+ } catch ( err ) {
192
+ switch ( onInvalidEntry ) {
193
+ case ActionOnInvalid . FILTER :
194
+ return null ;
195
+ default :
196
+ case ActionOnInvalid . THROW :
197
+ throw err ;
198
+ }
142
199
}
143
- return {
144
- cluster : elt . context . cluster ,
145
- name : elt . name ,
146
- user : elt . context . user || undefined ,
147
- namespace : elt . context . namespace || undefined ,
148
- } ;
149
200
} ;
150
201
}
0 commit comments