@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,464 @@
1
+ 'use strict';
2
+
3
+ const Document = require('../document');
4
+ const internalToObjectOptions = require('../options').internalToObjectOptions;
5
+ const util = require('util');
6
+ const utils = require('../utils');
7
+
8
+ module.exports = Subdocument;
9
+
10
+ /**
11
+ * Subdocument constructor.
12
+ *
13
+ * @inherits Document
14
+ * @api private
15
+ */
16
+
17
+ function Subdocument(value, fields, parent, options) {
18
+ if (parent != null) {
19
+ // If setting a nested path, should copy isNew from parent re: gh-7048
20
+ const parentOptions = { isNew: parent.isNew };
21
+ if ('defaults' in parent.$__) {
22
+ parentOptions.defaults = parent.$__.defaults;
23
+ }
24
+ options = Object.assign(parentOptions, options);
25
+ }
26
+ if (options?.path != null) {
27
+ this.$basePath = options.path;
28
+ }
29
+ if (options?.pathRelativeToParent != null) {
30
+ this.$pathRelativeToParent = options.pathRelativeToParent;
31
+ }
32
+
33
+ // Don't pass `path` to Document constructor: path is used for storing the
34
+ // absolute path to this schematype relative to the top-level document, but
35
+ // subdocuments use relative paths (relative to the parent document) to track changes.
36
+ // This avoids the subdocument's fields receiving the subdocument's path as options.path.
37
+ let documentOptions = options;
38
+ if (options?.path != null) {
39
+ documentOptions = Object.assign({}, options);
40
+ delete documentOptions.path;
41
+ }
42
+
43
+ Document.call(this, value, fields, documentOptions);
44
+
45
+ delete this.$__.priorDoc;
46
+ }
47
+
48
+ Subdocument.prototype = Object.create(Document.prototype);
49
+
50
+ Object.defineProperty(Subdocument.prototype, '$isSubdocument', {
51
+ configurable: false,
52
+ writable: false,
53
+ value: true
54
+ });
55
+
56
+ Object.defineProperty(Subdocument.prototype, '$isSingleNested', {
57
+ configurable: false,
58
+ writable: false,
59
+ value: true
60
+ });
61
+
62
+ /*!
63
+ * ignore
64
+ */
65
+
66
+ Subdocument.prototype.toBSON = function() {
67
+ return this.toObject(internalToObjectOptions);
68
+ };
69
+
70
+ /**
71
+ * Used as a stub for middleware
72
+ *
73
+ * #### Note:
74
+ *
75
+ * _This is a no-op. Does not actually save the doc to the db._
76
+ *
77
+ * @param {Function} [fn]
78
+ * @return {Promise} resolved Promise
79
+ * @api private
80
+ */
81
+
82
+ Subdocument.prototype.save = async function save(options) {
83
+ options = options || {};
84
+
85
+ if (!options.suppressWarning) {
86
+ utils.warn('mongoose: calling `save()` on a subdoc does **not** save ' +
87
+ 'the document to MongoDB, it only runs save middleware. ' +
88
+ 'Use `subdoc.save({ suppressWarning: true })` to hide this warning ' +
89
+ 'if you\'re sure this behavior is right for your app.');
90
+ }
91
+
92
+ return await this.$__save();
93
+ };
94
+
95
+ /**
96
+ * Given a path relative to this document, return the path relative
97
+ * to the top-level document.
98
+ * @param {String} path
99
+ * @method $__fullPath
100
+ * @memberOf Subdocument
101
+ * @instance
102
+ * @returns {String}
103
+ * @api private
104
+ */
105
+
106
+ Subdocument.prototype.$__fullPath = function(path) {
107
+ if (!this.$__.fullPath) {
108
+ this.ownerDocument();
109
+ }
110
+
111
+ return path ?
112
+ this.$__.fullPath + '.' + path :
113
+ this.$__.fullPath;
114
+ };
115
+
116
+ /**
117
+ * Given a path relative to this document, return the path relative
118
+ * to the parent document.
119
+ * @param {String} p
120
+ * @returns {String}
121
+ * @method $__pathRelativeToParent
122
+ * @memberOf Subdocument
123
+ * @instance
124
+ * @api private
125
+ */
126
+
127
+ Subdocument.prototype.$__pathRelativeToParent = function(p) {
128
+ // If this subdocument has a stored relative path (set by map when subdoc is created),
129
+ // use it directly to avoid string operations
130
+ if (this.$pathRelativeToParent != null) {
131
+ return p == null ? this.$pathRelativeToParent : this.$pathRelativeToParent + '.' + p;
132
+ }
133
+
134
+ if (p == null) {
135
+ return this.$basePath;
136
+ }
137
+ if (!this.$basePath) {
138
+ return p;
139
+ }
140
+ return [this.$basePath, p].join('.');
141
+ };
142
+
143
+ /**
144
+ * Used as a stub for middleware
145
+ *
146
+ * #### Note:
147
+ *
148
+ * _This is a no-op. Does not actually save the doc to the db._
149
+ *
150
+ * @param {Function} [fn]
151
+ * @method $__save
152
+ * @api private
153
+ */
154
+
155
+ Subdocument.prototype.$__save = async function $__save() {
156
+ try {
157
+ await this._execDocumentPreHooks('save');
158
+ } catch (error) {
159
+ await this._execDocumentPostHooks('save', error);
160
+ return;
161
+ }
162
+
163
+ await this._execDocumentPostHooks('save');
164
+ };
165
+
166
+ /*!
167
+ * ignore
168
+ */
169
+
170
+ Subdocument.prototype.$isValid = function(path) {
171
+ const parent = this.$parent();
172
+ const fullPath = this.$__pathRelativeToParent(path);
173
+ if (parent != null && fullPath != null) {
174
+ return parent.$isValid(fullPath);
175
+ }
176
+ return Document.prototype.$isValid.call(this, path);
177
+ };
178
+
179
+ /*!
180
+ * ignore
181
+ */
182
+
183
+ Subdocument.prototype.markModified = function(path) {
184
+ Document.prototype.markModified.call(this, path);
185
+ const parent = this.$parent();
186
+
187
+ if (parent == null) {
188
+ return;
189
+ }
190
+
191
+ const pathToMark = this.$__pathRelativeToParent(path);
192
+ if (pathToMark == null) {
193
+ return;
194
+ }
195
+
196
+ const myPath = this.$__pathRelativeToParent().replace(/\.$/, '');
197
+ if (parent.isDirectModified(myPath) || this.isNew) {
198
+ return;
199
+ }
200
+
201
+ this.$__parent.markModified(pathToMark, this);
202
+ };
203
+
204
+ /*!
205
+ * ignore
206
+ */
207
+
208
+ Subdocument.prototype.isModified = function(paths, options, modifiedPaths) {
209
+ const parent = this.$parent();
210
+ if (parent != null) {
211
+ if (Array.isArray(paths) || typeof paths === 'string') {
212
+ paths = (Array.isArray(paths) ? paths : paths.split(' '));
213
+ paths = paths.map(p => this.$__pathRelativeToParent(p)).filter(p => p != null);
214
+ } else if (!paths) {
215
+ paths = this.$__pathRelativeToParent();
216
+ }
217
+
218
+ return parent.$isModified(paths, options, modifiedPaths);
219
+ }
220
+
221
+ return Document.prototype.isModified.call(this, paths, options, modifiedPaths);
222
+ };
223
+
224
+ /**
225
+ * Marks a path as valid, removing existing validation errors.
226
+ *
227
+ * @param {String} path the field to mark as valid
228
+ * @api private
229
+ * @method $markValid
230
+ * @memberOf Subdocument
231
+ */
232
+
233
+ Subdocument.prototype.$markValid = function(path) {
234
+ Document.prototype.$markValid.call(this, path);
235
+ const parent = this.$parent();
236
+ const fullPath = this.$__pathRelativeToParent(path);
237
+ if (parent != null && fullPath != null) {
238
+ parent.$markValid(fullPath);
239
+ }
240
+ };
241
+
242
+ /*!
243
+ * ignore
244
+ */
245
+
246
+ Subdocument.prototype.invalidate = function(path, err, val) {
247
+ Document.prototype.invalidate.call(this, path, err, val);
248
+
249
+ const parent = this.$parent();
250
+ const fullPath = this.$__pathRelativeToParent(path);
251
+ if (parent != null && fullPath != null) {
252
+ parent.invalidate(fullPath, err, val);
253
+ } else if (err.kind === 'cast' || err.name === 'CastError' || fullPath == null) {
254
+ throw err;
255
+ }
256
+
257
+ return this.ownerDocument().$__.validationError;
258
+ };
259
+
260
+ /*!
261
+ * ignore
262
+ */
263
+
264
+ Subdocument.prototype.$ignore = function(path) {
265
+ Document.prototype.$ignore.call(this, path);
266
+ const parent = this.$parent();
267
+ const fullPath = this.$__pathRelativeToParent(path);
268
+ if (parent != null && fullPath != null) {
269
+ parent.$ignore(fullPath);
270
+ }
271
+ };
272
+
273
+ /**
274
+ * Returns the top level document of this sub-document.
275
+ *
276
+ * @return {Document}
277
+ */
278
+
279
+ Subdocument.prototype.ownerDocument = function() {
280
+ if (this.$__.ownerDocument) {
281
+ return this.$__.ownerDocument;
282
+ }
283
+
284
+ let parent = this;
285
+ const paths = [];
286
+ const seenDocs = new Set([parent]);
287
+
288
+ while (true) {
289
+ if (typeof parent.$__pathRelativeToParent !== 'function') {
290
+ break;
291
+ }
292
+ paths.unshift(parent.$__pathRelativeToParent(void 0, true));
293
+ const _parent = parent.$parent();
294
+ if (_parent == null) {
295
+ break;
296
+ }
297
+ parent = _parent;
298
+ if (seenDocs.has(parent)) {
299
+ throw new Error('Infinite subdocument loop: subdoc with _id ' + parent._id + ' is a parent of itself');
300
+ }
301
+
302
+ seenDocs.add(parent);
303
+ }
304
+
305
+ this.$__.fullPath = paths.join('.');
306
+
307
+ this.$__.ownerDocument = parent;
308
+ return this.$__.ownerDocument;
309
+ };
310
+
311
+ /*!
312
+ * ignore
313
+ */
314
+
315
+ Subdocument.prototype.$__fullPathWithIndexes = function() {
316
+ let parent = this;
317
+ const paths = [];
318
+ const seenDocs = new Set([parent]);
319
+
320
+ while (true) {
321
+ if (typeof parent.$__pathRelativeToParent !== 'function') {
322
+ break;
323
+ }
324
+ paths.unshift(parent.$__pathRelativeToParent(void 0, false));
325
+ const _parent = parent.$parent();
326
+ if (_parent == null) {
327
+ break;
328
+ }
329
+ parent = _parent;
330
+ if (seenDocs.has(parent)) {
331
+ throw new Error('Infinite subdocument loop: subdoc with _id ' + parent._id + ' is a parent of itself');
332
+ }
333
+
334
+ seenDocs.add(parent);
335
+ }
336
+
337
+ return paths.join('.');
338
+ };
339
+
340
+ /**
341
+ * Returns this sub-documents parent document.
342
+ *
343
+ * @api public
344
+ */
345
+
346
+ Subdocument.prototype.parent = function() {
347
+ return this.$__parent;
348
+ };
349
+
350
+ /**
351
+ * Returns this sub-documents parent document.
352
+ *
353
+ * @api public
354
+ * @method $parent
355
+ */
356
+
357
+ Subdocument.prototype.$parent = Subdocument.prototype.parent;
358
+
359
+ /*!
360
+ * Sets this sub-documents parent document.
361
+ *
362
+ * @api private
363
+ */
364
+
365
+ Subdocument.prototype.$__setParent = function $__setParent(parent) {
366
+ this.$__parent = parent;
367
+ };
368
+
369
+ /**
370
+ * ignore
371
+ * @method $__removeFromParent
372
+ * @memberOf Subdocument
373
+ * @instance
374
+ * @api private
375
+ */
376
+
377
+ Subdocument.prototype.$__removeFromParent = function() {
378
+ this.$__parent.set(this.$basePath, null);
379
+ };
380
+
381
+ /**
382
+ * Null-out this subdoc
383
+ *
384
+ * @param {Object} [options]
385
+ */
386
+
387
+ Subdocument.prototype.deleteOne = function deleteOne(options) {
388
+ registerRemoveListener(this);
389
+
390
+ // If removing entire doc, no need to remove subdoc
391
+ if (!options?.noop) {
392
+ this.$__removeFromParent();
393
+
394
+ const owner = this.ownerDocument();
395
+ owner.$__.removedSubdocs = owner.$__.removedSubdocs || [];
396
+ owner.$__.removedSubdocs.push(this);
397
+ }
398
+ };
399
+
400
+ /*!
401
+ * ignore
402
+ */
403
+
404
+ Subdocument.prototype.populate = function() {
405
+ throw new Error('Mongoose does not support calling populate() on nested ' +
406
+ 'docs. Instead of `doc.nested.populate("path")`, use ' +
407
+ '`doc.populate("nested.path")`');
408
+ };
409
+
410
+ /**
411
+ * Helper for console.log
412
+ *
413
+ * @api public
414
+ */
415
+
416
+ Subdocument.prototype.inspect = function() {
417
+ return this.toObject();
418
+ };
419
+
420
+ if (util.inspect.custom) {
421
+ // Avoid Node deprecation warning DEP0079
422
+ Subdocument.prototype[util.inspect.custom] = Subdocument.prototype.inspect;
423
+ }
424
+
425
+ /**
426
+ * Override `$toObject()` to handle minimizing the whole path. Should not minimize if schematype-level minimize
427
+ * is set to false re: gh-11247, gh-14058, gh-14151
428
+ */
429
+
430
+ Subdocument.prototype.$toObject = function $toObject(options, json) {
431
+ const ret = Document.prototype.$toObject.call(this, options, json);
432
+
433
+ // If `$toObject()` was called recursively, respect the minimize option, including schematype level minimize.
434
+ // If minimize is set, then we can minimize out the whole object.
435
+ if (utils.hasOwnKeys(ret) === false && options?._calledWithOptions != null) {
436
+ const minimize = options._calledWithOptions?.minimize ?? this?.$__schemaTypeOptions?.minimize ?? options.minimize;
437
+ if (minimize && !this.constructor.$__required) {
438
+ return undefined;
439
+ }
440
+ }
441
+ return ret;
442
+ };
443
+
444
+ /**
445
+ * Registers remove event listeners for triggering
446
+ * on subdocuments.
447
+ *
448
+ * @param {Subdocument} sub
449
+ * @api private
450
+ */
451
+
452
+ function registerRemoveListener(sub) {
453
+ const owner = sub.ownerDocument();
454
+
455
+ function emitRemove() {
456
+ owner.$removeListener('save', emitRemove);
457
+ owner.$removeListener('deleteOne', emitRemove);
458
+ sub.emit('deleteOne', sub);
459
+ sub.constructor.emit('deleteOne', sub);
460
+ }
461
+
462
+ owner.$on('save', emitRemove);
463
+ owner.$on('deleteOne', emitRemove);
464
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * UUID type constructor
3
+ *
4
+ * #### Example:
5
+ *
6
+ * const id = new mongoose.Types.UUID();
7
+ *
8
+ * @constructor UUID
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ module.exports = require('mongodb/lib/bson').UUID;