effect-mongodb 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -13
- package/dist/cjs/AggregationCursor.js.map +1 -1
- package/dist/cjs/Collection.js +11 -13
- package/dist/cjs/Collection.js.map +1 -1
- package/dist/cjs/DocumentAggregationCursor.js.map +1 -1
- package/dist/cjs/DocumentCollection.js +9 -5
- package/dist/cjs/DocumentCollection.js.map +1 -1
- package/dist/cjs/DocumentFindCursor.js.map +1 -1
- package/dist/cjs/FindCursor.js.map +1 -1
- package/dist/cjs/ListCollectionsCursor.js.map +1 -1
- package/dist/cjs/MongoClient.js +4 -1
- package/dist/cjs/MongoClient.js.map +1 -1
- package/dist/cjs/internal/version.js +1 -1
- package/dist/dts/AggregationCursor.d.ts +1 -1
- package/dist/dts/AggregationCursor.d.ts.map +1 -1
- package/dist/dts/Collection.d.ts +9 -8
- package/dist/dts/Collection.d.ts.map +1 -1
- package/dist/dts/DocumentAggregationCursor.d.ts +2 -2
- package/dist/dts/DocumentAggregationCursor.d.ts.map +1 -1
- package/dist/dts/DocumentCollection.d.ts +14 -13
- package/dist/dts/DocumentCollection.d.ts.map +1 -1
- package/dist/dts/DocumentFindCursor.d.ts +1 -1
- package/dist/dts/DocumentFindCursor.d.ts.map +1 -1
- package/dist/dts/FindCursor.d.ts.map +1 -1
- package/dist/dts/ListCollectionsCursor.d.ts +1 -1
- package/dist/dts/ListCollectionsCursor.d.ts.map +1 -1
- package/dist/dts/MongoClient.d.ts +8 -0
- package/dist/dts/MongoClient.d.ts.map +1 -1
- package/dist/esm/AggregationCursor.js.map +1 -1
- package/dist/esm/Collection.js +11 -13
- package/dist/esm/Collection.js.map +1 -1
- package/dist/esm/DocumentAggregationCursor.js.map +1 -1
- package/dist/esm/DocumentCollection.js +9 -5
- package/dist/esm/DocumentCollection.js.map +1 -1
- package/dist/esm/DocumentFindCursor.js.map +1 -1
- package/dist/esm/FindCursor.js.map +1 -1
- package/dist/esm/ListCollectionsCursor.js.map +1 -1
- package/dist/esm/MongoClient.js +2 -0
- package/dist/esm/MongoClient.js.map +1 -1
- package/dist/esm/internal/version.js +1 -1
- package/package.json +1 -1
- package/src/AggregationCursor.ts +2 -2
- package/src/Collection.ts +29 -25
- package/src/DocumentAggregationCursor.ts +3 -3
- package/src/DocumentCollection.ts +35 -25
- package/src/DocumentFindCursor.ts +2 -2
- package/src/FindCursor.ts +7 -3
- package/src/ListCollectionsCursor.ts +2 -2
- package/src/MongoClient.ts +21 -0
- package/src/internal/version.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListCollectionsCursor.js","names":["Data","Effect","F","Stream","MongoError","ListCollectionsCursor","TaggedClass","toArray","cursor","pipe","tryPromise","try","catch","identity","catchAll","mongoErrorDie","_tag","toStream","fromAsyncIterable","mongoErrorStream"],"sources":["../../src/ListCollectionsCursor.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,IAAI,MAAM,aAAa;AACnC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,CAAC,MAAM,iBAAiB;AACpC,OAAO,KAAKC,MAAM,MAAM,eAAe;AAKvC,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAO7C,OAAM,MAAOC,qBAEX,sBAAQL,IAAI,CAACM,WAAW,CAAC,uBAAuB,CAEhD;AAQF,OAAO,MAAMC,OAAO,GAClBC,MAAgC,IAEhCN,CAAC,CAACO,IAAI,CACJR,MAAM,CAACS,UAAU,CAAC;EAAEC,GAAG,EAAEA,CAAA,KAAMH,MAAM,CAACA,MAAM,CAACD,OAAO,EAAE;EAAEK,KAAK,EAAEV,CAAC,CAACW;AAAQ,CAAE,CAAC,EAC5EZ,MAAM,CAACa,QAAQ,CAACV,UAAU,CAACW,aAAa,
|
|
1
|
+
{"version":3,"file":"ListCollectionsCursor.js","names":["Data","Effect","F","Stream","MongoError","ListCollectionsCursor","TaggedClass","toArray","cursor","pipe","tryPromise","try","catch","identity","catchAll","mongoErrorDie","_tag","toStream","fromAsyncIterable","mongoErrorStream"],"sources":["../../src/ListCollectionsCursor.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,IAAI,MAAM,aAAa;AACnC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,CAAC,MAAM,iBAAiB;AACpC,OAAO,KAAKC,MAAM,MAAM,eAAe;AAKvC,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAO7C,OAAM,MAAOC,qBAEX,sBAAQL,IAAI,CAACM,WAAW,CAAC,uBAAuB,CAEhD;AAQF,OAAO,MAAMC,OAAO,GAClBC,MAAgC,IAEhCN,CAAC,CAACO,IAAI,CACJR,MAAM,CAACS,UAAU,CAAC;EAAEC,GAAG,EAAEA,CAAA,KAAMH,MAAM,CAACA,MAAM,CAACD,OAAO,EAAE;EAAEK,KAAK,EAAEV,CAAC,CAACW;AAAQ,CAAE,CAAC,EAC5EZ,MAAM,CAACa,QAAQ,CAACV,UAAU,CAACW,aAAa,CAAW,GAAGP,MAAM,CAACQ,IAAI,gBAAgB,CAAC,CAAC,CACpF;AAEH,OAAO,MAAMC,QAAQ,GACnBT,MAAgC,IAEhCN,CAAC,CAACO,IAAI,CACJN,MAAM,CAACe,iBAAiB,CAACV,MAAM,CAACA,MAAM,EAAEN,CAAC,CAACW,QAAQ,CAAC,EACnDV,MAAM,CAACW,QAAQ,CAACV,UAAU,CAACe,gBAAgB,CAAI,GAAGX,MAAM,CAACQ,IAAI,iBAAiB,CAAC,CAAC,CACjF","ignoreList":[]}
|
package/dist/esm/MongoClient.js
CHANGED
|
@@ -6,6 +6,8 @@ import * as F from "effect/Function";
|
|
|
6
6
|
import { MongoClient as MongoClient_ } from "mongodb";
|
|
7
7
|
import * as MongoError from "./MongoError.js";
|
|
8
8
|
export const connect = (url, options) => Effect.promise(() => MongoClient_.connect(url, options)).pipe(Effect.catchAll(MongoError.mongoErrorDie("connect error")));
|
|
9
|
+
export const close = /*#__PURE__*/F.dual(args => isMongoClient(args[0]), (client, force) => Effect.promise(() => client.close(force)).pipe(Effect.catchAll(MongoError.mongoErrorDie("close error"))));
|
|
10
|
+
export const connectScoped = (url, options) => Effect.acquireRelease(connect(url, options), client => close(client, options?.forceClose).pipe(Effect.orDie));
|
|
9
11
|
export const db = /*#__PURE__*/F.dual(args => isMongoClient(args[0]), (client, dbName, options) => client.db(dbName, options));
|
|
10
12
|
const isMongoClient = x => x instanceof MongoClient_;
|
|
11
13
|
//# sourceMappingURL=MongoClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoClient.js","names":["Effect","F","MongoClient","MongoClient_","MongoError","connect","url","options","promise","pipe","catchAll","mongoErrorDie","
|
|
1
|
+
{"version":3,"file":"MongoClient.js","names":["Effect","F","MongoClient","MongoClient_","MongoError","connect","url","options","promise","pipe","catchAll","mongoErrorDie","close","dual","args","isMongoClient","client","force","connectScoped","acquireRelease","forceClose","orDie","db","dbName","x"],"sources":["../../src/MongoClient.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,CAAC,MAAM,iBAAiB;AAGpC,SAASC,WAAW,IAAIC,YAAY,QAAQ,SAAS;AACrD,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAI7C,OAAO,MAAMC,OAAO,GAAGA,CACrBC,GAAW,EACXC,OAA4B,KAE5BP,MAAM,CAACQ,OAAO,CAAC,MAAML,YAAY,CAACE,OAAO,CAACC,GAAG,EAAEC,OAAO,CAAC,CAAC,CAACE,IAAI,CAC3DT,MAAM,CAACU,QAAQ,CAACN,UAAU,CAACO,aAAa,CAAe,eAAe,CAAC,CAAC,CACzE;AAEH,OAAO,MAAMC,KAAK,gBAGdX,CAAC,CAACY,IAAI,CACPC,IAAI,IAAKC,aAAa,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,EAChC,CAACE,MAAmB,EAAEC,KAAe,KACnCjB,MAAM,CAACQ,OAAO,CAAC,MAAMQ,MAAM,CAACJ,KAAK,CAACK,KAAK,CAAC,CAAC,CAACR,IAAI,CAC5CT,MAAM,CAACU,QAAQ,CAACN,UAAU,CAACO,aAAa,CAAO,aAAa,CAAC,CAAC,CAC/D,CACJ;AAED,OAAO,MAAMO,aAAa,GAAGA,CAC3BZ,GAAW,EACXC,OAAuD,KAEvDP,MAAM,CAACmB,cAAc,CACnBd,OAAO,CAACC,GAAG,EAAEC,OAAO,CAAC,EACpBS,MAAM,IAAKJ,KAAK,CAACI,MAAM,EAAET,OAAO,EAAEa,UAAU,CAAC,CAACX,IAAI,CAACT,MAAM,CAACqB,KAAK,CAAC,CAClE;AAEH,OAAO,MAAMC,EAAE,gBAGXrB,CAAC,CAACY,IAAI,CACPC,IAAI,IAAKC,aAAa,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,EAChC,CAACE,MAAmB,EAAEO,MAAe,EAAEhB,OAAmB,KAASS,MAAM,CAACM,EAAE,CAACC,MAAM,EAAEhB,OAAO,CAAC,CAC9F;AAED,MAAMQ,aAAa,GAAIS,CAAU,IAAKA,CAAC,YAAYrB,YAAY","ignoreList":[]}
|
package/package.json
CHANGED
package/src/AggregationCursor.ts
CHANGED
|
@@ -17,10 +17,10 @@ export class AggregationCursor<A, I = A, R = never> extends Data.TaggedClass("Ag
|
|
|
17
17
|
|
|
18
18
|
export const toArray = <A, I, R>(
|
|
19
19
|
cursor: AggregationCursor<A, I, R>
|
|
20
|
-
): Effect.Effect<
|
|
20
|
+
): Effect.Effect<Array<A>, MongoError.MongoError | ParseResult.ParseError, R> => {
|
|
21
21
|
const decode = Schema.decodeUnknown(cursor.schema)
|
|
22
22
|
return Effect.tryPromise({ try: () => cursor.cursor.toArray(), catch: F.identity }).pipe(
|
|
23
|
-
Effect.catchAll(MongoError.mongoErrorDie<
|
|
23
|
+
Effect.catchAll(MongoError.mongoErrorDie<Array<A>>("Unable to get array from mongodb aggregate cursor")),
|
|
24
24
|
Effect.flatMap(Effect.forEach((x) => decode(x)))
|
|
25
25
|
)
|
|
26
26
|
}
|
package/src/Collection.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 0.0.1
|
|
3
3
|
*/
|
|
4
|
+
import * as Array from "effect/Array"
|
|
4
5
|
import * as Data from "effect/Data"
|
|
5
6
|
import * as Effect from "effect/Effect"
|
|
6
7
|
import * as F from "effect/Function"
|
|
@@ -44,6 +45,7 @@ export class Collection<A extends Document, I extends Document = A, R = never> e
|
|
|
44
45
|
collection: MongoCollection
|
|
45
46
|
schema: Schema.Schema<A, I, R>
|
|
46
47
|
}> {
|
|
48
|
+
readonly encode = Schema.encode(this.schema)
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
export type FindOptions = Omit<MongoFindOptions, "projection">
|
|
@@ -110,29 +112,28 @@ export const insertOne: {
|
|
|
110
112
|
options?: InsertOneOptions
|
|
111
113
|
): Effect.Effect<InsertOneResult, MongoError.MongoError | ParseResult.ParseError, R> =>
|
|
112
114
|
F.pipe(
|
|
113
|
-
|
|
115
|
+
collection.encode(doc),
|
|
114
116
|
Effect.flatMap((doc) => Effect.promise(() => collection.collection.insertOne(doc, options))),
|
|
115
117
|
Effect.catchAllDefect(MongoError.mongoErrorDie<InsertOneResult>("insertOne error"))
|
|
116
118
|
))
|
|
117
119
|
|
|
118
120
|
export const insertMany: {
|
|
119
|
-
<A extends Document>(docs:
|
|
121
|
+
<A extends Document>(docs: ReadonlyArray<A>, options?: BulkWriteOptions): <I extends Document, R>(
|
|
120
122
|
collection: Collection<A, I, R>
|
|
121
123
|
) => Effect.Effect<InsertManyResult, MongoError.MongoError | ParseResult.ParseError, R>
|
|
122
124
|
<A extends Document, I extends Document, R>(
|
|
123
125
|
collection: Collection<A, I, R>,
|
|
124
|
-
docs:
|
|
126
|
+
docs: ReadonlyArray<A>,
|
|
125
127
|
options?: BulkWriteOptions
|
|
126
128
|
): Effect.Effect<InsertManyResult, MongoError.MongoError | ParseResult.ParseError, R>
|
|
127
129
|
} = F.dual((args) => isCollection(args[0]), <A extends Document, I extends Document, R>(
|
|
128
130
|
collection: Collection<A, I, R>,
|
|
129
|
-
docs:
|
|
131
|
+
docs: ReadonlyArray<A>,
|
|
130
132
|
options?: BulkWriteOptions
|
|
131
133
|
): Effect.Effect<InsertManyResult, MongoError.MongoError | ParseResult.ParseError, R> => {
|
|
132
|
-
const encode = Schema.encode(collection.schema)
|
|
133
134
|
return F.pipe(
|
|
134
135
|
docs,
|
|
135
|
-
Effect.forEach((doc) => encode(doc)),
|
|
136
|
+
Effect.forEach((doc) => collection.encode(doc)),
|
|
136
137
|
Effect.flatMap((docs) => Effect.promise(() => collection.collection.insertMany(docs, options))),
|
|
137
138
|
Effect.catchAllDefect(MongoError.mongoErrorDie<InsertManyResult>("insertMany error"))
|
|
138
139
|
)
|
|
@@ -183,7 +184,7 @@ export const deleteMany: {
|
|
|
183
184
|
export const updateMany: {
|
|
184
185
|
<I extends Document>(
|
|
185
186
|
filter: Filter<I>,
|
|
186
|
-
update: UpdateFilter<I> |
|
|
187
|
+
update: UpdateFilter<I> | ReadonlyArray<Document>,
|
|
187
188
|
options?: UpdateOptions
|
|
188
189
|
): <A extends Document, R>(
|
|
189
190
|
collection: Collection<A, I, R>
|
|
@@ -191,7 +192,7 @@ export const updateMany: {
|
|
|
191
192
|
<A extends Document, I extends Document, R>(
|
|
192
193
|
collection: Collection<A, I, R>,
|
|
193
194
|
filter: Filter<I>,
|
|
194
|
-
update: UpdateFilter<I> |
|
|
195
|
+
update: UpdateFilter<I> | ReadonlyArray<Document>,
|
|
195
196
|
options?: UpdateOptions
|
|
196
197
|
): Effect.Effect<UpdateResult, MongoError.MongoError, R>
|
|
197
198
|
} = F.dual(
|
|
@@ -199,14 +200,16 @@ export const updateMany: {
|
|
|
199
200
|
<A extends Document, I extends Document, R>(
|
|
200
201
|
collection: Collection<A, I, R>,
|
|
201
202
|
filter: Filter<I>,
|
|
202
|
-
update: UpdateFilter<I> |
|
|
203
|
+
update: UpdateFilter<I> | ReadonlyArray<Document>,
|
|
203
204
|
options?: UpdateOptions
|
|
204
205
|
): Effect.Effect<UpdateResult, MongoError.MongoError, R> =>
|
|
205
206
|
Effect.promise(() =>
|
|
206
|
-
collection.collection.updateMany(
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
207
|
+
collection.collection.updateMany(
|
|
208
|
+
filter,
|
|
209
|
+
Array.isArray(update) ? [...update] : update as UpdateFilter<Document>,
|
|
210
|
+
options
|
|
211
|
+
)
|
|
212
|
+
).pipe(Effect.catchAllDefect(MongoError.mongoErrorDie<UpdateResult>("updateMany error")))
|
|
210
213
|
)
|
|
211
214
|
|
|
212
215
|
export const replaceOne: {
|
|
@@ -237,8 +240,7 @@ export const replaceOne: {
|
|
|
237
240
|
R
|
|
238
241
|
> =>
|
|
239
242
|
F.pipe(
|
|
240
|
-
|
|
241
|
-
Schema.encode(collection.schema)(replacement),
|
|
243
|
+
collection.encode(replacement),
|
|
242
244
|
Effect.flatMap((replacement) =>
|
|
243
245
|
Effect.promise(() => collection.collection.replaceOne(filter, replacement, options))
|
|
244
246
|
),
|
|
@@ -299,8 +301,7 @@ export const findOneAndReplace: {
|
|
|
299
301
|
options?: FindOneAndReplaceOptions
|
|
300
302
|
): Effect.Effect<O.Option<A> | ModifyResult<A>, MongoError.MongoError | ParseResult.ParseError, R> =>
|
|
301
303
|
F.pipe(
|
|
302
|
-
|
|
303
|
-
Schema.encode(collection.schema)(replacement),
|
|
304
|
+
collection.encode(replacement),
|
|
304
305
|
Effect.flatMap((replacement) =>
|
|
305
306
|
Effect.promise(() => collection.collection.findOneAndReplace(filter, replacement, options ?? {}))
|
|
306
307
|
),
|
|
@@ -364,23 +365,26 @@ export const drop: {
|
|
|
364
365
|
)
|
|
365
366
|
|
|
366
367
|
export const createIndexes: {
|
|
367
|
-
(
|
|
368
|
+
(
|
|
369
|
+
indexSpecs: ReadonlyArray<IndexDescription>,
|
|
370
|
+
options?: CreateIndexesOptions
|
|
371
|
+
): <A extends Document, I extends Document, R>(
|
|
368
372
|
collection: Collection<A, I, R>
|
|
369
373
|
) => Effect.Effect<Array<string>, MongoError.MongoError, R>
|
|
370
374
|
<A extends Document, I extends Document, R>(
|
|
371
375
|
collection: Collection<A, I, R>,
|
|
372
|
-
indexSpecs:
|
|
376
|
+
indexSpecs: ReadonlyArray<IndexDescription>,
|
|
373
377
|
options?: CreateIndexesOptions
|
|
374
378
|
): Effect.Effect<Array<string>, MongoError.MongoError, R>
|
|
375
379
|
} = F.dual(
|
|
376
380
|
(args) => isCollection(args[0]),
|
|
377
381
|
<A extends Document, I extends Document, R>(
|
|
378
382
|
collection: Collection<A, I, R>,
|
|
379
|
-
indexSpecs:
|
|
383
|
+
indexSpecs: ReadonlyArray<IndexDescription>,
|
|
380
384
|
options?: CreateIndexesOptions
|
|
381
385
|
): Effect.Effect<Array<string>, MongoError.MongoError, R> =>
|
|
382
386
|
F.pipe(
|
|
383
|
-
Effect.promise(() => collection.collection.createIndexes(indexSpecs, options)),
|
|
387
|
+
Effect.promise(() => collection.collection.createIndexes([...indexSpecs], options)),
|
|
384
388
|
Effect.catchAllDefect(MongoError.mongoErrorDie<Array<string>>("createIndexes error"))
|
|
385
389
|
)
|
|
386
390
|
)
|
|
@@ -433,7 +437,7 @@ export const dropIndex: {
|
|
|
433
437
|
|
|
434
438
|
export const aggregate: {
|
|
435
439
|
<B extends Document, BI extends Document, BR>(
|
|
436
|
-
pipeline:
|
|
440
|
+
pipeline: ReadonlyArray<Document>,
|
|
437
441
|
schema: Schema.Schema<B, BI, BR>,
|
|
438
442
|
options?: AggregateOptions
|
|
439
443
|
): <A extends Document, I extends Document, R>(
|
|
@@ -441,7 +445,7 @@ export const aggregate: {
|
|
|
441
445
|
) => AggregationCursor.AggregationCursor<B, BI, BR>
|
|
442
446
|
<A extends Document, I extends Document, R, B extends Document, BI extends Document, BR>(
|
|
443
447
|
collection: Collection<A, I, R>,
|
|
444
|
-
pipeline:
|
|
448
|
+
pipeline: ReadonlyArray<Document>,
|
|
445
449
|
schema: Schema.Schema<B, BI, BR>,
|
|
446
450
|
options?: AggregateOptions
|
|
447
451
|
): AggregationCursor.AggregationCursor<B, BI, BR>
|
|
@@ -449,12 +453,12 @@ export const aggregate: {
|
|
|
449
453
|
(args) => isCollection(args[0]),
|
|
450
454
|
<A extends Document, I extends Document, R, B extends Document, BI extends Document, BR>(
|
|
451
455
|
collection: Collection<A, I, R>,
|
|
452
|
-
pipeline:
|
|
456
|
+
pipeline: ReadonlyArray<Document>,
|
|
453
457
|
schema: Schema.Schema<B, BI, BR>,
|
|
454
458
|
options?: AggregateOptions
|
|
455
459
|
): AggregationCursor.AggregationCursor<B, BI, BR> =>
|
|
456
460
|
new AggregationCursor.AggregationCursor<B, BI, BR>({
|
|
457
|
-
cursor: collection.collection.aggregate(pipeline, options),
|
|
461
|
+
cursor: collection.collection.aggregate([...pipeline], options),
|
|
458
462
|
schema
|
|
459
463
|
})
|
|
460
464
|
)
|
|
@@ -5,7 +5,7 @@ import * as Data from "effect/Data"
|
|
|
5
5
|
import * as Effect from "effect/Effect"
|
|
6
6
|
import * as F from "effect/Function"
|
|
7
7
|
import * as Stream from "effect/Stream"
|
|
8
|
-
import type { AggregationCursor as MongoAggregationCursor } from "mongodb"
|
|
8
|
+
import type { AggregationCursor as MongoAggregationCursor, Document } from "mongodb"
|
|
9
9
|
import * as MongoError from "./MongoError.js"
|
|
10
10
|
|
|
11
11
|
export class DocumentAggregationCursor
|
|
@@ -15,10 +15,10 @@ export class DocumentAggregationCursor
|
|
|
15
15
|
|
|
16
16
|
export const toArray = (
|
|
17
17
|
cursor: DocumentAggregationCursor
|
|
18
|
-
): Effect.Effect<
|
|
18
|
+
): Effect.Effect<Array<Document>, MongoError.MongoError> =>
|
|
19
19
|
F.pipe(
|
|
20
20
|
Effect.tryPromise({ try: () => cursor.cursor.toArray(), catch: F.identity }),
|
|
21
|
-
Effect.catchAll(MongoError.mongoErrorDie<
|
|
21
|
+
Effect.catchAll(MongoError.mongoErrorDie<Array<Document>>(`${cursor._tag}.toArray error`))
|
|
22
22
|
)
|
|
23
23
|
|
|
24
24
|
export const toStream = (
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 0.0.1
|
|
3
3
|
*/
|
|
4
|
+
import * as Array from "effect/Array"
|
|
4
5
|
import * as Data from "effect/Data"
|
|
5
6
|
import * as Effect from "effect/Effect"
|
|
6
7
|
import * as F from "effect/Function"
|
|
@@ -90,6 +91,10 @@ export const findOne: {
|
|
|
90
91
|
)
|
|
91
92
|
|
|
92
93
|
export const insertOne: {
|
|
94
|
+
(
|
|
95
|
+
collection: DocumentCollection,
|
|
96
|
+
doc: OptionalUnlessRequiredId<Document>
|
|
97
|
+
): Effect.Effect<InsertOneResult, MongoError.MongoError>
|
|
93
98
|
(doc: OptionalUnlessRequiredId<Document>, options?: InsertOneOptions): (
|
|
94
99
|
collection: DocumentCollection
|
|
95
100
|
) => Effect.Effect<InsertOneResult, MongoError.MongoError>
|
|
@@ -110,19 +115,19 @@ export const insertOne: {
|
|
|
110
115
|
|
|
111
116
|
export const insertMany: {
|
|
112
117
|
(
|
|
113
|
-
docs:
|
|
118
|
+
docs: ReadonlyArray<OptionalUnlessRequiredId<Document>>,
|
|
114
119
|
options?: BulkWriteOptions
|
|
115
120
|
): (
|
|
116
121
|
collection: DocumentCollection
|
|
117
|
-
) => Effect.Effect<
|
|
122
|
+
) => Effect.Effect<InsertManyResult, MongoError.MongoError>
|
|
118
123
|
(
|
|
119
124
|
collection: DocumentCollection,
|
|
120
|
-
docs:
|
|
125
|
+
docs: ReadonlyArray<OptionalUnlessRequiredId<Document>>,
|
|
121
126
|
options?: BulkWriteOptions
|
|
122
|
-
): Effect.Effect<
|
|
127
|
+
): Effect.Effect<InsertManyResult, MongoError.MongoError>
|
|
123
128
|
} = F.dual((args) => isDocumentCollection(args[0]), (
|
|
124
129
|
collection: DocumentCollection,
|
|
125
|
-
docs:
|
|
130
|
+
docs: ReadonlyArray<OptionalUnlessRequiredId<Document>>,
|
|
126
131
|
options?: BulkWriteOptions
|
|
127
132
|
): Effect.Effect<InsertManyResult, MongoError.MongoError> =>
|
|
128
133
|
F.pipe(
|
|
@@ -177,7 +182,7 @@ export const deleteMany: {
|
|
|
177
182
|
export const updateMany: {
|
|
178
183
|
(
|
|
179
184
|
filter: Filter<Document>,
|
|
180
|
-
update: UpdateFilter<Document> |
|
|
185
|
+
update: UpdateFilter<Document> | ReadonlyArray<Document>,
|
|
181
186
|
options?: UpdateOptions
|
|
182
187
|
): (
|
|
183
188
|
collection: DocumentCollection
|
|
@@ -185,7 +190,7 @@ export const updateMany: {
|
|
|
185
190
|
(
|
|
186
191
|
collection: DocumentCollection,
|
|
187
192
|
filter: Filter<Document>,
|
|
188
|
-
update: UpdateFilter<Document> |
|
|
193
|
+
update: UpdateFilter<Document> | ReadonlyArray<Document>,
|
|
189
194
|
options?: UpdateOptions
|
|
190
195
|
): Effect.Effect<UpdateResult, MongoError.MongoError>
|
|
191
196
|
} = F.dual(
|
|
@@ -193,11 +198,13 @@ export const updateMany: {
|
|
|
193
198
|
(
|
|
194
199
|
collection: DocumentCollection,
|
|
195
200
|
filter: Filter<Document>,
|
|
196
|
-
update: UpdateFilter<Document> |
|
|
201
|
+
update: UpdateFilter<Document> | ReadonlyArray<Document>,
|
|
197
202
|
options?: UpdateOptions
|
|
198
203
|
): Effect.Effect<UpdateResult, MongoError.MongoError> =>
|
|
199
204
|
F.pipe(
|
|
200
|
-
Effect.promise(() =>
|
|
205
|
+
Effect.promise(() =>
|
|
206
|
+
collection.collection.updateMany(filter, Array.isArray(update) ? [...update] : update, options)
|
|
207
|
+
),
|
|
201
208
|
Effect.catchAllDefect(MongoError.mongoErrorDie<UpdateResult>("updateMany error"))
|
|
202
209
|
)
|
|
203
210
|
)
|
|
@@ -304,22 +311,23 @@ export const findOneAndReplace: {
|
|
|
304
311
|
export const rename: {
|
|
305
312
|
(newName: string, options?: RenameOptions): (
|
|
306
313
|
collection: DocumentCollection
|
|
307
|
-
) => Effect.Effect<
|
|
314
|
+
) => Effect.Effect<DocumentCollection, MongoError.MongoError>
|
|
308
315
|
(
|
|
309
316
|
collection: DocumentCollection,
|
|
310
317
|
newName: string,
|
|
311
318
|
options?: RenameOptions
|
|
312
|
-
): Effect.Effect<
|
|
319
|
+
): Effect.Effect<DocumentCollection, MongoError.MongoError>
|
|
313
320
|
} = F.dual(
|
|
314
321
|
(args) => isDocumentCollection(args[0]),
|
|
315
322
|
(
|
|
316
323
|
collection: DocumentCollection,
|
|
317
324
|
newName: string,
|
|
318
325
|
options?: RenameOptions
|
|
319
|
-
): Effect.Effect<
|
|
326
|
+
): Effect.Effect<DocumentCollection, MongoError.MongoError> =>
|
|
320
327
|
F.pipe(
|
|
321
328
|
Effect.promise(() => collection.collection.rename(newName, options)),
|
|
322
|
-
Effect.
|
|
329
|
+
Effect.map((collection) => new DocumentCollection({ collection })),
|
|
330
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<DocumentCollection>("rename error"))
|
|
323
331
|
)
|
|
324
332
|
)
|
|
325
333
|
|
|
@@ -339,23 +347,23 @@ export const drop: {
|
|
|
339
347
|
)
|
|
340
348
|
|
|
341
349
|
export const createIndexes: {
|
|
342
|
-
(indexSpecs:
|
|
350
|
+
(indexSpecs: ReadonlyArray<IndexDescription>, options?: CreateIndexesOptions): (
|
|
343
351
|
collection: DocumentCollection
|
|
344
352
|
) => Effect.Effect<Array<string>, MongoError.MongoError>
|
|
345
353
|
(
|
|
346
354
|
collection: DocumentCollection,
|
|
347
|
-
indexSpecs:
|
|
355
|
+
indexSpecs: ReadonlyArray<IndexDescription>,
|
|
348
356
|
options?: CreateIndexesOptions
|
|
349
357
|
): Effect.Effect<Array<string>, MongoError.MongoError>
|
|
350
358
|
} = F.dual(
|
|
351
359
|
(args) => isDocumentCollection(args[0]),
|
|
352
360
|
(
|
|
353
361
|
collection: DocumentCollection,
|
|
354
|
-
indexSpecs:
|
|
362
|
+
indexSpecs: ReadonlyArray<IndexDescription>,
|
|
355
363
|
options?: CreateIndexesOptions
|
|
356
364
|
): Effect.Effect<Array<string>, MongoError.MongoError> =>
|
|
357
365
|
F.pipe(
|
|
358
|
-
Effect.promise(() => collection.collection.createIndexes(indexSpecs, options)),
|
|
366
|
+
Effect.promise(() => collection.collection.createIndexes([...indexSpecs], options)),
|
|
359
367
|
Effect.catchAllDefect(MongoError.mongoErrorDie<Array<string>>("createIndexes error"))
|
|
360
368
|
)
|
|
361
369
|
)
|
|
@@ -383,47 +391,49 @@ export const createIndex: {
|
|
|
383
391
|
)
|
|
384
392
|
)
|
|
385
393
|
|
|
394
|
+
// TODO: review return type. Should we return Document like mongodb driver?
|
|
386
395
|
export const dropIndex: {
|
|
387
396
|
(
|
|
388
397
|
indexName: string,
|
|
389
398
|
options?: DropIndexesOptions
|
|
390
|
-
): (collection: DocumentCollection) => Effect.Effect<
|
|
399
|
+
): (collection: DocumentCollection) => Effect.Effect<void, MongoError.MongoError>
|
|
391
400
|
(
|
|
392
401
|
collection: DocumentCollection,
|
|
393
402
|
indexName: string,
|
|
394
403
|
options?: DropIndexesOptions
|
|
395
|
-
): Effect.Effect<
|
|
404
|
+
): Effect.Effect<void, MongoError.MongoError>
|
|
396
405
|
} = F.dual(
|
|
397
406
|
(args) => isDocumentCollection(args[0]),
|
|
398
407
|
(
|
|
399
408
|
collection: DocumentCollection,
|
|
400
409
|
indexName: string,
|
|
401
410
|
options?: DropIndexesOptions
|
|
402
|
-
): Effect.Effect<
|
|
411
|
+
): Effect.Effect<void, MongoError.MongoError> =>
|
|
403
412
|
F.pipe(
|
|
404
413
|
Effect.promise(() => collection.collection.dropIndex(indexName, options)),
|
|
405
|
-
Effect.
|
|
414
|
+
Effect.asVoid,
|
|
415
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<void>("dropIndex error"))
|
|
406
416
|
)
|
|
407
417
|
)
|
|
408
418
|
|
|
409
419
|
export const aggregate: {
|
|
410
|
-
(pipeline?:
|
|
420
|
+
(pipeline?: ReadonlyArray<Document>, options?: AggregateOptions): (
|
|
411
421
|
collection: DocumentCollection
|
|
412
422
|
) => DocumentAggregationCursor.DocumentAggregationCursor
|
|
413
423
|
(
|
|
414
424
|
collection: DocumentCollection,
|
|
415
|
-
pipeline?:
|
|
425
|
+
pipeline?: ReadonlyArray<Document>,
|
|
416
426
|
options?: AggregateOptions
|
|
417
427
|
): DocumentAggregationCursor.DocumentAggregationCursor
|
|
418
428
|
} = F.dual(
|
|
419
429
|
(args) => isDocumentCollection(args[0]),
|
|
420
430
|
(
|
|
421
431
|
collection: DocumentCollection,
|
|
422
|
-
pipeline?:
|
|
432
|
+
pipeline?: ReadonlyArray<Document>,
|
|
423
433
|
options?: AggregateOptions
|
|
424
434
|
): DocumentAggregationCursor.DocumentAggregationCursor =>
|
|
425
435
|
new DocumentAggregationCursor.DocumentAggregationCursor({
|
|
426
|
-
cursor: collection.collection.aggregate(pipeline, options)
|
|
436
|
+
cursor: collection.collection.aggregate(pipeline ? [...pipeline] : undefined, options)
|
|
427
437
|
})
|
|
428
438
|
)
|
|
429
439
|
|
|
@@ -51,10 +51,10 @@ export const limit: {
|
|
|
51
51
|
new DocumentFindCursor({ cursor: cursor.cursor.limit(value) })
|
|
52
52
|
)
|
|
53
53
|
|
|
54
|
-
export const toArray = (cursor: DocumentFindCursor): Effect.Effect<
|
|
54
|
+
export const toArray = (cursor: DocumentFindCursor): Effect.Effect<Array<Document>, MongoError.MongoError> =>
|
|
55
55
|
F.pipe(
|
|
56
56
|
Effect.tryPromise({ try: () => cursor.cursor.toArray(), catch: F.identity }),
|
|
57
|
-
Effect.catchAll(MongoError.mongoErrorDie<
|
|
57
|
+
Effect.catchAll(MongoError.mongoErrorDie<Array<Document>>("toArray error"))
|
|
58
58
|
)
|
|
59
59
|
|
|
60
60
|
export const toStream = (
|
package/src/FindCursor.ts
CHANGED
|
@@ -79,17 +79,21 @@ export const toArray = <A, I, R>(
|
|
|
79
79
|
): Effect.Effect<Array<A>, MongoError.MongoError | ParseResult.ParseError, R> => {
|
|
80
80
|
const decode = Schema.decodeUnknown(cursor.schema)
|
|
81
81
|
return Effect.tryPromise({ try: () => cursor.cursor.toArray(), catch: F.identity }).pipe(
|
|
82
|
-
Effect.catchAll(MongoError.mongoErrorDie<
|
|
82
|
+
Effect.catchAll(MongoError.mongoErrorDie<Array<A>>("Unable to get array from mongodb cursor")),
|
|
83
83
|
Effect.flatMap(Effect.forEach((x) => decode(x)))
|
|
84
84
|
)
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
export const toArrayEither = <A, I, R>(
|
|
88
88
|
cursor: FindCursor<A, I, R>
|
|
89
|
-
): Effect.Effect<
|
|
89
|
+
): Effect.Effect<
|
|
90
|
+
Array<E.Either<A, [document: unknown, error: ParseResult.ParseError]>>,
|
|
91
|
+
MongoError.MongoError,
|
|
92
|
+
R
|
|
93
|
+
> => {
|
|
90
94
|
const decode = Schema.decodeUnknown(cursor.schema)
|
|
91
95
|
return Effect.tryPromise({ try: () => cursor.cursor.toArray(), catch: F.identity }).pipe(
|
|
92
|
-
Effect.catchAll(MongoError.mongoErrorDie<
|
|
96
|
+
Effect.catchAll(MongoError.mongoErrorDie<Array<unknown>>("Unable to get array from mongodb cursor")),
|
|
93
97
|
Effect.flatMap(Effect.forEach((x) =>
|
|
94
98
|
F.pipe(
|
|
95
99
|
decode(x),
|
|
@@ -30,10 +30,10 @@ export type FullListCollectionsCursor = ListCollectionsCursor<MongoCollectionInf
|
|
|
30
30
|
|
|
31
31
|
export const toArray = <T extends DefaultCollectionInfo>(
|
|
32
32
|
cursor: ListCollectionsCursor<T>
|
|
33
|
-
): Effect.Effect<
|
|
33
|
+
): Effect.Effect<Array<T>, MongoError.MongoError> =>
|
|
34
34
|
F.pipe(
|
|
35
35
|
Effect.tryPromise({ try: () => cursor.cursor.toArray(), catch: F.identity }),
|
|
36
|
-
Effect.catchAll(MongoError.mongoErrorDie<
|
|
36
|
+
Effect.catchAll(MongoError.mongoErrorDie<Array<T>>(`${cursor._tag}.toArray error`))
|
|
37
37
|
)
|
|
38
38
|
|
|
39
39
|
export const toStream = <T extends DefaultCollectionInfo>(
|
package/src/MongoClient.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import * as Effect from "effect/Effect"
|
|
5
5
|
import * as F from "effect/Function"
|
|
6
|
+
import type * as Scope from "effect/Scope"
|
|
6
7
|
import type { Db, DbOptions, MongoClientOptions } from "mongodb"
|
|
7
8
|
import { MongoClient as MongoClient_ } from "mongodb"
|
|
8
9
|
import * as MongoError from "./MongoError.js"
|
|
@@ -17,6 +18,26 @@ export const connect = (
|
|
|
17
18
|
Effect.catchAll(MongoError.mongoErrorDie<MongoClient_>("connect error"))
|
|
18
19
|
)
|
|
19
20
|
|
|
21
|
+
export const close: {
|
|
22
|
+
(force?: boolean): (client: MongoClient) => Effect.Effect<void, MongoError.MongoError>
|
|
23
|
+
(client: MongoClient, force?: boolean): Effect.Effect<void, MongoError.MongoError>
|
|
24
|
+
} = F.dual(
|
|
25
|
+
(args) => isMongoClient(args[0]),
|
|
26
|
+
(client: MongoClient, force?: boolean): Effect.Effect<void, MongoError.MongoError> =>
|
|
27
|
+
Effect.promise(() => client.close(force)).pipe(
|
|
28
|
+
Effect.catchAll(MongoError.mongoErrorDie<void>("close error"))
|
|
29
|
+
)
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
export const connectScoped = (
|
|
33
|
+
url: string,
|
|
34
|
+
options?: MongoClientOptions & { forceClose?: boolean }
|
|
35
|
+
): Effect.Effect<MongoClient, MongoError.MongoError, Scope.Scope> =>
|
|
36
|
+
Effect.acquireRelease(
|
|
37
|
+
connect(url, options),
|
|
38
|
+
(client) => close(client, options?.forceClose).pipe(Effect.orDie)
|
|
39
|
+
)
|
|
40
|
+
|
|
20
41
|
export const db: {
|
|
21
42
|
(dbName?: string, options?: DbOptions): (client: MongoClient) => Db
|
|
22
43
|
(client: MongoClient, dbName?: string, options?: DbOptions): Db
|
package/src/internal/version.ts
CHANGED