@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
package/lib/cast.js ADDED
@@ -0,0 +1,436 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * Module dependencies.
5
+ */
6
+
7
+ const CastError = require('./error/cast');
8
+ const StrictModeError = require('./error/strict');
9
+ const Types = require('./schema/index');
10
+ const cast$expr = require('./helpers/query/cast$expr');
11
+ const castString = require('./cast/string');
12
+ const castTextSearch = require('./schema/operators/text');
13
+ const get = require('./helpers/get');
14
+ const getSchemaDiscriminatorByValue = require('./helpers/discriminator/getSchemaDiscriminatorByValue');
15
+ const isOperator = require('./helpers/query/isOperator');
16
+ const util = require('util');
17
+ const isObject = require('./helpers/isObject');
18
+ const isMongooseObject = require('./helpers/isMongooseObject');
19
+ const utils = require('./utils');
20
+
21
+ const ALLOWED_GEOWITHIN_GEOJSON_TYPES = ['Polygon', 'MultiPolygon'];
22
+
23
+ /**
24
+ * Handles internal casting for query filters.
25
+ *
26
+ * @param {Schema} schema
27
+ * @param {Object} obj Object to cast
28
+ * @param {Object} [options] the query options
29
+ * @param {Boolean|"throw"} [options.strict] Wheter to enable all strict options
30
+ * @param {Boolean|"throw"} [options.strictQuery] Enable strict Queries
31
+ * @param {Boolean} [options.sanitizeFilter] avoid adding implict query selectors ($in)
32
+ * @param {Boolean} [options.upsert]
33
+ * @param {Query} [context] passed to setters
34
+ * @api private
35
+ */
36
+ module.exports = function cast(schema, obj, options, context) {
37
+ if (Array.isArray(obj)) {
38
+ throw new Error('Query filter must be an object, got an array ', util.inspect(obj));
39
+ }
40
+
41
+ if (obj == null) {
42
+ return obj;
43
+ }
44
+
45
+ if (schema?.discriminators != null && obj[schema.options.discriminatorKey] != null) {
46
+ schema = getSchemaDiscriminatorByValue(schema, obj[schema.options.discriminatorKey]) || schema;
47
+ }
48
+
49
+ const paths = Object.keys(obj);
50
+ let i = paths.length;
51
+ let _keys;
52
+ let any$conditionals;
53
+ let schematype;
54
+ let nested;
55
+ let path;
56
+ let type;
57
+ let val;
58
+
59
+ options = options || {};
60
+
61
+ while (i--) {
62
+ path = paths[i];
63
+ val = obj[path];
64
+
65
+ if (path === '$or' || path === '$nor' || path === '$and') {
66
+ if (!Array.isArray(val)) {
67
+ throw new CastError('Array', val, path);
68
+ }
69
+ for (let k = val.length - 1; k >= 0; k--) {
70
+ if (val[k] == null || typeof val[k] !== 'object') {
71
+ throw new CastError('Object', val[k], path + '.' + k);
72
+ }
73
+ const beforeCastKeysLength = Object.keys(val[k]).length;
74
+ const discriminatorValue = val[k][schema.options.discriminatorKey];
75
+ if (discriminatorValue == null) {
76
+ val[k] = cast(schema, val[k], options, context);
77
+ } else {
78
+ const discriminatorSchema = getSchemaDiscriminatorByValue(context.schema, discriminatorValue);
79
+ val[k] = cast(discriminatorSchema ? discriminatorSchema : schema, val[k], options, context);
80
+ }
81
+
82
+ if (utils.hasOwnKeys(val[k]) === false && beforeCastKeysLength !== 0) {
83
+ val.splice(k, 1);
84
+ }
85
+ }
86
+
87
+ // delete empty: {$or: []} -> {}
88
+ if (val.length === 0) {
89
+ delete obj[path];
90
+ }
91
+ } else if (path === '$where') {
92
+ type = typeof val;
93
+
94
+ if (type !== 'string' && type !== 'function') {
95
+ throw new Error('Must have a string or function for $where');
96
+ }
97
+
98
+ if (type === 'function') {
99
+ obj[path] = val.toString();
100
+ }
101
+
102
+ continue;
103
+ } else if (path === '$expr') {
104
+ val = cast$expr(val, schema);
105
+ continue;
106
+ } else if (path === '$elemMatch') {
107
+ val = cast(schema, val, options, context);
108
+ } else if (path === '$text') {
109
+ val = castTextSearch(val, path);
110
+ } else if (path === '$comment' && !Object.hasOwn(schema.paths, '$comment')) {
111
+ val = castString(val, path);
112
+ obj[path] = val;
113
+ } else {
114
+ if (!schema) {
115
+ // no casting for Mixed types
116
+ continue;
117
+ }
118
+
119
+ schematype = schema.path(path);
120
+
121
+ // Check for embedded discriminator paths
122
+ if (!schematype) {
123
+ const split = path.split('.');
124
+ let j = split.length;
125
+ while (j--) {
126
+ const pathFirstHalf = split.slice(0, j).join('.');
127
+ const pathLastHalf = split.slice(j).join('.');
128
+ const _schematype = schema.path(pathFirstHalf);
129
+ const discriminatorKey = _schematype?.schema?.options?.discriminatorKey;
130
+
131
+ // gh-6027: if we haven't found the schematype but this path is
132
+ // underneath an embedded discriminator and the embedded discriminator
133
+ // key is in the query, use the embedded discriminator schema
134
+ if (_schematype?.schema?.discriminators != null &&
135
+ discriminatorKey != null &&
136
+ pathLastHalf !== discriminatorKey) {
137
+ const discriminatorVal = get(obj, pathFirstHalf + '.' + discriminatorKey);
138
+ const discriminators = _schematype.schema.discriminators;
139
+ if (typeof discriminatorVal === 'string' && discriminators[discriminatorVal] != null) {
140
+
141
+ schematype = discriminators[discriminatorVal].path(pathLastHalf);
142
+ } else if (discriminatorVal != null &&
143
+ Object.keys(discriminatorVal).length === 1 &&
144
+ Array.isArray(discriminatorVal.$in) &&
145
+ discriminatorVal.$in.length === 1 &&
146
+ typeof discriminatorVal.$in[0] === 'string' &&
147
+ discriminators[discriminatorVal.$in[0]] != null) {
148
+ schematype = discriminators[discriminatorVal.$in[0]].path(pathLastHalf);
149
+ }
150
+ }
151
+ }
152
+ }
153
+
154
+ if (!schematype) {
155
+ // Handle potential embedded array queries
156
+ const split = path.split('.');
157
+ let j = split.length;
158
+ let pathFirstHalf;
159
+ let pathLastHalf;
160
+ let remainingConds;
161
+
162
+ // Find the part of the var path that is a path of the Schema
163
+ while (j--) {
164
+ pathFirstHalf = split.slice(0, j).join('.');
165
+ schematype = schema.path(pathFirstHalf);
166
+ if (schematype) {
167
+ break;
168
+ }
169
+ }
170
+
171
+ // If a substring of the input path resolves to an actual real path...
172
+ if (schematype) {
173
+ // Apply the casting; similar code for $elemMatch in schema/array.js
174
+ if (schematype.schema) {
175
+ remainingConds = {};
176
+ pathLastHalf = split.slice(j).join('.');
177
+ remainingConds[pathLastHalf] = val;
178
+
179
+ const ret = cast(schematype.schema, remainingConds, options, context)[pathLastHalf];
180
+ if (ret === void 0) {
181
+ delete obj[path];
182
+ } else {
183
+ obj[path] = ret;
184
+ }
185
+ } else {
186
+ obj[path] = val;
187
+ }
188
+ continue;
189
+ }
190
+
191
+ if (isObject(val)) {
192
+ // handle geo schemas that use object notation
193
+ // { loc: { long: Number, lat: Number }
194
+
195
+ let geo = '';
196
+ if (val.$near) {
197
+ geo = '$near';
198
+ } else if (val.$nearSphere) {
199
+ geo = '$nearSphere';
200
+ } else if (val.$within) {
201
+ geo = '$within';
202
+ } else if (val.$geoIntersects) {
203
+ geo = '$geoIntersects';
204
+ } else if (val.$geoWithin) {
205
+ geo = '$geoWithin';
206
+ }
207
+
208
+ if (geo) {
209
+ const numbertype = new Types.Number('__QueryCasting__', null, null, schema);
210
+ let value = val[geo];
211
+
212
+ if (val.$maxDistance != null) {
213
+ val.$maxDistance = numbertype.castForQuery(
214
+ null,
215
+ val.$maxDistance,
216
+ context
217
+ );
218
+ }
219
+ if (val.$minDistance != null) {
220
+ val.$minDistance = numbertype.castForQuery(
221
+ null,
222
+ val.$minDistance,
223
+ context
224
+ );
225
+ }
226
+
227
+ if (geo === '$within') {
228
+ const withinType = value.$center
229
+ || value.$centerSphere
230
+ || value.$box
231
+ || value.$polygon;
232
+
233
+ if (!withinType) {
234
+ throw new Error('Bad $within parameter: ' + JSON.stringify(val));
235
+ }
236
+
237
+ value = withinType;
238
+ } else if (geo === '$near' &&
239
+ typeof value.type === 'string' && Array.isArray(value.coordinates)) {
240
+ // geojson; cast the coordinates
241
+ value = value.coordinates;
242
+ } else if ((geo === '$near' || geo === '$nearSphere' || geo === '$geoIntersects') &&
243
+ value.$geometry && typeof value.$geometry.type === 'string' &&
244
+ Array.isArray(value.$geometry.coordinates)) {
245
+ if (value.$maxDistance != null) {
246
+ value.$maxDistance = numbertype.castForQuery(
247
+ null,
248
+ value.$maxDistance,
249
+ context
250
+ );
251
+ }
252
+ if (value.$minDistance != null) {
253
+ value.$minDistance = numbertype.castForQuery(
254
+ null,
255
+ value.$minDistance,
256
+ context
257
+ );
258
+ }
259
+ if (isMongooseObject(value.$geometry)) {
260
+ value.$geometry = value.$geometry.toObject({
261
+ transform: false,
262
+ virtuals: false
263
+ });
264
+ }
265
+ value = value.$geometry.coordinates;
266
+ } else if (geo === '$geoWithin') {
267
+ if (value.$geometry) {
268
+ if (isMongooseObject(value.$geometry)) {
269
+ value.$geometry = value.$geometry.toObject({ virtuals: false });
270
+ }
271
+ const geoWithinType = value.$geometry.type;
272
+ if (ALLOWED_GEOWITHIN_GEOJSON_TYPES.indexOf(geoWithinType) === -1) {
273
+ throw new Error('Invalid geoJSON type for $geoWithin "' +
274
+ geoWithinType + '", must be "Polygon" or "MultiPolygon"');
275
+ }
276
+ value = value.$geometry.coordinates;
277
+ } else {
278
+ value = value.$box || value.$polygon || value.$center ||
279
+ value.$centerSphere;
280
+ if (isMongooseObject(value)) {
281
+ value = value.toObject({ virtuals: false });
282
+ }
283
+ }
284
+ }
285
+
286
+ _cast(value, numbertype, context);
287
+ continue;
288
+ }
289
+ }
290
+
291
+ if (schema.nested[path]) {
292
+ continue;
293
+ }
294
+
295
+ const strict = 'strict' in options ? options.strict : schema.options.strict;
296
+ const strictQuery = getStrictQuery(options, schema._userProvidedOptions, schema.options, context);
297
+ if (options.upsert && strict) {
298
+ if (strict === 'throw') {
299
+ throw new StrictModeError(path);
300
+ }
301
+ throw new StrictModeError(path, 'Path "' + path + '" is not in ' +
302
+ 'schema, strict mode is `true`, and upsert is `true`.');
303
+ } if (strictQuery === 'throw') {
304
+ throw new StrictModeError(path, 'Path "' + path + '" is not in ' +
305
+ 'schema and strictQuery is \'throw\'.');
306
+ } else if (strictQuery) {
307
+ delete obj[path];
308
+ }
309
+ } else if (val == null) {
310
+ continue;
311
+ } else if (utils.isPOJO(val)) {
312
+ any$conditionals = Object.keys(val).some(isOperator);
313
+
314
+ if (!any$conditionals) {
315
+ obj[path] = schematype.castForQuery(
316
+ null,
317
+ val,
318
+ context
319
+ );
320
+ } else {
321
+ const ks = Object.keys(val);
322
+ let $cond;
323
+ let k = ks.length;
324
+
325
+ while (k--) {
326
+ $cond = ks[k];
327
+ nested = val[$cond];
328
+ if ($cond === '$elemMatch') {
329
+ if (nested && schematype?.schema != null) {
330
+ cast(schematype.schema, nested, options, context);
331
+ } else if (nested && schematype?.$isMongooseArray) {
332
+ if (utils.isPOJO(nested) && nested.$not != null) {
333
+ cast(schema, nested, options, context);
334
+ } else {
335
+ val[$cond] = schematype.castForQuery(
336
+ $cond,
337
+ nested,
338
+ context
339
+ );
340
+ }
341
+ }
342
+ } else if ($cond === '$not') {
343
+ if (nested && schematype) {
344
+ _keys = Object.keys(nested);
345
+ if (_keys.length && isOperator(_keys[0])) {
346
+ for (const key in nested) {
347
+ nested[key] = schematype.castForQuery(
348
+ key,
349
+ nested[key],
350
+ context
351
+ );
352
+ }
353
+ } else {
354
+ val[$cond] = schematype.castForQuery(
355
+ $cond,
356
+ nested,
357
+ context
358
+ );
359
+ }
360
+ continue;
361
+ }
362
+ } else {
363
+ val[$cond] = schematype.castForQuery(
364
+ $cond,
365
+ nested,
366
+ context
367
+ );
368
+ }
369
+
370
+ }
371
+ }
372
+ } else if (Array.isArray(val) && ['Buffer', 'Array'].indexOf(schematype.instance) === -1 && !options.sanitizeFilter) {
373
+ const casted = [];
374
+ const valuesArray = val;
375
+
376
+ for (const _val of valuesArray) {
377
+ casted.push(schematype.castForQuery(
378
+ null,
379
+ _val,
380
+ context
381
+ ));
382
+ }
383
+
384
+ obj[path] = { $in: casted };
385
+ } else {
386
+ obj[path] = schematype.castForQuery(
387
+ null,
388
+ val,
389
+ context
390
+ );
391
+ }
392
+ }
393
+ }
394
+
395
+ return obj;
396
+ };
397
+
398
+ function _cast(val, numbertype, context) {
399
+ if (Array.isArray(val)) {
400
+ val.forEach(function(item, i) {
401
+ if (Array.isArray(item) || isObject(item)) {
402
+ return _cast(item, numbertype, context);
403
+ }
404
+ val[i] = numbertype.castForQuery(null, item, context);
405
+ });
406
+ } else {
407
+ const nearKeys = Object.keys(val);
408
+ let nearLen = nearKeys.length;
409
+ while (nearLen--) {
410
+ const nkey = nearKeys[nearLen];
411
+ const item = val[nkey];
412
+ if (Array.isArray(item) || isObject(item)) {
413
+ _cast(item, numbertype, context);
414
+ val[nkey] = item;
415
+ } else {
416
+ val[nkey] = numbertype.castForQuery({ val: item, context: context });
417
+ }
418
+ }
419
+ }
420
+ }
421
+
422
+ function getStrictQuery(queryOptions, schemaUserProvidedOptions, schemaOptions, context) {
423
+ if ('strictQuery' in queryOptions) {
424
+ return queryOptions.strictQuery;
425
+ }
426
+ if ('strictQuery' in schemaUserProvidedOptions) {
427
+ return schemaUserProvidedOptions.strictQuery;
428
+ }
429
+ const mongooseOptions = context?.mongooseCollection?.conn?.base?.options;
430
+ if (mongooseOptions) {
431
+ if ('strictQuery' in mongooseOptions) {
432
+ return mongooseOptions.strictQuery;
433
+ }
434
+ }
435
+ return schemaOptions.strictQuery;
436
+ }