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.
Files changed (77) hide show
  1. package/AggregationCursor/package.json +6 -0
  2. package/DocumentAggregationCursor/package.json +6 -0
  3. package/ListCollectionsCursor/package.json +6 -0
  4. package/README.md +2 -2
  5. package/dist/cjs/AggregationCursor.js +34 -0
  6. package/dist/cjs/AggregationCursor.js.map +1 -0
  7. package/dist/cjs/Collection.js +22 -2
  8. package/dist/cjs/Collection.js.map +1 -1
  9. package/dist/cjs/Db.js +7 -1
  10. package/dist/cjs/Db.js.map +1 -1
  11. package/dist/cjs/DocumentAggregationCursor.js +27 -0
  12. package/dist/cjs/DocumentAggregationCursor.js.map +1 -0
  13. package/dist/cjs/DocumentCollection.js +15 -1
  14. package/dist/cjs/DocumentCollection.js.map +1 -1
  15. package/dist/cjs/DocumentFindCursor.js +4 -0
  16. package/dist/cjs/DocumentFindCursor.js.map +1 -1
  17. package/dist/cjs/FindCursor.js +7 -1
  18. package/dist/cjs/FindCursor.js.map +1 -1
  19. package/dist/cjs/ListCollectionsCursor.js +27 -0
  20. package/dist/cjs/ListCollectionsCursor.js.map +1 -0
  21. package/dist/cjs/index.js +7 -1
  22. package/dist/cjs/internal/filter.js +6 -0
  23. package/dist/cjs/internal/filter.js.map +1 -0
  24. package/dist/cjs/internal/version.js +1 -1
  25. package/dist/dts/AggregationCursor.d.ts +18 -0
  26. package/dist/dts/AggregationCursor.d.ts.map +1 -0
  27. package/dist/dts/Collection.d.ts +41 -14
  28. package/dist/dts/Collection.d.ts.map +1 -1
  29. package/dist/dts/Db.d.ts +28 -3
  30. package/dist/dts/Db.d.ts.map +1 -1
  31. package/dist/dts/DocumentAggregationCursor.d.ts +15 -0
  32. package/dist/dts/DocumentAggregationCursor.d.ts.map +1 -0
  33. package/dist/dts/DocumentCollection.d.ts +31 -5
  34. package/dist/dts/DocumentCollection.d.ts.map +1 -1
  35. package/dist/dts/DocumentFindCursor.d.ts +1 -4
  36. package/dist/dts/DocumentFindCursor.d.ts.map +1 -1
  37. package/dist/dts/FindCursor.d.ts +15 -18
  38. package/dist/dts/FindCursor.d.ts.map +1 -1
  39. package/dist/dts/ListCollectionsCursor.d.ts +20 -0
  40. package/dist/dts/ListCollectionsCursor.d.ts.map +1 -0
  41. package/dist/dts/index.d.ts +12 -0
  42. package/dist/dts/index.d.ts.map +1 -1
  43. package/dist/dts/internal/filter.d.ts +8 -0
  44. package/dist/dts/internal/filter.d.ts.map +1 -0
  45. package/dist/esm/AggregationCursor.js +22 -0
  46. package/dist/esm/AggregationCursor.js.map +1 -0
  47. package/dist/esm/Collection.js +20 -1
  48. package/dist/esm/Collection.js.map +1 -1
  49. package/dist/esm/Db.js +6 -0
  50. package/dist/esm/Db.js.map +1 -1
  51. package/dist/esm/DocumentAggregationCursor.js +15 -0
  52. package/dist/esm/DocumentAggregationCursor.js.map +1 -0
  53. package/dist/esm/DocumentCollection.js +13 -0
  54. package/dist/esm/DocumentCollection.js.map +1 -1
  55. package/dist/esm/DocumentFindCursor.js +3 -0
  56. package/dist/esm/DocumentFindCursor.js.map +1 -1
  57. package/dist/esm/FindCursor.js +6 -1
  58. package/dist/esm/FindCursor.js.map +1 -1
  59. package/dist/esm/ListCollectionsCursor.js +15 -0
  60. package/dist/esm/ListCollectionsCursor.js.map +1 -0
  61. package/dist/esm/index.js +12 -0
  62. package/dist/esm/index.js.map +1 -1
  63. package/dist/esm/internal/filter.js +2 -0
  64. package/dist/esm/internal/filter.js.map +1 -0
  65. package/dist/esm/internal/version.js +1 -1
  66. package/package.json +26 -3
  67. package/src/AggregationCursor.ts +37 -0
  68. package/src/Collection.ts +224 -22
  69. package/src/Db.ts +47 -3
  70. package/src/DocumentAggregationCursor.ts +30 -0
  71. package/src/DocumentCollection.ts +194 -2
  72. package/src/DocumentFindCursor.ts +1 -1
  73. package/src/FindCursor.ts +22 -21
  74. package/src/ListCollectionsCursor.ts +45 -0
  75. package/src/index.ts +15 -0
  76. package/src/internal/filter.ts +9 -0
  77. 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 = A, R = never>(
35
- collection: Collection<A, I, R>
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 = A, R = never>(
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
- <A extends Document, I extends Document = A, R = never>(
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 = A, R = never>(
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 = A, R = never>(
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 as Filter<Document>, options)))
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, I extends Document = A, R = never>(
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 = A, R = never>(
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 = A, R = never>(
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, I extends Document = A, R = never>(
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 = A, R = never>(
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 = A, R = never>(
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 { Document } from "mongodb"
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 type * as MongoError from "./MongoError.js"
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"