@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,419 @@
1
+ 'use strict';
2
+
3
+ const MongooseError = require('../error/mongooseError');
4
+ const clone = require('../helpers/clone');
5
+ const deepEqual = require('../utils').deepEqual;
6
+ const getConstructorName = require('../helpers/getConstructorName');
7
+ const handleSpreadDoc = require('../helpers/document/handleSpreadDoc');
8
+ const util = require('util');
9
+ const specialProperties = require('../helpers/specialProperties');
10
+ const isBsonType = require('../helpers/isBsonType');
11
+ const cleanModifiedSubpaths = require('../helpers/document/cleanModifiedSubpaths');
12
+
13
+ const populateModelSymbol = require('../helpers/symbols').populateModelSymbol;
14
+
15
+ /*!
16
+ * ignore
17
+ */
18
+
19
+ class MongooseMap extends Map {
20
+ constructor(v, path, doc, schemaType, options) {
21
+ if (getConstructorName(v) === 'Object') {
22
+ v = Object.keys(v).reduce((arr, key) => arr.concat([[key, v[key]]]), []);
23
+ }
24
+ super(v);
25
+ this.$__parent = doc?.$__ != null ? doc : null;
26
+
27
+ // Calculate the full path from the root document
28
+ // Priority: parent.$basePath (from subdoc) > options.path (from parent map/structure) > path (schema path)
29
+ // Subdocuments have the most up-to-date path info, so prefer that over options.path
30
+ if (this.$__parent?.$isSingleNested && this.$__parent.$basePath) {
31
+ this.$__path = this.$__parent.$basePath + '.' + path;
32
+ // Performance optimization: store path relative to parent subdocument
33
+ // to avoid string operations in set() hot path
34
+ this.$__pathRelativeToParent = path;
35
+ } else if (options?.path) {
36
+ this.$__path = options.path;
37
+ this.$__pathRelativeToParent = null;
38
+ } else {
39
+ this.$__path = path;
40
+ this.$__pathRelativeToParent = null;
41
+ }
42
+
43
+ this.$__schemaType = schemaType;
44
+
45
+ this.$__runDeferred();
46
+ }
47
+
48
+ $init(key, value) {
49
+ checkValidKey(key);
50
+
51
+ super.set(key, value);
52
+
53
+ if (value?.$isSingleNested) {
54
+ value.$basePath = this.$__path + '.' + key;
55
+ // Store the path relative to parent subdoc for efficient markModified()
56
+ if (this.$__pathRelativeToParent != null) {
57
+ // Map's parent is a subdocument, store path relative to that subdoc
58
+ value.$pathRelativeToParent = this.$__pathRelativeToParent + '.' + key;
59
+ } else {
60
+ // Map's parent is root document, store the full path
61
+ value.$pathRelativeToParent = this.$__path + '.' + key;
62
+ }
63
+ }
64
+ }
65
+
66
+ $__set(key, value) {
67
+ super.set(key, value);
68
+ }
69
+
70
+ /**
71
+ * Overwrites native Map's `get()` function to support Mongoose getters.
72
+ *
73
+ * @api public
74
+ * @method get
75
+ * @memberOf Map
76
+ */
77
+
78
+ get(key, options) {
79
+ if (isBsonType(key, 'ObjectId')) {
80
+ key = key.toString();
81
+ }
82
+
83
+ options = options || {};
84
+ if (options.getters === false) {
85
+ return super.get(key);
86
+ }
87
+ return this.$__schemaType.applyGetters(super.get(key), this.$__parent);
88
+ }
89
+
90
+ /**
91
+ * Overwrites native Map's `set()` function to support setters, `populate()`,
92
+ * and change tracking. Note that Mongoose maps _only_ support strings and
93
+ * ObjectIds as keys.
94
+ *
95
+ * Keys also cannot:
96
+ * - be named after special properties `prototype`, `constructor`, and `__proto__`
97
+ * - start with a dollar sign (`$`)
98
+ * - contain any dots (`.`)
99
+ *
100
+ * #### Example:
101
+ *
102
+ * doc.myMap.set('test', 42); // works
103
+ * doc.myMap.set({ obj: 42 }, 42); // Throws "Mongoose maps only support string keys"
104
+ * doc.myMap.set(10, 42); // Throws "Mongoose maps only support string keys"
105
+ * doc.myMap.set("$test", 42); // Throws "Mongoose maps do not support keys that start with "$", got "$test""
106
+ *
107
+ * @api public
108
+ * @method set
109
+ * @memberOf Map
110
+ */
111
+
112
+ set(key, value) {
113
+ if (isBsonType(key, 'ObjectId')) {
114
+ key = key.toString();
115
+ }
116
+
117
+ checkValidKey(key);
118
+ value = handleSpreadDoc(value);
119
+
120
+ // Weird, but because you can't assign to `this` before calling `super()`
121
+ // you can't get access to `$__schemaType` to cast in the initial call to
122
+ // `set()` from the `super()` constructor.
123
+
124
+ if (this.$__schemaType == null) {
125
+ this.$__deferred = this.$__deferred || [];
126
+ this.$__deferred.push({ key: key, value: value });
127
+ return;
128
+ }
129
+
130
+ let _fullPath;
131
+ const parent = this.$__parent;
132
+ const populated = parent?.$__?.populated ?
133
+ parent.$populated(fullPath.call(this), true) || parent.$populated(this.$__path, true) :
134
+ null;
135
+ const priorVal = this.get(key);
136
+
137
+ if (populated != null) {
138
+ if (this.$__schemaType.$isSingleNested) {
139
+ throw new MongooseError(
140
+ 'Cannot manually populate single nested subdoc underneath Map ' +
141
+ `at path "${this.$__path}". Try using an array instead of a Map.`
142
+ );
143
+ }
144
+ if (Array.isArray(value) && this.$__schemaType.$isMongooseArray) {
145
+ value = value.map(v => {
146
+ if (v.$__ == null) {
147
+ v = new populated.options[populateModelSymbol](v);
148
+ }
149
+ // Doesn't support single nested "in-place" populate
150
+ v.$__.wasPopulated = { value: v._doc._id };
151
+ return v;
152
+ });
153
+ } else if (value != null) {
154
+ if (value.$__ == null) {
155
+ value = new populated.options[populateModelSymbol](value);
156
+ }
157
+ // Doesn't support single nested "in-place" populate
158
+ value.$__.wasPopulated = { value: value._doc._id };
159
+ }
160
+ } else {
161
+ try {
162
+ let options = null;
163
+ if (this.$__schemaType.$isMongooseDocumentArray || this.$__schemaType.$isSingleNested || this.$__schemaType.$isMongooseArray || this.$__schemaType.$isSchemaMap) {
164
+ options = { path: fullPath.call(this) };
165
+ // For subdocuments, also pass the relative path to avoid string operations
166
+ if (this.$__schemaType.$isSingleNested) {
167
+ options.pathRelativeToParent = this.$__pathRelativeToParent != null ?
168
+ this.$__pathRelativeToParent + '.' + key :
169
+ this.$__path + '.' + key;
170
+ }
171
+ }
172
+ value = this.$__schemaType.applySetters(
173
+ value,
174
+ this.$__parent,
175
+ false,
176
+ this.get(key),
177
+ options
178
+ );
179
+ } catch (error) {
180
+ if (this.$__parent?.$__ != null) {
181
+ this.$__parent.invalidate(fullPath.call(this), error);
182
+ return;
183
+ }
184
+ throw error;
185
+ }
186
+ }
187
+
188
+ super.set(key, value);
189
+
190
+ // Set relative path on subdocuments to avoid string operations in markModified()
191
+ // The path should be relative to the parent subdocument (if any), not just the key
192
+ if (value?.$isSingleNested) {
193
+ if (this.$__pathRelativeToParent != null) {
194
+ // Map's parent is a subdocument, store path relative to that subdoc (e.g., 'items.i2')
195
+ value.$pathRelativeToParent = this.$__pathRelativeToParent + '.' + key;
196
+ } else {
197
+ // Map's parent is root document, store just the full path
198
+ value.$pathRelativeToParent = this.$__path + '.' + key;
199
+ }
200
+ }
201
+
202
+ if (parent?.$__ != null && !deepEqual(value, priorVal)) {
203
+ // Optimization: if parent is a subdocument, use precalculated relative path
204
+ // to avoid building a full path just to strip the parent's prefix
205
+ let pathToMark;
206
+ if (this.$__pathRelativeToParent != null) {
207
+ // Parent is a subdocument - use precalculated relative path (e.g., 'items.i1')
208
+ pathToMark = this.$__pathRelativeToParent + '.' + key;
209
+ } else {
210
+ // Parent is root document or map - use full path
211
+ pathToMark = fullPath.call(this);
212
+ }
213
+ parent.markModified(pathToMark);
214
+ // If overwriting the full document array or subdoc, make sure to clean up any paths that were modified
215
+ // before re: #15108
216
+ if (this.$__schemaType.$isMongooseDocumentArray || this.$__schemaType.$isSingleNested) {
217
+ cleanModifiedSubpaths(parent, pathToMark);
218
+ }
219
+ }
220
+
221
+ // Delay calculating full path unless absolutely necessary, because string
222
+ // concatenation is a bottleneck re: #13171
223
+ function fullPath() {
224
+ if (_fullPath) {
225
+ return _fullPath;
226
+ }
227
+ _fullPath = this.$__path + '.' + key;
228
+ return _fullPath;
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Overwrites native Map's `clear()` function to support change tracking.
234
+ *
235
+ * @api public
236
+ * @method clear
237
+ * @memberOf Map
238
+ */
239
+
240
+ clear() {
241
+ super.clear();
242
+ const parent = this.$__parent;
243
+ if (parent != null) {
244
+ parent.markModified(this.$__path);
245
+ }
246
+ }
247
+
248
+ /**
249
+ * Overwrites native Map's `delete()` function to support change tracking.
250
+ *
251
+ * @api public
252
+ * @method delete
253
+ * @memberOf Map
254
+ */
255
+
256
+ delete(key) {
257
+ if (isBsonType(key, 'ObjectId')) {
258
+ key = key.toString();
259
+ }
260
+
261
+ this.set(key, undefined);
262
+ return super.delete(key);
263
+ }
264
+
265
+ /**
266
+ * Converts this map to a native JavaScript Map so the MongoDB driver can serialize it.
267
+ *
268
+ * @api public
269
+ * @method toBSON
270
+ * @memberOf Map
271
+ */
272
+
273
+ toBSON() {
274
+ return new Map(this);
275
+ }
276
+
277
+ toObject(options) {
278
+ if (options?.flattenMaps) {
279
+ const ret = {};
280
+ const keys = this.keys();
281
+ for (const key of keys) {
282
+ ret[key] = clone(this.get(key), options);
283
+ }
284
+ return ret;
285
+ }
286
+
287
+ return new Map(this);
288
+ }
289
+
290
+ $toObject() {
291
+ return this.constructor.prototype.toObject.apply(this, arguments);
292
+ }
293
+
294
+ /**
295
+ * Converts this map to a native JavaScript Map for `JSON.stringify()`. Set
296
+ * the `flattenMaps` option to convert this map to a POJO instead.
297
+ *
298
+ * #### Example:
299
+ *
300
+ * doc.myMap.toJSON() instanceof Map; // true
301
+ * doc.myMap.toJSON({ flattenMaps: true }) instanceof Map; // false
302
+ *
303
+ * @api public
304
+ * @method toJSON
305
+ * @param {Object} [options]
306
+ * @param {Boolean} [options.flattenMaps=false] set to `true` to convert the map to a POJO rather than a native JavaScript map
307
+ * @memberOf Map
308
+ */
309
+
310
+ toJSON(options) {
311
+ if (typeof options?.flattenMaps === 'boolean' ? options.flattenMaps : true) {
312
+ const ret = {};
313
+ const keys = this.keys();
314
+ for (const key of keys) {
315
+ ret[key] = clone(this.get(key), options);
316
+ }
317
+ return ret;
318
+ }
319
+
320
+ return new Map(this);
321
+ }
322
+
323
+ inspect() {
324
+ return new Map(this);
325
+ }
326
+
327
+ $__runDeferred() {
328
+ if (!this.$__deferred) {
329
+ return;
330
+ }
331
+
332
+ for (const keyValueObject of this.$__deferred) {
333
+ this.set(keyValueObject.key, keyValueObject.value);
334
+ }
335
+
336
+ this.$__deferred = null;
337
+ }
338
+ }
339
+
340
+ if (util.inspect.custom) {
341
+ Object.defineProperty(MongooseMap.prototype, util.inspect.custom, {
342
+ enumerable: false,
343
+ writable: false,
344
+ configurable: false,
345
+ value: MongooseMap.prototype.inspect
346
+ });
347
+ }
348
+
349
+ Object.defineProperty(MongooseMap.prototype, '$__set', {
350
+ enumerable: false,
351
+ writable: true,
352
+ configurable: false
353
+ });
354
+
355
+ Object.defineProperty(MongooseMap.prototype, '$__parent', {
356
+ enumerable: false,
357
+ writable: true,
358
+ configurable: false
359
+ });
360
+
361
+ Object.defineProperty(MongooseMap.prototype, '$__path', {
362
+ enumerable: false,
363
+ writable: true,
364
+ configurable: false
365
+ });
366
+
367
+ Object.defineProperty(MongooseMap.prototype, '$__schemaType', {
368
+ enumerable: false,
369
+ writable: true,
370
+ configurable: false
371
+ });
372
+
373
+ /**
374
+ * Set to `true` for all Mongoose map instances
375
+ *
376
+ * @api public
377
+ * @property $isMongooseMap
378
+ * @memberOf MongooseMap
379
+ * @instance
380
+ */
381
+
382
+ Object.defineProperty(MongooseMap.prototype, '$isMongooseMap', {
383
+ enumerable: false,
384
+ writable: false,
385
+ configurable: false,
386
+ value: true
387
+ });
388
+
389
+ Object.defineProperty(MongooseMap.prototype, '$__deferredCalls', {
390
+ enumerable: false,
391
+ writable: false,
392
+ configurable: false,
393
+ value: true
394
+ });
395
+
396
+ /**
397
+ * Since maps are stored as objects under the hood, keys must be strings
398
+ * and can't contain any invalid characters
399
+ * @param {String} key
400
+ * @api private
401
+ */
402
+
403
+ function checkValidKey(key) {
404
+ const keyType = typeof key;
405
+ if (keyType !== 'string') {
406
+ throw new TypeError(`Mongoose maps only support string keys, got ${keyType}`);
407
+ }
408
+ if (key.startsWith('$')) {
409
+ throw new Error(`Mongoose maps do not support keys that start with "$", got "${key}"`);
410
+ }
411
+ if (key.includes('.')) {
412
+ throw new Error(`Mongoose maps do not support keys that contain ".", got "${key}"`);
413
+ }
414
+ if (specialProperties.has(key)) {
415
+ throw new Error(`Mongoose maps do not support reserved key name "${key}"`);
416
+ }
417
+ }
418
+
419
+ module.exports = MongooseMap;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * ObjectId type constructor
3
+ *
4
+ * #### Example:
5
+ *
6
+ * const id = new mongoose.Types.ObjectId;
7
+ *
8
+ * @constructor ObjectId
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ const ObjectId = require('mongodb/lib/bson').ObjectId;
14
+ const objectIdSymbol = require('../helpers/symbols').objectIdSymbol;
15
+
16
+ /**
17
+ * Getter for convenience with populate, see gh-6115
18
+ * @api private
19
+ */
20
+
21
+ Object.defineProperty(ObjectId.prototype, '_id', {
22
+ enumerable: false,
23
+ configurable: true,
24
+ get: function() {
25
+ return this;
26
+ }
27
+ });
28
+
29
+ /*!
30
+ * Convenience `valueOf()` to allow comparing ObjectIds using double equals re: gh-7299
31
+ */
32
+
33
+ if (!Object.hasOwn(ObjectId.prototype, 'valueOf')) {
34
+ ObjectId.prototype.valueOf = function objectIdValueOf() {
35
+ return this.toString();
36
+ };
37
+ }
38
+
39
+ ObjectId.prototype[objectIdSymbol] = true;
40
+
41
+ module.exports = ObjectId;