@depup/mongoose 9.1.3-depup.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 (295) hide show
  1. package/LICENSE.md +22 -0
  2. package/README.md +397 -0
  3. package/SECURITY.md +1 -0
  4. package/eslint.config.mjs +198 -0
  5. package/index.js +64 -0
  6. package/lib/aggregate.js +1189 -0
  7. package/lib/cast/bigint.js +46 -0
  8. package/lib/cast/boolean.js +32 -0
  9. package/lib/cast/date.js +41 -0
  10. package/lib/cast/decimal128.js +39 -0
  11. package/lib/cast/double.js +50 -0
  12. package/lib/cast/int32.js +36 -0
  13. package/lib/cast/number.js +42 -0
  14. package/lib/cast/objectid.js +29 -0
  15. package/lib/cast/string.js +37 -0
  16. package/lib/cast/uuid.js +35 -0
  17. package/lib/cast.js +436 -0
  18. package/lib/collection.js +321 -0
  19. package/lib/connection.js +1855 -0
  20. package/lib/connectionState.js +26 -0
  21. package/lib/constants.js +73 -0
  22. package/lib/cursor/aggregationCursor.js +466 -0
  23. package/lib/cursor/changeStream.js +198 -0
  24. package/lib/cursor/queryCursor.js +622 -0
  25. package/lib/document.js +5521 -0
  26. package/lib/driver.js +15 -0
  27. package/lib/drivers/SPEC.md +4 -0
  28. package/lib/drivers/node-mongodb-native/bulkWriteResult.js +5 -0
  29. package/lib/drivers/node-mongodb-native/collection.js +393 -0
  30. package/lib/drivers/node-mongodb-native/connection.js +506 -0
  31. package/lib/drivers/node-mongodb-native/index.js +10 -0
  32. package/lib/error/browserMissingSchema.js +29 -0
  33. package/lib/error/bulkSaveIncompleteError.js +44 -0
  34. package/lib/error/bulkWriteError.js +41 -0
  35. package/lib/error/cast.js +158 -0
  36. package/lib/error/createCollectionsError.js +26 -0
  37. package/lib/error/divergentArray.js +40 -0
  38. package/lib/error/eachAsyncMultiError.js +41 -0
  39. package/lib/error/index.js +237 -0
  40. package/lib/error/invalidSchemaOption.js +32 -0
  41. package/lib/error/messages.js +47 -0
  42. package/lib/error/missingSchema.js +33 -0
  43. package/lib/error/mongooseError.js +13 -0
  44. package/lib/error/notFound.js +47 -0
  45. package/lib/error/objectExpected.js +31 -0
  46. package/lib/error/objectParameter.js +31 -0
  47. package/lib/error/overwriteModel.js +31 -0
  48. package/lib/error/parallelSave.js +33 -0
  49. package/lib/error/parallelValidate.js +33 -0
  50. package/lib/error/serverSelection.js +62 -0
  51. package/lib/error/setOptionError.js +103 -0
  52. package/lib/error/strict.js +35 -0
  53. package/lib/error/strictPopulate.js +31 -0
  54. package/lib/error/syncIndexes.js +30 -0
  55. package/lib/error/validation.js +97 -0
  56. package/lib/error/validator.js +100 -0
  57. package/lib/error/version.js +38 -0
  58. package/lib/helpers/aggregate/prepareDiscriminatorPipeline.js +39 -0
  59. package/lib/helpers/aggregate/stringifyFunctionOperators.js +50 -0
  60. package/lib/helpers/arrayDepth.js +33 -0
  61. package/lib/helpers/clone.js +204 -0
  62. package/lib/helpers/common.js +127 -0
  63. package/lib/helpers/createJSONSchemaTypeDefinition.js +24 -0
  64. package/lib/helpers/cursor/eachAsync.js +225 -0
  65. package/lib/helpers/discriminator/applyEmbeddedDiscriminators.js +36 -0
  66. package/lib/helpers/discriminator/areDiscriminatorValuesEqual.js +16 -0
  67. package/lib/helpers/discriminator/checkEmbeddedDiscriminatorKeyProjection.js +12 -0
  68. package/lib/helpers/discriminator/getConstructor.js +29 -0
  69. package/lib/helpers/discriminator/getDiscriminatorByValue.js +28 -0
  70. package/lib/helpers/discriminator/getSchemaDiscriminatorByValue.js +27 -0
  71. package/lib/helpers/discriminator/mergeDiscriminatorSchema.js +91 -0
  72. package/lib/helpers/document/applyDefaults.js +132 -0
  73. package/lib/helpers/document/applyTimestamps.js +106 -0
  74. package/lib/helpers/document/applyVirtuals.js +147 -0
  75. package/lib/helpers/document/cleanModifiedSubpaths.js +45 -0
  76. package/lib/helpers/document/compile.js +238 -0
  77. package/lib/helpers/document/getDeepestSubdocumentForPath.js +38 -0
  78. package/lib/helpers/document/getEmbeddedDiscriminatorPath.js +53 -0
  79. package/lib/helpers/document/handleSpreadDoc.js +35 -0
  80. package/lib/helpers/each.js +25 -0
  81. package/lib/helpers/error/combinePathErrors.js +22 -0
  82. package/lib/helpers/firstKey.js +8 -0
  83. package/lib/helpers/get.js +65 -0
  84. package/lib/helpers/getConstructorName.js +16 -0
  85. package/lib/helpers/getDefaultBulkwriteResult.js +18 -0
  86. package/lib/helpers/getFunctionName.js +10 -0
  87. package/lib/helpers/immediate.js +16 -0
  88. package/lib/helpers/indexes/applySchemaCollation.js +13 -0
  89. package/lib/helpers/indexes/decorateDiscriminatorIndexOptions.js +14 -0
  90. package/lib/helpers/indexes/getRelatedIndexes.js +63 -0
  91. package/lib/helpers/indexes/isDefaultIdIndex.js +18 -0
  92. package/lib/helpers/indexes/isIndexEqual.js +95 -0
  93. package/lib/helpers/indexes/isIndexSpecEqual.js +32 -0
  94. package/lib/helpers/indexes/isTextIndex.js +16 -0
  95. package/lib/helpers/indexes/isTimeseriesIndex.js +16 -0
  96. package/lib/helpers/isAsyncFunction.js +9 -0
  97. package/lib/helpers/isBsonType.js +15 -0
  98. package/lib/helpers/isMongooseObject.js +22 -0
  99. package/lib/helpers/isObject.js +16 -0
  100. package/lib/helpers/isPOJO.js +12 -0
  101. package/lib/helpers/isPromise.js +6 -0
  102. package/lib/helpers/isSimpleValidator.js +22 -0
  103. package/lib/helpers/minimize.js +41 -0
  104. package/lib/helpers/model/applyDefaultsToPOJO.js +52 -0
  105. package/lib/helpers/model/applyHooks.js +140 -0
  106. package/lib/helpers/model/applyMethods.js +70 -0
  107. package/lib/helpers/model/applyStaticHooks.js +33 -0
  108. package/lib/helpers/model/applyStatics.js +13 -0
  109. package/lib/helpers/model/castBulkWrite.js +316 -0
  110. package/lib/helpers/model/decorateBulkWriteResult.js +8 -0
  111. package/lib/helpers/model/discriminator.js +265 -0
  112. package/lib/helpers/model/pushNestedArrayPaths.js +15 -0
  113. package/lib/helpers/omitUndefined.js +20 -0
  114. package/lib/helpers/once.js +12 -0
  115. package/lib/helpers/parallelLimit.js +37 -0
  116. package/lib/helpers/path/parentPaths.js +18 -0
  117. package/lib/helpers/path/setDottedPath.js +33 -0
  118. package/lib/helpers/pluralize.js +95 -0
  119. package/lib/helpers/populate/assignRawDocsToIdStructure.js +129 -0
  120. package/lib/helpers/populate/assignVals.js +360 -0
  121. package/lib/helpers/populate/createPopulateQueryFilter.js +97 -0
  122. package/lib/helpers/populate/getModelsMapForPopulate.js +776 -0
  123. package/lib/helpers/populate/getSchemaTypes.js +228 -0
  124. package/lib/helpers/populate/getVirtual.js +103 -0
  125. package/lib/helpers/populate/leanPopulateMap.js +7 -0
  126. package/lib/helpers/populate/lookupLocalFields.js +40 -0
  127. package/lib/helpers/populate/markArraySubdocsPopulated.js +49 -0
  128. package/lib/helpers/populate/modelNamesFromRefPath.js +66 -0
  129. package/lib/helpers/populate/removeDeselectedForeignField.js +31 -0
  130. package/lib/helpers/populate/setPopulatedVirtualValue.js +33 -0
  131. package/lib/helpers/populate/skipPopulateValue.js +10 -0
  132. package/lib/helpers/populate/validateRef.js +19 -0
  133. package/lib/helpers/printJestWarning.js +21 -0
  134. package/lib/helpers/processConnectionOptions.js +65 -0
  135. package/lib/helpers/projection/applyProjection.js +83 -0
  136. package/lib/helpers/projection/hasIncludedChildren.js +41 -0
  137. package/lib/helpers/projection/isDefiningProjection.js +18 -0
  138. package/lib/helpers/projection/isExclusive.js +37 -0
  139. package/lib/helpers/projection/isInclusive.js +39 -0
  140. package/lib/helpers/projection/isNestedProjection.js +8 -0
  141. package/lib/helpers/projection/isPathExcluded.js +40 -0
  142. package/lib/helpers/projection/isPathSelectedInclusive.js +28 -0
  143. package/lib/helpers/projection/isSubpath.js +14 -0
  144. package/lib/helpers/projection/parseProjection.js +33 -0
  145. package/lib/helpers/query/applyGlobalOption.js +29 -0
  146. package/lib/helpers/query/cast$expr.js +287 -0
  147. package/lib/helpers/query/castFilterPath.js +54 -0
  148. package/lib/helpers/query/castUpdate.js +643 -0
  149. package/lib/helpers/query/getEmbeddedDiscriminatorPath.js +103 -0
  150. package/lib/helpers/query/handleImmutable.js +44 -0
  151. package/lib/helpers/query/handleReadPreferenceAliases.js +23 -0
  152. package/lib/helpers/query/hasDollarKeys.js +23 -0
  153. package/lib/helpers/query/isOperator.js +14 -0
  154. package/lib/helpers/query/sanitizeFilter.js +38 -0
  155. package/lib/helpers/query/sanitizeProjection.js +14 -0
  156. package/lib/helpers/query/selectPopulatedFields.js +62 -0
  157. package/lib/helpers/query/trusted.js +13 -0
  158. package/lib/helpers/query/validOps.js +3 -0
  159. package/lib/helpers/schema/addAutoId.js +7 -0
  160. package/lib/helpers/schema/applyBuiltinPlugins.js +12 -0
  161. package/lib/helpers/schema/applyPlugins.js +55 -0
  162. package/lib/helpers/schema/applyReadConcern.js +20 -0
  163. package/lib/helpers/schema/applyWriteConcern.js +39 -0
  164. package/lib/helpers/schema/cleanPositionalOperators.js +12 -0
  165. package/lib/helpers/schema/getIndexes.js +171 -0
  166. package/lib/helpers/schema/getKeysInSchemaOrder.js +28 -0
  167. package/lib/helpers/schema/getPath.js +43 -0
  168. package/lib/helpers/schema/getSubdocumentStrictValue.js +32 -0
  169. package/lib/helpers/schema/handleIdOption.js +20 -0
  170. package/lib/helpers/schema/handleTimestampOption.js +24 -0
  171. package/lib/helpers/schema/idGetter.js +34 -0
  172. package/lib/helpers/schema/merge.js +36 -0
  173. package/lib/helpers/schematype/handleImmutable.js +50 -0
  174. package/lib/helpers/setDefaultsOnInsert.js +158 -0
  175. package/lib/helpers/specialProperties.js +3 -0
  176. package/lib/helpers/symbols.js +20 -0
  177. package/lib/helpers/timers.js +3 -0
  178. package/lib/helpers/timestamps/setDocumentTimestamps.js +26 -0
  179. package/lib/helpers/timestamps/setupTimestamps.js +116 -0
  180. package/lib/helpers/topology/allServersUnknown.js +12 -0
  181. package/lib/helpers/topology/isAtlas.js +31 -0
  182. package/lib/helpers/topology/isSSLError.js +16 -0
  183. package/lib/helpers/update/applyTimestampsToChildren.js +193 -0
  184. package/lib/helpers/update/applyTimestampsToUpdate.js +131 -0
  185. package/lib/helpers/update/castArrayFilters.js +113 -0
  186. package/lib/helpers/update/decorateUpdateWithVersionKey.js +35 -0
  187. package/lib/helpers/update/modifiedPaths.js +33 -0
  188. package/lib/helpers/update/moveImmutableProperties.js +53 -0
  189. package/lib/helpers/update/removeUnusedArrayFilters.js +32 -0
  190. package/lib/helpers/update/updatedPathsByArrayFilter.js +27 -0
  191. package/lib/helpers/updateValidators.js +193 -0
  192. package/lib/index.js +17 -0
  193. package/lib/internal.js +46 -0
  194. package/lib/model.js +5010 -0
  195. package/lib/modifiedPathsSnapshot.js +9 -0
  196. package/lib/mongoose.js +1411 -0
  197. package/lib/options/populateOptions.js +36 -0
  198. package/lib/options/propertyOptions.js +8 -0
  199. package/lib/options/saveOptions.js +16 -0
  200. package/lib/options/schemaArrayOptions.js +78 -0
  201. package/lib/options/schemaBufferOptions.js +38 -0
  202. package/lib/options/schemaDateOptions.js +71 -0
  203. package/lib/options/schemaDocumentArrayOptions.js +68 -0
  204. package/lib/options/schemaMapOptions.js +43 -0
  205. package/lib/options/schemaNumberOptions.js +101 -0
  206. package/lib/options/schemaObjectIdOptions.js +64 -0
  207. package/lib/options/schemaStringOptions.js +138 -0
  208. package/lib/options/schemaSubdocumentOptions.js +66 -0
  209. package/lib/options/schemaTypeOptions.js +244 -0
  210. package/lib/options/schemaUnionOptions.js +32 -0
  211. package/lib/options/virtualOptions.js +164 -0
  212. package/lib/options.js +17 -0
  213. package/lib/plugins/index.js +6 -0
  214. package/lib/plugins/saveSubdocs.js +76 -0
  215. package/lib/plugins/sharding.js +84 -0
  216. package/lib/plugins/trackTransaction.js +84 -0
  217. package/lib/plugins/validateBeforeSave.js +41 -0
  218. package/lib/query.js +5673 -0
  219. package/lib/queryHelpers.js +387 -0
  220. package/lib/schema/array.js +699 -0
  221. package/lib/schema/bigint.js +282 -0
  222. package/lib/schema/boolean.js +332 -0
  223. package/lib/schema/buffer.js +343 -0
  224. package/lib/schema/date.js +467 -0
  225. package/lib/schema/decimal128.js +263 -0
  226. package/lib/schema/documentArray.js +656 -0
  227. package/lib/schema/documentArrayElement.js +137 -0
  228. package/lib/schema/double.js +246 -0
  229. package/lib/schema/index.js +32 -0
  230. package/lib/schema/int32.js +289 -0
  231. package/lib/schema/map.js +201 -0
  232. package/lib/schema/mixed.js +146 -0
  233. package/lib/schema/number.js +510 -0
  234. package/lib/schema/objectId.js +333 -0
  235. package/lib/schema/operators/bitwise.js +38 -0
  236. package/lib/schema/operators/exists.js +12 -0
  237. package/lib/schema/operators/geospatial.js +107 -0
  238. package/lib/schema/operators/helpers.js +32 -0
  239. package/lib/schema/operators/text.js +39 -0
  240. package/lib/schema/operators/type.js +20 -0
  241. package/lib/schema/string.js +733 -0
  242. package/lib/schema/subdocument.js +436 -0
  243. package/lib/schema/symbols.js +5 -0
  244. package/lib/schema/union.js +113 -0
  245. package/lib/schema/uuid.js +305 -0
  246. package/lib/schema.js +3226 -0
  247. package/lib/schemaType.js +1835 -0
  248. package/lib/stateMachine.js +232 -0
  249. package/lib/types/array/index.js +119 -0
  250. package/lib/types/array/isMongooseArray.js +5 -0
  251. package/lib/types/array/methods/index.js +1095 -0
  252. package/lib/types/arraySubdocument.js +207 -0
  253. package/lib/types/buffer.js +294 -0
  254. package/lib/types/decimal128.js +13 -0
  255. package/lib/types/documentArray/index.js +113 -0
  256. package/lib/types/documentArray/isMongooseDocumentArray.js +5 -0
  257. package/lib/types/documentArray/methods/index.js +415 -0
  258. package/lib/types/double.js +13 -0
  259. package/lib/types/index.js +23 -0
  260. package/lib/types/map.js +419 -0
  261. package/lib/types/objectid.js +41 -0
  262. package/lib/types/subdocument.js +464 -0
  263. package/lib/types/uuid.js +13 -0
  264. package/lib/utils.js +1054 -0
  265. package/lib/validOptions.js +42 -0
  266. package/lib/virtualType.js +204 -0
  267. package/package.json +148 -0
  268. package/types/aggregate.d.ts +180 -0
  269. package/types/augmentations.d.ts +9 -0
  270. package/types/callback.d.ts +8 -0
  271. package/types/collection.d.ts +49 -0
  272. package/types/connection.d.ts +297 -0
  273. package/types/cursor.d.ts +67 -0
  274. package/types/document.d.ts +374 -0
  275. package/types/error.d.ts +143 -0
  276. package/types/expressions.d.ts +3053 -0
  277. package/types/helpers.d.ts +32 -0
  278. package/types/index.d.ts +1056 -0
  279. package/types/indexes.d.ts +97 -0
  280. package/types/inferhydrateddoctype.d.ts +115 -0
  281. package/types/inferrawdoctype.d.ts +135 -0
  282. package/types/inferschematype.d.ts +337 -0
  283. package/types/middlewares.d.ts +59 -0
  284. package/types/models.d.ts +1306 -0
  285. package/types/mongooseoptions.d.ts +228 -0
  286. package/types/pipelinestage.d.ts +333 -0
  287. package/types/populate.d.ts +53 -0
  288. package/types/query.d.ts +934 -0
  289. package/types/schemaoptions.d.ts +282 -0
  290. package/types/schematypes.d.ts +654 -0
  291. package/types/session.d.ts +32 -0
  292. package/types/types.d.ts +109 -0
  293. package/types/utility.d.ts +175 -0
  294. package/types/validation.d.ts +39 -0
  295. package/types/virtuals.d.ts +14 -0
@@ -0,0 +1,506 @@
1
+ /*!
2
+ * Module dependencies.
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const MongooseConnection = require('../../connection');
8
+ const MongooseError = require('../../error/index');
9
+ const STATES = require('../../connectionState');
10
+ const mongodb = require('mongodb');
11
+ const pkg = require('../../../package.json');
12
+ const processConnectionOptions = require('../../helpers/processConnectionOptions');
13
+ const setTimeout = require('../../helpers/timers').setTimeout;
14
+ const utils = require('../../utils');
15
+ const Schema = require('../../schema');
16
+
17
+ /**
18
+ * A [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) connection implementation.
19
+ *
20
+ * @inherits Connection
21
+ * @api private
22
+ */
23
+
24
+ function NativeConnection() {
25
+ MongooseConnection.apply(this, arguments);
26
+ this._listening = false;
27
+ // Tracks the last time (as unix timestamp) the connection received a
28
+ // serverHeartbeatSucceeded or serverHeartbeatFailed event from the underlying MongoClient.
29
+ // If we haven't received one in a while (like due to a frozen AWS Lambda container) then
30
+ // `readyState` is likely stale.
31
+ this._lastHeartbeatAt = null;
32
+ }
33
+
34
+ /**
35
+ * Expose the possible connection states.
36
+ * @api public
37
+ */
38
+
39
+ NativeConnection.STATES = STATES;
40
+
41
+ /*!
42
+ * Inherits from Connection.
43
+ */
44
+
45
+ Object.setPrototypeOf(NativeConnection.prototype, MongooseConnection.prototype);
46
+
47
+ /**
48
+ * Switches to a different database using the same connection pool.
49
+ *
50
+ * Returns a new connection object, with the new db. If you set the `useCache`
51
+ * option, `useDb()` will cache connections by `name`.
52
+ *
53
+ * **Note:** Calling `close()` on a `useDb()` connection will close the base connection as well.
54
+ *
55
+ * @param {String} name The database name
56
+ * @param {Object} [options]
57
+ * @param {Boolean} [options.useCache=false] If true, cache results so calling `useDb()` multiple times with the same name only creates 1 connection object.
58
+ * @return {Connection} New Connection Object
59
+ * @api public
60
+ */
61
+
62
+ NativeConnection.prototype.useDb = function(name, options) {
63
+ // Return immediately if cached
64
+ options = options || {};
65
+ if (options.useCache && this.relatedDbs[name]) {
66
+ return this.relatedDbs[name];
67
+ }
68
+
69
+ // we have to manually copy all of the attributes...
70
+ const newConn = new this.constructor();
71
+ newConn.name = name;
72
+ newConn.base = this.base;
73
+ newConn.collections = {};
74
+ newConn.models = {};
75
+ newConn.replica = this.replica;
76
+ newConn.config = Object.assign({}, this.config, newConn.config);
77
+ newConn.name = this.name;
78
+ newConn.options = this.options;
79
+ newConn._readyState = this._readyState;
80
+ newConn._closeCalled = this._closeCalled;
81
+ newConn._hasOpened = this._hasOpened;
82
+ newConn._listening = false;
83
+ newConn._parent = this;
84
+
85
+ newConn.host = this.host;
86
+ newConn.port = this.port;
87
+ newConn.user = this.user;
88
+ newConn.pass = this.pass;
89
+
90
+ // First, when we create another db object, we are not guaranteed to have a
91
+ // db object to work with. So, in the case where we have a db object and it
92
+ // is connected, we can just proceed with setting everything up. However, if
93
+ // we do not have a db or the state is not connected, then we need to wait on
94
+ // the 'open' event of the connection before doing the rest of the setup
95
+ // the 'connected' event is the first time we'll have access to the db object
96
+
97
+ const _this = this;
98
+
99
+ newConn.client = _this.client;
100
+
101
+ if (this.db && this._readyState === STATES.connected) {
102
+ wireup();
103
+ } else {
104
+ this._queue.push({ fn: wireup });
105
+ }
106
+
107
+ function wireup() {
108
+ newConn.client = _this.client;
109
+ newConn.db = _this.client.db(name);
110
+ newConn._lastHeartbeatAt = _this._lastHeartbeatAt;
111
+ newConn.onOpen();
112
+ }
113
+
114
+ newConn.name = name;
115
+
116
+ // push onto the otherDbs stack, this is used when state changes
117
+ this.otherDbs.push(newConn);
118
+ newConn.otherDbs.push(this);
119
+
120
+ // push onto the relatedDbs cache, this is used when state changes
121
+ if (options?.useCache) {
122
+ this.relatedDbs[newConn.name] = newConn;
123
+ newConn.relatedDbs = this.relatedDbs;
124
+ }
125
+
126
+ return newConn;
127
+ };
128
+
129
+ /**
130
+ * Runs a [db-level aggregate()](https://www.mongodb.com/docs/manual/reference/method/db.aggregate/) on this connection's underlying `db`
131
+ *
132
+ * @param {Array} pipeline
133
+ * @param {Object} [options]
134
+ */
135
+
136
+ NativeConnection.prototype.aggregate = function aggregate(pipeline, options) {
137
+ return new this.base.Aggregate(null, this).append(pipeline).option(options ?? {});
138
+ };
139
+
140
+ /**
141
+ * Removes the database connection with the given name created with `useDb()`.
142
+ *
143
+ * Throws an error if the database connection was not found.
144
+ *
145
+ * #### Example:
146
+ *
147
+ * // Connect to `initialdb` first
148
+ * const conn = await mongoose.createConnection('mongodb://127.0.0.1:27017/initialdb').asPromise();
149
+ *
150
+ * // Creates an un-cached connection to `mydb`
151
+ * const db = conn.useDb('mydb');
152
+ *
153
+ * // Closes `db`, and removes `db` from `conn.relatedDbs` and `conn.otherDbs`
154
+ * await conn.removeDb('mydb');
155
+ *
156
+ * @method removeDb
157
+ * @memberOf Connection
158
+ * @param {String} name The database name
159
+ * @return {Connection} this
160
+ */
161
+
162
+ NativeConnection.prototype.removeDb = function removeDb(name) {
163
+ const dbs = this.otherDbs.filter(db => db.name === name);
164
+ if (!dbs.length) {
165
+ throw new MongooseError(`No connections to database "${name}" found`);
166
+ }
167
+
168
+ for (const db of dbs) {
169
+ db._closeCalled = true;
170
+ db._destroyCalled = true;
171
+ db._readyState = STATES.disconnected;
172
+ db.$wasForceClosed = true;
173
+ }
174
+ delete this.relatedDbs[name];
175
+ this.otherDbs = this.otherDbs.filter(db => db.name !== name);
176
+ };
177
+
178
+ /**
179
+ * Closes the connection
180
+ *
181
+ * @param {Boolean} [force]
182
+ * @return {Connection} this
183
+ * @api private
184
+ */
185
+
186
+ NativeConnection.prototype.doClose = async function doClose(force) {
187
+ if (this.client == null) {
188
+ return this;
189
+ }
190
+
191
+ let skipCloseClient = false;
192
+ if (force != null && typeof force === 'object') {
193
+ skipCloseClient = force.skipCloseClient;
194
+ force = force.force;
195
+ }
196
+
197
+ if (skipCloseClient) {
198
+ return this;
199
+ }
200
+
201
+ await this.client.close(force);
202
+ // Defer because the driver will wait at least 1ms before finishing closing
203
+ // the pool, see https://github.com/mongodb-js/mongodb-core/blob/a8f8e4ce41936babc3b9112bf42d609779f03b39/lib/connection/pool.js#L1026-L1030.
204
+ // If there's queued operations, you may still get some background work
205
+ // after the callback is called.
206
+ await new Promise(resolve => setTimeout(resolve, 1));
207
+
208
+ return this;
209
+ };
210
+
211
+ /**
212
+ * Implementation of `listDatabases()` for MongoDB driver
213
+ *
214
+ * @return Promise
215
+ * @api public
216
+ */
217
+
218
+ NativeConnection.prototype.listDatabases = async function listDatabases() {
219
+ await this._waitForConnect();
220
+
221
+ return await this.db.admin().listDatabases();
222
+ };
223
+
224
+ /*!
225
+ * ignore
226
+ */
227
+
228
+ NativeConnection.prototype.createClient = async function createClient(uri, options) {
229
+ if (typeof uri !== 'string') {
230
+ throw new MongooseError('The `uri` parameter to `openUri()` must be a ' +
231
+ `string, got "${typeof uri}". Make sure the first parameter to ` +
232
+ '`mongoose.connect()` or `mongoose.createConnection()` is a string.');
233
+ }
234
+
235
+ if (this._destroyCalled) {
236
+ throw new MongooseError(
237
+ 'Connection has been closed and destroyed, and cannot be used for re-opening the connection. ' +
238
+ 'Please create a new connection with `mongoose.createConnection()` or `mongoose.connect()`.'
239
+ );
240
+ }
241
+
242
+ if (this.readyState === STATES.connecting || this.readyState === STATES.connected) {
243
+ if (this._connectionString !== uri) {
244
+ throw new MongooseError('Can\'t call `openUri()` on an active connection with ' +
245
+ 'different connection strings. Make sure you aren\'t calling `mongoose.connect()` ' +
246
+ 'multiple times. See: https://mongoosejs.com/docs/connections.html#multiple_connections');
247
+ }
248
+ }
249
+
250
+ options = processConnectionOptions(uri, options);
251
+
252
+ if (options) {
253
+
254
+ const autoIndex = options.config?.autoIndex ?? options.autoIndex;
255
+ if (autoIndex != null) {
256
+ this.config.autoIndex = autoIndex !== false;
257
+ delete options.config;
258
+ delete options.autoIndex;
259
+ }
260
+
261
+ if ('autoCreate' in options) {
262
+ this.config.autoCreate = !!options.autoCreate;
263
+ delete options.autoCreate;
264
+ }
265
+
266
+ if ('sanitizeFilter' in options) {
267
+ this.config.sanitizeFilter = options.sanitizeFilter;
268
+ delete options.sanitizeFilter;
269
+ }
270
+
271
+ if ('autoSearchIndex' in options) {
272
+ this.config.autoSearchIndex = options.autoSearchIndex;
273
+ delete options.autoSearchIndex;
274
+ }
275
+
276
+ if ('bufferTimeoutMS' in options) {
277
+ this.config.bufferTimeoutMS = options.bufferTimeoutMS;
278
+ delete options.bufferTimeoutMS;
279
+ }
280
+
281
+ // Backwards compat
282
+ if (options.user || options.pass) {
283
+ options.auth = options.auth || {};
284
+ options.auth.username = options.user;
285
+ options.auth.password = options.pass;
286
+
287
+ this.user = options.user;
288
+ this.pass = options.pass;
289
+ }
290
+ delete options.user;
291
+ delete options.pass;
292
+
293
+ if (options.bufferCommands != null) {
294
+ this.config.bufferCommands = options.bufferCommands;
295
+ delete options.bufferCommands;
296
+ }
297
+ } else {
298
+ options = {};
299
+ }
300
+
301
+ this._connectionOptions = options;
302
+ const dbName = options.dbName;
303
+ if (dbName != null) {
304
+ this.$dbName = dbName;
305
+ }
306
+ delete options.dbName;
307
+
308
+ if (!utils.hasUserDefinedProperty(options, 'driverInfo')) {
309
+ options.driverInfo = {
310
+ name: 'Mongoose',
311
+ version: pkg.version
312
+ };
313
+ }
314
+
315
+ const { schemaMap, encryptedFieldsMap } = this._buildEncryptionSchemas();
316
+
317
+ if ((utils.hasOwnKeys(schemaMap) || utils.hasOwnKeys(encryptedFieldsMap)) && !options.autoEncryption) {
318
+ throw new Error('Must provide `autoEncryption` when connecting with encrypted schemas.');
319
+ }
320
+
321
+ if (utils.hasOwnKeys(schemaMap)) {
322
+ options.autoEncryption.schemaMap = schemaMap;
323
+ }
324
+
325
+ if (utils.hasOwnKeys(encryptedFieldsMap)) {
326
+ options.autoEncryption.encryptedFieldsMap = encryptedFieldsMap;
327
+ }
328
+
329
+ this.readyState = STATES.connecting;
330
+ this._connectionString = uri;
331
+
332
+ let client;
333
+ try {
334
+ client = new mongodb.MongoClient(uri, options);
335
+ } catch (error) {
336
+ this.readyState = STATES.disconnected;
337
+ throw error;
338
+ }
339
+ this.client = client;
340
+
341
+ client.setMaxListeners(0);
342
+ await client.connect();
343
+
344
+ _setClient(this, client, options, dbName);
345
+
346
+ for (const db of this.otherDbs) {
347
+ _setClient(db, client, {}, db.name);
348
+ }
349
+ return this;
350
+ };
351
+
352
+ /**
353
+ * Given a connection, which may or may not have encrypted models, build
354
+ * a schemaMap and/or an encryptedFieldsMap for the connection, combining all models
355
+ * into a single schemaMap and encryptedFields map.
356
+ *
357
+ * @returns the generated schemaMap and encryptedFieldsMap
358
+ */
359
+ NativeConnection.prototype._buildEncryptionSchemas = function() {
360
+ const qeMappings = {};
361
+ const csfleMappings = {};
362
+
363
+ const encryptedModels = Object.values(this.models).filter(model => model.schema._hasEncryptedFields());
364
+
365
+ // If discriminators are configured for the collection, there might be multiple models
366
+ // pointing to the same namespace. For this scenario, we merge all the schemas for each namespace
367
+ // into a single schema and then generate a schemaMap/encryptedFieldsMap for the combined schema.
368
+ for (const model of encryptedModels) {
369
+ const { schema, collection: { collectionName } } = model;
370
+ const namespace = `${this.$dbName}.${collectionName}`;
371
+ const mappings = schema.encryptionType() === 'csfle' ? csfleMappings : qeMappings;
372
+
373
+ mappings[namespace] ??= new Schema({}, { encryptionType: schema.encryptionType() });
374
+
375
+ const isNonRootDiscriminator = schema.discriminatorMapping && !schema.discriminatorMapping.isRoot;
376
+ if (isNonRootDiscriminator) {
377
+ const rootSchema = schema._baseSchema;
378
+ schema.eachPath((pathname) => {
379
+ if (rootSchema.path(pathname)) return;
380
+ if (!mappings[namespace]._hasEncryptedField(pathname)) return;
381
+
382
+ throw new Error(`Cannot have duplicate keys in discriminators with encryption. key=${pathname}`);
383
+ });
384
+ }
385
+
386
+ mappings[namespace].add(schema);
387
+ }
388
+
389
+ const schemaMap = Object.fromEntries(Object.entries(csfleMappings).map(
390
+ ([namespace, schema]) => ([namespace, schema._buildSchemaMap()])
391
+ ));
392
+
393
+ const encryptedFieldsMap = Object.fromEntries(Object.entries(qeMappings).map(
394
+ ([namespace, schema]) => ([namespace, schema._buildEncryptedFields()])
395
+ ));
396
+
397
+ return {
398
+ schemaMap, encryptedFieldsMap
399
+ };
400
+ };
401
+
402
+ /*!
403
+ * ignore
404
+ */
405
+
406
+ NativeConnection.prototype.setClient = function setClient(client) {
407
+ if (!(client instanceof mongodb.MongoClient)) {
408
+ throw new MongooseError('Must call `setClient()` with an instance of MongoClient');
409
+ }
410
+ if (this.readyState !== STATES.disconnected) {
411
+ throw new MongooseError('Cannot call `setClient()` on a connection that is already connected.');
412
+ }
413
+ if (client.topology == null) {
414
+ throw new MongooseError('Cannot call `setClient()` with a MongoClient that you have not called `connect()` on yet.');
415
+ }
416
+
417
+ this._connectionString = client.s.url;
418
+ _setClient(this, client, {}, client.s.options.dbName);
419
+
420
+ for (const model of Object.values(this.models)) {
421
+ // Errors handled internally, so safe to ignore error
422
+ model.init().catch(function $modelInitNoop() {});
423
+ }
424
+
425
+ return this;
426
+ };
427
+
428
+ /*!
429
+ * ignore
430
+ */
431
+
432
+ function _setClient(conn, client, options, dbName) {
433
+ const db = dbName != null ? client.db(dbName) : client.db();
434
+ conn.db = db;
435
+ conn.client = client;
436
+ conn.host = client?.s?.options?.hosts?.[0]?.host;
437
+ conn.port = client?.s?.options?.hosts?.[0]?.port;
438
+ conn.name = dbName != null ? dbName : db.databaseName;
439
+ conn._closeCalled = client._closeCalled;
440
+
441
+ const _handleReconnect = () => {
442
+ // If we aren't disconnected, we assume this reconnect is due to a
443
+ // socket timeout. If there's no activity on a socket for
444
+ // `socketTimeoutMS`, the driver will attempt to reconnect and emit
445
+ // this event.
446
+ if (conn.readyState !== STATES.connected) {
447
+ conn.readyState = STATES.connected;
448
+ conn.emit('reconnect');
449
+ conn.emit('reconnected');
450
+ conn.onOpen();
451
+ }
452
+ };
453
+
454
+ const type = client?.topology?.description?.type || '';
455
+
456
+ if (type === 'Single') {
457
+ client.on('serverDescriptionChanged', ev => {
458
+ const newDescription = ev.newDescription;
459
+ if (newDescription.type === 'Unknown') {
460
+ conn.readyState = STATES.disconnected;
461
+ } else {
462
+ _handleReconnect();
463
+ }
464
+ });
465
+ } else if (type.startsWith('ReplicaSet')) {
466
+ client.on('topologyDescriptionChanged', ev => {
467
+ // Emit disconnected if we've lost connectivity to the primary
468
+ const description = ev.newDescription;
469
+ if (conn.readyState === STATES.connected && description.type !== 'ReplicaSetWithPrimary') {
470
+ // Implicitly emits 'disconnected'
471
+ conn.readyState = STATES.disconnected;
472
+ } else if (conn.readyState === STATES.disconnected && description.type === 'ReplicaSetWithPrimary') {
473
+ _handleReconnect();
474
+ }
475
+ });
476
+ }
477
+
478
+ conn._lastHeartbeatAt = null;
479
+
480
+ client.on('serverHeartbeatSucceeded', () => {
481
+ conn._lastHeartbeatAt = Date.now();
482
+ for (const otherDb of conn.otherDbs) {
483
+ otherDb._lastHeartbeatAt = conn._lastHeartbeatAt;
484
+ }
485
+ });
486
+
487
+ if (options.monitorCommands) {
488
+ client.on('commandStarted', (data) => conn.emit('commandStarted', data));
489
+ client.on('commandFailed', (data) => conn.emit('commandFailed', data));
490
+ client.on('commandSucceeded', (data) => conn.emit('commandSucceeded', data));
491
+ }
492
+
493
+ conn.onOpen();
494
+
495
+ for (const i in conn.collections) {
496
+ if (Object.hasOwn(conn.collections, i)) {
497
+ conn.collections[i].onOpen();
498
+ }
499
+ }
500
+ }
501
+
502
+ /*!
503
+ * Module exports.
504
+ */
505
+
506
+ module.exports = NativeConnection;
@@ -0,0 +1,10 @@
1
+ /*!
2
+ * Module exports.
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ exports.BulkWriteResult = require('./bulkWriteResult');
8
+ exports.Collection = require('./collection');
9
+ exports.Connection = require('./connection');
10
+ exports.ClientEncryption = require('mongodb').ClientEncryption;
@@ -0,0 +1,29 @@
1
+ /*!
2
+ * Module dependencies.
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const MongooseError = require('./mongooseError');
8
+
9
+ /**
10
+ * MissingSchema Error constructor.
11
+ */
12
+
13
+ class MissingSchemaError extends MongooseError {
14
+
15
+ constructor() {
16
+ super('Schema hasn\'t been registered for document.\n'
17
+ + 'Use mongoose.Document(name, schema)');
18
+ }
19
+ }
20
+
21
+ Object.defineProperty(MissingSchemaError.prototype, 'name', {
22
+ value: 'MongooseError'
23
+ });
24
+
25
+ /*!
26
+ * exports
27
+ */
28
+
29
+ module.exports = MissingSchemaError;
@@ -0,0 +1,44 @@
1
+ /*!
2
+ * Module dependencies.
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const MongooseError = require('./mongooseError');
8
+
9
+
10
+ /**
11
+ * If the underwriting `bulkWrite()` for `bulkSave()` succeeded, but wasn't able to update or
12
+ * insert all documents, we throw this error.
13
+ *
14
+ * @api private
15
+ */
16
+
17
+ class MongooseBulkSaveIncompleteError extends MongooseError {
18
+ constructor(modelName, documents, bulkWriteResult) {
19
+ const matchedCount = bulkWriteResult?.matchedCount ?? 0;
20
+ const insertedCount = bulkWriteResult?.insertedCount ?? 0;
21
+ let preview = documents.map(doc => doc._id).join(', ');
22
+ if (preview.length > 100) {
23
+ preview = preview.slice(0, 100) + '...';
24
+ }
25
+
26
+ const numDocumentsNotUpdated = documents.length - matchedCount - insertedCount;
27
+ super(`${modelName}.bulkSave() was not able to update ${numDocumentsNotUpdated} of the given documents due to incorrect version or optimistic concurrency, document ids: ${preview}`);
28
+
29
+ this.modelName = modelName;
30
+ this.documents = documents;
31
+ this.bulkWriteResult = bulkWriteResult;
32
+ this.numDocumentsNotUpdated = numDocumentsNotUpdated;
33
+ }
34
+ }
35
+
36
+ Object.defineProperty(MongooseBulkSaveIncompleteError.prototype, 'name', {
37
+ value: 'MongooseBulkSaveIncompleteError'
38
+ });
39
+
40
+ /*!
41
+ * exports
42
+ */
43
+
44
+ module.exports = MongooseBulkSaveIncompleteError;
@@ -0,0 +1,41 @@
1
+ /*!
2
+ * Module dependencies.
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const MongooseError = require('./');
8
+
9
+
10
+ /**
11
+ * If `bulkWrite()` or `insertMany()` has validation errors, but
12
+ * all valid operations succeed, and 'throwOnValidationError' is true,
13
+ * Mongoose will throw this error.
14
+ *
15
+ * @api private
16
+ */
17
+
18
+ class MongooseBulkWriteError extends MongooseError {
19
+ constructor(validationErrors, results, rawResult, operation) {
20
+ let preview = validationErrors.map(e => e.message).join(', ');
21
+ if (preview.length > 200) {
22
+ preview = preview.slice(0, 200) + '...';
23
+ }
24
+ super(`${operation} failed with ${validationErrors.length} Mongoose validation errors: ${preview}`);
25
+
26
+ this.validationErrors = validationErrors;
27
+ this.results = results;
28
+ this.rawResult = rawResult;
29
+ this.operation = operation;
30
+ }
31
+ }
32
+
33
+ Object.defineProperty(MongooseBulkWriteError.prototype, 'name', {
34
+ value: 'MongooseBulkWriteError'
35
+ });
36
+
37
+ /*!
38
+ * exports
39
+ */
40
+
41
+ module.exports = MongooseBulkWriteError;