11import _axios , { AxiosInstance , AxiosRequestConfig } from 'axios'
2- import type { Filter , Projection , Sort , UpdateFilter , Document } from 'mongodb'
2+ import type { Filter , FindOptions , Sort , UpdateFilter , Document } from 'mongodb'
3+
4+ // https://github.com/surmon-china/mongodb-data-api/pull/3/files @maxfi
5+ type Projection = FindOptions [ 'projection' ]
6+
7+ // https://github.com/surmon-china/mongodb-data-api/pull/4/files @maxfi
8+ type NoInfer < A extends any > = [ A ] [ A extends any ? 0 : never ]
39
410type AnyKeys < T > = { [ P in keyof T ] ?: T [ P ] | any }
511type Without < T , U > = { [ P in Exclude < keyof T , keyof U > ] ?: never }
@@ -59,7 +65,7 @@ interface PackEndpointConfig extends BaseConfig {
5965
6066export type Config = XOR < UrlEndpointConfig , PackEndpointConfig >
6167
62- export class MongoDBDataAPI < InnerDoc = any > {
68+ export class MongoDBDataAPI < InnerDoc = Document > {
6369 #config: Config
6470 #baseParams: BaseParams
6571 #axios: AxiosInstance
@@ -84,11 +90,11 @@ export class MongoDBDataAPI<InnerDoc = any> {
8490 )
8591 }
8692
87- /** Select a collection . */
88- public $collection < Doc = InnerDoc > ( collection : string ) {
89- return this . #newAPI< Doc > ( { collection } ) as Omit <
90- MongoDBDataAPI < Doc > ,
91- '$cluster' | '$database' | '$ collection'
93+ /** Select a cluster . */
94+ public $cluster ( clusterName : string ) {
95+ return this . #newAPI< InnerDoc > ( { dataSource : clusterName } ) as Omit <
96+ MongoDBDataAPI < InnerDoc > ,
97+ '$cluster' | '$collection'
9298 >
9399 }
94100
@@ -100,19 +106,19 @@ export class MongoDBDataAPI<InnerDoc = any> {
100106 >
101107 }
102108
103- /** Select a cluster . */
104- public $cluster ( clusterName : string ) {
105- return this . #newAPI< InnerDoc > ( { dataSource : clusterName } ) as Omit <
106- MongoDBDataAPI < InnerDoc > ,
107- '$cluster' | '$collection'
109+ /** Select a collection . */
110+ public $collection < Doc = InnerDoc > ( collection : string ) {
111+ return this . #newAPI< Doc > ( { collection } ) as Omit <
112+ MongoDBDataAPI < Doc > ,
113+ '$cluster' | '$database' | '$ collection'
108114 >
109115 }
110116
111117 /**
112118 * Execute a API action.
113119 * @link https://docs.atlas.mongodb.com/api/data-api-resources/
114120 */
115- public $$action < Result = any > (
121+ public $$action < Result = unknown > (
116122 name : string ,
117123 params : BaseParams = { } ,
118124 axiosConfig ?: AxiosRequestConfig
@@ -156,8 +162,11 @@ export class MongoDBDataAPI<InnerDoc = any> {
156162 * Find a Single Document.
157163 * @link https://docs.atlas.mongodb.com/api/data-api-resources/#find-a-single-document
158164 */
159- public findOne < D = InnerDoc > (
160- params ?: ExtendBaseParams < { filter ?: Filter < D > ; projection ?: Projection < D > } >
165+ public findOne < D = InnerDoc , T = NoInfer < D > > (
166+ params ?: ExtendBaseParams < {
167+ filter ?: Filter < T >
168+ projection ?: Projection
169+ } >
161170 ) {
162171 return this . $$action < { document : D | null } > ( 'findOne' , params )
163172 }
@@ -166,10 +175,10 @@ export class MongoDBDataAPI<InnerDoc = any> {
166175 * Find Multiple Documents.
167176 * @link https://docs.atlas.mongodb.com/api/data-api-resources/#find-multiple-documents
168177 */
169- public find < D = InnerDoc > (
178+ public find < D = InnerDoc , T = NoInfer < D > > (
170179 params ?: ExtendBaseParams < {
171- filter ?: Filter < D >
172- projection ?: Projection < D >
180+ filter ?: Filter < T >
181+ projection ?: Projection
173182 sort ?: Sort
174183 limit ?: number
175184 skip ?: number
@@ -182,8 +191,8 @@ export class MongoDBDataAPI<InnerDoc = any> {
182191 * Insert a Single Document.
183192 * @link https://docs.atlas.mongodb.com/api/data-api-resources/#insert-a-single-document
184193 */
185- public insertOne < D = InnerDoc > (
186- params : ExtendBaseParams < { document : AnyKeys < D > | Document } >
194+ public insertOne < D = InnerDoc , T = NoInfer < D > > (
195+ params : ExtendBaseParams < { document : AnyKeys < T > | Document } >
187196 ) {
188197 return this . $$action < { insertedId : string } > ( 'insertOne' , params )
189198 }
@@ -192,8 +201,8 @@ export class MongoDBDataAPI<InnerDoc = any> {
192201 * Insert Multiple Documents.
193202 * @link https://docs.atlas.mongodb.com/api/data-api-resources/#insert-multiple-documents
194203 */
195- public insertMany < D = InnerDoc > (
196- params : ExtendBaseParams < { documents : Array < AnyKeys < D > | Document > } >
204+ public insertMany < D = InnerDoc , T = NoInfer < D > > (
205+ params : ExtendBaseParams < { documents : Array < AnyKeys < T > | Document > } >
197206 ) {
198207 return this . $$action < { insertedIds : Array < string > } > ( 'insertMany' , params )
199208 }
@@ -202,10 +211,10 @@ export class MongoDBDataAPI<InnerDoc = any> {
202211 * Update a Single Document.
203212 * @link https://docs.atlas.mongodb.com/api/data-api-resources/#update-a-single-document
204213 */
205- public updateOne < D = InnerDoc > (
214+ public updateOne < D = InnerDoc , T = NoInfer < D > > (
206215 params : ExtendBaseParams < {
207- filter : Filter < D >
208- update : UpdateFilter < D >
216+ filter : Filter < T >
217+ update : UpdateFilter < T >
209218 upsert ?: boolean
210219 } >
211220 ) {
@@ -220,10 +229,10 @@ export class MongoDBDataAPI<InnerDoc = any> {
220229 * Update Multiple Documents.
221230 * @link https://docs.atlas.mongodb.com/api/data-api-resources/#update-multiple-documents
222231 */
223- public updateMany < D = InnerDoc > (
232+ public updateMany < D = InnerDoc , T = NoInfer < D > > (
224233 params : ExtendBaseParams < {
225- filter : Filter < D >
226- update : UpdateFilter < D >
234+ filter : Filter < T >
235+ update : UpdateFilter < T >
227236 upsert ?: boolean
228237 } >
229238 ) {
@@ -238,9 +247,9 @@ export class MongoDBDataAPI<InnerDoc = any> {
238247 * Replace a Single Document.
239248 * @link https://docs.atlas.mongodb.com/api/data-api-resources/#replace-a-single-document
240249 */
241- public replaceOne < D = InnerDoc > (
250+ public replaceOne < D = InnerDoc , T = NoInfer < D > > (
242251 params : ExtendBaseParams < {
243- filter : Filter < D >
252+ filter : Filter < T >
244253 replacement : any
245254 upsert ?: boolean
246255 } >
@@ -256,15 +265,19 @@ export class MongoDBDataAPI<InnerDoc = any> {
256265 * Delete a Single Document.
257266 * @link https://docs.atlas.mongodb.com/api/data-api-resources/#delete-a-single-document
258267 */
259- public deleteOne < D = InnerDoc > ( params : ExtendBaseParams < { filter : Filter < D > } > ) {
268+ public deleteOne < D = InnerDoc , T = NoInfer < D > > (
269+ params : ExtendBaseParams < { filter : Filter < T > } >
270+ ) {
260271 return this . $$action < { deletedCount : number } > ( 'deleteOne' , params )
261272 }
262273
263274 /**
264275 * Delete Multiple Documents.
265276 * @link https://docs.atlas.mongodb.com/api/data-api-resources/#delete-multiple-documents
266277 */
267- public deleteMany < D = InnerDoc > ( params : ExtendBaseParams < { filter : Filter < D > } > ) {
278+ public deleteMany < D = InnerDoc , T = NoInfer < D > > (
279+ params : ExtendBaseParams < { filter : Filter < T > } >
280+ ) {
268281 return this . $$action < { deletedCount : number } > ( 'deleteMany' , params )
269282 }
270283
@@ -278,3 +291,7 @@ export class MongoDBDataAPI<InnerDoc = any> {
278291 return this . $$action < { documents : T } > ( 'pipeline' , params )
279292 }
280293}
294+
295+ export const createMongoDBDataAPI = ( config : Config , axios ?: AxiosInstance ) => {
296+ return new MongoDBDataAPI ( config , void 0 , axios )
297+ }
0 commit comments