@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,103 @@
1
+ 'use strict';
2
+
3
+ const cleanPositionalOperators = require('../schema/cleanPositionalOperators');
4
+ const get = require('../get');
5
+ const getDiscriminatorByValue = require('../discriminator/getDiscriminatorByValue');
6
+ const updatedPathsByArrayFilter = require('../update/updatedPathsByArrayFilter');
7
+
8
+ /**
9
+ * Like `schema.path()`, except with a document, because impossible to
10
+ * determine path type without knowing the embedded discriminator key.
11
+ * @param {Schema} schema
12
+ * @param {Object} [update]
13
+ * @param {Object} [filter]
14
+ * @param {String} path
15
+ * @param {Object} [options]
16
+ * @api private
17
+ */
18
+
19
+ module.exports = function getEmbeddedDiscriminatorPath(schema, update, filter, path, options) {
20
+ const parts = path.indexOf('.') === -1 ? [path] : path.split('.');
21
+ let schematype = null;
22
+ let type = 'adhocOrUndefined';
23
+
24
+ filter = filter || {};
25
+ update = update || {};
26
+ const arrayFilters = Array.isArray(options?.arrayFilters) ?
27
+ options.arrayFilters : [];
28
+ const updatedPathsByFilter = updatedPathsByArrayFilter(update);
29
+ let startIndex = 0;
30
+
31
+ for (let i = 0; i < parts.length; ++i) {
32
+ const originalSubpath = parts.slice(startIndex, i + 1).join('.');
33
+ const subpath = cleanPositionalOperators(originalSubpath);
34
+ schematype = schema.path(subpath);
35
+ if (schematype == null) {
36
+ continue;
37
+ }
38
+
39
+ type = schema.pathType(subpath);
40
+ if ((schematype.$isSingleNested || schematype.$isMongooseDocumentArrayElement) &&
41
+ schematype.schema.discriminators != null) {
42
+ const key = get(schematype, 'schema.options.discriminatorKey');
43
+ const discriminatorValuePath = subpath + '.' + key;
44
+ const discriminatorFilterPath =
45
+ discriminatorValuePath.replace(/\.\d+\./, '.');
46
+ let discriminatorKey = null;
47
+
48
+ if (discriminatorValuePath in filter) {
49
+ discriminatorKey = filter[discriminatorValuePath];
50
+ }
51
+ if (discriminatorFilterPath in filter) {
52
+ discriminatorKey = filter[discriminatorFilterPath];
53
+ }
54
+
55
+ const wrapperPath = subpath.replace(/\.\d+$/, '');
56
+ if (schematype.$isMongooseDocumentArrayElement &&
57
+ get(filter[wrapperPath], '$elemMatch.' + key) != null) {
58
+ discriminatorKey = filter[wrapperPath].$elemMatch[key];
59
+ }
60
+
61
+ const discriminatorKeyUpdatePath = originalSubpath + '.' + key;
62
+ if (discriminatorKeyUpdatePath in update) {
63
+ discriminatorKey = update[discriminatorKeyUpdatePath];
64
+ }
65
+
66
+ if (discriminatorValuePath in update) {
67
+ discriminatorKey = update[discriminatorValuePath];
68
+ }
69
+
70
+ for (const filterKey of Object.keys(updatedPathsByFilter)) {
71
+ const schemaKey = updatedPathsByFilter[filterKey] + '.' + key;
72
+ const arrayFilterKey = filterKey + '.' + key;
73
+ if (schemaKey === discriminatorFilterPath) {
74
+ const filter = arrayFilters.find(filter => Object.hasOwn(filter, arrayFilterKey));
75
+ if (filter != null) {
76
+ discriminatorKey = filter[arrayFilterKey];
77
+ }
78
+ }
79
+ }
80
+
81
+ if (discriminatorKey == null) {
82
+ continue;
83
+ }
84
+
85
+ const discriminator = getDiscriminatorByValue(schematype.Constructor.discriminators, discriminatorKey);
86
+ const discriminatorSchema = discriminator?.schema;
87
+ if (discriminatorSchema == null) {
88
+ continue;
89
+ }
90
+
91
+ const rest = parts.slice(i + 1).join('.');
92
+ schematype = discriminatorSchema.path(rest);
93
+ schema = discriminatorSchema;
94
+ startIndex = i + 1;
95
+ if (schematype != null) {
96
+ type = discriminatorSchema._getPathType(rest);
97
+ break;
98
+ }
99
+ }
100
+ }
101
+
102
+ return { type: type, schematype: schematype };
103
+ };
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ const StrictModeError = require('../../error/strict');
4
+
5
+ /**
6
+ * Handle immutable option for a given path when casting updates based on options
7
+ *
8
+ * @param {SchemaType} schematype the resolved schematype for this path
9
+ * @param {Boolean | 'throw' | null} strict whether strict mode is set for this query
10
+ * @param {Object} obj the object containing the value being checked so we can delete
11
+ * @param {String} key the key in `obj` which we are checking for immutability
12
+ * @param {String} fullPath the full path being checked
13
+ * @param {Object} options the query options
14
+ * @param {Query} ctx the query. Passed as `this` and first param to the `immutable` option, if `immutable` is a function
15
+ * @returns true if field was removed, false otherwise
16
+ */
17
+
18
+ module.exports = function handleImmutable(schematype, strict, obj, key, fullPath, options, ctx) {
19
+ if (!schematype?.options?.immutable) {
20
+ return false;
21
+ }
22
+ let immutable = schematype.options.immutable;
23
+
24
+ if (typeof immutable === 'function') {
25
+ immutable = immutable.call(ctx, ctx);
26
+ }
27
+ if (!immutable) {
28
+ return false;
29
+ }
30
+
31
+ if (options?.overwriteImmutable) {
32
+ return false;
33
+ }
34
+ if (strict === false) {
35
+ return false;
36
+ }
37
+ if (strict === 'throw') {
38
+ throw new StrictModeError(null,
39
+ `Field ${fullPath} is immutable and strict = 'throw'`);
40
+ }
41
+
42
+ delete obj[key];
43
+ return true;
44
+ };
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ module.exports = function handleReadPreferenceAliases(pref) {
4
+ switch (pref) {
5
+ case 'p':
6
+ pref = 'primary';
7
+ break;
8
+ case 'pp':
9
+ pref = 'primaryPreferred';
10
+ break;
11
+ case 's':
12
+ pref = 'secondary';
13
+ break;
14
+ case 'sp':
15
+ pref = 'secondaryPreferred';
16
+ break;
17
+ case 'n':
18
+ pref = 'nearest';
19
+ break;
20
+ }
21
+
22
+ return pref;
23
+ };
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * ignore
5
+ */
6
+
7
+ module.exports = function hasDollarKeys(obj) {
8
+
9
+ if (typeof obj !== 'object' || obj === null) {
10
+ return false;
11
+ }
12
+
13
+ const keys = Object.keys(obj);
14
+ const len = keys.length;
15
+
16
+ for (let i = 0; i < len; ++i) {
17
+ if (keys[i][0] === '$') {
18
+ return true;
19
+ }
20
+ }
21
+
22
+ return false;
23
+ };
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ const specialKeys = new Set([
4
+ '$ref',
5
+ '$id',
6
+ '$db'
7
+ ]);
8
+
9
+ module.exports = function isOperator(path) {
10
+ return (
11
+ path[0] === '$' &&
12
+ !specialKeys.has(path)
13
+ );
14
+ };
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ const hasDollarKeys = require('./hasDollarKeys');
4
+ const { trustedSymbol } = require('./trusted');
5
+
6
+ module.exports = function sanitizeFilter(filter) {
7
+ if (filter == null || typeof filter !== 'object') {
8
+ return filter;
9
+ }
10
+ if (Array.isArray(filter)) {
11
+ for (const subfilter of filter) {
12
+ sanitizeFilter(subfilter);
13
+ }
14
+ return filter;
15
+ }
16
+
17
+ const filterKeys = Object.keys(filter);
18
+ for (const key of filterKeys) {
19
+ const value = filter[key];
20
+ if (value?.[trustedSymbol]) {
21
+ continue;
22
+ }
23
+ if (key === '$and' || key === '$or') {
24
+ sanitizeFilter(value);
25
+ continue;
26
+ }
27
+
28
+ if (hasDollarKeys(value)) {
29
+ const keys = Object.keys(value);
30
+ if (keys.length === 1 && keys[0] === '$eq') {
31
+ continue;
32
+ }
33
+ filter[key] = { $eq: filter[key] };
34
+ }
35
+ }
36
+
37
+ return filter;
38
+ };
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ module.exports = function sanitizeProjection(projection) {
4
+ if (projection == null) {
5
+ return;
6
+ }
7
+
8
+ const keys = Object.keys(projection);
9
+ for (let i = 0; i < keys.length; ++i) {
10
+ if (typeof projection[keys[i]] === 'string') {
11
+ projection[keys[i]] = 1;
12
+ }
13
+ }
14
+ };
@@ -0,0 +1,62 @@
1
+ 'use strict';
2
+
3
+ const isExclusive = require('../projection/isExclusive');
4
+ const isInclusive = require('../projection/isInclusive');
5
+
6
+ /*!
7
+ * ignore
8
+ */
9
+
10
+ module.exports = function selectPopulatedFields(fields, userProvidedFields, populateOptions) {
11
+ if (populateOptions == null) {
12
+ return;
13
+ }
14
+
15
+ const paths = Object.keys(populateOptions);
16
+ userProvidedFields = userProvidedFields || {};
17
+ if (isInclusive(fields)) {
18
+ for (const path of paths) {
19
+ if (!isPathInFields(userProvidedFields, path)) {
20
+ fields[path] = 1;
21
+ } else if (userProvidedFields[path] === 0) {
22
+ delete fields[path];
23
+ }
24
+
25
+ const refPath = populateOptions[path]?.refPath;
26
+ if (typeof refPath === 'string') {
27
+ if (!isPathInFields(userProvidedFields, refPath)) {
28
+ fields[refPath] = 1;
29
+ } else if (userProvidedFields[refPath] === 0) {
30
+ delete fields[refPath];
31
+ }
32
+ }
33
+ }
34
+ } else if (isExclusive(fields)) {
35
+ for (const path of paths) {
36
+ if (userProvidedFields[path] == null) {
37
+ delete fields[path];
38
+ }
39
+ const refPath = populateOptions[path]?.refPath;
40
+ if (typeof refPath === 'string' && userProvidedFields[refPath] == null) {
41
+ delete fields[refPath];
42
+ }
43
+ }
44
+ }
45
+ };
46
+
47
+ /*!
48
+ * ignore
49
+ */
50
+
51
+ function isPathInFields(userProvidedFields, path) {
52
+ const pieces = path.split('.');
53
+ const len = pieces.length;
54
+ let cur = pieces[0];
55
+ for (let i = 1; i < len; ++i) {
56
+ if (userProvidedFields[cur] != null || userProvidedFields[cur + '.$'] != null) {
57
+ return true;
58
+ }
59
+ cur += '.' + pieces[i];
60
+ }
61
+ return userProvidedFields[cur] != null || userProvidedFields[cur + '.$'] != null;
62
+ }
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ const trustedSymbol = Symbol('mongoose#trustedSymbol');
4
+
5
+ exports.trustedSymbol = trustedSymbol;
6
+
7
+ exports.trusted = function trusted(obj) {
8
+ if (obj == null || typeof obj !== 'object') {
9
+ return obj;
10
+ }
11
+ obj[trustedSymbol] = true;
12
+ return obj;
13
+ };
@@ -0,0 +1,3 @@
1
+ 'use strict';
2
+
3
+ module.exports = require('../../constants').queryMiddlewareFunctions;
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ module.exports = function addAutoId(schema) {
4
+ const _obj = { _id: { auto: true } };
5
+ _obj._id[schema.options.typeKey] = 'ObjectId';
6
+ schema.add(_obj);
7
+ };
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ const builtinPlugins = require('../../plugins');
4
+
5
+ module.exports = function applyBuiltinPlugins(schema) {
6
+ for (const plugin of Object.values(builtinPlugins)) {
7
+ plugin(schema, { deduplicate: true });
8
+ }
9
+ schema.plugins = Object.values(builtinPlugins).
10
+ map(fn => ({ fn, opts: { deduplicate: true } })).
11
+ concat(schema.plugins);
12
+ };
@@ -0,0 +1,55 @@
1
+ 'use strict';
2
+
3
+ module.exports = function applyPlugins(schema, plugins, options, cacheKey) {
4
+ if (schema[cacheKey]) {
5
+ return;
6
+ }
7
+ schema[cacheKey] = true;
8
+
9
+ if (!options?.skipTopLevel) {
10
+ let pluginTags = null;
11
+ for (const plugin of plugins) {
12
+ const tags = plugin[1] == null ? null : plugin[1].tags;
13
+ if (!Array.isArray(tags)) {
14
+ schema.plugin(plugin[0], plugin[1]);
15
+ continue;
16
+ }
17
+
18
+ pluginTags = pluginTags || new Set(schema.options.pluginTags || []);
19
+ if (!tags.find(tag => pluginTags.has(tag))) {
20
+ continue;
21
+ }
22
+ schema.plugin(plugin[0], plugin[1]);
23
+ }
24
+ }
25
+
26
+ options = Object.assign({}, options);
27
+ delete options.skipTopLevel;
28
+
29
+ if (options.applyPluginsToChildSchemas !== false) {
30
+ for (const path of Object.keys(schema.paths)) {
31
+ const type = schema.paths[path];
32
+ if (type.schema != null) {
33
+ applyPlugins(type.schema, plugins, options, cacheKey);
34
+
35
+ // Recompile schema because plugins may have changed it, see gh-7572
36
+ type.Constructor.prototype.$__setSchema(type.schema);
37
+ }
38
+ }
39
+ }
40
+
41
+ const discriminators = schema.discriminators;
42
+ if (discriminators == null) {
43
+ return;
44
+ }
45
+
46
+ const applyPluginsToDiscriminators = options.applyPluginsToDiscriminators;
47
+
48
+ const keys = Object.keys(discriminators);
49
+ for (const discriminatorKey of keys) {
50
+ const discriminatorSchema = discriminators[discriminatorKey];
51
+
52
+ applyPlugins(discriminatorSchema, plugins,
53
+ { skipTopLevel: !applyPluginsToDiscriminators }, cacheKey);
54
+ }
55
+ };
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ module.exports = function applyReadConcern(schema, options) {
4
+ if (options.readConcern !== undefined) {
5
+ return;
6
+ }
7
+
8
+ // Don't apply default read concern to operations in transactions,
9
+ // because you shouldn't set read concern on individual operations
10
+ // within a transaction.
11
+ // See: https://www.mongodb.com/docs/manual/reference/read-concern/
12
+ if (options?.session?.transaction) {
13
+ return;
14
+ }
15
+
16
+ const level = schema.options?.readConcern?.level;
17
+ if (level != null) {
18
+ options.readConcern = { level };
19
+ }
20
+ };
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ const utils = require('../../utils');
4
+
5
+ module.exports = function applyWriteConcern(schema, options) {
6
+ if (options.writeConcern != null) {
7
+ return;
8
+ }
9
+ // Don't apply default write concern to operations in transactions,
10
+ // because setting write concern on an operation in a transaction is an error
11
+ // See: https://www.mongodb.com/docs/manual/reference/write-concern/
12
+ if (options?.session?.transaction) {
13
+ return;
14
+ }
15
+ const writeConcern = schema.options.writeConcern ?? {};
16
+ if (utils.hasOwnKeys(writeConcern)) {
17
+ options.writeConcern = {};
18
+ if (!('w' in options) && writeConcern.w != null) {
19
+ options.writeConcern.w = writeConcern.w;
20
+ }
21
+ if (!('j' in options) && writeConcern.j != null) {
22
+ options.writeConcern.j = writeConcern.j;
23
+ }
24
+ if (!('wtimeout' in options) && writeConcern.wtimeout != null) {
25
+ options.writeConcern.wtimeout = writeConcern.wtimeout;
26
+ }
27
+ }
28
+ else {
29
+ if (!('w' in options) && writeConcern.w != null) {
30
+ options.w = writeConcern.w;
31
+ }
32
+ if (!('j' in options) && writeConcern.j != null) {
33
+ options.j = writeConcern.j;
34
+ }
35
+ if (!('wtimeout' in options) && writeConcern.wtimeout != null) {
36
+ options.wtimeout = writeConcern.wtimeout;
37
+ }
38
+ }
39
+ };
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * For consistency's sake, we replace positional operator `$` and array filters
5
+ * `$[]` and `$[foo]` with `0` when looking up schema paths.
6
+ */
7
+
8
+ module.exports = function cleanPositionalOperators(path) {
9
+ return path.
10
+ replace(/\.\$(\[[^\]]*\])?(?=\.)/g, '.0').
11
+ replace(/\.\$(\[[^\]]*\])?$/g, '.0');
12
+ };
@@ -0,0 +1,171 @@
1
+ 'use strict';
2
+
3
+ const get = require('../get');
4
+ const helperIsObject = require('../isObject');
5
+ const decorateDiscriminatorIndexOptions = require('../indexes/decorateDiscriminatorIndexOptions');
6
+
7
+ /**
8
+ * Gather all indexes defined in the schema, including single nested,
9
+ * document arrays, and embedded discriminators.
10
+ * @param {Schema} schema
11
+ * @api private
12
+ */
13
+
14
+ module.exports = function getIndexes(schema) {
15
+ let indexes = [];
16
+ const schemaStack = new WeakMap();
17
+ const indexTypes = schema.constructor.indexTypes;
18
+ const indexByName = new Map();
19
+
20
+ collectIndexes(schema);
21
+ return indexes;
22
+
23
+ function collectIndexes(schema, prefix, baseSchema) {
24
+ // Ignore infinitely nested schemas, if we've already seen this schema
25
+ // along this path there must be a cycle
26
+ if (schemaStack.has(schema)) {
27
+ return;
28
+ }
29
+ schemaStack.set(schema, true);
30
+
31
+ prefix = prefix || '';
32
+ const keys = Object.keys(schema.paths);
33
+
34
+ for (const key of keys) {
35
+ const path = schema.paths[key];
36
+ if (baseSchema != null && baseSchema.paths[key]) {
37
+ // If looking at an embedded discriminator schema, don't look at paths
38
+ // that the
39
+ continue;
40
+ }
41
+
42
+ if (path._duplicateKeyErrorMessage != null) {
43
+ schema._duplicateKeyErrorMessagesByPath = schema._duplicateKeyErrorMessagesByPath || {};
44
+ schema._duplicateKeyErrorMessagesByPath[key] = path._duplicateKeyErrorMessage;
45
+ }
46
+
47
+ if (path.$isMongooseDocumentArray || path.$isSingleNested) {
48
+ if (get(path, 'options.excludeIndexes') !== true &&
49
+ get(path, 'schemaOptions.excludeIndexes') !== true &&
50
+ get(path, 'schema.options.excludeIndexes') !== true) {
51
+ collectIndexes(path.schema, prefix + key + '.');
52
+ }
53
+
54
+ if (path.schema.discriminators != null) {
55
+ const discriminators = path.schema.discriminators;
56
+ const discriminatorKeys = Object.keys(discriminators);
57
+ for (const discriminatorKey of discriminatorKeys) {
58
+ collectIndexes(discriminators[discriminatorKey],
59
+ prefix + key + '.', path.schema);
60
+ }
61
+ }
62
+
63
+ // Retained to minimize risk of backwards breaking changes due to
64
+ // gh-6113
65
+ if (path.$isMongooseDocumentArray) {
66
+ continue;
67
+ }
68
+ }
69
+
70
+ const index = path._index || (path.embeddedSchemaType && path.embeddedSchemaType._index);
71
+
72
+ if (index !== false && index != null) {
73
+ const field = {};
74
+ const isObject = helperIsObject(index);
75
+ const options = isObject ? { ...index } : {};
76
+ const type = typeof index === 'string' ? index :
77
+ isObject ? index.type :
78
+ false;
79
+
80
+ if (type && indexTypes.indexOf(type) !== -1) {
81
+ field[prefix + key] = type;
82
+ } else if (options.text) {
83
+ field[prefix + key] = 'text';
84
+ delete options.text;
85
+ } else {
86
+ let isDescendingIndex = false;
87
+ if (index === 'descending' || index === 'desc') {
88
+ isDescendingIndex = true;
89
+ } else if (index === 'ascending' || index === 'asc') {
90
+ isDescendingIndex = false;
91
+ } else {
92
+ isDescendingIndex = Number(index) === -1;
93
+ }
94
+
95
+ field[prefix + key] = isDescendingIndex ? -1 : 1;
96
+ }
97
+
98
+ delete options.type;
99
+ if (schema.options.autoIndex != null) {
100
+ options._autoIndex = schema.options.autoIndex;
101
+ }
102
+
103
+ const indexName = options?.name;
104
+
105
+ if (typeof indexName === 'string') {
106
+ if (indexByName.has(indexName)) {
107
+ Object.assign(indexByName.get(indexName), field);
108
+ } else {
109
+ indexes.push([field, options]);
110
+ indexByName.set(indexName, field);
111
+ }
112
+ } else {
113
+ indexes.push([field, options]);
114
+ indexByName.set(indexName, field);
115
+ }
116
+ }
117
+ }
118
+
119
+ schemaStack.delete(schema);
120
+
121
+ if (prefix) {
122
+ fixSubIndexPaths(schema, prefix);
123
+ } else {
124
+ schema._indexes.forEach(function(index) {
125
+ const options = index[1];
126
+ decorateDiscriminatorIndexOptions(schema, options);
127
+ });
128
+ indexes = indexes.concat(schema._indexes);
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Checks for indexes added to subdocs using Schema.index().
134
+ * These indexes need their paths prefixed properly.
135
+ *
136
+ * schema._indexes = [ [indexObj, options], [indexObj, options] ..]
137
+ * @param {Schema} schema
138
+ * @param {String} prefix
139
+ * @api private
140
+ */
141
+
142
+ function fixSubIndexPaths(schema, prefix) {
143
+ const subindexes = schema._indexes;
144
+ const len = subindexes.length;
145
+ for (let i = 0; i < len; ++i) {
146
+ const indexObj = subindexes[i][0];
147
+ const indexOptions = subindexes[i][1];
148
+ const keys = Object.keys(indexObj);
149
+ const klen = keys.length;
150
+ const newindex = {};
151
+
152
+ // use forward iteration, order matters
153
+ for (let j = 0; j < klen; ++j) {
154
+ const key = keys[j];
155
+ newindex[prefix + key] = indexObj[key];
156
+ }
157
+
158
+ const newIndexOptions = Object.assign({}, indexOptions);
159
+ if (indexOptions?.partialFilterExpression != null) {
160
+ newIndexOptions.partialFilterExpression = {};
161
+ const partialFilterExpression = indexOptions.partialFilterExpression;
162
+ for (const key of Object.keys(partialFilterExpression)) {
163
+ newIndexOptions.partialFilterExpression[prefix + key] =
164
+ partialFilterExpression[key];
165
+ }
166
+ }
167
+
168
+ indexes.push([newindex, newIndexOptions]);
169
+ }
170
+ }
171
+ };