@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,95 @@
1
+ 'use strict';
2
+
3
+ const get = require('../get');
4
+ const utils = require('../../utils');
5
+ /**
6
+ * Given a Mongoose index definition (key + options objects) and a MongoDB server
7
+ * index definition, determine if the two indexes are equal.
8
+ *
9
+ * @param {Object} schemaIndexKeysObject the Mongoose index spec
10
+ * @param {Object} options the Mongoose index definition's options
11
+ * @param {Object} dbIndex the index in MongoDB as returned by `listIndexes()`
12
+ * @api private
13
+ */
14
+
15
+ module.exports = function isIndexEqual(schemaIndexKeysObject, options, dbIndex) {
16
+ // Special case: text indexes have a special format in the db. For example,
17
+ // `{ name: 'text' }` becomes:
18
+ // {
19
+ // v: 2,
20
+ // key: { _fts: 'text', _ftsx: 1 },
21
+ // name: 'name_text',
22
+ // ns: 'test.tests',
23
+ // weights: { name: 1 },
24
+ // default_language: 'english',
25
+ // language_override: 'language',
26
+ // textIndexVersion: 3
27
+ // }
28
+ if (dbIndex.textIndexVersion != null) {
29
+ delete dbIndex.key._fts;
30
+ delete dbIndex.key._ftsx;
31
+ const weights = { ...dbIndex.weights, ...dbIndex.key };
32
+ if (Object.keys(weights).length !== Object.keys(schemaIndexKeysObject).length) {
33
+ return false;
34
+ }
35
+ for (const prop of Object.keys(weights)) {
36
+ if (!(prop in schemaIndexKeysObject)) {
37
+ return false;
38
+ }
39
+ const weight = weights[prop];
40
+ if (weight !== get(options, 'weights.' + prop) && !(weight === 1 && get(options, 'weights.' + prop) == null)) {
41
+ return false;
42
+ }
43
+ }
44
+
45
+ if (options['default_language'] !== dbIndex['default_language']) {
46
+ return dbIndex['default_language'] === 'english' && options['default_language'] == null;
47
+ }
48
+
49
+ return true;
50
+ }
51
+
52
+ const optionKeys = [
53
+ 'unique',
54
+ 'partialFilterExpression',
55
+ 'sparse',
56
+ 'expireAfterSeconds',
57
+ 'collation'
58
+ ];
59
+ for (const key of optionKeys) {
60
+ if (!(key in options) && !(key in dbIndex)) {
61
+ continue;
62
+ }
63
+ if (key === 'collation') {
64
+ if (options[key] == null || dbIndex[key] == null) {
65
+ return options[key] == null && dbIndex[key] == null;
66
+ }
67
+ const definedKeys = Object.keys(options.collation);
68
+ const schemaCollation = options.collation;
69
+ const dbCollation = dbIndex.collation;
70
+ for (const opt of definedKeys) {
71
+ if (get(schemaCollation, opt) !== get(dbCollation, opt)) {
72
+ return false;
73
+ }
74
+ }
75
+ } else if (!utils.deepEqual(options[key], dbIndex[key])) {
76
+ return false;
77
+ }
78
+ }
79
+
80
+ const schemaIndexKeys = Object.keys(schemaIndexKeysObject);
81
+ const dbIndexKeys = Object.keys(dbIndex.key);
82
+ if (schemaIndexKeys.length !== dbIndexKeys.length) {
83
+ return false;
84
+ }
85
+ for (let i = 0; i < schemaIndexKeys.length; ++i) {
86
+ if (schemaIndexKeys[i] !== dbIndexKeys[i]) {
87
+ return false;
88
+ }
89
+ if (!utils.deepEqual(schemaIndexKeysObject[schemaIndexKeys[i]], dbIndex.key[dbIndexKeys[i]])) {
90
+ return false;
91
+ }
92
+ }
93
+
94
+ return true;
95
+ };
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Compares two index specifications to determine if they are equal.
5
+ *
6
+ * #### Example:
7
+ * isIndexSpecEqual({ a: 1, b: 1 }, { a: 1, b: 1 }); // true
8
+ * isIndexSpecEqual({ a: 1, b: 1 }, { b: 1, a: 1 }); // false
9
+ * isIndexSpecEqual({ a: 1, b: -1 }, { a: 1, b: 1 }); // false
10
+ *
11
+ * @param {Object} spec1 The first index specification to compare.
12
+ * @param {Object} spec2 The second index specification to compare.
13
+ * @returns {Boolean} Returns true if the index specifications are equal, otherwise returns false.
14
+ */
15
+
16
+ module.exports = function isIndexSpecEqual(spec1, spec2) {
17
+ const spec1Keys = Object.keys(spec1);
18
+ const spec2Keys = Object.keys(spec2);
19
+
20
+ if (spec1Keys.length !== spec2Keys.length) {
21
+ return false;
22
+ }
23
+
24
+ for (let i = 0; i < spec1Keys.length; i++) {
25
+ const key = spec1Keys[i];
26
+ if (key !== spec2Keys[i] || spec1[key] !== spec2[key]) {
27
+ return false;
28
+ }
29
+ }
30
+
31
+ return true;
32
+ };
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Returns `true` if the given index options have a `text` option.
5
+ */
6
+
7
+ module.exports = function isTextIndex(indexKeys) {
8
+ let isTextIndex = false;
9
+ for (const key of Object.keys(indexKeys)) {
10
+ if (indexKeys[key] === 'text') {
11
+ isTextIndex = true;
12
+ }
13
+ }
14
+
15
+ return isTextIndex;
16
+ };
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Returns `true` if the given index matches the schema's `timestamps` options
5
+ */
6
+
7
+ module.exports = function isTimeseriesIndex(dbIndex, schemaOptions) {
8
+ if (schemaOptions.timeseries == null) {
9
+ return false;
10
+ }
11
+ const { timeField, metaField } = schemaOptions.timeseries;
12
+ if (typeof timeField !== 'string' || typeof metaField !== 'string') {
13
+ return false;
14
+ }
15
+ return Object.keys(dbIndex.key).length === 2 && dbIndex.key[timeField] === 1 && dbIndex.key[metaField] === 1;
16
+ };
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ module.exports = function isAsyncFunction(v) {
4
+ return (
5
+ typeof v === 'function' &&
6
+ v.constructor &&
7
+ v.constructor.name === 'AsyncFunction'
8
+ );
9
+ };
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Get the bson type, if it exists
5
+ * @api private
6
+ */
7
+
8
+ function isBsonType(obj, typename) {
9
+ return (
10
+ obj != null &&
11
+ obj._bsontype === typename
12
+ );
13
+ }
14
+
15
+ module.exports = isBsonType;
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ const isMongooseArray = require('../types/array/isMongooseArray').isMongooseArray;
4
+ /**
5
+ * Returns if `v` is a mongoose object that has a `toObject()` method we can use.
6
+ *
7
+ * This is for compatibility with libs like Date.js which do foolish things to Natives.
8
+ *
9
+ * @param {Any} v
10
+ * @api private
11
+ */
12
+
13
+ module.exports = function(v) {
14
+ return (
15
+ v != null && (
16
+ isMongooseArray(v) || // Array or Document Array
17
+ v.$__ != null || // Document
18
+ v.isMongooseBuffer || // Buffer
19
+ v.$isMongooseMap // Map
20
+ )
21
+ );
22
+ };
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Determines if `arg` is an object.
5
+ *
6
+ * @param {Object|Array|String|Function|RegExp|any} arg
7
+ * @api private
8
+ * @return {Boolean}
9
+ */
10
+
11
+ module.exports = function(arg) {
12
+ return (
13
+ Buffer.isBuffer(arg) ||
14
+ Object.prototype.toString.call(arg) === '[object Object]'
15
+ );
16
+ };
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ module.exports = function isPOJO(arg) {
4
+ if (arg == null || typeof arg !== 'object') {
5
+ return false;
6
+ }
7
+ const proto = Object.getPrototypeOf(arg);
8
+ // Prototype may be null if you used `Object.create(null)`
9
+ // Checking `proto`'s constructor is safe because `getPrototypeOf()`
10
+ // explicitly crosses the boundary from object data to object metadata
11
+ return !proto || proto.constructor.name === 'Object';
12
+ };
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+ function isPromise(val) {
3
+ return !!val && (typeof val === 'object' || typeof val === 'function') && typeof val.then === 'function';
4
+ }
5
+
6
+ module.exports = isPromise;
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Determines if `arg` is a flat object.
5
+ *
6
+ * @param {Object|Array|String|Function|RegExp|any} arg
7
+ * @api private
8
+ * @return {Boolean}
9
+ */
10
+
11
+ module.exports = function isSimpleValidator(obj) {
12
+ const keys = Object.keys(obj);
13
+ let result = true;
14
+ for (let i = 0, len = keys.length; i < len; ++i) {
15
+ if (typeof obj[keys[i]] === 'object' && obj[keys[i]] !== null) {
16
+ result = false;
17
+ break;
18
+ }
19
+ }
20
+
21
+ return result;
22
+ };
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ const { isPOJO } = require('../utils');
4
+
5
+ module.exports = minimize;
6
+
7
+ /**
8
+ * Minimizes an object, removing undefined values and empty objects
9
+ *
10
+ * @param {Object} object to minimize
11
+ * @return {Object|undefined}
12
+ * @api private
13
+ */
14
+
15
+ function minimize(obj) {
16
+ const keys = Object.keys(obj);
17
+ let i = keys.length;
18
+ let hasKeys;
19
+ let key;
20
+ let val;
21
+
22
+ while (i--) {
23
+ key = keys[i];
24
+ val = obj[key];
25
+
26
+ if (isPOJO(val)) {
27
+ obj[key] = minimize(val);
28
+ }
29
+
30
+ if (undefined === obj[key]) {
31
+ delete obj[key];
32
+ continue;
33
+ }
34
+
35
+ hasKeys = true;
36
+ }
37
+
38
+ return hasKeys
39
+ ? obj
40
+ : undefined;
41
+ }
@@ -0,0 +1,52 @@
1
+ 'use strict';
2
+
3
+ module.exports = function applyDefaultsToPOJO(doc, schema) {
4
+ const paths = Object.keys(schema.paths);
5
+ const plen = paths.length;
6
+
7
+ for (let i = 0; i < plen; ++i) {
8
+ let curPath = '';
9
+ const p = paths[i];
10
+
11
+ const type = schema.paths[p];
12
+ const path = type.splitPath();
13
+ const len = path.length;
14
+ let doc_ = doc;
15
+ for (let j = 0; j < len; ++j) {
16
+ if (doc_ == null) {
17
+ break;
18
+ }
19
+
20
+ const piece = path[j];
21
+ curPath += (!curPath.length ? '' : '.') + piece;
22
+
23
+ if (j === len - 1) {
24
+ if (typeof doc_[piece] !== 'undefined') {
25
+ if (type.$isSingleNested) {
26
+ applyDefaultsToPOJO(doc_[piece], type.schema);
27
+ } else if (type.$isMongooseDocumentArray && Array.isArray(doc_[piece])) {
28
+ doc_[piece].forEach(el => applyDefaultsToPOJO(el, type.schema));
29
+ }
30
+
31
+ break;
32
+ }
33
+
34
+ const def = type.getDefault(doc, false, { skipCast: true });
35
+ if (typeof def !== 'undefined') {
36
+ doc_[piece] = def;
37
+
38
+ if (type.$isSingleNested) {
39
+ applyDefaultsToPOJO(def, type.schema);
40
+ } else if (type.$isMongooseDocumentArray && Array.isArray(def)) {
41
+ def.forEach(el => applyDefaultsToPOJO(el, type.schema));
42
+ }
43
+ }
44
+ } else {
45
+ if (doc_[piece] == null) {
46
+ doc_[piece] = {};
47
+ }
48
+ doc_ = doc_[piece];
49
+ }
50
+ }
51
+ }
52
+ };
@@ -0,0 +1,140 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * ignore
5
+ */
6
+
7
+ module.exports = applyHooks;
8
+
9
+ /*!
10
+ * ignore
11
+ */
12
+
13
+ applyHooks.middlewareFunctions = [
14
+ 'deleteOne',
15
+ 'remove',
16
+ 'save',
17
+ 'updateOne',
18
+ 'validate',
19
+ 'init'
20
+ ];
21
+
22
+ /*!
23
+ * ignore
24
+ */
25
+
26
+ const alreadyHookedFunctions = new Set(applyHooks.middlewareFunctions.flatMap(fn => ([fn, `$__${fn}`])));
27
+
28
+ /**
29
+ * Register hooks for this model
30
+ *
31
+ * @param {Model} model
32
+ * @param {Schema} schema
33
+ * @param {Object} options
34
+ * @api private
35
+ */
36
+
37
+ function applyHooks(model, schema, options) {
38
+ options = options || {};
39
+
40
+ const kareemOptions = {
41
+ useErrorHandlers: true,
42
+ numCallbackParams: 1,
43
+ nullResultByDefault: true,
44
+ contextParameter: true
45
+ };
46
+ const objToDecorate = options.decorateDoc ? model : model.prototype;
47
+ model.$appliedHooks = true;
48
+ for (const key of Object.keys(schema.paths)) {
49
+ let type = schema.paths[key];
50
+ let childModel = null;
51
+
52
+ const result = findChildModel(type);
53
+ if (result) {
54
+ childModel = result.childModel;
55
+ type = result.type;
56
+ } else {
57
+ continue;
58
+ }
59
+
60
+ if (childModel.$appliedHooks) {
61
+ continue;
62
+ }
63
+
64
+ applyHooks(childModel, type.schema, {
65
+ ...options,
66
+ decorateDoc: false,
67
+ isChildSchema: true
68
+ });
69
+ if (childModel.discriminators != null) {
70
+ const keys = Object.keys(childModel.discriminators);
71
+ for (const key of keys) {
72
+ applyHooks(childModel.discriminators[key],
73
+ childModel.discriminators[key].schema, options);
74
+ }
75
+ }
76
+ }
77
+
78
+ // Built-in hooks rely on hooking internal functions in order to support
79
+ // promises and make it so that `doc.save.toString()` provides meaningful
80
+ // information.
81
+
82
+ const middleware = schema._getDocumentMiddleware();
83
+
84
+ model._middleware = middleware;
85
+
86
+ objToDecorate.$__init = middleware.
87
+ createWrapperSync('init', objToDecorate.$__init, null, kareemOptions);
88
+
89
+ // Support hooks for custom methods
90
+ const customMethods = Object.keys(schema.methods);
91
+ const customMethodOptions = Object.assign({}, kareemOptions, {
92
+ // Only use `checkForPromise` for custom methods, because mongoose
93
+ // query thunks are not as consistent as I would like about returning
94
+ // a nullish value rather than the query. If a query thunk returns
95
+ // a query, `checkForPromise` causes infinite recursion
96
+ checkForPromise: true
97
+ });
98
+ for (const method of customMethods) {
99
+ if (alreadyHookedFunctions.has(method)) {
100
+ continue;
101
+ }
102
+ if (!middleware.hasHooks(method)) {
103
+ // Don't wrap if there are no hooks for the custom method to avoid
104
+ // surprises. Also, `createWrapper()` enforces consistent async,
105
+ // so wrapping a sync method would break it.
106
+ continue;
107
+ }
108
+ const originalMethod = objToDecorate[method];
109
+ objToDecorate[`$__${method}`] = objToDecorate[method];
110
+ objToDecorate[method] = middleware.
111
+ createWrapper(method, originalMethod, null, customMethodOptions);
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Check if there is an embedded schematype in the given schematype. Handles drilling down into primitive
117
+ * arrays and maps in case of array of array of subdocs or map of subdocs.
118
+ *
119
+ * @param {SchemaType} curType
120
+ * @returns {{ childModel: Model | typeof Subdocument, curType: SchemaType } | null}
121
+ */
122
+
123
+ function findChildModel(curType) {
124
+ if (curType.$isSingleNested || curType.$isMongooseDocumentArray) {
125
+ return { childModel: curType.Constructor, type: curType };
126
+ }
127
+ if (curType.instance === 'Array') {
128
+ const embedded = curType.getEmbeddedSchemaType();
129
+ if (embedded) {
130
+ return findChildModel(embedded);
131
+ }
132
+ }
133
+ if (curType.instance === 'Map') {
134
+ const mapType = curType.getEmbeddedSchemaType();
135
+ if (mapType) {
136
+ return findChildModel(mapType);
137
+ }
138
+ }
139
+ return null;
140
+ }
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ const get = require('../get');
4
+ const utils = require('../../utils');
5
+
6
+ /**
7
+ * Register methods for this model
8
+ *
9
+ * @param {Model} model
10
+ * @param {Schema} schema
11
+ * @api private
12
+ */
13
+
14
+ module.exports = function applyMethods(model, schema) {
15
+ const Model = require('../../model');
16
+
17
+ function apply(method, schema) {
18
+ Object.defineProperty(model.prototype, method, {
19
+ get: function() {
20
+ const h = {};
21
+ for (const k in schema.methods[method]) {
22
+ h[k] = schema.methods[method][k].bind(this);
23
+ }
24
+ return h;
25
+ },
26
+ configurable: true
27
+ });
28
+ }
29
+ for (const method of Object.keys(schema.methods)) {
30
+ const fn = schema.methods[method];
31
+ if (Object.hasOwn(schema.tree, method)) {
32
+ throw new Error('You have a method and a property in your schema both ' +
33
+ 'named "' + method + '"');
34
+ }
35
+
36
+ // Avoid making custom methods if user sets a method to itself, e.g.
37
+ // `schema.method(save, Document.prototype.save)`. Can happen when
38
+ // calling `loadClass()` with a class that `extends Document`. See gh-12254
39
+ if (typeof fn === 'function' &&
40
+ Model.prototype[method] === fn) {
41
+ delete schema.methods[method];
42
+ continue;
43
+ }
44
+
45
+ if (schema.reserved[method] &&
46
+ !get(schema, `methodOptions.${method}.suppressWarning`, false)) {
47
+ utils.warn(`mongoose: the method name "${method}" is used by mongoose ` +
48
+ 'internally, overwriting it may cause bugs. If you\'re sure you know ' +
49
+ 'what you\'re doing, you can suppress this error by using ' +
50
+ `\`schema.method('${method}', fn, { suppressWarning: true })\`.`);
51
+ }
52
+ if (typeof fn === 'function') {
53
+ model.prototype[method] = fn;
54
+ } else {
55
+ apply(method, schema);
56
+ }
57
+ }
58
+
59
+ // Recursively call `applyMethods()` on child schemas
60
+ model.$appliedMethods = true;
61
+ for (const key of Object.keys(schema.paths)) {
62
+ const type = schema.paths[key];
63
+ if (type.$isSingleNested && !type.Constructor.$appliedMethods) {
64
+ applyMethods(type.Constructor, type.schema);
65
+ }
66
+ if (type.$isMongooseDocumentArray && !type.Constructor.$appliedMethods) {
67
+ applyMethods(type.Constructor, type.schema);
68
+ }
69
+ }
70
+ };
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ const { queryMiddlewareFunctions, aggregateMiddlewareFunctions, modelMiddlewareFunctions, documentMiddlewareFunctions } = require('../../constants');
4
+
5
+ const middlewareFunctions = Array.from(
6
+ new Set([
7
+ ...queryMiddlewareFunctions,
8
+ ...aggregateMiddlewareFunctions,
9
+ ...modelMiddlewareFunctions,
10
+ ...documentMiddlewareFunctions
11
+ ])
12
+ );
13
+
14
+ module.exports = function applyStaticHooks(model, hooks, statics) {
15
+ hooks = hooks.filter(hook => {
16
+ // If the custom static overwrites an existing middleware, don't apply
17
+ // middleware to it by default. This avoids a potential backwards breaking
18
+ // change with plugins like `mongoose-delete` that use statics to overwrite
19
+ // built-in Mongoose functions.
20
+ if (middlewareFunctions.indexOf(hook.name) !== -1) {
21
+ return !!hook.model;
22
+ }
23
+ return hook.model !== false;
24
+ });
25
+
26
+ for (const key of Object.keys(statics)) {
27
+ if (hooks.hasHooks(key)) {
28
+ const original = model[key];
29
+
30
+ model[key] = hooks.createWrapper(key, original);
31
+ }
32
+ }
33
+ };
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Register statics for this model
5
+ * @param {Model} model
6
+ * @param {Schema} schema
7
+ * @api private
8
+ */
9
+ module.exports = function applyStatics(model, schema) {
10
+ for (const i in schema.statics) {
11
+ model[i] = schema.statics[i];
12
+ }
13
+ };