@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,207 @@
1
+ /*!
2
+ * Module dependencies.
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const EventEmitter = require('events').EventEmitter;
8
+ const Subdocument = require('./subdocument');
9
+ const utils = require('../utils');
10
+
11
+ const documentArrayParent = require('../helpers/symbols').documentArrayParent;
12
+
13
+ /**
14
+ * A constructor.
15
+ *
16
+ * @param {Object} obj js object returned from the db
17
+ * @param {MongooseDocumentArray} parentArr the parent array of this document
18
+ * @param {Boolean} skipId
19
+ * @param {Object} fields
20
+ * @param {Number} index
21
+ * @inherits Document
22
+ * @api private
23
+ */
24
+
25
+ function ArraySubdocument(obj, parentArr, skipId, fields, index) {
26
+ if (utils.isMongooseDocumentArray(parentArr)) {
27
+ this.__parentArray = parentArr;
28
+ this[documentArrayParent] = parentArr.$parent();
29
+ } else {
30
+ this.__parentArray = undefined;
31
+ this[documentArrayParent] = undefined;
32
+ }
33
+ this.$setIndex(index);
34
+ this.$__parent = this[documentArrayParent];
35
+
36
+ let options;
37
+ if (typeof skipId === 'object' && skipId != null) {
38
+ options = { isNew: true, ...skipId };
39
+ skipId = undefined;
40
+ } else {
41
+ options = { isNew: true };
42
+ }
43
+
44
+ Subdocument.call(this, obj, fields, this[documentArrayParent], options);
45
+ }
46
+
47
+ /*!
48
+ * Inherit from Subdocument
49
+ */
50
+ ArraySubdocument.prototype = Object.create(Subdocument.prototype);
51
+ ArraySubdocument.prototype.constructor = ArraySubdocument;
52
+
53
+ Object.defineProperty(ArraySubdocument.prototype, '$isSingleNested', {
54
+ configurable: false,
55
+ writable: false,
56
+ value: false
57
+ });
58
+
59
+ Object.defineProperty(ArraySubdocument.prototype, '$isDocumentArrayElement', {
60
+ configurable: false,
61
+ writable: false,
62
+ value: true
63
+ });
64
+
65
+ for (const i in EventEmitter.prototype) {
66
+ ArraySubdocument[i] = EventEmitter.prototype[i];
67
+ }
68
+
69
+ /*!
70
+ * ignore
71
+ */
72
+
73
+ ArraySubdocument.prototype.$setIndex = function(index) {
74
+ this.__index = index;
75
+
76
+ if (this.$__?.validationError != null) {
77
+ const keys = Object.keys(this.$__.validationError.errors);
78
+ for (const key of keys) {
79
+ this.invalidate(key, this.$__.validationError.errors[key]);
80
+ }
81
+ }
82
+ };
83
+
84
+ /*!
85
+ * ignore
86
+ */
87
+
88
+ ArraySubdocument.prototype.populate = function() {
89
+ throw new Error('Mongoose does not support calling populate() on nested ' +
90
+ 'docs. Instead of `doc.arr[0].populate("path")`, use ' +
91
+ '`doc.populate("arr.0.path")`');
92
+ };
93
+
94
+ /*!
95
+ * ignore
96
+ */
97
+
98
+ ArraySubdocument.prototype.$__removeFromParent = function() {
99
+ const _id = this._doc._id;
100
+ if (!_id) {
101
+ throw new Error('For your own good, Mongoose does not know ' +
102
+ 'how to remove an ArraySubdocument that has no _id');
103
+ }
104
+ this.__parentArray.pull({ _id: _id });
105
+ };
106
+
107
+ /**
108
+ * Returns the full path to this document. If optional `path` is passed, it is appended to the full path.
109
+ *
110
+ * @param {String} [path]
111
+ * @param {Boolean} [skipIndex] Skip adding the array index. For example `arr.foo` instead of `arr.0.foo`.
112
+ * @return {String}
113
+ * @api private
114
+ * @method $__fullPath
115
+ * @memberOf ArraySubdocument
116
+ * @instance
117
+ */
118
+
119
+ ArraySubdocument.prototype.$__fullPath = function(path, skipIndex) {
120
+ if (this.__index == null) {
121
+ return null;
122
+ }
123
+ if (!this.$__.fullPath) {
124
+ this.ownerDocument();
125
+ }
126
+
127
+ if (skipIndex) {
128
+ return path ?
129
+ this.$__.fullPath + '.' + path :
130
+ this.$__.fullPath;
131
+ }
132
+
133
+ return path ?
134
+ this.$__.fullPath + '.' + this.__index + '.' + path :
135
+ this.$__.fullPath + '.' + this.__index;
136
+ };
137
+
138
+ /**
139
+ * Given a path relative to this document, return the path relative
140
+ * to the top-level document.
141
+ * @method $__pathRelativeToParent
142
+ * @memberOf ArraySubdocument
143
+ * @instance
144
+ * @api private
145
+ */
146
+
147
+ ArraySubdocument.prototype.$__pathRelativeToParent = function(path, skipIndex) {
148
+ if (this.__index == null || !this.__parentArray?.$path) {
149
+ return null;
150
+ }
151
+ if (skipIndex) {
152
+ return path == null ? this.__parentArray.$path() : this.__parentArray.$path() + '.' + path;
153
+ }
154
+ if (path == null) {
155
+ return this.__parentArray.$path() + '.' + this.__index;
156
+ }
157
+ return this.__parentArray.$path() + '.' + this.__index + '.' + path;
158
+ };
159
+
160
+ /**
161
+ * Returns this sub-documents parent document.
162
+ * @method $parent
163
+ * @memberOf ArraySubdocument
164
+ * @instance
165
+ * @api public
166
+ */
167
+
168
+ ArraySubdocument.prototype.$parent = function() {
169
+ return this[documentArrayParent];
170
+ };
171
+
172
+ /*!
173
+ * Sets this sub-documents parent document.
174
+ *
175
+ * @api private
176
+ */
177
+
178
+ ArraySubdocument.prototype.$__setParent = function $__setParent(parent) {
179
+ this[documentArrayParent] = parent;
180
+ };
181
+
182
+ /**
183
+ * Returns this subdocument's parent array.
184
+ *
185
+ * #### Example:
186
+ *
187
+ * const Test = mongoose.model('Test', new Schema({
188
+ * docArr: [{ name: String }]
189
+ * }));
190
+ * const doc = new Test({ docArr: [{ name: 'test subdoc' }] });
191
+ *
192
+ * doc.docArr[0].parentArray() === doc.docArr; // true
193
+ *
194
+ * @api public
195
+ * @method parentArray
196
+ * @returns DocumentArray
197
+ */
198
+
199
+ ArraySubdocument.prototype.parentArray = function() {
200
+ return this.__parentArray;
201
+ };
202
+
203
+ /*!
204
+ * Module exports.
205
+ */
206
+
207
+ module.exports = ArraySubdocument;
@@ -0,0 +1,294 @@
1
+ /*!
2
+ * Module dependencies.
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const Binary = require('mongodb/lib/bson').Binary;
8
+ const UUID = require('mongodb/lib/bson').UUID;
9
+ const utils = require('../utils');
10
+
11
+ /**
12
+ * Mongoose Buffer constructor.
13
+ *
14
+ * Values always have to be passed to the constructor to initialize.
15
+ *
16
+ * @param {Buffer} value
17
+ * @param {String} encode
18
+ * @param {Number} offset
19
+ * @api private
20
+ * @inherits Buffer https://nodejs.org/api/buffer.html
21
+ * @see https://bit.ly/f6CnZU
22
+ */
23
+
24
+ function MongooseBuffer(value, encode, offset) {
25
+ let val = value;
26
+ if (value == null) {
27
+ val = 0;
28
+ }
29
+
30
+ let encoding;
31
+ let path;
32
+ let doc;
33
+
34
+ if (Array.isArray(encode)) {
35
+ // internal casting
36
+ path = encode[0];
37
+ doc = encode[1];
38
+ } else {
39
+ encoding = encode;
40
+ }
41
+
42
+ let buf;
43
+ if (typeof val === 'number' || val instanceof Number) {
44
+ buf = Buffer.alloc(val);
45
+ } else { // string, array or object { type: 'Buffer', data: [...] }
46
+ buf = Buffer.from(val, encoding, offset);
47
+ }
48
+ utils.decorate(buf, MongooseBuffer.mixin);
49
+ buf.isMongooseBuffer = true;
50
+
51
+ // make sure these internal props don't show up in Object.keys()
52
+ buf[MongooseBuffer.pathSymbol] = path;
53
+ buf[parentSymbol] = doc;
54
+
55
+ buf._subtype = 0;
56
+ return buf;
57
+ }
58
+
59
+ const pathSymbol = Symbol.for('mongoose#Buffer#_path');
60
+ const parentSymbol = Symbol.for('mongoose#Buffer#_parent');
61
+ MongooseBuffer.pathSymbol = pathSymbol;
62
+
63
+ /*!
64
+ * Inherit from Buffer.
65
+ */
66
+
67
+ MongooseBuffer.mixin = {
68
+
69
+ /**
70
+ * Default subtype for the Binary representing this Buffer
71
+ *
72
+ * @api private
73
+ * @property _subtype
74
+ * @memberOf MongooseBuffer.mixin
75
+ * @static
76
+ */
77
+
78
+ _subtype: undefined,
79
+
80
+ /**
81
+ * Marks this buffer as modified.
82
+ *
83
+ * @api private
84
+ * @method _markModified
85
+ * @memberOf MongooseBuffer.mixin
86
+ * @static
87
+ */
88
+
89
+ _markModified: function() {
90
+ const parent = this[parentSymbol];
91
+
92
+ if (parent) {
93
+ parent.markModified(this[MongooseBuffer.pathSymbol]);
94
+ }
95
+ return this;
96
+ },
97
+
98
+ /**
99
+ * Writes the buffer.
100
+ *
101
+ * @api public
102
+ * @method write
103
+ * @memberOf MongooseBuffer.mixin
104
+ * @static
105
+ */
106
+
107
+ write: function() {
108
+ const written = Buffer.prototype.write.apply(this, arguments);
109
+
110
+ if (written > 0) {
111
+ this._markModified();
112
+ }
113
+
114
+ return written;
115
+ },
116
+
117
+ /**
118
+ * Copies the buffer.
119
+ *
120
+ * #### Note:
121
+ *
122
+ * `Buffer#copy` does not mark `target` as modified so you must copy from a `MongooseBuffer` for it to work as expected. This is a work around since `copy` modifies the target, not this.
123
+ *
124
+ * @return {Number} The number of bytes copied.
125
+ * @param {Buffer} target
126
+ * @method copy
127
+ * @memberOf MongooseBuffer.mixin
128
+ * @static
129
+ */
130
+
131
+ copy: function(target) {
132
+ const ret = Buffer.prototype.copy.apply(this, arguments);
133
+
134
+ if (target?.isMongooseBuffer) {
135
+ target._markModified();
136
+ }
137
+
138
+ return ret;
139
+ }
140
+ };
141
+
142
+ /*!
143
+ * Compile other Buffer methods marking this buffer as modified.
144
+ */
145
+
146
+ utils.each(
147
+ [
148
+ // node < 0.5
149
+ 'writeUInt8', 'writeUInt16', 'writeUInt32', 'writeInt8', 'writeInt16', 'writeInt32',
150
+ 'writeFloat', 'writeDouble', 'fill',
151
+ 'utf8Write', 'binaryWrite', 'asciiWrite', 'set',
152
+
153
+ // node >= 0.5
154
+ 'writeUInt16LE', 'writeUInt16BE', 'writeUInt32LE', 'writeUInt32BE',
155
+ 'writeInt16LE', 'writeInt16BE', 'writeInt32LE', 'writeInt32BE', 'writeFloatLE', 'writeFloatBE', 'writeDoubleLE', 'writeDoubleBE']
156
+ , function(method) {
157
+ if (!Buffer.prototype[method]) {
158
+ return;
159
+ }
160
+ MongooseBuffer.mixin[method] = function() {
161
+ const ret = Buffer.prototype[method].apply(this, arguments);
162
+ this._markModified();
163
+ return ret;
164
+ };
165
+ });
166
+
167
+ /**
168
+ * Converts this buffer to its Binary type representation.
169
+ *
170
+ * #### SubTypes:
171
+ *
172
+ * const mongodb = require('mongodb')
173
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_DEFAULT
174
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_FUNCTION
175
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_BYTE_ARRAY
176
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_UUID
177
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_MD5
178
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_USER_DEFINED
179
+ * doc.buffer.toObject(mongodb.BSON.BSON_BINARY_SUBTYPE_USER_DEFINED);
180
+ *
181
+ * @see bsonspec https://bsonspec.org/#/specification
182
+ * @param {Hex} [subtype]
183
+ * @return {Binary}
184
+ * @api public
185
+ * @method toObject
186
+ * @memberOf MongooseBuffer
187
+ */
188
+
189
+ MongooseBuffer.mixin.toObject = function(options) {
190
+ const subtype = typeof options === 'number'
191
+ ? options
192
+ : (this._subtype || 0);
193
+ return new Binary(Buffer.from(this), subtype);
194
+ };
195
+
196
+ MongooseBuffer.mixin.$toObject = MongooseBuffer.mixin.toObject;
197
+
198
+ /**
199
+ * Converts this buffer for storage in MongoDB, including subtype
200
+ *
201
+ * @return {Binary}
202
+ * @api public
203
+ * @method toBSON
204
+ * @memberOf MongooseBuffer
205
+ */
206
+
207
+ MongooseBuffer.mixin.toBSON = function() {
208
+ return new Binary(this, this._subtype || 0);
209
+ };
210
+
211
+ /**
212
+ * Converts this buffer to a UUID. Throws an error if subtype is not 4.
213
+ *
214
+ * @return {UUID}
215
+ * @api public
216
+ * @method toUUID
217
+ * @memberOf MongooseBuffer
218
+ */
219
+
220
+ MongooseBuffer.mixin.toUUID = function() {
221
+ if (this._subtype !== 4) {
222
+ throw new Error('Cannot convert a Buffer with subtype ' + this._subtype + ' to a UUID');
223
+ }
224
+ return new UUID(this);
225
+ };
226
+
227
+ /**
228
+ * Determines if this buffer is equals to `other` buffer
229
+ *
230
+ * @param {Buffer} other
231
+ * @return {Boolean}
232
+ * @method equals
233
+ * @memberOf MongooseBuffer
234
+ */
235
+
236
+ MongooseBuffer.mixin.equals = function(other) {
237
+ if (!Buffer.isBuffer(other)) {
238
+ return false;
239
+ }
240
+
241
+ if (this.length !== other.length) {
242
+ return false;
243
+ }
244
+
245
+ for (let i = 0; i < this.length; ++i) {
246
+ if (this[i] !== other[i]) {
247
+ return false;
248
+ }
249
+ }
250
+
251
+ return true;
252
+ };
253
+
254
+ /**
255
+ * Sets the subtype option and marks the buffer modified.
256
+ *
257
+ * #### SubTypes:
258
+ *
259
+ * const bson = require('bson')
260
+ * bson.BSON_BINARY_SUBTYPE_DEFAULT
261
+ * bson.BSON_BINARY_SUBTYPE_FUNCTION
262
+ * bson.BSON_BINARY_SUBTYPE_BYTE_ARRAY
263
+ * bson.BSON_BINARY_SUBTYPE_UUID
264
+ * bson.BSON_BINARY_SUBTYPE_MD5
265
+ * bson.BSON_BINARY_SUBTYPE_USER_DEFINED
266
+ *
267
+ * doc.buffer.subtype(bson.BSON_BINARY_SUBTYPE_UUID);
268
+ *
269
+ * @see bsonspec https://bsonspec.org/#/specification
270
+ * @param {Hex} subtype
271
+ * @api public
272
+ * @method subtype
273
+ * @memberOf MongooseBuffer
274
+ */
275
+
276
+ MongooseBuffer.mixin.subtype = function(subtype) {
277
+ if (typeof subtype !== 'number') {
278
+ throw new TypeError('Invalid subtype. Expected a number');
279
+ }
280
+
281
+ if (this._subtype !== subtype) {
282
+ this._markModified();
283
+ }
284
+
285
+ this._subtype = subtype;
286
+ };
287
+
288
+ /*!
289
+ * Module exports.
290
+ */
291
+
292
+ MongooseBuffer.Binary = Binary;
293
+
294
+ module.exports = MongooseBuffer;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Decimal128 type constructor
3
+ *
4
+ * #### Example:
5
+ *
6
+ * const id = new mongoose.Types.Decimal128('3.1415');
7
+ *
8
+ * @constructor Decimal128
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ module.exports = require('mongodb/lib/bson').Decimal128;
@@ -0,0 +1,113 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * Module dependencies.
5
+ */
6
+
7
+ const ArrayMethods = require('../array/methods');
8
+ const DocumentArrayMethods = require('./methods');
9
+
10
+ const arrayAtomicsSymbol = require('../../helpers/symbols').arrayAtomicsSymbol;
11
+ const arrayAtomicsBackupSymbol = require('../../helpers/symbols').arrayAtomicsBackupSymbol;
12
+ const arrayParentSymbol = require('../../helpers/symbols').arrayParentSymbol;
13
+ const arrayPathSymbol = require('../../helpers/symbols').arrayPathSymbol;
14
+ const arraySchemaSymbol = require('../../helpers/symbols').arraySchemaSymbol;
15
+
16
+ const _basePush = Array.prototype.push;
17
+ const numberRE = /^\d+$/;
18
+ /**
19
+ * DocumentArray constructor
20
+ *
21
+ * @param {Array} values
22
+ * @param {String} path the path to this array
23
+ * @param {Document} doc parent document
24
+ * @api private
25
+ * @return {MongooseDocumentArray}
26
+ * @inherits MongooseArray
27
+ * @see https://bit.ly/f6CnZU
28
+ */
29
+
30
+ function MongooseDocumentArray(values, path, doc, schematype) {
31
+ const __array = [];
32
+
33
+ const internals = {
34
+ [arrayAtomicsSymbol]: {},
35
+ [arrayAtomicsBackupSymbol]: void 0,
36
+ [arrayPathSymbol]: path,
37
+ [arraySchemaSymbol]: void 0,
38
+ [arrayParentSymbol]: void 0
39
+ };
40
+
41
+ if (Array.isArray(values)) {
42
+ if (values[arrayPathSymbol] === path &&
43
+ values[arrayParentSymbol] === doc) {
44
+ internals[arrayAtomicsSymbol] = Object.assign({}, values[arrayAtomicsSymbol]);
45
+ }
46
+ values.forEach(v => {
47
+ _basePush.call(__array, v);
48
+ });
49
+ }
50
+ internals[arrayPathSymbol] = path;
51
+ internals.__array = __array;
52
+
53
+ if (doc?.$__) {
54
+ internals[arrayParentSymbol] = doc;
55
+ internals[arraySchemaSymbol] = doc.$__schema.path(path);
56
+
57
+ // `schema.path()` doesn't drill into nested arrays properly yet, see
58
+ // gh-6398, gh-6602. This is a workaround because nested arrays are
59
+ // always plain non-document arrays, so once you get to a document array
60
+ // nesting is done. Matryoshka code.
61
+ while (internals[arraySchemaSymbol] != null &&
62
+ internals[arraySchemaSymbol].$isMongooseArray &&
63
+ !internals[arraySchemaSymbol].$isMongooseDocumentArray) {
64
+ internals[arraySchemaSymbol] = internals[arraySchemaSymbol].embeddedSchemaType;
65
+ }
66
+ }
67
+
68
+ const proxy = new Proxy(__array, {
69
+ get: function(target, prop) {
70
+ if (prop === 'isMongooseArray' ||
71
+ prop === 'isMongooseArrayProxy' ||
72
+ prop === 'isMongooseDocumentArray' ||
73
+ prop === 'isMongooseDocumentArrayProxy') {
74
+ return true;
75
+ }
76
+ if (Object.hasOwn(internals, prop)) {
77
+ return internals[prop];
78
+ }
79
+ if (Object.hasOwn(DocumentArrayMethods, prop)) {
80
+ return DocumentArrayMethods[prop];
81
+ }
82
+ if (schematype?.virtuals && Object.hasOwn(schematype.virtuals, prop)) {
83
+ return schematype.virtuals[prop].applyGetters(undefined, target);
84
+ }
85
+ if (Object.hasOwn(ArrayMethods, prop)) {
86
+ return ArrayMethods[prop];
87
+ }
88
+
89
+ return __array[prop];
90
+ },
91
+ set: function(target, prop, value) {
92
+ if (typeof prop === 'string' && numberRE.test(prop)) {
93
+ DocumentArrayMethods.set.call(proxy, prop, value, false);
94
+ } else if (Object.hasOwn(internals, prop)) {
95
+ internals[prop] = value;
96
+ } else if (schematype?.virtuals && Object.hasOwn(schematype.virtuals, prop)) {
97
+ schematype.virtuals[prop].applySetters(value, target);
98
+ } else {
99
+ __array[prop] = value;
100
+ }
101
+
102
+ return true;
103
+ }
104
+ });
105
+
106
+ return proxy;
107
+ }
108
+
109
+ /*!
110
+ * Module exports.
111
+ */
112
+
113
+ module.exports = MongooseDocumentArray;
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ exports.isMongooseDocumentArray = function(mongooseDocumentArray) {
4
+ return Array.isArray(mongooseDocumentArray) && mongooseDocumentArray.isMongooseDocumentArray;
5
+ };