@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,436 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* Module dependencies.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const CastError = require('../error/cast');
|
|
8
|
+
const EventEmitter = require('events').EventEmitter;
|
|
9
|
+
const ObjectExpectedError = require('../error/objectExpected');
|
|
10
|
+
const SchemaSubdocumentOptions = require('../options/schemaSubdocumentOptions');
|
|
11
|
+
const SchemaType = require('../schemaType');
|
|
12
|
+
const applyDefaults = require('../helpers/document/applyDefaults');
|
|
13
|
+
const $exists = require('./operators/exists');
|
|
14
|
+
const castToNumber = require('./operators/helpers').castToNumber;
|
|
15
|
+
const createJSONSchemaTypeDefinition = require('../helpers/createJSONSchemaTypeDefinition');
|
|
16
|
+
const discriminator = require('../helpers/model/discriminator');
|
|
17
|
+
const geospatial = require('./operators/geospatial');
|
|
18
|
+
const getConstructor = require('../helpers/discriminator/getConstructor');
|
|
19
|
+
const handleIdOption = require('../helpers/schema/handleIdOption');
|
|
20
|
+
const internalToObjectOptions = require('../options').internalToObjectOptions;
|
|
21
|
+
const isExclusive = require('../helpers/projection/isExclusive');
|
|
22
|
+
const utils = require('../utils');
|
|
23
|
+
const InvalidSchemaOptionError = require('../error/invalidSchemaOption');
|
|
24
|
+
|
|
25
|
+
let SubdocumentType;
|
|
26
|
+
|
|
27
|
+
module.exports = SchemaSubdocument;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Single nested subdocument SchemaType constructor.
|
|
31
|
+
*
|
|
32
|
+
* @param {Schema} schema
|
|
33
|
+
* @param {String} path
|
|
34
|
+
* @param {Object} options
|
|
35
|
+
* @param {Schema} parentSchema
|
|
36
|
+
* @inherits SchemaType
|
|
37
|
+
* @api public
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
function SchemaSubdocument(schema, path, options, parentSchema) {
|
|
41
|
+
if (schema.options.timeseries) {
|
|
42
|
+
throw new InvalidSchemaOptionError(path, 'timeseries');
|
|
43
|
+
}
|
|
44
|
+
const schemaTypeIdOption = SchemaSubdocument.defaultOptions?._id;
|
|
45
|
+
if (schemaTypeIdOption != null) {
|
|
46
|
+
options = options || {};
|
|
47
|
+
options._id = schemaTypeIdOption;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
schema = handleIdOption(schema, options);
|
|
51
|
+
|
|
52
|
+
this.Constructor = _createConstructor(schema, null, options);
|
|
53
|
+
this.Constructor.path = path;
|
|
54
|
+
this.Constructor.prototype.$basePath = path;
|
|
55
|
+
this.schema = schema;
|
|
56
|
+
this.$isSingleNested = true;
|
|
57
|
+
this.base = schema.base;
|
|
58
|
+
SchemaType.call(this, path, options, 'Embedded', parentSchema);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/*!
|
|
62
|
+
* ignore
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
SchemaSubdocument.prototype = Object.create(SchemaType.prototype);
|
|
66
|
+
SchemaSubdocument.prototype.constructor = SchemaSubdocument;
|
|
67
|
+
SchemaSubdocument.prototype.OptionsConstructor = SchemaSubdocumentOptions;
|
|
68
|
+
|
|
69
|
+
/*!
|
|
70
|
+
* ignore
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
function _createConstructor(schema, baseClass, options) {
|
|
74
|
+
// lazy load
|
|
75
|
+
SubdocumentType || (SubdocumentType = require('../types/subdocument'));
|
|
76
|
+
|
|
77
|
+
const _embedded = function SingleNested(value, path, parent) {
|
|
78
|
+
this.$__parent = parent;
|
|
79
|
+
SubdocumentType.apply(this, arguments);
|
|
80
|
+
|
|
81
|
+
if (parent == null) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this.$session(parent.$session());
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
schema._preCompile();
|
|
88
|
+
|
|
89
|
+
const proto = baseClass?.prototype ?? SubdocumentType.prototype;
|
|
90
|
+
_embedded.prototype = Object.create(proto);
|
|
91
|
+
_embedded.prototype.$__setSchema(schema);
|
|
92
|
+
_embedded.prototype.constructor = _embedded;
|
|
93
|
+
_embedded.prototype.$__schemaTypeOptions = options;
|
|
94
|
+
_embedded.$__required = options?.required;
|
|
95
|
+
_embedded.base = schema.base;
|
|
96
|
+
_embedded.schema = schema;
|
|
97
|
+
_embedded.$isSingleNested = true;
|
|
98
|
+
_embedded.events = new EventEmitter();
|
|
99
|
+
_embedded.prototype.toBSON = function() {
|
|
100
|
+
return this.toObject(internalToObjectOptions);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// apply methods
|
|
104
|
+
for (const i in schema.methods) {
|
|
105
|
+
_embedded.prototype[i] = schema.methods[i];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// apply statics
|
|
109
|
+
for (const i in schema.statics) {
|
|
110
|
+
_embedded[i] = schema.statics[i];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
for (const i in EventEmitter.prototype) {
|
|
114
|
+
_embedded[i] = EventEmitter.prototype[i];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return _embedded;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/*!
|
|
121
|
+
* ignore
|
|
122
|
+
*/
|
|
123
|
+
const $conditionalHandlers = { ...SchemaType.prototype.$conditionalHandlers };
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Special case for when users use a common location schema to represent
|
|
127
|
+
* locations for use with $geoWithin.
|
|
128
|
+
* https://www.mongodb.com/docs/manual/reference/operator/query/geoWithin/
|
|
129
|
+
*
|
|
130
|
+
* @param {Object} val
|
|
131
|
+
* @api private
|
|
132
|
+
*/
|
|
133
|
+
|
|
134
|
+
$conditionalHandlers.$geoWithin = function handle$geoWithin(val, context) {
|
|
135
|
+
return { $geometry: this.castForQuery(null, val.$geometry, context) };
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/*!
|
|
139
|
+
* ignore
|
|
140
|
+
*/
|
|
141
|
+
|
|
142
|
+
$conditionalHandlers.$near =
|
|
143
|
+
$conditionalHandlers.$nearSphere = geospatial.cast$near;
|
|
144
|
+
|
|
145
|
+
$conditionalHandlers.$within =
|
|
146
|
+
$conditionalHandlers.$geoWithin = geospatial.cast$within;
|
|
147
|
+
|
|
148
|
+
$conditionalHandlers.$geoIntersects =
|
|
149
|
+
geospatial.cast$geoIntersects;
|
|
150
|
+
|
|
151
|
+
$conditionalHandlers.$minDistance = castToNumber;
|
|
152
|
+
$conditionalHandlers.$maxDistance = castToNumber;
|
|
153
|
+
|
|
154
|
+
$conditionalHandlers.$exists = $exists;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Contains the handlers for different query operators for this schema type.
|
|
158
|
+
* For example, `$conditionalHandlers.$exists` is the function Mongoose calls to cast `$exists` filter operators.
|
|
159
|
+
*
|
|
160
|
+
* @property $conditionalHandlers
|
|
161
|
+
* @memberOf SchemaSubdocument
|
|
162
|
+
* @instance
|
|
163
|
+
* @api public
|
|
164
|
+
*/
|
|
165
|
+
|
|
166
|
+
Object.defineProperty(SchemaSubdocument.prototype, '$conditionalHandlers', {
|
|
167
|
+
enumerable: false,
|
|
168
|
+
value: $conditionalHandlers
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Casts contents
|
|
173
|
+
*
|
|
174
|
+
* @param {Object} value
|
|
175
|
+
* @api private
|
|
176
|
+
*/
|
|
177
|
+
|
|
178
|
+
SchemaSubdocument.prototype.cast = function(val, doc, init, priorVal, options) {
|
|
179
|
+
if (val?.$isSingleNested && val.parent === doc) {
|
|
180
|
+
return val;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (!init && val != null && (typeof val !== 'object' || Array.isArray(val))) {
|
|
184
|
+
throw new ObjectExpectedError(this.path, val);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const discriminatorKeyPath = this.schema.path(this.schema.options.discriminatorKey);
|
|
188
|
+
const defaultDiscriminatorValue = discriminatorKeyPath == null ? null : discriminatorKeyPath.getDefault(doc);
|
|
189
|
+
const Constructor = getConstructor(this.Constructor, val, defaultDiscriminatorValue);
|
|
190
|
+
|
|
191
|
+
let subdoc;
|
|
192
|
+
|
|
193
|
+
// Only pull relevant selected paths and pull out the base path
|
|
194
|
+
const parentSelected = doc?.$__?.selected;
|
|
195
|
+
const path = this.path;
|
|
196
|
+
const selected = parentSelected == null ? null : Object.keys(parentSelected).reduce((obj, key) => {
|
|
197
|
+
if (key.startsWith(path + '.')) {
|
|
198
|
+
obj = obj || {};
|
|
199
|
+
obj[key.substring(path.length + 1)] = parentSelected[key];
|
|
200
|
+
}
|
|
201
|
+
return obj;
|
|
202
|
+
}, null);
|
|
203
|
+
if (init) {
|
|
204
|
+
subdoc = new Constructor(void 0, selected, doc, { defaults: false });
|
|
205
|
+
delete subdoc.$__.defaults;
|
|
206
|
+
// Don't pass `path` to $init - it's only for the subdocument itself, not its fields.
|
|
207
|
+
// For change tracking, subdocuments use relative paths internally.
|
|
208
|
+
// Here, `options.path` contains the absolute path and is only used by the subdocument constructor, not by $init.
|
|
209
|
+
if (options.path != null) {
|
|
210
|
+
options = { ...options };
|
|
211
|
+
delete options.path;
|
|
212
|
+
}
|
|
213
|
+
subdoc.$init(val, options);
|
|
214
|
+
const exclude = isExclusive(selected);
|
|
215
|
+
applyDefaults(subdoc, selected, exclude);
|
|
216
|
+
} else {
|
|
217
|
+
options = Object.assign({}, options, { priorDoc: priorVal });
|
|
218
|
+
if (utils.hasOwnKeys(val) === false) {
|
|
219
|
+
return new Constructor({}, selected, doc, options);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return new Constructor(val, selected, doc, options);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return subdoc;
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Casts contents for query
|
|
230
|
+
*
|
|
231
|
+
* @param {string} [$conditional] optional query operator (like `$eq` or `$in`)
|
|
232
|
+
* @param {any} value
|
|
233
|
+
* @api private
|
|
234
|
+
*/
|
|
235
|
+
|
|
236
|
+
SchemaSubdocument.prototype.castForQuery = function($conditional, val, context, options) {
|
|
237
|
+
let handler;
|
|
238
|
+
if ($conditional != null) {
|
|
239
|
+
handler = this.$conditionalHandlers[$conditional];
|
|
240
|
+
if (!handler) {
|
|
241
|
+
throw new Error('Can\'t use ' + $conditional);
|
|
242
|
+
}
|
|
243
|
+
return handler.call(this, val);
|
|
244
|
+
}
|
|
245
|
+
if (val == null) {
|
|
246
|
+
return val;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const Constructor = getConstructor(this.Constructor, val);
|
|
250
|
+
if (val instanceof Constructor) {
|
|
251
|
+
return val;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (this.options.runSetters) {
|
|
255
|
+
val = this._applySetters(val, context);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const overrideStrict = options?.strict ?? void 0;
|
|
259
|
+
|
|
260
|
+
try {
|
|
261
|
+
val = new Constructor(val, overrideStrict);
|
|
262
|
+
} catch (error) {
|
|
263
|
+
// Make sure we always wrap in a CastError (gh-6803)
|
|
264
|
+
if (!(error instanceof CastError)) {
|
|
265
|
+
throw new CastError('Embedded', val, this.path, error, this);
|
|
266
|
+
}
|
|
267
|
+
throw error;
|
|
268
|
+
}
|
|
269
|
+
return val;
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Async validation on this single nested doc.
|
|
274
|
+
*
|
|
275
|
+
* @api public
|
|
276
|
+
*/
|
|
277
|
+
|
|
278
|
+
SchemaSubdocument.prototype.doValidate = async function doValidate(value, scope, options) {
|
|
279
|
+
const Constructor = getConstructor(this.Constructor, value);
|
|
280
|
+
|
|
281
|
+
if (value && !(value instanceof Constructor)) {
|
|
282
|
+
value = new Constructor(value, null, scope?.$__ != null ? scope : null);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (options?.skipSchemaValidators) {
|
|
286
|
+
if (!value) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
return value.validate();
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
await SchemaType.prototype.doValidate.call(this, value, scope, options);
|
|
293
|
+
if (value != null) {
|
|
294
|
+
await value.validate();
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Synchronously validate this single nested doc
|
|
300
|
+
*
|
|
301
|
+
* @api private
|
|
302
|
+
*/
|
|
303
|
+
|
|
304
|
+
SchemaSubdocument.prototype.doValidateSync = function(value, scope, options) {
|
|
305
|
+
if (!options?.skipSchemaValidators) {
|
|
306
|
+
const schemaTypeError = SchemaType.prototype.doValidateSync.call(this, value, scope);
|
|
307
|
+
if (schemaTypeError) {
|
|
308
|
+
return schemaTypeError;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (!value) {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
return value.validateSync();
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Adds a discriminator to this single nested subdocument.
|
|
319
|
+
*
|
|
320
|
+
* #### Example:
|
|
321
|
+
*
|
|
322
|
+
* const shapeSchema = Schema({ name: String }, { discriminatorKey: 'kind' });
|
|
323
|
+
* const schema = Schema({ shape: shapeSchema });
|
|
324
|
+
*
|
|
325
|
+
* const singleNestedPath = parentSchema.path('shape');
|
|
326
|
+
* singleNestedPath.discriminator('Circle', Schema({ radius: Number }));
|
|
327
|
+
*
|
|
328
|
+
* @param {String} name
|
|
329
|
+
* @param {Schema} schema fields to add to the schema for instances of this sub-class
|
|
330
|
+
* @param {Object|string} [options] If string, same as `options.value`.
|
|
331
|
+
* @param {String} [options.value] the string stored in the `discriminatorKey` property. If not specified, Mongoose uses the `name` parameter.
|
|
332
|
+
* @param {Boolean} [options.clone=true] By default, `discriminator()` clones the given `schema`. Set to `false` to skip cloning.
|
|
333
|
+
* @return {Function} the constructor Mongoose will use for creating instances of this discriminator model
|
|
334
|
+
* @see discriminators https://mongoosejs.com/docs/discriminators.html
|
|
335
|
+
* @api public
|
|
336
|
+
*/
|
|
337
|
+
|
|
338
|
+
SchemaSubdocument.prototype.discriminator = function(name, schema, options) {
|
|
339
|
+
options = options || {};
|
|
340
|
+
const value = utils.isPOJO(options) ? options.value : options;
|
|
341
|
+
const clone = typeof options.clone === 'boolean'
|
|
342
|
+
? options.clone
|
|
343
|
+
: true;
|
|
344
|
+
|
|
345
|
+
if (schema.instanceOfSchema && clone) {
|
|
346
|
+
schema = schema.clone();
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
schema = discriminator(this.Constructor, name, schema, value, null, null, options.overwriteExisting);
|
|
350
|
+
|
|
351
|
+
this.Constructor.discriminators[name] = _createConstructor(schema, this.Constructor);
|
|
352
|
+
|
|
353
|
+
return this.Constructor.discriminators[name];
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
/*!
|
|
357
|
+
* ignore
|
|
358
|
+
*/
|
|
359
|
+
|
|
360
|
+
SchemaSubdocument.defaultOptions = {};
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Sets a default option for all Subdocument instances.
|
|
364
|
+
*
|
|
365
|
+
* #### Example:
|
|
366
|
+
*
|
|
367
|
+
* // Make all subdocuments required by default.
|
|
368
|
+
* mongoose.Schema.Types.Subdocument.set('required', true);
|
|
369
|
+
*
|
|
370
|
+
* @param {String} option The option you'd like to set the value for
|
|
371
|
+
* @param {Any} value value for option
|
|
372
|
+
* @return {void}
|
|
373
|
+
* @function set
|
|
374
|
+
* @static
|
|
375
|
+
* @api public
|
|
376
|
+
*/
|
|
377
|
+
|
|
378
|
+
SchemaSubdocument.set = SchemaType.set;
|
|
379
|
+
|
|
380
|
+
SchemaSubdocument.setters = [];
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Attaches a getter for all Subdocument instances
|
|
384
|
+
*
|
|
385
|
+
* @param {Function} getter
|
|
386
|
+
* @return {this}
|
|
387
|
+
* @function get
|
|
388
|
+
* @static
|
|
389
|
+
* @api public
|
|
390
|
+
*/
|
|
391
|
+
|
|
392
|
+
SchemaSubdocument.get = SchemaType.get;
|
|
393
|
+
|
|
394
|
+
/*!
|
|
395
|
+
* ignore
|
|
396
|
+
*/
|
|
397
|
+
|
|
398
|
+
SchemaSubdocument.prototype.toJSON = function toJSON() {
|
|
399
|
+
return { path: this.path, options: this.options };
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
/*!
|
|
403
|
+
* ignore
|
|
404
|
+
*/
|
|
405
|
+
|
|
406
|
+
SchemaSubdocument.prototype.clone = function() {
|
|
407
|
+
const schematype = new this.constructor(
|
|
408
|
+
this.schema,
|
|
409
|
+
this.path,
|
|
410
|
+
{ ...this.options, _skipApplyDiscriminators: true },
|
|
411
|
+
this.parentSchema
|
|
412
|
+
);
|
|
413
|
+
schematype.validators = this.validators.slice();
|
|
414
|
+
if (this.requiredValidator !== undefined) {
|
|
415
|
+
schematype.requiredValidator = this.requiredValidator;
|
|
416
|
+
}
|
|
417
|
+
schematype.Constructor.discriminators = Object.assign({}, this.Constructor.discriminators);
|
|
418
|
+
schematype._appliedDiscriminators = this._appliedDiscriminators;
|
|
419
|
+
return schematype;
|
|
420
|
+
};
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Returns this schema type's representation in a JSON schema.
|
|
424
|
+
*
|
|
425
|
+
* @param [options]
|
|
426
|
+
* @param [options.useBsonType=false] If true, return a representation with `bsonType` for use with MongoDB's `$jsonSchema`.
|
|
427
|
+
* @returns {Object} JSON schema properties
|
|
428
|
+
*/
|
|
429
|
+
|
|
430
|
+
SchemaSubdocument.prototype.toJSONSchema = function toJSONSchema(options) {
|
|
431
|
+
const isRequired = this.options.required && typeof this.options.required !== 'function';
|
|
432
|
+
return {
|
|
433
|
+
...this.schema.toJSONSchema(options),
|
|
434
|
+
...createJSONSchemaTypeDefinition('object', 'object', options?.useBsonType, isRequired)
|
|
435
|
+
};
|
|
436
|
+
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* ignore
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const SchemaUnionOptions = require('../options/schemaUnionOptions');
|
|
8
|
+
const SchemaType = require('../schemaType');
|
|
9
|
+
|
|
10
|
+
const firstValueSymbol = Symbol('firstValue');
|
|
11
|
+
|
|
12
|
+
/*!
|
|
13
|
+
* ignore
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
class Union extends SchemaType {
|
|
17
|
+
/**
|
|
18
|
+
* Create a Union schema type.
|
|
19
|
+
*
|
|
20
|
+
* @param {String} key the path in the schema for this schema type
|
|
21
|
+
* @param {Object} options SchemaType-specific options (must have 'of' as array)
|
|
22
|
+
* @param {Object} schemaOptions additional options from the schema this schematype belongs to
|
|
23
|
+
* @param {Schema} parentSchema the schema this schematype belongs to
|
|
24
|
+
*/
|
|
25
|
+
constructor(key, options, schemaOptions, parentSchema) {
|
|
26
|
+
super(key, options, 'Union', parentSchema);
|
|
27
|
+
if (!Array.isArray(options?.of) || options.of.length === 0) {
|
|
28
|
+
throw new Error('Union schema type requires an array of types');
|
|
29
|
+
}
|
|
30
|
+
this.schemaTypes = options.of.map(obj => parentSchema.interpretAsType(key, obj, schemaOptions));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
cast(val, doc, init, prev, options) {
|
|
34
|
+
let firstValue = firstValueSymbol;
|
|
35
|
+
let lastError;
|
|
36
|
+
// Loop through each schema type in the union. If one of the schematypes returns a value that is `=== val`, then
|
|
37
|
+
// use `val`. Otherwise, if one of the schematypes casted successfully, use the first successfully casted value.
|
|
38
|
+
// Finally, if none of the schematypes casted successfully, throw the error from the last schema type in the union.
|
|
39
|
+
// The `=== val` check is a workaround to ensure that the original value is returned if it matches one of the schema types,
|
|
40
|
+
// avoiding cases like where numbers are casted to strings or dates even if the schema type is a number.
|
|
41
|
+
for (let i = 0; i < this.schemaTypes.length; ++i) {
|
|
42
|
+
try {
|
|
43
|
+
const casted = this.schemaTypes[i].cast(val, doc, init, prev, options);
|
|
44
|
+
if (casted === val) {
|
|
45
|
+
return casted;
|
|
46
|
+
}
|
|
47
|
+
if (firstValue === firstValueSymbol) {
|
|
48
|
+
firstValue = casted;
|
|
49
|
+
}
|
|
50
|
+
} catch (error) {
|
|
51
|
+
lastError = error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (firstValue !== firstValueSymbol) {
|
|
55
|
+
return firstValue;
|
|
56
|
+
}
|
|
57
|
+
throw lastError;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Setters also need to be aware of casting - we need to apply the setters of the entry in the union we choose.
|
|
61
|
+
applySetters(val, doc, init, prev, options) {
|
|
62
|
+
let firstValue = firstValueSymbol;
|
|
63
|
+
let lastError;
|
|
64
|
+
// Loop through each schema type in the union. If one of the schematypes returns a value that is `=== val`, then
|
|
65
|
+
// use `val`. Otherwise, if one of the schematypes casted successfully, use the first successfully casted value.
|
|
66
|
+
// Finally, if none of the schematypes casted successfully, throw the error from the last schema type in the union.
|
|
67
|
+
// The `=== val` check is a workaround to ensure that the original value is returned if it matches one of the schema types,
|
|
68
|
+
// avoiding cases like where numbers are casted to strings or dates even if the schema type is a number.
|
|
69
|
+
for (let i = 0; i < this.schemaTypes.length; ++i) {
|
|
70
|
+
try {
|
|
71
|
+
let castedVal = this.schemaTypes[i]._applySetters(val, doc, init, prev, options);
|
|
72
|
+
if (castedVal == null) {
|
|
73
|
+
castedVal = this.schemaTypes[i]._castNullish(castedVal);
|
|
74
|
+
} else {
|
|
75
|
+
castedVal = this.schemaTypes[i].cast(castedVal, doc, init, prev, options);
|
|
76
|
+
}
|
|
77
|
+
if (castedVal === val) {
|
|
78
|
+
return castedVal;
|
|
79
|
+
}
|
|
80
|
+
if (firstValue === firstValueSymbol) {
|
|
81
|
+
firstValue = castedVal;
|
|
82
|
+
}
|
|
83
|
+
} catch (error) {
|
|
84
|
+
lastError = error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (firstValue !== firstValueSymbol) {
|
|
88
|
+
return firstValue;
|
|
89
|
+
}
|
|
90
|
+
throw lastError;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
clone() {
|
|
94
|
+
const schematype = super.clone();
|
|
95
|
+
|
|
96
|
+
schematype.schemaTypes = this.schemaTypes.map(schemaType => schemaType.clone());
|
|
97
|
+
return schematype;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* This schema type's name, to defend against minifiers that mangle
|
|
103
|
+
* function names.
|
|
104
|
+
*
|
|
105
|
+
* @api public
|
|
106
|
+
*/
|
|
107
|
+
Union.schemaName = 'Union';
|
|
108
|
+
|
|
109
|
+
Union.defaultOptions = {};
|
|
110
|
+
|
|
111
|
+
Union.prototype.OptionsConstructor = SchemaUnionOptions;
|
|
112
|
+
|
|
113
|
+
module.exports = Union;
|