11import * 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+ }
318
419export interface Cluster {
520 readonly name : string ;
@@ -9,8 +24,10 @@ export interface Cluster {
924 readonly skipTLSVerify : boolean ;
1025}
1126
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 ) ) ) ;
1431}
1532
1633export function exportCluster ( cluster : Cluster ) : any {
@@ -25,24 +42,34 @@ export function exportCluster(cluster: Cluster): any {
2542 } ;
2643}
2744
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+ }
3572 }
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- } ;
4673 } ;
4774}
4875
@@ -59,8 +86,10 @@ export interface User {
5986 readonly password ?: string ;
6087}
6188
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 ) ) ) ;
6493}
6594
6695export function exportUser ( user : User ) : any {
@@ -80,23 +109,33 @@ export function exportUser(user: User): any {
80109 } ;
81110}
82111
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+ }
87138 }
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- } ;
100139 } ;
101140}
102141
@@ -118,8 +157,10 @@ export interface Context {
118157 readonly namespace ?: string ;
119158}
120159
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 ) ) ) ;
123164}
124165
125166export function exportContext ( ctx : Context ) : any {
@@ -129,22 +170,32 @@ export function exportContext(ctx: Context): any {
129170 } ;
130171}
131172
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+ }
142199 }
143- return {
144- cluster : elt . context . cluster ,
145- name : elt . name ,
146- user : elt . context . user || undefined ,
147- namespace : elt . context . namespace || undefined ,
148- } ;
149200 } ;
150201}
0 commit comments