effect-mongodb 0.0.2 → 0.0.3
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 +2 -2
- package/dist/cjs/AggregationCursor.js +34 -0
- package/dist/cjs/AggregationCursor.js.map +1 -0
- package/dist/cjs/Collection.js +22 -2
- 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 +15 -1
- 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 +7 -1
- 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/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/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 +41 -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 +31 -5
- package/dist/dts/DocumentCollection.d.ts.map +1 -1
- package/dist/dts/DocumentFindCursor.d.ts +1 -4
- package/dist/dts/DocumentFindCursor.d.ts.map +1 -1
- package/dist/dts/FindCursor.d.ts +15 -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/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/esm/AggregationCursor.js +22 -0
- package/dist/esm/AggregationCursor.js.map +1 -0
- package/dist/esm/Collection.js +20 -1
- 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 +13 -0
- 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 +6 -1
- 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/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/version.js +1 -1
- package/package.json +26 -3
- package/src/AggregationCursor.ts +37 -0
- package/src/Collection.ts +224 -22
- package/src/Db.ts +47 -3
- package/src/DocumentAggregationCursor.ts +30 -0
- package/src/DocumentCollection.ts +194 -2
- package/src/DocumentFindCursor.ts +1 -1
- package/src/FindCursor.ts +22 -21
- package/src/ListCollectionsCursor.ts +45 -0
- package/src/index.ts +15 -0
- package/src/internal/filter.ts +9 -0
- package/src/internal/version.ts +1 -1
package/src/Collection.ts
CHANGED
|
@@ -1,23 +1,34 @@
|
|
|
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
|
-
Filter,
|
|
15
18
|
FindOptions as MongoFindOptions,
|
|
19
|
+
IndexDescription,
|
|
16
20
|
InsertManyResult,
|
|
17
21
|
InsertOneOptions,
|
|
18
|
-
InsertOneResult
|
|
22
|
+
InsertOneResult,
|
|
23
|
+
RenameOptions,
|
|
24
|
+
ReplaceOptions,
|
|
25
|
+
UpdateFilter,
|
|
26
|
+
UpdateOptions,
|
|
27
|
+
UpdateResult
|
|
19
28
|
} from "mongodb"
|
|
29
|
+
import * as AggregationCursor from "./AggregationCursor.js"
|
|
20
30
|
import * as FindCursor from "./FindCursor.js"
|
|
31
|
+
import type { Filter } from "./internal/filter.js"
|
|
21
32
|
import * as MongoError from "./MongoError.js"
|
|
22
33
|
|
|
23
34
|
export class Collection<A extends Document, I extends Document = A, R = never> extends Data.TaggedClass("Collection")<{
|
|
@@ -31,16 +42,14 @@ export type FindOptions = Omit<MongoFindOptions, "projection">
|
|
|
31
42
|
export const find: {
|
|
32
43
|
(
|
|
33
44
|
options?: FindOptions
|
|
34
|
-
): <A extends Document, I extends Document
|
|
35
|
-
|
|
36
|
-
) => FindCursor.FindCursor<A, I, R>
|
|
37
|
-
<A extends Document, I extends Document = A, R = never>(
|
|
45
|
+
): <A extends Document, I extends Document, R>(collection: Collection<A, I, R>) => FindCursor.FindCursor<A, I, R>
|
|
46
|
+
<A extends Document, I extends Document, R>(
|
|
38
47
|
collection: Collection<A, I, R>,
|
|
39
48
|
options?: FindOptions
|
|
40
49
|
): FindCursor.FindCursor<A, I, R>
|
|
41
50
|
} = F.dual(
|
|
42
51
|
(args) => isCollection(args[0]),
|
|
43
|
-
<A extends Document, I extends Document
|
|
52
|
+
<A extends Document, I extends Document, R>(
|
|
44
53
|
collection: Collection<A, I, R>,
|
|
45
54
|
options?: FindOptions
|
|
46
55
|
): FindCursor.FindCursor<A, I, R> =>
|
|
@@ -51,26 +60,26 @@ export const find: {
|
|
|
51
60
|
)
|
|
52
61
|
|
|
53
62
|
export const findOne: {
|
|
54
|
-
<
|
|
63
|
+
<I extends Document>(
|
|
55
64
|
filter: Filter<I>,
|
|
56
65
|
options?: FindOptions
|
|
57
|
-
): (
|
|
66
|
+
): <A extends Document, R>(
|
|
58
67
|
collection: Collection<A, I, R>
|
|
59
68
|
) => Effect.Effect<O.Option<Document>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
60
|
-
<A extends Document, I extends Document
|
|
69
|
+
<A extends Document, I extends Document, R>(
|
|
61
70
|
collection: Collection<A, I, R>,
|
|
62
71
|
filter: Filter<I>,
|
|
63
72
|
options?: FindOptions
|
|
64
73
|
): Effect.Effect<O.Option<Document>, MongoError.MongoError | ParseResult.ParseError, R>
|
|
65
74
|
} = F.dual(
|
|
66
75
|
(args) => isCollection(args[0]),
|
|
67
|
-
<A extends Document, I extends Document
|
|
76
|
+
<A extends Document, I extends Document, R>(
|
|
68
77
|
collection: Collection<A, I, R>,
|
|
69
78
|
filter: Filter<I>,
|
|
70
79
|
options?: FindOptions
|
|
71
80
|
): Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R> =>
|
|
72
81
|
Effect.gen(function*(_) {
|
|
73
|
-
const value = yield* _(Effect.promise(() => collection.collection.findOne(filter
|
|
82
|
+
const value = yield* _(Effect.promise(() => collection.collection.findOne(filter, options)))
|
|
74
83
|
if (value !== null) return O.some(yield* _(Schema.decodeUnknown(collection.schema)(value)))
|
|
75
84
|
return O.none()
|
|
76
85
|
}).pipe(
|
|
@@ -79,18 +88,18 @@ export const findOne: {
|
|
|
79
88
|
)
|
|
80
89
|
|
|
81
90
|
export const insertOne: {
|
|
82
|
-
<A extends Document
|
|
91
|
+
<A extends Document>(
|
|
83
92
|
doc: A,
|
|
84
93
|
options?: InsertOneOptions
|
|
85
|
-
): (
|
|
94
|
+
): <I extends Document, R>(
|
|
86
95
|
collection: Collection<A, I, R>
|
|
87
96
|
) => Effect.Effect<InsertOneResult, MongoError.MongoError | ParseResult.ParseError, R>
|
|
88
|
-
<A extends Document, I extends Document
|
|
97
|
+
<A extends Document, I extends Document, R>(
|
|
89
98
|
collection: Collection<A, I, R>,
|
|
90
99
|
doc: A,
|
|
91
100
|
options?: InsertOneOptions
|
|
92
101
|
): Effect.Effect<InsertOneResult, MongoError.MongoError | ParseResult.ParseError, R>
|
|
93
|
-
} = F.dual((args) => isCollection(args[0]), <A extends Document, I extends Document
|
|
102
|
+
} = F.dual((args) => isCollection(args[0]), <A extends Document, I extends Document, R>(
|
|
94
103
|
collection: Collection<A, I, R>,
|
|
95
104
|
doc: A,
|
|
96
105
|
options?: InsertOneOptions
|
|
@@ -102,18 +111,18 @@ export const insertOne: {
|
|
|
102
111
|
))
|
|
103
112
|
|
|
104
113
|
export const insertMany: {
|
|
105
|
-
<A extends Document
|
|
114
|
+
<A extends Document>(
|
|
106
115
|
docs: Array<A>,
|
|
107
116
|
options?: BulkWriteOptions
|
|
108
|
-
): (
|
|
117
|
+
): <I extends Document, R>(
|
|
109
118
|
collection: Collection<A, I, R>
|
|
110
119
|
) => Effect.Effect<InsertManyResult, MongoError.MongoError | ParseResult.ParseError, R>
|
|
111
|
-
<A extends Document, I extends Document
|
|
120
|
+
<A extends Document, I extends Document, R>(
|
|
112
121
|
collection: Collection<A, I, R>,
|
|
113
122
|
docs: Array<A>,
|
|
114
123
|
options?: BulkWriteOptions
|
|
115
124
|
): Effect.Effect<InsertManyResult, MongoError.MongoError | ParseResult.ParseError, R>
|
|
116
|
-
} = F.dual((args) => isCollection(args[0]), <A extends Document, I extends Document
|
|
125
|
+
} = F.dual((args) => isCollection(args[0]), <A extends Document, I extends Document, R>(
|
|
117
126
|
collection: Collection<A, I, R>,
|
|
118
127
|
docs: Array<A>,
|
|
119
128
|
options?: BulkWriteOptions
|
|
@@ -127,4 +136,197 @@ export const insertMany: {
|
|
|
127
136
|
)
|
|
128
137
|
})
|
|
129
138
|
|
|
139
|
+
export const deleteOne: {
|
|
140
|
+
<I extends Document>(
|
|
141
|
+
filter: Filter<I>,
|
|
142
|
+
options?: DeleteOptions
|
|
143
|
+
): <A extends Document, R>(
|
|
144
|
+
collection: Collection<A, I, R>
|
|
145
|
+
) => Effect.Effect<DeleteResult, MongoError.MongoError, R>
|
|
146
|
+
<A extends Document, I extends Document, R>(
|
|
147
|
+
collection: Collection<A, I, R>,
|
|
148
|
+
filter: Filter<I>,
|
|
149
|
+
options?: DeleteOptions
|
|
150
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError, R>
|
|
151
|
+
} = F.dual(
|
|
152
|
+
(args) => isCollection(args[0]),
|
|
153
|
+
<A extends Document, I extends Document, R>(
|
|
154
|
+
collection: Collection<A, I, R>,
|
|
155
|
+
filter: Filter<I>,
|
|
156
|
+
options?: DeleteOptions
|
|
157
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError, R> =>
|
|
158
|
+
Effect.promise(() => collection.collection.deleteOne(filter, options)).pipe(
|
|
159
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<DeleteResult>("deleteOne error"))
|
|
160
|
+
)
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
export const deleteMany: {
|
|
164
|
+
<I extends Document>(
|
|
165
|
+
filter: Filter<I>,
|
|
166
|
+
options?: DeleteOptions
|
|
167
|
+
): <A extends Document, R>(
|
|
168
|
+
collection: Collection<A, I, R>
|
|
169
|
+
) => Effect.Effect<DeleteResult, MongoError.MongoError, R>
|
|
170
|
+
<A extends Document, I extends Document, R>(
|
|
171
|
+
collection: Collection<A, I, R>,
|
|
172
|
+
filter: Filter<I>,
|
|
173
|
+
options?: DeleteOptions
|
|
174
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError, R>
|
|
175
|
+
} = F.dual(
|
|
176
|
+
(args) => isCollection(args[0]),
|
|
177
|
+
<A extends Document, I extends Document, R>(
|
|
178
|
+
collection: Collection<A, I, R>,
|
|
179
|
+
filter: Filter<I>,
|
|
180
|
+
options?: DeleteOptions
|
|
181
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError, R> =>
|
|
182
|
+
Effect.promise(() => collection.collection.deleteMany(filter, options)).pipe(
|
|
183
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<DeleteResult>("deleteMany error"))
|
|
184
|
+
)
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
export const updateMany: {
|
|
188
|
+
<I extends Document>(
|
|
189
|
+
filter: Filter<I>,
|
|
190
|
+
update: UpdateFilter<I> | Array<Document>,
|
|
191
|
+
options?: UpdateOptions
|
|
192
|
+
): <A extends Document, R>(
|
|
193
|
+
collection: Collection<A, I, R>
|
|
194
|
+
) => Effect.Effect<UpdateResult, MongoError.MongoError, R>
|
|
195
|
+
<A extends Document, I extends Document, R>(
|
|
196
|
+
collection: Collection<A, I, R>,
|
|
197
|
+
filter: Filter<I>,
|
|
198
|
+
update: UpdateFilter<I> | Array<Document>,
|
|
199
|
+
options?: UpdateOptions
|
|
200
|
+
): Effect.Effect<UpdateResult, MongoError.MongoError, R>
|
|
201
|
+
} = F.dual(
|
|
202
|
+
(args) => isCollection(args[0]),
|
|
203
|
+
<A extends Document, I extends Document, R>(
|
|
204
|
+
collection: Collection<A, I, R>,
|
|
205
|
+
filter: Filter<I>,
|
|
206
|
+
update: UpdateFilter<I> | Array<Document>,
|
|
207
|
+
options?: UpdateOptions
|
|
208
|
+
): Effect.Effect<UpdateResult, MongoError.MongoError, R> =>
|
|
209
|
+
Effect.promise(() =>
|
|
210
|
+
collection.collection.updateMany(filter, update as UpdateFilter<Document> | Array<Document>, options)
|
|
211
|
+
).pipe(
|
|
212
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<UpdateResult>("updateMany error"))
|
|
213
|
+
)
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
export const replaceOne: {
|
|
217
|
+
<A extends Document, I extends Document>(
|
|
218
|
+
filter: Filter<I>,
|
|
219
|
+
// TODO: should we put WithoutId<A> here like the driver signature?
|
|
220
|
+
replacement: A,
|
|
221
|
+
options?: ReplaceOptions
|
|
222
|
+
): <R>(
|
|
223
|
+
collection: Collection<A, I, R>
|
|
224
|
+
) => Effect.Effect<UpdateResult | Document, MongoError.MongoError | ParseResult.ParseError, R>
|
|
225
|
+
<A extends Document, I extends Document, R>(
|
|
226
|
+
collection: Collection<A, I, R>,
|
|
227
|
+
filter: Filter<I>,
|
|
228
|
+
replacement: A,
|
|
229
|
+
options?: ReplaceOptions
|
|
230
|
+
): Effect.Effect<UpdateResult | Document, MongoError.MongoError | ParseResult.ParseError, R>
|
|
231
|
+
} = F.dual(
|
|
232
|
+
(args) => isCollection(args[0]),
|
|
233
|
+
<A extends Document, I extends Document, R>(
|
|
234
|
+
collection: Collection<A, I, R>,
|
|
235
|
+
filter: Filter<I>,
|
|
236
|
+
replacement: A,
|
|
237
|
+
options?: ReplaceOptions
|
|
238
|
+
): Effect.Effect<
|
|
239
|
+
UpdateResult | Document,
|
|
240
|
+
MongoError.MongoError | ParseResult.ParseError,
|
|
241
|
+
R
|
|
242
|
+
> =>
|
|
243
|
+
F.pipe(
|
|
244
|
+
// TODO: extract function in Collection
|
|
245
|
+
Schema.encode(collection.schema)(replacement),
|
|
246
|
+
Effect.flatMap((replacement) =>
|
|
247
|
+
Effect.promise(() => collection.collection.replaceOne(filter, replacement, options))
|
|
248
|
+
),
|
|
249
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<UpdateResult | Document>("replaceOne error"))
|
|
250
|
+
)
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
export const rename: {
|
|
254
|
+
(
|
|
255
|
+
newName: string,
|
|
256
|
+
options?: RenameOptions
|
|
257
|
+
): <A extends Document, I extends Document, R>(
|
|
258
|
+
collection: Collection<A, I, R>
|
|
259
|
+
) => Effect.Effect<Collection<A, I, R>, MongoError.MongoError, R>
|
|
260
|
+
<A extends Document, I extends Document, R>(
|
|
261
|
+
collection: Collection<A, I, R>,
|
|
262
|
+
newName: string,
|
|
263
|
+
options?: RenameOptions
|
|
264
|
+
): Effect.Effect<Collection<A, I, R>, MongoError.MongoError, R>
|
|
265
|
+
} = F.dual(
|
|
266
|
+
(args) => isCollection(args[0]),
|
|
267
|
+
<A extends Document, I extends Document, R>(
|
|
268
|
+
collection: Collection<A, I, R>,
|
|
269
|
+
newName: string,
|
|
270
|
+
options?: RenameOptions
|
|
271
|
+
): Effect.Effect<Collection<A, I, R>, MongoError.MongoError, R> =>
|
|
272
|
+
F.pipe(
|
|
273
|
+
Effect.promise(() => collection.collection.rename(newName, options)),
|
|
274
|
+
Effect.map((newCollection) => new Collection<A, I, R>({ collection: newCollection, schema: collection.schema })),
|
|
275
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<Collection<A, I, R>>("rename error"))
|
|
276
|
+
)
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
export const createIndexes: {
|
|
280
|
+
(
|
|
281
|
+
indexSpecs: Array<IndexDescription>,
|
|
282
|
+
options?: CreateIndexesOptions
|
|
283
|
+
): <A extends Document, I extends Document, R>(
|
|
284
|
+
collection: Collection<A, I, R>
|
|
285
|
+
) => Effect.Effect<Array<string>, MongoError.MongoError, R>
|
|
286
|
+
<A extends Document, I extends Document, R>(
|
|
287
|
+
collection: Collection<A, I, R>,
|
|
288
|
+
indexSpecs: Array<IndexDescription>,
|
|
289
|
+
options?: CreateIndexesOptions
|
|
290
|
+
): Effect.Effect<Array<string>, MongoError.MongoError, R>
|
|
291
|
+
} = F.dual(
|
|
292
|
+
(args) => isCollection(args[0]),
|
|
293
|
+
<A extends Document, I extends Document, R>(
|
|
294
|
+
collection: Collection<A, I, R>,
|
|
295
|
+
indexSpecs: Array<IndexDescription>,
|
|
296
|
+
options?: CreateIndexesOptions
|
|
297
|
+
): Effect.Effect<Array<string>, MongoError.MongoError, R> =>
|
|
298
|
+
F.pipe(
|
|
299
|
+
Effect.promise(() => collection.collection.createIndexes(indexSpecs, options)),
|
|
300
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<Array<string>>("createIndexes error"))
|
|
301
|
+
)
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
export const aggregate: {
|
|
305
|
+
<B extends Document, BI extends Document, BR>(
|
|
306
|
+
pipeline: Array<Document>,
|
|
307
|
+
schema: Schema.Schema<B, BI, BR>,
|
|
308
|
+
options?: AggregateOptions
|
|
309
|
+
): <A extends Document, I extends Document, R>(
|
|
310
|
+
collection: Collection<A, I, R>
|
|
311
|
+
) => AggregationCursor.AggregationCursor<B, BI, BR>
|
|
312
|
+
<A extends Document, I extends Document, R, B extends Document, BI extends Document, BR>(
|
|
313
|
+
collection: Collection<A, I, R>,
|
|
314
|
+
pipeline: Array<Document>,
|
|
315
|
+
schema: Schema.Schema<B, BI, BR>,
|
|
316
|
+
options?: AggregateOptions
|
|
317
|
+
): AggregationCursor.AggregationCursor<B, BI, BR>
|
|
318
|
+
} = F.dual(
|
|
319
|
+
(args) => isCollection(args[0]),
|
|
320
|
+
<A extends Document, I extends Document, R, B extends Document, BI extends Document, BR>(
|
|
321
|
+
collection: Collection<A, I, R>,
|
|
322
|
+
pipeline: Array<Document>,
|
|
323
|
+
schema: Schema.Schema<B, BI, BR>,
|
|
324
|
+
options?: AggregateOptions
|
|
325
|
+
): AggregationCursor.AggregationCursor<B, BI, BR> =>
|
|
326
|
+
new AggregationCursor.AggregationCursor<B, BI, BR>({
|
|
327
|
+
cursor: collection.collection.aggregate(pipeline, options),
|
|
328
|
+
schema
|
|
329
|
+
})
|
|
330
|
+
)
|
|
331
|
+
|
|
130
332
|
const isCollection = (x: unknown) => x instanceof Collection
|
package/src/Db.ts
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 0.0.1
|
|
3
3
|
*/
|
|
4
|
-
import type * as Schema from "@effect/schema/Schema"
|
|
5
4
|
import type * as Brand from "effect/Brand"
|
|
6
5
|
import * as Context from "effect/Context"
|
|
7
6
|
import * as Effect from "effect/Effect"
|
|
8
7
|
import * as F from "effect/Function"
|
|
9
8
|
import * as Layer from "effect/Layer"
|
|
10
|
-
import type
|
|
9
|
+
import type * as Schema from "effect/Schema"
|
|
10
|
+
import type { Document, DropCollectionOptions, ListCollectionsOptions } from "mongodb"
|
|
11
11
|
import { Db } from "mongodb"
|
|
12
12
|
import type * as Collection from "./Collection.js"
|
|
13
13
|
import * as DocumentCollection from "./DocumentCollection.js"
|
|
14
|
+
import * as ListCollectionsCursor from "./ListCollectionsCursor.js"
|
|
14
15
|
import * as MongoClient from "./MongoClient.js"
|
|
15
|
-
import
|
|
16
|
+
import * as MongoError from "./MongoError.js"
|
|
16
17
|
|
|
17
18
|
export const documentCollection: {
|
|
18
19
|
(name: string): (db: Db) => DocumentCollection.DocumentCollection
|
|
@@ -44,6 +45,49 @@ export const collection: {
|
|
|
44
45
|
): Collection.Collection<A, I, R> => DocumentCollection.typed(documentCollection(db, name), schema)
|
|
45
46
|
)
|
|
46
47
|
|
|
48
|
+
export const listCollections: {
|
|
49
|
+
(): (db: Db) => ListCollectionsCursor.ListCollectionsCursor
|
|
50
|
+
(filter: Document): (db: Db) => ListCollectionsCursor.ListCollectionsCursor
|
|
51
|
+
(
|
|
52
|
+
filter: Document,
|
|
53
|
+
options: Exclude<ListCollectionsOptions, "nameOnly"> & { nameOnly: true }
|
|
54
|
+
): (db: Db) => ListCollectionsCursor.NameOnlyListCollectionsCursor
|
|
55
|
+
(
|
|
56
|
+
filter: Document,
|
|
57
|
+
options: Exclude<ListCollectionsOptions, "nameOnly"> & { nameOnly: false }
|
|
58
|
+
): (db: Db) => ListCollectionsCursor.FullListCollectionsCursor
|
|
59
|
+
(db: Db): ListCollectionsCursor.ListCollectionsCursor
|
|
60
|
+
(db: Db, filter: Document): ListCollectionsCursor.ListCollectionsCursor
|
|
61
|
+
(
|
|
62
|
+
db: Db,
|
|
63
|
+
filter: Document,
|
|
64
|
+
options: Exclude<ListCollectionsOptions, "nameOnly"> & { nameOnly: true }
|
|
65
|
+
): ListCollectionsCursor.NameOnlyListCollectionsCursor
|
|
66
|
+
(
|
|
67
|
+
db: Db,
|
|
68
|
+
filter: Document,
|
|
69
|
+
options: Exclude<ListCollectionsOptions, "nameOnly"> & { nameOnly: false }
|
|
70
|
+
): ListCollectionsCursor.FullListCollectionsCursor
|
|
71
|
+
} = F.dual(
|
|
72
|
+
(args) => isDb(args[0]),
|
|
73
|
+
(db: Db, filter?: Document, options?: ListCollectionsOptions): ListCollectionsCursor.ListCollectionsCursor =>
|
|
74
|
+
new ListCollectionsCursor.ListCollectionsCursor({ cursor: db.listCollections(filter, options) })
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
export const dropCollection: {
|
|
78
|
+
(name: string): (db: Db) => Effect.Effect<boolean>
|
|
79
|
+
(name: string, options: DropCollectionOptions): (db: Db) => Effect.Effect<boolean, MongoError.MongoError>
|
|
80
|
+
(db: Db, name: string): Effect.Effect<boolean, MongoError.MongoError>
|
|
81
|
+
(db: Db, name: string, options: DropCollectionOptions): Effect.Effect<boolean, MongoError.MongoError>
|
|
82
|
+
} = F.dual(
|
|
83
|
+
(args) => isDb(args[0]),
|
|
84
|
+
(db: Db, name: string, options?: DropCollectionOptions): Effect.Effect<boolean, MongoError.MongoError> =>
|
|
85
|
+
F.pipe(
|
|
86
|
+
Effect.promise(() => db.dropCollection(name, options)),
|
|
87
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<boolean>("dropCollection error"))
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
|
|
47
91
|
const isDb = (x: unknown) => x instanceof Db
|
|
48
92
|
|
|
49
93
|
export type DbService<K extends string> = {
|
|
@@ -0,0 +1,30 @@
|
|
|
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 * as Stream from "effect/Stream"
|
|
8
|
+
import type { AggregationCursor as MongoAggregationCursor } from "mongodb"
|
|
9
|
+
import * as MongoError from "./MongoError.js"
|
|
10
|
+
|
|
11
|
+
export class DocumentAggregationCursor
|
|
12
|
+
extends Data.TaggedClass("DocumentAggregationCursor")<{ cursor: MongoAggregationCursor<Document> }>
|
|
13
|
+
{
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const toArray = (
|
|
17
|
+
cursor: DocumentAggregationCursor
|
|
18
|
+
): Effect.Effect<ReadonlyArray<Document>, MongoError.MongoError> =>
|
|
19
|
+
F.pipe(
|
|
20
|
+
Effect.tryPromise({ try: () => cursor.cursor.toArray(), catch: F.identity }),
|
|
21
|
+
Effect.catchAll(MongoError.mongoErrorDie<ReadonlyArray<Document>>(`${cursor._tag}.toArray error`))
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
export const toStream = (
|
|
25
|
+
cursor: DocumentAggregationCursor
|
|
26
|
+
): Stream.Stream<Document, MongoError.MongoError> =>
|
|
27
|
+
F.pipe(
|
|
28
|
+
Stream.fromAsyncIterable(cursor.cursor, F.identity),
|
|
29
|
+
Stream.catchAll(MongoError.mongoErrorStream<Document>(`${cursor._tag}.toStream error`))
|
|
30
|
+
)
|
|
@@ -1,23 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 0.0.1
|
|
3
3
|
*/
|
|
4
|
-
import type * as Schema from "@effect/schema/Schema"
|
|
5
4
|
import * as Data from "effect/Data"
|
|
6
5
|
import * as Effect from "effect/Effect"
|
|
7
6
|
import * as F from "effect/Function"
|
|
8
7
|
import * as O from "effect/Option"
|
|
8
|
+
import type * as Schema from "effect/Schema"
|
|
9
9
|
import type {
|
|
10
|
+
AggregateOptions,
|
|
10
11
|
BulkWriteOptions,
|
|
11
12
|
Collection as MongoCollection,
|
|
13
|
+
CreateIndexesOptions,
|
|
14
|
+
DeleteOptions,
|
|
15
|
+
DeleteResult,
|
|
12
16
|
Document,
|
|
13
17
|
Filter,
|
|
14
18
|
FindOptions,
|
|
19
|
+
IndexDescription,
|
|
15
20
|
InsertManyResult,
|
|
16
21
|
InsertOneOptions,
|
|
17
22
|
InsertOneResult,
|
|
18
|
-
OptionalUnlessRequiredId
|
|
23
|
+
OptionalUnlessRequiredId,
|
|
24
|
+
RenameOptions,
|
|
25
|
+
ReplaceOptions,
|
|
26
|
+
UpdateFilter,
|
|
27
|
+
UpdateOptions,
|
|
28
|
+
UpdateResult,
|
|
29
|
+
WithoutId
|
|
19
30
|
} from "mongodb"
|
|
20
31
|
import * as Collection from "./Collection.js"
|
|
32
|
+
import * as DocumentAggregationCursor from "./DocumentAggregationCursor.js"
|
|
21
33
|
import * as DocumentFindCursor from "./DocumentFindCursor.js"
|
|
22
34
|
import * as MongoError from "./MongoError.js"
|
|
23
35
|
|
|
@@ -112,6 +124,186 @@ export const insertMany: {
|
|
|
112
124
|
Effect.catchAllDefect(MongoError.mongoErrorDie<InsertManyResult>("insertMany error"))
|
|
113
125
|
))
|
|
114
126
|
|
|
127
|
+
export const deleteOne: {
|
|
128
|
+
(
|
|
129
|
+
filter: Filter<Document>,
|
|
130
|
+
options?: DeleteOptions
|
|
131
|
+
): (
|
|
132
|
+
collection: DocumentCollection
|
|
133
|
+
) => Effect.Effect<DeleteResult, MongoError.MongoError>
|
|
134
|
+
(
|
|
135
|
+
collection: DocumentCollection,
|
|
136
|
+
filter: Filter<Document>,
|
|
137
|
+
options?: DeleteOptions
|
|
138
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError>
|
|
139
|
+
} = F.dual(
|
|
140
|
+
(args) => isDocumentCollection(args[0]),
|
|
141
|
+
(
|
|
142
|
+
collection: DocumentCollection,
|
|
143
|
+
filter: Filter<Document>,
|
|
144
|
+
options?: DeleteOptions
|
|
145
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError> =>
|
|
146
|
+
F.pipe(
|
|
147
|
+
Effect.promise(() => collection.collection.deleteOne(filter, options)),
|
|
148
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<DeleteResult>("deleteOne error"))
|
|
149
|
+
)
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
export const deleteMany: {
|
|
153
|
+
(
|
|
154
|
+
filter: Filter<Document>,
|
|
155
|
+
options?: DeleteOptions
|
|
156
|
+
): (
|
|
157
|
+
collection: DocumentCollection
|
|
158
|
+
) => Effect.Effect<DeleteResult, MongoError.MongoError>
|
|
159
|
+
(
|
|
160
|
+
collection: DocumentCollection,
|
|
161
|
+
filter: Filter<Document>,
|
|
162
|
+
options?: DeleteOptions
|
|
163
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError>
|
|
164
|
+
} = F.dual(
|
|
165
|
+
(args) => isDocumentCollection(args[0]),
|
|
166
|
+
(
|
|
167
|
+
collection: DocumentCollection,
|
|
168
|
+
filter: Filter<Document>,
|
|
169
|
+
options?: DeleteOptions
|
|
170
|
+
): Effect.Effect<DeleteResult, MongoError.MongoError> =>
|
|
171
|
+
F.pipe(
|
|
172
|
+
Effect.promise(() => collection.collection.deleteMany(filter, options)),
|
|
173
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<DeleteResult>("deleteMany error"))
|
|
174
|
+
)
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
export const updateMany: {
|
|
178
|
+
(
|
|
179
|
+
filter: Filter<Document>,
|
|
180
|
+
update: UpdateFilter<Document> | Array<Document>,
|
|
181
|
+
options?: UpdateOptions
|
|
182
|
+
): (
|
|
183
|
+
collection: DocumentCollection
|
|
184
|
+
) => Effect.Effect<UpdateResult, MongoError.MongoError>
|
|
185
|
+
(
|
|
186
|
+
collection: DocumentCollection,
|
|
187
|
+
filter: Filter<Document>,
|
|
188
|
+
update: UpdateFilter<Document> | Array<Document>,
|
|
189
|
+
options?: UpdateOptions
|
|
190
|
+
): Effect.Effect<UpdateResult, MongoError.MongoError>
|
|
191
|
+
} = F.dual(
|
|
192
|
+
(args) => isDocumentCollection(args[0]),
|
|
193
|
+
(
|
|
194
|
+
collection: DocumentCollection,
|
|
195
|
+
filter: Filter<Document>,
|
|
196
|
+
update: UpdateFilter<Document> | Array<Document>,
|
|
197
|
+
options?: UpdateOptions
|
|
198
|
+
): Effect.Effect<UpdateResult, MongoError.MongoError> =>
|
|
199
|
+
F.pipe(
|
|
200
|
+
Effect.promise(() => collection.collection.updateMany(filter, update, options)),
|
|
201
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<UpdateResult>("updateMany error"))
|
|
202
|
+
)
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
export const replaceOne: {
|
|
206
|
+
(
|
|
207
|
+
filter: Filter<Document>,
|
|
208
|
+
replacement: WithoutId<Document>,
|
|
209
|
+
options?: ReplaceOptions
|
|
210
|
+
): (
|
|
211
|
+
collection: DocumentCollection
|
|
212
|
+
) => Effect.Effect<UpdateResult | Document, MongoError.MongoError>
|
|
213
|
+
(
|
|
214
|
+
collection: DocumentCollection,
|
|
215
|
+
filter: Filter<Document>,
|
|
216
|
+
replacement: WithoutId<Document>,
|
|
217
|
+
options?: ReplaceOptions
|
|
218
|
+
): Effect.Effect<UpdateResult | Document, MongoError.MongoError>
|
|
219
|
+
} = F.dual(
|
|
220
|
+
(args) => isDocumentCollection(args[0]),
|
|
221
|
+
(
|
|
222
|
+
collection: DocumentCollection,
|
|
223
|
+
filter: Filter<Document>,
|
|
224
|
+
replacement: WithoutId<Document>,
|
|
225
|
+
options?: ReplaceOptions
|
|
226
|
+
): Effect.Effect<UpdateResult | Document, MongoError.MongoError> =>
|
|
227
|
+
F.pipe(
|
|
228
|
+
Effect.promise(() => collection.collection.replaceOne(filter, replacement, options)),
|
|
229
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<UpdateResult | Document>("replaceOne error"))
|
|
230
|
+
)
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
export const rename: {
|
|
234
|
+
(
|
|
235
|
+
newName: string,
|
|
236
|
+
options?: RenameOptions
|
|
237
|
+
): (
|
|
238
|
+
collection: DocumentCollection
|
|
239
|
+
) => Effect.Effect<MongoCollection, MongoError.MongoError>
|
|
240
|
+
(
|
|
241
|
+
collection: DocumentCollection,
|
|
242
|
+
newName: string,
|
|
243
|
+
options?: RenameOptions
|
|
244
|
+
): Effect.Effect<MongoCollection, MongoError.MongoError>
|
|
245
|
+
} = F.dual(
|
|
246
|
+
(args) => isDocumentCollection(args[0]),
|
|
247
|
+
(
|
|
248
|
+
collection: DocumentCollection,
|
|
249
|
+
newName: string,
|
|
250
|
+
options?: RenameOptions
|
|
251
|
+
): Effect.Effect<MongoCollection, MongoError.MongoError> =>
|
|
252
|
+
F.pipe(
|
|
253
|
+
Effect.promise(() => collection.collection.rename(newName, options)),
|
|
254
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<MongoCollection>("rename error"))
|
|
255
|
+
)
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
export const createIndexes: {
|
|
259
|
+
(
|
|
260
|
+
indexSpecs: Array<IndexDescription>,
|
|
261
|
+
options?: CreateIndexesOptions
|
|
262
|
+
): (
|
|
263
|
+
collection: DocumentCollection
|
|
264
|
+
) => Effect.Effect<Array<string>, MongoError.MongoError>
|
|
265
|
+
(
|
|
266
|
+
collection: DocumentCollection,
|
|
267
|
+
indexSpecs: Array<IndexDescription>,
|
|
268
|
+
options?: CreateIndexesOptions
|
|
269
|
+
): Effect.Effect<Array<string>, MongoError.MongoError>
|
|
270
|
+
} = F.dual(
|
|
271
|
+
(args) => isDocumentCollection(args[0]),
|
|
272
|
+
(
|
|
273
|
+
collection: DocumentCollection,
|
|
274
|
+
indexSpecs: Array<IndexDescription>,
|
|
275
|
+
options?: CreateIndexesOptions
|
|
276
|
+
): Effect.Effect<Array<string>, MongoError.MongoError> =>
|
|
277
|
+
F.pipe(
|
|
278
|
+
Effect.promise(() => collection.collection.createIndexes(indexSpecs, options)),
|
|
279
|
+
Effect.catchAllDefect(MongoError.mongoErrorDie<Array<string>>("createIndexes error"))
|
|
280
|
+
)
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
export const aggregate: {
|
|
284
|
+
(
|
|
285
|
+
pipeline?: Array<Document>,
|
|
286
|
+
options?: AggregateOptions
|
|
287
|
+
): (
|
|
288
|
+
collection: DocumentCollection
|
|
289
|
+
) => DocumentAggregationCursor.DocumentAggregationCursor
|
|
290
|
+
(
|
|
291
|
+
collection: DocumentCollection,
|
|
292
|
+
pipeline?: Array<Document>,
|
|
293
|
+
options?: AggregateOptions
|
|
294
|
+
): DocumentAggregationCursor.DocumentAggregationCursor
|
|
295
|
+
} = F.dual(
|
|
296
|
+
(args) => isDocumentCollection(args[0]),
|
|
297
|
+
(
|
|
298
|
+
collection: DocumentCollection,
|
|
299
|
+
pipeline?: Array<Document>,
|
|
300
|
+
options?: AggregateOptions
|
|
301
|
+
): DocumentAggregationCursor.DocumentAggregationCursor =>
|
|
302
|
+
new DocumentAggregationCursor.DocumentAggregationCursor({
|
|
303
|
+
cursor: collection.collection.aggregate(pipeline, options)
|
|
304
|
+
})
|
|
305
|
+
)
|
|
306
|
+
|
|
115
307
|
export const typed: {
|
|
116
308
|
<A extends Document, I extends Document = A, R = never>(
|
|
117
309
|
schema: Schema.Schema<A, I, R>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 0.0.1
|
|
3
3
|
*/
|
|
4
|
-
import type * as Schema from "@effect/schema/Schema"
|
|
5
4
|
import * as Data from "effect/Data"
|
|
6
5
|
import * as Effect from "effect/Effect"
|
|
7
6
|
import * as F from "effect/Function"
|
|
7
|
+
import type * as Schema from "effect/Schema"
|
|
8
8
|
import * as Stream from "effect/Stream"
|
|
9
9
|
import type { Document, FindCursor as MongoFindCursor, Sort, SortDirection } from "mongodb"
|
|
10
10
|
import * as FindCursor from "./FindCursor.js"
|