@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,733 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* Module dependencies.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const SchemaType = require('../schemaType');
|
|
8
|
+
const MongooseError = require('../error/index');
|
|
9
|
+
const SchemaStringOptions = require('../options/schemaStringOptions');
|
|
10
|
+
const castString = require('../cast/string');
|
|
11
|
+
const createJSONSchemaTypeDefinition = require('../helpers/createJSONSchemaTypeDefinition');
|
|
12
|
+
const utils = require('../utils');
|
|
13
|
+
const isBsonType = require('../helpers/isBsonType');
|
|
14
|
+
|
|
15
|
+
const CastError = SchemaType.CastError;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* String SchemaType constructor.
|
|
19
|
+
*
|
|
20
|
+
* @param {String} key
|
|
21
|
+
* @param {Object} options
|
|
22
|
+
* @param {Object} schemaOptions
|
|
23
|
+
* @param {Schema} parentSchema
|
|
24
|
+
* @inherits SchemaType
|
|
25
|
+
* @api public
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
function SchemaString(key, options, _schemaOptions, parentSchema) {
|
|
29
|
+
this.enumValues = [];
|
|
30
|
+
this.regExp = null;
|
|
31
|
+
SchemaType.call(this, key, options, 'String', parentSchema);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* This schema type's name, to defend against minifiers that mangle
|
|
36
|
+
* function names.
|
|
37
|
+
*
|
|
38
|
+
* @api public
|
|
39
|
+
*/
|
|
40
|
+
SchemaString.schemaName = 'String';
|
|
41
|
+
|
|
42
|
+
SchemaString.defaultOptions = {};
|
|
43
|
+
|
|
44
|
+
/*!
|
|
45
|
+
* Inherits from SchemaType.
|
|
46
|
+
*/
|
|
47
|
+
SchemaString.prototype = Object.create(SchemaType.prototype);
|
|
48
|
+
SchemaString.prototype.constructor = SchemaString;
|
|
49
|
+
Object.defineProperty(SchemaString.prototype, 'OptionsConstructor', {
|
|
50
|
+
configurable: false,
|
|
51
|
+
enumerable: false,
|
|
52
|
+
writable: false,
|
|
53
|
+
value: SchemaStringOptions
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
/*!
|
|
57
|
+
* ignore
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
SchemaString._cast = castString;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Get/set the function used to cast arbitrary values to strings.
|
|
64
|
+
*
|
|
65
|
+
* #### Example:
|
|
66
|
+
*
|
|
67
|
+
* // Throw an error if you pass in an object. Normally, Mongoose allows
|
|
68
|
+
* // objects with custom `toString()` functions.
|
|
69
|
+
* const original = mongoose.Schema.Types.String.cast();
|
|
70
|
+
* mongoose.Schema.Types.String.cast(v => {
|
|
71
|
+
* assert.ok(v == null || typeof v !== 'object');
|
|
72
|
+
* return original(v);
|
|
73
|
+
* });
|
|
74
|
+
*
|
|
75
|
+
* // Or disable casting entirely
|
|
76
|
+
* mongoose.Schema.Types.String.cast(false);
|
|
77
|
+
*
|
|
78
|
+
* @param {Function} caster
|
|
79
|
+
* @return {Function}
|
|
80
|
+
* @function cast
|
|
81
|
+
* @static
|
|
82
|
+
* @api public
|
|
83
|
+
*/
|
|
84
|
+
|
|
85
|
+
SchemaString.cast = function cast(caster) {
|
|
86
|
+
if (arguments.length === 0) {
|
|
87
|
+
return this._cast;
|
|
88
|
+
}
|
|
89
|
+
if (caster === false) {
|
|
90
|
+
caster = this._defaultCaster;
|
|
91
|
+
}
|
|
92
|
+
this._cast = caster;
|
|
93
|
+
|
|
94
|
+
return this._cast;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/*!
|
|
98
|
+
* ignore
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
SchemaString._defaultCaster = v => {
|
|
102
|
+
if (v != null && typeof v !== 'string') {
|
|
103
|
+
throw new Error();
|
|
104
|
+
}
|
|
105
|
+
return v;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Attaches a getter for all String instances.
|
|
110
|
+
*
|
|
111
|
+
* #### Example:
|
|
112
|
+
*
|
|
113
|
+
* // Make all numbers round down
|
|
114
|
+
* mongoose.Schema.Types.String.get(v => v.toLowerCase());
|
|
115
|
+
*
|
|
116
|
+
* const Model = mongoose.model('Test', new Schema({ test: String }));
|
|
117
|
+
* new Model({ test: 'FOO' }).test; // 'foo'
|
|
118
|
+
*
|
|
119
|
+
* @param {Function} getter
|
|
120
|
+
* @return {this}
|
|
121
|
+
* @function get
|
|
122
|
+
* @static
|
|
123
|
+
* @api public
|
|
124
|
+
*/
|
|
125
|
+
|
|
126
|
+
SchemaString.get = SchemaType.get;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Sets a default option for all String instances.
|
|
130
|
+
*
|
|
131
|
+
* #### Example:
|
|
132
|
+
*
|
|
133
|
+
* // Make all strings have option `trim` equal to true.
|
|
134
|
+
* mongoose.Schema.Types.String.set('trim', true);
|
|
135
|
+
*
|
|
136
|
+
* const User = mongoose.model('User', new Schema({ name: String }));
|
|
137
|
+
* new User({ name: ' John Doe ' }).name; // 'John Doe'
|
|
138
|
+
*
|
|
139
|
+
* @param {String} option The option you'd like to set the value for
|
|
140
|
+
* @param {Any} value value for option
|
|
141
|
+
* @return {undefined}
|
|
142
|
+
* @function set
|
|
143
|
+
* @static
|
|
144
|
+
* @api public
|
|
145
|
+
*/
|
|
146
|
+
|
|
147
|
+
SchemaString.set = SchemaType.set;
|
|
148
|
+
|
|
149
|
+
SchemaString.setters = [];
|
|
150
|
+
|
|
151
|
+
/*!
|
|
152
|
+
* ignore
|
|
153
|
+
*/
|
|
154
|
+
|
|
155
|
+
SchemaString._checkRequired = v => (v instanceof String || typeof v === 'string') && v.length;
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Override the function the required validator uses to check whether a string
|
|
159
|
+
* passes the `required` check.
|
|
160
|
+
*
|
|
161
|
+
* #### Example:
|
|
162
|
+
*
|
|
163
|
+
* // Allow empty strings to pass `required` check
|
|
164
|
+
* mongoose.Schema.Types.String.checkRequired(v => v != null);
|
|
165
|
+
*
|
|
166
|
+
* const M = mongoose.model({ str: { type: String, required: true } });
|
|
167
|
+
* new M({ str: '' }).validateSync(); // `null`, validation passes!
|
|
168
|
+
*
|
|
169
|
+
* @param {Function} fn
|
|
170
|
+
* @return {Function}
|
|
171
|
+
* @function checkRequired
|
|
172
|
+
* @static
|
|
173
|
+
* @api public
|
|
174
|
+
*/
|
|
175
|
+
|
|
176
|
+
SchemaString.checkRequired = SchemaType.checkRequired;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Adds an enum validator
|
|
180
|
+
*
|
|
181
|
+
* #### Example:
|
|
182
|
+
*
|
|
183
|
+
* const states = ['opening', 'open', 'closing', 'closed']
|
|
184
|
+
* const s = new Schema({ state: { type: String, enum: states }})
|
|
185
|
+
* const M = db.model('M', s)
|
|
186
|
+
* const m = new M({ state: 'invalid' })
|
|
187
|
+
* await m.save()
|
|
188
|
+
* .catch((err) => console.error(err)); // ValidationError: `invalid` is not a valid enum value for path `state`.
|
|
189
|
+
* m.state = 'open';
|
|
190
|
+
* await m.save();
|
|
191
|
+
* // success
|
|
192
|
+
*
|
|
193
|
+
* // or with custom error messages
|
|
194
|
+
* const enum = {
|
|
195
|
+
* values: ['opening', 'open', 'closing', 'closed'],
|
|
196
|
+
* message: 'enum validator failed for path `{PATH}` with value `{VALUE}`'
|
|
197
|
+
* }
|
|
198
|
+
* const s = new Schema({ state: { type: String, enum: enum })
|
|
199
|
+
* const M = db.model('M', s)
|
|
200
|
+
* const m = new M({ state: 'invalid' })
|
|
201
|
+
* await m.save()
|
|
202
|
+
* .catch((err) => console.error(err)); // ValidationError: enum validator failed for path `state` with value `invalid`
|
|
203
|
+
* m.state = 'open';
|
|
204
|
+
* await m.save();
|
|
205
|
+
* // success
|
|
206
|
+
*
|
|
207
|
+
* @param {...String|Object} [args] enumeration values
|
|
208
|
+
* @return {SchemaType} this
|
|
209
|
+
* @see Customized Error Messages https://mongoosejs.com/docs/api/error.html#Error.messages
|
|
210
|
+
* @see Enums in JavaScript https://masteringjs.io/tutorials/fundamentals/enum
|
|
211
|
+
* @api public
|
|
212
|
+
*/
|
|
213
|
+
|
|
214
|
+
SchemaString.prototype.enum = function() {
|
|
215
|
+
if (this.enumValidator) {
|
|
216
|
+
this.validators = this.validators.filter(function(v) {
|
|
217
|
+
return v.validator !== this.enumValidator;
|
|
218
|
+
}, this);
|
|
219
|
+
this.enumValidator = false;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (arguments[0] === void 0 || arguments[0] === false) {
|
|
223
|
+
return this;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
let values;
|
|
227
|
+
let errorMessage;
|
|
228
|
+
|
|
229
|
+
if (utils.isObject(arguments[0])) {
|
|
230
|
+
if (Array.isArray(arguments[0].values)) {
|
|
231
|
+
values = arguments[0].values;
|
|
232
|
+
errorMessage = arguments[0].message;
|
|
233
|
+
} else {
|
|
234
|
+
values = utils.object.vals(arguments[0]);
|
|
235
|
+
errorMessage = MongooseError.messages.String.enum;
|
|
236
|
+
}
|
|
237
|
+
} else {
|
|
238
|
+
values = arguments;
|
|
239
|
+
errorMessage = MongooseError.messages.String.enum;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
for (const value of values) {
|
|
243
|
+
if (value !== undefined) {
|
|
244
|
+
this.enumValues.push(this.cast(value));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const vals = this.enumValues;
|
|
249
|
+
this.enumValidator = function(v) {
|
|
250
|
+
return null == v || ~vals.indexOf(v);
|
|
251
|
+
};
|
|
252
|
+
this.validators.push({
|
|
253
|
+
validator: this.enumValidator,
|
|
254
|
+
message: errorMessage,
|
|
255
|
+
type: 'enum',
|
|
256
|
+
enumValues: vals
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
return this;
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Adds a lowercase [setter](https://mongoosejs.com/docs/api/schematype.html#SchemaType.prototype.set()).
|
|
264
|
+
*
|
|
265
|
+
* #### Example:
|
|
266
|
+
*
|
|
267
|
+
* const s = new Schema({ email: { type: String, lowercase: true }})
|
|
268
|
+
* const M = db.model('M', s);
|
|
269
|
+
* const m = new M({ email: 'SomeEmail@example.COM' });
|
|
270
|
+
* console.log(m.email) // someemail@example.com
|
|
271
|
+
* M.find({ email: 'SomeEmail@example.com' }); // Queries by 'someemail@example.com'
|
|
272
|
+
*
|
|
273
|
+
* Note that `lowercase` does **not** affect regular expression queries:
|
|
274
|
+
*
|
|
275
|
+
* #### Example:
|
|
276
|
+
*
|
|
277
|
+
* // Still queries for documents whose `email` matches the regular
|
|
278
|
+
* // expression /SomeEmail/. Mongoose does **not** convert the RegExp
|
|
279
|
+
* // to lowercase.
|
|
280
|
+
* M.find({ email: /SomeEmail/ });
|
|
281
|
+
*
|
|
282
|
+
* @api public
|
|
283
|
+
* @return {SchemaType} this
|
|
284
|
+
*/
|
|
285
|
+
|
|
286
|
+
SchemaString.prototype.lowercase = function(shouldApply) {
|
|
287
|
+
if (arguments.length > 0 && !shouldApply) {
|
|
288
|
+
return this;
|
|
289
|
+
}
|
|
290
|
+
return this.set(v => {
|
|
291
|
+
if (typeof v !== 'string') {
|
|
292
|
+
v = this.cast(v);
|
|
293
|
+
}
|
|
294
|
+
if (v) {
|
|
295
|
+
return v.toLowerCase();
|
|
296
|
+
}
|
|
297
|
+
return v;
|
|
298
|
+
});
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Adds an uppercase [setter](https://mongoosejs.com/docs/api/schematype.html#SchemaType.prototype.set()).
|
|
303
|
+
*
|
|
304
|
+
* #### Example:
|
|
305
|
+
*
|
|
306
|
+
* const s = new Schema({ caps: { type: String, uppercase: true }})
|
|
307
|
+
* const M = db.model('M', s);
|
|
308
|
+
* const m = new M({ caps: 'an example' });
|
|
309
|
+
* console.log(m.caps) // AN EXAMPLE
|
|
310
|
+
* M.find({ caps: 'an example' }) // Matches documents where caps = 'AN EXAMPLE'
|
|
311
|
+
*
|
|
312
|
+
* Note that `uppercase` does **not** affect regular expression queries:
|
|
313
|
+
*
|
|
314
|
+
* #### Example:
|
|
315
|
+
*
|
|
316
|
+
* // Mongoose does **not** convert the RegExp to uppercase.
|
|
317
|
+
* M.find({ email: /an example/ });
|
|
318
|
+
*
|
|
319
|
+
* @api public
|
|
320
|
+
* @return {SchemaType} this
|
|
321
|
+
*/
|
|
322
|
+
|
|
323
|
+
SchemaString.prototype.uppercase = function(shouldApply) {
|
|
324
|
+
if (arguments.length > 0 && !shouldApply) {
|
|
325
|
+
return this;
|
|
326
|
+
}
|
|
327
|
+
return this.set(v => {
|
|
328
|
+
if (typeof v !== 'string') {
|
|
329
|
+
v = this.cast(v);
|
|
330
|
+
}
|
|
331
|
+
if (v) {
|
|
332
|
+
return v.toUpperCase();
|
|
333
|
+
}
|
|
334
|
+
return v;
|
|
335
|
+
});
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Adds a trim [setter](https://mongoosejs.com/docs/api/schematype.html#SchemaType.prototype.set()).
|
|
340
|
+
*
|
|
341
|
+
* The string value will be [trimmed](https://masteringjs.io/tutorials/fundamentals/trim-string) when set.
|
|
342
|
+
*
|
|
343
|
+
* #### Example:
|
|
344
|
+
*
|
|
345
|
+
* const s = new Schema({ name: { type: String, trim: true }});
|
|
346
|
+
* const M = db.model('M', s);
|
|
347
|
+
* const string = ' some name ';
|
|
348
|
+
* console.log(string.length); // 11
|
|
349
|
+
* const m = new M({ name: string });
|
|
350
|
+
* console.log(m.name.length); // 9
|
|
351
|
+
*
|
|
352
|
+
* // Equivalent to `findOne({ name: string.trim() })`
|
|
353
|
+
* M.findOne({ name: string });
|
|
354
|
+
*
|
|
355
|
+
* Note that `trim` does **not** affect regular expression queries:
|
|
356
|
+
*
|
|
357
|
+
* #### Example:
|
|
358
|
+
*
|
|
359
|
+
* // Mongoose does **not** trim whitespace from the RegExp.
|
|
360
|
+
* M.find({ name: / some name / });
|
|
361
|
+
*
|
|
362
|
+
* @api public
|
|
363
|
+
* @return {SchemaType} this
|
|
364
|
+
*/
|
|
365
|
+
|
|
366
|
+
SchemaString.prototype.trim = function(shouldTrim) {
|
|
367
|
+
if (arguments.length > 0 && !shouldTrim) {
|
|
368
|
+
return this;
|
|
369
|
+
}
|
|
370
|
+
return this.set(v => {
|
|
371
|
+
if (typeof v !== 'string') {
|
|
372
|
+
v = this.cast(v);
|
|
373
|
+
}
|
|
374
|
+
if (v) {
|
|
375
|
+
return v.trim();
|
|
376
|
+
}
|
|
377
|
+
return v;
|
|
378
|
+
});
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Sets a minimum length validator.
|
|
383
|
+
*
|
|
384
|
+
* #### Example:
|
|
385
|
+
*
|
|
386
|
+
* const schema = new Schema({ postalCode: { type: String, minLength: 5 })
|
|
387
|
+
* const Address = db.model('Address', schema)
|
|
388
|
+
* const address = new Address({ postalCode: '9512' })
|
|
389
|
+
* address.save(function (err) {
|
|
390
|
+
* console.error(err) // validator error
|
|
391
|
+
* address.postalCode = '95125';
|
|
392
|
+
* address.save() // success
|
|
393
|
+
* })
|
|
394
|
+
*
|
|
395
|
+
* // custom error messages
|
|
396
|
+
* // We can also use the special {MINLENGTH} token which will be replaced with the minimum allowed length
|
|
397
|
+
* const minLength = [5, 'The value of path `{PATH}` (`{VALUE}`) is shorter than the minimum allowed length ({MINLENGTH}).'];
|
|
398
|
+
* const schema = new Schema({ postalCode: { type: String, minLength: minLength })
|
|
399
|
+
* const Address = mongoose.model('Address', schema);
|
|
400
|
+
* const address = new Address({ postalCode: '9512' });
|
|
401
|
+
* address.validate(function (err) {
|
|
402
|
+
* console.log(String(err)) // ValidationError: The value of path `postalCode` (`9512`) is shorter than the minimum length (5).
|
|
403
|
+
* })
|
|
404
|
+
*
|
|
405
|
+
* @param {Number} value minimum string length
|
|
406
|
+
* @param {String} [message] optional custom error message
|
|
407
|
+
* @return {SchemaType} this
|
|
408
|
+
* @see Customized Error Messages https://mongoosejs.com/docs/api/error.html#Error.messages
|
|
409
|
+
* @api public
|
|
410
|
+
*/
|
|
411
|
+
|
|
412
|
+
SchemaString.prototype.minlength = function(value, message) {
|
|
413
|
+
if (this.minlengthValidator) {
|
|
414
|
+
this.validators = this.validators.filter(function(v) {
|
|
415
|
+
return v.validator !== this.minlengthValidator;
|
|
416
|
+
}, this);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
if (value != null) {
|
|
420
|
+
let msg = message || MongooseError.messages.String.minlength;
|
|
421
|
+
msg = msg.replace(/{MINLENGTH}/, value);
|
|
422
|
+
this.validators.push({
|
|
423
|
+
validator: this.minlengthValidator = function(v) {
|
|
424
|
+
return v === null || v.length >= value;
|
|
425
|
+
},
|
|
426
|
+
message: msg,
|
|
427
|
+
type: 'minlength',
|
|
428
|
+
minlength: value
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return this;
|
|
433
|
+
};
|
|
434
|
+
|
|
435
|
+
SchemaString.prototype.minLength = SchemaString.prototype.minlength;
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Sets a maximum length validator.
|
|
439
|
+
*
|
|
440
|
+
* #### Example:
|
|
441
|
+
*
|
|
442
|
+
* const schema = new Schema({ postalCode: { type: String, maxlength: 9 })
|
|
443
|
+
* const Address = db.model('Address', schema)
|
|
444
|
+
* const address = new Address({ postalCode: '9512512345' })
|
|
445
|
+
* address.save(function (err) {
|
|
446
|
+
* console.error(err) // validator error
|
|
447
|
+
* address.postalCode = '95125';
|
|
448
|
+
* address.save() // success
|
|
449
|
+
* })
|
|
450
|
+
*
|
|
451
|
+
* // custom error messages
|
|
452
|
+
* // We can also use the special {MAXLENGTH} token which will be replaced with the maximum allowed length
|
|
453
|
+
* const maxlength = [9, 'The value of path `{PATH}` (`{VALUE}`) exceeds the maximum allowed length ({MAXLENGTH}).'];
|
|
454
|
+
* const schema = new Schema({ postalCode: { type: String, maxlength: maxlength })
|
|
455
|
+
* const Address = mongoose.model('Address', schema);
|
|
456
|
+
* const address = new Address({ postalCode: '9512512345' });
|
|
457
|
+
* address.validate(function (err) {
|
|
458
|
+
* console.log(String(err)) // ValidationError: The value of path `postalCode` (`9512512345`) exceeds the maximum allowed length (9).
|
|
459
|
+
* })
|
|
460
|
+
*
|
|
461
|
+
* @param {Number} value maximum string length
|
|
462
|
+
* @param {String} [message] optional custom error message
|
|
463
|
+
* @return {SchemaType} this
|
|
464
|
+
* @see Customized Error Messages https://mongoosejs.com/docs/api/error.html#Error.messages
|
|
465
|
+
* @api public
|
|
466
|
+
*/
|
|
467
|
+
|
|
468
|
+
SchemaString.prototype.maxlength = function(value, message) {
|
|
469
|
+
if (this.maxlengthValidator) {
|
|
470
|
+
this.validators = this.validators.filter(function(v) {
|
|
471
|
+
return v.validator !== this.maxlengthValidator;
|
|
472
|
+
}, this);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
if (value != null) {
|
|
476
|
+
let msg = message || MongooseError.messages.String.maxlength;
|
|
477
|
+
msg = msg.replace(/{MAXLENGTH}/, value);
|
|
478
|
+
this.validators.push({
|
|
479
|
+
validator: this.maxlengthValidator = function(v) {
|
|
480
|
+
return v === null || v.length <= value;
|
|
481
|
+
},
|
|
482
|
+
message: msg,
|
|
483
|
+
type: 'maxlength',
|
|
484
|
+
maxlength: value
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
return this;
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
SchemaString.prototype.maxLength = SchemaString.prototype.maxlength;
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Sets a regexp validator.
|
|
495
|
+
*
|
|
496
|
+
* Any value that does not pass `regExp`.test(val) will fail validation.
|
|
497
|
+
*
|
|
498
|
+
* #### Example:
|
|
499
|
+
*
|
|
500
|
+
* const s = new Schema({ name: { type: String, match: /^a/ }})
|
|
501
|
+
* const M = db.model('M', s)
|
|
502
|
+
* const m = new M({ name: 'I am invalid' })
|
|
503
|
+
* m.validate(function (err) {
|
|
504
|
+
* console.error(String(err)) // "ValidationError: Path `name` is invalid (I am invalid)."
|
|
505
|
+
* m.name = 'apples'
|
|
506
|
+
* m.validate(function (err) {
|
|
507
|
+
* assert.ok(err) // success
|
|
508
|
+
* })
|
|
509
|
+
* })
|
|
510
|
+
*
|
|
511
|
+
* // using a custom error message
|
|
512
|
+
* const match = [ /\.html$/, "That file doesn't end in .html ({VALUE})" ];
|
|
513
|
+
* const s = new Schema({ file: { type: String, match: match }})
|
|
514
|
+
* const M = db.model('M', s);
|
|
515
|
+
* const m = new M({ file: 'invalid' });
|
|
516
|
+
* m.validate(function (err) {
|
|
517
|
+
* console.log(String(err)) // "ValidationError: That file doesn't end in .html (invalid)"
|
|
518
|
+
* })
|
|
519
|
+
*
|
|
520
|
+
* Empty strings, `undefined`, and `null` values always pass the match validator. If you require these values, enable the `required` validator also.
|
|
521
|
+
*
|
|
522
|
+
* const s = new Schema({ name: { type: String, match: /^a/, required: true }})
|
|
523
|
+
*
|
|
524
|
+
* @param {RegExp} regExp regular expression to test against
|
|
525
|
+
* @param {String} [message] optional custom error message
|
|
526
|
+
* @return {SchemaType} this
|
|
527
|
+
* @see Customized Error Messages https://mongoosejs.com/docs/api/error.html#Error.messages
|
|
528
|
+
* @api public
|
|
529
|
+
*/
|
|
530
|
+
|
|
531
|
+
SchemaString.prototype.match = function match(regExp, message) {
|
|
532
|
+
// yes, we allow multiple match validators
|
|
533
|
+
|
|
534
|
+
const msg = message || MongooseError.messages.String.match;
|
|
535
|
+
|
|
536
|
+
const matchValidator = function(v) {
|
|
537
|
+
if (!regExp) {
|
|
538
|
+
return false;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// In case RegExp happens to have `/g` flag set, we need to reset the
|
|
542
|
+
// `lastIndex`, otherwise `match` will intermittently fail.
|
|
543
|
+
regExp.lastIndex = 0;
|
|
544
|
+
|
|
545
|
+
const ret = ((v != null && v !== '')
|
|
546
|
+
? regExp.test(v)
|
|
547
|
+
: true);
|
|
548
|
+
return ret;
|
|
549
|
+
};
|
|
550
|
+
|
|
551
|
+
this.validators.push({
|
|
552
|
+
validator: matchValidator,
|
|
553
|
+
message: msg,
|
|
554
|
+
type: 'regexp',
|
|
555
|
+
regexp: regExp
|
|
556
|
+
});
|
|
557
|
+
return this;
|
|
558
|
+
};
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* Check if the given value satisfies the `required` validator. The value is
|
|
562
|
+
* considered valid if it is a string (that is, not `null` or `undefined`) and
|
|
563
|
+
* has positive length. The `required` validator **will** fail for empty
|
|
564
|
+
* strings.
|
|
565
|
+
*
|
|
566
|
+
* @param {Any} value
|
|
567
|
+
* @param {Document} doc
|
|
568
|
+
* @return {Boolean}
|
|
569
|
+
* @api public
|
|
570
|
+
*/
|
|
571
|
+
|
|
572
|
+
SchemaString.prototype.checkRequired = function checkRequired(value, doc) {
|
|
573
|
+
if (typeof value === 'object' && SchemaType._isRef(this, value, doc, true)) {
|
|
574
|
+
return value != null;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
// `require('util').inherits()` does **not** copy static properties, and
|
|
578
|
+
// plugins like mongoose-float use `inherits()` for pre-ES6.
|
|
579
|
+
const _checkRequired = typeof this.constructor.checkRequired === 'function' ?
|
|
580
|
+
this.constructor.checkRequired() :
|
|
581
|
+
SchemaString.checkRequired();
|
|
582
|
+
|
|
583
|
+
return _checkRequired(value);
|
|
584
|
+
};
|
|
585
|
+
|
|
586
|
+
/**
|
|
587
|
+
* Casts to String
|
|
588
|
+
*
|
|
589
|
+
* @api private
|
|
590
|
+
*/
|
|
591
|
+
|
|
592
|
+
SchemaString.prototype.cast = function(value, doc, init, prev, options) {
|
|
593
|
+
if (typeof value !== 'string' && SchemaType._isRef(this, value, doc, init)) {
|
|
594
|
+
return this._castRef(value, doc, init, options);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
let castString;
|
|
598
|
+
if (typeof this._castFunction === 'function') {
|
|
599
|
+
castString = this._castFunction;
|
|
600
|
+
} else if (typeof this.constructor.cast === 'function') {
|
|
601
|
+
castString = this.constructor.cast();
|
|
602
|
+
} else {
|
|
603
|
+
castString = SchemaString.cast();
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
try {
|
|
607
|
+
return castString(value);
|
|
608
|
+
} catch {
|
|
609
|
+
throw new CastError('string', value, this.path, null, this);
|
|
610
|
+
}
|
|
611
|
+
};
|
|
612
|
+
|
|
613
|
+
/*!
|
|
614
|
+
* ignore
|
|
615
|
+
*/
|
|
616
|
+
|
|
617
|
+
function handleSingle(val, context) {
|
|
618
|
+
return this.castForQuery(null, val, context);
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/*!
|
|
622
|
+
* ignore
|
|
623
|
+
*/
|
|
624
|
+
|
|
625
|
+
function handleArray(val, context) {
|
|
626
|
+
const _this = this;
|
|
627
|
+
if (!Array.isArray(val)) {
|
|
628
|
+
return [this.castForQuery(null, val, context)];
|
|
629
|
+
}
|
|
630
|
+
return val.map(function(m) {
|
|
631
|
+
return _this.castForQuery(null, m, context);
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/*!
|
|
636
|
+
* ignore
|
|
637
|
+
*/
|
|
638
|
+
|
|
639
|
+
function handleSingleNoSetters(val) {
|
|
640
|
+
if (val == null) {
|
|
641
|
+
return this._castNullish(val);
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
return this.cast(val, this);
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
const $conditionalHandlers = {
|
|
648
|
+
...SchemaType.prototype.$conditionalHandlers,
|
|
649
|
+
$all: handleArray,
|
|
650
|
+
$gt: handleSingle,
|
|
651
|
+
$gte: handleSingle,
|
|
652
|
+
$lt: handleSingle,
|
|
653
|
+
$lte: handleSingle,
|
|
654
|
+
$options: handleSingleNoSetters,
|
|
655
|
+
$regex: function handle$regex(val) {
|
|
656
|
+
if (Object.prototype.toString.call(val) === '[object RegExp]') {
|
|
657
|
+
return val;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
return handleSingleNoSetters.call(this, val);
|
|
661
|
+
},
|
|
662
|
+
$not: handleSingle
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
/**
|
|
666
|
+
* Contains the handlers for different query operators for this schema type.
|
|
667
|
+
* For example, `$conditionalHandlers.$exists` is the function Mongoose calls to cast `$exists` filter operators.
|
|
668
|
+
*
|
|
669
|
+
* @property $conditionalHandlers
|
|
670
|
+
* @memberOf SchemaString
|
|
671
|
+
* @instance
|
|
672
|
+
* @api public
|
|
673
|
+
*/
|
|
674
|
+
|
|
675
|
+
Object.defineProperty(SchemaString.prototype, '$conditionalHandlers', {
|
|
676
|
+
enumerable: false,
|
|
677
|
+
value: $conditionalHandlers
|
|
678
|
+
});
|
|
679
|
+
|
|
680
|
+
/**
|
|
681
|
+
* Casts contents for queries.
|
|
682
|
+
*
|
|
683
|
+
* @param {String} $conditional
|
|
684
|
+
* @param {any} [val]
|
|
685
|
+
* @api private
|
|
686
|
+
*/
|
|
687
|
+
|
|
688
|
+
SchemaString.prototype.castForQuery = function($conditional, val, context) {
|
|
689
|
+
let handler;
|
|
690
|
+
if ($conditional != null) {
|
|
691
|
+
handler = this.$conditionalHandlers[$conditional];
|
|
692
|
+
if (!handler) {
|
|
693
|
+
throw new Error('Can\'t use ' + $conditional + ' with String.');
|
|
694
|
+
}
|
|
695
|
+
return handler.call(this, val, context);
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
if (Object.prototype.toString.call(val) === '[object RegExp]' || isBsonType(val, 'BSONRegExp')) {
|
|
699
|
+
return val;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
try {
|
|
703
|
+
return this.applySetters(val, context);
|
|
704
|
+
} catch (err) {
|
|
705
|
+
if (err instanceof CastError && err.path === this.path && this.$fullPath != null) {
|
|
706
|
+
err.path = this.$fullPath;
|
|
707
|
+
}
|
|
708
|
+
throw err;
|
|
709
|
+
}
|
|
710
|
+
};
|
|
711
|
+
|
|
712
|
+
/**
|
|
713
|
+
* Returns this schema type's representation in a JSON schema.
|
|
714
|
+
*
|
|
715
|
+
* @param [options]
|
|
716
|
+
* @param [options.useBsonType=false] If true, return a representation with `bsonType` for use with MongoDB's `$jsonSchema`.
|
|
717
|
+
* @returns {Object} JSON schema properties
|
|
718
|
+
*/
|
|
719
|
+
|
|
720
|
+
SchemaString.prototype.toJSONSchema = function toJSONSchema(options) {
|
|
721
|
+
const isRequired = this.options.required && typeof this.options.required !== 'function';
|
|
722
|
+
return createJSONSchemaTypeDefinition('string', 'string', options?.useBsonType, isRequired);
|
|
723
|
+
};
|
|
724
|
+
|
|
725
|
+
SchemaString.prototype.autoEncryptionType = function autoEncryptionType() {
|
|
726
|
+
return 'string';
|
|
727
|
+
};
|
|
728
|
+
|
|
729
|
+
/*!
|
|
730
|
+
* Module exports.
|
|
731
|
+
*/
|
|
732
|
+
|
|
733
|
+
module.exports = SchemaString;
|