@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,415 @@
1
+ 'use strict';
2
+
3
+ const ArrayMethods = require('../../array/methods');
4
+ const Document = require('../../../document');
5
+ const getDiscriminatorByValue = require('../../../helpers/discriminator/getDiscriminatorByValue');
6
+ const internalToObjectOptions = require('../../../options').internalToObjectOptions;
7
+ const utils = require('../../../utils');
8
+ const isBsonType = require('../../../helpers/isBsonType');
9
+
10
+ const arrayParentSymbol = require('../../../helpers/symbols').arrayParentSymbol;
11
+ const arrayPathSymbol = require('../../../helpers/symbols').arrayPathSymbol;
12
+ const arraySchemaSymbol = require('../../../helpers/symbols').arraySchemaSymbol;
13
+ const documentArrayParent = require('../../../helpers/symbols').documentArrayParent;
14
+
15
+ const _baseToString = Array.prototype.toString;
16
+
17
+ const methods = {
18
+ /*!
19
+ * ignore
20
+ */
21
+
22
+ toBSON() {
23
+ return this.toObject(internalToObjectOptions);
24
+ },
25
+
26
+ toString() {
27
+ return _baseToString.call(this.__array.map(subdoc => {
28
+ if (subdoc?.$__ != null) {
29
+ return subdoc.toString();
30
+ }
31
+ return subdoc;
32
+ }));
33
+ },
34
+
35
+ /*!
36
+ * ignore
37
+ */
38
+
39
+ getArrayParent() {
40
+ return this[arrayParentSymbol];
41
+ },
42
+
43
+ /*!
44
+ * ignore
45
+ */
46
+ $schemaType() {
47
+ return this[arraySchemaSymbol];
48
+ },
49
+
50
+ /**
51
+ * Overrides MongooseArray#cast
52
+ *
53
+ * @method _cast
54
+ * @api private
55
+ * @memberOf MongooseDocumentArray
56
+ */
57
+
58
+ _cast(value, index, options) {
59
+ if (this[arraySchemaSymbol] == null) {
60
+ return value;
61
+ }
62
+ let Constructor = this[arraySchemaSymbol].Constructor;
63
+ const isInstance = Constructor.$isMongooseDocumentArray ?
64
+ utils.isMongooseDocumentArray(value) :
65
+ value instanceof Constructor;
66
+ if (isInstance ||
67
+ // Hack re: #5001, see #5005
68
+ value?.constructor?.baseCasterConstructor === Constructor) {
69
+ if (!(value[documentArrayParent] && value.__parentArray)) {
70
+ // value may have been created using array.create()
71
+ value[documentArrayParent] = this[arrayParentSymbol];
72
+ value.__parentArray = this;
73
+ }
74
+ value.$setIndex(index);
75
+ return value;
76
+ }
77
+
78
+ if (value == null) {
79
+ return null;
80
+ }
81
+
82
+ // handle cast('string') or cast(ObjectId) etc.
83
+ // only objects are permitted so we can safely assume that
84
+ // non-objects are to be interpreted as _id
85
+ if (Buffer.isBuffer(value) ||
86
+ isBsonType(value, 'ObjectId') || !utils.isObject(value)) {
87
+ value = { _id: value };
88
+ }
89
+
90
+ if (value &&
91
+ Constructor.discriminators &&
92
+ Constructor.schema &&
93
+ Constructor.schema.options &&
94
+ Constructor.schema.options.discriminatorKey) {
95
+ if (typeof value[Constructor.schema.options.discriminatorKey] === 'string' &&
96
+ Constructor.discriminators[value[Constructor.schema.options.discriminatorKey]]) {
97
+ Constructor = Constructor.discriminators[value[Constructor.schema.options.discriminatorKey]];
98
+ } else {
99
+ const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, value[Constructor.schema.options.discriminatorKey]);
100
+ if (constructorByValue) {
101
+ Constructor = constructorByValue;
102
+ }
103
+ }
104
+ }
105
+
106
+ if (Constructor.$isMongooseDocumentArray) {
107
+ return Constructor.cast(value, this, undefined, undefined, index);
108
+ }
109
+ const ret = new Constructor(value, this, options, undefined, index);
110
+ ret.isNew = true;
111
+ return ret;
112
+ },
113
+
114
+ /**
115
+ * Searches array items for the first document with a matching _id.
116
+ *
117
+ * #### Example:
118
+ *
119
+ * const embeddedDoc = m.array.id(some_id);
120
+ *
121
+ * @return {EmbeddedDocument|null} the subdocument or null if not found.
122
+ * @param {ObjectId|String|Number|Buffer} id
123
+ * @method id
124
+ * @api public
125
+ * @memberOf MongooseDocumentArray
126
+ */
127
+
128
+ id(id) {
129
+ if (id == null) {
130
+ return null;
131
+ }
132
+
133
+ const schemaType = this[arraySchemaSymbol];
134
+ let idSchemaType = null;
135
+
136
+ if (schemaType?.schema) {
137
+ idSchemaType = schemaType.schema.path('_id');
138
+ } else if (schemaType?.casterConstructor?.schema) {
139
+ idSchemaType = schemaType.casterConstructor.schema.path('_id');
140
+ }
141
+
142
+ let castedId = null;
143
+ if (idSchemaType) {
144
+ try {
145
+ castedId = idSchemaType.cast(id);
146
+ } catch {
147
+ // ignore error
148
+ }
149
+ }
150
+
151
+ let _id;
152
+
153
+ for (const val of this) {
154
+ if (!val) {
155
+ continue;
156
+ }
157
+
158
+ _id = val.get('_id');
159
+
160
+ if (_id == null) {
161
+ continue;
162
+ } else if (_id instanceof Document) {
163
+ _id = _id.get('_id');
164
+ if (castedId != null && utils.deepEqual(castedId, _id)) {
165
+ return val;
166
+ } else if (castedId == null && (id == _id || utils.deepEqual(id, _id))) {
167
+ // Backwards compat: compare user-specified param to _id using loose equality
168
+ return val;
169
+ }
170
+ } else if (castedId != null && utils.deepEqual(castedId, _id)) {
171
+ return val;
172
+ } else if (castedId == null && (_id == id || utils.deepEqual(id, _id))) {
173
+ // Backwards compat: compare user-specified param to _id using loose equality
174
+ return val;
175
+ }
176
+ }
177
+
178
+ return null;
179
+ },
180
+
181
+ /**
182
+ * Returns a native js Array of plain js objects
183
+ *
184
+ * #### Note:
185
+ *
186
+ * _Each sub-document is converted to a plain object by calling its `#toObject` method._
187
+ *
188
+ * @param {Object} [options] optional options to pass to each documents `toObject` method call during conversion
189
+ * @return {Array}
190
+ * @method toObject
191
+ * @api public
192
+ * @memberOf MongooseDocumentArray
193
+ */
194
+
195
+ toObject(options) {
196
+ // `[].concat` coerces the return value into a vanilla JS array, rather
197
+ // than a Mongoose array.
198
+ return [].concat(this.map(function(doc) {
199
+ if (doc == null) {
200
+ return null;
201
+ }
202
+ if (typeof doc.toObject !== 'function') {
203
+ return doc;
204
+ }
205
+ return doc.toObject(options);
206
+ }));
207
+ },
208
+
209
+ $toObject() {
210
+ return this.constructor.prototype.toObject.apply(this, arguments);
211
+ },
212
+
213
+ /**
214
+ * Wraps [`Array#push`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/push) with proper change tracking.
215
+ *
216
+ * @param {...Object} [args]
217
+ * @api public
218
+ * @method push
219
+ * @memberOf MongooseDocumentArray
220
+ */
221
+
222
+ push() {
223
+ const ret = ArrayMethods.push.apply(this, arguments);
224
+
225
+ _updateParentPopulated(this);
226
+
227
+ return ret;
228
+ },
229
+
230
+ /**
231
+ * Pulls items from the array atomically.
232
+ *
233
+ * @param {...Object} [args]
234
+ * @api public
235
+ * @method pull
236
+ * @memberOf MongooseDocumentArray
237
+ */
238
+
239
+ pull() {
240
+ const ret = ArrayMethods.pull.apply(this, arguments);
241
+
242
+ _updateParentPopulated(this);
243
+
244
+ return ret;
245
+ },
246
+
247
+ /**
248
+ * Wraps [`Array#shift`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/unshift) with proper change tracking.
249
+ * @api private
250
+ */
251
+
252
+ shift() {
253
+ const ret = ArrayMethods.shift.apply(this, arguments);
254
+
255
+ _updateParentPopulated(this);
256
+
257
+ return ret;
258
+ },
259
+
260
+ /**
261
+ * Wraps [`Array#splice`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice) with proper change tracking and casting.
262
+ * @api private
263
+ */
264
+
265
+ splice() {
266
+ const ret = ArrayMethods.splice.apply(this, arguments);
267
+
268
+ _updateParentPopulated(this);
269
+
270
+ return ret;
271
+ },
272
+
273
+ /**
274
+ * Helper for console.log
275
+ *
276
+ * @method inspect
277
+ * @api public
278
+ * @memberOf MongooseDocumentArray
279
+ */
280
+
281
+ inspect() {
282
+ return this.toObject();
283
+ },
284
+
285
+ /**
286
+ * Creates a subdocument casted to this schema.
287
+ *
288
+ * This is the same subdocument constructor used for casting.
289
+ *
290
+ * @param {Object} obj the value to cast to this arrays SubDocument schema
291
+ * @method create
292
+ * @api public
293
+ * @memberOf MongooseDocumentArray
294
+ */
295
+
296
+ create(obj) {
297
+ let Constructor = this[arraySchemaSymbol].Constructor;
298
+ if (obj &&
299
+ Constructor.discriminators &&
300
+ Constructor.schema &&
301
+ Constructor.schema.options &&
302
+ Constructor.schema.options.discriminatorKey) {
303
+ if (typeof obj[Constructor.schema.options.discriminatorKey] === 'string' &&
304
+ Constructor.discriminators[obj[Constructor.schema.options.discriminatorKey]]) {
305
+ Constructor = Constructor.discriminators[obj[Constructor.schema.options.discriminatorKey]];
306
+ } else {
307
+ const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, obj[Constructor.schema.options.discriminatorKey]);
308
+ if (constructorByValue) {
309
+ Constructor = constructorByValue;
310
+ }
311
+ }
312
+ }
313
+
314
+ return new Constructor(obj, this);
315
+ },
316
+
317
+ /*!
318
+ * ignore
319
+ */
320
+
321
+ notify(event) {
322
+ const _this = this;
323
+ return function notify(val, _arr) {
324
+ _arr = _arr || _this;
325
+ let i = _arr.length;
326
+ while (i--) {
327
+ if (_arr[i] == null) {
328
+ continue;
329
+ }
330
+ switch (event) {
331
+ // only swap for save event for now, we may change this to all event types later
332
+ case 'save':
333
+ val = _this[i];
334
+ break;
335
+ default:
336
+ // NO-OP
337
+ break;
338
+ }
339
+
340
+ if (utils.isMongooseArray(_arr[i])) {
341
+ notify(val, _arr[i]);
342
+ } else if (_arr[i]) {
343
+ _arr[i].emit(event, val);
344
+ }
345
+ }
346
+ };
347
+ },
348
+
349
+ set(i, val, skipModified) {
350
+ const arr = this.__array;
351
+ if (skipModified) {
352
+ arr[i] = val;
353
+ return this;
354
+ }
355
+ const value = methods._cast.call(this, val, i);
356
+ methods._markModified.call(this, i);
357
+ arr[i] = value;
358
+ return this;
359
+ },
360
+
361
+ _markModified(elem, embeddedPath) {
362
+ const parent = this[arrayParentSymbol];
363
+ let dirtyPath;
364
+
365
+ if (parent) {
366
+ dirtyPath = this[arrayPathSymbol];
367
+
368
+ if (arguments.length) {
369
+ if (embeddedPath != null) {
370
+ // an embedded doc bubbled up the change
371
+ const index = elem.__index;
372
+ dirtyPath = dirtyPath + '.' + index + '.' + embeddedPath;
373
+ } else {
374
+ // directly set an index
375
+ dirtyPath = dirtyPath + '.' + elem;
376
+ }
377
+ }
378
+
379
+ if (dirtyPath != null && dirtyPath.endsWith('.$')) {
380
+ return this;
381
+ }
382
+
383
+ parent.markModified(dirtyPath, arguments.length !== 0 ? elem : parent);
384
+ }
385
+
386
+ return this;
387
+ }
388
+ };
389
+
390
+ module.exports = methods;
391
+
392
+ /**
393
+ * If this is a document array, each element may contain single
394
+ * populated paths, so we need to modify the top-level document's
395
+ * populated cache. See gh-8247, gh-8265.
396
+ * @param {Array} arr
397
+ * @api private
398
+ */
399
+
400
+ function _updateParentPopulated(arr) {
401
+ const parent = arr[arrayParentSymbol];
402
+ if (!parent || parent.$__.populated == null) return;
403
+
404
+ const populatedPaths = Object.keys(parent.$__.populated).
405
+ filter(p => p.startsWith(arr[arrayPathSymbol] + '.'));
406
+
407
+ for (const path of populatedPaths) {
408
+ const remnant = path.slice((arr[arrayPathSymbol] + '.').length);
409
+ if (!Array.isArray(parent.$__.populated[path].value)) {
410
+ continue;
411
+ }
412
+
413
+ parent.$__.populated[path].value = arr.map(val => val.$populated(remnant));
414
+ }
415
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Double type constructor
3
+ *
4
+ * #### Example:
5
+ *
6
+ * const pi = new mongoose.Types.Double(3.1415);
7
+ *
8
+ * @constructor Double
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ module.exports = require('mongodb/lib/bson').Double;
@@ -0,0 +1,23 @@
1
+
2
+ /*!
3
+ * Module exports.
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ exports.Array = require('./array');
9
+ exports.Buffer = require('./buffer');
10
+
11
+ exports.Document = // @deprecate
12
+ exports.Embedded = require('./arraySubdocument');
13
+
14
+ exports.DocumentArray = require('./documentArray');
15
+ exports.Double = require('./double');
16
+ exports.Decimal128 = require('./decimal128');
17
+ exports.ObjectId = require('./objectid');
18
+
19
+ exports.Map = require('./map');
20
+
21
+ exports.Subdocument = require('./subdocument');
22
+
23
+ exports.UUID = require('./uuid');