@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.
Files changed (295) hide show
  1. package/LICENSE.md +22 -0
  2. package/README.md +397 -0
  3. package/SECURITY.md +1 -0
  4. package/eslint.config.mjs +198 -0
  5. package/index.js +64 -0
  6. package/lib/aggregate.js +1189 -0
  7. package/lib/cast/bigint.js +46 -0
  8. package/lib/cast/boolean.js +32 -0
  9. package/lib/cast/date.js +41 -0
  10. package/lib/cast/decimal128.js +39 -0
  11. package/lib/cast/double.js +50 -0
  12. package/lib/cast/int32.js +36 -0
  13. package/lib/cast/number.js +42 -0
  14. package/lib/cast/objectid.js +29 -0
  15. package/lib/cast/string.js +37 -0
  16. package/lib/cast/uuid.js +35 -0
  17. package/lib/cast.js +436 -0
  18. package/lib/collection.js +321 -0
  19. package/lib/connection.js +1855 -0
  20. package/lib/connectionState.js +26 -0
  21. package/lib/constants.js +73 -0
  22. package/lib/cursor/aggregationCursor.js +466 -0
  23. package/lib/cursor/changeStream.js +198 -0
  24. package/lib/cursor/queryCursor.js +622 -0
  25. package/lib/document.js +5521 -0
  26. package/lib/driver.js +15 -0
  27. package/lib/drivers/SPEC.md +4 -0
  28. package/lib/drivers/node-mongodb-native/bulkWriteResult.js +5 -0
  29. package/lib/drivers/node-mongodb-native/collection.js +393 -0
  30. package/lib/drivers/node-mongodb-native/connection.js +506 -0
  31. package/lib/drivers/node-mongodb-native/index.js +10 -0
  32. package/lib/error/browserMissingSchema.js +29 -0
  33. package/lib/error/bulkSaveIncompleteError.js +44 -0
  34. package/lib/error/bulkWriteError.js +41 -0
  35. package/lib/error/cast.js +158 -0
  36. package/lib/error/createCollectionsError.js +26 -0
  37. package/lib/error/divergentArray.js +40 -0
  38. package/lib/error/eachAsyncMultiError.js +41 -0
  39. package/lib/error/index.js +237 -0
  40. package/lib/error/invalidSchemaOption.js +32 -0
  41. package/lib/error/messages.js +47 -0
  42. package/lib/error/missingSchema.js +33 -0
  43. package/lib/error/mongooseError.js +13 -0
  44. package/lib/error/notFound.js +47 -0
  45. package/lib/error/objectExpected.js +31 -0
  46. package/lib/error/objectParameter.js +31 -0
  47. package/lib/error/overwriteModel.js +31 -0
  48. package/lib/error/parallelSave.js +33 -0
  49. package/lib/error/parallelValidate.js +33 -0
  50. package/lib/error/serverSelection.js +62 -0
  51. package/lib/error/setOptionError.js +103 -0
  52. package/lib/error/strict.js +35 -0
  53. package/lib/error/strictPopulate.js +31 -0
  54. package/lib/error/syncIndexes.js +30 -0
  55. package/lib/error/validation.js +97 -0
  56. package/lib/error/validator.js +100 -0
  57. package/lib/error/version.js +38 -0
  58. package/lib/helpers/aggregate/prepareDiscriminatorPipeline.js +39 -0
  59. package/lib/helpers/aggregate/stringifyFunctionOperators.js +50 -0
  60. package/lib/helpers/arrayDepth.js +33 -0
  61. package/lib/helpers/clone.js +204 -0
  62. package/lib/helpers/common.js +127 -0
  63. package/lib/helpers/createJSONSchemaTypeDefinition.js +24 -0
  64. package/lib/helpers/cursor/eachAsync.js +225 -0
  65. package/lib/helpers/discriminator/applyEmbeddedDiscriminators.js +36 -0
  66. package/lib/helpers/discriminator/areDiscriminatorValuesEqual.js +16 -0
  67. package/lib/helpers/discriminator/checkEmbeddedDiscriminatorKeyProjection.js +12 -0
  68. package/lib/helpers/discriminator/getConstructor.js +29 -0
  69. package/lib/helpers/discriminator/getDiscriminatorByValue.js +28 -0
  70. package/lib/helpers/discriminator/getSchemaDiscriminatorByValue.js +27 -0
  71. package/lib/helpers/discriminator/mergeDiscriminatorSchema.js +91 -0
  72. package/lib/helpers/document/applyDefaults.js +132 -0
  73. package/lib/helpers/document/applyTimestamps.js +106 -0
  74. package/lib/helpers/document/applyVirtuals.js +147 -0
  75. package/lib/helpers/document/cleanModifiedSubpaths.js +45 -0
  76. package/lib/helpers/document/compile.js +238 -0
  77. package/lib/helpers/document/getDeepestSubdocumentForPath.js +38 -0
  78. package/lib/helpers/document/getEmbeddedDiscriminatorPath.js +53 -0
  79. package/lib/helpers/document/handleSpreadDoc.js +35 -0
  80. package/lib/helpers/each.js +25 -0
  81. package/lib/helpers/error/combinePathErrors.js +22 -0
  82. package/lib/helpers/firstKey.js +8 -0
  83. package/lib/helpers/get.js +65 -0
  84. package/lib/helpers/getConstructorName.js +16 -0
  85. package/lib/helpers/getDefaultBulkwriteResult.js +18 -0
  86. package/lib/helpers/getFunctionName.js +10 -0
  87. package/lib/helpers/immediate.js +16 -0
  88. package/lib/helpers/indexes/applySchemaCollation.js +13 -0
  89. package/lib/helpers/indexes/decorateDiscriminatorIndexOptions.js +14 -0
  90. package/lib/helpers/indexes/getRelatedIndexes.js +63 -0
  91. package/lib/helpers/indexes/isDefaultIdIndex.js +18 -0
  92. package/lib/helpers/indexes/isIndexEqual.js +95 -0
  93. package/lib/helpers/indexes/isIndexSpecEqual.js +32 -0
  94. package/lib/helpers/indexes/isTextIndex.js +16 -0
  95. package/lib/helpers/indexes/isTimeseriesIndex.js +16 -0
  96. package/lib/helpers/isAsyncFunction.js +9 -0
  97. package/lib/helpers/isBsonType.js +15 -0
  98. package/lib/helpers/isMongooseObject.js +22 -0
  99. package/lib/helpers/isObject.js +16 -0
  100. package/lib/helpers/isPOJO.js +12 -0
  101. package/lib/helpers/isPromise.js +6 -0
  102. package/lib/helpers/isSimpleValidator.js +22 -0
  103. package/lib/helpers/minimize.js +41 -0
  104. package/lib/helpers/model/applyDefaultsToPOJO.js +52 -0
  105. package/lib/helpers/model/applyHooks.js +140 -0
  106. package/lib/helpers/model/applyMethods.js +70 -0
  107. package/lib/helpers/model/applyStaticHooks.js +33 -0
  108. package/lib/helpers/model/applyStatics.js +13 -0
  109. package/lib/helpers/model/castBulkWrite.js +316 -0
  110. package/lib/helpers/model/decorateBulkWriteResult.js +8 -0
  111. package/lib/helpers/model/discriminator.js +265 -0
  112. package/lib/helpers/model/pushNestedArrayPaths.js +15 -0
  113. package/lib/helpers/omitUndefined.js +20 -0
  114. package/lib/helpers/once.js +12 -0
  115. package/lib/helpers/parallelLimit.js +37 -0
  116. package/lib/helpers/path/parentPaths.js +18 -0
  117. package/lib/helpers/path/setDottedPath.js +33 -0
  118. package/lib/helpers/pluralize.js +95 -0
  119. package/lib/helpers/populate/assignRawDocsToIdStructure.js +129 -0
  120. package/lib/helpers/populate/assignVals.js +360 -0
  121. package/lib/helpers/populate/createPopulateQueryFilter.js +97 -0
  122. package/lib/helpers/populate/getModelsMapForPopulate.js +776 -0
  123. package/lib/helpers/populate/getSchemaTypes.js +228 -0
  124. package/lib/helpers/populate/getVirtual.js +103 -0
  125. package/lib/helpers/populate/leanPopulateMap.js +7 -0
  126. package/lib/helpers/populate/lookupLocalFields.js +40 -0
  127. package/lib/helpers/populate/markArraySubdocsPopulated.js +49 -0
  128. package/lib/helpers/populate/modelNamesFromRefPath.js +66 -0
  129. package/lib/helpers/populate/removeDeselectedForeignField.js +31 -0
  130. package/lib/helpers/populate/setPopulatedVirtualValue.js +33 -0
  131. package/lib/helpers/populate/skipPopulateValue.js +10 -0
  132. package/lib/helpers/populate/validateRef.js +19 -0
  133. package/lib/helpers/printJestWarning.js +21 -0
  134. package/lib/helpers/processConnectionOptions.js +65 -0
  135. package/lib/helpers/projection/applyProjection.js +83 -0
  136. package/lib/helpers/projection/hasIncludedChildren.js +41 -0
  137. package/lib/helpers/projection/isDefiningProjection.js +18 -0
  138. package/lib/helpers/projection/isExclusive.js +37 -0
  139. package/lib/helpers/projection/isInclusive.js +39 -0
  140. package/lib/helpers/projection/isNestedProjection.js +8 -0
  141. package/lib/helpers/projection/isPathExcluded.js +40 -0
  142. package/lib/helpers/projection/isPathSelectedInclusive.js +28 -0
  143. package/lib/helpers/projection/isSubpath.js +14 -0
  144. package/lib/helpers/projection/parseProjection.js +33 -0
  145. package/lib/helpers/query/applyGlobalOption.js +29 -0
  146. package/lib/helpers/query/cast$expr.js +287 -0
  147. package/lib/helpers/query/castFilterPath.js +54 -0
  148. package/lib/helpers/query/castUpdate.js +643 -0
  149. package/lib/helpers/query/getEmbeddedDiscriminatorPath.js +103 -0
  150. package/lib/helpers/query/handleImmutable.js +44 -0
  151. package/lib/helpers/query/handleReadPreferenceAliases.js +23 -0
  152. package/lib/helpers/query/hasDollarKeys.js +23 -0
  153. package/lib/helpers/query/isOperator.js +14 -0
  154. package/lib/helpers/query/sanitizeFilter.js +38 -0
  155. package/lib/helpers/query/sanitizeProjection.js +14 -0
  156. package/lib/helpers/query/selectPopulatedFields.js +62 -0
  157. package/lib/helpers/query/trusted.js +13 -0
  158. package/lib/helpers/query/validOps.js +3 -0
  159. package/lib/helpers/schema/addAutoId.js +7 -0
  160. package/lib/helpers/schema/applyBuiltinPlugins.js +12 -0
  161. package/lib/helpers/schema/applyPlugins.js +55 -0
  162. package/lib/helpers/schema/applyReadConcern.js +20 -0
  163. package/lib/helpers/schema/applyWriteConcern.js +39 -0
  164. package/lib/helpers/schema/cleanPositionalOperators.js +12 -0
  165. package/lib/helpers/schema/getIndexes.js +171 -0
  166. package/lib/helpers/schema/getKeysInSchemaOrder.js +28 -0
  167. package/lib/helpers/schema/getPath.js +43 -0
  168. package/lib/helpers/schema/getSubdocumentStrictValue.js +32 -0
  169. package/lib/helpers/schema/handleIdOption.js +20 -0
  170. package/lib/helpers/schema/handleTimestampOption.js +24 -0
  171. package/lib/helpers/schema/idGetter.js +34 -0
  172. package/lib/helpers/schema/merge.js +36 -0
  173. package/lib/helpers/schematype/handleImmutable.js +50 -0
  174. package/lib/helpers/setDefaultsOnInsert.js +158 -0
  175. package/lib/helpers/specialProperties.js +3 -0
  176. package/lib/helpers/symbols.js +20 -0
  177. package/lib/helpers/timers.js +3 -0
  178. package/lib/helpers/timestamps/setDocumentTimestamps.js +26 -0
  179. package/lib/helpers/timestamps/setupTimestamps.js +116 -0
  180. package/lib/helpers/topology/allServersUnknown.js +12 -0
  181. package/lib/helpers/topology/isAtlas.js +31 -0
  182. package/lib/helpers/topology/isSSLError.js +16 -0
  183. package/lib/helpers/update/applyTimestampsToChildren.js +193 -0
  184. package/lib/helpers/update/applyTimestampsToUpdate.js +131 -0
  185. package/lib/helpers/update/castArrayFilters.js +113 -0
  186. package/lib/helpers/update/decorateUpdateWithVersionKey.js +35 -0
  187. package/lib/helpers/update/modifiedPaths.js +33 -0
  188. package/lib/helpers/update/moveImmutableProperties.js +53 -0
  189. package/lib/helpers/update/removeUnusedArrayFilters.js +32 -0
  190. package/lib/helpers/update/updatedPathsByArrayFilter.js +27 -0
  191. package/lib/helpers/updateValidators.js +193 -0
  192. package/lib/index.js +17 -0
  193. package/lib/internal.js +46 -0
  194. package/lib/model.js +5010 -0
  195. package/lib/modifiedPathsSnapshot.js +9 -0
  196. package/lib/mongoose.js +1411 -0
  197. package/lib/options/populateOptions.js +36 -0
  198. package/lib/options/propertyOptions.js +8 -0
  199. package/lib/options/saveOptions.js +16 -0
  200. package/lib/options/schemaArrayOptions.js +78 -0
  201. package/lib/options/schemaBufferOptions.js +38 -0
  202. package/lib/options/schemaDateOptions.js +71 -0
  203. package/lib/options/schemaDocumentArrayOptions.js +68 -0
  204. package/lib/options/schemaMapOptions.js +43 -0
  205. package/lib/options/schemaNumberOptions.js +101 -0
  206. package/lib/options/schemaObjectIdOptions.js +64 -0
  207. package/lib/options/schemaStringOptions.js +138 -0
  208. package/lib/options/schemaSubdocumentOptions.js +66 -0
  209. package/lib/options/schemaTypeOptions.js +244 -0
  210. package/lib/options/schemaUnionOptions.js +32 -0
  211. package/lib/options/virtualOptions.js +164 -0
  212. package/lib/options.js +17 -0
  213. package/lib/plugins/index.js +6 -0
  214. package/lib/plugins/saveSubdocs.js +76 -0
  215. package/lib/plugins/sharding.js +84 -0
  216. package/lib/plugins/trackTransaction.js +84 -0
  217. package/lib/plugins/validateBeforeSave.js +41 -0
  218. package/lib/query.js +5673 -0
  219. package/lib/queryHelpers.js +387 -0
  220. package/lib/schema/array.js +699 -0
  221. package/lib/schema/bigint.js +282 -0
  222. package/lib/schema/boolean.js +332 -0
  223. package/lib/schema/buffer.js +343 -0
  224. package/lib/schema/date.js +467 -0
  225. package/lib/schema/decimal128.js +263 -0
  226. package/lib/schema/documentArray.js +656 -0
  227. package/lib/schema/documentArrayElement.js +137 -0
  228. package/lib/schema/double.js +246 -0
  229. package/lib/schema/index.js +32 -0
  230. package/lib/schema/int32.js +289 -0
  231. package/lib/schema/map.js +201 -0
  232. package/lib/schema/mixed.js +146 -0
  233. package/lib/schema/number.js +510 -0
  234. package/lib/schema/objectId.js +333 -0
  235. package/lib/schema/operators/bitwise.js +38 -0
  236. package/lib/schema/operators/exists.js +12 -0
  237. package/lib/schema/operators/geospatial.js +107 -0
  238. package/lib/schema/operators/helpers.js +32 -0
  239. package/lib/schema/operators/text.js +39 -0
  240. package/lib/schema/operators/type.js +20 -0
  241. package/lib/schema/string.js +733 -0
  242. package/lib/schema/subdocument.js +436 -0
  243. package/lib/schema/symbols.js +5 -0
  244. package/lib/schema/union.js +113 -0
  245. package/lib/schema/uuid.js +305 -0
  246. package/lib/schema.js +3226 -0
  247. package/lib/schemaType.js +1835 -0
  248. package/lib/stateMachine.js +232 -0
  249. package/lib/types/array/index.js +119 -0
  250. package/lib/types/array/isMongooseArray.js +5 -0
  251. package/lib/types/array/methods/index.js +1095 -0
  252. package/lib/types/arraySubdocument.js +207 -0
  253. package/lib/types/buffer.js +294 -0
  254. package/lib/types/decimal128.js +13 -0
  255. package/lib/types/documentArray/index.js +113 -0
  256. package/lib/types/documentArray/isMongooseDocumentArray.js +5 -0
  257. package/lib/types/documentArray/methods/index.js +415 -0
  258. package/lib/types/double.js +13 -0
  259. package/lib/types/index.js +23 -0
  260. package/lib/types/map.js +419 -0
  261. package/lib/types/objectid.js +41 -0
  262. package/lib/types/subdocument.js +464 -0
  263. package/lib/types/uuid.js +13 -0
  264. package/lib/utils.js +1054 -0
  265. package/lib/validOptions.js +42 -0
  266. package/lib/virtualType.js +204 -0
  267. package/package.json +148 -0
  268. package/types/aggregate.d.ts +180 -0
  269. package/types/augmentations.d.ts +9 -0
  270. package/types/callback.d.ts +8 -0
  271. package/types/collection.d.ts +49 -0
  272. package/types/connection.d.ts +297 -0
  273. package/types/cursor.d.ts +67 -0
  274. package/types/document.d.ts +374 -0
  275. package/types/error.d.ts +143 -0
  276. package/types/expressions.d.ts +3053 -0
  277. package/types/helpers.d.ts +32 -0
  278. package/types/index.d.ts +1056 -0
  279. package/types/indexes.d.ts +97 -0
  280. package/types/inferhydrateddoctype.d.ts +115 -0
  281. package/types/inferrawdoctype.d.ts +135 -0
  282. package/types/inferschematype.d.ts +337 -0
  283. package/types/middlewares.d.ts +59 -0
  284. package/types/models.d.ts +1306 -0
  285. package/types/mongooseoptions.d.ts +228 -0
  286. package/types/pipelinestage.d.ts +333 -0
  287. package/types/populate.d.ts +53 -0
  288. package/types/query.d.ts +934 -0
  289. package/types/schemaoptions.d.ts +282 -0
  290. package/types/schematypes.d.ts +654 -0
  291. package/types/session.d.ts +32 -0
  292. package/types/types.d.ts +109 -0
  293. package/types/utility.d.ts +175 -0
  294. package/types/validation.d.ts +39 -0
  295. 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;