@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,436 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * Module dependencies.
5
+ */
6
+
7
+ const CastError = require('../error/cast');
8
+ const EventEmitter = require('events').EventEmitter;
9
+ const ObjectExpectedError = require('../error/objectExpected');
10
+ const SchemaSubdocumentOptions = require('../options/schemaSubdocumentOptions');
11
+ const SchemaType = require('../schemaType');
12
+ const applyDefaults = require('../helpers/document/applyDefaults');
13
+ const $exists = require('./operators/exists');
14
+ const castToNumber = require('./operators/helpers').castToNumber;
15
+ const createJSONSchemaTypeDefinition = require('../helpers/createJSONSchemaTypeDefinition');
16
+ const discriminator = require('../helpers/model/discriminator');
17
+ const geospatial = require('./operators/geospatial');
18
+ const getConstructor = require('../helpers/discriminator/getConstructor');
19
+ const handleIdOption = require('../helpers/schema/handleIdOption');
20
+ const internalToObjectOptions = require('../options').internalToObjectOptions;
21
+ const isExclusive = require('../helpers/projection/isExclusive');
22
+ const utils = require('../utils');
23
+ const InvalidSchemaOptionError = require('../error/invalidSchemaOption');
24
+
25
+ let SubdocumentType;
26
+
27
+ module.exports = SchemaSubdocument;
28
+
29
+ /**
30
+ * Single nested subdocument SchemaType constructor.
31
+ *
32
+ * @param {Schema} schema
33
+ * @param {String} path
34
+ * @param {Object} options
35
+ * @param {Schema} parentSchema
36
+ * @inherits SchemaType
37
+ * @api public
38
+ */
39
+
40
+ function SchemaSubdocument(schema, path, options, parentSchema) {
41
+ if (schema.options.timeseries) {
42
+ throw new InvalidSchemaOptionError(path, 'timeseries');
43
+ }
44
+ const schemaTypeIdOption = SchemaSubdocument.defaultOptions?._id;
45
+ if (schemaTypeIdOption != null) {
46
+ options = options || {};
47
+ options._id = schemaTypeIdOption;
48
+ }
49
+
50
+ schema = handleIdOption(schema, options);
51
+
52
+ this.Constructor = _createConstructor(schema, null, options);
53
+ this.Constructor.path = path;
54
+ this.Constructor.prototype.$basePath = path;
55
+ this.schema = schema;
56
+ this.$isSingleNested = true;
57
+ this.base = schema.base;
58
+ SchemaType.call(this, path, options, 'Embedded', parentSchema);
59
+ }
60
+
61
+ /*!
62
+ * ignore
63
+ */
64
+
65
+ SchemaSubdocument.prototype = Object.create(SchemaType.prototype);
66
+ SchemaSubdocument.prototype.constructor = SchemaSubdocument;
67
+ SchemaSubdocument.prototype.OptionsConstructor = SchemaSubdocumentOptions;
68
+
69
+ /*!
70
+ * ignore
71
+ */
72
+
73
+ function _createConstructor(schema, baseClass, options) {
74
+ // lazy load
75
+ SubdocumentType || (SubdocumentType = require('../types/subdocument'));
76
+
77
+ const _embedded = function SingleNested(value, path, parent) {
78
+ this.$__parent = parent;
79
+ SubdocumentType.apply(this, arguments);
80
+
81
+ if (parent == null) {
82
+ return;
83
+ }
84
+ this.$session(parent.$session());
85
+ };
86
+
87
+ schema._preCompile();
88
+
89
+ const proto = baseClass?.prototype ?? SubdocumentType.prototype;
90
+ _embedded.prototype = Object.create(proto);
91
+ _embedded.prototype.$__setSchema(schema);
92
+ _embedded.prototype.constructor = _embedded;
93
+ _embedded.prototype.$__schemaTypeOptions = options;
94
+ _embedded.$__required = options?.required;
95
+ _embedded.base = schema.base;
96
+ _embedded.schema = schema;
97
+ _embedded.$isSingleNested = true;
98
+ _embedded.events = new EventEmitter();
99
+ _embedded.prototype.toBSON = function() {
100
+ return this.toObject(internalToObjectOptions);
101
+ };
102
+
103
+ // apply methods
104
+ for (const i in schema.methods) {
105
+ _embedded.prototype[i] = schema.methods[i];
106
+ }
107
+
108
+ // apply statics
109
+ for (const i in schema.statics) {
110
+ _embedded[i] = schema.statics[i];
111
+ }
112
+
113
+ for (const i in EventEmitter.prototype) {
114
+ _embedded[i] = EventEmitter.prototype[i];
115
+ }
116
+
117
+ return _embedded;
118
+ }
119
+
120
+ /*!
121
+ * ignore
122
+ */
123
+ const $conditionalHandlers = { ...SchemaType.prototype.$conditionalHandlers };
124
+
125
+ /**
126
+ * Special case for when users use a common location schema to represent
127
+ * locations for use with $geoWithin.
128
+ * https://www.mongodb.com/docs/manual/reference/operator/query/geoWithin/
129
+ *
130
+ * @param {Object} val
131
+ * @api private
132
+ */
133
+
134
+ $conditionalHandlers.$geoWithin = function handle$geoWithin(val, context) {
135
+ return { $geometry: this.castForQuery(null, val.$geometry, context) };
136
+ };
137
+
138
+ /*!
139
+ * ignore
140
+ */
141
+
142
+ $conditionalHandlers.$near =
143
+ $conditionalHandlers.$nearSphere = geospatial.cast$near;
144
+
145
+ $conditionalHandlers.$within =
146
+ $conditionalHandlers.$geoWithin = geospatial.cast$within;
147
+
148
+ $conditionalHandlers.$geoIntersects =
149
+ geospatial.cast$geoIntersects;
150
+
151
+ $conditionalHandlers.$minDistance = castToNumber;
152
+ $conditionalHandlers.$maxDistance = castToNumber;
153
+
154
+ $conditionalHandlers.$exists = $exists;
155
+
156
+ /**
157
+ * Contains the handlers for different query operators for this schema type.
158
+ * For example, `$conditionalHandlers.$exists` is the function Mongoose calls to cast `$exists` filter operators.
159
+ *
160
+ * @property $conditionalHandlers
161
+ * @memberOf SchemaSubdocument
162
+ * @instance
163
+ * @api public
164
+ */
165
+
166
+ Object.defineProperty(SchemaSubdocument.prototype, '$conditionalHandlers', {
167
+ enumerable: false,
168
+ value: $conditionalHandlers
169
+ });
170
+
171
+ /**
172
+ * Casts contents
173
+ *
174
+ * @param {Object} value
175
+ * @api private
176
+ */
177
+
178
+ SchemaSubdocument.prototype.cast = function(val, doc, init, priorVal, options) {
179
+ if (val?.$isSingleNested && val.parent === doc) {
180
+ return val;
181
+ }
182
+
183
+ if (!init && val != null && (typeof val !== 'object' || Array.isArray(val))) {
184
+ throw new ObjectExpectedError(this.path, val);
185
+ }
186
+
187
+ const discriminatorKeyPath = this.schema.path(this.schema.options.discriminatorKey);
188
+ const defaultDiscriminatorValue = discriminatorKeyPath == null ? null : discriminatorKeyPath.getDefault(doc);
189
+ const Constructor = getConstructor(this.Constructor, val, defaultDiscriminatorValue);
190
+
191
+ let subdoc;
192
+
193
+ // Only pull relevant selected paths and pull out the base path
194
+ const parentSelected = doc?.$__?.selected;
195
+ const path = this.path;
196
+ const selected = parentSelected == null ? null : Object.keys(parentSelected).reduce((obj, key) => {
197
+ if (key.startsWith(path + '.')) {
198
+ obj = obj || {};
199
+ obj[key.substring(path.length + 1)] = parentSelected[key];
200
+ }
201
+ return obj;
202
+ }, null);
203
+ if (init) {
204
+ subdoc = new Constructor(void 0, selected, doc, { defaults: false });
205
+ delete subdoc.$__.defaults;
206
+ // Don't pass `path` to $init - it's only for the subdocument itself, not its fields.
207
+ // For change tracking, subdocuments use relative paths internally.
208
+ // Here, `options.path` contains the absolute path and is only used by the subdocument constructor, not by $init.
209
+ if (options.path != null) {
210
+ options = { ...options };
211
+ delete options.path;
212
+ }
213
+ subdoc.$init(val, options);
214
+ const exclude = isExclusive(selected);
215
+ applyDefaults(subdoc, selected, exclude);
216
+ } else {
217
+ options = Object.assign({}, options, { priorDoc: priorVal });
218
+ if (utils.hasOwnKeys(val) === false) {
219
+ return new Constructor({}, selected, doc, options);
220
+ }
221
+
222
+ return new Constructor(val, selected, doc, options);
223
+ }
224
+
225
+ return subdoc;
226
+ };
227
+
228
+ /**
229
+ * Casts contents for query
230
+ *
231
+ * @param {string} [$conditional] optional query operator (like `$eq` or `$in`)
232
+ * @param {any} value
233
+ * @api private
234
+ */
235
+
236
+ SchemaSubdocument.prototype.castForQuery = function($conditional, val, context, options) {
237
+ let handler;
238
+ if ($conditional != null) {
239
+ handler = this.$conditionalHandlers[$conditional];
240
+ if (!handler) {
241
+ throw new Error('Can\'t use ' + $conditional);
242
+ }
243
+ return handler.call(this, val);
244
+ }
245
+ if (val == null) {
246
+ return val;
247
+ }
248
+
249
+ const Constructor = getConstructor(this.Constructor, val);
250
+ if (val instanceof Constructor) {
251
+ return val;
252
+ }
253
+
254
+ if (this.options.runSetters) {
255
+ val = this._applySetters(val, context);
256
+ }
257
+
258
+ const overrideStrict = options?.strict ?? void 0;
259
+
260
+ try {
261
+ val = new Constructor(val, overrideStrict);
262
+ } catch (error) {
263
+ // Make sure we always wrap in a CastError (gh-6803)
264
+ if (!(error instanceof CastError)) {
265
+ throw new CastError('Embedded', val, this.path, error, this);
266
+ }
267
+ throw error;
268
+ }
269
+ return val;
270
+ };
271
+
272
+ /**
273
+ * Async validation on this single nested doc.
274
+ *
275
+ * @api public
276
+ */
277
+
278
+ SchemaSubdocument.prototype.doValidate = async function doValidate(value, scope, options) {
279
+ const Constructor = getConstructor(this.Constructor, value);
280
+
281
+ if (value && !(value instanceof Constructor)) {
282
+ value = new Constructor(value, null, scope?.$__ != null ? scope : null);
283
+ }
284
+
285
+ if (options?.skipSchemaValidators) {
286
+ if (!value) {
287
+ return;
288
+ }
289
+ return value.validate();
290
+ }
291
+
292
+ await SchemaType.prototype.doValidate.call(this, value, scope, options);
293
+ if (value != null) {
294
+ await value.validate();
295
+ }
296
+ };
297
+
298
+ /**
299
+ * Synchronously validate this single nested doc
300
+ *
301
+ * @api private
302
+ */
303
+
304
+ SchemaSubdocument.prototype.doValidateSync = function(value, scope, options) {
305
+ if (!options?.skipSchemaValidators) {
306
+ const schemaTypeError = SchemaType.prototype.doValidateSync.call(this, value, scope);
307
+ if (schemaTypeError) {
308
+ return schemaTypeError;
309
+ }
310
+ }
311
+ if (!value) {
312
+ return;
313
+ }
314
+ return value.validateSync();
315
+ };
316
+
317
+ /**
318
+ * Adds a discriminator to this single nested subdocument.
319
+ *
320
+ * #### Example:
321
+ *
322
+ * const shapeSchema = Schema({ name: String }, { discriminatorKey: 'kind' });
323
+ * const schema = Schema({ shape: shapeSchema });
324
+ *
325
+ * const singleNestedPath = parentSchema.path('shape');
326
+ * singleNestedPath.discriminator('Circle', Schema({ radius: Number }));
327
+ *
328
+ * @param {String} name
329
+ * @param {Schema} schema fields to add to the schema for instances of this sub-class
330
+ * @param {Object|string} [options] If string, same as `options.value`.
331
+ * @param {String} [options.value] the string stored in the `discriminatorKey` property. If not specified, Mongoose uses the `name` parameter.
332
+ * @param {Boolean} [options.clone=true] By default, `discriminator()` clones the given `schema`. Set to `false` to skip cloning.
333
+ * @return {Function} the constructor Mongoose will use for creating instances of this discriminator model
334
+ * @see discriminators https://mongoosejs.com/docs/discriminators.html
335
+ * @api public
336
+ */
337
+
338
+ SchemaSubdocument.prototype.discriminator = function(name, schema, options) {
339
+ options = options || {};
340
+ const value = utils.isPOJO(options) ? options.value : options;
341
+ const clone = typeof options.clone === 'boolean'
342
+ ? options.clone
343
+ : true;
344
+
345
+ if (schema.instanceOfSchema && clone) {
346
+ schema = schema.clone();
347
+ }
348
+
349
+ schema = discriminator(this.Constructor, name, schema, value, null, null, options.overwriteExisting);
350
+
351
+ this.Constructor.discriminators[name] = _createConstructor(schema, this.Constructor);
352
+
353
+ return this.Constructor.discriminators[name];
354
+ };
355
+
356
+ /*!
357
+ * ignore
358
+ */
359
+
360
+ SchemaSubdocument.defaultOptions = {};
361
+
362
+ /**
363
+ * Sets a default option for all Subdocument instances.
364
+ *
365
+ * #### Example:
366
+ *
367
+ * // Make all subdocuments required by default.
368
+ * mongoose.Schema.Types.Subdocument.set('required', true);
369
+ *
370
+ * @param {String} option The option you'd like to set the value for
371
+ * @param {Any} value value for option
372
+ * @return {void}
373
+ * @function set
374
+ * @static
375
+ * @api public
376
+ */
377
+
378
+ SchemaSubdocument.set = SchemaType.set;
379
+
380
+ SchemaSubdocument.setters = [];
381
+
382
+ /**
383
+ * Attaches a getter for all Subdocument instances
384
+ *
385
+ * @param {Function} getter
386
+ * @return {this}
387
+ * @function get
388
+ * @static
389
+ * @api public
390
+ */
391
+
392
+ SchemaSubdocument.get = SchemaType.get;
393
+
394
+ /*!
395
+ * ignore
396
+ */
397
+
398
+ SchemaSubdocument.prototype.toJSON = function toJSON() {
399
+ return { path: this.path, options: this.options };
400
+ };
401
+
402
+ /*!
403
+ * ignore
404
+ */
405
+
406
+ SchemaSubdocument.prototype.clone = function() {
407
+ const schematype = new this.constructor(
408
+ this.schema,
409
+ this.path,
410
+ { ...this.options, _skipApplyDiscriminators: true },
411
+ this.parentSchema
412
+ );
413
+ schematype.validators = this.validators.slice();
414
+ if (this.requiredValidator !== undefined) {
415
+ schematype.requiredValidator = this.requiredValidator;
416
+ }
417
+ schematype.Constructor.discriminators = Object.assign({}, this.Constructor.discriminators);
418
+ schematype._appliedDiscriminators = this._appliedDiscriminators;
419
+ return schematype;
420
+ };
421
+
422
+ /**
423
+ * Returns this schema type's representation in a JSON schema.
424
+ *
425
+ * @param [options]
426
+ * @param [options.useBsonType=false] If true, return a representation with `bsonType` for use with MongoDB's `$jsonSchema`.
427
+ * @returns {Object} JSON schema properties
428
+ */
429
+
430
+ SchemaSubdocument.prototype.toJSONSchema = function toJSONSchema(options) {
431
+ const isRequired = this.options.required && typeof this.options.required !== 'function';
432
+ return {
433
+ ...this.schema.toJSONSchema(options),
434
+ ...createJSONSchemaTypeDefinition('object', 'object', options?.useBsonType, isRequired)
435
+ };
436
+ };
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ exports.schemaMixedSymbol = Symbol.for('mongoose:schema_mixed');
4
+
5
+ exports.builtInMiddleware = Symbol.for('mongoose:built-in-middleware');
@@ -0,0 +1,113 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * ignore
5
+ */
6
+
7
+ const SchemaUnionOptions = require('../options/schemaUnionOptions');
8
+ const SchemaType = require('../schemaType');
9
+
10
+ const firstValueSymbol = Symbol('firstValue');
11
+
12
+ /*!
13
+ * ignore
14
+ */
15
+
16
+ class Union extends SchemaType {
17
+ /**
18
+ * Create a Union schema type.
19
+ *
20
+ * @param {String} key the path in the schema for this schema type
21
+ * @param {Object} options SchemaType-specific options (must have 'of' as array)
22
+ * @param {Object} schemaOptions additional options from the schema this schematype belongs to
23
+ * @param {Schema} parentSchema the schema this schematype belongs to
24
+ */
25
+ constructor(key, options, schemaOptions, parentSchema) {
26
+ super(key, options, 'Union', parentSchema);
27
+ if (!Array.isArray(options?.of) || options.of.length === 0) {
28
+ throw new Error('Union schema type requires an array of types');
29
+ }
30
+ this.schemaTypes = options.of.map(obj => parentSchema.interpretAsType(key, obj, schemaOptions));
31
+ }
32
+
33
+ cast(val, doc, init, prev, options) {
34
+ let firstValue = firstValueSymbol;
35
+ let lastError;
36
+ // Loop through each schema type in the union. If one of the schematypes returns a value that is `=== val`, then
37
+ // use `val`. Otherwise, if one of the schematypes casted successfully, use the first successfully casted value.
38
+ // Finally, if none of the schematypes casted successfully, throw the error from the last schema type in the union.
39
+ // The `=== val` check is a workaround to ensure that the original value is returned if it matches one of the schema types,
40
+ // avoiding cases like where numbers are casted to strings or dates even if the schema type is a number.
41
+ for (let i = 0; i < this.schemaTypes.length; ++i) {
42
+ try {
43
+ const casted = this.schemaTypes[i].cast(val, doc, init, prev, options);
44
+ if (casted === val) {
45
+ return casted;
46
+ }
47
+ if (firstValue === firstValueSymbol) {
48
+ firstValue = casted;
49
+ }
50
+ } catch (error) {
51
+ lastError = error;
52
+ }
53
+ }
54
+ if (firstValue !== firstValueSymbol) {
55
+ return firstValue;
56
+ }
57
+ throw lastError;
58
+ }
59
+
60
+ // Setters also need to be aware of casting - we need to apply the setters of the entry in the union we choose.
61
+ applySetters(val, doc, init, prev, options) {
62
+ let firstValue = firstValueSymbol;
63
+ let lastError;
64
+ // Loop through each schema type in the union. If one of the schematypes returns a value that is `=== val`, then
65
+ // use `val`. Otherwise, if one of the schematypes casted successfully, use the first successfully casted value.
66
+ // Finally, if none of the schematypes casted successfully, throw the error from the last schema type in the union.
67
+ // The `=== val` check is a workaround to ensure that the original value is returned if it matches one of the schema types,
68
+ // avoiding cases like where numbers are casted to strings or dates even if the schema type is a number.
69
+ for (let i = 0; i < this.schemaTypes.length; ++i) {
70
+ try {
71
+ let castedVal = this.schemaTypes[i]._applySetters(val, doc, init, prev, options);
72
+ if (castedVal == null) {
73
+ castedVal = this.schemaTypes[i]._castNullish(castedVal);
74
+ } else {
75
+ castedVal = this.schemaTypes[i].cast(castedVal, doc, init, prev, options);
76
+ }
77
+ if (castedVal === val) {
78
+ return castedVal;
79
+ }
80
+ if (firstValue === firstValueSymbol) {
81
+ firstValue = castedVal;
82
+ }
83
+ } catch (error) {
84
+ lastError = error;
85
+ }
86
+ }
87
+ if (firstValue !== firstValueSymbol) {
88
+ return firstValue;
89
+ }
90
+ throw lastError;
91
+ }
92
+
93
+ clone() {
94
+ const schematype = super.clone();
95
+
96
+ schematype.schemaTypes = this.schemaTypes.map(schemaType => schemaType.clone());
97
+ return schematype;
98
+ }
99
+ }
100
+
101
+ /**
102
+ * This schema type's name, to defend against minifiers that mangle
103
+ * function names.
104
+ *
105
+ * @api public
106
+ */
107
+ Union.schemaName = 'Union';
108
+
109
+ Union.defaultOptions = {};
110
+
111
+ Union.prototype.OptionsConstructor = SchemaUnionOptions;
112
+
113
+ module.exports = Union;