@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,464 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const Document = require('../document');
|
|
4
|
+
const internalToObjectOptions = require('../options').internalToObjectOptions;
|
|
5
|
+
const util = require('util');
|
|
6
|
+
const utils = require('../utils');
|
|
7
|
+
|
|
8
|
+
module.exports = Subdocument;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Subdocument constructor.
|
|
12
|
+
*
|
|
13
|
+
* @inherits Document
|
|
14
|
+
* @api private
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
function Subdocument(value, fields, parent, options) {
|
|
18
|
+
if (parent != null) {
|
|
19
|
+
// If setting a nested path, should copy isNew from parent re: gh-7048
|
|
20
|
+
const parentOptions = { isNew: parent.isNew };
|
|
21
|
+
if ('defaults' in parent.$__) {
|
|
22
|
+
parentOptions.defaults = parent.$__.defaults;
|
|
23
|
+
}
|
|
24
|
+
options = Object.assign(parentOptions, options);
|
|
25
|
+
}
|
|
26
|
+
if (options?.path != null) {
|
|
27
|
+
this.$basePath = options.path;
|
|
28
|
+
}
|
|
29
|
+
if (options?.pathRelativeToParent != null) {
|
|
30
|
+
this.$pathRelativeToParent = options.pathRelativeToParent;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Don't pass `path` to Document constructor: path is used for storing the
|
|
34
|
+
// absolute path to this schematype relative to the top-level document, but
|
|
35
|
+
// subdocuments use relative paths (relative to the parent document) to track changes.
|
|
36
|
+
// This avoids the subdocument's fields receiving the subdocument's path as options.path.
|
|
37
|
+
let documentOptions = options;
|
|
38
|
+
if (options?.path != null) {
|
|
39
|
+
documentOptions = Object.assign({}, options);
|
|
40
|
+
delete documentOptions.path;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
Document.call(this, value, fields, documentOptions);
|
|
44
|
+
|
|
45
|
+
delete this.$__.priorDoc;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
Subdocument.prototype = Object.create(Document.prototype);
|
|
49
|
+
|
|
50
|
+
Object.defineProperty(Subdocument.prototype, '$isSubdocument', {
|
|
51
|
+
configurable: false,
|
|
52
|
+
writable: false,
|
|
53
|
+
value: true
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
Object.defineProperty(Subdocument.prototype, '$isSingleNested', {
|
|
57
|
+
configurable: false,
|
|
58
|
+
writable: false,
|
|
59
|
+
value: true
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
/*!
|
|
63
|
+
* ignore
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
Subdocument.prototype.toBSON = function() {
|
|
67
|
+
return this.toObject(internalToObjectOptions);
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Used as a stub for middleware
|
|
72
|
+
*
|
|
73
|
+
* #### Note:
|
|
74
|
+
*
|
|
75
|
+
* _This is a no-op. Does not actually save the doc to the db._
|
|
76
|
+
*
|
|
77
|
+
* @param {Function} [fn]
|
|
78
|
+
* @return {Promise} resolved Promise
|
|
79
|
+
* @api private
|
|
80
|
+
*/
|
|
81
|
+
|
|
82
|
+
Subdocument.prototype.save = async function save(options) {
|
|
83
|
+
options = options || {};
|
|
84
|
+
|
|
85
|
+
if (!options.suppressWarning) {
|
|
86
|
+
utils.warn('mongoose: calling `save()` on a subdoc does **not** save ' +
|
|
87
|
+
'the document to MongoDB, it only runs save middleware. ' +
|
|
88
|
+
'Use `subdoc.save({ suppressWarning: true })` to hide this warning ' +
|
|
89
|
+
'if you\'re sure this behavior is right for your app.');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return await this.$__save();
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Given a path relative to this document, return the path relative
|
|
97
|
+
* to the top-level document.
|
|
98
|
+
* @param {String} path
|
|
99
|
+
* @method $__fullPath
|
|
100
|
+
* @memberOf Subdocument
|
|
101
|
+
* @instance
|
|
102
|
+
* @returns {String}
|
|
103
|
+
* @api private
|
|
104
|
+
*/
|
|
105
|
+
|
|
106
|
+
Subdocument.prototype.$__fullPath = function(path) {
|
|
107
|
+
if (!this.$__.fullPath) {
|
|
108
|
+
this.ownerDocument();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return path ?
|
|
112
|
+
this.$__.fullPath + '.' + path :
|
|
113
|
+
this.$__.fullPath;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Given a path relative to this document, return the path relative
|
|
118
|
+
* to the parent document.
|
|
119
|
+
* @param {String} p
|
|
120
|
+
* @returns {String}
|
|
121
|
+
* @method $__pathRelativeToParent
|
|
122
|
+
* @memberOf Subdocument
|
|
123
|
+
* @instance
|
|
124
|
+
* @api private
|
|
125
|
+
*/
|
|
126
|
+
|
|
127
|
+
Subdocument.prototype.$__pathRelativeToParent = function(p) {
|
|
128
|
+
// If this subdocument has a stored relative path (set by map when subdoc is created),
|
|
129
|
+
// use it directly to avoid string operations
|
|
130
|
+
if (this.$pathRelativeToParent != null) {
|
|
131
|
+
return p == null ? this.$pathRelativeToParent : this.$pathRelativeToParent + '.' + p;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (p == null) {
|
|
135
|
+
return this.$basePath;
|
|
136
|
+
}
|
|
137
|
+
if (!this.$basePath) {
|
|
138
|
+
return p;
|
|
139
|
+
}
|
|
140
|
+
return [this.$basePath, p].join('.');
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Used as a stub for middleware
|
|
145
|
+
*
|
|
146
|
+
* #### Note:
|
|
147
|
+
*
|
|
148
|
+
* _This is a no-op. Does not actually save the doc to the db._
|
|
149
|
+
*
|
|
150
|
+
* @param {Function} [fn]
|
|
151
|
+
* @method $__save
|
|
152
|
+
* @api private
|
|
153
|
+
*/
|
|
154
|
+
|
|
155
|
+
Subdocument.prototype.$__save = async function $__save() {
|
|
156
|
+
try {
|
|
157
|
+
await this._execDocumentPreHooks('save');
|
|
158
|
+
} catch (error) {
|
|
159
|
+
await this._execDocumentPostHooks('save', error);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
await this._execDocumentPostHooks('save');
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
/*!
|
|
167
|
+
* ignore
|
|
168
|
+
*/
|
|
169
|
+
|
|
170
|
+
Subdocument.prototype.$isValid = function(path) {
|
|
171
|
+
const parent = this.$parent();
|
|
172
|
+
const fullPath = this.$__pathRelativeToParent(path);
|
|
173
|
+
if (parent != null && fullPath != null) {
|
|
174
|
+
return parent.$isValid(fullPath);
|
|
175
|
+
}
|
|
176
|
+
return Document.prototype.$isValid.call(this, path);
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/*!
|
|
180
|
+
* ignore
|
|
181
|
+
*/
|
|
182
|
+
|
|
183
|
+
Subdocument.prototype.markModified = function(path) {
|
|
184
|
+
Document.prototype.markModified.call(this, path);
|
|
185
|
+
const parent = this.$parent();
|
|
186
|
+
|
|
187
|
+
if (parent == null) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const pathToMark = this.$__pathRelativeToParent(path);
|
|
192
|
+
if (pathToMark == null) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const myPath = this.$__pathRelativeToParent().replace(/\.$/, '');
|
|
197
|
+
if (parent.isDirectModified(myPath) || this.isNew) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
this.$__parent.markModified(pathToMark, this);
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
/*!
|
|
205
|
+
* ignore
|
|
206
|
+
*/
|
|
207
|
+
|
|
208
|
+
Subdocument.prototype.isModified = function(paths, options, modifiedPaths) {
|
|
209
|
+
const parent = this.$parent();
|
|
210
|
+
if (parent != null) {
|
|
211
|
+
if (Array.isArray(paths) || typeof paths === 'string') {
|
|
212
|
+
paths = (Array.isArray(paths) ? paths : paths.split(' '));
|
|
213
|
+
paths = paths.map(p => this.$__pathRelativeToParent(p)).filter(p => p != null);
|
|
214
|
+
} else if (!paths) {
|
|
215
|
+
paths = this.$__pathRelativeToParent();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return parent.$isModified(paths, options, modifiedPaths);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return Document.prototype.isModified.call(this, paths, options, modifiedPaths);
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Marks a path as valid, removing existing validation errors.
|
|
226
|
+
*
|
|
227
|
+
* @param {String} path the field to mark as valid
|
|
228
|
+
* @api private
|
|
229
|
+
* @method $markValid
|
|
230
|
+
* @memberOf Subdocument
|
|
231
|
+
*/
|
|
232
|
+
|
|
233
|
+
Subdocument.prototype.$markValid = function(path) {
|
|
234
|
+
Document.prototype.$markValid.call(this, path);
|
|
235
|
+
const parent = this.$parent();
|
|
236
|
+
const fullPath = this.$__pathRelativeToParent(path);
|
|
237
|
+
if (parent != null && fullPath != null) {
|
|
238
|
+
parent.$markValid(fullPath);
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
/*!
|
|
243
|
+
* ignore
|
|
244
|
+
*/
|
|
245
|
+
|
|
246
|
+
Subdocument.prototype.invalidate = function(path, err, val) {
|
|
247
|
+
Document.prototype.invalidate.call(this, path, err, val);
|
|
248
|
+
|
|
249
|
+
const parent = this.$parent();
|
|
250
|
+
const fullPath = this.$__pathRelativeToParent(path);
|
|
251
|
+
if (parent != null && fullPath != null) {
|
|
252
|
+
parent.invalidate(fullPath, err, val);
|
|
253
|
+
} else if (err.kind === 'cast' || err.name === 'CastError' || fullPath == null) {
|
|
254
|
+
throw err;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return this.ownerDocument().$__.validationError;
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
/*!
|
|
261
|
+
* ignore
|
|
262
|
+
*/
|
|
263
|
+
|
|
264
|
+
Subdocument.prototype.$ignore = function(path) {
|
|
265
|
+
Document.prototype.$ignore.call(this, path);
|
|
266
|
+
const parent = this.$parent();
|
|
267
|
+
const fullPath = this.$__pathRelativeToParent(path);
|
|
268
|
+
if (parent != null && fullPath != null) {
|
|
269
|
+
parent.$ignore(fullPath);
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Returns the top level document of this sub-document.
|
|
275
|
+
*
|
|
276
|
+
* @return {Document}
|
|
277
|
+
*/
|
|
278
|
+
|
|
279
|
+
Subdocument.prototype.ownerDocument = function() {
|
|
280
|
+
if (this.$__.ownerDocument) {
|
|
281
|
+
return this.$__.ownerDocument;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
let parent = this;
|
|
285
|
+
const paths = [];
|
|
286
|
+
const seenDocs = new Set([parent]);
|
|
287
|
+
|
|
288
|
+
while (true) {
|
|
289
|
+
if (typeof parent.$__pathRelativeToParent !== 'function') {
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
paths.unshift(parent.$__pathRelativeToParent(void 0, true));
|
|
293
|
+
const _parent = parent.$parent();
|
|
294
|
+
if (_parent == null) {
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
parent = _parent;
|
|
298
|
+
if (seenDocs.has(parent)) {
|
|
299
|
+
throw new Error('Infinite subdocument loop: subdoc with _id ' + parent._id + ' is a parent of itself');
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
seenDocs.add(parent);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
this.$__.fullPath = paths.join('.');
|
|
306
|
+
|
|
307
|
+
this.$__.ownerDocument = parent;
|
|
308
|
+
return this.$__.ownerDocument;
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
/*!
|
|
312
|
+
* ignore
|
|
313
|
+
*/
|
|
314
|
+
|
|
315
|
+
Subdocument.prototype.$__fullPathWithIndexes = function() {
|
|
316
|
+
let parent = this;
|
|
317
|
+
const paths = [];
|
|
318
|
+
const seenDocs = new Set([parent]);
|
|
319
|
+
|
|
320
|
+
while (true) {
|
|
321
|
+
if (typeof parent.$__pathRelativeToParent !== 'function') {
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
paths.unshift(parent.$__pathRelativeToParent(void 0, false));
|
|
325
|
+
const _parent = parent.$parent();
|
|
326
|
+
if (_parent == null) {
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
parent = _parent;
|
|
330
|
+
if (seenDocs.has(parent)) {
|
|
331
|
+
throw new Error('Infinite subdocument loop: subdoc with _id ' + parent._id + ' is a parent of itself');
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
seenDocs.add(parent);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return paths.join('.');
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Returns this sub-documents parent document.
|
|
342
|
+
*
|
|
343
|
+
* @api public
|
|
344
|
+
*/
|
|
345
|
+
|
|
346
|
+
Subdocument.prototype.parent = function() {
|
|
347
|
+
return this.$__parent;
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Returns this sub-documents parent document.
|
|
352
|
+
*
|
|
353
|
+
* @api public
|
|
354
|
+
* @method $parent
|
|
355
|
+
*/
|
|
356
|
+
|
|
357
|
+
Subdocument.prototype.$parent = Subdocument.prototype.parent;
|
|
358
|
+
|
|
359
|
+
/*!
|
|
360
|
+
* Sets this sub-documents parent document.
|
|
361
|
+
*
|
|
362
|
+
* @api private
|
|
363
|
+
*/
|
|
364
|
+
|
|
365
|
+
Subdocument.prototype.$__setParent = function $__setParent(parent) {
|
|
366
|
+
this.$__parent = parent;
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* ignore
|
|
371
|
+
* @method $__removeFromParent
|
|
372
|
+
* @memberOf Subdocument
|
|
373
|
+
* @instance
|
|
374
|
+
* @api private
|
|
375
|
+
*/
|
|
376
|
+
|
|
377
|
+
Subdocument.prototype.$__removeFromParent = function() {
|
|
378
|
+
this.$__parent.set(this.$basePath, null);
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Null-out this subdoc
|
|
383
|
+
*
|
|
384
|
+
* @param {Object} [options]
|
|
385
|
+
*/
|
|
386
|
+
|
|
387
|
+
Subdocument.prototype.deleteOne = function deleteOne(options) {
|
|
388
|
+
registerRemoveListener(this);
|
|
389
|
+
|
|
390
|
+
// If removing entire doc, no need to remove subdoc
|
|
391
|
+
if (!options?.noop) {
|
|
392
|
+
this.$__removeFromParent();
|
|
393
|
+
|
|
394
|
+
const owner = this.ownerDocument();
|
|
395
|
+
owner.$__.removedSubdocs = owner.$__.removedSubdocs || [];
|
|
396
|
+
owner.$__.removedSubdocs.push(this);
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
/*!
|
|
401
|
+
* ignore
|
|
402
|
+
*/
|
|
403
|
+
|
|
404
|
+
Subdocument.prototype.populate = function() {
|
|
405
|
+
throw new Error('Mongoose does not support calling populate() on nested ' +
|
|
406
|
+
'docs. Instead of `doc.nested.populate("path")`, use ' +
|
|
407
|
+
'`doc.populate("nested.path")`');
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Helper for console.log
|
|
412
|
+
*
|
|
413
|
+
* @api public
|
|
414
|
+
*/
|
|
415
|
+
|
|
416
|
+
Subdocument.prototype.inspect = function() {
|
|
417
|
+
return this.toObject();
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
if (util.inspect.custom) {
|
|
421
|
+
// Avoid Node deprecation warning DEP0079
|
|
422
|
+
Subdocument.prototype[util.inspect.custom] = Subdocument.prototype.inspect;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Override `$toObject()` to handle minimizing the whole path. Should not minimize if schematype-level minimize
|
|
427
|
+
* is set to false re: gh-11247, gh-14058, gh-14151
|
|
428
|
+
*/
|
|
429
|
+
|
|
430
|
+
Subdocument.prototype.$toObject = function $toObject(options, json) {
|
|
431
|
+
const ret = Document.prototype.$toObject.call(this, options, json);
|
|
432
|
+
|
|
433
|
+
// If `$toObject()` was called recursively, respect the minimize option, including schematype level minimize.
|
|
434
|
+
// If minimize is set, then we can minimize out the whole object.
|
|
435
|
+
if (utils.hasOwnKeys(ret) === false && options?._calledWithOptions != null) {
|
|
436
|
+
const minimize = options._calledWithOptions?.minimize ?? this?.$__schemaTypeOptions?.minimize ?? options.minimize;
|
|
437
|
+
if (minimize && !this.constructor.$__required) {
|
|
438
|
+
return undefined;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return ret;
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Registers remove event listeners for triggering
|
|
446
|
+
* on subdocuments.
|
|
447
|
+
*
|
|
448
|
+
* @param {Subdocument} sub
|
|
449
|
+
* @api private
|
|
450
|
+
*/
|
|
451
|
+
|
|
452
|
+
function registerRemoveListener(sub) {
|
|
453
|
+
const owner = sub.ownerDocument();
|
|
454
|
+
|
|
455
|
+
function emitRemove() {
|
|
456
|
+
owner.$removeListener('save', emitRemove);
|
|
457
|
+
owner.$removeListener('deleteOne', emitRemove);
|
|
458
|
+
sub.emit('deleteOne', sub);
|
|
459
|
+
sub.constructor.emit('deleteOne', sub);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
owner.$on('save', emitRemove);
|
|
463
|
+
owner.$on('deleteOne', emitRemove);
|
|
464
|
+
}
|