@@ -51,30 +51,16 @@ export interface CommonOptions {
5151 topology : 'standalone' | 'replset' | 'sharded' ;
5252}
5353
54- export type RSOptions =
55- | {
56- arbiters ?: number ;
57- secondaries ?: number ;
58- rsMembers ?: never ;
59- }
60- | {
61- arbiters ?: never ;
62- secondaries ?: never ;
63- rsMembers : RSMemberOptions [ ] ;
64- } ;
54+ export type RSOptions = {
55+ arbiters ?: number ;
56+ secondaries ?: number ;
57+ rsMembers ?: RSMemberOptions [ ] ;
58+ } ;
6559
6660export type ShardedOptions = {
6761 mongosArgs ?: string [ ] [ ] ;
68- } & (
69- | {
70- shards ?: number ;
71- shardArgs ?: never ;
72- }
73- | {
74- shards ?: never ;
75- shardArgs ?: string [ ] [ ] ;
76- }
77- ) ;
62+ shards ?: number | Partial < MongoClusterOptions > [ ] ;
63+ } ;
7864
7965export type MongoClusterOptions = Pick <
8066 MongoServerOptions ,
@@ -167,25 +153,29 @@ function processRSMembers(options: MongoClusterOptions): {
167153}
168154
169155function processShardOptions ( options : MongoClusterOptions ) : {
170- shardArgs : string [ ] [ ] ;
156+ shards : Partial < MongoClusterOptions > [ ] ;
171157 mongosArgs : string [ ] [ ] ;
172158} {
173- const {
174- shardArgs = range ( ( options . shards ?? 3 ) + 1 ) . map ( ( ) => [ ] ) ,
175- mongosArgs = [ [ ] ] ,
176- args = [ ] ,
177- } = options ;
159+ const shards : Partial < MongoClusterOptions > [ ] =
160+ typeof options . shards === 'number' || ! options . shards
161+ ? range ( ( options . shards ?? 3 ) + 1 ) . map (
162+ ( ) => ( { } ) as Partial < MongoClusterOptions > ,
163+ )
164+ : options . shards ;
165+ const { mongosArgs = [ [ ] ] , args = [ ] } = options ;
178166 return {
179- shardArgs : shardArgs . map ( ( perShardArgs , i ) => [
180- ...removePortArg ( args ) ,
181- ...perShardArgs ,
182- ...( perShardArgs . includes ( '--configsvr' ) ||
183- perShardArgs . includes ( '--shardsvr' )
184- ? [ ]
185- : i === 0
186- ? [ '--configsvr' ]
187- : [ '--shardsvr' ] ) ,
188- ] ) ,
167+ shards : shards . map ( ( { args = [ ] , ...perShardOpts } , i ) => ( {
168+ ...perShardOpts ,
169+ args : [
170+ ...removePortArg ( args ) ,
171+ ...args ,
172+ ...( args . includes ( '--configsvr' ) || args . includes ( '--shardsvr' )
173+ ? [ ]
174+ : i === 0
175+ ? [ '--configsvr' ]
176+ : [ '--shardsvr' ] ) ,
177+ ] ,
178+ } ) ) ,
189179 mongosArgs : mongosArgs . map ( ( perMongosArgs , i ) => [
190180 ...( i === 0 && ! hasPortArg ( perMongosArgs ) ? args : removePortArg ( args ) ) ,
191181 ...perMongosArgs ,
@@ -414,14 +404,14 @@ export class MongoCluster extends EventEmitter<MongoClusterEvents> {
414404 }
415405 } ) ;
416406 } else if ( options . topology === 'sharded' ) {
417- const { shardArgs , mongosArgs } = processShardOptions ( options ) ;
418- debug ( 'starting config server and shard servers' , shardArgs ) ;
407+ const { shards , mongosArgs } = processShardOptions ( options ) ;
408+ debug ( 'starting config server and shard servers' , shards ) ;
419409 const allShards = await Promise . all (
420- shardArgs . map ( async ( args ) => {
421- const isConfig = args . includes ( '--configsvr' ) ;
410+ shards . map ( async ( s ) => {
411+ const isConfig = s . args ? .includes ( '--configsvr' ) ;
422412 const cluster = await MongoCluster . start ( {
423413 ...options ,
424- args ,
414+ ... s ,
425415 topology : 'replset' ,
426416 users : isConfig ? undefined : options . users , // users go on the mongos/config server only for the config set
427417 } ) ;
0 commit comments