@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,316 @@
1
+ 'use strict';
2
+
3
+ const MongooseError = require('../../error/mongooseError');
4
+ const getDiscriminatorByValue = require('../../helpers/discriminator/getDiscriminatorByValue');
5
+ const applyTimestampsToChildren = require('../update/applyTimestampsToChildren');
6
+ const applyTimestampsToUpdate = require('../update/applyTimestampsToUpdate');
7
+ const cast = require('../../cast');
8
+ const castUpdate = require('../query/castUpdate');
9
+ const clone = require('../clone');
10
+ const decorateUpdateWithVersionKey = require('../update/decorateUpdateWithVersionKey');
11
+ const { inspect } = require('util');
12
+ const setDefaultsOnInsert = require('../setDefaultsOnInsert');
13
+
14
+ /**
15
+ * Given a model and a bulkWrite op, return a thunk that handles casting and
16
+ * validating the individual op.
17
+ * @param {Model} originalModel
18
+ * @param {Object} op
19
+ * @param {Object} [options]
20
+ * @api private
21
+ */
22
+
23
+ module.exports = function castBulkWrite(originalModel, op, options) {
24
+ const now = originalModel.base.now();
25
+
26
+ if (op['insertOne']) {
27
+ return callback => module.exports.castInsertOne(originalModel, op['insertOne'], options).then(() => callback(null), err => callback(err));
28
+ } else if (op['updateOne']) {
29
+ return (callback) => {
30
+ try {
31
+ module.exports.castUpdateOne(originalModel, op['updateOne'], options, now);
32
+ callback(null);
33
+ } catch (err) {
34
+ callback(err);
35
+ }
36
+ };
37
+ } else if (op['updateMany']) {
38
+ return (callback) => {
39
+ try {
40
+ module.exports.castUpdateMany(originalModel, op['updateMany'], options, now);
41
+ callback(null);
42
+ } catch (err) {
43
+ callback(err);
44
+ }
45
+ };
46
+ } else if (op['replaceOne']) {
47
+ return (callback) => {
48
+ module.exports.castReplaceOne(originalModel, op['replaceOne'], options).then(() => callback(null), err => callback(err));
49
+ };
50
+ } else if (op['deleteOne']) {
51
+ return (callback) => {
52
+ try {
53
+ module.exports.castDeleteOne(originalModel, op['deleteOne']);
54
+ callback(null);
55
+ } catch (err) {
56
+ callback(err);
57
+ }
58
+ };
59
+ } else if (op['deleteMany']) {
60
+ return (callback) => {
61
+ try {
62
+ module.exports.castDeleteMany(originalModel, op['deleteMany']);
63
+ callback(null);
64
+ } catch (err) {
65
+ callback(err);
66
+ }
67
+ };
68
+ } else {
69
+ return (callback) => {
70
+ const error = new MongooseError(`Invalid op passed to \`bulkWrite()\`: ${inspect(op)}`);
71
+ callback(error, null);
72
+ };
73
+ }
74
+ };
75
+
76
+ module.exports.castInsertOne = async function castInsertOne(originalModel, insertOne, options) {
77
+ const model = decideModelByObject(originalModel, insertOne['document']);
78
+
79
+ const doc = new model(insertOne['document']);
80
+ if (model.schema.options.timestamps && getTimestampsOpt(insertOne, options)) {
81
+ doc.initializeTimestamps();
82
+ }
83
+ if (options.session != null) {
84
+ doc.$session(options.session);
85
+ }
86
+ const versionKey = model?.schema?.options?.versionKey;
87
+ if (versionKey && doc[versionKey] == null) {
88
+ doc[versionKey] = 0;
89
+ }
90
+ insertOne['document'] = doc;
91
+
92
+ if (options.skipValidation || insertOne.skipValidation) {
93
+ return insertOne;
94
+ }
95
+
96
+ await insertOne['document'].$validate();
97
+ return insertOne;
98
+ };
99
+
100
+ module.exports.castUpdateOne = function castUpdateOne(originalModel, updateOne, options, now) {
101
+ if (!updateOne['filter']) {
102
+ throw new Error('Must provide a filter object.');
103
+ }
104
+ if (!updateOne['update']) {
105
+ throw new Error('Must provide an update object.');
106
+ }
107
+
108
+ const model = decideModelByObject(originalModel, updateOne['filter']);
109
+ const schema = model.schema;
110
+ const strict = options.strict ?? model.schema.options.strict;
111
+
112
+ const update = clone(updateOne['update']);
113
+
114
+ _addDiscriminatorToObject(schema, updateOne['filter']);
115
+
116
+ const doInitTimestamps = getTimestampsOpt(updateOne, options);
117
+
118
+ if (model.schema.$timestamps != null && doInitTimestamps) {
119
+ const createdAt = model.schema.$timestamps.createdAt;
120
+ const updatedAt = model.schema.$timestamps.updatedAt;
121
+ applyTimestampsToUpdate(now, createdAt, updatedAt, update, {
122
+ timestamps: updateOne.timestamps,
123
+ overwriteImmutable: updateOne.overwriteImmutable
124
+ });
125
+ }
126
+
127
+ if (doInitTimestamps) {
128
+ applyTimestampsToChildren(now, update, model.schema);
129
+ }
130
+
131
+ const globalSetDefaultsOnInsert = originalModel.base.options.setDefaultsOnInsert;
132
+ const shouldSetDefaultsOnInsert = updateOne.setDefaultsOnInsert ?? globalSetDefaultsOnInsert;
133
+ if (shouldSetDefaultsOnInsert !== false) {
134
+ setDefaultsOnInsert(updateOne['filter'], model.schema, update, {
135
+ setDefaultsOnInsert: true,
136
+ upsert: updateOne.upsert
137
+ });
138
+ }
139
+
140
+ decorateUpdateWithVersionKey(
141
+ update,
142
+ updateOne,
143
+ model.schema.options.versionKey
144
+ );
145
+
146
+ updateOne['filter'] = cast(model.schema, updateOne['filter'], {
147
+ strict: strict,
148
+ upsert: updateOne.upsert
149
+ });
150
+ updateOne['update'] = castUpdate(model.schema, update, {
151
+ strict: strict,
152
+ upsert: updateOne.upsert,
153
+ arrayFilters: updateOne.arrayFilters,
154
+ overwriteDiscriminatorKey: updateOne.overwriteDiscriminatorKey,
155
+ overwriteImmutable: updateOne.overwriteImmutable
156
+ }, model, updateOne['filter']);
157
+
158
+ return updateOne;
159
+ };
160
+
161
+ module.exports.castUpdateMany = function castUpdateMany(originalModel, updateMany, options, now) {
162
+ if (!updateMany['filter']) {
163
+ throw new Error('Must provide a filter object.');
164
+ }
165
+ if (!updateMany['update']) {
166
+ throw new Error('Must provide an update object.');
167
+ }
168
+
169
+ const model = decideModelByObject(originalModel, updateMany['filter']);
170
+ const schema = model.schema;
171
+ const strict = options.strict ?? model.schema.options.strict;
172
+
173
+ const globalSetDefaultsOnInsert = originalModel.base.options.setDefaultsOnInsert;
174
+ const shouldSetDefaultsOnInsert = updateMany.setDefaultsOnInsert ?? globalSetDefaultsOnInsert;
175
+
176
+ if (shouldSetDefaultsOnInsert !== false) {
177
+ setDefaultsOnInsert(updateMany['filter'], model.schema, updateMany['update'], {
178
+ setDefaultsOnInsert: true,
179
+ upsert: updateMany.upsert
180
+ });
181
+ }
182
+
183
+ const doInitTimestamps = getTimestampsOpt(updateMany, options);
184
+
185
+ if (model.schema.$timestamps != null && doInitTimestamps) {
186
+ const createdAt = model.schema.$timestamps.createdAt;
187
+ const updatedAt = model.schema.$timestamps.updatedAt;
188
+ applyTimestampsToUpdate(now, createdAt, updatedAt, updateMany['update'], {
189
+ timestamps: updateMany.timestamps,
190
+ overwriteImmutable: updateMany.overwriteImmutable
191
+ });
192
+ }
193
+ if (doInitTimestamps) {
194
+ applyTimestampsToChildren(now, updateMany['update'], model.schema);
195
+ }
196
+
197
+ _addDiscriminatorToObject(schema, updateMany['filter']);
198
+
199
+ decorateUpdateWithVersionKey(
200
+ updateMany['update'],
201
+ updateMany,
202
+ model.schema.options.versionKey
203
+ );
204
+
205
+ updateMany['filter'] = cast(model.schema, updateMany['filter'], {
206
+ strict: strict,
207
+ upsert: updateMany.upsert
208
+ });
209
+
210
+ updateMany['update'] = castUpdate(model.schema, updateMany['update'], {
211
+ strict: strict,
212
+ upsert: updateMany.upsert,
213
+ arrayFilters: updateMany.arrayFilters,
214
+ overwriteDiscriminatorKey: updateMany.overwriteDiscriminatorKey,
215
+ overwriteImmutable: updateMany.overwriteImmutable
216
+ }, model, updateMany['filter']);
217
+ };
218
+
219
+ module.exports.castReplaceOne = async function castReplaceOne(originalModel, replaceOne, options) {
220
+ const model = decideModelByObject(originalModel, replaceOne['filter']);
221
+ const schema = model.schema;
222
+ const strict = options.strict ?? model.schema.options.strict;
223
+
224
+ _addDiscriminatorToObject(schema, replaceOne['filter']);
225
+ replaceOne['filter'] = cast(model.schema, replaceOne['filter'], {
226
+ strict: strict,
227
+ upsert: replaceOne.upsert
228
+ });
229
+
230
+ // set `skipId`, otherwise we get "_id field cannot be changed"
231
+ const doc = new model(replaceOne['replacement'], strict, { skipId: true });
232
+ if (model.schema.options.timestamps && getTimestampsOpt(replaceOne, options)) {
233
+ doc.initializeTimestamps();
234
+ }
235
+ if (options.session != null) {
236
+ doc.$session(options.session);
237
+ }
238
+ const versionKey = model?.schema?.options?.versionKey;
239
+ if (versionKey && doc[versionKey] == null) {
240
+ doc[versionKey] = 0;
241
+ }
242
+ replaceOne['replacement'] = doc;
243
+
244
+ if (options.skipValidation || replaceOne.skipValidation) {
245
+ replaceOne['replacement'] = replaceOne['replacement'].toBSON();
246
+ return;
247
+ }
248
+
249
+ await replaceOne['replacement'].$validate();
250
+ replaceOne['replacement'] = replaceOne['replacement'].toBSON();
251
+ };
252
+
253
+ module.exports.castDeleteOne = function castDeleteOne(originalModel, deleteOne) {
254
+ const model = decideModelByObject(originalModel, deleteOne['filter']);
255
+ const schema = model.schema;
256
+
257
+ _addDiscriminatorToObject(schema, deleteOne['filter']);
258
+
259
+ deleteOne['filter'] = cast(model.schema, deleteOne['filter']);
260
+ };
261
+
262
+ module.exports.castDeleteMany = function castDeleteMany(originalModel, deleteMany) {
263
+ const model = decideModelByObject(originalModel, deleteMany['filter']);
264
+ const schema = model.schema;
265
+
266
+ _addDiscriminatorToObject(schema, deleteMany['filter']);
267
+
268
+ deleteMany['filter'] = cast(model.schema, deleteMany['filter']);
269
+ };
270
+
271
+ module.exports.cast = {
272
+ insertOne: module.exports.castInsertOne,
273
+ updateOne: module.exports.castUpdateOne,
274
+ updateMany: module.exports.castUpdateMany,
275
+ replaceOne: module.exports.castReplaceOne,
276
+ deleteOne: module.exports.castDeleteOne,
277
+ deleteMany: module.exports.castDeleteMany
278
+ };
279
+
280
+ function _addDiscriminatorToObject(schema, obj) {
281
+ if (schema == null) {
282
+ return;
283
+ }
284
+ if (schema.discriminatorMapping && !schema.discriminatorMapping.isRoot) {
285
+ obj[schema.discriminatorMapping.key] = schema.discriminatorMapping.value;
286
+ }
287
+ }
288
+
289
+ /**
290
+ * gets discriminator model if discriminator key is present in object
291
+ * @api private
292
+ */
293
+
294
+ function decideModelByObject(model, object) {
295
+ const discriminatorKey = model.schema.options.discriminatorKey;
296
+ if (object != null && Object.hasOwn(object, discriminatorKey)) {
297
+ model = getDiscriminatorByValue(model.discriminators, object[discriminatorKey]) || model;
298
+ }
299
+ return model;
300
+ }
301
+
302
+ /**
303
+ * gets timestamps option for a given operation. If the option is set within an individual operation, use it. Otherwise, use the global timestamps option configured in the `bulkWrite` options. Overall default is `true`.
304
+ * @api private
305
+ */
306
+
307
+ function getTimestampsOpt(opCommand, options) {
308
+ const opLevelOpt = opCommand.timestamps;
309
+ const bulkLevelOpt = options.timestamps;
310
+ if (opLevelOpt != null) {
311
+ return opLevelOpt;
312
+ } else if (bulkLevelOpt != null) {
313
+ return bulkLevelOpt;
314
+ }
315
+ return true;
316
+ }
@@ -0,0 +1,8 @@
1
+ 'use strict';
2
+
3
+ module.exports = function decorateBulkWriteResult(resultOrError, validationErrors, results) {
4
+ resultOrError.mongoose = resultOrError.mongoose || {};
5
+ resultOrError.mongoose.validationErrors = validationErrors;
6
+ resultOrError.mongoose.results = results;
7
+ return resultOrError;
8
+ };
@@ -0,0 +1,265 @@
1
+ 'use strict';
2
+
3
+ const Mixed = require('../../schema/mixed');
4
+ const applyBuiltinPlugins = require('../schema/applyBuiltinPlugins');
5
+ const clone = require('../clone');
6
+ const defineKey = require('../document/compile').defineKey;
7
+ const get = require('../get');
8
+ const utils = require('../../utils');
9
+ const mergeDiscriminatorSchema = require('../../helpers/discriminator/mergeDiscriminatorSchema');
10
+
11
+ const CUSTOMIZABLE_DISCRIMINATOR_OPTIONS = {
12
+ toJSON: true,
13
+ toObject: true,
14
+ _id: true,
15
+ id: true,
16
+ virtuals: true,
17
+ methods: true,
18
+ statics: true
19
+ };
20
+
21
+ /**
22
+ * Validate fields declared on the child schema when either schema is configured for encryption. Specifically, this function ensures that:
23
+ *
24
+ * - any encrypted fields are declared on exactly one of the schemas (not both)
25
+ * - encrypted fields cannot be declared on either the parent or child schema, where the other schema declares the same field without encryption.
26
+ *
27
+ * @param {Schema} parentSchema
28
+ * @param {Schema} childSchema
29
+ */
30
+ function validateDiscriminatorSchemasForEncryption(parentSchema, childSchema) {
31
+ if (parentSchema.encryptionType() == null && childSchema.encryptionType() == null) return;
32
+
33
+ const allSharedNestedPaths = setIntersection(
34
+ allNestedPaths(parentSchema),
35
+ allNestedPaths(childSchema)
36
+ );
37
+
38
+ for (const path of allSharedNestedPaths) {
39
+ if (parentSchema._hasEncryptedField(path) && childSchema._hasEncryptedField(path)) {
40
+ throw new Error(`encrypted fields cannot be declared on both the base schema and the child schema in a discriminator. path=${path}`);
41
+ }
42
+
43
+ if (parentSchema._hasEncryptedField(path) || childSchema._hasEncryptedField(path)) {
44
+ throw new Error(`encrypted fields cannot have the same path as a non-encrypted field for discriminators. path=${path}`);
45
+ }
46
+ }
47
+
48
+ function allNestedPaths(schema) {
49
+ return [...Object.keys(schema.paths), ...Object.keys(schema.singleNestedPaths)];
50
+ }
51
+
52
+ /**
53
+ * @param {Iterable<string>} i1
54
+ * @param {Iterable<string>} i2
55
+ */
56
+ function* setIntersection(i1, i2) {
57
+ const s1 = new Set(i1);
58
+ for (const item of i2) {
59
+ if (s1.has(item)) {
60
+ yield item;
61
+ }
62
+ }
63
+ }
64
+ }
65
+
66
+ /*!
67
+ * ignore
68
+ */
69
+
70
+ module.exports = function discriminator(model, name, schema, tiedValue, applyPlugins, mergeHooks, overwriteExisting) {
71
+ if (!schema?.instanceOfSchema) {
72
+ throw new Error('You must pass a valid discriminator Schema');
73
+ }
74
+
75
+ mergeHooks = mergeHooks == null ? true : mergeHooks;
76
+
77
+ if (model.schema.discriminatorMapping &&
78
+ !model.schema.discriminatorMapping.isRoot) {
79
+ throw new Error('Discriminator "' + name +
80
+ '" can only be a discriminator of the root model');
81
+ }
82
+
83
+ if (applyPlugins) {
84
+ const applyPluginsToDiscriminators = get(model.base,
85
+ 'options.applyPluginsToDiscriminators', false) || !mergeHooks;
86
+ // Even if `applyPluginsToDiscriminators` isn't set, we should still apply
87
+ // global plugins to schemas embedded in the discriminator schema (gh-7370)
88
+ model.base._applyPlugins(schema, {
89
+ skipTopLevel: !applyPluginsToDiscriminators
90
+ });
91
+ } else if (!mergeHooks) {
92
+ applyBuiltinPlugins(schema);
93
+ }
94
+
95
+ const key = model.schema.options.discriminatorKey;
96
+
97
+ const existingPath = model.schema.path(key);
98
+ if (existingPath != null) {
99
+ if (!utils.hasUserDefinedProperty(existingPath.options, 'select')) {
100
+ existingPath.options.select = true;
101
+ }
102
+ existingPath.options.$skipDiscriminatorCheck = true;
103
+ } else {
104
+ const baseSchemaAddition = {};
105
+ baseSchemaAddition[key] = {
106
+ default: void 0,
107
+ select: true,
108
+ $skipDiscriminatorCheck: true
109
+ };
110
+ baseSchemaAddition[key][model.schema.options.typeKey] = String;
111
+ model.schema.add(baseSchemaAddition);
112
+ defineKey({
113
+ prop: key,
114
+ prototype: model.prototype,
115
+ options: model.schema.options
116
+ });
117
+ }
118
+
119
+ if (schema.path(key) && schema.path(key).options.$skipDiscriminatorCheck !== true) {
120
+ throw new Error('Discriminator "' + name +
121
+ '" cannot have field with name "' + key + '"');
122
+ }
123
+
124
+ let value = name;
125
+ if ((typeof tiedValue === 'string' && tiedValue.length) || tiedValue != null) {
126
+ value = tiedValue;
127
+ }
128
+
129
+ validateDiscriminatorSchemasForEncryption(model.schema, schema);
130
+
131
+ function merge(schema, baseSchema) {
132
+ // Retain original schema before merging base schema
133
+ schema._baseSchema = baseSchema;
134
+ if (baseSchema.paths._id &&
135
+ baseSchema.paths._id.options &&
136
+ !baseSchema.paths._id.options.auto) {
137
+ schema.remove('_id');
138
+ }
139
+
140
+ // Find conflicting paths: if something is a path in the base schema
141
+ // and a nested path in the child schema, overwrite the base schema path.
142
+ // See gh-6076
143
+ const baseSchemaPaths = Object.keys(baseSchema.paths);
144
+ const conflictingPaths = [];
145
+
146
+ for (const path of baseSchemaPaths) {
147
+ if (schema.nested[path]) {
148
+ conflictingPaths.push(path);
149
+ continue;
150
+ }
151
+
152
+ if (path.indexOf('.') === -1) {
153
+ continue;
154
+ }
155
+ const sp = path.split('.').slice(0, -1);
156
+ let cur = '';
157
+ for (const piece of sp) {
158
+ cur += (cur.length ? '.' : '') + piece;
159
+ if (schema.paths[cur] instanceof Mixed ||
160
+ schema.singleNestedPaths[cur] instanceof Mixed) {
161
+ conflictingPaths.push(path);
162
+ }
163
+ }
164
+ }
165
+
166
+ // Shallow clone `obj` so we can add additional properties without modifying original
167
+ // schema. `Schema.prototype.clone()` copies `obj` by reference, no cloning.
168
+ schema.obj = { ...schema.obj };
169
+ mergeDiscriminatorSchema(schema, baseSchema);
170
+ schema._gatherChildSchemas();
171
+
172
+ // Clean up conflicting paths _after_ merging re: gh-6076
173
+ for (const conflictingPath of conflictingPaths) {
174
+ delete schema.paths[conflictingPath];
175
+ }
176
+
177
+ // Rebuild schema models because schemas may have been merged re: #7884
178
+ schema.childSchemas.forEach(obj => {
179
+ obj.model.prototype.$__setSchema(obj.schema);
180
+ });
181
+
182
+ const obj = {};
183
+ obj[key] = {
184
+ default: value,
185
+ select: true,
186
+ set: function(newName) {
187
+ if (newName === value || (Array.isArray(value) && utils.deepEqual(newName, value))) {
188
+ return value;
189
+ }
190
+ throw new Error('Can\'t set discriminator key "' + key + '"');
191
+ },
192
+ $skipDiscriminatorCheck: true
193
+ };
194
+ obj[key][schema.options.typeKey] = existingPath ? existingPath.options[schema.options.typeKey] : String;
195
+ schema.add(obj);
196
+
197
+ schema.discriminatorMapping = { key: key, value: value, isRoot: false };
198
+
199
+ if (baseSchema.options.collection) {
200
+ schema.options.collection = baseSchema.options.collection;
201
+ }
202
+ const toJSON = schema.options.toJSON;
203
+ const toObject = schema.options.toObject;
204
+ const _id = schema.options._id;
205
+ const id = schema.options.id;
206
+
207
+ const keys = Object.keys(schema.options);
208
+ schema.options.discriminatorKey = baseSchema.options.discriminatorKey;
209
+ const userProvidedOptions = schema._userProvidedOptions;
210
+ for (const _key of keys) {
211
+ if (!CUSTOMIZABLE_DISCRIMINATOR_OPTIONS[_key]) {
212
+ // Use `schema.options` in `deepEqual()` because of `discriminatorKey`
213
+ // set above. We don't allow customizing discriminator key, always
214
+ // overwrite. See gh-9238
215
+ if (_key in userProvidedOptions && !utils.deepEqual(schema.options[_key], baseSchema.options[_key])) {
216
+ throw new Error('Can\'t customize discriminator option ' + _key +
217
+ ' (can only modify ' +
218
+ Object.keys(CUSTOMIZABLE_DISCRIMINATOR_OPTIONS).join(', ') +
219
+ ')');
220
+ }
221
+ }
222
+ }
223
+ schema.options = clone(baseSchema.options);
224
+
225
+ for (const _key of Object.keys(userProvidedOptions)) {
226
+ schema.options[_key] = userProvidedOptions[_key];
227
+ }
228
+ if (toJSON) schema.options.toJSON = toJSON;
229
+ if (toObject) schema.options.toObject = toObject;
230
+ if (typeof _id !== 'undefined') {
231
+ schema.options._id = _id;
232
+ }
233
+ schema.options.id = id;
234
+ if (mergeHooks) {
235
+ schema.s.hooks = model.schema.s.hooks.merge(schema.s.hooks);
236
+ }
237
+ if (applyPlugins) {
238
+ schema.plugins = Array.prototype.slice.call(baseSchema.plugins);
239
+ }
240
+ schema.callQueue = baseSchema.callQueue.concat(schema.callQueue);
241
+ delete schema._requiredpaths; // reset just in case Schema#requiredPaths() was called on either schema
242
+ }
243
+
244
+ // merges base schema into new discriminator schema and sets new type field.
245
+ merge(schema, model.schema);
246
+
247
+ if (!model.discriminators) {
248
+ model.discriminators = {};
249
+ }
250
+
251
+ if (!model.schema.discriminatorMapping) {
252
+ model.schema.discriminatorMapping = { key: key, value: null, isRoot: true };
253
+ }
254
+ if (!model.schema.discriminators) {
255
+ model.schema.discriminators = {};
256
+ }
257
+
258
+ model.schema.discriminators[name] = schema;
259
+
260
+ if (model.discriminators[name] && !schema.options.overwriteModels && !overwriteExisting) {
261
+ throw new Error('Discriminator with name "' + name + '" already exists');
262
+ }
263
+
264
+ return schema;
265
+ };
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ module.exports = function pushNestedArrayPaths(paths, nestedArray, path) {
4
+ if (nestedArray == null) {
5
+ return;
6
+ }
7
+
8
+ for (let i = 0; i < nestedArray.length; ++i) {
9
+ if (Array.isArray(nestedArray[i])) {
10
+ pushNestedArrayPaths(paths, nestedArray[i], path + '.' + i);
11
+ } else {
12
+ paths.push(path + '.' + i);
13
+ }
14
+ }
15
+ };
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ module.exports = function omitUndefined(val) {
4
+ if (val == null || typeof val !== 'object') {
5
+ return val;
6
+ }
7
+ if (Array.isArray(val)) {
8
+ for (let i = val.length - 1; i >= 0; --i) {
9
+ if (val[i] === undefined) {
10
+ val.splice(i, 1);
11
+ }
12
+ }
13
+ }
14
+ for (const key of Object.keys(val)) {
15
+ if (val[key] === void 0) {
16
+ delete val[key];
17
+ }
18
+ }
19
+ return val;
20
+ };
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ module.exports = function once(fn) {
4
+ let called = false;
5
+ return function() {
6
+ if (called) {
7
+ return;
8
+ }
9
+ called = true;
10
+ return fn.apply(null, arguments);
11
+ };
12
+ };
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ module.exports = parallelLimit;
4
+
5
+ /*!
6
+ * ignore
7
+ */
8
+
9
+ async function parallelLimit(params, fn, limit) {
10
+ if (limit <= 0) {
11
+ throw new Error('Limit must be positive');
12
+ }
13
+
14
+ if (params.length === 0) {
15
+ return [];
16
+ }
17
+
18
+ const results = [];
19
+ const executing = new Set();
20
+
21
+ for (let index = 0; index < params.length; index++) {
22
+ const param = params[index];
23
+ const p = fn(param, index);
24
+ results.push(p);
25
+
26
+ executing.add(p);
27
+
28
+ const clean = () => executing.delete(p);
29
+ p.then(clean).catch(clean);
30
+
31
+ if (executing.size >= limit) {
32
+ await Promise.race(executing);
33
+ }
34
+ }
35
+
36
+ return Promise.all(results);
37
+ }
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ const dotRE = /\./g;
4
+ module.exports = function parentPaths(path) {
5
+ if (path.indexOf('.') === -1) {
6
+ return [path];
7
+ }
8
+ const pieces = path.split(dotRE);
9
+ const len = pieces.length;
10
+ const ret = new Array(len);
11
+ let cur = '';
12
+ for (let i = 0; i < len; ++i) {
13
+ cur += (cur.length !== 0) ? '.' + pieces[i] : pieces[i];
14
+ ret[i] = cur;
15
+ }
16
+
17
+ return ret;
18
+ };