mongoose 9.10.1 → 9.10.2
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/lib/helpers/clone.js +9 -0
- package/lib/model.js +12 -0
- package/lib/schema/map.js +13 -14
- package/lib/schema.js +20 -6
- package/lib/types/documentArray/methods/index.js +20 -0
- package/package.json +1 -1
package/lib/helpers/clone.js
CHANGED
|
@@ -197,6 +197,11 @@ function cloneObject(obj, options, isArrayChild) {
|
|
|
197
197
|
}
|
|
198
198
|
|
|
199
199
|
function cloneArray(arr, options) {
|
|
200
|
+
const seen = options?._seen;
|
|
201
|
+
if (seen && seen.has(arr)) {
|
|
202
|
+
return seen.get(arr);
|
|
203
|
+
}
|
|
204
|
+
|
|
200
205
|
let i = 0;
|
|
201
206
|
const len = arr.length;
|
|
202
207
|
|
|
@@ -218,6 +223,10 @@ function cloneArray(arr, options) {
|
|
|
218
223
|
ret = new Array(len);
|
|
219
224
|
}
|
|
220
225
|
|
|
226
|
+
if (seen) {
|
|
227
|
+
seen.set(arr, ret);
|
|
228
|
+
}
|
|
229
|
+
|
|
221
230
|
arr = isMongooseArray(arr) ? arr.__array : arr;
|
|
222
231
|
if (ret.isMongooseDocumentArray) {
|
|
223
232
|
// Create new options object to avoid mutating the shared options.
|
package/lib/model.js
CHANGED
|
@@ -3951,6 +3951,18 @@ Model.castObject = function castObject(obj, options) {
|
|
|
3951
3951
|
}
|
|
3952
3952
|
|
|
3953
3953
|
if (error != null) {
|
|
3954
|
+
// `{MODEL}` is replaced for query casting and document validation, so do it
|
|
3955
|
+
// here too. Only the top-level call knows the model: the recursive calls for
|
|
3956
|
+
// subdocuments are invoked on the subdocument constructor, which has no
|
|
3957
|
+
// `modelName`, so this runs once over every collected error. (gh-8300)
|
|
3958
|
+
if (this.modelName != null) {
|
|
3959
|
+
for (const key of Object.keys(error.errors)) {
|
|
3960
|
+
const err = error.errors[key];
|
|
3961
|
+
if (typeof err.setModel === 'function') {
|
|
3962
|
+
err.setModel(this);
|
|
3963
|
+
}
|
|
3964
|
+
}
|
|
3965
|
+
}
|
|
3954
3966
|
throw error;
|
|
3955
3967
|
}
|
|
3956
3968
|
|
package/lib/schema/map.js
CHANGED
|
@@ -30,20 +30,6 @@ class SchemaMap extends SchemaType {
|
|
|
30
30
|
this._createNestedSchemaType(parentSchema, key, options, schemaOptions);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
/**
|
|
34
|
-
* Sets a default option for all Map instances.
|
|
35
|
-
*
|
|
36
|
-
* @param {string} option The option you'd like to set the value for
|
|
37
|
-
* @param {any} value value for option
|
|
38
|
-
* @return {undefined}
|
|
39
|
-
* @function set
|
|
40
|
-
* @api public
|
|
41
|
-
*/
|
|
42
|
-
|
|
43
|
-
set(option, value) {
|
|
44
|
-
return SchemaType.set(option, value);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
33
|
/**
|
|
48
34
|
* Casts to Map
|
|
49
35
|
*
|
|
@@ -143,6 +129,19 @@ class SchemaMap extends SchemaType {
|
|
|
143
129
|
}
|
|
144
130
|
}
|
|
145
131
|
|
|
132
|
+
/**
|
|
133
|
+
* Sets a default option for all Map instances.
|
|
134
|
+
*
|
|
135
|
+
* @param {string} option The option you'd like to set the value for
|
|
136
|
+
* @param {any} value value for option
|
|
137
|
+
* @return {undefined}
|
|
138
|
+
* @function set
|
|
139
|
+
* @static
|
|
140
|
+
* @api public
|
|
141
|
+
*/
|
|
142
|
+
|
|
143
|
+
SchemaMap.set = SchemaType.set;
|
|
144
|
+
|
|
146
145
|
/**
|
|
147
146
|
* This schema type's name, to defend against minifiers that mangle
|
|
148
147
|
* function names.
|
package/lib/schema.js
CHANGED
|
@@ -595,12 +595,6 @@ Schema.prototype.omit = function(paths, options) {
|
|
|
595
595
|
|
|
596
596
|
newSchema.remove(paths);
|
|
597
597
|
|
|
598
|
-
for (const nested in newSchema.singleNestedPaths) {
|
|
599
|
-
if (paths.includes(nested)) {
|
|
600
|
-
delete newSchema.singleNestedPaths[nested];
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
|
|
604
598
|
return newSchema;
|
|
605
599
|
};
|
|
606
600
|
|
|
@@ -2831,6 +2825,7 @@ Schema.prototype.remove = function(path) {
|
|
|
2831
2825
|
this.mapPaths = this.mapPaths.filter(
|
|
2832
2826
|
schemaType => !schemaType.path.startsWith(name + '.')
|
|
2833
2827
|
);
|
|
2828
|
+
_deleteSubpaths(this, name);
|
|
2834
2829
|
|
|
2835
2830
|
delete this.nested[name];
|
|
2836
2831
|
_deletePath(this, name);
|
|
@@ -2849,6 +2844,11 @@ Schema.prototype.remove = function(path) {
|
|
|
2849
2844
|
this.mapPaths = this.mapPaths.filter(
|
|
2850
2845
|
schemaType => !schemaType.path.startsWith(name + '.')
|
|
2851
2846
|
);
|
|
2847
|
+
// A document array registers its element paths under `subpaths` and a
|
|
2848
|
+
// single nested subdocument registers its paths under `singleNestedPaths`.
|
|
2849
|
+
// Left behind, they keep answering `path()` and `pathType()`, and queries
|
|
2850
|
+
// on the removed path keep being cast.
|
|
2851
|
+
_deleteSubpaths(this, name);
|
|
2852
2852
|
_deletePath(this, name);
|
|
2853
2853
|
|
|
2854
2854
|
this._removeEncryptedField(name);
|
|
@@ -2861,6 +2861,20 @@ Schema.prototype.remove = function(path) {
|
|
|
2861
2861
|
* ignore
|
|
2862
2862
|
*/
|
|
2863
2863
|
|
|
2864
|
+
function _deleteSubpaths(schema, name) {
|
|
2865
|
+
const prefix = name + '.';
|
|
2866
|
+
for (const subpath of Object.keys(schema.subpaths)) {
|
|
2867
|
+
if (subpath === name || subpath.startsWith(prefix)) {
|
|
2868
|
+
delete schema.subpaths[subpath];
|
|
2869
|
+
}
|
|
2870
|
+
}
|
|
2871
|
+
for (const subpath of Object.keys(schema.singleNestedPaths)) {
|
|
2872
|
+
if (subpath === name || subpath.startsWith(prefix)) {
|
|
2873
|
+
delete schema.singleNestedPaths[subpath];
|
|
2874
|
+
}
|
|
2875
|
+
}
|
|
2876
|
+
}
|
|
2877
|
+
|
|
2864
2878
|
function _deletePath(schema, name) {
|
|
2865
2879
|
const pieces = name.split('.');
|
|
2866
2880
|
const last = pieces.pop();
|
|
@@ -211,6 +211,26 @@ const methods = {
|
|
|
211
211
|
return this.constructor.prototype.toObject.apply(this, arguments);
|
|
212
212
|
},
|
|
213
213
|
|
|
214
|
+
/**
|
|
215
|
+
* Wraps [`MongooseArray#addToSet`](https://mongoosejs.com/docs/api/array.html#MongooseArray.prototype.addToSet())
|
|
216
|
+
* with proper change tracking.
|
|
217
|
+
*
|
|
218
|
+
* @param {...object} [args]
|
|
219
|
+
* @api public
|
|
220
|
+
* @method addToSet
|
|
221
|
+
* @memberOf MongooseDocumentArray
|
|
222
|
+
*/
|
|
223
|
+
|
|
224
|
+
addToSet() {
|
|
225
|
+
// Arguments are cast before duplicates are skipped, so any value added
|
|
226
|
+
// after a skipped duplicate is cast with an index that is too high.
|
|
227
|
+
const ret = ArrayMethods.addToSet.apply(this, arguments);
|
|
228
|
+
|
|
229
|
+
_updateSubdocIndexes(this);
|
|
230
|
+
|
|
231
|
+
return ret;
|
|
232
|
+
},
|
|
233
|
+
|
|
214
234
|
/**
|
|
215
235
|
* Wraps [`Array#push`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push) with proper change tracking.
|
|
216
236
|
*
|