@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,28 @@
1
+ 'use strict';
2
+
3
+ const get = require('../get');
4
+
5
+ module.exports = function getKeysInSchemaOrder(schema, val, path) {
6
+ const schemaKeys = path != null ? Object.keys(get(schema.tree, path, {})) : Object.keys(schema.tree);
7
+ const valKeys = new Set(Object.keys(val));
8
+
9
+ let keys;
10
+ if (valKeys.size > 1) {
11
+ keys = new Set();
12
+ for (const key of schemaKeys) {
13
+ if (valKeys.has(key)) {
14
+ keys.add(key);
15
+ }
16
+ }
17
+ for (const key of valKeys) {
18
+ if (!keys.has(key)) {
19
+ keys.add(key);
20
+ }
21
+ }
22
+ keys = Array.from(keys);
23
+ } else {
24
+ keys = Array.from(valKeys);
25
+ }
26
+
27
+ return keys;
28
+ };
@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+
3
+ const numberRE = /^\d+$/;
4
+
5
+ /**
6
+ * Behaves like `Schema#path()`, except for it also digs into arrays without
7
+ * needing to put `.0.`, so `getPath(schema, 'docArr.elProp')` works.
8
+ * @api private
9
+ */
10
+
11
+ module.exports = function getPath(schema, path, discriminatorValueMap) {
12
+ let schematype = schema.path(path);
13
+ if (schematype != null) {
14
+ return schematype;
15
+ }
16
+ const pieces = path.split('.');
17
+ let cur = '';
18
+ let isArray = false;
19
+
20
+ for (const piece of pieces) {
21
+ if (isArray && numberRE.test(piece)) {
22
+ continue;
23
+ }
24
+ cur = cur.length === 0 ? piece : cur + '.' + piece;
25
+
26
+ schematype = schema.path(cur);
27
+ if (schematype?.schema) {
28
+ schema = schematype.schema;
29
+ if (!isArray && schematype.$isMongooseDocumentArray) {
30
+ isArray = true;
31
+ }
32
+ if (discriminatorValueMap && discriminatorValueMap[cur]) {
33
+ schema = schema.discriminators[discriminatorValueMap[cur]] ?? schema;
34
+ }
35
+ cur = '';
36
+ } else if (schematype?.instance === 'Mixed') {
37
+ // If we found a mixed path, no point in digging further, the end result is always Mixed
38
+ break;
39
+ }
40
+ }
41
+
42
+ return schematype;
43
+ };
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Find the `strict` mode setting for the deepest subdocument along a given path
5
+ * to ensure we have the correct default value for `strict`. When setting values
6
+ * underneath a subdocument, we should use the subdocument's `strict` setting by
7
+ * default, not the top-level document's.
8
+ *
9
+ * @param {Schema} schema
10
+ * @param {String[]} parts
11
+ * @returns {boolean | 'throw' | undefined}
12
+ */
13
+
14
+ module.exports = function getSubdocumentStrictValue(schema, parts) {
15
+ if (parts.length === 1) {
16
+ return undefined;
17
+ }
18
+ let cur = parts[0];
19
+ let strict = undefined;
20
+ for (let i = 0; i < parts.length - 1; ++i) {
21
+ const curSchemaType = schema.path(cur);
22
+ if (curSchemaType?.schema) {
23
+ strict = curSchemaType.schema.options.strict;
24
+ schema = curSchemaType.schema;
25
+ cur = curSchemaType.$isMongooseDocumentArray && !isNaN(parts[i + 1]) ? '' : parts[i + 1];
26
+ } else {
27
+ cur += cur.length ? ('.' + parts[i + 1]) : parts[i + 1];
28
+ }
29
+ }
30
+
31
+ return strict;
32
+ };
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ const addAutoId = require('./addAutoId');
4
+
5
+ module.exports = function handleIdOption(schema, options) {
6
+ if (options?._id == null) {
7
+ return schema;
8
+ }
9
+
10
+ schema = schema.clone();
11
+ if (!options._id) {
12
+ schema.remove('_id');
13
+ schema.options._id = false;
14
+ } else if (!schema.paths['_id']) {
15
+ addAutoId(schema);
16
+ schema.options._id = true;
17
+ }
18
+
19
+ return schema;
20
+ };
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ module.exports = handleTimestampOption;
4
+
5
+ /*!
6
+ * ignore
7
+ */
8
+
9
+ function handleTimestampOption(arg, prop) {
10
+ if (arg == null) {
11
+ return null;
12
+ }
13
+
14
+ if (typeof arg === 'boolean') {
15
+ return prop;
16
+ }
17
+ if (typeof arg[prop] === 'boolean') {
18
+ return arg[prop] ? prop : null;
19
+ }
20
+ if (!(prop in arg)) {
21
+ return prop;
22
+ }
23
+ return arg[prop];
24
+ }
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * ignore
5
+ */
6
+
7
+ module.exports = function addIdGetter(schema) {
8
+ // ensure the documents receive an id getter unless disabled
9
+ const autoIdGetter = !schema.paths['id'] &&
10
+ schema.paths['_id'] &&
11
+ schema.options.id;
12
+ if (!autoIdGetter) {
13
+ return schema;
14
+ }
15
+ if (schema.aliases?.id) {
16
+ return schema;
17
+ }
18
+ schema.virtual('id').get(idGetter);
19
+
20
+ return schema;
21
+ };
22
+
23
+ /**
24
+ * Returns this documents _id cast to a string.
25
+ * @api private
26
+ */
27
+
28
+ function idGetter() {
29
+ if (this._id != null) {
30
+ return this._id.toString();
31
+ }
32
+
33
+ return null;
34
+ }
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ module.exports = function merge(s1, s2, skipConflictingPaths) {
4
+ const paths = Object.keys(s2.tree);
5
+ const pathsToAdd = {};
6
+ for (const key of paths) {
7
+ if (skipConflictingPaths && (s1.paths[key] || s1.nested[key] || s1.singleNestedPaths[key])) {
8
+ continue;
9
+ }
10
+ pathsToAdd[key] = s2.tree[key];
11
+ }
12
+ s1.options._isMerging = true;
13
+ s1.add(pathsToAdd, null);
14
+ delete s1.options._isMerging;
15
+
16
+ s1.callQueue = s1.callQueue.concat(s2.callQueue);
17
+ s1.method(s2.methods);
18
+ s1.static(s2.statics);
19
+
20
+ for (const [option, value] of Object.entries(s2._userProvidedOptions)) {
21
+ if (!(option in s1._userProvidedOptions)) {
22
+ s1.set(option, value);
23
+ }
24
+ }
25
+
26
+ for (const query in s2.query) {
27
+ s1.query[query] = s2.query[query];
28
+ }
29
+
30
+ for (const virtual in s2.virtuals) {
31
+ s1.virtuals[virtual] = s2.virtuals[virtual].clone();
32
+ }
33
+
34
+ s1._indexes = s1._indexes.concat(s2._indexes || []);
35
+ s1.s.hooks.merge(s2.s.hooks, false);
36
+ };
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ const StrictModeError = require('../../error/strict');
4
+
5
+ /*!
6
+ * ignore
7
+ */
8
+
9
+ module.exports = function(schematype) {
10
+ if (schematype.$immutable) {
11
+ schematype.$immutableSetter = createImmutableSetter(schematype.path,
12
+ schematype.options.immutable);
13
+ schematype.set(schematype.$immutableSetter);
14
+ } else if (schematype.$immutableSetter) {
15
+ schematype.setters = schematype.setters.
16
+ filter(fn => fn !== schematype.$immutableSetter);
17
+ delete schematype.$immutableSetter;
18
+ }
19
+ };
20
+
21
+ function createImmutableSetter(path, immutable) {
22
+ return function immutableSetter(v, _priorVal, _doc, options) {
23
+ if (this == null || this.$__ == null) {
24
+ return v;
25
+ }
26
+ if (this.isNew) {
27
+ return v;
28
+ }
29
+ if (options?.overwriteImmutable) {
30
+ return v;
31
+ }
32
+
33
+ const _immutable = typeof immutable === 'function' ?
34
+ immutable.call(this, this) :
35
+ immutable;
36
+ if (!_immutable) {
37
+ return v;
38
+ }
39
+
40
+ const _value = this.$__.priorDoc != null ?
41
+ this.$__.priorDoc.$__getValue(path) :
42
+ this.$__getValue(path);
43
+ if (this.$__.strictMode === 'throw' && v !== _value) {
44
+ throw new StrictModeError(path, 'Path `' + path + '` is immutable ' +
45
+ 'and strict mode is set to throw.', true);
46
+ }
47
+
48
+ return _value;
49
+ };
50
+ }
@@ -0,0 +1,158 @@
1
+ 'use strict';
2
+ const get = require('./get');
3
+
4
+ /**
5
+ * Applies defaults to update and findOneAndUpdate operations.
6
+ *
7
+ * @param {Object} filter
8
+ * @param {Schema} schema
9
+ * @param {Object} castedDoc
10
+ * @param {Object} options
11
+ * @method setDefaultsOnInsert
12
+ * @api private
13
+ */
14
+
15
+ module.exports = function(filter, schema, castedDoc, options) {
16
+ options = options || {};
17
+
18
+ const shouldSetDefaultsOnInsert = options.setDefaultsOnInsert ?? schema.base.options.setDefaultsOnInsert;
19
+
20
+ if (!options.upsert || shouldSetDefaultsOnInsert === false) {
21
+ return castedDoc;
22
+ }
23
+
24
+ const keys = Object.keys(castedDoc || {});
25
+ const updatedKeys = {};
26
+ const updatedValues = {};
27
+ const numKeys = keys.length;
28
+
29
+ let hasDollarUpdate = false;
30
+
31
+ for (let i = 0; i < numKeys; ++i) {
32
+ if (keys[i].charAt(0) === '$') {
33
+ hasDollarUpdate = true;
34
+ break;
35
+ }
36
+ }
37
+
38
+ const paths = Object.keys(filter);
39
+ const numPaths = paths.length;
40
+ for (let i = 0; i < numPaths; ++i) {
41
+ const path = paths[i];
42
+ const condition = filter[path];
43
+ if (condition && typeof condition === 'object') {
44
+ const conditionKeys = Object.keys(condition);
45
+ const numConditionKeys = conditionKeys.length;
46
+ let hasDollarKey = false;
47
+ for (let j = 0; j < numConditionKeys; ++j) {
48
+ if (conditionKeys[j].charAt(0) === '$') {
49
+ hasDollarKey = true;
50
+ break;
51
+ }
52
+ }
53
+ if (hasDollarKey) {
54
+ continue;
55
+ }
56
+ }
57
+ updatedKeys[path] = true;
58
+ }
59
+
60
+ if (options?.overwrite && !hasDollarUpdate) {
61
+ // Defaults will be set later, since we're overwriting we'll cast
62
+ // the whole update to a document
63
+ return castedDoc;
64
+ }
65
+
66
+ schema.eachPath(function(path, schemaType) {
67
+ // Skip single nested paths if underneath a map
68
+ if (schemaType.path === '_id' && schemaType.options.auto) {
69
+ return;
70
+ }
71
+ const def = schemaType.getDefault(null, true);
72
+ if (typeof def === 'undefined') {
73
+ return;
74
+ }
75
+ const pathPieces = schemaType.splitPath();
76
+ if (pathPieces.includes('$*')) {
77
+ // Skip defaults underneath maps. We should never do `$setOnInsert` on a path with `$*`
78
+ return;
79
+ }
80
+ if (isModified(castedDoc, updatedKeys, path, pathPieces, hasDollarUpdate)) {
81
+ return;
82
+ }
83
+
84
+ castedDoc = castedDoc || {};
85
+ castedDoc.$setOnInsert = castedDoc.$setOnInsert || {};
86
+ if (get(castedDoc, path) == null) {
87
+ castedDoc.$setOnInsert[path] = def;
88
+ }
89
+ updatedValues[path] = def;
90
+ });
91
+
92
+ return castedDoc;
93
+ };
94
+
95
+ function isModified(castedDoc, updatedKeys, path, pathPieces, hasDollarUpdate) {
96
+ // Check if path is in filter (updatedKeys)
97
+ if (updatedKeys[path]) {
98
+ return true;
99
+ }
100
+
101
+ // Check if any parent path is in filter
102
+ let cur = pathPieces[0];
103
+ for (let i = 1; i < pathPieces.length; ++i) {
104
+ if (updatedKeys[cur]) {
105
+ return true;
106
+ }
107
+ cur += '.' + pathPieces[i];
108
+ }
109
+
110
+ // Check if path is modified in the update
111
+ if (hasDollarUpdate) {
112
+ // Check each update operator
113
+ for (const key in castedDoc) {
114
+ if (key.charAt(0) === '$') {
115
+ if (pathExistsInUpdate(castedDoc[key], path, pathPieces)) {
116
+ return true;
117
+ }
118
+ }
119
+ }
120
+ } else {
121
+ // No dollar operators, check the castedDoc directly
122
+ if (pathExistsInUpdate(castedDoc, path, pathPieces)) {
123
+ return true;
124
+ }
125
+ }
126
+
127
+ return false;
128
+ }
129
+
130
+ function pathExistsInUpdate(update, targetPath, pathPieces) {
131
+ if (update == null || typeof update !== 'object') {
132
+ return false;
133
+ }
134
+
135
+ // Check exact match
136
+ if (Object.hasOwn(update, targetPath)) {
137
+ return true;
138
+ }
139
+
140
+ // Check if any parent path exists
141
+ let cur = pathPieces[0];
142
+ for (let i = 1; i < pathPieces.length; ++i) {
143
+ if (Object.hasOwn(update, cur)) {
144
+ return true;
145
+ }
146
+ cur += '.' + pathPieces[i];
147
+ }
148
+
149
+ // Check if any child path exists (e.g., path is "a" and update has "a.b")
150
+ const prefix = targetPath + '.';
151
+ for (const key in update) {
152
+ if (key.startsWith(prefix)) {
153
+ return true;
154
+ }
155
+ }
156
+
157
+ return false;
158
+ }
@@ -0,0 +1,3 @@
1
+ 'use strict';
2
+
3
+ module.exports = new Set(['__proto__', 'constructor', 'prototype']);
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ exports.arrayAtomicsBackupSymbol = Symbol('mongoose#Array#atomicsBackup');
4
+ exports.arrayAtomicsSymbol = Symbol('mongoose#Array#_atomics');
5
+ exports.arrayParentSymbol = Symbol('mongoose#Array#_parent');
6
+ exports.arrayPathSymbol = Symbol('mongoose#Array#_path');
7
+ exports.arraySchemaSymbol = Symbol('mongoose#Array#_schema');
8
+ exports.documentArrayParent = Symbol('mongoose#documentArrayParent');
9
+ exports.documentIsSelected = Symbol('mongoose#Document#isSelected');
10
+ exports.documentIsModified = Symbol('mongoose#Document#isModified');
11
+ exports.documentModifiedPaths = Symbol('mongoose#Document#modifiedPaths');
12
+ exports.documentSchemaSymbol = Symbol('mongoose#Document#schema');
13
+ exports.getSymbol = Symbol('mongoose#Document#get');
14
+ exports.modelSymbol = Symbol('mongoose#Model');
15
+ exports.objectIdSymbol = Symbol('mongoose#ObjectId');
16
+ exports.populateModelSymbol = Symbol('mongoose#PopulateOptions#Model');
17
+ exports.schemaTypeSymbol = Symbol('mongoose#schemaType');
18
+ exports.sessionNewDocuments = Symbol('mongoose#ClientSession#newDocuments');
19
+ exports.scopeSymbol = Symbol('mongoose#Document#scope');
20
+ exports.validatorErrorSymbol = Symbol('mongoose#validatorError');
@@ -0,0 +1,3 @@
1
+ 'use strict';
2
+
3
+ exports.setTimeout = setTimeout;
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ module.exports = function setDocumentTimestamps(doc, timestampOption, currentTime, createdAt, updatedAt) {
4
+ const skipUpdatedAt = timestampOption?.updatedAt === false;
5
+ const skipCreatedAt = timestampOption?.createdAt === false;
6
+
7
+ const defaultTimestamp = currentTime != null ?
8
+ currentTime() :
9
+ doc.ownerDocument().constructor.base.now();
10
+
11
+ if (!skipCreatedAt &&
12
+ (doc.isNew || doc.$isSubdocument) &&
13
+ createdAt &&
14
+ !doc.$__getValue(createdAt) &&
15
+ doc.$__isSelected(createdAt)) {
16
+ doc.$set(createdAt, defaultTimestamp, undefined, { overwriteImmutable: true });
17
+ }
18
+
19
+ if (!skipUpdatedAt && updatedAt && (doc.isNew || doc.$isModified())) {
20
+ let ts = defaultTimestamp;
21
+ if (doc.isNew && createdAt != null) {
22
+ ts = doc.$__getValue(createdAt);
23
+ }
24
+ doc.$set(updatedAt, ts);
25
+ }
26
+ };
@@ -0,0 +1,116 @@
1
+ 'use strict';
2
+
3
+ const applyTimestampsToChildren = require('../update/applyTimestampsToChildren');
4
+ const applyTimestampsToUpdate = require('../update/applyTimestampsToUpdate');
5
+ const get = require('../get');
6
+ const handleTimestampOption = require('../schema/handleTimestampOption');
7
+ const setDocumentTimestamps = require('./setDocumentTimestamps');
8
+ const symbols = require('../../schema/symbols');
9
+
10
+ const replaceOps = new Set([
11
+ 'replaceOne',
12
+ 'findOneAndReplace'
13
+ ]);
14
+
15
+ module.exports = function setupTimestamps(schema, timestamps) {
16
+ const childHasTimestamp = schema.childSchemas.find(withTimestamp);
17
+ function withTimestamp(s) {
18
+ const ts = s.schema.options.timestamps;
19
+ return !!ts;
20
+ }
21
+ if (!timestamps && !childHasTimestamp) {
22
+ return;
23
+ }
24
+ const createdAt = handleTimestampOption(timestamps, 'createdAt');
25
+ const updatedAt = handleTimestampOption(timestamps, 'updatedAt');
26
+ const currentTime = timestamps != null && Object.hasOwn(timestamps, 'currentTime') ?
27
+ timestamps.currentTime :
28
+ null;
29
+ const schemaAdditions = {};
30
+
31
+ schema.$timestamps = { createdAt: createdAt, updatedAt: updatedAt };
32
+
33
+ if (createdAt && !schema.paths[createdAt]) {
34
+ const baseImmutableCreatedAt = schema.base?.get('timestamps.createdAt.immutable') ?? null;
35
+ const immutable = baseImmutableCreatedAt ?? true;
36
+ schemaAdditions[createdAt] = { [schema.options.typeKey || 'type']: Date, immutable };
37
+ }
38
+
39
+ if (updatedAt && !schema.paths[updatedAt]) {
40
+ schemaAdditions[updatedAt] = Date;
41
+ }
42
+
43
+ schema.add(schemaAdditions);
44
+
45
+ schema.pre('save', function timestampsPreSave() {
46
+ const timestampOption = get(this, '$__.saveOptions.timestamps');
47
+ if (timestampOption === false) {
48
+ return;
49
+ }
50
+
51
+ setDocumentTimestamps(this, timestampOption, currentTime, createdAt, updatedAt);
52
+ });
53
+
54
+ schema.methods.initializeTimestamps = function(timestampsOptions) {
55
+ if (timestampsOptions === false) {
56
+ return this;
57
+ }
58
+ const ts = currentTime != null ?
59
+ currentTime() : this.constructor.base.now();
60
+
61
+ const initTimestampsCreatedAt = timestampsOptions != null ?
62
+ handleTimestampOption(timestampsOptions, 'createdAt') :
63
+ createdAt;
64
+ const initTimestampsUpdatedAt = timestampsOptions != null ?
65
+ handleTimestampOption(timestampsOptions, 'updatedAt') :
66
+ updatedAt;
67
+
68
+ if (initTimestampsCreatedAt && !this.get(initTimestampsCreatedAt)) {
69
+ this.$set(createdAt, ts);
70
+ }
71
+ if (initTimestampsUpdatedAt && !this.get(initTimestampsUpdatedAt)) {
72
+ this.$set(updatedAt, ts);
73
+ }
74
+ if (this.$isSubdocument) {
75
+ return this;
76
+ }
77
+
78
+ const subdocs = this.$getAllSubdocs();
79
+ for (const subdoc of subdocs) {
80
+ if (subdoc.initializeTimestamps) {
81
+ subdoc.initializeTimestamps(timestampsOptions);
82
+ }
83
+ }
84
+
85
+ return this;
86
+ };
87
+
88
+ _setTimestampsOnUpdate[symbols.builtInMiddleware] = true;
89
+
90
+ const opts = { query: true, model: false };
91
+ schema.pre('findOneAndReplace', opts, _setTimestampsOnUpdate);
92
+ schema.pre('findOneAndUpdate', opts, _setTimestampsOnUpdate);
93
+ schema.pre('replaceOne', opts, _setTimestampsOnUpdate);
94
+ schema.pre('update', opts, _setTimestampsOnUpdate);
95
+ schema.pre('updateOne', opts, _setTimestampsOnUpdate);
96
+ schema.pre('updateMany', opts, _setTimestampsOnUpdate);
97
+
98
+ function _setTimestampsOnUpdate() {
99
+ const now = currentTime != null ?
100
+ currentTime() :
101
+ this.model.base.now();
102
+ // Replacing with null update should still trigger timestamps
103
+ if (replaceOps.has(this.op) && this.getUpdate() == null) {
104
+ this.setUpdate({});
105
+ }
106
+ applyTimestampsToUpdate(
107
+ now,
108
+ createdAt,
109
+ updatedAt,
110
+ this.getUpdate(),
111
+ this._mongooseOptions,
112
+ replaceOps.has(this.op)
113
+ );
114
+ applyTimestampsToChildren(now, this.getUpdate(), this.model.schema);
115
+ }
116
+ };
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ const getConstructorName = require('../getConstructorName');
4
+
5
+ module.exports = function allServersUnknown(topologyDescription) {
6
+ if (getConstructorName(topologyDescription) !== 'TopologyDescription') {
7
+ return false;
8
+ }
9
+
10
+ const servers = Array.from(topologyDescription.servers.values());
11
+ return servers.length > 0 && servers.every(server => server.type === 'Unknown');
12
+ };
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ const getConstructorName = require('../getConstructorName');
4
+
5
+ /**
6
+ * @typedef { import('mongodb').TopologyDescription } TopologyDescription
7
+ */
8
+
9
+ /**
10
+ * Checks if topologyDescription contains servers connected to an atlas instance
11
+ *
12
+ * @param {TopologyDescription} topologyDescription
13
+ * @returns {boolean}
14
+ */
15
+ module.exports = function isAtlas(topologyDescription) {
16
+ if (getConstructorName(topologyDescription) !== 'TopologyDescription') {
17
+ return false;
18
+ }
19
+
20
+ if (topologyDescription.servers.size === 0) {
21
+ return false;
22
+ }
23
+
24
+ for (const server of topologyDescription.servers.values()) {
25
+ if (server.host.endsWith('.mongodb.net') === false || server.port !== 27017) {
26
+ return false;
27
+ }
28
+ }
29
+
30
+ return true;
31
+ };
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ const getConstructorName = require('../getConstructorName');
4
+
5
+ const nonSSLMessage = 'Client network socket disconnected before secure TLS ' +
6
+ 'connection was established';
7
+
8
+ module.exports = function isSSLError(topologyDescription) {
9
+ if (getConstructorName(topologyDescription) !== 'TopologyDescription') {
10
+ return false;
11
+ }
12
+
13
+ const descriptions = Array.from(topologyDescription.servers.values());
14
+ return descriptions.length > 0 &&
15
+ descriptions.every(descr => descr.error && descr.error.message.indexOf(nonSSLMessage) !== -1);
16
+ };