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