@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,656 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* Module dependencies.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const CastError = require('../error/cast');
|
|
8
|
+
const DocumentArrayElement = require('./documentArrayElement');
|
|
9
|
+
const EventEmitter = require('events').EventEmitter;
|
|
10
|
+
const SchemaArray = require('./array');
|
|
11
|
+
const SchemaDocumentArrayOptions =
|
|
12
|
+
require('../options/schemaDocumentArrayOptions');
|
|
13
|
+
const SchemaType = require('../schemaType');
|
|
14
|
+
const cast = require('../cast');
|
|
15
|
+
const createJSONSchemaTypeDefinition = require('../helpers/createJSONSchemaTypeDefinition');
|
|
16
|
+
const discriminator = require('../helpers/model/discriminator');
|
|
17
|
+
const handleIdOption = require('../helpers/schema/handleIdOption');
|
|
18
|
+
const handleSpreadDoc = require('../helpers/document/handleSpreadDoc');
|
|
19
|
+
const isOperator = require('../helpers/query/isOperator');
|
|
20
|
+
const utils = require('../utils');
|
|
21
|
+
const getConstructor = require('../helpers/discriminator/getConstructor');
|
|
22
|
+
const InvalidSchemaOptionError = require('../error/invalidSchemaOption');
|
|
23
|
+
|
|
24
|
+
const arrayAtomicsSymbol = require('../helpers/symbols').arrayAtomicsSymbol;
|
|
25
|
+
const arrayPathSymbol = require('../helpers/symbols').arrayPathSymbol;
|
|
26
|
+
const documentArrayParent = require('../helpers/symbols').documentArrayParent;
|
|
27
|
+
|
|
28
|
+
let MongooseDocumentArray;
|
|
29
|
+
let Subdocument;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* SubdocsArray SchemaType constructor
|
|
33
|
+
*
|
|
34
|
+
* @param {String} key
|
|
35
|
+
* @param {Schema} schema
|
|
36
|
+
* @param {Object} options
|
|
37
|
+
* @param {Object} schemaOptions
|
|
38
|
+
* @param {Schema} parentSchema
|
|
39
|
+
* @inherits SchemaArray
|
|
40
|
+
* @api public
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
function SchemaDocumentArray(key, schema, options, schemaOptions, parentSchema) {
|
|
44
|
+
if (schema.options?.timeseries) {
|
|
45
|
+
throw new InvalidSchemaOptionError(key, 'timeseries');
|
|
46
|
+
}
|
|
47
|
+
const schemaTypeIdOption = SchemaDocumentArray.defaultOptions?._id;
|
|
48
|
+
if (schemaTypeIdOption != null) {
|
|
49
|
+
schemaOptions = schemaOptions || {};
|
|
50
|
+
schemaOptions._id = schemaTypeIdOption;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (schemaOptions?._id != null) {
|
|
54
|
+
schema = handleIdOption(schema, schemaOptions);
|
|
55
|
+
} else if (options?._id != null) {
|
|
56
|
+
schema = handleIdOption(schema, options);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const Constructor = _createConstructor(schema, options);
|
|
60
|
+
Constructor.prototype.$basePath = key;
|
|
61
|
+
Constructor.path = key;
|
|
62
|
+
|
|
63
|
+
const $parentSchemaType = this;
|
|
64
|
+
const embeddedSchemaType = new DocumentArrayElement(key + '.$', schema, {
|
|
65
|
+
...(schemaOptions || {}),
|
|
66
|
+
$parentSchemaType,
|
|
67
|
+
Constructor
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
SchemaArray.call(this, key, embeddedSchemaType, options, null, parentSchema);
|
|
71
|
+
|
|
72
|
+
this.schema = schema;
|
|
73
|
+
// EmbeddedDocument schematype options
|
|
74
|
+
this.schemaOptions = schemaOptions || {};
|
|
75
|
+
this.$isMongooseDocumentArray = true;
|
|
76
|
+
this.Constructor = Constructor;
|
|
77
|
+
|
|
78
|
+
Constructor.base = schema.base;
|
|
79
|
+
|
|
80
|
+
const fn = this.defaultValue;
|
|
81
|
+
|
|
82
|
+
if (!('defaultValue' in this) || fn != null) {
|
|
83
|
+
this.default(function() {
|
|
84
|
+
let arr = fn.call(this);
|
|
85
|
+
if (arr != null && !Array.isArray(arr)) {
|
|
86
|
+
arr = [arr];
|
|
87
|
+
}
|
|
88
|
+
// Leave it up to `cast()` to convert this to a documentarray
|
|
89
|
+
return arr;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* This schema type's name, to defend against minifiers that mangle
|
|
96
|
+
* function names.
|
|
97
|
+
*
|
|
98
|
+
* @api public
|
|
99
|
+
*/
|
|
100
|
+
SchemaDocumentArray.schemaName = 'DocumentArray';
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Options for all document arrays.
|
|
104
|
+
*
|
|
105
|
+
* - `castNonArrays`: `true` by default. If `false`, Mongoose will throw a CastError when a value isn't an array. If `true`, Mongoose will wrap the provided value in an array before casting.
|
|
106
|
+
*
|
|
107
|
+
* @api public
|
|
108
|
+
*/
|
|
109
|
+
|
|
110
|
+
SchemaDocumentArray.options = { castNonArrays: true };
|
|
111
|
+
|
|
112
|
+
/*!
|
|
113
|
+
* Inherits from SchemaArray.
|
|
114
|
+
*/
|
|
115
|
+
SchemaDocumentArray.prototype = Object.create(SchemaArray.prototype);
|
|
116
|
+
SchemaDocumentArray.prototype.constructor = SchemaDocumentArray;
|
|
117
|
+
SchemaDocumentArray.prototype.OptionsConstructor = SchemaDocumentArrayOptions;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Contains the handlers for different query operators for this schema type.
|
|
121
|
+
* For example, `$conditionalHandlers.$size` is the function Mongoose calls to cast `$size` filter operators.
|
|
122
|
+
*
|
|
123
|
+
* @property $conditionalHandlers
|
|
124
|
+
* @memberOf SchemaDocumentArray
|
|
125
|
+
* @instance
|
|
126
|
+
* @api public
|
|
127
|
+
*/
|
|
128
|
+
|
|
129
|
+
Object.defineProperty(SchemaDocumentArray.prototype, '$conditionalHandlers', {
|
|
130
|
+
enumerable: false,
|
|
131
|
+
value: { ...SchemaArray.prototype.$conditionalHandlers }
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
/*!
|
|
135
|
+
* ignore
|
|
136
|
+
*/
|
|
137
|
+
|
|
138
|
+
function _createConstructor(schema, options, baseClass) {
|
|
139
|
+
Subdocument || (Subdocument = require('../types/arraySubdocument'));
|
|
140
|
+
|
|
141
|
+
// compile an embedded document for this schema
|
|
142
|
+
function EmbeddedDocument() {
|
|
143
|
+
Subdocument.apply(this, arguments);
|
|
144
|
+
if (this.__parentArray == null || this.__parentArray.getArrayParent() == null) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
this.$session(this.__parentArray.getArrayParent().$session());
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
schema._preCompile();
|
|
151
|
+
|
|
152
|
+
const proto = baseClass?.prototype ?? Subdocument.prototype;
|
|
153
|
+
EmbeddedDocument.prototype = Object.create(proto);
|
|
154
|
+
EmbeddedDocument.prototype.$__setSchema(schema);
|
|
155
|
+
EmbeddedDocument.schema = schema;
|
|
156
|
+
EmbeddedDocument.prototype.constructor = EmbeddedDocument;
|
|
157
|
+
EmbeddedDocument.$isArraySubdocument = true;
|
|
158
|
+
EmbeddedDocument.events = new EventEmitter();
|
|
159
|
+
EmbeddedDocument.base = schema.base;
|
|
160
|
+
|
|
161
|
+
// apply methods
|
|
162
|
+
for (const i in schema.methods) {
|
|
163
|
+
EmbeddedDocument.prototype[i] = schema.methods[i];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// apply statics
|
|
167
|
+
for (const i in schema.statics) {
|
|
168
|
+
EmbeddedDocument[i] = schema.statics[i];
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
for (const i in EventEmitter.prototype) {
|
|
172
|
+
EmbeddedDocument[i] = EventEmitter.prototype[i];
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
EmbeddedDocument.options = options;
|
|
176
|
+
|
|
177
|
+
return EmbeddedDocument;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Adds a discriminator to this document array.
|
|
182
|
+
*
|
|
183
|
+
* #### Example:
|
|
184
|
+
*
|
|
185
|
+
* const shapeSchema = Schema({ name: String }, { discriminatorKey: 'kind' });
|
|
186
|
+
* const schema = Schema({ shapes: [shapeSchema] });
|
|
187
|
+
*
|
|
188
|
+
* const docArrayPath = parentSchema.path('shapes');
|
|
189
|
+
* docArrayPath.discriminator('Circle', Schema({ radius: Number }));
|
|
190
|
+
*
|
|
191
|
+
* @param {String} name
|
|
192
|
+
* @param {Schema} schema fields to add to the schema for instances of this sub-class
|
|
193
|
+
* @param {Object|string} [options] If string, same as `options.value`.
|
|
194
|
+
* @param {String} [options.value] the string stored in the `discriminatorKey` property. If not specified, Mongoose uses the `name` parameter.
|
|
195
|
+
* @param {Boolean} [options.clone=true] By default, `discriminator()` clones the given `schema`. Set to `false` to skip cloning.
|
|
196
|
+
* @see discriminators https://mongoosejs.com/docs/discriminators.html
|
|
197
|
+
* @return {Function} the constructor Mongoose will use for creating instances of this discriminator model
|
|
198
|
+
* @api public
|
|
199
|
+
*/
|
|
200
|
+
|
|
201
|
+
SchemaDocumentArray.prototype.discriminator = function(name, schema, options) {
|
|
202
|
+
if (typeof name === 'function') {
|
|
203
|
+
name = utils.getFunctionName(name);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
options = options || {};
|
|
207
|
+
const tiedValue = utils.isPOJO(options) ? options.value : options;
|
|
208
|
+
const clone = typeof options.clone === 'boolean' ? options.clone : true;
|
|
209
|
+
|
|
210
|
+
if (schema.instanceOfSchema && clone) {
|
|
211
|
+
schema = schema.clone();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
schema = discriminator(this.Constructor, name, schema, tiedValue, null, null, options?.overwriteExisting);
|
|
215
|
+
|
|
216
|
+
const EmbeddedDocument = _createConstructor(schema, null, this.Constructor);
|
|
217
|
+
EmbeddedDocument.baseCasterConstructor = this.Constructor;
|
|
218
|
+
|
|
219
|
+
Object.defineProperty(EmbeddedDocument, 'name', {
|
|
220
|
+
value: name
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
this.Constructor.discriminators[name] = EmbeddedDocument;
|
|
224
|
+
|
|
225
|
+
return this.Constructor.discriminators[name];
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Performs local validations first, then validations on each embedded doc
|
|
230
|
+
*
|
|
231
|
+
* @api public
|
|
232
|
+
*/
|
|
233
|
+
|
|
234
|
+
SchemaDocumentArray.prototype.doValidate = async function doValidate(array, scope, options) {
|
|
235
|
+
// lazy load
|
|
236
|
+
MongooseDocumentArray || (MongooseDocumentArray = require('../types/documentArray'));
|
|
237
|
+
|
|
238
|
+
await SchemaType.prototype.doValidate.call(this, array, scope);
|
|
239
|
+
if (options?.updateValidator) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (!utils.isMongooseDocumentArray(array)) {
|
|
243
|
+
array = new MongooseDocumentArray(array, this.path, scope);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const promises = [];
|
|
247
|
+
for (let i = 0; i < array.length; ++i) {
|
|
248
|
+
// handle sparse arrays, do not use array.forEach which does not
|
|
249
|
+
// iterate over sparse elements yet reports array.length including
|
|
250
|
+
// them :(
|
|
251
|
+
let doc = array[i];
|
|
252
|
+
if (doc == null) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
// If you set the array index directly, the doc might not yet be
|
|
256
|
+
// a full fledged mongoose subdoc, so make it into one.
|
|
257
|
+
if (!(doc instanceof Subdocument)) {
|
|
258
|
+
const Constructor = getConstructor(this.Constructor, array[i]);
|
|
259
|
+
doc = array[i] = new Constructor(doc, array, undefined, undefined, i);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (options?.validateModifiedOnly && !doc.$isModified()) {
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
promises.push(doc.$__validate(null, options));
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
await Promise.all(promises);
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Performs local validations first, then validations on each embedded doc.
|
|
274
|
+
*
|
|
275
|
+
* #### Note:
|
|
276
|
+
*
|
|
277
|
+
* This method ignores the asynchronous validators.
|
|
278
|
+
*
|
|
279
|
+
* @return {MongooseError|undefined}
|
|
280
|
+
* @api private
|
|
281
|
+
*/
|
|
282
|
+
|
|
283
|
+
SchemaDocumentArray.prototype.doValidateSync = function(array, scope, options) {
|
|
284
|
+
const schemaTypeError = SchemaType.prototype.doValidateSync.call(this, array, scope);
|
|
285
|
+
if (schemaTypeError != null) {
|
|
286
|
+
return schemaTypeError;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const count = array?.length;
|
|
290
|
+
let resultError = null;
|
|
291
|
+
|
|
292
|
+
if (!count) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// handle sparse arrays, do not use array.forEach which does not
|
|
297
|
+
// iterate over sparse elements yet reports array.length including
|
|
298
|
+
// them :(
|
|
299
|
+
|
|
300
|
+
for (let i = 0, len = count; i < len; ++i) {
|
|
301
|
+
// sidestep sparse entries
|
|
302
|
+
let doc = array[i];
|
|
303
|
+
if (!doc) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// If you set the array index directly, the doc might not yet be
|
|
308
|
+
// a full fledged mongoose subdoc, so make it into one.
|
|
309
|
+
if (!(doc instanceof Subdocument)) {
|
|
310
|
+
const Constructor = getConstructor(this.Constructor, array[i]);
|
|
311
|
+
doc = array[i] = new Constructor(doc, array, undefined, undefined, i);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (options?.validateModifiedOnly && !doc.$isModified()) {
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const subdocValidateError = doc.validateSync(options);
|
|
319
|
+
|
|
320
|
+
if (subdocValidateError && resultError == null) {
|
|
321
|
+
resultError = subdocValidateError;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return resultError;
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
/*!
|
|
329
|
+
* ignore
|
|
330
|
+
*/
|
|
331
|
+
|
|
332
|
+
SchemaDocumentArray.prototype.getDefault = function(scope, init, options) {
|
|
333
|
+
let ret = typeof this.defaultValue === 'function'
|
|
334
|
+
? this.defaultValue.call(scope)
|
|
335
|
+
: this.defaultValue;
|
|
336
|
+
|
|
337
|
+
if (ret == null) {
|
|
338
|
+
return ret;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
if (options?.skipCast) {
|
|
342
|
+
return ret;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// lazy load
|
|
346
|
+
MongooseDocumentArray || (MongooseDocumentArray = require('../types/documentArray'));
|
|
347
|
+
|
|
348
|
+
if (!Array.isArray(ret)) {
|
|
349
|
+
ret = [ret];
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
ret = new MongooseDocumentArray(ret, this.path, scope);
|
|
353
|
+
|
|
354
|
+
for (let i = 0; i < ret.length; ++i) {
|
|
355
|
+
const Constructor = getConstructor(this.Constructor, ret[i]);
|
|
356
|
+
const _subdoc = new Constructor({}, ret, undefined,
|
|
357
|
+
undefined, i);
|
|
358
|
+
_subdoc.$init(ret[i]);
|
|
359
|
+
_subdoc.isNew = true;
|
|
360
|
+
|
|
361
|
+
// Make sure all paths in the subdoc are set to `default` instead
|
|
362
|
+
// of `init` since we used `init`.
|
|
363
|
+
Object.assign(_subdoc.$__.activePaths.default, _subdoc.$__.activePaths.init);
|
|
364
|
+
_subdoc.$__.activePaths.init = {};
|
|
365
|
+
|
|
366
|
+
ret[i] = _subdoc;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
return ret;
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
const _toObjectOptions = Object.freeze({ transform: false, virtuals: false });
|
|
373
|
+
const initDocumentOptions = Object.freeze({ skipId: false, willInit: true });
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Casts contents
|
|
377
|
+
*
|
|
378
|
+
* @param {Object} value
|
|
379
|
+
* @param {Document} document that triggers the casting
|
|
380
|
+
* @api private
|
|
381
|
+
*/
|
|
382
|
+
|
|
383
|
+
SchemaDocumentArray.prototype.cast = function(value, doc, init, prev, options) {
|
|
384
|
+
// lazy load
|
|
385
|
+
MongooseDocumentArray || (MongooseDocumentArray = require('../types/documentArray'));
|
|
386
|
+
|
|
387
|
+
// Skip casting if `value` is the same as the previous value, no need to cast. See gh-9266
|
|
388
|
+
if (value?.[arrayPathSymbol] != null && value === prev) {
|
|
389
|
+
return value;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
let selected;
|
|
393
|
+
let subdoc;
|
|
394
|
+
|
|
395
|
+
options = options || {};
|
|
396
|
+
|
|
397
|
+
const path = options.path || this.path;
|
|
398
|
+
|
|
399
|
+
if (!Array.isArray(value)) {
|
|
400
|
+
if (!init && !SchemaDocumentArray.options.castNonArrays) {
|
|
401
|
+
throw new CastError('DocumentArray', value, this.path, null, this);
|
|
402
|
+
}
|
|
403
|
+
// gh-2442 mark whole array as modified if we're initializing a doc from
|
|
404
|
+
// the db and the path isn't an array in the document
|
|
405
|
+
if (!!doc && init) {
|
|
406
|
+
doc.markModified(path);
|
|
407
|
+
}
|
|
408
|
+
return this.cast([value], doc, init, prev, options);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// We need to create a new array, otherwise change tracking will
|
|
412
|
+
// update the old doc (gh-4449)
|
|
413
|
+
if (!options.skipDocumentArrayCast || utils.isMongooseDocumentArray(value)) {
|
|
414
|
+
value = new MongooseDocumentArray(value, path, doc, this);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
if (prev != null) {
|
|
418
|
+
value[arrayAtomicsSymbol] = prev[arrayAtomicsSymbol] || {};
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
if (options.arrayPathIndex != null) {
|
|
422
|
+
value[arrayPathSymbol] = path + '.' + options.arrayPathIndex;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
const rawArray = utils.isMongooseDocumentArray(value) ? value.__array : value;
|
|
426
|
+
const len = rawArray.length;
|
|
427
|
+
|
|
428
|
+
for (let i = 0; i < len; ++i) {
|
|
429
|
+
if (!rawArray[i]) {
|
|
430
|
+
continue;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
const Constructor = getConstructor(this.Constructor, rawArray[i]);
|
|
434
|
+
|
|
435
|
+
const spreadDoc = handleSpreadDoc(rawArray[i], true);
|
|
436
|
+
if (rawArray[i] !== spreadDoc) {
|
|
437
|
+
rawArray[i] = spreadDoc;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
if (rawArray[i] instanceof Subdocument) {
|
|
441
|
+
if (rawArray[i][documentArrayParent] !== doc) {
|
|
442
|
+
if (init) {
|
|
443
|
+
const subdoc = new Constructor(null, value, initDocumentOptions, selected, i);
|
|
444
|
+
rawArray[i] = subdoc.$init(rawArray[i]);
|
|
445
|
+
} else {
|
|
446
|
+
const subdoc = new Constructor(rawArray[i], value, undefined, undefined, i);
|
|
447
|
+
rawArray[i] = subdoc;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
// Might not have the correct index yet, so ensure it does.
|
|
451
|
+
if (rawArray[i].__index == null) {
|
|
452
|
+
rawArray[i].$setIndex(i);
|
|
453
|
+
}
|
|
454
|
+
} else if (rawArray[i] != null) {
|
|
455
|
+
if (init) {
|
|
456
|
+
if (doc) {
|
|
457
|
+
selected || (selected = scopePaths(this, doc.$__.selected, init));
|
|
458
|
+
} else {
|
|
459
|
+
selected = true;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
subdoc = new Constructor(null, value, initDocumentOptions, selected, i);
|
|
463
|
+
rawArray[i] = subdoc.$init(rawArray[i], options);
|
|
464
|
+
} else {
|
|
465
|
+
if (typeof prev?.id === 'function') {
|
|
466
|
+
subdoc = prev.id(rawArray[i]._id);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
if (prev && subdoc && utils.deepEqual(subdoc.toObject(_toObjectOptions), rawArray[i])) {
|
|
470
|
+
// handle resetting doc with existing id and same data
|
|
471
|
+
subdoc.set(rawArray[i]);
|
|
472
|
+
// if set() is hooked it will have no return value
|
|
473
|
+
// see gh-746
|
|
474
|
+
rawArray[i] = subdoc;
|
|
475
|
+
} else {
|
|
476
|
+
try {
|
|
477
|
+
subdoc = new Constructor(rawArray[i], value, undefined,
|
|
478
|
+
undefined, i);
|
|
479
|
+
// if set() is hooked it will have no return value
|
|
480
|
+
// see gh-746
|
|
481
|
+
rawArray[i] = subdoc;
|
|
482
|
+
} catch (error) {
|
|
483
|
+
throw new CastError('embedded', rawArray[i],
|
|
484
|
+
value[arrayPathSymbol], error, this);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return value;
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
/*!
|
|
495
|
+
* ignore
|
|
496
|
+
*/
|
|
497
|
+
|
|
498
|
+
SchemaDocumentArray.prototype.clone = function() {
|
|
499
|
+
const options = Object.assign({}, this.options);
|
|
500
|
+
const schematype = new this.constructor(
|
|
501
|
+
this.path,
|
|
502
|
+
this.schema,
|
|
503
|
+
options,
|
|
504
|
+
this.schemaOptions,
|
|
505
|
+
this.parentSchema
|
|
506
|
+
);
|
|
507
|
+
schematype.validators = this.validators.slice();
|
|
508
|
+
if (this.requiredValidator !== undefined) {
|
|
509
|
+
schematype.requiredValidator = this.requiredValidator;
|
|
510
|
+
}
|
|
511
|
+
schematype.Constructor.discriminators = Object.assign({},
|
|
512
|
+
this.Constructor.discriminators);
|
|
513
|
+
schematype._appliedDiscriminators = this._appliedDiscriminators;
|
|
514
|
+
return schematype;
|
|
515
|
+
};
|
|
516
|
+
|
|
517
|
+
/*!
|
|
518
|
+
* ignore
|
|
519
|
+
*/
|
|
520
|
+
|
|
521
|
+
SchemaDocumentArray.prototype.applyGetters = function(value, scope) {
|
|
522
|
+
return SchemaType.prototype.applyGetters.call(this, value, scope);
|
|
523
|
+
};
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* Scopes paths selected in a query to this array.
|
|
527
|
+
* Necessary for proper default application of subdocument values.
|
|
528
|
+
*
|
|
529
|
+
* @param {DocumentArrayPath} array the array to scope `fields` paths
|
|
530
|
+
* @param {Object|undefined} fields the root fields selected in the query
|
|
531
|
+
* @param {Boolean|undefined} init if we are being created part of a query result
|
|
532
|
+
* @api private
|
|
533
|
+
*/
|
|
534
|
+
|
|
535
|
+
function scopePaths(array, fields, init) {
|
|
536
|
+
if (!(init && fields)) {
|
|
537
|
+
return undefined;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
const path = array.path + '.';
|
|
541
|
+
const keys = Object.keys(fields);
|
|
542
|
+
let i = keys.length;
|
|
543
|
+
const selected = {};
|
|
544
|
+
let hasKeys;
|
|
545
|
+
let key;
|
|
546
|
+
let sub;
|
|
547
|
+
|
|
548
|
+
while (i--) {
|
|
549
|
+
key = keys[i];
|
|
550
|
+
if (key.startsWith(path)) {
|
|
551
|
+
sub = key.substring(path.length);
|
|
552
|
+
if (sub === '$') {
|
|
553
|
+
continue;
|
|
554
|
+
}
|
|
555
|
+
if (sub.startsWith('$.')) {
|
|
556
|
+
sub = sub.substring(2);
|
|
557
|
+
}
|
|
558
|
+
hasKeys || (hasKeys = true);
|
|
559
|
+
selected[sub] = fields[key];
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
return hasKeys && selected || undefined;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
/*!
|
|
567
|
+
* ignore
|
|
568
|
+
*/
|
|
569
|
+
|
|
570
|
+
SchemaDocumentArray.defaultOptions = {};
|
|
571
|
+
|
|
572
|
+
/**
|
|
573
|
+
* Sets a default option for all DocumentArray instances.
|
|
574
|
+
*
|
|
575
|
+
* #### Example:
|
|
576
|
+
*
|
|
577
|
+
* // Make all document arrays not have `_id` by default.
|
|
578
|
+
* mongoose.Schema.Types.DocumentArray.set('_id', false);
|
|
579
|
+
*
|
|
580
|
+
* @param {String} option The name of the option you'd like to set (e.g. trim, lowercase, etc...)
|
|
581
|
+
* @param {Any} value The value of the option you'd like to set.
|
|
582
|
+
* @return {void}
|
|
583
|
+
* @function set
|
|
584
|
+
* @static
|
|
585
|
+
* @api public
|
|
586
|
+
*/
|
|
587
|
+
|
|
588
|
+
SchemaDocumentArray.set = SchemaType.set;
|
|
589
|
+
|
|
590
|
+
SchemaDocumentArray.setters = [];
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* Attaches a getter for all DocumentArrayPath instances
|
|
594
|
+
*
|
|
595
|
+
* @param {Function} getter
|
|
596
|
+
* @return {this}
|
|
597
|
+
* @function get
|
|
598
|
+
* @static
|
|
599
|
+
* @api public
|
|
600
|
+
*/
|
|
601
|
+
|
|
602
|
+
SchemaDocumentArray.get = SchemaType.get;
|
|
603
|
+
|
|
604
|
+
/*!
|
|
605
|
+
* Handle casting $elemMatch operators
|
|
606
|
+
*/
|
|
607
|
+
|
|
608
|
+
SchemaDocumentArray.prototype.$conditionalHandlers.$elemMatch = cast$elemMatch;
|
|
609
|
+
|
|
610
|
+
function cast$elemMatch(val, context) {
|
|
611
|
+
const keys = Object.keys(val);
|
|
612
|
+
const numKeys = keys.length;
|
|
613
|
+
for (let i = 0; i < numKeys; ++i) {
|
|
614
|
+
const key = keys[i];
|
|
615
|
+
const value = val[key];
|
|
616
|
+
if (isOperator(key) && value != null) {
|
|
617
|
+
val[key] = this.castForQuery(key, value, context);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// Is this an embedded discriminator and is the discriminator key set?
|
|
622
|
+
// If so, use the discriminator schema. See gh-7449
|
|
623
|
+
const discriminatorKey = this?.Constructor?.schema?.options?.discriminatorKey;
|
|
624
|
+
const discriminators = this?.Constructor?.schema?.discriminators || {};
|
|
625
|
+
if (discriminatorKey != null &&
|
|
626
|
+
val[discriminatorKey] != null &&
|
|
627
|
+
discriminators[val[discriminatorKey]] != null) {
|
|
628
|
+
return cast(discriminators[val[discriminatorKey]], val, null, this?.$$context);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
const schema = this.Constructor.schema ?? context.schema;
|
|
632
|
+
return cast(schema, val, null, this?.$$context);
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/**
|
|
636
|
+
* Returns this schema type's representation in a JSON schema.
|
|
637
|
+
*
|
|
638
|
+
* @param [options]
|
|
639
|
+
* @param [options.useBsonType=false] If true, return a representation with `bsonType` for use with MongoDB's `$jsonSchema`.
|
|
640
|
+
* @returns {Object} JSON schema properties
|
|
641
|
+
*/
|
|
642
|
+
|
|
643
|
+
SchemaDocumentArray.prototype.toJSONSchema = function toJSONSchema(options) {
|
|
644
|
+
const itemsTypeDefinition = createJSONSchemaTypeDefinition('object', 'object', options?.useBsonType, false);
|
|
645
|
+
const isRequired = this.options.required && typeof this.options.required !== 'function';
|
|
646
|
+
return {
|
|
647
|
+
...createJSONSchemaTypeDefinition('array', 'array', options?.useBsonType, isRequired),
|
|
648
|
+
items: { ...itemsTypeDefinition, ...this.schema.toJSONSchema(options) }
|
|
649
|
+
};
|
|
650
|
+
};
|
|
651
|
+
|
|
652
|
+
/*!
|
|
653
|
+
* Module exports.
|
|
654
|
+
*/
|
|
655
|
+
|
|
656
|
+
module.exports = SchemaDocumentArray;
|