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.
Files changed (96) 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 +8 -3
  5. package/dist/cjs/AggregationCursor.js +34 -0
  6. package/dist/cjs/AggregationCursor.js.map +1 -0
  7. package/dist/cjs/Collection.js +41 -4
  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 +30 -3
  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 +6 -4
  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/MongoClient.js.map +1 -1
  22. package/dist/cjs/index.js +7 -1
  23. package/dist/cjs/internal/filter.js +6 -0
  24. package/dist/cjs/internal/filter.js.map +1 -0
  25. package/dist/cjs/internal/modify-result.js +6 -0
  26. package/dist/cjs/internal/modify-result.js.map +1 -0
  27. package/dist/cjs/internal/schema.js +19 -0
  28. package/dist/cjs/internal/schema.js.map +1 -0
  29. package/dist/cjs/internal/version.js +1 -1
  30. package/dist/dts/AggregationCursor.d.ts +18 -0
  31. package/dist/dts/AggregationCursor.d.ts.map +1 -0
  32. package/dist/dts/Collection.d.ts +72 -14
  33. package/dist/dts/Collection.d.ts.map +1 -1
  34. package/dist/dts/Db.d.ts +28 -3
  35. package/dist/dts/Db.d.ts.map +1 -1
  36. package/dist/dts/DocumentAggregationCursor.d.ts +15 -0
  37. package/dist/dts/DocumentAggregationCursor.d.ts.map +1 -0
  38. package/dist/dts/DocumentCollection.d.ts +64 -7
  39. package/dist/dts/DocumentCollection.d.ts.map +1 -1
  40. package/dist/dts/DocumentFindCursor.d.ts +4 -7
  41. package/dist/dts/DocumentFindCursor.d.ts.map +1 -1
  42. package/dist/dts/FindCursor.d.ts +16 -18
  43. package/dist/dts/FindCursor.d.ts.map +1 -1
  44. package/dist/dts/ListCollectionsCursor.d.ts +20 -0
  45. package/dist/dts/ListCollectionsCursor.d.ts.map +1 -0
  46. package/dist/dts/MongoClient.d.ts +1 -1
  47. package/dist/dts/MongoClient.d.ts.map +1 -1
  48. package/dist/dts/index.d.ts +12 -0
  49. package/dist/dts/index.d.ts.map +1 -1
  50. package/dist/dts/internal/filter.d.ts +8 -0
  51. package/dist/dts/internal/filter.d.ts.map +1 -0
  52. package/dist/dts/internal/modify-result.d.ts +6 -0
  53. package/dist/dts/internal/modify-result.d.ts.map +1 -0
  54. package/dist/dts/internal/schema.d.ts +6 -0
  55. package/dist/dts/internal/schema.d.ts.map +1 -0
  56. package/dist/esm/AggregationCursor.js +22 -0
  57. package/dist/esm/AggregationCursor.js.map +1 -0
  58. package/dist/esm/Collection.js +39 -3
  59. package/dist/esm/Collection.js.map +1 -1
  60. package/dist/esm/Db.js +6 -0
  61. package/dist/esm/Db.js.map +1 -1
  62. package/dist/esm/DocumentAggregationCursor.js +15 -0
  63. package/dist/esm/DocumentAggregationCursor.js.map +1 -0
  64. package/dist/esm/DocumentCollection.js +28 -2
  65. package/dist/esm/DocumentCollection.js.map +1 -1
  66. package/dist/esm/DocumentFindCursor.js +3 -0
  67. package/dist/esm/DocumentFindCursor.js.map +1 -1
  68. package/dist/esm/FindCursor.js +5 -4
  69. package/dist/esm/FindCursor.js.map +1 -1
  70. package/dist/esm/ListCollectionsCursor.js +15 -0
  71. package/dist/esm/ListCollectionsCursor.js.map +1 -0
  72. package/dist/esm/MongoClient.js.map +1 -1
  73. package/dist/esm/index.js +12 -0
  74. package/dist/esm/index.js.map +1 -1
  75. package/dist/esm/internal/filter.js +2 -0
  76. package/dist/esm/internal/filter.js.map +1 -0
  77. package/dist/esm/internal/modify-result.js +2 -0
  78. package/dist/esm/internal/modify-result.js.map +1 -0
  79. package/dist/esm/internal/schema.js +10 -0
  80. package/dist/esm/internal/schema.js.map +1 -0
  81. package/dist/esm/internal/version.js +1 -1
  82. package/package.json +26 -3
  83. package/src/AggregationCursor.ts +37 -0
  84. package/src/Collection.ts +390 -24
  85. package/src/Db.ts +47 -3
  86. package/src/DocumentAggregationCursor.ts +30 -0
  87. package/src/DocumentCollection.ts +342 -5
  88. package/src/DocumentFindCursor.ts +5 -5
  89. package/src/FindCursor.ts +31 -27
  90. package/src/ListCollectionsCursor.ts +45 -0
  91. package/src/MongoClient.ts +5 -2
  92. package/src/index.ts +15 -0
  93. package/src/internal/filter.ts +9 -0
  94. package/src/internal/modify-result.ts +6 -0
  95. package/src/internal/schema.ts +12 -0
  96. package/src/internal/version.ts +1 -1
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,24 +1,42 @@
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,
17
+ DropCollectionOptions,
18
+ DropIndexesOptions,
13
19
  Filter,
20
+ FindOneAndReplaceOptions,
14
21
  FindOptions,
22
+ IndexDescription,
23
+ IndexSpecification,
15
24
  InsertManyResult,
16
25
  InsertOneOptions,
17
26
  InsertOneResult,
18
- OptionalUnlessRequiredId
27
+ ModifyResult as MongoModifyResult,
28
+ OptionalUnlessRequiredId,
29
+ RenameOptions,
30
+ ReplaceOptions,
31
+ UpdateFilter,
32
+ UpdateOptions,
33
+ UpdateResult,
34
+ WithoutId
19
35
  } from "mongodb"
20
36
  import * as Collection from "./Collection.js"
37
+ import * as DocumentAggregationCursor from "./DocumentAggregationCursor.js"
21
38
  import * as DocumentFindCursor from "./DocumentFindCursor.js"
39
+ import type { ModifyResult } from "./internal/modify-result.js"
22
40
  import * as MongoError from "./MongoError.js"
23
41
 
24
42
  export class DocumentCollection extends Data.TaggedClass("DocumentCollection")<{
@@ -27,17 +45,21 @@ export class DocumentCollection extends Data.TaggedClass("DocumentCollection")<{
27
45
  }
28
46
 
29
47
  export const find: {
30
- (options?: FindOptions): (collection: DocumentCollection) => DocumentFindCursor.DocumentFindCursor
48
+ (
49
+ filter?: Filter<Document>,
50
+ options?: FindOptions
51
+ ): (collection: DocumentCollection) => DocumentFindCursor.DocumentFindCursor
31
52
  (
32
53
  collection: DocumentCollection,
54
+ filter?: Filter<Document>,
33
55
  options?: FindOptions
34
56
  ): DocumentFindCursor.DocumentFindCursor
35
57
  } = F.dual(
36
58
  (args) => isDocumentCollection(args[0]),
37
- (collection: DocumentCollection, options?: FindOptions) =>
59
+ (collection: DocumentCollection, filter?: Filter<Document>, options?: FindOptions) =>
38
60
  new DocumentFindCursor.DocumentFindCursor(
39
61
  {
40
- cursor: collection.collection.find({}, options)
62
+ cursor: collection.collection.find(filter ?? {}, options)
41
63
  }
42
64
  )
43
65
  )
@@ -112,6 +134,321 @@ export const insertMany: {
112
134
  Effect.catchAllDefect(MongoError.mongoErrorDie<InsertManyResult>("insertMany error"))
113
135
  ))
114
136
 
137
+ export const deleteOne: {
138
+ (
139
+ filter: Filter<Document>,
140
+ options?: DeleteOptions
141
+ ): (
142
+ collection: DocumentCollection
143
+ ) => Effect.Effect<DeleteResult, MongoError.MongoError>
144
+ (
145
+ collection: DocumentCollection,
146
+ filter: Filter<Document>,
147
+ options?: DeleteOptions
148
+ ): Effect.Effect<DeleteResult, MongoError.MongoError>
149
+ } = F.dual(
150
+ (args) => isDocumentCollection(args[0]),
151
+ (
152
+ collection: DocumentCollection,
153
+ filter: Filter<Document>,
154
+ options?: DeleteOptions
155
+ ): Effect.Effect<DeleteResult, MongoError.MongoError> =>
156
+ F.pipe(
157
+ Effect.promise(() => collection.collection.deleteOne(filter, options)),
158
+ Effect.catchAllDefect(MongoError.mongoErrorDie<DeleteResult>("deleteOne error"))
159
+ )
160
+ )
161
+
162
+ export const deleteMany: {
163
+ (
164
+ filter: Filter<Document>,
165
+ options?: DeleteOptions
166
+ ): (
167
+ collection: DocumentCollection
168
+ ) => Effect.Effect<DeleteResult, MongoError.MongoError>
169
+ (
170
+ collection: DocumentCollection,
171
+ filter: Filter<Document>,
172
+ options?: DeleteOptions
173
+ ): Effect.Effect<DeleteResult, MongoError.MongoError>
174
+ } = F.dual(
175
+ (args) => isDocumentCollection(args[0]),
176
+ (
177
+ collection: DocumentCollection,
178
+ filter: Filter<Document>,
179
+ options?: DeleteOptions
180
+ ): Effect.Effect<DeleteResult, MongoError.MongoError> =>
181
+ F.pipe(
182
+ Effect.promise(() => collection.collection.deleteMany(filter, options)),
183
+ Effect.catchAllDefect(MongoError.mongoErrorDie<DeleteResult>("deleteMany error"))
184
+ )
185
+ )
186
+
187
+ export const updateMany: {
188
+ (
189
+ filter: Filter<Document>,
190
+ update: UpdateFilter<Document> | Array<Document>,
191
+ options?: UpdateOptions
192
+ ): (
193
+ collection: DocumentCollection
194
+ ) => Effect.Effect<UpdateResult, MongoError.MongoError>
195
+ (
196
+ collection: DocumentCollection,
197
+ filter: Filter<Document>,
198
+ update: UpdateFilter<Document> | Array<Document>,
199
+ options?: UpdateOptions
200
+ ): Effect.Effect<UpdateResult, MongoError.MongoError>
201
+ } = F.dual(
202
+ (args) => isDocumentCollection(args[0]),
203
+ (
204
+ collection: DocumentCollection,
205
+ filter: Filter<Document>,
206
+ update: UpdateFilter<Document> | Array<Document>,
207
+ options?: UpdateOptions
208
+ ): Effect.Effect<UpdateResult, MongoError.MongoError> =>
209
+ F.pipe(
210
+ Effect.promise(() => collection.collection.updateMany(filter, update, options)),
211
+ Effect.catchAllDefect(MongoError.mongoErrorDie<UpdateResult>("updateMany error"))
212
+ )
213
+ )
214
+
215
+ export const replaceOne: {
216
+ (
217
+ filter: Filter<Document>,
218
+ replacement: WithoutId<Document>,
219
+ options?: ReplaceOptions
220
+ ): (
221
+ collection: DocumentCollection
222
+ ) => Effect.Effect<UpdateResult | Document, MongoError.MongoError>
223
+ (
224
+ collection: DocumentCollection,
225
+ filter: Filter<Document>,
226
+ replacement: WithoutId<Document>,
227
+ options?: ReplaceOptions
228
+ ): Effect.Effect<UpdateResult | Document, MongoError.MongoError>
229
+ } = F.dual(
230
+ (args) => isDocumentCollection(args[0]),
231
+ (
232
+ collection: DocumentCollection,
233
+ filter: Filter<Document>,
234
+ replacement: WithoutId<Document>,
235
+ options?: ReplaceOptions
236
+ ): Effect.Effect<UpdateResult | Document, MongoError.MongoError> =>
237
+ F.pipe(
238
+ Effect.promise(() => collection.collection.replaceOne(filter, replacement, options)),
239
+ Effect.catchAllDefect(MongoError.mongoErrorDie<UpdateResult | Document>("replaceOne error"))
240
+ )
241
+ )
242
+
243
+ export const findOneAndReplace: {
244
+ (
245
+ filter: Filter<Document>,
246
+ replacement: WithoutId<Document>,
247
+ options: FindOneAndReplaceOptions & { includeResultMetadata: true }
248
+ ): (
249
+ collection: DocumentCollection
250
+ ) => Effect.Effect<ModifyResult<Document>, MongoError.MongoError>
251
+ (
252
+ filter: Filter<Document>,
253
+ replacement: WithoutId<Document>,
254
+ options: FindOneAndReplaceOptions & { includeResultMetadata: false }
255
+ ): (
256
+ collection: DocumentCollection
257
+ ) => Effect.Effect<O.Option<Document>, MongoError.MongoError>
258
+ (
259
+ filter: Filter<Document>,
260
+ replacement: WithoutId<Document>,
261
+ options: FindOneAndReplaceOptions
262
+ ): (
263
+ collection: DocumentCollection
264
+ ) => Effect.Effect<O.Option<Document>, MongoError.MongoError>
265
+ (
266
+ filter: Filter<Document>,
267
+ replacement: WithoutId<Document>
268
+ ): (
269
+ collection: DocumentCollection
270
+ ) => Effect.Effect<O.Option<Document>, MongoError.MongoError>
271
+ (
272
+ collection: DocumentCollection,
273
+ filter: Filter<Document>,
274
+ replacement: WithoutId<Document>,
275
+ options: FindOneAndReplaceOptions & { includeResultMetadata: true }
276
+ ): Effect.Effect<ModifyResult<Document>, MongoError.MongoError>
277
+ (
278
+ collection: DocumentCollection,
279
+ filter: Filter<Document>,
280
+ replacement: WithoutId<Document>,
281
+ options: FindOneAndReplaceOptions & { includeResultMetadata: false }
282
+ ): Effect.Effect<O.Option<Document>, MongoError.MongoError>
283
+ (
284
+ collection: DocumentCollection,
285
+ filter: Filter<Document>,
286
+ replacement: WithoutId<Document>,
287
+ options: FindOneAndReplaceOptions
288
+ ): Effect.Effect<O.Option<Document>, MongoError.MongoError>
289
+ (
290
+ collection: DocumentCollection,
291
+ filter: Filter<Document>,
292
+ replacement: WithoutId<Document>
293
+ ): Effect.Effect<O.Option<Document>, MongoError.MongoError>
294
+ } = F.dual(
295
+ (args) => isDocumentCollection(args[0]),
296
+ (
297
+ collection: DocumentCollection,
298
+ filter: Filter<Document>,
299
+ replacement: WithoutId<Document>,
300
+ options?: FindOneAndReplaceOptions
301
+ ): Effect.Effect<O.Option<Document> | ModifyResult<Document>, MongoError.MongoError> =>
302
+ F.pipe(
303
+ Effect.promise(() => collection.collection.findOneAndReplace(filter, replacement, options ?? {})),
304
+ Effect.map((value) => {
305
+ if (options?.includeResultMetadata && !!value) {
306
+ const result = value as unknown as MongoModifyResult<Document>
307
+ return { ...result, value: O.fromNullable(result.value) }
308
+ }
309
+ return O.fromNullable(value)
310
+ }),
311
+ Effect.catchAllDefect(
312
+ MongoError.mongoErrorDie<O.Option<Document> | ModifyResult<Document>>("findOneAndReplace error")
313
+ )
314
+ )
315
+ )
316
+
317
+ export const rename: {
318
+ (
319
+ newName: string,
320
+ options?: RenameOptions
321
+ ): (
322
+ collection: DocumentCollection
323
+ ) => Effect.Effect<MongoCollection, MongoError.MongoError>
324
+ (
325
+ collection: DocumentCollection,
326
+ newName: string,
327
+ options?: RenameOptions
328
+ ): Effect.Effect<MongoCollection, MongoError.MongoError>
329
+ } = F.dual(
330
+ (args) => isDocumentCollection(args[0]),
331
+ (
332
+ collection: DocumentCollection,
333
+ newName: string,
334
+ options?: RenameOptions
335
+ ): Effect.Effect<MongoCollection, MongoError.MongoError> =>
336
+ F.pipe(
337
+ Effect.promise(() => collection.collection.rename(newName, options)),
338
+ Effect.catchAllDefect(MongoError.mongoErrorDie<MongoCollection>("rename error"))
339
+ )
340
+ )
341
+
342
+ export const drop: {
343
+ (options?: DropCollectionOptions): (collection: DocumentCollection) => Effect.Effect<boolean, MongoError.MongoError>
344
+ (collection: DocumentCollection, options?: DropCollectionOptions): Effect.Effect<boolean, MongoError.MongoError>
345
+ } = F.dual(
346
+ (args) => isDocumentCollection(args[0]),
347
+ (
348
+ collection: DocumentCollection,
349
+ options?: DropCollectionOptions
350
+ ): Effect.Effect<boolean, MongoError.MongoError> =>
351
+ F.pipe(
352
+ Effect.promise(() => collection.collection.drop(options)),
353
+ Effect.catchAllDefect(MongoError.mongoErrorDie<boolean>("drop error"))
354
+ )
355
+ )
356
+
357
+ export const createIndexes: {
358
+ (
359
+ indexSpecs: Array<IndexDescription>,
360
+ options?: CreateIndexesOptions
361
+ ): (
362
+ collection: DocumentCollection
363
+ ) => Effect.Effect<Array<string>, MongoError.MongoError>
364
+ (
365
+ collection: DocumentCollection,
366
+ indexSpecs: Array<IndexDescription>,
367
+ options?: CreateIndexesOptions
368
+ ): Effect.Effect<Array<string>, MongoError.MongoError>
369
+ } = F.dual(
370
+ (args) => isDocumentCollection(args[0]),
371
+ (
372
+ collection: DocumentCollection,
373
+ indexSpecs: Array<IndexDescription>,
374
+ options?: CreateIndexesOptions
375
+ ): Effect.Effect<Array<string>, MongoError.MongoError> =>
376
+ F.pipe(
377
+ Effect.promise(() => collection.collection.createIndexes(indexSpecs, options)),
378
+ Effect.catchAllDefect(MongoError.mongoErrorDie<Array<string>>("createIndexes error"))
379
+ )
380
+ )
381
+
382
+ export const createIndex: {
383
+ (
384
+ indexSpec: IndexSpecification,
385
+ options?: CreateIndexesOptions
386
+ ): (collection: DocumentCollection) => Effect.Effect<string, MongoError.MongoError>
387
+ (
388
+ collection: DocumentCollection,
389
+ indexSpec: IndexSpecification,
390
+ options?: CreateIndexesOptions
391
+ ): Effect.Effect<string, MongoError.MongoError>
392
+ } = F.dual(
393
+ (args) => isDocumentCollection(args[0]),
394
+ (
395
+ collection: DocumentCollection,
396
+ indexSpec: IndexSpecification,
397
+ options?: CreateIndexesOptions
398
+ ): Effect.Effect<string, MongoError.MongoError> =>
399
+ F.pipe(
400
+ Effect.promise(() => collection.collection.createIndex(indexSpec, options)),
401
+ Effect.catchAllDefect(MongoError.mongoErrorDie<string>("createIndex error"))
402
+ )
403
+ )
404
+
405
+ export const dropIndex: {
406
+ (
407
+ indexName: string,
408
+ options?: DropIndexesOptions
409
+ ): (collection: DocumentCollection) => Effect.Effect<Document, MongoError.MongoError>
410
+ (
411
+ collection: DocumentCollection,
412
+ indexName: string,
413
+ options?: DropIndexesOptions
414
+ ): Effect.Effect<Document, MongoError.MongoError>
415
+ } = F.dual(
416
+ (args) => isDocumentCollection(args[0]),
417
+ (
418
+ collection: DocumentCollection,
419
+ indexName: string,
420
+ options?: DropIndexesOptions
421
+ ): Effect.Effect<Document, MongoError.MongoError> =>
422
+ F.pipe(
423
+ Effect.promise(() => collection.collection.dropIndex(indexName, options)),
424
+ Effect.catchAllDefect(MongoError.mongoErrorDie<Document>("dropIndex error"))
425
+ )
426
+ )
427
+
428
+ export const aggregate: {
429
+ (
430
+ pipeline?: Array<Document>,
431
+ options?: AggregateOptions
432
+ ): (
433
+ collection: DocumentCollection
434
+ ) => DocumentAggregationCursor.DocumentAggregationCursor
435
+ (
436
+ collection: DocumentCollection,
437
+ pipeline?: Array<Document>,
438
+ options?: AggregateOptions
439
+ ): DocumentAggregationCursor.DocumentAggregationCursor
440
+ } = F.dual(
441
+ (args) => isDocumentCollection(args[0]),
442
+ (
443
+ collection: DocumentCollection,
444
+ pipeline?: Array<Document>,
445
+ options?: AggregateOptions
446
+ ): DocumentAggregationCursor.DocumentAggregationCursor =>
447
+ new DocumentAggregationCursor.DocumentAggregationCursor({
448
+ cursor: collection.collection.aggregate(pipeline, options)
449
+ })
450
+ )
451
+
115
452
  export const typed: {
116
453
  <A extends Document, I extends Document = A, R = never>(
117
454
  schema: Schema.Schema<A, I, R>
@@ -1,12 +1,12 @@
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
- import type { Document, FindCursor as MongoFindCursor, Sort, SortDirection } from "mongodb"
9
+ import type { Document, Filter, FindCursor as MongoFindCursor, Sort, SortDirection } from "mongodb"
10
10
  import * as FindCursor from "./FindCursor.js"
11
11
  import * as MongoError from "./MongoError.js"
12
12
 
@@ -17,12 +17,12 @@ export class DocumentFindCursor extends Data.TaggedClass("DocumentFindCursor")<{
17
17
 
18
18
  export const filter: {
19
19
  (
20
- filter: Document
20
+ filter: Filter<Document>
21
21
  ): (cursor: DocumentFindCursor) => DocumentFindCursor
22
- (cursor: DocumentFindCursor, filter: Document): DocumentFindCursor
22
+ (cursor: DocumentFindCursor, filter: Filter<Document>): DocumentFindCursor
23
23
  } = F.dual(
24
24
  (args) => isDocumentFindCursor(args[0]),
25
- (cursor: DocumentFindCursor, filter: Document): DocumentFindCursor =>
25
+ (cursor: DocumentFindCursor, filter: Filter<Document>): DocumentFindCursor =>
26
26
  new DocumentFindCursor({ cursor: cursor.cursor.filter(filter) })
27
27
  )
28
28
 
package/src/FindCursor.ts CHANGED
@@ -1,52 +1,53 @@
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"
6
+ import type * as E from "effect/Either"
8
7
  import * as F from "effect/Function"
8
+ import type * as ParseResult from "effect/ParseResult"
9
+ import * as Schema from "effect/Schema"
9
10
  import * as Stream from "effect/Stream"
10
11
  import * as Tuple from "effect/Tuple"
11
12
  import type { Document, FindCursor as FindCursor_, Sort, SortDirection } from "mongodb"
13
+ import type { Filter } from "./internal/filter.js"
12
14
  import * as MongoError from "./MongoError.js"
13
15
 
14
- import type * as E from "effect/Either"
15
-
16
16
  export class FindCursor<A, I = A, R = never> extends Data.TaggedClass("FindCursor")<{
17
17
  cursor: FindCursor_<unknown>
18
18
  schema: Schema.Schema<A, I, R>
19
- }> {}
19
+ }> {
20
+ }
20
21
 
21
22
  export const filter: {
22
- <T extends Document = Document>(
23
- filter: T
24
- ): <A, I = A, R = never>(cursor: FindCursor<A, I, R>) => FindCursor<A, I, R>
25
- <A, I = A, R = never, T extends Document = Document>(
23
+ <I extends Document>(
24
+ filter: Filter<I>
25
+ ): <A, R>(cursor: FindCursor<A, I, R>) => FindCursor<A, I, R>
26
+ <A, I extends Document, R>(
26
27
  cursor: FindCursor<A, I, R>,
27
- filter: T
28
+ filter: Filter<I>
28
29
  ): FindCursor<A, I, R>
29
30
  } = F.dual(
30
31
  (args) => isFindCursor(args[0]),
31
- <A, I = A, R = never, T extends Document = Document>(
32
+ <A, I extends Document, R>(
32
33
  cursor: FindCursor<A, I, R>,
33
- filter: T
34
+ filter: Filter<I>
34
35
  ): FindCursor<A, I, R> => new FindCursor({ cursor: cursor.cursor.filter(filter), schema: cursor.schema })
35
36
  )
36
37
 
37
38
  export const project: {
38
- <B, BI = B, BR = never, T extends Document = Document>(
39
+ <B, BI, BR, T extends Document = Document>(
39
40
  newSchema: Schema.Schema<B, BI, BR>,
40
41
  value: T
41
- ): <A, I = A, R = never>(cursor: FindCursor<A, I, R>) => FindCursor<B, BI, BR>
42
- <A, B, I = A, R = never, BI = B, BR = never, T extends Document = Document>(
42
+ ): <A, I, R>(cursor: FindCursor<A, I, R>) => FindCursor<B, BI, BR>
43
+ <A, B, I, R, BI, BR, T extends Document = Document>(
43
44
  cursor: FindCursor<A, I, R>,
44
45
  newSchema: Schema.Schema<B, BI, BR>,
45
46
  value: T
46
47
  ): FindCursor<B, BI, BR>
47
48
  } = F.dual(
48
49
  (args) => isFindCursor(args[0]),
49
- <A, B, I = A, R = never, BI = B, BR = never, T extends Document = Document>(
50
+ <A, B, I, R, BI, BR, T extends Document = Document>(
50
51
  cursor: FindCursor<A, I, R>,
51
52
  newSchema: Schema.Schema<B, BI, BR>,
52
53
  value: T
@@ -57,15 +58,15 @@ export const sort: {
57
58
  (
58
59
  sort: Sort | string,
59
60
  direction?: SortDirection
60
- ): <A, I = A, R = never>(cursor: FindCursor<A, I, R>) => FindCursor<A, I, R>
61
- <A, I = A, R = never>(
61
+ ): <A, I, R>(cursor: FindCursor<A, I, R>) => FindCursor<A, I, R>
62
+ <A, I, R>(
62
63
  cursor: FindCursor<A, I, R>,
63
64
  sort: Sort | string,
64
65
  direction?: SortDirection
65
66
  ): FindCursor<A, I, R>
66
67
  } = F.dual(
67
68
  (args) => isFindCursor(args[0]),
68
- <A, I = A, R = never>(
69
+ <A, I, R>(
69
70
  cursor: FindCursor<A, I, R>,
70
71
  sort: Sort | string,
71
72
  direction?: SortDirection
@@ -75,15 +76,17 @@ export const sort: {
75
76
  export const limit: {
76
77
  (
77
78
  value: number
78
- ): <A, I = A, R = never>(cursor: FindCursor<A, I, R>) => FindCursor<A, I, R>
79
- <A, I = A, R = never>(cursor: FindCursor<A, I, R>, value: number): FindCursor<A, I, R>
79
+ ): <A, I, R>(cursor: FindCursor<A, I, R>) => FindCursor<A, I, R>
80
+ <A, I, R>(cursor: FindCursor<A, I, R>, value: number): FindCursor<A, I, R>
80
81
  } = F.dual(
81
82
  (args) => isFindCursor(args[0]),
82
- <A, I = A, R = never>(cursor: FindCursor<A, I, R>, value: number): FindCursor<A, I, R> =>
83
+ <A, I, R>(cursor: FindCursor<A, I, R>, value: number): FindCursor<A, I, R> =>
83
84
  new FindCursor({ cursor: cursor.cursor.limit(value), schema: cursor.schema })
84
85
  )
85
86
 
86
- export const toArray = <A, I = A, R = never>(cursor: FindCursor<A, I, R>) => {
87
+ export const toArray = <A, I, R>(
88
+ cursor: FindCursor<A, I, R>
89
+ ): Effect.Effect<Array<A>, MongoError.MongoError | ParseResult.ParseError, R> => {
87
90
  const decode = Schema.decodeUnknown(cursor.schema)
88
91
  return Effect.tryPromise({ try: () => cursor.cursor.toArray(), catch: F.identity }).pipe(
89
92
  Effect.catchAll(MongoError.mongoErrorDie<ReadonlyArray<A>>("Unable to get array from mongodb cursor")),
@@ -91,13 +94,14 @@ export const toArray = <A, I = A, R = never>(cursor: FindCursor<A, I, R>) => {
91
94
  )
92
95
  }
93
96
 
94
- export const toArrayEither = <A, I = A, R = never>(cursor: FindCursor<A, I, R>) => {
97
+ export const toArrayEither = <A, I, R>(
98
+ cursor: FindCursor<A, I, R>
99
+ ): Effect.Effect<Array<E.Either<A, [document: unknown, error: ParseResult.ParseError]>>, MongoError.MongoError, R> => {
95
100
  const decode = Schema.decodeUnknown(cursor.schema)
96
101
  return Effect.tryPromise({ try: () => cursor.cursor.toArray(), catch: F.identity }).pipe(
97
102
  Effect.catchAll(MongoError.mongoErrorDie<ReadonlyArray<A>>("Unable to get array from mongodb cursor")),
98
103
  Effect.flatMap(Effect.forEach((x) =>
99
104
  F.pipe(
100
- // keep new line
101
105
  decode(x),
102
106
  Effect.mapError((error) => Tuple.make(x, error)),
103
107
  Effect.either
@@ -106,7 +110,7 @@ export const toArrayEither = <A, I = A, R = never>(cursor: FindCursor<A, I, R>)
106
110
  )
107
111
  }
108
112
 
109
- export const toStream = <A, I = A, R = never>(
113
+ export const toStream = <A, I, R>(
110
114
  cursor: FindCursor<A, I, R>
111
115
  ): Stream.Stream<A, MongoError.MongoError | ParseResult.ParseError, R> => {
112
116
  const decode = Schema.decodeUnknown(cursor.schema)
@@ -117,7 +121,7 @@ export const toStream = <A, I = A, R = never>(
117
121
  )
118
122
  }
119
123
 
120
- export const toStreamEither = <A, I = A, R = never>(
124
+ export const toStreamEither = <A, I, R>(
121
125
  cursor: FindCursor<A, I, R>
122
126
  ): Stream.Stream<E.Either<A, [document: unknown, error: ParseResult.ParseError]>, MongoError.MongoError, R> => {
123
127
  const decode = Schema.decodeUnknown(cursor.schema)