Skip to content

Commit fdf3bc9

Browse files
authored
Merge pull request #5 from surmon-china/fix/type
feat: v0.2.0
2 parents ddac794 + e3770ae commit fdf3bc9

File tree

13 files changed

+687
-189
lines changed

13 files changed

+687
-189
lines changed

.github/workflows/publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
22
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
3-
# Fork from: https://github.com/actions/starter-workflows/blob/master/ci/npm-publish.yml
3+
# Fork from: https://github.com/actions/starter-workflows/blob/main/ci/npm-publish.yml
44

55
name: Publish
66

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,17 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
### v0.2.0 (2022-03-09)
6+
7+
**Feature**
8+
9+
- New creator function `createMongoDBDataAPI`
10+
11+
**Fix**
12+
13+
- [#3 Adjust typescript generics](https://github.com/surmon-china/mongodb-data-api/pull/3)
14+
- [#4 Disable parameter inference](https://github.com/surmon-china/mongodb-data-api/pull/4)
15+
516
### v0.1.0 (2022-01-31)
617

718
- Implements Beta API

README.md

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
 
1111
[![Test Codecov](https://img.shields.io/codecov/c/github/surmon-china/mongodb-data-api?style=for-the-badge)](https://codecov.io/gh/surmon-china/mongodb-data-api)
1212
 
13-
[![GitHub license](https://img.shields.io/github/license/surmon-china/mongodb-data-api.svg?style=for-the-badge)](https://github.com/surmon-china/mongodb-data-api/blob/master/LICENSE)
13+
[![GitHub license](https://img.shields.io/github/license/surmon-china/mongodb-data-api.svg?style=for-the-badge)](/LICENSE)
1414

15-
> MongoDB Atlas [Data API](https://docs.atlas.mongodb.com/api/data-api/) SDK for Node.js.
15+
MongoDB Atlas [Data API](https://docs.atlas.mongodb.com/api/data-api/) SDK for Node.js.
1616

1717
---
1818

@@ -33,22 +33,22 @@ yarn add mongodb-data-api
3333
#### Init
3434

3535
```ts
36-
import { MongoDBDataAPI, Region } from 'mongodb-data-api'
36+
import { createMongoDBDataAPI, Region } from 'mongodb-data-api'
3737

3838
// init by URL Endpoint
39-
const api = new MongoDBDataAPI({
39+
const api = createMongoDBDataAPI({
4040
apiKey: '<your_mongodb_api_key>',
4141
urlEndpoint: 'https://data.mongodb-api.com/app/<your_mongodb_app_id>/endpoint/data/beta'
4242
})
4343

4444
// or init by app ID
45-
const api = new MongoDBDataAPI({
45+
const api = createMongoDBDataAPI({
4646
apiKey: '<your_mongodb_api_key>',
4747
appId: '<your_mongodb_app_id>'
4848
})
4949

5050
// specific region of app
51-
const api = new MongoDBDataAPI({
51+
const api = createMongoDBDataAPI({
5252
apiKey: '<your_mongodb_api_key>',
5353
appId: '<your_mongodb_app_id>',
5454
region: Region.Virginia
@@ -126,27 +126,30 @@ api
126126
#### Method chaining
127127

128128
```ts
129-
// api.$cluster
129+
// select cluster
130130
const clusterA = api.$cluster('a')
131-
132-
// api.$cluster.$database
131+
// select database
133132
const databaseB = clusterA.$database('b')
134-
const databaseC = clusterA.$database('c')
135-
136-
// api.$cluster.$database.$collection
137-
const bItemCollection = databaseB.$collection('item')
138-
const cItemCollection = databaseC.$collection('item')
139-
140-
// actions
141-
bItemCollection.findOne({ filter: {/*...*/} })
142-
cItemCollection.insertOne({ document: {/*...*/} })
133+
// select collection
134+
const collectionC = databaseB.$collection<C>('c')
135+
// data actions
136+
const data = await collectionC.findOne({
137+
filter: {
138+
/*...*/
139+
}
140+
})
141+
const result = await collectionC.insertOne({
142+
document: {
143+
/*...*/
144+
}
145+
})
143146

144147
// -------------
145148

146149
// chaining is equivalent to the api call
147-
api.$cluster('a').$database('b').$collection('c').findOne({ filter: {} })
150+
api.$cluster('a').$database('b').$collection<C>('c').findOne({ filter: {} })
148151
// the same as
149-
api.findOne({
152+
api.findOne<C>({
150153
dataSource: 'a',
151154
database: 'b',
152155
collection: 'c',
@@ -167,6 +170,28 @@ api.$$action('findOne', {
167170
})
168171
```
169172

173+
#### Original Class
174+
175+
You can use the original Class to implement some special requirements.
176+
177+
```ts
178+
import { MongoDBDataAPI } from 'mongodb-data-api'
179+
180+
const customerCollection = new MongoDBDataAPI<CustomerDocument>(
181+
{
182+
apiKey: '<your_mongodb_api_key>',
183+
appId: '<your_mongodb_app_id>'
184+
},
185+
{
186+
dataSource: '<target_cluster_name>',
187+
database: '<target_database_name>',
188+
collection: '<target_collection_name>'
189+
}
190+
)
191+
192+
const customer = await customerCollection.findOne({ ... })
193+
```
194+
170195
### Development
171196

172197
```bash
@@ -185,8 +210,8 @@ yarn build
185210

186211
### Changelog
187212

188-
Detailed changes for each release are documented in the [release notes](https://github.com/surmon-china/mongodb-data-api/blob/master/CHANGELOG.md).
213+
Detailed changes for each release are documented in the [release notes](/CHANGELOG.md).
189214

190215
### License
191216

192-
[MIT](https://github.com/surmon-china/mongodb-data-api/blob/master/LICENSE)
217+
[MIT](/LICENSE)
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
/** @type {import('@surmon-china/libundler/lib/interface').LibundlerConfigObject} */
2-
module.exports = {
1+
import { defineConfig } from '@surmon-china/libundler'
2+
3+
export default defineConfig({
34
libName: 'MongoDBDataAPI',
45
outFileName: 'mongodb-data-api',
56
targets: ['cjs', 'esm'],
67
entry: './src/index.ts',
78
outDir: './dist',
89
external: ['axios', 'mongodb'],
9-
minimize: false,
10+
terser: false,
1011
sourcemap: false
11-
}
12+
})

package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mongodb-data-api",
3-
"version": "0.1.0",
3+
"version": "0.2.0",
44
"description": "MongoDB atlas data API SDK for Node.js",
55
"keywords": [
66
"MongoDB data API",
@@ -24,7 +24,9 @@
2424
"scripts": {
2525
"lint": "eslint --ext .ts src/**",
2626
"format": "prettier --write --parser typescript \"src/**/*.ts\"",
27-
"test": "jest",
27+
"test": "npm run test:type && npm run test:unit",
28+
"test:unit": "jest",
29+
"test:type": "tsc -p ./tests-dts/tsconfig.json && tsc -p ./tests-dts/tsconfig.build.json",
2830
"build": "libundler",
2931
"rebirth": "npm run lint && npm run test && npm run build",
3032
"release": ". ./scripts/release.sh"
@@ -34,7 +36,7 @@
3436
"mongodb": "^4.0.0"
3537
},
3638
"devDependencies": {
37-
"@surmon-china/libundler": "^1.1.1",
39+
"@surmon-china/libundler": "^2.2.0",
3840
"@types/jest": "^27.4.0",
3941
"@typescript-eslint/eslint-plugin": "^5.9.1",
4042
"@typescript-eslint/parser": "^5.9.1",

src/index.ts

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import _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

410
type AnyKeys<T> = { [P in keyof T]?: T[P] | any }
511
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never }
@@ -59,7 +65,7 @@ interface PackEndpointConfig extends BaseConfig {
5965

6066
export 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

Comments
 (0)