@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,66 @@
1
+ 'use strict';
2
+
3
+ const SchemaTypeOptions = require('./schemaTypeOptions');
4
+
5
+ /**
6
+ * The options defined on a single nested schematype.
7
+ *
8
+ * #### Example:
9
+ *
10
+ * const schema = Schema({ child: Schema({ name: String }) });
11
+ * schema.path('child').options; // SchemaSubdocumentOptions instance
12
+ *
13
+ * @api public
14
+ * @inherits SchemaTypeOptions
15
+ * @constructor SchemaSubdocumentOptions
16
+ */
17
+
18
+ class SchemaSubdocumentOptions extends SchemaTypeOptions {}
19
+
20
+ const opts = require('./propertyOptions');
21
+
22
+ /**
23
+ * If set, overwrites the child schema's `_id` option.
24
+ *
25
+ * #### Example:
26
+ *
27
+ * const childSchema = Schema({ name: String });
28
+ * const parentSchema = Schema({
29
+ * child: { type: childSchema, _id: false }
30
+ * });
31
+ * parentSchema.path('child').schema.options._id; // false
32
+ *
33
+ * @api public
34
+ * @property _id
35
+ * @memberOf SchemaSubdocumentOptions
36
+ * @type {Function|string}
37
+ * @instance
38
+ */
39
+
40
+ Object.defineProperty(SchemaSubdocumentOptions.prototype, '_id', opts);
41
+
42
+ /**
43
+ * If set, overwrites the child schema's `minimize` option. In addition, configures whether the entire
44
+ * subdocument can be minimized out.
45
+ *
46
+ * #### Example:
47
+ *
48
+ * const childSchema = Schema({ name: String });
49
+ * const parentSchema = Schema({
50
+ * child: { type: childSchema, minimize: false }
51
+ * });
52
+ * const ParentModel = mongoose.model('Parent', parentSchema);
53
+ * // Saves `{ child: {} }` to the db. Without `minimize: false`, Mongoose would remove the empty
54
+ * // object and save `{}` to the db.
55
+ * await ParentModel.create({ child: {} });
56
+ *
57
+ * @api public
58
+ * @property minimize
59
+ * @memberOf SchemaSubdocumentOptions
60
+ * @type {Function|string}
61
+ * @instance
62
+ */
63
+
64
+ Object.defineProperty(SchemaSubdocumentOptions.prototype, 'minimize', opts);
65
+
66
+ module.exports = SchemaSubdocumentOptions;
@@ -0,0 +1,244 @@
1
+ 'use strict';
2
+
3
+ const clone = require('../helpers/clone');
4
+
5
+ /**
6
+ * The options defined on a schematype.
7
+ *
8
+ * #### Example:
9
+ *
10
+ * const schema = new Schema({ name: String });
11
+ * schema.path('name').options instanceof mongoose.SchemaTypeOptions; // true
12
+ *
13
+ * @api public
14
+ * @constructor SchemaTypeOptions
15
+ */
16
+
17
+ class SchemaTypeOptions {
18
+ constructor(obj) {
19
+ if (obj == null) {
20
+ return this;
21
+ }
22
+ Object.assign(this, clone(obj));
23
+ }
24
+ }
25
+
26
+ const opts = require('./propertyOptions');
27
+
28
+ /**
29
+ * The type to cast this path to.
30
+ *
31
+ * @api public
32
+ * @property type
33
+ * @memberOf SchemaTypeOptions
34
+ * @type {Function|String|Object}
35
+ * @instance
36
+ */
37
+
38
+ Object.defineProperty(SchemaTypeOptions.prototype, 'type', opts);
39
+
40
+ /**
41
+ * Function or object describing how to validate this schematype.
42
+ *
43
+ * @api public
44
+ * @property validate
45
+ * @memberOf SchemaTypeOptions
46
+ * @type {Function|Object}
47
+ * @instance
48
+ */
49
+
50
+ Object.defineProperty(SchemaTypeOptions.prototype, 'validate', opts);
51
+
52
+ /**
53
+ * Allows overriding casting logic for this individual path. If a string, the
54
+ * given string overwrites Mongoose's default cast error message.
55
+ *
56
+ * #### Example:
57
+ *
58
+ * const schema = new Schema({
59
+ * num: {
60
+ * type: Number,
61
+ * cast: '{VALUE} is not a valid number'
62
+ * }
63
+ * });
64
+ *
65
+ * // Throws 'CastError: "bad" is not a valid number'
66
+ * schema.path('num').cast('bad');
67
+ *
68
+ * const Model = mongoose.model('Test', schema);
69
+ * const doc = new Model({ num: 'fail' });
70
+ * const err = doc.validateSync();
71
+ *
72
+ * err.errors['num']; // 'CastError: "fail" is not a valid number'
73
+ *
74
+ * @api public
75
+ * @property cast
76
+ * @memberOf SchemaTypeOptions
77
+ * @type {String}
78
+ * @instance
79
+ */
80
+
81
+ Object.defineProperty(SchemaTypeOptions.prototype, 'cast', opts);
82
+
83
+ /**
84
+ * If true, attach a required validator to this path, which ensures this path
85
+ * cannot be set to a nullish value. If a function, Mongoose calls the
86
+ * function and only checks for nullish values if the function returns a truthy value.
87
+ *
88
+ * @api public
89
+ * @property required
90
+ * @memberOf SchemaTypeOptions
91
+ * @type {Function|Boolean}
92
+ * @instance
93
+ */
94
+
95
+ Object.defineProperty(SchemaTypeOptions.prototype, 'required', opts);
96
+
97
+ /**
98
+ * The default value for this path. If a function, Mongoose executes the function
99
+ * and uses the return value as the default.
100
+ *
101
+ * @api public
102
+ * @property default
103
+ * @memberOf SchemaTypeOptions
104
+ * @type {Function|Any}
105
+ * @instance
106
+ */
107
+
108
+ Object.defineProperty(SchemaTypeOptions.prototype, 'default', opts);
109
+
110
+ /**
111
+ * The model that `populate()` should use if populating this path.
112
+ *
113
+ * @api public
114
+ * @property ref
115
+ * @memberOf SchemaTypeOptions
116
+ * @type {Function|String}
117
+ * @instance
118
+ */
119
+
120
+ Object.defineProperty(SchemaTypeOptions.prototype, 'ref', opts);
121
+
122
+ /**
123
+ * The path in the document that `populate()` should use to find the model
124
+ * to use.
125
+ *
126
+ * @api public
127
+ * @property ref
128
+ * @memberOf SchemaTypeOptions
129
+ * @type {Function|String}
130
+ * @instance
131
+ */
132
+
133
+ Object.defineProperty(SchemaTypeOptions.prototype, 'refPath', opts);
134
+
135
+ /**
136
+ * Whether to include or exclude this path by default when loading documents
137
+ * using `find()`, `findOne()`, etc.
138
+ *
139
+ * @api public
140
+ * @property select
141
+ * @memberOf SchemaTypeOptions
142
+ * @type {Boolean|Number}
143
+ * @instance
144
+ */
145
+
146
+ Object.defineProperty(SchemaTypeOptions.prototype, 'select', opts);
147
+
148
+ /**
149
+ * If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose will
150
+ * build an index on this path when the model is compiled.
151
+ *
152
+ * @api public
153
+ * @property index
154
+ * @memberOf SchemaTypeOptions
155
+ * @type {Boolean|Number|Object}
156
+ * @instance
157
+ */
158
+
159
+ Object.defineProperty(SchemaTypeOptions.prototype, 'index', opts);
160
+
161
+ /**
162
+ * If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose
163
+ * will build a unique index on this path when the
164
+ * model is compiled. [The `unique` option is **not** a validator](https://mongoosejs.com/docs/validation.html#the-unique-option-is-not-a-validator).
165
+ *
166
+ * @api public
167
+ * @property unique
168
+ * @memberOf SchemaTypeOptions
169
+ * @type {Boolean|Number}
170
+ * @instance
171
+ */
172
+
173
+ Object.defineProperty(SchemaTypeOptions.prototype, 'unique', opts);
174
+
175
+ /**
176
+ * If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose will
177
+ * disallow changes to this path once the document
178
+ * is saved to the database for the first time. Read more about [immutability in Mongoose here](https://thecodebarbarian.com/whats-new-in-mongoose-5-6-immutable-properties.html).
179
+ *
180
+ * @api public
181
+ * @property immutable
182
+ * @memberOf SchemaTypeOptions
183
+ * @type {Function|Boolean}
184
+ * @instance
185
+ */
186
+
187
+ Object.defineProperty(SchemaTypeOptions.prototype, 'immutable', opts);
188
+
189
+ /**
190
+ * If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose will
191
+ * build a sparse index on this path.
192
+ *
193
+ * @api public
194
+ * @property sparse
195
+ * @memberOf SchemaTypeOptions
196
+ * @type {Boolean|Number}
197
+ * @instance
198
+ */
199
+
200
+ Object.defineProperty(SchemaTypeOptions.prototype, 'sparse', opts);
201
+
202
+ /**
203
+ * If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose
204
+ * will build a text index on this path.
205
+ *
206
+ * @api public
207
+ * @property text
208
+ * @memberOf SchemaTypeOptions
209
+ * @type {Boolean|Number|Object}
210
+ * @instance
211
+ */
212
+
213
+ Object.defineProperty(SchemaTypeOptions.prototype, 'text', opts);
214
+
215
+ /**
216
+ * Define a transform function for this individual schema type.
217
+ * Only called when calling `toJSON()` or `toObject()`.
218
+ *
219
+ * #### Example:
220
+ *
221
+ * const schema = Schema({
222
+ * myDate: {
223
+ * type: Date,
224
+ * transform: v => v.getFullYear()
225
+ * }
226
+ * });
227
+ * const Model = mongoose.model('Test', schema);
228
+ *
229
+ * const doc = new Model({ myDate: new Date('2019/06/01') });
230
+ * doc.myDate instanceof Date; // true
231
+ *
232
+ * const res = doc.toObject({ transform: true });
233
+ * res.myDate; // 2019
234
+ *
235
+ * @api public
236
+ * @property transform
237
+ * @memberOf SchemaTypeOptions
238
+ * @type {Function}
239
+ * @instance
240
+ */
241
+
242
+ Object.defineProperty(SchemaTypeOptions.prototype, 'transform', opts);
243
+
244
+ module.exports = SchemaTypeOptions;
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ const SchemaTypeOptions = require('./schemaTypeOptions');
4
+
5
+ /**
6
+ * The options defined on a Union schematype.
7
+ *
8
+ * @api public
9
+ * @inherits SchemaTypeOptions
10
+ * @constructor SchemaUnionOptions
11
+ */
12
+
13
+ class SchemaUnionOptions extends SchemaTypeOptions {}
14
+
15
+ const opts = require('./propertyOptions');
16
+
17
+ /**
18
+ * If set, specifies the types that this union can take. Mongoose will cast
19
+ * the value to one of the given types.
20
+ *
21
+ * If not set, Mongoose will not cast the value to any specific type.
22
+ *
23
+ * @api public
24
+ * @property of
25
+ * @memberOf SchemaUnionOptions
26
+ * @type {Function|Function[]|string|string[]}
27
+ * @instance
28
+ */
29
+
30
+ Object.defineProperty(SchemaUnionOptions.prototype, 'of', opts);
31
+
32
+ module.exports = SchemaUnionOptions;
@@ -0,0 +1,164 @@
1
+ 'use strict';
2
+
3
+ const opts = require('./propertyOptions');
4
+
5
+ class VirtualOptions {
6
+ constructor(obj) {
7
+ Object.assign(this, obj);
8
+
9
+ if (obj?.options != null) {
10
+ this.options = Object.assign({}, obj.options);
11
+ }
12
+ }
13
+ }
14
+
15
+ /**
16
+ * Marks this virtual as a populate virtual, and specifies the model to
17
+ * use for populate.
18
+ *
19
+ * @api public
20
+ * @property ref
21
+ * @memberOf VirtualOptions
22
+ * @type {String|Model|Function}
23
+ * @instance
24
+ */
25
+
26
+ Object.defineProperty(VirtualOptions.prototype, 'ref', opts);
27
+
28
+ /**
29
+ * Marks this virtual as a populate virtual, and specifies the path that
30
+ * contains the name of the model to populate
31
+ *
32
+ * @api public
33
+ * @property refPath
34
+ * @memberOf VirtualOptions
35
+ * @type {String|Function}
36
+ * @instance
37
+ */
38
+
39
+ Object.defineProperty(VirtualOptions.prototype, 'refPath', opts);
40
+
41
+ /**
42
+ * The name of the property in the local model to match to `foreignField`
43
+ * in the foreign model.
44
+ *
45
+ * @api public
46
+ * @property localField
47
+ * @memberOf VirtualOptions
48
+ * @type {String|Function}
49
+ * @instance
50
+ */
51
+
52
+ Object.defineProperty(VirtualOptions.prototype, 'localField', opts);
53
+
54
+ /**
55
+ * The name of the property in the foreign model to match to `localField`
56
+ * in the local model.
57
+ *
58
+ * @api public
59
+ * @property foreignField
60
+ * @memberOf VirtualOptions
61
+ * @type {String|Function}
62
+ * @instance
63
+ */
64
+
65
+ Object.defineProperty(VirtualOptions.prototype, 'foreignField', opts);
66
+
67
+ /**
68
+ * Whether to populate this virtual as a single document (true) or an
69
+ * array of documents (false).
70
+ *
71
+ * @api public
72
+ * @property justOne
73
+ * @memberOf VirtualOptions
74
+ * @type {Boolean}
75
+ * @instance
76
+ */
77
+
78
+ Object.defineProperty(VirtualOptions.prototype, 'justOne', opts);
79
+
80
+ /**
81
+ * If true, populate just the number of documents where `localField`
82
+ * matches `foreignField`, as opposed to the documents themselves.
83
+ *
84
+ * If `count` is set, it overrides `justOne`.
85
+ *
86
+ * @api public
87
+ * @property count
88
+ * @memberOf VirtualOptions
89
+ * @type {Boolean}
90
+ * @instance
91
+ */
92
+
93
+ Object.defineProperty(VirtualOptions.prototype, 'count', opts);
94
+
95
+ /**
96
+ * Add an additional filter to populate, in addition to `localField`
97
+ * matches `foreignField`.
98
+ *
99
+ * @api public
100
+ * @property match
101
+ * @memberOf VirtualOptions
102
+ * @type {Object|Function}
103
+ * @instance
104
+ */
105
+
106
+ Object.defineProperty(VirtualOptions.prototype, 'match', opts);
107
+
108
+ /**
109
+ * Additional options to pass to the query used to `populate()`:
110
+ *
111
+ * - `sort`
112
+ * - `skip`
113
+ * - `limit`
114
+ *
115
+ * @api public
116
+ * @property options
117
+ * @memberOf VirtualOptions
118
+ * @type {Object}
119
+ * @instance
120
+ */
121
+
122
+ Object.defineProperty(VirtualOptions.prototype, 'options', opts);
123
+
124
+ /**
125
+ * If true, add a `skip` to the query used to `populate()`.
126
+ *
127
+ * @api public
128
+ * @property skip
129
+ * @memberOf VirtualOptions
130
+ * @type {Number}
131
+ * @instance
132
+ */
133
+
134
+ Object.defineProperty(VirtualOptions.prototype, 'skip', opts);
135
+
136
+ /**
137
+ * If true, add a `limit` to the query used to `populate()`.
138
+ *
139
+ * @api public
140
+ * @property limit
141
+ * @memberOf VirtualOptions
142
+ * @type {Number}
143
+ * @instance
144
+ */
145
+
146
+ Object.defineProperty(VirtualOptions.prototype, 'limit', opts);
147
+
148
+ /**
149
+ * The `limit` option for `populate()` has [some unfortunate edge cases](https://mongoosejs.com/docs/populate.html#query-conditions)
150
+ * when working with multiple documents, like `.find().populate()`. The
151
+ * `perDocumentLimit` option makes `populate()` execute a separate query
152
+ * for each document returned from `find()` to ensure each document
153
+ * gets up to `perDocumentLimit` populated docs if possible.
154
+ *
155
+ * @api public
156
+ * @property perDocumentLimit
157
+ * @memberOf VirtualOptions
158
+ * @type {Number}
159
+ * @instance
160
+ */
161
+
162
+ Object.defineProperty(VirtualOptions.prototype, 'perDocumentLimit', opts);
163
+
164
+ module.exports = VirtualOptions;
package/lib/options.js ADDED
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * ignore
5
+ */
6
+
7
+ exports.internalToObjectOptions = {
8
+ transform: false,
9
+ virtuals: false,
10
+ getters: false,
11
+ _skipDepopulateTopLevel: true,
12
+ depopulate: true,
13
+ flattenDecimals: false,
14
+ useProjection: false,
15
+ versionKey: true,
16
+ flattenObjectIds: false
17
+ };
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ exports.saveSubdocs = require('./saveSubdocs');
4
+ exports.sharding = require('./sharding');
5
+ exports.trackTransaction = require('./trackTransaction');
6
+ exports.validateBeforeSave = require('./validateBeforeSave');
@@ -0,0 +1,76 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * ignore
5
+ */
6
+
7
+ module.exports = function saveSubdocs(schema) {
8
+ const unshift = true;
9
+ schema.s.hooks.pre('save', false, async function saveSubdocsPreSave() {
10
+ if (this.$isSubdocument) {
11
+ return;
12
+ }
13
+
14
+ const subdocs = this.$getAllSubdocs({ useCache: true });
15
+
16
+ if (!subdocs.length) {
17
+ return;
18
+ }
19
+
20
+ const options = this.$__.saveOptions;
21
+ await Promise.all(subdocs.map(subdoc => subdoc._execDocumentPreHooks('save', options)));
22
+
23
+ // Invalidate subdocs cache because subdoc pre hooks can add new subdocuments
24
+ if (this.$__.saveOptions) {
25
+ this.$__.saveOptions.__subdocs = null;
26
+ }
27
+ }, null, unshift);
28
+
29
+ schema.s.hooks.pre('save', async function saveSubdocsPreDeleteOne() {
30
+ const removedSubdocs = this.$__.removedSubdocs;
31
+ if (!removedSubdocs?.length) {
32
+ return;
33
+ }
34
+
35
+ const promises = [];
36
+ for (const subdoc of removedSubdocs) {
37
+ promises.push(subdoc._execDocumentPreHooks('deleteOne'));
38
+ }
39
+
40
+ await Promise.all(promises);
41
+ });
42
+
43
+ schema.s.hooks.post('save', async function saveSubdocsPostDeleteOne() {
44
+ const removedSubdocs = this.$__.removedSubdocs;
45
+ if (!removedSubdocs?.length) {
46
+ return;
47
+ }
48
+
49
+ const promises = [];
50
+ for (const subdoc of removedSubdocs) {
51
+ promises.push(subdoc._execDocumentPostHooks('deleteOne'));
52
+ }
53
+
54
+ this.$__.removedSubdocs = null;
55
+ await Promise.all(promises);
56
+ });
57
+
58
+ schema.s.hooks.post('save', async function saveSubdocsPostSave() {
59
+ if (this.$isSubdocument) {
60
+ return;
61
+ }
62
+
63
+ const subdocs = this.$getAllSubdocs({ useCache: true });
64
+
65
+ if (!subdocs.length) {
66
+ return;
67
+ }
68
+
69
+ const promises = [];
70
+ for (const subdoc of subdocs) {
71
+ promises.push(subdoc._execDocumentPostHooks('save'));
72
+ }
73
+
74
+ await Promise.all(promises);
75
+ }, null, unshift);
76
+ };
@@ -0,0 +1,84 @@
1
+ 'use strict';
2
+
3
+ const objectIdSymbol = require('../helpers/symbols').objectIdSymbol;
4
+ const utils = require('../utils');
5
+
6
+ /*!
7
+ * ignore
8
+ */
9
+
10
+ module.exports = function shardingPlugin(schema) {
11
+ schema.post('init', function shardingPluginPostInit() {
12
+ storeShard.call(this);
13
+ return this;
14
+ });
15
+ schema.pre('save', function shardingPluginPreSave() {
16
+ applyWhere.call(this);
17
+ });
18
+ schema.pre('deleteOne', { document: true, query: false }, function shardingPluginPreDeleteOne() {
19
+ applyWhere.call(this);
20
+ });
21
+ schema.pre('updateOne', { document: true, query: false }, function shardingPluginPreUpdateOne() {
22
+ applyWhere.call(this);
23
+ });
24
+ schema.post('save', function shardingPluginPostSave() {
25
+ storeShard.call(this);
26
+ });
27
+ };
28
+
29
+ /*!
30
+ * ignore
31
+ */
32
+
33
+ function applyWhere() {
34
+ let paths;
35
+ let len;
36
+
37
+ if (this.$__.shardval) {
38
+ paths = Object.keys(this.$__.shardval);
39
+ len = paths.length;
40
+
41
+ this.$where = this.$where || {};
42
+ for (let i = 0; i < len; ++i) {
43
+ this.$where[paths[i]] = this.$__.shardval[paths[i]];
44
+ }
45
+ }
46
+ }
47
+
48
+ /*!
49
+ * ignore
50
+ */
51
+
52
+ module.exports.storeShard = storeShard;
53
+
54
+ /*!
55
+ * ignore
56
+ */
57
+
58
+ function storeShard() {
59
+ // backwards compat
60
+ const key = this.$__schema.options.shardKey || this.$__schema.options.shardkey;
61
+ if (!utils.isPOJO(key)) {
62
+ return;
63
+ }
64
+
65
+ const orig = this.$__.shardval = {};
66
+ const paths = Object.keys(key);
67
+ const len = paths.length;
68
+ let val;
69
+
70
+ for (let i = 0; i < len; ++i) {
71
+ val = this.$__getValue(paths[i]);
72
+ if (val == null) {
73
+ orig[paths[i]] = val;
74
+ } else if (utils.isMongooseObject(val)) {
75
+ orig[paths[i]] = val.toObject({ depopulate: true, _isNested: true });
76
+ } else if (val instanceof Date || val[objectIdSymbol]) {
77
+ orig[paths[i]] = val;
78
+ } else if (typeof val.valueOf === 'function') {
79
+ orig[paths[i]] = val.valueOf();
80
+ } else {
81
+ orig[paths[i]] = val;
82
+ }
83
+ }
84
+ }