@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,415 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ArrayMethods = require('../../array/methods');
|
|
4
|
+
const Document = require('../../../document');
|
|
5
|
+
const getDiscriminatorByValue = require('../../../helpers/discriminator/getDiscriminatorByValue');
|
|
6
|
+
const internalToObjectOptions = require('../../../options').internalToObjectOptions;
|
|
7
|
+
const utils = require('../../../utils');
|
|
8
|
+
const isBsonType = require('../../../helpers/isBsonType');
|
|
9
|
+
|
|
10
|
+
const arrayParentSymbol = require('../../../helpers/symbols').arrayParentSymbol;
|
|
11
|
+
const arrayPathSymbol = require('../../../helpers/symbols').arrayPathSymbol;
|
|
12
|
+
const arraySchemaSymbol = require('../../../helpers/symbols').arraySchemaSymbol;
|
|
13
|
+
const documentArrayParent = require('../../../helpers/symbols').documentArrayParent;
|
|
14
|
+
|
|
15
|
+
const _baseToString = Array.prototype.toString;
|
|
16
|
+
|
|
17
|
+
const methods = {
|
|
18
|
+
/*!
|
|
19
|
+
* ignore
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
toBSON() {
|
|
23
|
+
return this.toObject(internalToObjectOptions);
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
toString() {
|
|
27
|
+
return _baseToString.call(this.__array.map(subdoc => {
|
|
28
|
+
if (subdoc?.$__ != null) {
|
|
29
|
+
return subdoc.toString();
|
|
30
|
+
}
|
|
31
|
+
return subdoc;
|
|
32
|
+
}));
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
/*!
|
|
36
|
+
* ignore
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
getArrayParent() {
|
|
40
|
+
return this[arrayParentSymbol];
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
/*!
|
|
44
|
+
* ignore
|
|
45
|
+
*/
|
|
46
|
+
$schemaType() {
|
|
47
|
+
return this[arraySchemaSymbol];
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Overrides MongooseArray#cast
|
|
52
|
+
*
|
|
53
|
+
* @method _cast
|
|
54
|
+
* @api private
|
|
55
|
+
* @memberOf MongooseDocumentArray
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
_cast(value, index, options) {
|
|
59
|
+
if (this[arraySchemaSymbol] == null) {
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
let Constructor = this[arraySchemaSymbol].Constructor;
|
|
63
|
+
const isInstance = Constructor.$isMongooseDocumentArray ?
|
|
64
|
+
utils.isMongooseDocumentArray(value) :
|
|
65
|
+
value instanceof Constructor;
|
|
66
|
+
if (isInstance ||
|
|
67
|
+
// Hack re: #5001, see #5005
|
|
68
|
+
value?.constructor?.baseCasterConstructor === Constructor) {
|
|
69
|
+
if (!(value[documentArrayParent] && value.__parentArray)) {
|
|
70
|
+
// value may have been created using array.create()
|
|
71
|
+
value[documentArrayParent] = this[arrayParentSymbol];
|
|
72
|
+
value.__parentArray = this;
|
|
73
|
+
}
|
|
74
|
+
value.$setIndex(index);
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (value == null) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// handle cast('string') or cast(ObjectId) etc.
|
|
83
|
+
// only objects are permitted so we can safely assume that
|
|
84
|
+
// non-objects are to be interpreted as _id
|
|
85
|
+
if (Buffer.isBuffer(value) ||
|
|
86
|
+
isBsonType(value, 'ObjectId') || !utils.isObject(value)) {
|
|
87
|
+
value = { _id: value };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (value &&
|
|
91
|
+
Constructor.discriminators &&
|
|
92
|
+
Constructor.schema &&
|
|
93
|
+
Constructor.schema.options &&
|
|
94
|
+
Constructor.schema.options.discriminatorKey) {
|
|
95
|
+
if (typeof value[Constructor.schema.options.discriminatorKey] === 'string' &&
|
|
96
|
+
Constructor.discriminators[value[Constructor.schema.options.discriminatorKey]]) {
|
|
97
|
+
Constructor = Constructor.discriminators[value[Constructor.schema.options.discriminatorKey]];
|
|
98
|
+
} else {
|
|
99
|
+
const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, value[Constructor.schema.options.discriminatorKey]);
|
|
100
|
+
if (constructorByValue) {
|
|
101
|
+
Constructor = constructorByValue;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (Constructor.$isMongooseDocumentArray) {
|
|
107
|
+
return Constructor.cast(value, this, undefined, undefined, index);
|
|
108
|
+
}
|
|
109
|
+
const ret = new Constructor(value, this, options, undefined, index);
|
|
110
|
+
ret.isNew = true;
|
|
111
|
+
return ret;
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Searches array items for the first document with a matching _id.
|
|
116
|
+
*
|
|
117
|
+
* #### Example:
|
|
118
|
+
*
|
|
119
|
+
* const embeddedDoc = m.array.id(some_id);
|
|
120
|
+
*
|
|
121
|
+
* @return {EmbeddedDocument|null} the subdocument or null if not found.
|
|
122
|
+
* @param {ObjectId|String|Number|Buffer} id
|
|
123
|
+
* @method id
|
|
124
|
+
* @api public
|
|
125
|
+
* @memberOf MongooseDocumentArray
|
|
126
|
+
*/
|
|
127
|
+
|
|
128
|
+
id(id) {
|
|
129
|
+
if (id == null) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const schemaType = this[arraySchemaSymbol];
|
|
134
|
+
let idSchemaType = null;
|
|
135
|
+
|
|
136
|
+
if (schemaType?.schema) {
|
|
137
|
+
idSchemaType = schemaType.schema.path('_id');
|
|
138
|
+
} else if (schemaType?.casterConstructor?.schema) {
|
|
139
|
+
idSchemaType = schemaType.casterConstructor.schema.path('_id');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
let castedId = null;
|
|
143
|
+
if (idSchemaType) {
|
|
144
|
+
try {
|
|
145
|
+
castedId = idSchemaType.cast(id);
|
|
146
|
+
} catch {
|
|
147
|
+
// ignore error
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
let _id;
|
|
152
|
+
|
|
153
|
+
for (const val of this) {
|
|
154
|
+
if (!val) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
_id = val.get('_id');
|
|
159
|
+
|
|
160
|
+
if (_id == null) {
|
|
161
|
+
continue;
|
|
162
|
+
} else if (_id instanceof Document) {
|
|
163
|
+
_id = _id.get('_id');
|
|
164
|
+
if (castedId != null && utils.deepEqual(castedId, _id)) {
|
|
165
|
+
return val;
|
|
166
|
+
} else if (castedId == null && (id == _id || utils.deepEqual(id, _id))) {
|
|
167
|
+
// Backwards compat: compare user-specified param to _id using loose equality
|
|
168
|
+
return val;
|
|
169
|
+
}
|
|
170
|
+
} else if (castedId != null && utils.deepEqual(castedId, _id)) {
|
|
171
|
+
return val;
|
|
172
|
+
} else if (castedId == null && (_id == id || utils.deepEqual(id, _id))) {
|
|
173
|
+
// Backwards compat: compare user-specified param to _id using loose equality
|
|
174
|
+
return val;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return null;
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Returns a native js Array of plain js objects
|
|
183
|
+
*
|
|
184
|
+
* #### Note:
|
|
185
|
+
*
|
|
186
|
+
* _Each sub-document is converted to a plain object by calling its `#toObject` method._
|
|
187
|
+
*
|
|
188
|
+
* @param {Object} [options] optional options to pass to each documents `toObject` method call during conversion
|
|
189
|
+
* @return {Array}
|
|
190
|
+
* @method toObject
|
|
191
|
+
* @api public
|
|
192
|
+
* @memberOf MongooseDocumentArray
|
|
193
|
+
*/
|
|
194
|
+
|
|
195
|
+
toObject(options) {
|
|
196
|
+
// `[].concat` coerces the return value into a vanilla JS array, rather
|
|
197
|
+
// than a Mongoose array.
|
|
198
|
+
return [].concat(this.map(function(doc) {
|
|
199
|
+
if (doc == null) {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
if (typeof doc.toObject !== 'function') {
|
|
203
|
+
return doc;
|
|
204
|
+
}
|
|
205
|
+
return doc.toObject(options);
|
|
206
|
+
}));
|
|
207
|
+
},
|
|
208
|
+
|
|
209
|
+
$toObject() {
|
|
210
|
+
return this.constructor.prototype.toObject.apply(this, arguments);
|
|
211
|
+
},
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Wraps [`Array#push`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/push) with proper change tracking.
|
|
215
|
+
*
|
|
216
|
+
* @param {...Object} [args]
|
|
217
|
+
* @api public
|
|
218
|
+
* @method push
|
|
219
|
+
* @memberOf MongooseDocumentArray
|
|
220
|
+
*/
|
|
221
|
+
|
|
222
|
+
push() {
|
|
223
|
+
const ret = ArrayMethods.push.apply(this, arguments);
|
|
224
|
+
|
|
225
|
+
_updateParentPopulated(this);
|
|
226
|
+
|
|
227
|
+
return ret;
|
|
228
|
+
},
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Pulls items from the array atomically.
|
|
232
|
+
*
|
|
233
|
+
* @param {...Object} [args]
|
|
234
|
+
* @api public
|
|
235
|
+
* @method pull
|
|
236
|
+
* @memberOf MongooseDocumentArray
|
|
237
|
+
*/
|
|
238
|
+
|
|
239
|
+
pull() {
|
|
240
|
+
const ret = ArrayMethods.pull.apply(this, arguments);
|
|
241
|
+
|
|
242
|
+
_updateParentPopulated(this);
|
|
243
|
+
|
|
244
|
+
return ret;
|
|
245
|
+
},
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Wraps [`Array#shift`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/unshift) with proper change tracking.
|
|
249
|
+
* @api private
|
|
250
|
+
*/
|
|
251
|
+
|
|
252
|
+
shift() {
|
|
253
|
+
const ret = ArrayMethods.shift.apply(this, arguments);
|
|
254
|
+
|
|
255
|
+
_updateParentPopulated(this);
|
|
256
|
+
|
|
257
|
+
return ret;
|
|
258
|
+
},
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Wraps [`Array#splice`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice) with proper change tracking and casting.
|
|
262
|
+
* @api private
|
|
263
|
+
*/
|
|
264
|
+
|
|
265
|
+
splice() {
|
|
266
|
+
const ret = ArrayMethods.splice.apply(this, arguments);
|
|
267
|
+
|
|
268
|
+
_updateParentPopulated(this);
|
|
269
|
+
|
|
270
|
+
return ret;
|
|
271
|
+
},
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Helper for console.log
|
|
275
|
+
*
|
|
276
|
+
* @method inspect
|
|
277
|
+
* @api public
|
|
278
|
+
* @memberOf MongooseDocumentArray
|
|
279
|
+
*/
|
|
280
|
+
|
|
281
|
+
inspect() {
|
|
282
|
+
return this.toObject();
|
|
283
|
+
},
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Creates a subdocument casted to this schema.
|
|
287
|
+
*
|
|
288
|
+
* This is the same subdocument constructor used for casting.
|
|
289
|
+
*
|
|
290
|
+
* @param {Object} obj the value to cast to this arrays SubDocument schema
|
|
291
|
+
* @method create
|
|
292
|
+
* @api public
|
|
293
|
+
* @memberOf MongooseDocumentArray
|
|
294
|
+
*/
|
|
295
|
+
|
|
296
|
+
create(obj) {
|
|
297
|
+
let Constructor = this[arraySchemaSymbol].Constructor;
|
|
298
|
+
if (obj &&
|
|
299
|
+
Constructor.discriminators &&
|
|
300
|
+
Constructor.schema &&
|
|
301
|
+
Constructor.schema.options &&
|
|
302
|
+
Constructor.schema.options.discriminatorKey) {
|
|
303
|
+
if (typeof obj[Constructor.schema.options.discriminatorKey] === 'string' &&
|
|
304
|
+
Constructor.discriminators[obj[Constructor.schema.options.discriminatorKey]]) {
|
|
305
|
+
Constructor = Constructor.discriminators[obj[Constructor.schema.options.discriminatorKey]];
|
|
306
|
+
} else {
|
|
307
|
+
const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, obj[Constructor.schema.options.discriminatorKey]);
|
|
308
|
+
if (constructorByValue) {
|
|
309
|
+
Constructor = constructorByValue;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return new Constructor(obj, this);
|
|
315
|
+
},
|
|
316
|
+
|
|
317
|
+
/*!
|
|
318
|
+
* ignore
|
|
319
|
+
*/
|
|
320
|
+
|
|
321
|
+
notify(event) {
|
|
322
|
+
const _this = this;
|
|
323
|
+
return function notify(val, _arr) {
|
|
324
|
+
_arr = _arr || _this;
|
|
325
|
+
let i = _arr.length;
|
|
326
|
+
while (i--) {
|
|
327
|
+
if (_arr[i] == null) {
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
switch (event) {
|
|
331
|
+
// only swap for save event for now, we may change this to all event types later
|
|
332
|
+
case 'save':
|
|
333
|
+
val = _this[i];
|
|
334
|
+
break;
|
|
335
|
+
default:
|
|
336
|
+
// NO-OP
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
if (utils.isMongooseArray(_arr[i])) {
|
|
341
|
+
notify(val, _arr[i]);
|
|
342
|
+
} else if (_arr[i]) {
|
|
343
|
+
_arr[i].emit(event, val);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
},
|
|
348
|
+
|
|
349
|
+
set(i, val, skipModified) {
|
|
350
|
+
const arr = this.__array;
|
|
351
|
+
if (skipModified) {
|
|
352
|
+
arr[i] = val;
|
|
353
|
+
return this;
|
|
354
|
+
}
|
|
355
|
+
const value = methods._cast.call(this, val, i);
|
|
356
|
+
methods._markModified.call(this, i);
|
|
357
|
+
arr[i] = value;
|
|
358
|
+
return this;
|
|
359
|
+
},
|
|
360
|
+
|
|
361
|
+
_markModified(elem, embeddedPath) {
|
|
362
|
+
const parent = this[arrayParentSymbol];
|
|
363
|
+
let dirtyPath;
|
|
364
|
+
|
|
365
|
+
if (parent) {
|
|
366
|
+
dirtyPath = this[arrayPathSymbol];
|
|
367
|
+
|
|
368
|
+
if (arguments.length) {
|
|
369
|
+
if (embeddedPath != null) {
|
|
370
|
+
// an embedded doc bubbled up the change
|
|
371
|
+
const index = elem.__index;
|
|
372
|
+
dirtyPath = dirtyPath + '.' + index + '.' + embeddedPath;
|
|
373
|
+
} else {
|
|
374
|
+
// directly set an index
|
|
375
|
+
dirtyPath = dirtyPath + '.' + elem;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (dirtyPath != null && dirtyPath.endsWith('.$')) {
|
|
380
|
+
return this;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
parent.markModified(dirtyPath, arguments.length !== 0 ? elem : parent);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
return this;
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
module.exports = methods;
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* If this is a document array, each element may contain single
|
|
394
|
+
* populated paths, so we need to modify the top-level document's
|
|
395
|
+
* populated cache. See gh-8247, gh-8265.
|
|
396
|
+
* @param {Array} arr
|
|
397
|
+
* @api private
|
|
398
|
+
*/
|
|
399
|
+
|
|
400
|
+
function _updateParentPopulated(arr) {
|
|
401
|
+
const parent = arr[arrayParentSymbol];
|
|
402
|
+
if (!parent || parent.$__.populated == null) return;
|
|
403
|
+
|
|
404
|
+
const populatedPaths = Object.keys(parent.$__.populated).
|
|
405
|
+
filter(p => p.startsWith(arr[arrayPathSymbol] + '.'));
|
|
406
|
+
|
|
407
|
+
for (const path of populatedPaths) {
|
|
408
|
+
const remnant = path.slice((arr[arrayPathSymbol] + '.').length);
|
|
409
|
+
if (!Array.isArray(parent.$__.populated[path].value)) {
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
parent.$__.populated[path].value = arr.map(val => val.$populated(remnant));
|
|
414
|
+
}
|
|
415
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
/*!
|
|
3
|
+
* Module exports.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
exports.Array = require('./array');
|
|
9
|
+
exports.Buffer = require('./buffer');
|
|
10
|
+
|
|
11
|
+
exports.Document = // @deprecate
|
|
12
|
+
exports.Embedded = require('./arraySubdocument');
|
|
13
|
+
|
|
14
|
+
exports.DocumentArray = require('./documentArray');
|
|
15
|
+
exports.Double = require('./double');
|
|
16
|
+
exports.Decimal128 = require('./decimal128');
|
|
17
|
+
exports.ObjectId = require('./objectid');
|
|
18
|
+
|
|
19
|
+
exports.Map = require('./map');
|
|
20
|
+
|
|
21
|
+
exports.Subdocument = require('./subdocument');
|
|
22
|
+
|
|
23
|
+
exports.UUID = require('./uuid');
|