@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
package/lib/driver.js ADDED
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * ignore
5
+ */
6
+
7
+ let driver = null;
8
+
9
+ module.exports.get = function() {
10
+ return driver;
11
+ };
12
+
13
+ module.exports.set = function(v) {
14
+ driver = v;
15
+ };
@@ -0,0 +1,4 @@
1
+
2
+ # Driver Spec
3
+
4
+ TODO
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ const BulkWriteResult = require('mongodb/lib/bulk/common').BulkWriteResult;
4
+
5
+ module.exports = BulkWriteResult;
@@ -0,0 +1,393 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * Module dependencies.
5
+ */
6
+
7
+ const MongooseCollection = require('../../collection');
8
+ const MongooseError = require('../../error/mongooseError');
9
+ const Collection = require('mongodb').Collection;
10
+ const ObjectId = require('../../types/objectid');
11
+ const getConstructorName = require('../../helpers/getConstructorName');
12
+ const internalToObjectOptions = require('../../options').internalToObjectOptions;
13
+ const stream = require('stream');
14
+ const util = require('util');
15
+
16
+ const formatToObjectOptions = Object.freeze({ ...internalToObjectOptions, copyTrustedSymbol: false });
17
+
18
+ /**
19
+ * A [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) collection implementation.
20
+ *
21
+ * All methods methods from the [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) driver are copied and wrapped in queue management.
22
+ *
23
+ * @inherits Collection https://mongodb.github.io/node-mongodb-native/4.9/classes/Collection.html
24
+ * @api private
25
+ */
26
+
27
+ function NativeCollection(name, conn, options) {
28
+ this.collection = null;
29
+ this.Promise = options.Promise || Promise;
30
+ this.modelName = options.modelName;
31
+ delete options.modelName;
32
+ this._closed = false;
33
+ MongooseCollection.apply(this, arguments);
34
+ }
35
+
36
+ /*!
37
+ * Inherit from abstract Collection.
38
+ */
39
+
40
+ Object.setPrototypeOf(NativeCollection.prototype, MongooseCollection.prototype);
41
+
42
+ /**
43
+ * Called when the connection opens.
44
+ *
45
+ * @api private
46
+ */
47
+
48
+ NativeCollection.prototype.onOpen = function() {
49
+ this.collection = this.conn.db.collection(this.name);
50
+ MongooseCollection.prototype.onOpen.call(this);
51
+ return this.collection;
52
+ };
53
+
54
+ /**
55
+ * Called when the connection closes
56
+ *
57
+ * @api private
58
+ */
59
+
60
+ NativeCollection.prototype.onClose = function(force) {
61
+ MongooseCollection.prototype.onClose.call(this, force);
62
+ };
63
+
64
+ /**
65
+ * Helper to get the collection, in case `this.collection` isn't set yet.
66
+ * May happen if `bufferCommands` is false and created the model when
67
+ * Mongoose was disconnected.
68
+ *
69
+ * @api private
70
+ */
71
+
72
+ NativeCollection.prototype._getCollection = function _getCollection() {
73
+ if (this.collection) {
74
+ return this.collection;
75
+ }
76
+ if (this.conn.db != null) {
77
+ this.collection = this.conn.db.collection(this.name);
78
+ return this.collection;
79
+ }
80
+ return null;
81
+ };
82
+
83
+ /**
84
+ * Copy the collection methods and make them subject to queues
85
+ * @param {Number|String} I
86
+ * @api private
87
+ */
88
+
89
+ function iter(i) {
90
+ NativeCollection.prototype[i] = function() {
91
+ const collection = this._getCollection();
92
+ const args = Array.from(arguments);
93
+ const _this = this;
94
+ const globalDebug = _this?.conn?.base?.options?.debug;
95
+ const connectionDebug = _this?.conn?.options?.debug;
96
+ const debug = connectionDebug == null ? globalDebug : connectionDebug;
97
+ const opId = new ObjectId();
98
+
99
+ // If user force closed, queueing will hang forever. See #5664
100
+ if (this.conn.$wasForceClosed) {
101
+ const error = new MongooseError('Connection was force closed');
102
+ if (args.length > 0 &&
103
+ typeof args[args.length - 1] === 'function') {
104
+ args[args.length - 1](error);
105
+ return;
106
+ } else {
107
+ throw error;
108
+ }
109
+ }
110
+
111
+ let timeout = null;
112
+ let waitForBufferPromise = null;
113
+ if (this._shouldBufferCommands() && this.buffer) {
114
+ this.conn.emit('buffer', {
115
+ _id: opId,
116
+ modelName: _this.modelName,
117
+ collectionName: _this.name,
118
+ method: i,
119
+ args: args
120
+ });
121
+
122
+ const bufferTimeoutMS = this._getBufferTimeoutMS();
123
+ waitForBufferPromise = new Promise((resolve, reject) => {
124
+ this.addQueue(resolve);
125
+
126
+ timeout = setTimeout(() => {
127
+ const removed = this.removeQueue(resolve);
128
+ if (removed) {
129
+ const message = 'Operation `' + this.name + '.' + i + '()` buffering timed out after ' +
130
+ bufferTimeoutMS + 'ms';
131
+ const err = new MongooseError(message);
132
+ this.conn.emit('buffer-end', { _id: opId, modelName: _this.modelName, collectionName: _this.name, method: i, error: err });
133
+ reject(err);
134
+ }
135
+ }, bufferTimeoutMS);
136
+ });
137
+
138
+ return waitForBufferPromise.then(() => {
139
+ if (timeout) {
140
+ clearTimeout(timeout);
141
+ }
142
+ return this[i].apply(this, args);
143
+ });
144
+ }
145
+
146
+ if (debug) {
147
+ if (typeof debug === 'function') {
148
+ let argsToAdd = null;
149
+ if (typeof args[args.length - 1] == 'function') {
150
+ argsToAdd = args.slice(0, args.length - 1);
151
+ } else {
152
+ argsToAdd = args;
153
+ }
154
+ debug.apply(_this,
155
+ [_this.name, i].concat(argsToAdd));
156
+ } else if (debug instanceof stream.Writable) {
157
+ this.$printToStream(_this.name, i, args, debug);
158
+ } else {
159
+ const color = debug.color == null ? true : debug.color;
160
+ const shell = debug.shell == null ? false : debug.shell;
161
+ this.$print(_this.name, i, args, color, shell);
162
+ }
163
+ }
164
+
165
+ this.conn.emit('operation-start', { _id: opId, modelName: _this.modelName, collectionName: this.name, method: i, params: args });
166
+
167
+ try {
168
+ if (collection == null) {
169
+ const message = 'Cannot call `' + this.name + '.' + i + '()` before initial connection ' +
170
+ 'is complete if `bufferCommands = false`. Make sure you `await mongoose.connect()` if ' +
171
+ 'you have `bufferCommands = false`.';
172
+ throw new MongooseError(message);
173
+ }
174
+
175
+ const ret = collection[i].apply(collection, args);
176
+ if (typeof ret?.then === 'function') {
177
+ return ret.then(
178
+ result => {
179
+ if (timeout != null) {
180
+ clearTimeout(timeout);
181
+ }
182
+ this.conn.emit('operation-end', { _id: opId, modelName: _this.modelName, collectionName: this.name, method: i, result });
183
+ return result;
184
+ },
185
+ error => {
186
+ if (timeout != null) {
187
+ clearTimeout(timeout);
188
+ }
189
+ this.conn.emit('operation-end', { _id: opId, modelName: _this.modelName, collectionName: this.name, method: i, error });
190
+ throw error;
191
+ }
192
+ );
193
+ }
194
+
195
+ this.conn.emit('operation-end', { _id: opId, modelName: _this.modelName, collectionName: this.name, method: i, result: ret });
196
+ if (timeout != null) {
197
+ clearTimeout(timeout);
198
+ }
199
+ return ret;
200
+ } catch (error) {
201
+ if (timeout != null) {
202
+ clearTimeout(timeout);
203
+ }
204
+ this.conn.emit('operation-end', { _id: opId, modelName: _this.modelName, collectionName: this.name, method: i, error: error });
205
+ throw error;
206
+ }
207
+ };
208
+ }
209
+
210
+ for (const key of Object.getOwnPropertyNames(Collection.prototype)) {
211
+ // Janky hack to work around gh-3005 until we can get rid of the mongoose
212
+ // collection abstraction
213
+ const descriptor = Object.getOwnPropertyDescriptor(Collection.prototype, key);
214
+ // Skip properties with getters because they may throw errors (gh-8528)
215
+ if (descriptor.get !== undefined) {
216
+ continue;
217
+ }
218
+ if (typeof Collection.prototype[key] !== 'function') {
219
+ continue;
220
+ }
221
+
222
+ iter(key);
223
+ }
224
+
225
+ /**
226
+ * Debug print helper
227
+ *
228
+ * @api public
229
+ * @method $print
230
+ */
231
+
232
+ NativeCollection.prototype.$print = function(name, i, args, color, shell) {
233
+ const moduleName = color ? '\x1B[0;36mMongoose:\x1B[0m ' : 'Mongoose: ';
234
+ const functionCall = [name, i].join('.');
235
+ const _args = [];
236
+ for (let j = args.length - 1; j >= 0; --j) {
237
+ if (this.$format(args[j]) || _args.length) {
238
+ _args.unshift(this.$format(args[j], color, shell));
239
+ }
240
+ }
241
+ const params = '(' + _args.join(', ') + ')';
242
+
243
+ console.info(moduleName + functionCall + params);
244
+ };
245
+
246
+ /**
247
+ * Debug print helper
248
+ *
249
+ * @api public
250
+ * @method $print
251
+ */
252
+
253
+ NativeCollection.prototype.$printToStream = function(name, i, args, stream) {
254
+ const functionCall = [name, i].join('.');
255
+ const _args = [];
256
+ for (let j = args.length - 1; j >= 0; --j) {
257
+ if (this.$format(args[j]) || _args.length) {
258
+ _args.unshift(this.$format(args[j]));
259
+ }
260
+ }
261
+ const params = '(' + _args.join(', ') + ')';
262
+
263
+ stream.write(functionCall + params, 'utf8');
264
+ };
265
+
266
+ /**
267
+ * Formatter for debug print args
268
+ *
269
+ * @api public
270
+ * @method $format
271
+ */
272
+
273
+ NativeCollection.prototype.$format = function(arg, color, shell) {
274
+ const type = typeof arg;
275
+ if (type === 'function' || type === 'undefined') return '';
276
+ return format(arg, false, color, shell);
277
+ };
278
+
279
+ /**
280
+ * Debug print helper
281
+ * @param {Any} representation
282
+ * @api private
283
+ */
284
+
285
+ function inspectable(representation) {
286
+ const ret = {
287
+ inspect: function() { return representation; }
288
+ };
289
+ if (util.inspect.custom) {
290
+ ret[util.inspect.custom] = ret.inspect;
291
+ }
292
+ return ret;
293
+ }
294
+ function map(o) {
295
+ return format(o, true);
296
+ }
297
+ function formatObjectId(x, key) {
298
+ x[key] = inspectable('ObjectId("' + x[key].toHexString() + '")');
299
+ }
300
+ function formatDate(x, key, shell) {
301
+ if (shell) {
302
+ x[key] = inspectable('ISODate("' + x[key].toUTCString() + '")');
303
+ } else {
304
+ x[key] = inspectable('new Date("' + x[key].toUTCString() + '")');
305
+ }
306
+ }
307
+ function format(obj, sub, color, shell) {
308
+ if (typeof obj?.toBSON === 'function') {
309
+ obj = obj.toBSON();
310
+ }
311
+ if (obj == null) {
312
+ return obj;
313
+ }
314
+
315
+ const clone = require('../../helpers/clone');
316
+ // `sub` indicates `format()` was called recursively, so skip cloning because we already
317
+ // did a deep clone on the top-level object.
318
+ let x = sub ? obj : clone(obj, formatToObjectOptions);
319
+ const constructorName = getConstructorName(x);
320
+
321
+ if (constructorName === 'Binary') {
322
+ x = 'BinData(' + x.sub_type + ', "' + x.toString('base64') + '")';
323
+ } else if (constructorName === 'ObjectId') {
324
+ x = inspectable('ObjectId("' + x.toHexString() + '")');
325
+ } else if (constructorName === 'Date') {
326
+ x = inspectable('new Date("' + x.toUTCString() + '")');
327
+ } else if (constructorName === 'Object') {
328
+ const keys = Object.keys(x);
329
+ const numKeys = keys.length;
330
+ let key;
331
+ for (let i = 0; i < numKeys; ++i) {
332
+ key = keys[i];
333
+ if (x[key]) {
334
+ let error;
335
+ if (typeof x[key].toBSON === 'function') {
336
+ try {
337
+ // `session.toBSON()` throws an error. This means we throw errors
338
+ // in debug mode when using transactions, see gh-6712. As a
339
+ // workaround, catch `toBSON()` errors, try to serialize without
340
+ // `toBSON()`, and rethrow if serialization still fails.
341
+ x[key] = x[key].toBSON();
342
+ } catch (_error) {
343
+ error = _error;
344
+ }
345
+ }
346
+ const _constructorName = getConstructorName(x[key]);
347
+ if (_constructorName === 'Binary') {
348
+ x[key] = 'BinData(' + x[key].sub_type + ', "' +
349
+ x[key].buffer.toString('base64') + '")';
350
+ } else if (_constructorName === 'Object') {
351
+ x[key] = format(x[key], true);
352
+ } else if (_constructorName === 'ObjectId') {
353
+ formatObjectId(x, key);
354
+ } else if (_constructorName === 'Date') {
355
+ formatDate(x, key, shell);
356
+ } else if (_constructorName === 'ClientSession') {
357
+ x[key] = inspectable('ClientSession("' +
358
+ (x[key]?.id?.id?.buffer || '').toString('hex') + '")');
359
+ } else if (Array.isArray(x[key])) {
360
+ x[key] = x[key].map(map);
361
+ } else if (error != null) {
362
+ // If there was an error with `toBSON()` and the object wasn't
363
+ // already converted to a string representation, rethrow it.
364
+ // Open to better ideas on how to handle this.
365
+ throw error;
366
+ }
367
+ }
368
+ }
369
+ }
370
+ if (sub) {
371
+ return x;
372
+ }
373
+
374
+ return util.
375
+ inspect(x, false, 10, color).
376
+ replace(/\n/g, '').
377
+ replace(/\s{2,}/g, ' ');
378
+ }
379
+
380
+ /**
381
+ * Retrieves information about this collections indexes.
382
+ *
383
+ * @method getIndexes
384
+ * @api public
385
+ */
386
+
387
+ NativeCollection.prototype.getIndexes = NativeCollection.prototype.indexInformation;
388
+
389
+ /*!
390
+ * Module exports.
391
+ */
392
+
393
+ module.exports = NativeCollection;