@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.
- package/LICENSE.md +22 -0
- package/README.md +397 -0
- package/SECURITY.md +1 -0
- package/eslint.config.mjs +198 -0
- package/index.js +64 -0
- package/lib/aggregate.js +1189 -0
- package/lib/cast/bigint.js +46 -0
- package/lib/cast/boolean.js +32 -0
- package/lib/cast/date.js +41 -0
- package/lib/cast/decimal128.js +39 -0
- package/lib/cast/double.js +50 -0
- package/lib/cast/int32.js +36 -0
- package/lib/cast/number.js +42 -0
- package/lib/cast/objectid.js +29 -0
- package/lib/cast/string.js +37 -0
- package/lib/cast/uuid.js +35 -0
- package/lib/cast.js +436 -0
- package/lib/collection.js +321 -0
- package/lib/connection.js +1855 -0
- package/lib/connectionState.js +26 -0
- package/lib/constants.js +73 -0
- package/lib/cursor/aggregationCursor.js +466 -0
- package/lib/cursor/changeStream.js +198 -0
- package/lib/cursor/queryCursor.js +622 -0
- package/lib/document.js +5521 -0
- package/lib/driver.js +15 -0
- package/lib/drivers/SPEC.md +4 -0
- package/lib/drivers/node-mongodb-native/bulkWriteResult.js +5 -0
- package/lib/drivers/node-mongodb-native/collection.js +393 -0
- package/lib/drivers/node-mongodb-native/connection.js +506 -0
- package/lib/drivers/node-mongodb-native/index.js +10 -0
- package/lib/error/browserMissingSchema.js +29 -0
- package/lib/error/bulkSaveIncompleteError.js +44 -0
- package/lib/error/bulkWriteError.js +41 -0
- package/lib/error/cast.js +158 -0
- package/lib/error/createCollectionsError.js +26 -0
- package/lib/error/divergentArray.js +40 -0
- package/lib/error/eachAsyncMultiError.js +41 -0
- package/lib/error/index.js +237 -0
- package/lib/error/invalidSchemaOption.js +32 -0
- package/lib/error/messages.js +47 -0
- package/lib/error/missingSchema.js +33 -0
- package/lib/error/mongooseError.js +13 -0
- package/lib/error/notFound.js +47 -0
- package/lib/error/objectExpected.js +31 -0
- package/lib/error/objectParameter.js +31 -0
- package/lib/error/overwriteModel.js +31 -0
- package/lib/error/parallelSave.js +33 -0
- package/lib/error/parallelValidate.js +33 -0
- package/lib/error/serverSelection.js +62 -0
- package/lib/error/setOptionError.js +103 -0
- package/lib/error/strict.js +35 -0
- package/lib/error/strictPopulate.js +31 -0
- package/lib/error/syncIndexes.js +30 -0
- package/lib/error/validation.js +97 -0
- package/lib/error/validator.js +100 -0
- package/lib/error/version.js +38 -0
- package/lib/helpers/aggregate/prepareDiscriminatorPipeline.js +39 -0
- package/lib/helpers/aggregate/stringifyFunctionOperators.js +50 -0
- package/lib/helpers/arrayDepth.js +33 -0
- package/lib/helpers/clone.js +204 -0
- package/lib/helpers/common.js +127 -0
- package/lib/helpers/createJSONSchemaTypeDefinition.js +24 -0
- package/lib/helpers/cursor/eachAsync.js +225 -0
- package/lib/helpers/discriminator/applyEmbeddedDiscriminators.js +36 -0
- package/lib/helpers/discriminator/areDiscriminatorValuesEqual.js +16 -0
- package/lib/helpers/discriminator/checkEmbeddedDiscriminatorKeyProjection.js +12 -0
- package/lib/helpers/discriminator/getConstructor.js +29 -0
- package/lib/helpers/discriminator/getDiscriminatorByValue.js +28 -0
- package/lib/helpers/discriminator/getSchemaDiscriminatorByValue.js +27 -0
- package/lib/helpers/discriminator/mergeDiscriminatorSchema.js +91 -0
- package/lib/helpers/document/applyDefaults.js +132 -0
- package/lib/helpers/document/applyTimestamps.js +106 -0
- package/lib/helpers/document/applyVirtuals.js +147 -0
- package/lib/helpers/document/cleanModifiedSubpaths.js +45 -0
- package/lib/helpers/document/compile.js +238 -0
- package/lib/helpers/document/getDeepestSubdocumentForPath.js +38 -0
- package/lib/helpers/document/getEmbeddedDiscriminatorPath.js +53 -0
- package/lib/helpers/document/handleSpreadDoc.js +35 -0
- package/lib/helpers/each.js +25 -0
- package/lib/helpers/error/combinePathErrors.js +22 -0
- package/lib/helpers/firstKey.js +8 -0
- package/lib/helpers/get.js +65 -0
- package/lib/helpers/getConstructorName.js +16 -0
- package/lib/helpers/getDefaultBulkwriteResult.js +18 -0
- package/lib/helpers/getFunctionName.js +10 -0
- package/lib/helpers/immediate.js +16 -0
- package/lib/helpers/indexes/applySchemaCollation.js +13 -0
- package/lib/helpers/indexes/decorateDiscriminatorIndexOptions.js +14 -0
- package/lib/helpers/indexes/getRelatedIndexes.js +63 -0
- package/lib/helpers/indexes/isDefaultIdIndex.js +18 -0
- package/lib/helpers/indexes/isIndexEqual.js +95 -0
- package/lib/helpers/indexes/isIndexSpecEqual.js +32 -0
- package/lib/helpers/indexes/isTextIndex.js +16 -0
- package/lib/helpers/indexes/isTimeseriesIndex.js +16 -0
- package/lib/helpers/isAsyncFunction.js +9 -0
- package/lib/helpers/isBsonType.js +15 -0
- package/lib/helpers/isMongooseObject.js +22 -0
- package/lib/helpers/isObject.js +16 -0
- package/lib/helpers/isPOJO.js +12 -0
- package/lib/helpers/isPromise.js +6 -0
- package/lib/helpers/isSimpleValidator.js +22 -0
- package/lib/helpers/minimize.js +41 -0
- package/lib/helpers/model/applyDefaultsToPOJO.js +52 -0
- package/lib/helpers/model/applyHooks.js +140 -0
- package/lib/helpers/model/applyMethods.js +70 -0
- package/lib/helpers/model/applyStaticHooks.js +33 -0
- package/lib/helpers/model/applyStatics.js +13 -0
- package/lib/helpers/model/castBulkWrite.js +316 -0
- package/lib/helpers/model/decorateBulkWriteResult.js +8 -0
- package/lib/helpers/model/discriminator.js +265 -0
- package/lib/helpers/model/pushNestedArrayPaths.js +15 -0
- package/lib/helpers/omitUndefined.js +20 -0
- package/lib/helpers/once.js +12 -0
- package/lib/helpers/parallelLimit.js +37 -0
- package/lib/helpers/path/parentPaths.js +18 -0
- package/lib/helpers/path/setDottedPath.js +33 -0
- package/lib/helpers/pluralize.js +95 -0
- package/lib/helpers/populate/assignRawDocsToIdStructure.js +129 -0
- package/lib/helpers/populate/assignVals.js +360 -0
- package/lib/helpers/populate/createPopulateQueryFilter.js +97 -0
- package/lib/helpers/populate/getModelsMapForPopulate.js +776 -0
- package/lib/helpers/populate/getSchemaTypes.js +228 -0
- package/lib/helpers/populate/getVirtual.js +103 -0
- package/lib/helpers/populate/leanPopulateMap.js +7 -0
- package/lib/helpers/populate/lookupLocalFields.js +40 -0
- package/lib/helpers/populate/markArraySubdocsPopulated.js +49 -0
- package/lib/helpers/populate/modelNamesFromRefPath.js +66 -0
- package/lib/helpers/populate/removeDeselectedForeignField.js +31 -0
- package/lib/helpers/populate/setPopulatedVirtualValue.js +33 -0
- package/lib/helpers/populate/skipPopulateValue.js +10 -0
- package/lib/helpers/populate/validateRef.js +19 -0
- package/lib/helpers/printJestWarning.js +21 -0
- package/lib/helpers/processConnectionOptions.js +65 -0
- package/lib/helpers/projection/applyProjection.js +83 -0
- package/lib/helpers/projection/hasIncludedChildren.js +41 -0
- package/lib/helpers/projection/isDefiningProjection.js +18 -0
- package/lib/helpers/projection/isExclusive.js +37 -0
- package/lib/helpers/projection/isInclusive.js +39 -0
- package/lib/helpers/projection/isNestedProjection.js +8 -0
- package/lib/helpers/projection/isPathExcluded.js +40 -0
- package/lib/helpers/projection/isPathSelectedInclusive.js +28 -0
- package/lib/helpers/projection/isSubpath.js +14 -0
- package/lib/helpers/projection/parseProjection.js +33 -0
- package/lib/helpers/query/applyGlobalOption.js +29 -0
- package/lib/helpers/query/cast$expr.js +287 -0
- package/lib/helpers/query/castFilterPath.js +54 -0
- package/lib/helpers/query/castUpdate.js +643 -0
- package/lib/helpers/query/getEmbeddedDiscriminatorPath.js +103 -0
- package/lib/helpers/query/handleImmutable.js +44 -0
- package/lib/helpers/query/handleReadPreferenceAliases.js +23 -0
- package/lib/helpers/query/hasDollarKeys.js +23 -0
- package/lib/helpers/query/isOperator.js +14 -0
- package/lib/helpers/query/sanitizeFilter.js +38 -0
- package/lib/helpers/query/sanitizeProjection.js +14 -0
- package/lib/helpers/query/selectPopulatedFields.js +62 -0
- package/lib/helpers/query/trusted.js +13 -0
- package/lib/helpers/query/validOps.js +3 -0
- package/lib/helpers/schema/addAutoId.js +7 -0
- package/lib/helpers/schema/applyBuiltinPlugins.js +12 -0
- package/lib/helpers/schema/applyPlugins.js +55 -0
- package/lib/helpers/schema/applyReadConcern.js +20 -0
- package/lib/helpers/schema/applyWriteConcern.js +39 -0
- package/lib/helpers/schema/cleanPositionalOperators.js +12 -0
- package/lib/helpers/schema/getIndexes.js +171 -0
- package/lib/helpers/schema/getKeysInSchemaOrder.js +28 -0
- package/lib/helpers/schema/getPath.js +43 -0
- package/lib/helpers/schema/getSubdocumentStrictValue.js +32 -0
- package/lib/helpers/schema/handleIdOption.js +20 -0
- package/lib/helpers/schema/handleTimestampOption.js +24 -0
- package/lib/helpers/schema/idGetter.js +34 -0
- package/lib/helpers/schema/merge.js +36 -0
- package/lib/helpers/schematype/handleImmutable.js +50 -0
- package/lib/helpers/setDefaultsOnInsert.js +158 -0
- package/lib/helpers/specialProperties.js +3 -0
- package/lib/helpers/symbols.js +20 -0
- package/lib/helpers/timers.js +3 -0
- package/lib/helpers/timestamps/setDocumentTimestamps.js +26 -0
- package/lib/helpers/timestamps/setupTimestamps.js +116 -0
- package/lib/helpers/topology/allServersUnknown.js +12 -0
- package/lib/helpers/topology/isAtlas.js +31 -0
- package/lib/helpers/topology/isSSLError.js +16 -0
- package/lib/helpers/update/applyTimestampsToChildren.js +193 -0
- package/lib/helpers/update/applyTimestampsToUpdate.js +131 -0
- package/lib/helpers/update/castArrayFilters.js +113 -0
- package/lib/helpers/update/decorateUpdateWithVersionKey.js +35 -0
- package/lib/helpers/update/modifiedPaths.js +33 -0
- package/lib/helpers/update/moveImmutableProperties.js +53 -0
- package/lib/helpers/update/removeUnusedArrayFilters.js +32 -0
- package/lib/helpers/update/updatedPathsByArrayFilter.js +27 -0
- package/lib/helpers/updateValidators.js +193 -0
- package/lib/index.js +17 -0
- package/lib/internal.js +46 -0
- package/lib/model.js +5010 -0
- package/lib/modifiedPathsSnapshot.js +9 -0
- package/lib/mongoose.js +1411 -0
- package/lib/options/populateOptions.js +36 -0
- package/lib/options/propertyOptions.js +8 -0
- package/lib/options/saveOptions.js +16 -0
- package/lib/options/schemaArrayOptions.js +78 -0
- package/lib/options/schemaBufferOptions.js +38 -0
- package/lib/options/schemaDateOptions.js +71 -0
- package/lib/options/schemaDocumentArrayOptions.js +68 -0
- package/lib/options/schemaMapOptions.js +43 -0
- package/lib/options/schemaNumberOptions.js +101 -0
- package/lib/options/schemaObjectIdOptions.js +64 -0
- package/lib/options/schemaStringOptions.js +138 -0
- package/lib/options/schemaSubdocumentOptions.js +66 -0
- package/lib/options/schemaTypeOptions.js +244 -0
- package/lib/options/schemaUnionOptions.js +32 -0
- package/lib/options/virtualOptions.js +164 -0
- package/lib/options.js +17 -0
- package/lib/plugins/index.js +6 -0
- package/lib/plugins/saveSubdocs.js +76 -0
- package/lib/plugins/sharding.js +84 -0
- package/lib/plugins/trackTransaction.js +84 -0
- package/lib/plugins/validateBeforeSave.js +41 -0
- package/lib/query.js +5673 -0
- package/lib/queryHelpers.js +387 -0
- package/lib/schema/array.js +699 -0
- package/lib/schema/bigint.js +282 -0
- package/lib/schema/boolean.js +332 -0
- package/lib/schema/buffer.js +343 -0
- package/lib/schema/date.js +467 -0
- package/lib/schema/decimal128.js +263 -0
- package/lib/schema/documentArray.js +656 -0
- package/lib/schema/documentArrayElement.js +137 -0
- package/lib/schema/double.js +246 -0
- package/lib/schema/index.js +32 -0
- package/lib/schema/int32.js +289 -0
- package/lib/schema/map.js +201 -0
- package/lib/schema/mixed.js +146 -0
- package/lib/schema/number.js +510 -0
- package/lib/schema/objectId.js +333 -0
- package/lib/schema/operators/bitwise.js +38 -0
- package/lib/schema/operators/exists.js +12 -0
- package/lib/schema/operators/geospatial.js +107 -0
- package/lib/schema/operators/helpers.js +32 -0
- package/lib/schema/operators/text.js +39 -0
- package/lib/schema/operators/type.js +20 -0
- package/lib/schema/string.js +733 -0
- package/lib/schema/subdocument.js +436 -0
- package/lib/schema/symbols.js +5 -0
- package/lib/schema/union.js +113 -0
- package/lib/schema/uuid.js +305 -0
- package/lib/schema.js +3226 -0
- package/lib/schemaType.js +1835 -0
- package/lib/stateMachine.js +232 -0
- package/lib/types/array/index.js +119 -0
- package/lib/types/array/isMongooseArray.js +5 -0
- package/lib/types/array/methods/index.js +1095 -0
- package/lib/types/arraySubdocument.js +207 -0
- package/lib/types/buffer.js +294 -0
- package/lib/types/decimal128.js +13 -0
- package/lib/types/documentArray/index.js +113 -0
- package/lib/types/documentArray/isMongooseDocumentArray.js +5 -0
- package/lib/types/documentArray/methods/index.js +415 -0
- package/lib/types/double.js +13 -0
- package/lib/types/index.js +23 -0
- package/lib/types/map.js +419 -0
- package/lib/types/objectid.js +41 -0
- package/lib/types/subdocument.js +464 -0
- package/lib/types/uuid.js +13 -0
- package/lib/utils.js +1054 -0
- package/lib/validOptions.js +42 -0
- package/lib/virtualType.js +204 -0
- package/package.json +148 -0
- package/types/aggregate.d.ts +180 -0
- package/types/augmentations.d.ts +9 -0
- package/types/callback.d.ts +8 -0
- package/types/collection.d.ts +49 -0
- package/types/connection.d.ts +297 -0
- package/types/cursor.d.ts +67 -0
- package/types/document.d.ts +374 -0
- package/types/error.d.ts +143 -0
- package/types/expressions.d.ts +3053 -0
- package/types/helpers.d.ts +32 -0
- package/types/index.d.ts +1056 -0
- package/types/indexes.d.ts +97 -0
- package/types/inferhydrateddoctype.d.ts +115 -0
- package/types/inferrawdoctype.d.ts +135 -0
- package/types/inferschematype.d.ts +337 -0
- package/types/middlewares.d.ts +59 -0
- package/types/models.d.ts +1306 -0
- package/types/mongooseoptions.d.ts +228 -0
- package/types/pipelinestage.d.ts +333 -0
- package/types/populate.d.ts +53 -0
- package/types/query.d.ts +934 -0
- package/types/schemaoptions.d.ts +282 -0
- package/types/schematypes.d.ts +654 -0
- package/types/session.d.ts +32 -0
- package/types/types.d.ts +109 -0
- package/types/utility.d.ts +175 -0
- package/types/validation.d.ts +39 -0
- package/types/virtuals.d.ts +14 -0
package/lib/driver.js
ADDED
|
@@ -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;
|