@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,201 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* ignore
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const MongooseMap = require('../types/map');
|
|
8
|
+
const SchemaMapOptions = require('../options/schemaMapOptions');
|
|
9
|
+
const SchemaType = require('../schemaType');
|
|
10
|
+
const createJSONSchemaTypeDefinition = require('../helpers/createJSONSchemaTypeDefinition');
|
|
11
|
+
const MongooseError = require('../error/mongooseError');
|
|
12
|
+
const Schema = require('../schema');
|
|
13
|
+
const utils = require('../utils');
|
|
14
|
+
|
|
15
|
+
class SchemaMap extends SchemaType {
|
|
16
|
+
/**
|
|
17
|
+
* Map SchemaType constructor.
|
|
18
|
+
*
|
|
19
|
+
* @param {String} path
|
|
20
|
+
* @param {Object} options
|
|
21
|
+
* @param {Object} schemaOptions
|
|
22
|
+
* @param {Schema} parentSchema
|
|
23
|
+
* @inherits SchemaType
|
|
24
|
+
* @api public
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
constructor(key, options, schemaOptions, parentSchema) {
|
|
28
|
+
super(key, options, 'Map', parentSchema);
|
|
29
|
+
this.$isSchemaMap = true;
|
|
30
|
+
// Create the nested schema type for the map values
|
|
31
|
+
this._createNestedSchemaType(parentSchema, key, options, schemaOptions);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Sets a default option for all Map instances.
|
|
36
|
+
*
|
|
37
|
+
* @param {String} option The option you'd like to set the value for
|
|
38
|
+
* @param {Any} value value for option
|
|
39
|
+
* @return {undefined}
|
|
40
|
+
* @function set
|
|
41
|
+
* @api public
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
set(option, value) {
|
|
45
|
+
return SchemaType.set(option, value);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Casts to Map
|
|
50
|
+
*
|
|
51
|
+
* @param {Object} value
|
|
52
|
+
* @param {Object} model this value is optional
|
|
53
|
+
* @api private
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
cast(val, doc, init, prev, options) {
|
|
57
|
+
if (val instanceof MongooseMap) {
|
|
58
|
+
return val;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const path = this.path;
|
|
62
|
+
|
|
63
|
+
if (init) {
|
|
64
|
+
const map = new MongooseMap({}, path, doc, this.$__schemaType, options);
|
|
65
|
+
|
|
66
|
+
// Use the map's path for passing to nested casts.
|
|
67
|
+
// If map's parent is a subdocument, use the relative path so nested casts get relative paths.
|
|
68
|
+
const mapPath = map.$__pathRelativeToParent != null ? map.$__pathRelativeToParent : map.$__path;
|
|
69
|
+
|
|
70
|
+
if (val instanceof global.Map) {
|
|
71
|
+
for (const key of val.keys()) {
|
|
72
|
+
let _val = val.get(key);
|
|
73
|
+
if (_val == null) {
|
|
74
|
+
_val = map.$__schemaType._castNullish(_val);
|
|
75
|
+
} else {
|
|
76
|
+
_val = map.$__schemaType.cast(_val, doc, true, null, { ...options, path: mapPath + '.' + key });
|
|
77
|
+
}
|
|
78
|
+
map.$init(key, _val);
|
|
79
|
+
}
|
|
80
|
+
} else {
|
|
81
|
+
for (const key of Object.keys(val)) {
|
|
82
|
+
let _val = val[key];
|
|
83
|
+
if (_val == null) {
|
|
84
|
+
_val = map.$__schemaType._castNullish(_val);
|
|
85
|
+
} else {
|
|
86
|
+
_val = map.$__schemaType.cast(_val, doc, true, null, { ...options, path: mapPath + '.' + key });
|
|
87
|
+
}
|
|
88
|
+
map.$init(key, _val);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return map;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return new MongooseMap(val, path, doc, this.$__schemaType, options);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Creates a copy of this map schema type.
|
|
100
|
+
*
|
|
101
|
+
* @api private
|
|
102
|
+
*/
|
|
103
|
+
|
|
104
|
+
clone() {
|
|
105
|
+
const schematype = super.clone();
|
|
106
|
+
|
|
107
|
+
if (this.$__schemaType != null) {
|
|
108
|
+
schematype.$__schemaType = this.$__schemaType.clone();
|
|
109
|
+
}
|
|
110
|
+
return schematype;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Returns the embedded schema type (i.e. the `.$*` path)
|
|
115
|
+
*
|
|
116
|
+
* @api public
|
|
117
|
+
*/
|
|
118
|
+
|
|
119
|
+
getEmbeddedSchemaType() {
|
|
120
|
+
return this.$__schemaType;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Returns this schema type's representation in a JSON schema.
|
|
125
|
+
*
|
|
126
|
+
* @param [options]
|
|
127
|
+
* @param [options.useBsonType=false] If true, return a representation with `bsonType` for use with MongoDB's `$jsonSchema`.
|
|
128
|
+
* @returns {Object} JSON schema properties
|
|
129
|
+
*/
|
|
130
|
+
|
|
131
|
+
toJSONSchema(options) {
|
|
132
|
+
const useBsonType = options?.useBsonType;
|
|
133
|
+
const embeddedSchemaType = this.getEmbeddedSchemaType();
|
|
134
|
+
|
|
135
|
+
const isRequired = this.options.required && typeof this.options.required !== 'function';
|
|
136
|
+
const result = createJSONSchemaTypeDefinition('object', 'object', useBsonType, isRequired);
|
|
137
|
+
result.additionalProperties = embeddedSchemaType.toJSONSchema(options);
|
|
138
|
+
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Returns the auto encryption type for this schema type.
|
|
144
|
+
*
|
|
145
|
+
* @api public
|
|
146
|
+
*/
|
|
147
|
+
|
|
148
|
+
autoEncryptionType() {
|
|
149
|
+
return 'object';
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* This schema type's name, to defend against minifiers that mangle
|
|
155
|
+
* function names.
|
|
156
|
+
*
|
|
157
|
+
* @api public
|
|
158
|
+
*/
|
|
159
|
+
|
|
160
|
+
SchemaMap.schemaName = 'Map';
|
|
161
|
+
|
|
162
|
+
SchemaMap.prototype.OptionsConstructor = SchemaMapOptions;
|
|
163
|
+
|
|
164
|
+
SchemaMap.defaultOptions = {};
|
|
165
|
+
|
|
166
|
+
/*!
|
|
167
|
+
* ignore
|
|
168
|
+
*/
|
|
169
|
+
|
|
170
|
+
SchemaMap.prototype._createNestedSchemaType = function _createNestedSchemaType(schema, path, obj, options) {
|
|
171
|
+
const mapPath = path + '.$*';
|
|
172
|
+
let _mapType = { type: {} };
|
|
173
|
+
if (utils.hasUserDefinedProperty(obj, 'of')) {
|
|
174
|
+
const isInlineSchema = utils.isPOJO(obj.of) &&
|
|
175
|
+
utils.hasOwnKeys(obj.of) &&
|
|
176
|
+
!utils.hasUserDefinedProperty(obj.of, schema.options.typeKey);
|
|
177
|
+
if (isInlineSchema) {
|
|
178
|
+
_mapType = { [schema.options.typeKey]: new Schema(obj.of) };
|
|
179
|
+
} else if (utils.isPOJO(obj.of)) {
|
|
180
|
+
_mapType = Object.assign({}, obj.of);
|
|
181
|
+
} else {
|
|
182
|
+
_mapType = { [schema.options.typeKey]: obj.of };
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (_mapType[schema.options.typeKey] && _mapType[schema.options.typeKey].instanceOfSchema) {
|
|
186
|
+
const subdocumentSchema = _mapType[schema.options.typeKey];
|
|
187
|
+
subdocumentSchema.eachPath((subpath, type) => {
|
|
188
|
+
if (type.options.select === true || type.options.select === false) {
|
|
189
|
+
throw new MongooseError('Cannot use schema-level projections (`select: true` or `select: false`) within maps at path "' + path + '.' + subpath + '"');
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (utils.hasUserDefinedProperty(obj, 'ref')) {
|
|
195
|
+
_mapType.ref = obj.ref;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
this.$__schemaType = schema.interpretAsType(mapPath, _mapType, options);
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
module.exports = SchemaMap;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Module dependencies.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const SchemaType = require('../schemaType');
|
|
8
|
+
const symbols = require('./symbols');
|
|
9
|
+
const isObject = require('../helpers/isObject');
|
|
10
|
+
const utils = require('../utils');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Mixed SchemaType constructor.
|
|
14
|
+
*
|
|
15
|
+
* @param {String} path
|
|
16
|
+
* @param {Object} options
|
|
17
|
+
* @param {Object} _schemaOptions
|
|
18
|
+
* @param {Schema} parentSchema
|
|
19
|
+
* @inherits SchemaType
|
|
20
|
+
* @api public
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
function SchemaMixed(path, options, _schemaOptions, parentSchema) {
|
|
24
|
+
if (options?.default) {
|
|
25
|
+
const def = options.default;
|
|
26
|
+
if (Array.isArray(def) && def.length === 0) {
|
|
27
|
+
// make sure empty array defaults are handled
|
|
28
|
+
options.default = Array;
|
|
29
|
+
} else if (!options.shared && isObject(def) && utils.hasOwnKeys(def) === false) {
|
|
30
|
+
// prevent odd "shared" objects between documents
|
|
31
|
+
options.default = function() {
|
|
32
|
+
return {};
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
SchemaType.call(this, path, options, 'Mixed', parentSchema);
|
|
38
|
+
|
|
39
|
+
this[symbols.schemaMixedSymbol] = true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* This schema type's name, to defend against minifiers that mangle
|
|
44
|
+
* function names.
|
|
45
|
+
*
|
|
46
|
+
* @api public
|
|
47
|
+
*/
|
|
48
|
+
SchemaMixed.schemaName = 'Mixed';
|
|
49
|
+
|
|
50
|
+
SchemaMixed.defaultOptions = {};
|
|
51
|
+
|
|
52
|
+
/*!
|
|
53
|
+
* Inherits from SchemaType.
|
|
54
|
+
*/
|
|
55
|
+
SchemaMixed.prototype = Object.create(SchemaType.prototype);
|
|
56
|
+
SchemaMixed.prototype.constructor = SchemaMixed;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Attaches a getter for all Mixed paths.
|
|
60
|
+
*
|
|
61
|
+
* #### Example:
|
|
62
|
+
*
|
|
63
|
+
* // Hide the 'hidden' path
|
|
64
|
+
* mongoose.Schema.Types.Mixed.get(v => Object.assign({}, v, { hidden: null }));
|
|
65
|
+
*
|
|
66
|
+
* const Model = mongoose.model('Test', new Schema({ test: {} }));
|
|
67
|
+
* new Model({ test: { hidden: 'Secret!' } }).test.hidden; // null
|
|
68
|
+
*
|
|
69
|
+
* @param {Function} getter
|
|
70
|
+
* @return {this}
|
|
71
|
+
* @function get
|
|
72
|
+
* @static
|
|
73
|
+
* @api public
|
|
74
|
+
*/
|
|
75
|
+
|
|
76
|
+
SchemaMixed.get = SchemaType.get;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Sets a default option for all Mixed instances.
|
|
80
|
+
*
|
|
81
|
+
* #### Example:
|
|
82
|
+
*
|
|
83
|
+
* // Make all mixed instances have `required` of true by default.
|
|
84
|
+
* mongoose.Schema.Types.Mixed.set('required', true);
|
|
85
|
+
*
|
|
86
|
+
* const User = mongoose.model('User', new Schema({ test: mongoose.Mixed }));
|
|
87
|
+
* new User({ }).validateSync().errors.test.message; // Path `test` is required.
|
|
88
|
+
*
|
|
89
|
+
* @param {String} option The option you'd like to set the value for
|
|
90
|
+
* @param {Any} value value for option
|
|
91
|
+
* @return {undefined}
|
|
92
|
+
* @function set
|
|
93
|
+
* @static
|
|
94
|
+
* @api public
|
|
95
|
+
*/
|
|
96
|
+
|
|
97
|
+
SchemaMixed.set = SchemaType.set;
|
|
98
|
+
|
|
99
|
+
SchemaMixed.setters = [];
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Casts `val` for Mixed.
|
|
103
|
+
*
|
|
104
|
+
* _this is a no-op_
|
|
105
|
+
*
|
|
106
|
+
* @param {Object} value to cast
|
|
107
|
+
* @api private
|
|
108
|
+
*/
|
|
109
|
+
|
|
110
|
+
SchemaMixed.prototype.cast = function(val) {
|
|
111
|
+
if (val instanceof Error) {
|
|
112
|
+
return utils.errorToPOJO(val);
|
|
113
|
+
}
|
|
114
|
+
return val;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Casts contents for queries.
|
|
119
|
+
*
|
|
120
|
+
* @param {String} $cond
|
|
121
|
+
* @param {any} [val]
|
|
122
|
+
* @api private
|
|
123
|
+
*/
|
|
124
|
+
|
|
125
|
+
SchemaMixed.prototype.castForQuery = function($cond, val) {
|
|
126
|
+
return val;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Returns this schema type's representation in a JSON schema.
|
|
131
|
+
*
|
|
132
|
+
* @param [options]
|
|
133
|
+
* @param [options.useBsonType=false] If true, return a representation with `bsonType` for use with MongoDB's `$jsonSchema`.
|
|
134
|
+
* @returns {Object} JSON schema properties
|
|
135
|
+
*/
|
|
136
|
+
|
|
137
|
+
// eslint-disable-next-line no-unused-vars
|
|
138
|
+
SchemaMixed.prototype.toJSONSchema = function toJSONSchema(_options) {
|
|
139
|
+
return {};
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
/*!
|
|
143
|
+
* Module exports.
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
module.exports = SchemaMixed;
|