@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,343 @@
1
+ /*!
2
+ * Module dependencies.
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const MongooseBuffer = require('../types/buffer');
8
+ const SchemaBufferOptions = require('../options/schemaBufferOptions');
9
+ const SchemaType = require('../schemaType');
10
+ const createJSONSchemaTypeDefinition = require('../helpers/createJSONSchemaTypeDefinition');
11
+ const handleBitwiseOperator = require('./operators/bitwise');
12
+ const utils = require('../utils');
13
+
14
+ const Binary = MongooseBuffer.Binary;
15
+ const CastError = SchemaType.CastError;
16
+
17
+ /**
18
+ * Buffer 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 SchemaBuffer(key, options, _schemaOptions, parentSchema) {
29
+ SchemaType.call(this, key, options, 'Buffer', 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
+ SchemaBuffer.schemaName = 'Buffer';
39
+
40
+ SchemaBuffer.defaultOptions = {};
41
+
42
+ /*!
43
+ * Inherits from SchemaType.
44
+ */
45
+ SchemaBuffer.prototype = Object.create(SchemaType.prototype);
46
+ SchemaBuffer.prototype.constructor = SchemaBuffer;
47
+ SchemaBuffer.prototype.OptionsConstructor = SchemaBufferOptions;
48
+
49
+ /*!
50
+ * ignore
51
+ */
52
+
53
+ SchemaBuffer._checkRequired = v => !!v?.length;
54
+
55
+ /**
56
+ * Sets a default option for all Buffer instances.
57
+ *
58
+ * #### Example:
59
+ *
60
+ * // Make all buffers have `required` of true by default.
61
+ * mongoose.Schema.Types.Buffer.set('required', true);
62
+ *
63
+ * const User = mongoose.model('User', new Schema({ test: Buffer }));
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
+ SchemaBuffer.set = SchemaType.set;
75
+
76
+ SchemaBuffer.setters = [];
77
+
78
+ /**
79
+ * Attaches a getter for all Buffer instances
80
+ *
81
+ * #### Example:
82
+ *
83
+ * // Always convert to string when getting an ObjectId
84
+ * mongoose.Schema.Types.Buffer.get(v => v.toString('hex'));
85
+ *
86
+ * const Model = mongoose.model('Test', new Schema({ buf: Buffer } }));
87
+ * typeof (new Model({ buf: Buffer.fromString('hello') }).buf); // 'string'
88
+ *
89
+ * @param {Function} getter
90
+ * @return {this}
91
+ * @function get
92
+ * @static
93
+ * @api public
94
+ */
95
+
96
+ SchemaBuffer.get = SchemaType.get;
97
+
98
+ /**
99
+ * Override the function the required validator uses to check whether a string
100
+ * passes the `required` check.
101
+ *
102
+ * #### Example:
103
+ *
104
+ * // Allow empty strings to pass `required` check
105
+ * mongoose.Schema.Types.String.checkRequired(v => v != null);
106
+ *
107
+ * const M = mongoose.model({ buf: { type: Buffer, required: true } });
108
+ * new M({ buf: Buffer.from('') }).validateSync(); // validation passes!
109
+ *
110
+ * @param {Function} fn
111
+ * @return {Function}
112
+ * @function checkRequired
113
+ * @static
114
+ * @api public
115
+ */
116
+
117
+ SchemaBuffer.checkRequired = SchemaType.checkRequired;
118
+
119
+ /**
120
+ * Check if the given value satisfies a required validator. To satisfy a
121
+ * required validator, a buffer must not be null or undefined and have
122
+ * non-zero length.
123
+ *
124
+ * @param {Any} value
125
+ * @param {Document} doc
126
+ * @return {Boolean}
127
+ * @api public
128
+ */
129
+
130
+ SchemaBuffer.prototype.checkRequired = function(value, doc) {
131
+ if (SchemaType._isRef(this, value, doc, true)) {
132
+ return !!value;
133
+ }
134
+ return this.constructor._checkRequired(value);
135
+ };
136
+
137
+ /**
138
+ * Casts contents
139
+ *
140
+ * @param {Object} value
141
+ * @param {Document} doc document that triggers the casting
142
+ * @param {Boolean} init
143
+ * @api private
144
+ */
145
+
146
+ SchemaBuffer.prototype.cast = function(value, doc, init, prev, options) {
147
+ let ret;
148
+ if (SchemaType._isRef(this, value, doc, init)) {
149
+ if (value?.isMongooseBuffer) {
150
+ return value;
151
+ }
152
+
153
+ if (Buffer.isBuffer(value)) {
154
+ if (!value?.isMongooseBuffer) {
155
+ value = new MongooseBuffer(value, [this.path, doc]);
156
+ if (this.options.subtype != null) {
157
+ value._subtype = this.options.subtype;
158
+ }
159
+ }
160
+ return value;
161
+ }
162
+
163
+ if (value instanceof Binary) {
164
+ ret = new MongooseBuffer(value.value(true), [this.path, doc]);
165
+ if (typeof value.sub_type !== 'number') {
166
+ throw new CastError('Buffer', value, this.path, null, this);
167
+ }
168
+ ret._subtype = value.sub_type;
169
+ return ret;
170
+ }
171
+
172
+ if (value == null || utils.isNonBuiltinObject(value)) {
173
+ return this._castRef(value, doc, init, options);
174
+ }
175
+ }
176
+
177
+ // documents
178
+ if (value?._id) {
179
+ value = value._id;
180
+ }
181
+
182
+ if (value?.isMongooseBuffer) {
183
+ return value;
184
+ }
185
+
186
+ if (Buffer.isBuffer(value)) {
187
+ if (!value?.isMongooseBuffer) {
188
+ value = new MongooseBuffer(value, [this.path, doc]);
189
+ if (this.options.subtype != null) {
190
+ value._subtype = this.options.subtype;
191
+ }
192
+ }
193
+ return value;
194
+ }
195
+
196
+ if (value instanceof Binary) {
197
+ ret = new MongooseBuffer(value.value(true), [this.path, doc]);
198
+ if (typeof value.sub_type !== 'number') {
199
+ throw new CastError('Buffer', value, this.path, null, this);
200
+ }
201
+ ret._subtype = value.sub_type;
202
+ return ret;
203
+ }
204
+
205
+ if (value === null) {
206
+ return value;
207
+ }
208
+
209
+
210
+ const type = typeof value;
211
+ if (
212
+ type === 'string' || type === 'number' || Array.isArray(value) ||
213
+ (type === 'object' && value.type === 'Buffer' && Array.isArray(value.data)) // gh-6863
214
+ ) {
215
+ if (type === 'number') {
216
+ value = [value];
217
+ }
218
+ ret = new MongooseBuffer(value, [this.path, doc]);
219
+ if (this.options.subtype != null) {
220
+ ret._subtype = this.options.subtype;
221
+ }
222
+ return ret;
223
+ }
224
+
225
+ if (utils.isPOJO(value) && (value.$binary instanceof Binary || typeof value.$binary === 'string')) {
226
+ const buf = this.cast(Buffer.from(value.$binary, 'base64'));
227
+ if (value.$type != null) {
228
+ buf._subtype = value.$type;
229
+ return buf;
230
+ }
231
+ }
232
+
233
+ throw new CastError('Buffer', value, this.path, null, this);
234
+ };
235
+
236
+ /**
237
+ * Sets the default [subtype](https://studio3t.com/whats-new/best-practices-uuid-mongodb/)
238
+ * for this buffer. You can find a [list of allowed subtypes here](https://api.mongodb.com/python/current/api/bson/binary.html).
239
+ *
240
+ * #### Example:
241
+ *
242
+ * const s = new Schema({ uuid: { type: Buffer, subtype: 4 });
243
+ * const M = db.model('M', s);
244
+ * const m = new M({ uuid: 'test string' });
245
+ * m.uuid._subtype; // 4
246
+ *
247
+ * @param {Number} subtype the default subtype
248
+ * @return {SchemaType} this
249
+ * @api public
250
+ */
251
+
252
+ SchemaBuffer.prototype.subtype = function(subtype) {
253
+ this.options.subtype = subtype;
254
+ return this;
255
+ };
256
+
257
+ /*!
258
+ * ignore
259
+ */
260
+ function handleSingle(val, context) {
261
+ return this.castForQuery(null, val, context);
262
+ }
263
+
264
+ const $conditionalHandlers = {
265
+ ...SchemaType.prototype.$conditionalHandlers,
266
+ $bitsAllClear: handleBitwiseOperator,
267
+ $bitsAnyClear: handleBitwiseOperator,
268
+ $bitsAllSet: handleBitwiseOperator,
269
+ $bitsAnySet: handleBitwiseOperator,
270
+ $gt: handleSingle,
271
+ $gte: handleSingle,
272
+ $lt: handleSingle,
273
+ $lte: handleSingle
274
+ };
275
+
276
+ /**
277
+ * Contains the handlers for different query operators for this schema type.
278
+ * For example, `$conditionalHandlers.$exists` is the function Mongoose calls to cast `$exists` filter operators.
279
+ *
280
+ * @property $conditionalHandlers
281
+ * @memberOf SchemaBuffer
282
+ * @instance
283
+ * @api public
284
+ */
285
+
286
+ Object.defineProperty(SchemaBuffer.prototype, '$conditionalHandlers', {
287
+ enumerable: false,
288
+ value: $conditionalHandlers
289
+ });
290
+
291
+
292
+ /**
293
+ * Casts contents for queries.
294
+ *
295
+ * @param {String} $conditional
296
+ * @param {any} [value]
297
+ * @api private
298
+ */
299
+
300
+ SchemaBuffer.prototype.castForQuery = function($conditional, val, context) {
301
+ let handler;
302
+ if ($conditional != null) {
303
+ handler = this.$conditionalHandlers[$conditional];
304
+ if (!handler) {
305
+ throw new Error('Can\'t use ' + $conditional + ' with Buffer.');
306
+ }
307
+ return handler.call(this, val);
308
+ }
309
+
310
+ let casted;
311
+ try {
312
+ casted = this.applySetters(val, context);
313
+ } catch (err) {
314
+ if (err instanceof CastError && err.path === this.path && this.$fullPath != null) {
315
+ err.path = this.$fullPath;
316
+ }
317
+ throw err;
318
+ }
319
+ return casted ? casted.toObject({ transform: false, virtuals: false }) : casted;
320
+ };
321
+
322
+ /**
323
+ * Returns this schema type's representation in a JSON schema.
324
+ *
325
+ * @param [options]
326
+ * @param [options.useBsonType=false] If true, return a representation with `bsonType` for use with MongoDB's `$jsonSchema`.
327
+ * @returns {Object} JSON schema properties
328
+ */
329
+
330
+ SchemaBuffer.prototype.toJSONSchema = function toJSONSchema(options) {
331
+ const isRequired = this.options.required && typeof this.options.required !== 'function';
332
+ return createJSONSchemaTypeDefinition('string', 'binData', options?.useBsonType, isRequired);
333
+ };
334
+
335
+ SchemaBuffer.prototype.autoEncryptionType = function autoEncryptionType() {
336
+ return 'binData';
337
+ };
338
+
339
+ /*!
340
+ * Module exports.
341
+ */
342
+
343
+ module.exports = SchemaBuffer;