effect-mongodb 0.0.2 → 0.0.4
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/AggregationCursor/package.json +6 -0
- package/DocumentAggregationCursor/package.json +6 -0
- package/ListCollectionsCursor/package.json +6 -0
- package/README.md +8 -3
- package/dist/cjs/AggregationCursor.js +34 -0
- package/dist/cjs/AggregationCursor.js.map +1 -0
- package/dist/cjs/Collection.js +41 -4
- package/dist/cjs/Collection.js.map +1 -1
- package/dist/cjs/Db.js +7 -1
- package/dist/cjs/Db.js.map +1 -1
- package/dist/cjs/DocumentAggregationCursor.js +27 -0
- package/dist/cjs/DocumentAggregationCursor.js.map +1 -0
- package/dist/cjs/DocumentCollection.js +30 -3
- package/dist/cjs/DocumentCollection.js.map +1 -1
- package/dist/cjs/DocumentFindCursor.js +4 -0
- package/dist/cjs/DocumentFindCursor.js.map +1 -1
- package/dist/cjs/FindCursor.js +6 -4
- package/dist/cjs/FindCursor.js.map +1 -1
- package/dist/cjs/ListCollectionsCursor.js +27 -0
- package/dist/cjs/ListCollectionsCursor.js.map +1 -0
- package/dist/cjs/MongoClient.js.map +1 -1
- package/dist/cjs/index.js +7 -1
- package/dist/cjs/internal/filter.js +6 -0
- package/dist/cjs/internal/filter.js.map +1 -0
- package/dist/cjs/internal/modify-result.js +6 -0
- package/dist/cjs/internal/modify-result.js.map +1 -0
- package/dist/cjs/internal/schema.js +19 -0
- package/dist/cjs/internal/schema.js.map +1 -0
- package/dist/cjs/internal/version.js +1 -1
- package/dist/dts/AggregationCursor.d.ts +18 -0
- package/dist/dts/AggregationCursor.d.ts.map +1 -0
- package/dist/dts/Collection.d.ts +72 -14
- package/dist/dts/Collection.d.ts.map +1 -1
- package/dist/dts/Db.d.ts +28 -3
- package/dist/dts/Db.d.ts.map +1 -1
- package/dist/dts/DocumentAggregationCursor.d.ts +15 -0
- package/dist/dts/DocumentAggregationCursor.d.ts.map +1 -0
- package/dist/dts/DocumentCollection.d.ts +64 -7
- package/dist/dts/DocumentCollection.d.ts.map +1 -1
- package/dist/dts/DocumentFindCursor.d.ts +4 -7
- package/dist/dts/DocumentFindCursor.d.ts.map +1 -1
- package/dist/dts/FindCursor.d.ts +16 -18
- package/dist/dts/FindCursor.d.ts.map +1 -1
- package/dist/dts/ListCollectionsCursor.d.ts +20 -0
- package/dist/dts/ListCollectionsCursor.d.ts.map +1 -0
- package/dist/dts/MongoClient.d.ts +1 -1
- package/dist/dts/MongoClient.d.ts.map +1 -1
- package/dist/dts/index.d.ts +12 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/filter.d.ts +8 -0
- package/dist/dts/internal/filter.d.ts.map +1 -0
- package/dist/dts/internal/modify-result.d.ts +6 -0
- package/dist/dts/internal/modify-result.d.ts.map +1 -0
- package/dist/dts/internal/schema.d.ts +6 -0
- package/dist/dts/internal/schema.d.ts.map +1 -0
- package/dist/esm/AggregationCursor.js +22 -0
- package/dist/esm/AggregationCursor.js.map +1 -0
- package/dist/esm/Collection.js +39 -3
- package/dist/esm/Collection.js.map +1 -1
- package/dist/esm/Db.js +6 -0
- package/dist/esm/Db.js.map +1 -1
- package/dist/esm/DocumentAggregationCursor.js +15 -0
- package/dist/esm/DocumentAggregationCursor.js.map +1 -0
- package/dist/esm/DocumentCollection.js +28 -2
- package/dist/esm/DocumentCollection.js.map +1 -1
- package/dist/esm/DocumentFindCursor.js +3 -0
- package/dist/esm/DocumentFindCursor.js.map +1 -1
- package/dist/esm/FindCursor.js +5 -4
- package/dist/esm/FindCursor.js.map +1 -1
- package/dist/esm/ListCollectionsCursor.js +15 -0
- package/dist/esm/ListCollectionsCursor.js.map +1 -0
- package/dist/esm/MongoClient.js.map +1 -1
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/filter.js +2 -0
- package/dist/esm/internal/filter.js.map +1 -0
- package/dist/esm/internal/modify-result.js +2 -0
- package/dist/esm/internal/modify-result.js.map +1 -0
- package/dist/esm/internal/schema.js +10 -0
- package/dist/esm/internal/schema.js.map +1 -0
- package/dist/esm/internal/version.js +1 -1
- package/package.json +26 -3
- package/src/AggregationCursor.ts +37 -0
- package/src/Collection.ts +390 -24
- package/src/Db.ts +47 -3
- package/src/DocumentAggregationCursor.ts +30 -0
- package/src/DocumentCollection.ts +342 -5
- package/src/DocumentFindCursor.ts +5 -5
- package/src/FindCursor.ts +31 -27
- package/src/ListCollectionsCursor.ts +45 -0
- package/src/MongoClient.ts +5 -2
- package/src/index.ts +15 -0
- package/src/internal/filter.ts +9 -0
- package/src/internal/modify-result.ts +6 -0
- package/src/internal/schema.ts +12 -0
- package/src/internal/version.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "effect-mongodb",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "A MongoDB toolkit for Effect",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -12,8 +12,7 @@
|
|
|
12
12
|
"author": "doubleloop.io",
|
|
13
13
|
"homepage": "https://github.com/doubleloop-io/effect-mongodb",
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"
|
|
16
|
-
"effect": "^3.8.3",
|
|
15
|
+
"effect": "^3.10.14",
|
|
17
16
|
"mongodb": "^6.8.0"
|
|
18
17
|
},
|
|
19
18
|
"publishConfig": {
|
|
@@ -29,6 +28,11 @@
|
|
|
29
28
|
"import": "./dist/esm/index.js",
|
|
30
29
|
"default": "./dist/cjs/index.js"
|
|
31
30
|
},
|
|
31
|
+
"./AggregationCursor": {
|
|
32
|
+
"types": "./dist/dts/AggregationCursor.d.ts",
|
|
33
|
+
"import": "./dist/esm/AggregationCursor.js",
|
|
34
|
+
"default": "./dist/cjs/AggregationCursor.js"
|
|
35
|
+
},
|
|
32
36
|
"./Collection": {
|
|
33
37
|
"types": "./dist/dts/Collection.d.ts",
|
|
34
38
|
"import": "./dist/esm/Collection.js",
|
|
@@ -39,6 +43,11 @@
|
|
|
39
43
|
"import": "./dist/esm/Db.js",
|
|
40
44
|
"default": "./dist/cjs/Db.js"
|
|
41
45
|
},
|
|
46
|
+
"./DocumentAggregationCursor": {
|
|
47
|
+
"types": "./dist/dts/DocumentAggregationCursor.d.ts",
|
|
48
|
+
"import": "./dist/esm/DocumentAggregationCursor.js",
|
|
49
|
+
"default": "./dist/cjs/DocumentAggregationCursor.js"
|
|
50
|
+
},
|
|
42
51
|
"./DocumentCollection": {
|
|
43
52
|
"types": "./dist/dts/DocumentCollection.d.ts",
|
|
44
53
|
"import": "./dist/esm/DocumentCollection.js",
|
|
@@ -54,6 +63,11 @@
|
|
|
54
63
|
"import": "./dist/esm/FindCursor.js",
|
|
55
64
|
"default": "./dist/cjs/FindCursor.js"
|
|
56
65
|
},
|
|
66
|
+
"./ListCollectionsCursor": {
|
|
67
|
+
"types": "./dist/dts/ListCollectionsCursor.d.ts",
|
|
68
|
+
"import": "./dist/esm/ListCollectionsCursor.js",
|
|
69
|
+
"default": "./dist/cjs/ListCollectionsCursor.js"
|
|
70
|
+
},
|
|
57
71
|
"./MongoClient": {
|
|
58
72
|
"types": "./dist/dts/MongoClient.d.ts",
|
|
59
73
|
"import": "./dist/esm/MongoClient.js",
|
|
@@ -67,12 +81,18 @@
|
|
|
67
81
|
},
|
|
68
82
|
"typesVersions": {
|
|
69
83
|
"*": {
|
|
84
|
+
"AggregationCursor": [
|
|
85
|
+
"./dist/dts/AggregationCursor.d.ts"
|
|
86
|
+
],
|
|
70
87
|
"Collection": [
|
|
71
88
|
"./dist/dts/Collection.d.ts"
|
|
72
89
|
],
|
|
73
90
|
"Db": [
|
|
74
91
|
"./dist/dts/Db.d.ts"
|
|
75
92
|
],
|
|
93
|
+
"DocumentAggregationCursor": [
|
|
94
|
+
"./dist/dts/DocumentAggregationCursor.d.ts"
|
|
95
|
+
],
|
|
76
96
|
"DocumentCollection": [
|
|
77
97
|
"./dist/dts/DocumentCollection.d.ts"
|
|
78
98
|
],
|
|
@@ -82,6 +102,9 @@
|
|
|
82
102
|
"FindCursor": [
|
|
83
103
|
"./dist/dts/FindCursor.d.ts"
|
|
84
104
|
],
|
|
105
|
+
"ListCollectionsCursor": [
|
|
106
|
+
"./dist/dts/ListCollectionsCursor.d.ts"
|
|
107
|
+
],
|
|
85
108
|
"MongoClient": [
|
|
86
109
|
"./dist/dts/MongoClient.d.ts"
|
|
87
110
|
],
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 0.0.1
|
|
3
|
+
*/
|
|
4
|
+
import * as Data from "effect/Data"
|
|
5
|
+
import * as Effect from "effect/Effect"
|
|
6
|
+
import * as F from "effect/Function"
|
|
7
|
+
import type * as ParseResult from "effect/ParseResult"
|
|
8
|
+
import * as Schema from "effect/Schema"
|
|
9
|
+
import * as Stream from "effect/Stream"
|
|
10
|
+
import type { AggregationCursor as MongoAggregationCursor } from "mongodb"
|
|
11
|
+
import * as MongoError from "./MongoError.js"
|
|
12
|
+
|
|
13
|
+
export class AggregationCursor<A, I = A, R = never> extends Data.TaggedClass("AggregationCursor")<
|
|
14
|
+
{ cursor: MongoAggregationCursor<unknown>; schema: Schema.Schema<A, I, R> }
|
|
15
|
+
> {
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const toArray = <A, I, R>(
|
|
19
|
+
cursor: AggregationCursor<A, I, R>
|
|
20
|
+
): Effect.Effect<ReadonlyArray<A>, MongoError.MongoError | ParseResult.ParseError, R> => {
|
|
21
|
+
const decode = Schema.decodeUnknown(cursor.schema)
|
|
22
|
+
return Effect.tryPromise({ try: () => cursor.cursor.toArray(), catch: F.identity }).pipe(
|
|
23
|
+
Effect.catchAll(MongoError.mongoErrorDie<ReadonlyArray<A>>("Unable to get array from mongodb aggregate cursor")),
|
|
24
|
+
Effect.flatMap(Effect.forEach((x) => decode(x)))
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const toStream = <A, I, R>(
|
|
29
|
+
cursor: AggregationCursor<A, I, R>
|
|
30
|
+
): Stream.Stream<A, MongoError.MongoError | ParseResult.ParseError, R> => {
|
|
31
|
+
const decode = Schema.decodeUnknown(cursor.schema)
|
|
32
|
+
return F.pipe(
|
|
33
|
+
Stream.fromAsyncIterable(cursor.cursor, F.identity),
|
|
34
|
+
Stream.catchAll(MongoError.mongoErrorStream<A>("Unable to get stream from mongodb aggregate cursor")),
|
|
35
|
+
Stream.mapEffect((x) => decode(x))
|
|
36
|
+
)
|
|
37
|
+
}
|
package/src/Collection.ts
CHANGED
|
@@ -1,23 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 0.0.1
|
|
3
3
|
*/
|
|
4
|
-
import type * as ParseResult from "@effect/schema/ParseResult"
|
|
5
|
-
import * as Schema from "@effect/schema/Schema"
|
|
6
4
|
import * as Data from "effect/Data"
|
|
7
5
|
import * as Effect from "effect/Effect"
|
|
8
6
|
import * as F from "effect/Function"
|
|
9
7
|
import * as O from "effect/Option"
|
|
8
|
+
import type * as ParseResult from "effect/ParseResult"
|
|
9
|
+
import * as Schema from "effect/Schema"
|
|
10
10
|
import type {
|
|
11
|
+
AggregateOptions,
|
|
11
12
|
BulkWriteOptions,
|
|
12
13
|
Collection as MongoCollection,
|
|
14
|
+
CreateIndexesOptions,
|
|
15
|
+
DeleteOptions,
|
|
16
|
+
DeleteResult,
|
|
13
17
|
Document,
|
|
14
|
-
|
|
18
|
+
DropCollectionOptions,
|
|
19
|
+
DropIndexesOptions,
|
|
20
|
+
FindOneAndReplaceOptions,
|
|
15
21
|
FindOptions as MongoFindOptions,
|
|
22
|
+
IndexDescription,
|
|
23
|
+
IndexSpecification,
|
|
16
24
|
InsertManyResult,
|
|
17
25
|
InsertOneOptions,
|
|
18
|
-
InsertOneResult
|
|
26
|
+
InsertOneResult,
|
|
27
|
+
ModifyResult as MongoModifyResult,
|
|
28
|
+
RenameOptions,
|
|
29
|
+
ReplaceOptions,
|
|
30
|
+
UpdateFilter,
|
|
31
|
+
UpdateOptions,
|
|
32
|
+
UpdateResult
|
|
19
33
|
} from "mongodb"
|
|
34
|
+
import * as AggregationCursor from "./AggregationCursor.js"
|
|
20
35
|
import * as FindCursor from "./FindCursor.js"
|
|
36
|
+
import type { Filter } from "./internal/filter.js"
|
|
37
|
+
import type { ModifyResult } from "./internal/modify-result.js"
|
|
38
|
+
import * as SchemaExt from "./internal/schema.js"
|
|
21
39
|
import * as MongoError from "./MongoError.js"
|
|
22
40
|
|
|
23
41
|
export class Collection<A extends Document, I extends Document = A, R = never> extends Data.TaggedClass("Collection")<{
|
|
@@ -29,48 +47,49 @@ export class Collection<A extends Document, I extends Document = A, R = never> e
|
|
|
29
47
|
export type FindOptions = Omit<MongoFindOptions, "projection">
|
|
30
48
|
|
|
31
49
|
export const find: {
|
|
32
|
-
(
|
|
50
|
+
<I extends Document>(
|
|
51
|
+
filter?: Filter<I>,
|
|
33
52
|
options?: FindOptions
|
|
34
|
-
): <A extends Document, I
|
|
35
|
-
|
|
36
|
-
) => FindCursor.FindCursor<A, I, R>
|
|
37
|
-
<A extends Document, I extends Document = A, R = never>(
|
|
53
|
+
): <A extends Document, R>(collection: Collection<A, I, R>) => FindCursor.FindCursor<A, I, R>
|
|
54
|
+
<A extends Document, I extends Document, R>(
|
|
38
55
|
collection: Collection<A, I, R>,
|
|
56
|
+
filter?: Filter<I>,
|
|
39
57
|
options?: FindOptions
|
|
40
58
|
): FindCursor.FindCursor<A, I, R>
|
|
41
59
|
} = F.dual(
|
|
42
60
|
(args) => isCollection(args[0]),
|
|
43
|
-
<A extends Document, I extends Document
|
|
61
|
+
<A extends Document, I extends Document, R>(
|
|
44
62
|
collection: Collection<A, I, R>,
|
|
63
|
+
filter?: Filter<I>,
|
|
45
64
|
options?: FindOptions
|
|
46
65
|
): FindCursor.FindCursor<A, I, R> =>
|
|
47
66
|
new FindCursor.FindCursor<A, I, R>({
|
|
48
|
-
cursor: collection.collection.find({}, options),
|
|
67
|
+
cursor: collection.collection.find(filter ?? {}, options),
|
|
49
68
|
schema: collection.schema
|
|
50
69
|
})
|
|
51
70
|
)
|
|
52
71
|
|
|
53
72
|
export const findOne: {
|
|
54
|
-
<
|
|
73
|
+
<I extends Document>(
|
|
55
74
|
filter: Filter<I>,
|
|
56
75
|
options?: FindOptions
|
|
57
|
-
): (
|
|
76
|
+
): <A extends Document, R>(
|
|
58
77
|
collection: Collection<A, I, R>
|
|
59
78
|
) => Effect.Effect<O.Option<Document>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
60
|
-
<A extends Document, I extends Document
|
|
79
|
+
<A extends Document, I extends Document, R>(
|
|
61
80
|
collection: Collection<A, I, R>,
|
|
62
81
|
filter: Filter<I>,
|
|
63
82
|
options?: FindOptions
|
|
64
83
|
): Effect.Effect<O.Option<Document>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
65
84
|
} = F.dual(
|
|
66
85
|
(args) => isCollection(args[0]),
|
|
67
|
-
<A extends Document, I extends Document
|
|
86
|
+
<A extends Document, I extends Document, R>(
|
|
68
87
|
collection: Collection<A, I, R>,
|
|
69
88
|
filter: Filter<I>,
|
|
70
89
|
options?: FindOptions
|
|
71
90
|
): Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R> =>
|
|
72
91
|
Effect.gen(function*(_) {
|
|
73
|
-
const value = yield* _(Effect.promise(() => collection.collection.findOne(filter
|
|
92
|
+
const value = yield* _(Effect.promise(() => collection.collection.findOne(filter, options)))
|
|
74
93
|
if (value !== null) return O.some(yield* _(Schema.decodeUnknown(collection.schema)(value)))
|
|
75
94
|
return O.none()
|
|
76
95
|
}).pipe(
|
|
@@ -79,18 +98,18 @@ export const findOne: {
|
|
|
79
98
|
)
|
|
80
99
|
|
|
81
100
|
export const insertOne: {
|
|
82
|
-
<A extends Document
|
|
101
|
+
<A extends Document>(
|
|
83
102
|
doc: A,
|
|
84
103
|
options?: InsertOneOptions
|
|
85
|
-
): (
|
|
104
|
+
): <I extends Document, R>(
|
|
86
105
|
collection: Collection<A, I, R>
|
|
87
106
|
) => Effect.Effect<InsertOneResult, MongoError.MongoError | ParseResult.ParseError, R>
|
|
88
|
-
<A extends Document, I extends Document
|
|
107
|
+
<A extends Document, I extends Document, R>(
|
|
89
108
|
collection: Collection<A, I, R>,
|
|
90
109
|
doc: A,
|
|
91
110
|
options?: InsertOneOptions
|
|
92
111
|
): Effect.Effect<InsertOneResult, MongoError.MongoError | ParseResult.ParseError, R>
|
|
93
|
-
} = F.dual((args) => isCollection(args[0]), <A extends Document, I extends Document
|
|
112
|
+
} = F.dual((args) => isCollection(args[0]), <A extends Document, I extends Document, R>(
|
|
94
113
|
collection: Collection<A, I, R>,
|
|
95
114
|
doc: A,
|
|
96
115
|
options?: InsertOneOptions
|
|
@@ -102,18 +121,18 @@ export const insertOne: {
|
|
|
102
121
|
))
|
|
103
122
|
|
|
104
123
|
export const insertMany: {
|
|
105
|
-
<A extends Document
|
|
124
|
+
<A extends Document>(
|
|
106
125
|
docs: Array<A>,
|
|
107
126
|
options?: BulkWriteOptions
|
|
108
|
-
): (
|
|
127
|
+
): <I extends Document, R>(
|
|
109
128
|
collection: Collection<A, I, R>
|
|
110
129
|
) => Effect.Effect<InsertManyResult, MongoError.MongoError | ParseResult.ParseError, R>
|
|
111
|
-
<A extends Document, I extends Document
|
|
130
|
+
<A extends Document, I extends Document, R>(
|
|
112
131
|
collection: Collection<A, I, R>,
|
|
113
132
|
docs: Array<A>,
|
|
114
133
|
options?: BulkWriteOptions
|
|
115
134
|
): Effect.Effect<InsertManyResult, MongoError.MongoError | ParseResult.ParseError, R>
|
|
116
|
-
} = F.dual((args) => isCollection(args[0]), <A extends Document, I extends Document
|
|
135
|
+
} = F.dual((args) => isCollection(args[0]), <A extends Document, I extends Document, R>(
|
|
117
136
|
collection: Collection<A, I, R>,
|
|
118
137
|
docs: Array<A>,
|
|
119
138
|
options?: BulkWriteOptions
|
|
@@ -127,4 +146,351 @@ export const insertMany: {
|
|
|
127
146
|
)
|
|
128
147
|
})
|
|
129
148
|
|
|
149
|
+
export const deleteOne: {
|
|
150
|
+
<I extends Document>(
|
|
151
|
+
filter: Filter<I>,
|
|
152
|
+
options?: DeleteOptions
|
|
153
|
+
): <A extends Document, R>(
|
|
154
|
+
collection: Collection<A, I, R>
|
|
155
|
+
) => Effect.Effect<DeleteResult, MongoError.MongoError, R>
|
|
156
|
+
<A extends Document, I extends Document, R>(
|
|
157
|
+
collection: Collection<A, I, R>,
|
|
158
|
+
filter: Filter<I>,
|
|
159
|
+
options?: DeleteOptions
|
|
160
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError, R>
|
|
161
|
+
} = F.dual(
|
|
162
|
+
(args) => isCollection(args[0]),
|
|
163
|
+
<A extends Document, I extends Document, R>(
|
|
164
|
+
collection: Collection<A, I, R>,
|
|
165
|
+
filter: Filter<I>,
|
|
166
|
+
options?: DeleteOptions
|
|
167
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError, R> =>
|
|
168
|
+
Effect.promise(() => collection.collection.deleteOne(filter, options)).pipe(
|
|
169
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<DeleteResult>("deleteOne error"))
|
|
170
|
+
)
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
export const deleteMany: {
|
|
174
|
+
<I extends Document>(
|
|
175
|
+
filter: Filter<I>,
|
|
176
|
+
options?: DeleteOptions
|
|
177
|
+
): <A extends Document, R>(
|
|
178
|
+
collection: Collection<A, I, R>
|
|
179
|
+
) => Effect.Effect<DeleteResult, MongoError.MongoError, R>
|
|
180
|
+
<A extends Document, I extends Document, R>(
|
|
181
|
+
collection: Collection<A, I, R>,
|
|
182
|
+
filter: Filter<I>,
|
|
183
|
+
options?: DeleteOptions
|
|
184
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError, R>
|
|
185
|
+
} = F.dual(
|
|
186
|
+
(args) => isCollection(args[0]),
|
|
187
|
+
<A extends Document, I extends Document, R>(
|
|
188
|
+
collection: Collection<A, I, R>,
|
|
189
|
+
filter: Filter<I>,
|
|
190
|
+
options?: DeleteOptions
|
|
191
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError, R> =>
|
|
192
|
+
Effect.promise(() => collection.collection.deleteMany(filter, options)).pipe(
|
|
193
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<DeleteResult>("deleteMany error"))
|
|
194
|
+
)
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
export const updateMany: {
|
|
198
|
+
<I extends Document>(
|
|
199
|
+
filter: Filter<I>,
|
|
200
|
+
update: UpdateFilter<I> | Array<Document>,
|
|
201
|
+
options?: UpdateOptions
|
|
202
|
+
): <A extends Document, R>(
|
|
203
|
+
collection: Collection<A, I, R>
|
|
204
|
+
) => Effect.Effect<UpdateResult, MongoError.MongoError, R>
|
|
205
|
+
<A extends Document, I extends Document, R>(
|
|
206
|
+
collection: Collection<A, I, R>,
|
|
207
|
+
filter: Filter<I>,
|
|
208
|
+
update: UpdateFilter<I> | Array<Document>,
|
|
209
|
+
options?: UpdateOptions
|
|
210
|
+
): Effect.Effect<UpdateResult, MongoError.MongoError, R>
|
|
211
|
+
} = F.dual(
|
|
212
|
+
(args) => isCollection(args[0]),
|
|
213
|
+
<A extends Document, I extends Document, R>(
|
|
214
|
+
collection: Collection<A, I, R>,
|
|
215
|
+
filter: Filter<I>,
|
|
216
|
+
update: UpdateFilter<I> | Array<Document>,
|
|
217
|
+
options?: UpdateOptions
|
|
218
|
+
): Effect.Effect<UpdateResult, MongoError.MongoError, R> =>
|
|
219
|
+
Effect.promise(() =>
|
|
220
|
+
collection.collection.updateMany(filter, update as UpdateFilter<Document> | Array<Document>, options)
|
|
221
|
+
).pipe(
|
|
222
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<UpdateResult>("updateMany error"))
|
|
223
|
+
)
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
export const replaceOne: {
|
|
227
|
+
<A extends Document, I extends Document>(
|
|
228
|
+
filter: Filter<I>,
|
|
229
|
+
// TODO: should we put WithoutId<A> here like the driver signature?
|
|
230
|
+
replacement: A,
|
|
231
|
+
options?: ReplaceOptions
|
|
232
|
+
): <R>(
|
|
233
|
+
collection: Collection<A, I, R>
|
|
234
|
+
) => Effect.Effect<UpdateResult | Document, MongoError.MongoError | ParseResult.ParseError, R>
|
|
235
|
+
<A extends Document, I extends Document, R>(
|
|
236
|
+
collection: Collection<A, I, R>,
|
|
237
|
+
filter: Filter<I>,
|
|
238
|
+
replacement: A,
|
|
239
|
+
options?: ReplaceOptions
|
|
240
|
+
): Effect.Effect<UpdateResult | Document, MongoError.MongoError | ParseResult.ParseError, R>
|
|
241
|
+
} = F.dual(
|
|
242
|
+
(args) => isCollection(args[0]),
|
|
243
|
+
<A extends Document, I extends Document, R>(
|
|
244
|
+
collection: Collection<A, I, R>,
|
|
245
|
+
filter: Filter<I>,
|
|
246
|
+
replacement: A,
|
|
247
|
+
options?: ReplaceOptions
|
|
248
|
+
): Effect.Effect<
|
|
249
|
+
UpdateResult | Document,
|
|
250
|
+
MongoError.MongoError | ParseResult.ParseError,
|
|
251
|
+
R
|
|
252
|
+
> =>
|
|
253
|
+
F.pipe(
|
|
254
|
+
// TODO: extract function in Collection
|
|
255
|
+
Schema.encode(collection.schema)(replacement),
|
|
256
|
+
Effect.flatMap((replacement) =>
|
|
257
|
+
Effect.promise(() => collection.collection.replaceOne(filter, replacement, options))
|
|
258
|
+
),
|
|
259
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<UpdateResult | Document>("replaceOne error"))
|
|
260
|
+
)
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
export const findOneAndReplace: {
|
|
264
|
+
<A extends Document, I extends Document>(
|
|
265
|
+
filter: Filter<I>,
|
|
266
|
+
replacement: A,
|
|
267
|
+
options: FindOneAndReplaceOptions & { includeResultMetadata: true }
|
|
268
|
+
): <R>(
|
|
269
|
+
collection: Collection<A, I, R>
|
|
270
|
+
) => Effect.Effect<ModifyResult<A>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
271
|
+
<A extends Document, I extends Document>(
|
|
272
|
+
filter: Filter<I>,
|
|
273
|
+
replacement: A,
|
|
274
|
+
options: FindOneAndReplaceOptions & { includeResultMetadata: false }
|
|
275
|
+
): <R>(
|
|
276
|
+
collection: Collection<A, I, R>
|
|
277
|
+
) => Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
278
|
+
<A extends Document, I extends Document>(
|
|
279
|
+
filter: Filter<I>,
|
|
280
|
+
replacement: A,
|
|
281
|
+
options: FindOneAndReplaceOptions
|
|
282
|
+
): <R>(
|
|
283
|
+
collection: Collection<A, I, R>
|
|
284
|
+
) => Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
285
|
+
<A extends Document, I extends Document>(
|
|
286
|
+
filter: Filter<I>,
|
|
287
|
+
replacement: A
|
|
288
|
+
): <R>(
|
|
289
|
+
collection: Collection<A, I, R>
|
|
290
|
+
) => Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
291
|
+
<A extends Document, I extends Document, R>(
|
|
292
|
+
collection: Collection<A, I, R>,
|
|
293
|
+
filter: Filter<I>,
|
|
294
|
+
replacement: A,
|
|
295
|
+
options: FindOneAndReplaceOptions & { includeResultMetadata: true }
|
|
296
|
+
): Effect.Effect<ModifyResult<A>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
297
|
+
<A extends Document, I extends Document, R>(
|
|
298
|
+
collection: Collection<A, I, R>,
|
|
299
|
+
filter: Filter<I>,
|
|
300
|
+
replacement: A,
|
|
301
|
+
options: FindOneAndReplaceOptions & { includeResultMetadata: false }
|
|
302
|
+
): Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
303
|
+
<A extends Document, I extends Document, R>(
|
|
304
|
+
collection: Collection<A, I, R>,
|
|
305
|
+
filter: Filter<I>,
|
|
306
|
+
replacement: A,
|
|
307
|
+
options: FindOneAndReplaceOptions
|
|
308
|
+
): Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
309
|
+
<A extends Document, I extends Document, R>(
|
|
310
|
+
collection: Collection<A, I, R>,
|
|
311
|
+
filter: Filter<I>,
|
|
312
|
+
replacement: A
|
|
313
|
+
): Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
314
|
+
} = F.dual(
|
|
315
|
+
(args) => isCollection(args[0]),
|
|
316
|
+
<A extends Document, I extends Document, R>(
|
|
317
|
+
collection: Collection<A, I, R>,
|
|
318
|
+
filter: Filter<I>,
|
|
319
|
+
replacement: A,
|
|
320
|
+
options?: FindOneAndReplaceOptions
|
|
321
|
+
): Effect.Effect<O.Option<A> | ModifyResult<A>, MongoError.MongoError | ParseResult.ParseError, R> =>
|
|
322
|
+
F.pipe(
|
|
323
|
+
// TODO: extract function in Collection
|
|
324
|
+
Schema.encode(collection.schema)(replacement),
|
|
325
|
+
Effect.flatMap((replacement) =>
|
|
326
|
+
Effect.promise(() => collection.collection.findOneAndReplace(filter, replacement, options ?? {}))
|
|
327
|
+
),
|
|
328
|
+
Effect.flatMap((value) =>
|
|
329
|
+
Effect.gen(function*(_) {
|
|
330
|
+
if (options?.includeResultMetadata && !!value) {
|
|
331
|
+
const result = value as unknown as MongoModifyResult<I>
|
|
332
|
+
const maybeValue = yield* _(SchemaExt.decodeNullableDocument(collection.schema, result.value))
|
|
333
|
+
return { ...result, value: maybeValue }
|
|
334
|
+
}
|
|
335
|
+
return yield* _(SchemaExt.decodeNullableDocument(collection.schema, value))
|
|
336
|
+
})
|
|
337
|
+
),
|
|
338
|
+
Effect.catchAllDefect(
|
|
339
|
+
MongoError.mongoErrorDie<O.Option<A> | ModifyResult<A>>("findOneAndReplace error")
|
|
340
|
+
)
|
|
341
|
+
)
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
export const rename: {
|
|
345
|
+
(
|
|
346
|
+
newName: string,
|
|
347
|
+
options?: RenameOptions
|
|
348
|
+
): <A extends Document, I extends Document, R>(
|
|
349
|
+
collection: Collection<A, I, R>
|
|
350
|
+
) => Effect.Effect<Collection<A, I, R>, MongoError.MongoError, R>
|
|
351
|
+
<A extends Document, I extends Document, R>(
|
|
352
|
+
collection: Collection<A, I, R>,
|
|
353
|
+
newName: string,
|
|
354
|
+
options?: RenameOptions
|
|
355
|
+
): Effect.Effect<Collection<A, I, R>, MongoError.MongoError, R>
|
|
356
|
+
} = F.dual(
|
|
357
|
+
(args) => isCollection(args[0]),
|
|
358
|
+
<A extends Document, I extends Document, R>(
|
|
359
|
+
collection: Collection<A, I, R>,
|
|
360
|
+
newName: string,
|
|
361
|
+
options?: RenameOptions
|
|
362
|
+
): Effect.Effect<Collection<A, I, R>, MongoError.MongoError, R> =>
|
|
363
|
+
F.pipe(
|
|
364
|
+
Effect.promise(() => collection.collection.rename(newName, options)),
|
|
365
|
+
Effect.map((newCollection) => new Collection<A, I, R>({ collection: newCollection, schema: collection.schema })),
|
|
366
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<Collection<A, I, R>>("rename error"))
|
|
367
|
+
)
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
export const drop: {
|
|
371
|
+
(
|
|
372
|
+
options?: DropCollectionOptions
|
|
373
|
+
): <A extends Document, I extends Document, R>(
|
|
374
|
+
collection: Collection<A, I, R>
|
|
375
|
+
) => Effect.Effect<boolean, MongoError.MongoError, R>
|
|
376
|
+
<A extends Document, I extends Document, R>(
|
|
377
|
+
collection: Collection<A, I, R>,
|
|
378
|
+
options?: DropCollectionOptions
|
|
379
|
+
): Effect.Effect<boolean, MongoError.MongoError, R>
|
|
380
|
+
} = F.dual(
|
|
381
|
+
(args) => isCollection(args[0]),
|
|
382
|
+
<A extends Document, I extends Document, R>(
|
|
383
|
+
collection: Collection<A, I, R>,
|
|
384
|
+
options?: DropCollectionOptions
|
|
385
|
+
): Effect.Effect<boolean, MongoError.MongoError, R> =>
|
|
386
|
+
F.pipe(
|
|
387
|
+
Effect.promise(() => collection.collection.drop(options)),
|
|
388
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<boolean>("drop error"))
|
|
389
|
+
)
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
export const createIndexes: {
|
|
393
|
+
(
|
|
394
|
+
indexSpecs: Array<IndexDescription>,
|
|
395
|
+
options?: CreateIndexesOptions
|
|
396
|
+
): <A extends Document, I extends Document, R>(
|
|
397
|
+
collection: Collection<A, I, R>
|
|
398
|
+
) => Effect.Effect<Array<string>, MongoError.MongoError, R>
|
|
399
|
+
<A extends Document, I extends Document, R>(
|
|
400
|
+
collection: Collection<A, I, R>,
|
|
401
|
+
indexSpecs: Array<IndexDescription>,
|
|
402
|
+
options?: CreateIndexesOptions
|
|
403
|
+
): Effect.Effect<Array<string>, MongoError.MongoError, R>
|
|
404
|
+
} = F.dual(
|
|
405
|
+
(args) => isCollection(args[0]),
|
|
406
|
+
<A extends Document, I extends Document, R>(
|
|
407
|
+
collection: Collection<A, I, R>,
|
|
408
|
+
indexSpecs: Array<IndexDescription>,
|
|
409
|
+
options?: CreateIndexesOptions
|
|
410
|
+
): Effect.Effect<Array<string>, MongoError.MongoError, R> =>
|
|
411
|
+
F.pipe(
|
|
412
|
+
Effect.promise(() => collection.collection.createIndexes(indexSpecs, options)),
|
|
413
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<Array<string>>("createIndexes error"))
|
|
414
|
+
)
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
export const createIndex: {
|
|
418
|
+
(
|
|
419
|
+
indexSpec: IndexSpecification,
|
|
420
|
+
options?: CreateIndexesOptions
|
|
421
|
+
): <A extends Document, I extends Document, R>(
|
|
422
|
+
collection: Collection<A, I, R>
|
|
423
|
+
) => Effect.Effect<string, MongoError.MongoError, R>
|
|
424
|
+
<A extends Document, I extends Document, R>(
|
|
425
|
+
collection: Collection<A, I, R>,
|
|
426
|
+
indexSpec: IndexSpecification,
|
|
427
|
+
options?: CreateIndexesOptions
|
|
428
|
+
): Effect.Effect<string, MongoError.MongoError, R>
|
|
429
|
+
} = F.dual(
|
|
430
|
+
(args) => isCollection(args[0]),
|
|
431
|
+
<A extends Document, I extends Document, R>(
|
|
432
|
+
collection: Collection<A, I, R>,
|
|
433
|
+
indexSpec: IndexSpecification,
|
|
434
|
+
options?: CreateIndexesOptions
|
|
435
|
+
): Effect.Effect<string, MongoError.MongoError, R> =>
|
|
436
|
+
F.pipe(
|
|
437
|
+
Effect.promise(() => collection.collection.createIndex(indexSpec, options)),
|
|
438
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<string>("createIndex error"))
|
|
439
|
+
)
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
export const dropIndex: {
|
|
443
|
+
(
|
|
444
|
+
indexName: string,
|
|
445
|
+
options?: DropIndexesOptions
|
|
446
|
+
): <A extends Document, I extends Document, R>(
|
|
447
|
+
collection: Collection<A, I, R>
|
|
448
|
+
) => Effect.Effect<void, MongoError.MongoError, R>
|
|
449
|
+
<A extends Document, I extends Document, R>(
|
|
450
|
+
collection: Collection<A, I, R>,
|
|
451
|
+
indexName: string,
|
|
452
|
+
options?: DropIndexesOptions
|
|
453
|
+
): Effect.Effect<void, MongoError.MongoError, R>
|
|
454
|
+
} = F.dual(
|
|
455
|
+
(args) => isCollection(args[0]),
|
|
456
|
+
<A extends Document, I extends Document, R>(
|
|
457
|
+
collection: Collection<A, I, R>,
|
|
458
|
+
indexName: string,
|
|
459
|
+
options?: DropIndexesOptions
|
|
460
|
+
): Effect.Effect<void, MongoError.MongoError, R> =>
|
|
461
|
+
F.pipe(
|
|
462
|
+
Effect.promise(() => collection.collection.dropIndex(indexName, options)),
|
|
463
|
+
Effect.asVoid,
|
|
464
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<void>("dropIndex error"))
|
|
465
|
+
)
|
|
466
|
+
)
|
|
467
|
+
|
|
468
|
+
export const aggregate: {
|
|
469
|
+
<B extends Document, BI extends Document, BR>(
|
|
470
|
+
pipeline: Array<Document>,
|
|
471
|
+
schema: Schema.Schema<B, BI, BR>,
|
|
472
|
+
options?: AggregateOptions
|
|
473
|
+
): <A extends Document, I extends Document, R>(
|
|
474
|
+
collection: Collection<A, I, R>
|
|
475
|
+
) => AggregationCursor.AggregationCursor<B, BI, BR>
|
|
476
|
+
<A extends Document, I extends Document, R, B extends Document, BI extends Document, BR>(
|
|
477
|
+
collection: Collection<A, I, R>,
|
|
478
|
+
pipeline: Array<Document>,
|
|
479
|
+
schema: Schema.Schema<B, BI, BR>,
|
|
480
|
+
options?: AggregateOptions
|
|
481
|
+
): AggregationCursor.AggregationCursor<B, BI, BR>
|
|
482
|
+
} = F.dual(
|
|
483
|
+
(args) => isCollection(args[0]),
|
|
484
|
+
<A extends Document, I extends Document, R, B extends Document, BI extends Document, BR>(
|
|
485
|
+
collection: Collection<A, I, R>,
|
|
486
|
+
pipeline: Array<Document>,
|
|
487
|
+
schema: Schema.Schema<B, BI, BR>,
|
|
488
|
+
options?: AggregateOptions
|
|
489
|
+
): AggregationCursor.AggregationCursor<B, BI, BR> =>
|
|
490
|
+
new AggregationCursor.AggregationCursor<B, BI, BR>({
|
|
491
|
+
cursor: collection.collection.aggregate(pipeline, options),
|
|
492
|
+
schema
|
|
493
|
+
})
|
|
494
|
+
)
|
|
495
|
+
|
|
130
496
|
const isCollection = (x: unknown) => x instanceof Collection
|