effect-mongodb 0.4.0 → 0.5.0

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 (69) hide show
  1. package/README.md +19 -0
  2. package/dist/cjs/AggregationCursor.js +4 -4
  3. package/dist/cjs/AggregationCursor.js.map +1 -1
  4. package/dist/cjs/Collection.js +32 -21
  5. package/dist/cjs/Collection.js.map +1 -1
  6. package/dist/cjs/Db.js +2 -2
  7. package/dist/cjs/Db.js.map +1 -1
  8. package/dist/cjs/DocumentAggregationCursor.js +4 -4
  9. package/dist/cjs/DocumentAggregationCursor.js.map +1 -1
  10. package/dist/cjs/DocumentCollection.js +31 -21
  11. package/dist/cjs/DocumentCollection.js.map +1 -1
  12. package/dist/cjs/DocumentFindCursor.js +4 -4
  13. package/dist/cjs/DocumentFindCursor.js.map +1 -1
  14. package/dist/cjs/FindCursor.js +6 -6
  15. package/dist/cjs/FindCursor.js.map +1 -1
  16. package/dist/cjs/ListCollectionsCursor.js +4 -4
  17. package/dist/cjs/ListCollectionsCursor.js.map +1 -1
  18. package/dist/cjs/MongoClient.js +3 -3
  19. package/dist/cjs/MongoClient.js.map +1 -1
  20. package/dist/cjs/internal/mongo-operation.js +18 -0
  21. package/dist/cjs/internal/mongo-operation.js.map +1 -0
  22. package/dist/cjs/internal/tracing.js +49 -0
  23. package/dist/cjs/internal/tracing.js.map +1 -0
  24. package/dist/cjs/internal/version.js +1 -1
  25. package/dist/dts/Collection.d.ts +19 -1
  26. package/dist/dts/Collection.d.ts.map +1 -1
  27. package/dist/dts/DocumentCollection.d.ts +19 -1
  28. package/dist/dts/DocumentCollection.d.ts.map +1 -1
  29. package/dist/dts/MongoClient.d.ts.map +1 -1
  30. package/dist/dts/internal/mongo-operation.d.ts +6 -0
  31. package/dist/dts/internal/mongo-operation.d.ts.map +1 -0
  32. package/dist/dts/internal/tracing.d.ts +6 -0
  33. package/dist/dts/internal/tracing.d.ts.map +1 -0
  34. package/dist/esm/AggregationCursor.js +4 -4
  35. package/dist/esm/AggregationCursor.js.map +1 -1
  36. package/dist/esm/Collection.js +31 -20
  37. package/dist/esm/Collection.js.map +1 -1
  38. package/dist/esm/Db.js +2 -2
  39. package/dist/esm/Db.js.map +1 -1
  40. package/dist/esm/DocumentAggregationCursor.js +4 -4
  41. package/dist/esm/DocumentAggregationCursor.js.map +1 -1
  42. package/dist/esm/DocumentCollection.js +30 -20
  43. package/dist/esm/DocumentCollection.js.map +1 -1
  44. package/dist/esm/DocumentFindCursor.js +4 -4
  45. package/dist/esm/DocumentFindCursor.js.map +1 -1
  46. package/dist/esm/FindCursor.js +6 -6
  47. package/dist/esm/FindCursor.js.map +1 -1
  48. package/dist/esm/ListCollectionsCursor.js +4 -4
  49. package/dist/esm/ListCollectionsCursor.js.map +1 -1
  50. package/dist/esm/MongoClient.js +3 -3
  51. package/dist/esm/MongoClient.js.map +1 -1
  52. package/dist/esm/internal/mongo-operation.js +8 -0
  53. package/dist/esm/internal/mongo-operation.js.map +1 -0
  54. package/dist/esm/internal/tracing.js +39 -0
  55. package/dist/esm/internal/tracing.js.map +1 -0
  56. package/dist/esm/internal/version.js +1 -1
  57. package/package.json +1 -1
  58. package/src/AggregationCursor.ts +4 -4
  59. package/src/Collection.ts +103 -22
  60. package/src/Db.ts +2 -2
  61. package/src/DocumentAggregationCursor.ts +4 -4
  62. package/src/DocumentCollection.ts +97 -23
  63. package/src/DocumentFindCursor.ts +4 -4
  64. package/src/FindCursor.ts +6 -6
  65. package/src/ListCollectionsCursor.ts +4 -4
  66. package/src/MongoClient.ts +3 -5
  67. package/src/internal/mongo-operation.ts +22 -0
  68. package/src/internal/tracing.ts +47 -0
  69. package/src/internal/version.ts +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo-operation.js","names":["Effect","F","Stream","mongoErrorOrDie","withSpan","withSpanStream","mongoOperation","source","self","pipe","catchAllDefect","mongoStreamOperation","catchAll"],"sources":["../../../src/internal/mongo-operation.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,CAAC,MAAM,iBAAiB;AACpC,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC,SAASC,eAAe,QAAQ,kBAAkB;AAClD,SAASC,QAAQ,EAAEC,cAAc,QAAQ,cAAc;AAEvD,OAAO,MAAMC,cAAc,GACxBC,MAAmB,IAAeC,IAA4B,IAC7DP,CAAC,CAACQ,IAAI,CACJD,IAAI,EACJR,MAAM,CAACU,cAAc,CAACP,eAAe,CAACI,MAAM,CAAC,CAAC,EAC9CH,QAAQ,CAACG,MAAM,CAAC,CACjB;AAEL,OAAO,MAAMI,oBAAoB,GAC9BJ,MAAmB,IAAeC,IAA4B,IAC7DP,CAAC,CAACQ,IAAI,CACJD,IAAI,EACJN,MAAM,CAACU,QAAQ,CAACT,eAAe,CAACI,MAAM,CAAC,CAAC,EACxCF,cAAc,CAACE,MAAM,CAAC,CACvB","ignoreList":[]}
@@ -0,0 +1,39 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as F from "effect/Function";
3
+ import * as Match from "effect/Match";
4
+ import * as Stream from "effect/Stream";
5
+ export const withSpan = source => self => Effect.withSpan(self, spanName(source), spanOptions(source));
6
+ export const withSpanStream = source => self => Stream.withSpan(self, spanName(source), spanOptions(source));
7
+ const spanName = source => `mongodb.${source.module}.${source.functionName}`;
8
+ const spanOptions = source => ({
9
+ kind: "client",
10
+ captureStackTrace: false,
11
+ attributes: {
12
+ "db.system.name": "mongodb",
13
+ "db.operation.name": source.functionName,
14
+ ...sourceAttributes(source)
15
+ }
16
+ });
17
+ const sourceAttributes = source => F.pipe(Match.value(source), Match.tag("ClientErrorSource", s => serverAttributes(s.hosts)), Match.tag("DbErrorSource", s => ({
18
+ "db.namespace": s.db
19
+ })), Match.tag("CollectionErrorSource", s => ({
20
+ "db.namespace": s.db,
21
+ "db.collection.name": s.collection
22
+ })), Match.exhaustive);
23
+ const serverAttributes = hosts => {
24
+ if (hosts.length !== 1) return {};
25
+ const [address, port] = splitHost(hosts[0]);
26
+ return port === undefined ? {
27
+ "server.address": address
28
+ } : {
29
+ "server.address": address,
30
+ "server.port": port
31
+ };
32
+ };
33
+ const splitHost = host => {
34
+ const separator = host.lastIndexOf(":");
35
+ if (separator === -1) return [host, undefined];
36
+ const port = Number(host.slice(separator + 1));
37
+ return Number.isInteger(port) ? [host.slice(0, separator), port] : [host, undefined];
38
+ };
39
+ //# sourceMappingURL=tracing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing.js","names":["Effect","F","Match","Stream","withSpan","source","self","spanName","spanOptions","withSpanStream","module","functionName","kind","captureStackTrace","attributes","sourceAttributes","pipe","value","tag","s","serverAttributes","hosts","db","collection","exhaustive","length","address","port","splitHost","undefined","host","separator","lastIndexOf","Number","slice","isInteger"],"sources":["../../../src/internal/tracing.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,CAAC,MAAM,iBAAiB;AACpC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AAIvC,OAAO,MAAMC,QAAQ,GAAIC,MAAmB,IAAeC,IAA4B,IACrFN,MAAM,CAACI,QAAQ,CAACE,IAAI,EAAEC,QAAQ,CAACF,MAAM,CAAC,EAAEG,WAAW,CAACH,MAAM,CAAC,CAAC;AAE9D,OAAO,MAAMI,cAAc,GACxBJ,MAAmB,IAAeC,IAA4B,IAC7DH,MAAM,CAACC,QAAQ,CAACE,IAAI,EAAEC,QAAQ,CAACF,MAAM,CAAC,EAAEG,WAAW,CAACH,MAAM,CAAC,CAAC;AAEhE,MAAME,QAAQ,GAAIF,MAAmB,IAAK,WAAWA,MAAM,CAACK,MAAM,IAAIL,MAAM,CAACM,YAAY,EAAE;AAE3F,MAAMH,WAAW,GAAIH,MAAmB,KAA0B;EAChEO,IAAI,EAAE,QAAQ;EACdC,iBAAiB,EAAE,KAAK;EACxBC,UAAU,EAAE;IACV,gBAAgB,EAAE,SAAS;IAC3B,mBAAmB,EAAET,MAAM,CAACM,YAAY;IACxC,GAAGI,gBAAgB,CAACV,MAAM;;CAE7B,CAAC;AAEF,MAAMU,gBAAgB,GAAIV,MAAmB,IAC3CJ,CAAC,CAACe,IAAI,CACJd,KAAK,CAACe,KAAK,CAACZ,MAAM,CAAC,EACnBH,KAAK,CAACgB,GAAG,CAAC,mBAAmB,EAAGC,CAAC,IAAKC,gBAAgB,CAACD,CAAC,CAACE,KAAK,CAAC,CAAC,EAChEnB,KAAK,CAACgB,GAAG,CAAC,eAAe,EAAGC,CAAC,KAAM;EAAE,cAAc,EAAEA,CAAC,CAACG;AAAE,CAAE,CAAC,CAAC,EAC7DpB,KAAK,CAACgB,GAAG,CAAC,uBAAuB,EAAGC,CAAC,KAAM;EAAE,cAAc,EAAEA,CAAC,CAACG,EAAE;EAAE,oBAAoB,EAAEH,CAAC,CAACI;AAAU,CAAE,CAAC,CAAC,EACzGrB,KAAK,CAACsB,UAAU,CACjB;AAEH,MAAMJ,gBAAgB,GAAIC,KAAoB,IAA6B;EACzE,IAAIA,KAAK,CAACI,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE;EACjC,MAAM,CAACC,OAAO,EAAEC,IAAI,CAAC,GAAGC,SAAS,CAACP,KAAK,CAAC,CAAC,CAAC,CAAC;EAC3C,OAAOM,IAAI,KAAKE,SAAS,GAAG;IAAE,gBAAgB,EAAEH;EAAO,CAAE,GAAG;IAAE,gBAAgB,EAAEA,OAAO;IAAE,aAAa,EAAEC;EAAI,CAAE;AAChH,CAAC;AAED,MAAMC,SAAS,GAAIE,IAAY,IAAiD;EAC9E,MAAMC,SAAS,GAAGD,IAAI,CAACE,WAAW,CAAC,GAAG,CAAC;EACvC,IAAID,SAAS,KAAK,CAAC,CAAC,EAAE,OAAO,CAACD,IAAI,EAAED,SAAS,CAAC;EAC9C,MAAMF,IAAI,GAAGM,MAAM,CAACH,IAAI,CAACI,KAAK,CAACH,SAAS,GAAG,CAAC,CAAC,CAAC;EAC9C,OAAOE,MAAM,CAACE,SAAS,CAACR,IAAI,CAAC,GAAG,CAACG,IAAI,CAACI,KAAK,CAAC,CAAC,EAAEH,SAAS,CAAC,EAAEJ,IAAI,CAAC,GAAG,CAACG,IAAI,EAAED,SAAS,CAAC;AACtF,CAAC","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- let moduleVersion = "0.4.0";
1
+ let moduleVersion = "0.5.0";
2
2
  export const getCurrentVersion = () => moduleVersion;
3
3
  export const setCurrentVersion = version => {
4
4
  moduleVersion = version;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "effect-mongodb",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "A MongoDB toolkit for Effect",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -10,7 +10,7 @@ import { pipeArguments } from "effect/Pipeable"
10
10
  import * as Schema from "effect/Schema"
11
11
  import * as Stream from "effect/Stream"
12
12
  import type { AggregationCursor as MongoAggregationCursor } from "mongodb"
13
- import { mongoErrorOrDie } from "./internal/mongo-error.js"
13
+ import { mongoOperation, mongoStreamOperation } from "./internal/mongo-operation.js"
14
14
  import * as MongoError from "./MongoError.js"
15
15
 
16
16
  interface AggregationCursorFields<A, I = A, R = never> {
@@ -37,7 +37,7 @@ export const toArray = <A, I, R>(
37
37
  ): Effect.Effect<Array<A>, MongoError.MongoError | ParseResult.ParseError, R> => {
38
38
  const decode = Schema.decodeUnknown(cursor.schema)
39
39
  return Effect.promise(() => cursor.cursor.toArray()).pipe(
40
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(cursor, "toArray"))),
40
+ mongoOperation(errorSource(cursor, "toArray")),
41
41
  Effect.flatMap(Effect.forEach((x) => decode(x)))
42
42
  )
43
43
  }
@@ -48,14 +48,14 @@ export const toStream = <A, I, R>(
48
48
  const decode = Schema.decodeUnknown(cursor.schema)
49
49
  return F.pipe(
50
50
  Stream.fromAsyncIterable(cursor.cursor, F.identity),
51
- Stream.catchAll(mongoErrorOrDie(errorSource(cursor, "toStream"))),
51
+ mongoStreamOperation(errorSource(cursor, "toStream")),
52
52
  Stream.mapEffect((x) => decode(x))
53
53
  )
54
54
  }
55
55
 
56
56
  const errorSource = <A, I, R>(cursor: AggregationCursor<A, I, R>, functionName: string) =>
57
57
  new MongoError.CollectionErrorSource({
58
- module: AggregationCursorImpl.name,
58
+ module: "AggregationCursor",
59
59
  functionName,
60
60
  db: cursor.cursor.namespace.db,
61
61
  collection: cursor.cursor.namespace.collection ?? "NO_COLLECTION_NAME"
package/src/Collection.ts CHANGED
@@ -24,6 +24,7 @@ import type {
24
24
  DropIndexesOptions,
25
25
  EstimatedDocumentCountOptions,
26
26
  FindOneAndReplaceOptions,
27
+ FindOneAndUpdateOptions,
27
28
  FindOptions as MongoFindOptions,
28
29
  IndexDescription,
29
30
  IndexSpecification,
@@ -43,7 +44,7 @@ import type { AnyBulkWriteOperation as AnyBulkWriteOperation_ } from "./internal
43
44
  import { encodeBulkWriteOperation } from "./internal/bulk-write-operation.js"
44
45
  import type { Filter as Filter_ } from "./internal/filter.js"
45
46
  import type { ModifyResult } from "./internal/modify-result.js"
46
- import { mongoErrorOrDie } from "./internal/mongo-error.js"
47
+ import { mongoOperation } from "./internal/mongo-operation.js"
47
48
  import * as SchemaExt from "./internal/schema.js"
48
49
  import * as MongoError from "./MongoError.js"
49
50
 
@@ -118,7 +119,7 @@ export const findOne: {
118
119
  const value = yield* Effect.promise(() => collection.collection.findOne(filter, options))
119
120
  return yield* SchemaExt.decodeNullableDocument(collection.schema, value)
120
121
  }).pipe(
121
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "findOne")))
122
+ mongoOperation(errorSource(collection, "findOne"))
122
123
  )
123
124
  )
124
125
 
@@ -139,7 +140,7 @@ export const insertOne: {
139
140
  F.pipe(
140
141
  collection.encode(doc),
141
142
  Effect.flatMap((doc) => Effect.promise(() => collection.collection.insertOne(doc, options))),
142
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "insertOne")))
143
+ mongoOperation(errorSource(collection, "insertOne"))
143
144
  ))
144
145
 
145
146
  export const insertMany: {
@@ -160,7 +161,7 @@ export const insertMany: {
160
161
  docs,
161
162
  Effect.forEach((doc) => collection.encode(doc)),
162
163
  Effect.flatMap((docs) => Effect.promise(() => collection.collection.insertMany(docs, options))),
163
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "insertMany")))
164
+ mongoOperation(errorSource(collection, "insertMany"))
164
165
  )
165
166
  })
166
167
 
@@ -181,7 +182,7 @@ export const deleteOne: {
181
182
  options?: DeleteOptions
182
183
  ): Effect.Effect<DeleteResult, MongoError.MongoError, R> =>
183
184
  Effect.promise(() => collection.collection.deleteOne(filter, options)).pipe(
184
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "deleteOne")))
185
+ mongoOperation(errorSource(collection, "deleteOne"))
185
186
  )
186
187
  )
187
188
 
@@ -202,7 +203,7 @@ export const deleteMany: {
202
203
  options?: DeleteOptions
203
204
  ): Effect.Effect<DeleteResult, MongoError.MongoError, R> =>
204
205
  Effect.promise(() => collection.collection.deleteMany(filter, options)).pipe(
205
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "deleteMany")))
206
+ mongoOperation(errorSource(collection, "deleteMany"))
206
207
  )
207
208
  )
208
209
 
@@ -234,7 +235,7 @@ export const updateOne: {
234
235
  Array.isArray(update) ? [...update] : update as UpdateFilter<Document>,
235
236
  options
236
237
  )
237
- ).pipe(Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "updateOne"))))
238
+ ).pipe(mongoOperation(errorSource(collection, "updateOne")))
238
239
  )
239
240
 
240
241
  export const updateMany: {
@@ -265,7 +266,7 @@ export const updateMany: {
265
266
  Array.isArray(update) ? [...update] : update as UpdateFilter<Document>,
266
267
  options
267
268
  )
268
- ).pipe(Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "updateMany"))))
269
+ ).pipe(mongoOperation(errorSource(collection, "updateMany")))
269
270
  )
270
271
 
271
272
  export const replaceOne: {
@@ -299,7 +300,7 @@ export const replaceOne: {
299
300
  Effect.flatMap((replacement) =>
300
301
  Effect.promise(() => collection.collection.replaceOne(filter, replacement, options))
301
302
  ),
302
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "replaceOne")))
303
+ mongoOperation(errorSource(collection, "replaceOne"))
303
304
  )
304
305
  )
305
306
 
@@ -370,9 +371,89 @@ export const findOneAndReplace: {
370
371
  return yield* SchemaExt.decodeNullableDocument(collection.schema, value)
371
372
  })
372
373
  ),
373
- Effect.catchAllDefect(
374
- mongoErrorOrDie(errorSource(collection, "findOneAndReplace"))
375
- )
374
+ mongoOperation(errorSource(collection, "findOneAndReplace"))
375
+ )
376
+ )
377
+
378
+ export const findOneAndUpdate: {
379
+ <I extends Document>(
380
+ filter: Filter<I>,
381
+ update: UpdateFilter<I> | ReadonlyArray<Document>,
382
+ options: FindOneAndUpdateOptions & { includeResultMetadata: true }
383
+ ): <A extends Document, I2 extends I, R>(
384
+ collection: Collection<A, I2, R>
385
+ ) => Effect.Effect<ModifyResult<A>, MongoError.MongoError | ParseResult.ParseError, R>
386
+ <I extends Document>(
387
+ filter: Filter<I>,
388
+ update: UpdateFilter<I> | ReadonlyArray<Document>,
389
+ options: FindOneAndUpdateOptions & { includeResultMetadata: false }
390
+ ): <A extends Document, I2 extends I, R>(
391
+ collection: Collection<A, I2, R>
392
+ ) => Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
393
+ <I extends Document>(
394
+ filter: Filter<I>,
395
+ update: UpdateFilter<I> | ReadonlyArray<Document>,
396
+ options: FindOneAndUpdateOptions
397
+ ): <A extends Document, I2 extends I, R>(
398
+ collection: Collection<A, I2, R>
399
+ ) => Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
400
+ <I extends Document>(filter: Filter<I>, update: UpdateFilter<I> | ReadonlyArray<Document>): <
401
+ A extends Document,
402
+ I2 extends I,
403
+ R
404
+ >(
405
+ collection: Collection<A, I2, R>
406
+ ) => Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
407
+ <A extends Document, I extends Document, R>(
408
+ collection: Collection<A, I, R>,
409
+ filter: Filter<I>,
410
+ update: UpdateFilter<I> | ReadonlyArray<Document>,
411
+ options: FindOneAndUpdateOptions & { includeResultMetadata: true }
412
+ ): Effect.Effect<ModifyResult<A>, MongoError.MongoError | ParseResult.ParseError, R>
413
+ <A extends Document, I extends Document, R>(
414
+ collection: Collection<A, I, R>,
415
+ filter: Filter<I>,
416
+ update: UpdateFilter<I> | ReadonlyArray<Document>,
417
+ options: FindOneAndUpdateOptions & { includeResultMetadata: false }
418
+ ): Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
419
+ <A extends Document, I extends Document, R>(
420
+ collection: Collection<A, I, R>,
421
+ filter: Filter<I>,
422
+ update: UpdateFilter<I> | ReadonlyArray<Document>,
423
+ options: FindOneAndUpdateOptions
424
+ ): Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
425
+ <A extends Document, I extends Document, R>(
426
+ collection: Collection<A, I, R>,
427
+ filter: Filter<I>,
428
+ update: UpdateFilter<I> | ReadonlyArray<Document>
429
+ ): Effect.Effect<O.Option<A>, MongoError.MongoError | ParseResult.ParseError, R>
430
+ } = F.dual(
431
+ (args) => isCollection(args[0]),
432
+ <A extends Document, I extends Document, R>(
433
+ collection: Collection<A, I, R>,
434
+ filter: Filter<I>,
435
+ update: UpdateFilter<I> | ReadonlyArray<Document>,
436
+ options?: FindOneAndUpdateOptions
437
+ ): Effect.Effect<O.Option<A> | ModifyResult<A>, MongoError.MongoError | ParseResult.ParseError, R> =>
438
+ F.pipe(
439
+ Effect.promise(() =>
440
+ collection.collection.findOneAndUpdate(
441
+ filter,
442
+ Array.isArray(update) ? [...update] : update as UpdateFilter<Document>,
443
+ options ?? {}
444
+ )
445
+ ),
446
+ Effect.flatMap((value) =>
447
+ Effect.gen(function*() {
448
+ if (options?.includeResultMetadata && !!value) {
449
+ const result = value as unknown as MongoModifyResult<I>
450
+ const maybeValue = yield* SchemaExt.decodeNullableDocument(collection.schema, result.value)
451
+ return { ...result, value: maybeValue }
452
+ }
453
+ return yield* SchemaExt.decodeNullableDocument(collection.schema, value)
454
+ })
455
+ ),
456
+ mongoOperation(errorSource(collection, "findOneAndUpdate"))
376
457
  )
377
458
  )
378
459
 
@@ -397,7 +478,7 @@ export const rename: {
397
478
  Effect.map((newCollection) =>
398
479
  new CollectionImpl<A, I, R>({ collection: newCollection, schema: collection.schema })
399
480
  ),
400
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "rename")))
481
+ mongoOperation(errorSource(collection, "rename"))
401
482
  )
402
483
  )
403
484
 
@@ -417,7 +498,7 @@ export const drop: {
417
498
  ): Effect.Effect<boolean, MongoError.MongoError, R> =>
418
499
  F.pipe(
419
500
  Effect.promise(() => collection.collection.drop(options)),
420
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "drop")))
501
+ mongoOperation(errorSource(collection, "drop"))
421
502
  )
422
503
  )
423
504
 
@@ -442,7 +523,7 @@ export const createIndexes: {
442
523
  ): Effect.Effect<Array<string>, MongoError.MongoError, R> =>
443
524
  F.pipe(
444
525
  Effect.promise(() => collection.collection.createIndexes([...indexSpecs], options)),
445
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "createIndexes")))
526
+ mongoOperation(errorSource(collection, "createIndexes"))
446
527
  )
447
528
  )
448
529
 
@@ -464,7 +545,7 @@ export const createIndex: {
464
545
  ): Effect.Effect<string, MongoError.MongoError, R> =>
465
546
  F.pipe(
466
547
  Effect.promise(() => collection.collection.createIndex(indexSpec, options)),
467
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "createIndex")))
548
+ mongoOperation(errorSource(collection, "createIndex"))
468
549
  )
469
550
  )
470
551
 
@@ -486,7 +567,7 @@ export const dropIndex: {
486
567
  ): Effect.Effect<Document, MongoError.MongoError, R> =>
487
568
  F.pipe(
488
569
  Effect.promise(() => collection.collection.dropIndex(indexName, options)),
489
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "dropIndex")))
570
+ mongoOperation(errorSource(collection, "dropIndex"))
490
571
  )
491
572
  )
492
573
 
@@ -506,7 +587,7 @@ export const dropIndexes: {
506
587
  ): Effect.Effect<boolean, MongoError.MongoError, R> =>
507
588
  F.pipe(
508
589
  Effect.promise(() => collection.collection.dropIndexes(options)),
509
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "dropIndexes")))
590
+ mongoOperation(errorSource(collection, "dropIndexes"))
510
591
  )
511
592
  )
512
593
 
@@ -554,7 +635,7 @@ export const estimatedDocumentCount: {
554
635
  ): Effect.Effect<number, MongoError.MongoError, R> =>
555
636
  F.pipe(
556
637
  Effect.promise(() => collection.collection.estimatedDocumentCount(options)),
557
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "estimatedDocumentCount")))
638
+ mongoOperation(errorSource(collection, "estimatedDocumentCount"))
558
639
  )
559
640
  )
560
641
 
@@ -576,7 +657,7 @@ export const countDocuments: {
576
657
  ): Effect.Effect<number, MongoError.MongoError, R> =>
577
658
  F.pipe(
578
659
  Effect.promise(() => collection.collection.countDocuments(filter, options)),
579
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "countDocuments")))
660
+ mongoOperation(errorSource(collection, "countDocuments"))
580
661
  )
581
662
  )
582
663
 
@@ -603,7 +684,7 @@ export const bulkWrite: {
603
684
  operations,
604
685
  Effect.forEach((op) => encodeBulkWriteOperation(collection.schema, op)),
605
686
  Effect.flatMap((operations) => Effect.promise(() => collection.collection.bulkWrite(operations, options))),
606
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(collection, "bulkWrite")))
687
+ mongoOperation(errorSource(collection, "bulkWrite"))
607
688
  )
608
689
  )
609
690
 
@@ -614,7 +695,7 @@ const errorSource = <A extends Document, I extends Document = A, R = never>(
614
695
  functionName: string
615
696
  ) =>
616
697
  new MongoError.CollectionErrorSource({
617
- module: CollectionImpl.name,
698
+ module: "Collection",
618
699
  functionName,
619
700
  db: collection.collection.dbName,
620
701
  collection: collection.collection.collectionName
package/src/Db.ts CHANGED
@@ -8,7 +8,7 @@ import type * as Schema from "effect/Schema"
8
8
  import type { Db as Db_, Document, DropCollectionOptions, ListCollectionsOptions } from "mongodb"
9
9
  import type * as Collection from "./Collection.js"
10
10
  import * as DocumentCollection from "./DocumentCollection.js"
11
- import { mongoErrorOrDie } from "./internal/mongo-error.js"
11
+ import { mongoOperation } from "./internal/mongo-operation.js"
12
12
  import * as ListCollectionsCursor from "./ListCollectionsCursor.js"
13
13
  import * as MongoError from "./MongoError.js"
14
14
 
@@ -82,7 +82,7 @@ export const dropCollection: {
82
82
  (db: Db, name: string, options?: DropCollectionOptions): Effect.Effect<boolean, MongoError.MongoError> =>
83
83
  F.pipe(
84
84
  Effect.promise(() => db.db.dropCollection(name, options)),
85
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(db, "dropCollection")))
85
+ mongoOperation(errorSource(db, "dropCollection"))
86
86
  )
87
87
  )
88
88
 
@@ -8,7 +8,7 @@ import type { Pipeable } from "effect/Pipeable"
8
8
  import { pipeArguments } from "effect/Pipeable"
9
9
  import * as Stream from "effect/Stream"
10
10
  import type { AggregationCursor as MongoAggregationCursor, Document } from "mongodb"
11
- import { mongoErrorOrDie } from "./internal/mongo-error.js"
11
+ import { mongoOperation, mongoStreamOperation } from "./internal/mongo-operation.js"
12
12
  import * as MongoError from "./MongoError.js"
13
13
 
14
14
  type DocumentAggregationCursorFields = { cursor: MongoAggregationCursor<Document> }
@@ -32,7 +32,7 @@ export const toArray = (
32
32
  ): Effect.Effect<Array<Document>, MongoError.MongoError> =>
33
33
  F.pipe(
34
34
  Effect.promise(() => cursor.cursor.toArray()),
35
- Effect.catchAllDefect(mongoErrorOrDie(errorSource(cursor, "toArray")))
35
+ mongoOperation(errorSource(cursor, "toArray"))
36
36
  )
37
37
 
38
38
  export const toStream = (
@@ -40,12 +40,12 @@ export const toStream = (
40
40
  ): Stream.Stream<Document, MongoError.MongoError> =>
41
41
  F.pipe(
42
42
  Stream.fromAsyncIterable(cursor.cursor, F.identity),
43
- Stream.catchAll(mongoErrorOrDie(errorSource(cursor, "toStream")))
43
+ mongoStreamOperation(errorSource(cursor, "toStream"))
44
44
  )
45
45
 
46
46
  const errorSource = (cursor: DocumentAggregationCursor, functionName: string) =>
47
47
  new MongoError.CollectionErrorSource({
48
- module: DocumentAggregationCursorImpl.name,
48
+ module: "DocumentAggregationCursor",
49
49
  functionName,
50
50
  db: cursor.cursor.namespace.db,
51
51
  collection: cursor.cursor.namespace.collection ?? "NO_COLLECTION_NAME"