@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
|
@@ -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;
|