@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,467 @@
1
+ /*!
2
+ * Module requirements.
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const MongooseError = require('../error/index');
8
+ const SchemaDateOptions = require('../options/schemaDateOptions');
9
+ const SchemaType = require('../schemaType');
10
+ const castDate = require('../cast/date');
11
+ const createJSONSchemaTypeDefinition = require('../helpers/createJSONSchemaTypeDefinition');
12
+ const getConstructorName = require('../helpers/getConstructorName');
13
+ const utils = require('../utils');
14
+
15
+ const CastError = SchemaType.CastError;
16
+
17
+ /**
18
+ * Date 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 SchemaDate(key, options, _schemaOptions, parentSchema) {
29
+ SchemaType.call(this, key, options, 'Date', parentSchema);
30
+ }
31
+
32
+ /**
33
+ * This schema type's name, to defend against minifiers that mangle
34
+ * function names.
35
+ *
36
+ * @api public
37
+ */
38
+ SchemaDate.schemaName = 'Date';
39
+
40
+ SchemaDate.defaultOptions = {};
41
+
42
+ /*!
43
+ * Inherits from SchemaType.
44
+ */
45
+ SchemaDate.prototype = Object.create(SchemaType.prototype);
46
+ SchemaDate.prototype.constructor = SchemaDate;
47
+ SchemaDate.prototype.OptionsConstructor = SchemaDateOptions;
48
+
49
+ /*!
50
+ * ignore
51
+ */
52
+
53
+ SchemaDate._cast = castDate;
54
+
55
+ /**
56
+ * Sets a default option for all Date instances.
57
+ *
58
+ * #### Example:
59
+ *
60
+ * // Make all dates have `required` of true by default.
61
+ * mongoose.Schema.Types.Date.set('required', true);
62
+ *
63
+ * const User = mongoose.model('User', new Schema({ test: Date }));
64
+ * new User({ }).validateSync().errors.test.message; // Path `test` is required.
65
+ *
66
+ * @param {String} option The option you'd like to set the value for
67
+ * @param {Any} value value for option
68
+ * @return {undefined}
69
+ * @function set
70
+ * @static
71
+ * @api public
72
+ */
73
+
74
+ SchemaDate.set = SchemaType.set;
75
+
76
+ SchemaDate.setters = [];
77
+
78
+ /**
79
+ * Attaches a getter for all Date instances
80
+ *
81
+ * #### Example:
82
+ *
83
+ * // Always convert Dates to string
84
+ * mongoose.Schema.Types.Date.get(v => v.toString());
85
+ *
86
+ * const Model = mongoose.model('Test', new Schema({ date: { type: Date, default: () => new Date() } }));
87
+ * typeof (new Model({}).date); // 'string'
88
+ *
89
+ * @param {Function} getter
90
+ * @return {this}
91
+ * @function get
92
+ * @static
93
+ * @api public
94
+ */
95
+
96
+ SchemaDate.get = SchemaType.get;
97
+
98
+ /**
99
+ * Get/set the function used to cast arbitrary values to dates.
100
+ *
101
+ * #### Example:
102
+ *
103
+ * // Mongoose converts empty string '' into `null` for date types. You
104
+ * // can create a custom caster to disable it.
105
+ * const original = mongoose.Schema.Types.Date.cast();
106
+ * mongoose.Schema.Types.Date.cast(v => {
107
+ * assert.ok(v !== '');
108
+ * return original(v);
109
+ * });
110
+ *
111
+ * // Or disable casting entirely
112
+ * mongoose.Schema.Types.Date.cast(false);
113
+ *
114
+ * @param {Function} caster
115
+ * @return {Function}
116
+ * @function cast
117
+ * @static
118
+ * @api public
119
+ */
120
+
121
+ SchemaDate.cast = function cast(caster) {
122
+ if (arguments.length === 0) {
123
+ return this._cast;
124
+ }
125
+ if (caster === false) {
126
+ caster = this._defaultCaster;
127
+ }
128
+ this._cast = caster;
129
+
130
+ return this._cast;
131
+ };
132
+
133
+ /*!
134
+ * ignore
135
+ */
136
+
137
+ SchemaDate._defaultCaster = v => {
138
+ if (v != null && !(v instanceof Date)) {
139
+ throw new Error();
140
+ }
141
+ return v;
142
+ };
143
+
144
+ /**
145
+ * Declares a TTL index (rounded to the nearest second) for _Date_ types only.
146
+ *
147
+ * This sets the `expireAfterSeconds` index option available in MongoDB >= 2.1.2.
148
+ * This index type is only compatible with Date types.
149
+ *
150
+ * #### Example:
151
+ *
152
+ * // expire in 24 hours
153
+ * new Schema({ createdAt: { type: Date, expires: 60*60*24 }});
154
+ *
155
+ * `expires` utilizes the `ms` module from [vercel](https://github.com/vercel/ms) allowing us to use a friendlier syntax:
156
+ *
157
+ * #### Example:
158
+ *
159
+ * // expire in 24 hours
160
+ * new Schema({ createdAt: { type: Date, expires: '24h' }});
161
+ *
162
+ * // expire in 1.5 hours
163
+ * new Schema({ createdAt: { type: Date, expires: '1.5h' }});
164
+ *
165
+ * // expire in 7 days
166
+ * const schema = new Schema({ createdAt: Date });
167
+ * schema.path('createdAt').expires('7d');
168
+ *
169
+ * @param {Number|String} when
170
+ * @added 3.0.0
171
+ * @return {SchemaType} this
172
+ * @api public
173
+ */
174
+
175
+ SchemaDate.prototype.expires = function(when) {
176
+ if (getConstructorName(this._index) !== 'Object') {
177
+ this._index = {};
178
+ }
179
+
180
+ this._index.expires = when;
181
+ utils.expires(this._index);
182
+ return this;
183
+ };
184
+
185
+ /*!
186
+ * ignore
187
+ */
188
+
189
+ SchemaDate._checkRequired = v => v instanceof Date;
190
+
191
+ /**
192
+ * Override the function the required validator uses to check whether a string
193
+ * passes the `required` check.
194
+ *
195
+ * #### Example:
196
+ *
197
+ * // Allow empty strings to pass `required` check
198
+ * mongoose.Schema.Types.String.checkRequired(v => v != null);
199
+ *
200
+ * const M = mongoose.model({ str: { type: String, required: true } });
201
+ * new M({ str: '' }).validateSync(); // `null`, validation passes!
202
+ *
203
+ * @param {Function} fn
204
+ * @return {Function}
205
+ * @function checkRequired
206
+ * @static
207
+ * @api public
208
+ */
209
+
210
+ SchemaDate.checkRequired = SchemaType.checkRequired;
211
+
212
+ /**
213
+ * Check if the given value satisfies a required validator. To satisfy
214
+ * a required validator, the given value must be an instance of `Date`.
215
+ *
216
+ * @param {Any} value
217
+ * @param {Document} doc
218
+ * @return {Boolean}
219
+ * @api public
220
+ */
221
+
222
+ SchemaDate.prototype.checkRequired = function(value, doc) {
223
+ if (typeof value === 'object' && SchemaType._isRef(this, value, doc, true)) {
224
+ return value != null;
225
+ }
226
+
227
+ // `require('util').inherits()` does **not** copy static properties, and
228
+ // plugins like mongoose-float use `inherits()` for pre-ES6.
229
+ const _checkRequired = typeof this.constructor.checkRequired === 'function' ?
230
+ this.constructor.checkRequired() :
231
+ SchemaDate.checkRequired();
232
+ return _checkRequired(value);
233
+ };
234
+
235
+ /**
236
+ * Sets a minimum date validator.
237
+ *
238
+ * #### Example:
239
+ *
240
+ * const s = new Schema({ d: { type: Date, min: Date('1970-01-01') })
241
+ * const M = db.model('M', s)
242
+ * const m = new M({ d: Date('1969-12-31') })
243
+ * m.save(function (err) {
244
+ * console.error(err) // validator error
245
+ * m.d = Date('2014-12-08');
246
+ * m.save() // success
247
+ * })
248
+ *
249
+ * // custom error messages
250
+ * // We can also use the special {MIN} token which will be replaced with the invalid value
251
+ * const min = [Date('1970-01-01'), 'The value of path `{PATH}` ({VALUE}) is beneath the limit ({MIN}).'];
252
+ * const schema = new Schema({ d: { type: Date, min: min })
253
+ * const M = mongoose.model('M', schema);
254
+ * const s= new M({ d: Date('1969-12-31') });
255
+ * s.validate(function (err) {
256
+ * console.log(String(err)) // ValidationError: The value of path `d` (1969-12-31) is before the limit (1970-01-01).
257
+ * })
258
+ *
259
+ * @param {Date} value minimum date
260
+ * @param {String} [message] optional custom error message
261
+ * @return {SchemaType} this
262
+ * @see Customized Error Messages https://mongoosejs.com/docs/api/error.html#Error.messages
263
+ * @api public
264
+ */
265
+
266
+ SchemaDate.prototype.min = function(value, message) {
267
+ if (this.minValidator) {
268
+ this.validators = this.validators.filter(function(v) {
269
+ return v.validator !== this.minValidator;
270
+ }, this);
271
+ }
272
+
273
+ if (value) {
274
+ let msg = message || MongooseError.messages.Date.min;
275
+ if (typeof msg === 'string') {
276
+ msg = msg.replace(/{MIN}/, (value === Date.now ? 'Date.now()' : value.toString()));
277
+ }
278
+ const _this = this;
279
+ this.validators.push({
280
+ validator: this.minValidator = function(val) {
281
+ let _value = value;
282
+ if (typeof value === 'function' && value !== Date.now) {
283
+ _value = _value.call(this);
284
+ }
285
+ const min = (_value === Date.now ? _value() : _this.cast(_value));
286
+ return val === null || val.valueOf() >= min.valueOf();
287
+ },
288
+ message: msg,
289
+ type: 'min',
290
+ min: value
291
+ });
292
+ }
293
+
294
+ return this;
295
+ };
296
+
297
+ /**
298
+ * Sets a maximum date validator.
299
+ *
300
+ * #### Example:
301
+ *
302
+ * const s = new Schema({ d: { type: Date, max: Date('2014-01-01') })
303
+ * const M = db.model('M', s)
304
+ * const m = new M({ d: Date('2014-12-08') })
305
+ * m.save(function (err) {
306
+ * console.error(err) // validator error
307
+ * m.d = Date('2013-12-31');
308
+ * m.save() // success
309
+ * })
310
+ *
311
+ * // custom error messages
312
+ * // We can also use the special {MAX} token which will be replaced with the invalid value
313
+ * const max = [Date('2014-01-01'), 'The value of path `{PATH}` ({VALUE}) exceeds the limit ({MAX}).'];
314
+ * const schema = new Schema({ d: { type: Date, max: max })
315
+ * const M = mongoose.model('M', schema);
316
+ * const s= new M({ d: Date('2014-12-08') });
317
+ * s.validate(function (err) {
318
+ * console.log(String(err)) // ValidationError: The value of path `d` (2014-12-08) exceeds the limit (2014-01-01).
319
+ * })
320
+ *
321
+ * @param {Date} maximum date
322
+ * @param {String} [message] optional custom error message
323
+ * @return {SchemaType} this
324
+ * @see Customized Error Messages https://mongoosejs.com/docs/api/error.html#Error.messages
325
+ * @api public
326
+ */
327
+
328
+ SchemaDate.prototype.max = function(value, message) {
329
+ if (this.maxValidator) {
330
+ this.validators = this.validators.filter(function(v) {
331
+ return v.validator !== this.maxValidator;
332
+ }, this);
333
+ }
334
+
335
+ if (value) {
336
+ let msg = message || MongooseError.messages.Date.max;
337
+ if (typeof msg === 'string') {
338
+ msg = msg.replace(/{MAX}/, (value === Date.now ? 'Date.now()' : value.toString()));
339
+ }
340
+ const _this = this;
341
+ this.validators.push({
342
+ validator: this.maxValidator = function(val) {
343
+ let _value = value;
344
+ if (typeof _value === 'function' && _value !== Date.now) {
345
+ _value = _value.call(this);
346
+ }
347
+ const max = (_value === Date.now ? _value() : _this.cast(_value));
348
+ return val === null || val.valueOf() <= max.valueOf();
349
+ },
350
+ message: msg,
351
+ type: 'max',
352
+ max: value
353
+ });
354
+ }
355
+
356
+ return this;
357
+ };
358
+
359
+ /**
360
+ * Casts to date
361
+ *
362
+ * @param {Object} value to cast
363
+ * @api private
364
+ */
365
+
366
+ SchemaDate.prototype.cast = function(value) {
367
+ let castDate;
368
+ if (typeof this._castFunction === 'function') {
369
+ castDate = this._castFunction;
370
+ } else if (typeof this.constructor.cast === 'function') {
371
+ castDate = this.constructor.cast();
372
+ } else {
373
+ castDate = SchemaDate.cast();
374
+ }
375
+
376
+ try {
377
+ return castDate(value);
378
+ } catch (error) {
379
+ throw new CastError('date', value, this.path, error, this);
380
+ }
381
+ };
382
+
383
+ /**
384
+ * Date Query casting.
385
+ *
386
+ * @param {Any} val
387
+ * @api private
388
+ */
389
+
390
+ function handleSingle(val) {
391
+ return this.cast(val);
392
+ }
393
+
394
+ const $conditionalHandlers = {
395
+ ...SchemaType.prototype.$conditionalHandlers,
396
+ $gt: handleSingle,
397
+ $gte: handleSingle,
398
+ $lt: handleSingle,
399
+ $lte: handleSingle
400
+ };
401
+
402
+ /**
403
+ * Contains the handlers for different query operators for this schema type.
404
+ * For example, `$conditionalHandlers.$gte` is the function Mongoose calls to cast `$gte` filter operators.
405
+ *
406
+ * @property $conditionalHandlers
407
+ * @memberOf SchemaDate
408
+ * @instance
409
+ * @api public
410
+ */
411
+
412
+ Object.defineProperty(SchemaDate.prototype, '$conditionalHandlers', {
413
+ enumerable: false,
414
+ value: $conditionalHandlers
415
+ });
416
+
417
+ /**
418
+ * Casts contents for queries.
419
+ *
420
+ * @param {String} $conditional
421
+ * @param {any} [value]
422
+ * @api private
423
+ */
424
+
425
+ SchemaDate.prototype.castForQuery = function($conditional, val, context) {
426
+ if ($conditional == null) {
427
+ try {
428
+ return this.applySetters(val, context);
429
+ } catch (err) {
430
+ if (err instanceof CastError && err.path === this.path && this.$fullPath != null) {
431
+ err.path = this.$fullPath;
432
+ }
433
+ throw err;
434
+ }
435
+ }
436
+
437
+ const handler = this.$conditionalHandlers[$conditional];
438
+
439
+ if (!handler) {
440
+ throw new Error('Can\'t use ' + $conditional + ' with Date.');
441
+ }
442
+
443
+ return handler.call(this, val);
444
+ };
445
+
446
+ /**
447
+ * Returns this schema type's representation in a JSON schema.
448
+ *
449
+ * @param [options]
450
+ * @param [options.useBsonType=false] If true, return a representation with `bsonType` for use with MongoDB's `$jsonSchema`.
451
+ * @returns {Object} JSON schema properties
452
+ */
453
+
454
+ SchemaDate.prototype.toJSONSchema = function toJSONSchema(options) {
455
+ const isRequired = this.options.required && typeof this.options.required !== 'function';
456
+ return createJSONSchemaTypeDefinition('string', 'date', options?.useBsonType, isRequired);
457
+ };
458
+
459
+ SchemaDate.prototype.autoEncryptionType = function autoEncryptionType() {
460
+ return 'date';
461
+ };
462
+
463
+ /*!
464
+ * Module exports.
465
+ */
466
+
467
+ module.exports = SchemaDate;
@@ -0,0 +1,263 @@
1
+ /*!
2
+ * Module dependencies.
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const SchemaType = require('../schemaType');
8
+ const CastError = SchemaType.CastError;
9
+ const castDecimal128 = require('../cast/decimal128');
10
+ const createJSONSchemaTypeDefinition = require('../helpers/createJSONSchemaTypeDefinition');
11
+ const isBsonType = require('../helpers/isBsonType');
12
+
13
+ /**
14
+ * Decimal128 SchemaType constructor.
15
+ *
16
+ * @param {String} key
17
+ * @param {Object} options
18
+ * @param {Object} schemaOptions
19
+ * @param {Schema} parentSchema
20
+ * @inherits SchemaType
21
+ * @api public
22
+ */
23
+
24
+ function SchemaDecimal128(key, options, _schemaOptions, parentSchema) {
25
+ SchemaType.call(this, key, options, 'Decimal128', parentSchema);
26
+ }
27
+
28
+ /**
29
+ * This schema type's name, to defend against minifiers that mangle
30
+ * function names.
31
+ *
32
+ * @api public
33
+ */
34
+ SchemaDecimal128.schemaName = 'Decimal128';
35
+
36
+ SchemaDecimal128.defaultOptions = {};
37
+
38
+ /*!
39
+ * Inherits from SchemaType.
40
+ */
41
+ SchemaDecimal128.prototype = Object.create(SchemaType.prototype);
42
+ SchemaDecimal128.prototype.constructor = SchemaDecimal128;
43
+
44
+ /*!
45
+ * ignore
46
+ */
47
+
48
+ SchemaDecimal128._cast = castDecimal128;
49
+
50
+ /**
51
+ * Sets a default option for all Decimal128 instances.
52
+ *
53
+ * #### Example:
54
+ *
55
+ * // Make all decimal 128s have `required` of true by default.
56
+ * mongoose.Schema.Types.Decimal128.set('required', true);
57
+ *
58
+ * const User = mongoose.model('User', new Schema({ test: mongoose.Decimal128 }));
59
+ * new User({ }).validateSync().errors.test.message; // Path `test` is required.
60
+ *
61
+ * @param {String} option The option you'd like to set the value for
62
+ * @param {Any} value value for option
63
+ * @return {undefined}
64
+ * @function set
65
+ * @static
66
+ * @api public
67
+ */
68
+
69
+ SchemaDecimal128.set = SchemaType.set;
70
+
71
+ SchemaDecimal128.setters = [];
72
+
73
+ /**
74
+ * Attaches a getter for all Decimal128 instances
75
+ *
76
+ * #### Example:
77
+ *
78
+ * // Automatically convert Decimal128s to Numbers
79
+ * mongoose.Schema.Types.Decimal128.get(v => v == null ? v : Number(v));
80
+ *
81
+ * @param {Function} getter
82
+ * @return {this}
83
+ * @function get
84
+ * @static
85
+ * @api public
86
+ */
87
+
88
+ SchemaDecimal128.get = SchemaType.get;
89
+
90
+ /**
91
+ * Get/set the function used to cast arbitrary values to decimals.
92
+ *
93
+ * #### Example:
94
+ *
95
+ * // Make Mongoose only refuse to cast numbers as decimal128
96
+ * const original = mongoose.Schema.Types.Decimal128.cast();
97
+ * mongoose.Decimal128.cast(v => {
98
+ * assert.ok(typeof v !== 'number');
99
+ * return original(v);
100
+ * });
101
+ *
102
+ * // Or disable casting entirely
103
+ * mongoose.Decimal128.cast(false);
104
+ *
105
+ * @param {Function} [caster]
106
+ * @return {Function}
107
+ * @function get
108
+ * @static
109
+ * @api public
110
+ */
111
+
112
+ SchemaDecimal128.cast = function cast(caster) {
113
+ if (arguments.length === 0) {
114
+ return this._cast;
115
+ }
116
+ if (caster === false) {
117
+ caster = this._defaultCaster;
118
+ }
119
+ this._cast = caster;
120
+
121
+ return this._cast;
122
+ };
123
+
124
+ /*!
125
+ * ignore
126
+ */
127
+
128
+ SchemaDecimal128._defaultCaster = v => {
129
+ if (v != null && !isBsonType(v, 'Decimal128')) {
130
+ throw new Error();
131
+ }
132
+ return v;
133
+ };
134
+
135
+ /*!
136
+ * ignore
137
+ */
138
+
139
+ SchemaDecimal128._checkRequired = v => isBsonType(v, 'Decimal128');
140
+
141
+ /**
142
+ * Override the function the required validator uses to check whether a string
143
+ * passes the `required` check.
144
+ *
145
+ * @param {Function} fn
146
+ * @return {Function}
147
+ * @function checkRequired
148
+ * @static
149
+ * @api public
150
+ */
151
+
152
+ SchemaDecimal128.checkRequired = SchemaType.checkRequired;
153
+
154
+ /**
155
+ * Check if the given value satisfies a required validator.
156
+ *
157
+ * @param {Any} value
158
+ * @param {Document} doc
159
+ * @return {Boolean}
160
+ * @api public
161
+ */
162
+
163
+ SchemaDecimal128.prototype.checkRequired = function checkRequired(value, doc) {
164
+ if (SchemaType._isRef(this, value, doc, true)) {
165
+ return !!value;
166
+ }
167
+
168
+ // `require('util').inherits()` does **not** copy static properties, and
169
+ // plugins like mongoose-float use `inherits()` for pre-ES6.
170
+ const _checkRequired = typeof this.constructor.checkRequired === 'function' ?
171
+ this.constructor.checkRequired() :
172
+ SchemaDecimal128.checkRequired();
173
+
174
+ return _checkRequired(value);
175
+ };
176
+
177
+ /**
178
+ * Casts to Decimal128
179
+ *
180
+ * @param {Object} value
181
+ * @param {Object} doc
182
+ * @param {Boolean} init whether this is an initialization cast
183
+ * @api private
184
+ */
185
+
186
+ SchemaDecimal128.prototype.cast = function(value, doc, init, prev, options) {
187
+ if (SchemaType._isRef(this, value, doc, init)) {
188
+ if (isBsonType(value, 'Decimal128')) {
189
+ return value;
190
+ }
191
+
192
+ return this._castRef(value, doc, init, options);
193
+ }
194
+
195
+ let castDecimal128;
196
+ if (typeof this._castFunction === 'function') {
197
+ castDecimal128 = this._castFunction;
198
+ } else if (typeof this.constructor.cast === 'function') {
199
+ castDecimal128 = this.constructor.cast();
200
+ } else {
201
+ castDecimal128 = SchemaDecimal128.cast();
202
+ }
203
+
204
+ try {
205
+ return castDecimal128(value);
206
+ } catch (error) {
207
+ throw new CastError('Decimal128', value, this.path, error, this);
208
+ }
209
+ };
210
+
211
+ /*!
212
+ * ignore
213
+ */
214
+
215
+ function handleSingle(val) {
216
+ return this.cast(val);
217
+ }
218
+
219
+ const $conditionalHandlers = {
220
+ ...SchemaType.prototype.$conditionalHandlers,
221
+ $gt: handleSingle,
222
+ $gte: handleSingle,
223
+ $lt: handleSingle,
224
+ $lte: handleSingle
225
+ };
226
+
227
+ /**
228
+ * Contains the handlers for different query operators for this schema type.
229
+ * For example, `$conditionalHandlers.$lte` is the function Mongoose calls to cast `$lte` filter operators.
230
+ *
231
+ * @property $conditionalHandlers
232
+ * @memberOf SchemaDecimal128
233
+ * @instance
234
+ * @api public
235
+ */
236
+
237
+ Object.defineProperty(SchemaDecimal128.prototype, '$conditionalHandlers', {
238
+ enumerable: false,
239
+ value: $conditionalHandlers
240
+ });
241
+
242
+ /**
243
+ * Returns this schema type's representation in a JSON schema.
244
+ *
245
+ * @param [options]
246
+ * @param [options.useBsonType=false] If true, return a representation with `bsonType` for use with MongoDB's `$jsonSchema`.
247
+ * @returns {Object} JSON schema properties
248
+ */
249
+
250
+ SchemaDecimal128.prototype.toJSONSchema = function toJSONSchema(options) {
251
+ const isRequired = this.options.required && typeof this.options.required !== 'function';
252
+ return createJSONSchemaTypeDefinition('string', 'decimal', options?.useBsonType, isRequired);
253
+ };
254
+
255
+ SchemaDecimal128.prototype.autoEncryptionType = function autoEncryptionType() {
256
+ return 'decimal';
257
+ };
258
+
259
+ /*!
260
+ * Module exports.
261
+ */
262
+
263
+ module.exports = SchemaDecimal128;