@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/types/map.js
ADDED
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const MongooseError = require('../error/mongooseError');
|
|
4
|
+
const clone = require('../helpers/clone');
|
|
5
|
+
const deepEqual = require('../utils').deepEqual;
|
|
6
|
+
const getConstructorName = require('../helpers/getConstructorName');
|
|
7
|
+
const handleSpreadDoc = require('../helpers/document/handleSpreadDoc');
|
|
8
|
+
const util = require('util');
|
|
9
|
+
const specialProperties = require('../helpers/specialProperties');
|
|
10
|
+
const isBsonType = require('../helpers/isBsonType');
|
|
11
|
+
const cleanModifiedSubpaths = require('../helpers/document/cleanModifiedSubpaths');
|
|
12
|
+
|
|
13
|
+
const populateModelSymbol = require('../helpers/symbols').populateModelSymbol;
|
|
14
|
+
|
|
15
|
+
/*!
|
|
16
|
+
* ignore
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
class MongooseMap extends Map {
|
|
20
|
+
constructor(v, path, doc, schemaType, options) {
|
|
21
|
+
if (getConstructorName(v) === 'Object') {
|
|
22
|
+
v = Object.keys(v).reduce((arr, key) => arr.concat([[key, v[key]]]), []);
|
|
23
|
+
}
|
|
24
|
+
super(v);
|
|
25
|
+
this.$__parent = doc?.$__ != null ? doc : null;
|
|
26
|
+
|
|
27
|
+
// Calculate the full path from the root document
|
|
28
|
+
// Priority: parent.$basePath (from subdoc) > options.path (from parent map/structure) > path (schema path)
|
|
29
|
+
// Subdocuments have the most up-to-date path info, so prefer that over options.path
|
|
30
|
+
if (this.$__parent?.$isSingleNested && this.$__parent.$basePath) {
|
|
31
|
+
this.$__path = this.$__parent.$basePath + '.' + path;
|
|
32
|
+
// Performance optimization: store path relative to parent subdocument
|
|
33
|
+
// to avoid string operations in set() hot path
|
|
34
|
+
this.$__pathRelativeToParent = path;
|
|
35
|
+
} else if (options?.path) {
|
|
36
|
+
this.$__path = options.path;
|
|
37
|
+
this.$__pathRelativeToParent = null;
|
|
38
|
+
} else {
|
|
39
|
+
this.$__path = path;
|
|
40
|
+
this.$__pathRelativeToParent = null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
this.$__schemaType = schemaType;
|
|
44
|
+
|
|
45
|
+
this.$__runDeferred();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
$init(key, value) {
|
|
49
|
+
checkValidKey(key);
|
|
50
|
+
|
|
51
|
+
super.set(key, value);
|
|
52
|
+
|
|
53
|
+
if (value?.$isSingleNested) {
|
|
54
|
+
value.$basePath = this.$__path + '.' + key;
|
|
55
|
+
// Store the path relative to parent subdoc for efficient markModified()
|
|
56
|
+
if (this.$__pathRelativeToParent != null) {
|
|
57
|
+
// Map's parent is a subdocument, store path relative to that subdoc
|
|
58
|
+
value.$pathRelativeToParent = this.$__pathRelativeToParent + '.' + key;
|
|
59
|
+
} else {
|
|
60
|
+
// Map's parent is root document, store the full path
|
|
61
|
+
value.$pathRelativeToParent = this.$__path + '.' + key;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
$__set(key, value) {
|
|
67
|
+
super.set(key, value);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Overwrites native Map's `get()` function to support Mongoose getters.
|
|
72
|
+
*
|
|
73
|
+
* @api public
|
|
74
|
+
* @method get
|
|
75
|
+
* @memberOf Map
|
|
76
|
+
*/
|
|
77
|
+
|
|
78
|
+
get(key, options) {
|
|
79
|
+
if (isBsonType(key, 'ObjectId')) {
|
|
80
|
+
key = key.toString();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
options = options || {};
|
|
84
|
+
if (options.getters === false) {
|
|
85
|
+
return super.get(key);
|
|
86
|
+
}
|
|
87
|
+
return this.$__schemaType.applyGetters(super.get(key), this.$__parent);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Overwrites native Map's `set()` function to support setters, `populate()`,
|
|
92
|
+
* and change tracking. Note that Mongoose maps _only_ support strings and
|
|
93
|
+
* ObjectIds as keys.
|
|
94
|
+
*
|
|
95
|
+
* Keys also cannot:
|
|
96
|
+
* - be named after special properties `prototype`, `constructor`, and `__proto__`
|
|
97
|
+
* - start with a dollar sign (`$`)
|
|
98
|
+
* - contain any dots (`.`)
|
|
99
|
+
*
|
|
100
|
+
* #### Example:
|
|
101
|
+
*
|
|
102
|
+
* doc.myMap.set('test', 42); // works
|
|
103
|
+
* doc.myMap.set({ obj: 42 }, 42); // Throws "Mongoose maps only support string keys"
|
|
104
|
+
* doc.myMap.set(10, 42); // Throws "Mongoose maps only support string keys"
|
|
105
|
+
* doc.myMap.set("$test", 42); // Throws "Mongoose maps do not support keys that start with "$", got "$test""
|
|
106
|
+
*
|
|
107
|
+
* @api public
|
|
108
|
+
* @method set
|
|
109
|
+
* @memberOf Map
|
|
110
|
+
*/
|
|
111
|
+
|
|
112
|
+
set(key, value) {
|
|
113
|
+
if (isBsonType(key, 'ObjectId')) {
|
|
114
|
+
key = key.toString();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
checkValidKey(key);
|
|
118
|
+
value = handleSpreadDoc(value);
|
|
119
|
+
|
|
120
|
+
// Weird, but because you can't assign to `this` before calling `super()`
|
|
121
|
+
// you can't get access to `$__schemaType` to cast in the initial call to
|
|
122
|
+
// `set()` from the `super()` constructor.
|
|
123
|
+
|
|
124
|
+
if (this.$__schemaType == null) {
|
|
125
|
+
this.$__deferred = this.$__deferred || [];
|
|
126
|
+
this.$__deferred.push({ key: key, value: value });
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let _fullPath;
|
|
131
|
+
const parent = this.$__parent;
|
|
132
|
+
const populated = parent?.$__?.populated ?
|
|
133
|
+
parent.$populated(fullPath.call(this), true) || parent.$populated(this.$__path, true) :
|
|
134
|
+
null;
|
|
135
|
+
const priorVal = this.get(key);
|
|
136
|
+
|
|
137
|
+
if (populated != null) {
|
|
138
|
+
if (this.$__schemaType.$isSingleNested) {
|
|
139
|
+
throw new MongooseError(
|
|
140
|
+
'Cannot manually populate single nested subdoc underneath Map ' +
|
|
141
|
+
`at path "${this.$__path}". Try using an array instead of a Map.`
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
if (Array.isArray(value) && this.$__schemaType.$isMongooseArray) {
|
|
145
|
+
value = value.map(v => {
|
|
146
|
+
if (v.$__ == null) {
|
|
147
|
+
v = new populated.options[populateModelSymbol](v);
|
|
148
|
+
}
|
|
149
|
+
// Doesn't support single nested "in-place" populate
|
|
150
|
+
v.$__.wasPopulated = { value: v._doc._id };
|
|
151
|
+
return v;
|
|
152
|
+
});
|
|
153
|
+
} else if (value != null) {
|
|
154
|
+
if (value.$__ == null) {
|
|
155
|
+
value = new populated.options[populateModelSymbol](value);
|
|
156
|
+
}
|
|
157
|
+
// Doesn't support single nested "in-place" populate
|
|
158
|
+
value.$__.wasPopulated = { value: value._doc._id };
|
|
159
|
+
}
|
|
160
|
+
} else {
|
|
161
|
+
try {
|
|
162
|
+
let options = null;
|
|
163
|
+
if (this.$__schemaType.$isMongooseDocumentArray || this.$__schemaType.$isSingleNested || this.$__schemaType.$isMongooseArray || this.$__schemaType.$isSchemaMap) {
|
|
164
|
+
options = { path: fullPath.call(this) };
|
|
165
|
+
// For subdocuments, also pass the relative path to avoid string operations
|
|
166
|
+
if (this.$__schemaType.$isSingleNested) {
|
|
167
|
+
options.pathRelativeToParent = this.$__pathRelativeToParent != null ?
|
|
168
|
+
this.$__pathRelativeToParent + '.' + key :
|
|
169
|
+
this.$__path + '.' + key;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
value = this.$__schemaType.applySetters(
|
|
173
|
+
value,
|
|
174
|
+
this.$__parent,
|
|
175
|
+
false,
|
|
176
|
+
this.get(key),
|
|
177
|
+
options
|
|
178
|
+
);
|
|
179
|
+
} catch (error) {
|
|
180
|
+
if (this.$__parent?.$__ != null) {
|
|
181
|
+
this.$__parent.invalidate(fullPath.call(this), error);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
throw error;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
super.set(key, value);
|
|
189
|
+
|
|
190
|
+
// Set relative path on subdocuments to avoid string operations in markModified()
|
|
191
|
+
// The path should be relative to the parent subdocument (if any), not just the key
|
|
192
|
+
if (value?.$isSingleNested) {
|
|
193
|
+
if (this.$__pathRelativeToParent != null) {
|
|
194
|
+
// Map's parent is a subdocument, store path relative to that subdoc (e.g., 'items.i2')
|
|
195
|
+
value.$pathRelativeToParent = this.$__pathRelativeToParent + '.' + key;
|
|
196
|
+
} else {
|
|
197
|
+
// Map's parent is root document, store just the full path
|
|
198
|
+
value.$pathRelativeToParent = this.$__path + '.' + key;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (parent?.$__ != null && !deepEqual(value, priorVal)) {
|
|
203
|
+
// Optimization: if parent is a subdocument, use precalculated relative path
|
|
204
|
+
// to avoid building a full path just to strip the parent's prefix
|
|
205
|
+
let pathToMark;
|
|
206
|
+
if (this.$__pathRelativeToParent != null) {
|
|
207
|
+
// Parent is a subdocument - use precalculated relative path (e.g., 'items.i1')
|
|
208
|
+
pathToMark = this.$__pathRelativeToParent + '.' + key;
|
|
209
|
+
} else {
|
|
210
|
+
// Parent is root document or map - use full path
|
|
211
|
+
pathToMark = fullPath.call(this);
|
|
212
|
+
}
|
|
213
|
+
parent.markModified(pathToMark);
|
|
214
|
+
// If overwriting the full document array or subdoc, make sure to clean up any paths that were modified
|
|
215
|
+
// before re: #15108
|
|
216
|
+
if (this.$__schemaType.$isMongooseDocumentArray || this.$__schemaType.$isSingleNested) {
|
|
217
|
+
cleanModifiedSubpaths(parent, pathToMark);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Delay calculating full path unless absolutely necessary, because string
|
|
222
|
+
// concatenation is a bottleneck re: #13171
|
|
223
|
+
function fullPath() {
|
|
224
|
+
if (_fullPath) {
|
|
225
|
+
return _fullPath;
|
|
226
|
+
}
|
|
227
|
+
_fullPath = this.$__path + '.' + key;
|
|
228
|
+
return _fullPath;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Overwrites native Map's `clear()` function to support change tracking.
|
|
234
|
+
*
|
|
235
|
+
* @api public
|
|
236
|
+
* @method clear
|
|
237
|
+
* @memberOf Map
|
|
238
|
+
*/
|
|
239
|
+
|
|
240
|
+
clear() {
|
|
241
|
+
super.clear();
|
|
242
|
+
const parent = this.$__parent;
|
|
243
|
+
if (parent != null) {
|
|
244
|
+
parent.markModified(this.$__path);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Overwrites native Map's `delete()` function to support change tracking.
|
|
250
|
+
*
|
|
251
|
+
* @api public
|
|
252
|
+
* @method delete
|
|
253
|
+
* @memberOf Map
|
|
254
|
+
*/
|
|
255
|
+
|
|
256
|
+
delete(key) {
|
|
257
|
+
if (isBsonType(key, 'ObjectId')) {
|
|
258
|
+
key = key.toString();
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
this.set(key, undefined);
|
|
262
|
+
return super.delete(key);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Converts this map to a native JavaScript Map so the MongoDB driver can serialize it.
|
|
267
|
+
*
|
|
268
|
+
* @api public
|
|
269
|
+
* @method toBSON
|
|
270
|
+
* @memberOf Map
|
|
271
|
+
*/
|
|
272
|
+
|
|
273
|
+
toBSON() {
|
|
274
|
+
return new Map(this);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
toObject(options) {
|
|
278
|
+
if (options?.flattenMaps) {
|
|
279
|
+
const ret = {};
|
|
280
|
+
const keys = this.keys();
|
|
281
|
+
for (const key of keys) {
|
|
282
|
+
ret[key] = clone(this.get(key), options);
|
|
283
|
+
}
|
|
284
|
+
return ret;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return new Map(this);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
$toObject() {
|
|
291
|
+
return this.constructor.prototype.toObject.apply(this, arguments);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Converts this map to a native JavaScript Map for `JSON.stringify()`. Set
|
|
296
|
+
* the `flattenMaps` option to convert this map to a POJO instead.
|
|
297
|
+
*
|
|
298
|
+
* #### Example:
|
|
299
|
+
*
|
|
300
|
+
* doc.myMap.toJSON() instanceof Map; // true
|
|
301
|
+
* doc.myMap.toJSON({ flattenMaps: true }) instanceof Map; // false
|
|
302
|
+
*
|
|
303
|
+
* @api public
|
|
304
|
+
* @method toJSON
|
|
305
|
+
* @param {Object} [options]
|
|
306
|
+
* @param {Boolean} [options.flattenMaps=false] set to `true` to convert the map to a POJO rather than a native JavaScript map
|
|
307
|
+
* @memberOf Map
|
|
308
|
+
*/
|
|
309
|
+
|
|
310
|
+
toJSON(options) {
|
|
311
|
+
if (typeof options?.flattenMaps === 'boolean' ? options.flattenMaps : true) {
|
|
312
|
+
const ret = {};
|
|
313
|
+
const keys = this.keys();
|
|
314
|
+
for (const key of keys) {
|
|
315
|
+
ret[key] = clone(this.get(key), options);
|
|
316
|
+
}
|
|
317
|
+
return ret;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
return new Map(this);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
inspect() {
|
|
324
|
+
return new Map(this);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
$__runDeferred() {
|
|
328
|
+
if (!this.$__deferred) {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
for (const keyValueObject of this.$__deferred) {
|
|
333
|
+
this.set(keyValueObject.key, keyValueObject.value);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
this.$__deferred = null;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
if (util.inspect.custom) {
|
|
341
|
+
Object.defineProperty(MongooseMap.prototype, util.inspect.custom, {
|
|
342
|
+
enumerable: false,
|
|
343
|
+
writable: false,
|
|
344
|
+
configurable: false,
|
|
345
|
+
value: MongooseMap.prototype.inspect
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
Object.defineProperty(MongooseMap.prototype, '$__set', {
|
|
350
|
+
enumerable: false,
|
|
351
|
+
writable: true,
|
|
352
|
+
configurable: false
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
Object.defineProperty(MongooseMap.prototype, '$__parent', {
|
|
356
|
+
enumerable: false,
|
|
357
|
+
writable: true,
|
|
358
|
+
configurable: false
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
Object.defineProperty(MongooseMap.prototype, '$__path', {
|
|
362
|
+
enumerable: false,
|
|
363
|
+
writable: true,
|
|
364
|
+
configurable: false
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
Object.defineProperty(MongooseMap.prototype, '$__schemaType', {
|
|
368
|
+
enumerable: false,
|
|
369
|
+
writable: true,
|
|
370
|
+
configurable: false
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Set to `true` for all Mongoose map instances
|
|
375
|
+
*
|
|
376
|
+
* @api public
|
|
377
|
+
* @property $isMongooseMap
|
|
378
|
+
* @memberOf MongooseMap
|
|
379
|
+
* @instance
|
|
380
|
+
*/
|
|
381
|
+
|
|
382
|
+
Object.defineProperty(MongooseMap.prototype, '$isMongooseMap', {
|
|
383
|
+
enumerable: false,
|
|
384
|
+
writable: false,
|
|
385
|
+
configurable: false,
|
|
386
|
+
value: true
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
Object.defineProperty(MongooseMap.prototype, '$__deferredCalls', {
|
|
390
|
+
enumerable: false,
|
|
391
|
+
writable: false,
|
|
392
|
+
configurable: false,
|
|
393
|
+
value: true
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Since maps are stored as objects under the hood, keys must be strings
|
|
398
|
+
* and can't contain any invalid characters
|
|
399
|
+
* @param {String} key
|
|
400
|
+
* @api private
|
|
401
|
+
*/
|
|
402
|
+
|
|
403
|
+
function checkValidKey(key) {
|
|
404
|
+
const keyType = typeof key;
|
|
405
|
+
if (keyType !== 'string') {
|
|
406
|
+
throw new TypeError(`Mongoose maps only support string keys, got ${keyType}`);
|
|
407
|
+
}
|
|
408
|
+
if (key.startsWith('$')) {
|
|
409
|
+
throw new Error(`Mongoose maps do not support keys that start with "$", got "${key}"`);
|
|
410
|
+
}
|
|
411
|
+
if (key.includes('.')) {
|
|
412
|
+
throw new Error(`Mongoose maps do not support keys that contain ".", got "${key}"`);
|
|
413
|
+
}
|
|
414
|
+
if (specialProperties.has(key)) {
|
|
415
|
+
throw new Error(`Mongoose maps do not support reserved key name "${key}"`);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
module.exports = MongooseMap;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectId type constructor
|
|
3
|
+
*
|
|
4
|
+
* #### Example:
|
|
5
|
+
*
|
|
6
|
+
* const id = new mongoose.Types.ObjectId;
|
|
7
|
+
*
|
|
8
|
+
* @constructor ObjectId
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const ObjectId = require('mongodb/lib/bson').ObjectId;
|
|
14
|
+
const objectIdSymbol = require('../helpers/symbols').objectIdSymbol;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Getter for convenience with populate, see gh-6115
|
|
18
|
+
* @api private
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
Object.defineProperty(ObjectId.prototype, '_id', {
|
|
22
|
+
enumerable: false,
|
|
23
|
+
configurable: true,
|
|
24
|
+
get: function() {
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
/*!
|
|
30
|
+
* Convenience `valueOf()` to allow comparing ObjectIds using double equals re: gh-7299
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
if (!Object.hasOwn(ObjectId.prototype, 'valueOf')) {
|
|
34
|
+
ObjectId.prototype.valueOf = function objectIdValueOf() {
|
|
35
|
+
return this.toString();
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
ObjectId.prototype[objectIdSymbol] = true;
|
|
40
|
+
|
|
41
|
+
module.exports = ObjectId;
|