@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,656 @@
1
+ 'use strict';
2
+
3
+ /*!
4
+ * Module dependencies.
5
+ */
6
+
7
+ const CastError = require('../error/cast');
8
+ const DocumentArrayElement = require('./documentArrayElement');
9
+ const EventEmitter = require('events').EventEmitter;
10
+ const SchemaArray = require('./array');
11
+ const SchemaDocumentArrayOptions =
12
+ require('../options/schemaDocumentArrayOptions');
13
+ const SchemaType = require('../schemaType');
14
+ const cast = require('../cast');
15
+ const createJSONSchemaTypeDefinition = require('../helpers/createJSONSchemaTypeDefinition');
16
+ const discriminator = require('../helpers/model/discriminator');
17
+ const handleIdOption = require('../helpers/schema/handleIdOption');
18
+ const handleSpreadDoc = require('../helpers/document/handleSpreadDoc');
19
+ const isOperator = require('../helpers/query/isOperator');
20
+ const utils = require('../utils');
21
+ const getConstructor = require('../helpers/discriminator/getConstructor');
22
+ const InvalidSchemaOptionError = require('../error/invalidSchemaOption');
23
+
24
+ const arrayAtomicsSymbol = require('../helpers/symbols').arrayAtomicsSymbol;
25
+ const arrayPathSymbol = require('../helpers/symbols').arrayPathSymbol;
26
+ const documentArrayParent = require('../helpers/symbols').documentArrayParent;
27
+
28
+ let MongooseDocumentArray;
29
+ let Subdocument;
30
+
31
+ /**
32
+ * SubdocsArray SchemaType constructor
33
+ *
34
+ * @param {String} key
35
+ * @param {Schema} schema
36
+ * @param {Object} options
37
+ * @param {Object} schemaOptions
38
+ * @param {Schema} parentSchema
39
+ * @inherits SchemaArray
40
+ * @api public
41
+ */
42
+
43
+ function SchemaDocumentArray(key, schema, options, schemaOptions, parentSchema) {
44
+ if (schema.options?.timeseries) {
45
+ throw new InvalidSchemaOptionError(key, 'timeseries');
46
+ }
47
+ const schemaTypeIdOption = SchemaDocumentArray.defaultOptions?._id;
48
+ if (schemaTypeIdOption != null) {
49
+ schemaOptions = schemaOptions || {};
50
+ schemaOptions._id = schemaTypeIdOption;
51
+ }
52
+
53
+ if (schemaOptions?._id != null) {
54
+ schema = handleIdOption(schema, schemaOptions);
55
+ } else if (options?._id != null) {
56
+ schema = handleIdOption(schema, options);
57
+ }
58
+
59
+ const Constructor = _createConstructor(schema, options);
60
+ Constructor.prototype.$basePath = key;
61
+ Constructor.path = key;
62
+
63
+ const $parentSchemaType = this;
64
+ const embeddedSchemaType = new DocumentArrayElement(key + '.$', schema, {
65
+ ...(schemaOptions || {}),
66
+ $parentSchemaType,
67
+ Constructor
68
+ });
69
+
70
+ SchemaArray.call(this, key, embeddedSchemaType, options, null, parentSchema);
71
+
72
+ this.schema = schema;
73
+ // EmbeddedDocument schematype options
74
+ this.schemaOptions = schemaOptions || {};
75
+ this.$isMongooseDocumentArray = true;
76
+ this.Constructor = Constructor;
77
+
78
+ Constructor.base = schema.base;
79
+
80
+ const fn = this.defaultValue;
81
+
82
+ if (!('defaultValue' in this) || fn != null) {
83
+ this.default(function() {
84
+ let arr = fn.call(this);
85
+ if (arr != null && !Array.isArray(arr)) {
86
+ arr = [arr];
87
+ }
88
+ // Leave it up to `cast()` to convert this to a documentarray
89
+ return arr;
90
+ });
91
+ }
92
+ }
93
+
94
+ /**
95
+ * This schema type's name, to defend against minifiers that mangle
96
+ * function names.
97
+ *
98
+ * @api public
99
+ */
100
+ SchemaDocumentArray.schemaName = 'DocumentArray';
101
+
102
+ /**
103
+ * Options for all document arrays.
104
+ *
105
+ * - `castNonArrays`: `true` by default. If `false`, Mongoose will throw a CastError when a value isn't an array. If `true`, Mongoose will wrap the provided value in an array before casting.
106
+ *
107
+ * @api public
108
+ */
109
+
110
+ SchemaDocumentArray.options = { castNonArrays: true };
111
+
112
+ /*!
113
+ * Inherits from SchemaArray.
114
+ */
115
+ SchemaDocumentArray.prototype = Object.create(SchemaArray.prototype);
116
+ SchemaDocumentArray.prototype.constructor = SchemaDocumentArray;
117
+ SchemaDocumentArray.prototype.OptionsConstructor = SchemaDocumentArrayOptions;
118
+
119
+ /**
120
+ * Contains the handlers for different query operators for this schema type.
121
+ * For example, `$conditionalHandlers.$size` is the function Mongoose calls to cast `$size` filter operators.
122
+ *
123
+ * @property $conditionalHandlers
124
+ * @memberOf SchemaDocumentArray
125
+ * @instance
126
+ * @api public
127
+ */
128
+
129
+ Object.defineProperty(SchemaDocumentArray.prototype, '$conditionalHandlers', {
130
+ enumerable: false,
131
+ value: { ...SchemaArray.prototype.$conditionalHandlers }
132
+ });
133
+
134
+ /*!
135
+ * ignore
136
+ */
137
+
138
+ function _createConstructor(schema, options, baseClass) {
139
+ Subdocument || (Subdocument = require('../types/arraySubdocument'));
140
+
141
+ // compile an embedded document for this schema
142
+ function EmbeddedDocument() {
143
+ Subdocument.apply(this, arguments);
144
+ if (this.__parentArray == null || this.__parentArray.getArrayParent() == null) {
145
+ return;
146
+ }
147
+ this.$session(this.__parentArray.getArrayParent().$session());
148
+ }
149
+
150
+ schema._preCompile();
151
+
152
+ const proto = baseClass?.prototype ?? Subdocument.prototype;
153
+ EmbeddedDocument.prototype = Object.create(proto);
154
+ EmbeddedDocument.prototype.$__setSchema(schema);
155
+ EmbeddedDocument.schema = schema;
156
+ EmbeddedDocument.prototype.constructor = EmbeddedDocument;
157
+ EmbeddedDocument.$isArraySubdocument = true;
158
+ EmbeddedDocument.events = new EventEmitter();
159
+ EmbeddedDocument.base = schema.base;
160
+
161
+ // apply methods
162
+ for (const i in schema.methods) {
163
+ EmbeddedDocument.prototype[i] = schema.methods[i];
164
+ }
165
+
166
+ // apply statics
167
+ for (const i in schema.statics) {
168
+ EmbeddedDocument[i] = schema.statics[i];
169
+ }
170
+
171
+ for (const i in EventEmitter.prototype) {
172
+ EmbeddedDocument[i] = EventEmitter.prototype[i];
173
+ }
174
+
175
+ EmbeddedDocument.options = options;
176
+
177
+ return EmbeddedDocument;
178
+ }
179
+
180
+ /**
181
+ * Adds a discriminator to this document array.
182
+ *
183
+ * #### Example:
184
+ *
185
+ * const shapeSchema = Schema({ name: String }, { discriminatorKey: 'kind' });
186
+ * const schema = Schema({ shapes: [shapeSchema] });
187
+ *
188
+ * const docArrayPath = parentSchema.path('shapes');
189
+ * docArrayPath.discriminator('Circle', Schema({ radius: Number }));
190
+ *
191
+ * @param {String} name
192
+ * @param {Schema} schema fields to add to the schema for instances of this sub-class
193
+ * @param {Object|string} [options] If string, same as `options.value`.
194
+ * @param {String} [options.value] the string stored in the `discriminatorKey` property. If not specified, Mongoose uses the `name` parameter.
195
+ * @param {Boolean} [options.clone=true] By default, `discriminator()` clones the given `schema`. Set to `false` to skip cloning.
196
+ * @see discriminators https://mongoosejs.com/docs/discriminators.html
197
+ * @return {Function} the constructor Mongoose will use for creating instances of this discriminator model
198
+ * @api public
199
+ */
200
+
201
+ SchemaDocumentArray.prototype.discriminator = function(name, schema, options) {
202
+ if (typeof name === 'function') {
203
+ name = utils.getFunctionName(name);
204
+ }
205
+
206
+ options = options || {};
207
+ const tiedValue = utils.isPOJO(options) ? options.value : options;
208
+ const clone = typeof options.clone === 'boolean' ? options.clone : true;
209
+
210
+ if (schema.instanceOfSchema && clone) {
211
+ schema = schema.clone();
212
+ }
213
+
214
+ schema = discriminator(this.Constructor, name, schema, tiedValue, null, null, options?.overwriteExisting);
215
+
216
+ const EmbeddedDocument = _createConstructor(schema, null, this.Constructor);
217
+ EmbeddedDocument.baseCasterConstructor = this.Constructor;
218
+
219
+ Object.defineProperty(EmbeddedDocument, 'name', {
220
+ value: name
221
+ });
222
+
223
+ this.Constructor.discriminators[name] = EmbeddedDocument;
224
+
225
+ return this.Constructor.discriminators[name];
226
+ };
227
+
228
+ /**
229
+ * Performs local validations first, then validations on each embedded doc
230
+ *
231
+ * @api public
232
+ */
233
+
234
+ SchemaDocumentArray.prototype.doValidate = async function doValidate(array, scope, options) {
235
+ // lazy load
236
+ MongooseDocumentArray || (MongooseDocumentArray = require('../types/documentArray'));
237
+
238
+ await SchemaType.prototype.doValidate.call(this, array, scope);
239
+ if (options?.updateValidator) {
240
+ return;
241
+ }
242
+ if (!utils.isMongooseDocumentArray(array)) {
243
+ array = new MongooseDocumentArray(array, this.path, scope);
244
+ }
245
+
246
+ const promises = [];
247
+ for (let i = 0; i < array.length; ++i) {
248
+ // handle sparse arrays, do not use array.forEach which does not
249
+ // iterate over sparse elements yet reports array.length including
250
+ // them :(
251
+ let doc = array[i];
252
+ if (doc == null) {
253
+ continue;
254
+ }
255
+ // If you set the array index directly, the doc might not yet be
256
+ // a full fledged mongoose subdoc, so make it into one.
257
+ if (!(doc instanceof Subdocument)) {
258
+ const Constructor = getConstructor(this.Constructor, array[i]);
259
+ doc = array[i] = new Constructor(doc, array, undefined, undefined, i);
260
+ }
261
+
262
+ if (options?.validateModifiedOnly && !doc.$isModified()) {
263
+ continue;
264
+ }
265
+
266
+ promises.push(doc.$__validate(null, options));
267
+ }
268
+
269
+ await Promise.all(promises);
270
+ };
271
+
272
+ /**
273
+ * Performs local validations first, then validations on each embedded doc.
274
+ *
275
+ * #### Note:
276
+ *
277
+ * This method ignores the asynchronous validators.
278
+ *
279
+ * @return {MongooseError|undefined}
280
+ * @api private
281
+ */
282
+
283
+ SchemaDocumentArray.prototype.doValidateSync = function(array, scope, options) {
284
+ const schemaTypeError = SchemaType.prototype.doValidateSync.call(this, array, scope);
285
+ if (schemaTypeError != null) {
286
+ return schemaTypeError;
287
+ }
288
+
289
+ const count = array?.length;
290
+ let resultError = null;
291
+
292
+ if (!count) {
293
+ return;
294
+ }
295
+
296
+ // handle sparse arrays, do not use array.forEach which does not
297
+ // iterate over sparse elements yet reports array.length including
298
+ // them :(
299
+
300
+ for (let i = 0, len = count; i < len; ++i) {
301
+ // sidestep sparse entries
302
+ let doc = array[i];
303
+ if (!doc) {
304
+ continue;
305
+ }
306
+
307
+ // If you set the array index directly, the doc might not yet be
308
+ // a full fledged mongoose subdoc, so make it into one.
309
+ if (!(doc instanceof Subdocument)) {
310
+ const Constructor = getConstructor(this.Constructor, array[i]);
311
+ doc = array[i] = new Constructor(doc, array, undefined, undefined, i);
312
+ }
313
+
314
+ if (options?.validateModifiedOnly && !doc.$isModified()) {
315
+ continue;
316
+ }
317
+
318
+ const subdocValidateError = doc.validateSync(options);
319
+
320
+ if (subdocValidateError && resultError == null) {
321
+ resultError = subdocValidateError;
322
+ }
323
+ }
324
+
325
+ return resultError;
326
+ };
327
+
328
+ /*!
329
+ * ignore
330
+ */
331
+
332
+ SchemaDocumentArray.prototype.getDefault = function(scope, init, options) {
333
+ let ret = typeof this.defaultValue === 'function'
334
+ ? this.defaultValue.call(scope)
335
+ : this.defaultValue;
336
+
337
+ if (ret == null) {
338
+ return ret;
339
+ }
340
+
341
+ if (options?.skipCast) {
342
+ return ret;
343
+ }
344
+
345
+ // lazy load
346
+ MongooseDocumentArray || (MongooseDocumentArray = require('../types/documentArray'));
347
+
348
+ if (!Array.isArray(ret)) {
349
+ ret = [ret];
350
+ }
351
+
352
+ ret = new MongooseDocumentArray(ret, this.path, scope);
353
+
354
+ for (let i = 0; i < ret.length; ++i) {
355
+ const Constructor = getConstructor(this.Constructor, ret[i]);
356
+ const _subdoc = new Constructor({}, ret, undefined,
357
+ undefined, i);
358
+ _subdoc.$init(ret[i]);
359
+ _subdoc.isNew = true;
360
+
361
+ // Make sure all paths in the subdoc are set to `default` instead
362
+ // of `init` since we used `init`.
363
+ Object.assign(_subdoc.$__.activePaths.default, _subdoc.$__.activePaths.init);
364
+ _subdoc.$__.activePaths.init = {};
365
+
366
+ ret[i] = _subdoc;
367
+ }
368
+
369
+ return ret;
370
+ };
371
+
372
+ const _toObjectOptions = Object.freeze({ transform: false, virtuals: false });
373
+ const initDocumentOptions = Object.freeze({ skipId: false, willInit: true });
374
+
375
+ /**
376
+ * Casts contents
377
+ *
378
+ * @param {Object} value
379
+ * @param {Document} document that triggers the casting
380
+ * @api private
381
+ */
382
+
383
+ SchemaDocumentArray.prototype.cast = function(value, doc, init, prev, options) {
384
+ // lazy load
385
+ MongooseDocumentArray || (MongooseDocumentArray = require('../types/documentArray'));
386
+
387
+ // Skip casting if `value` is the same as the previous value, no need to cast. See gh-9266
388
+ if (value?.[arrayPathSymbol] != null && value === prev) {
389
+ return value;
390
+ }
391
+
392
+ let selected;
393
+ let subdoc;
394
+
395
+ options = options || {};
396
+
397
+ const path = options.path || this.path;
398
+
399
+ if (!Array.isArray(value)) {
400
+ if (!init && !SchemaDocumentArray.options.castNonArrays) {
401
+ throw new CastError('DocumentArray', value, this.path, null, this);
402
+ }
403
+ // gh-2442 mark whole array as modified if we're initializing a doc from
404
+ // the db and the path isn't an array in the document
405
+ if (!!doc && init) {
406
+ doc.markModified(path);
407
+ }
408
+ return this.cast([value], doc, init, prev, options);
409
+ }
410
+
411
+ // We need to create a new array, otherwise change tracking will
412
+ // update the old doc (gh-4449)
413
+ if (!options.skipDocumentArrayCast || utils.isMongooseDocumentArray(value)) {
414
+ value = new MongooseDocumentArray(value, path, doc, this);
415
+ }
416
+
417
+ if (prev != null) {
418
+ value[arrayAtomicsSymbol] = prev[arrayAtomicsSymbol] || {};
419
+ }
420
+
421
+ if (options.arrayPathIndex != null) {
422
+ value[arrayPathSymbol] = path + '.' + options.arrayPathIndex;
423
+ }
424
+
425
+ const rawArray = utils.isMongooseDocumentArray(value) ? value.__array : value;
426
+ const len = rawArray.length;
427
+
428
+ for (let i = 0; i < len; ++i) {
429
+ if (!rawArray[i]) {
430
+ continue;
431
+ }
432
+
433
+ const Constructor = getConstructor(this.Constructor, rawArray[i]);
434
+
435
+ const spreadDoc = handleSpreadDoc(rawArray[i], true);
436
+ if (rawArray[i] !== spreadDoc) {
437
+ rawArray[i] = spreadDoc;
438
+ }
439
+
440
+ if (rawArray[i] instanceof Subdocument) {
441
+ if (rawArray[i][documentArrayParent] !== doc) {
442
+ if (init) {
443
+ const subdoc = new Constructor(null, value, initDocumentOptions, selected, i);
444
+ rawArray[i] = subdoc.$init(rawArray[i]);
445
+ } else {
446
+ const subdoc = new Constructor(rawArray[i], value, undefined, undefined, i);
447
+ rawArray[i] = subdoc;
448
+ }
449
+ }
450
+ // Might not have the correct index yet, so ensure it does.
451
+ if (rawArray[i].__index == null) {
452
+ rawArray[i].$setIndex(i);
453
+ }
454
+ } else if (rawArray[i] != null) {
455
+ if (init) {
456
+ if (doc) {
457
+ selected || (selected = scopePaths(this, doc.$__.selected, init));
458
+ } else {
459
+ selected = true;
460
+ }
461
+
462
+ subdoc = new Constructor(null, value, initDocumentOptions, selected, i);
463
+ rawArray[i] = subdoc.$init(rawArray[i], options);
464
+ } else {
465
+ if (typeof prev?.id === 'function') {
466
+ subdoc = prev.id(rawArray[i]._id);
467
+ }
468
+
469
+ if (prev && subdoc && utils.deepEqual(subdoc.toObject(_toObjectOptions), rawArray[i])) {
470
+ // handle resetting doc with existing id and same data
471
+ subdoc.set(rawArray[i]);
472
+ // if set() is hooked it will have no return value
473
+ // see gh-746
474
+ rawArray[i] = subdoc;
475
+ } else {
476
+ try {
477
+ subdoc = new Constructor(rawArray[i], value, undefined,
478
+ undefined, i);
479
+ // if set() is hooked it will have no return value
480
+ // see gh-746
481
+ rawArray[i] = subdoc;
482
+ } catch (error) {
483
+ throw new CastError('embedded', rawArray[i],
484
+ value[arrayPathSymbol], error, this);
485
+ }
486
+ }
487
+ }
488
+ }
489
+ }
490
+
491
+ return value;
492
+ };
493
+
494
+ /*!
495
+ * ignore
496
+ */
497
+
498
+ SchemaDocumentArray.prototype.clone = function() {
499
+ const options = Object.assign({}, this.options);
500
+ const schematype = new this.constructor(
501
+ this.path,
502
+ this.schema,
503
+ options,
504
+ this.schemaOptions,
505
+ this.parentSchema
506
+ );
507
+ schematype.validators = this.validators.slice();
508
+ if (this.requiredValidator !== undefined) {
509
+ schematype.requiredValidator = this.requiredValidator;
510
+ }
511
+ schematype.Constructor.discriminators = Object.assign({},
512
+ this.Constructor.discriminators);
513
+ schematype._appliedDiscriminators = this._appliedDiscriminators;
514
+ return schematype;
515
+ };
516
+
517
+ /*!
518
+ * ignore
519
+ */
520
+
521
+ SchemaDocumentArray.prototype.applyGetters = function(value, scope) {
522
+ return SchemaType.prototype.applyGetters.call(this, value, scope);
523
+ };
524
+
525
+ /**
526
+ * Scopes paths selected in a query to this array.
527
+ * Necessary for proper default application of subdocument values.
528
+ *
529
+ * @param {DocumentArrayPath} array the array to scope `fields` paths
530
+ * @param {Object|undefined} fields the root fields selected in the query
531
+ * @param {Boolean|undefined} init if we are being created part of a query result
532
+ * @api private
533
+ */
534
+
535
+ function scopePaths(array, fields, init) {
536
+ if (!(init && fields)) {
537
+ return undefined;
538
+ }
539
+
540
+ const path = array.path + '.';
541
+ const keys = Object.keys(fields);
542
+ let i = keys.length;
543
+ const selected = {};
544
+ let hasKeys;
545
+ let key;
546
+ let sub;
547
+
548
+ while (i--) {
549
+ key = keys[i];
550
+ if (key.startsWith(path)) {
551
+ sub = key.substring(path.length);
552
+ if (sub === '$') {
553
+ continue;
554
+ }
555
+ if (sub.startsWith('$.')) {
556
+ sub = sub.substring(2);
557
+ }
558
+ hasKeys || (hasKeys = true);
559
+ selected[sub] = fields[key];
560
+ }
561
+ }
562
+
563
+ return hasKeys && selected || undefined;
564
+ }
565
+
566
+ /*!
567
+ * ignore
568
+ */
569
+
570
+ SchemaDocumentArray.defaultOptions = {};
571
+
572
+ /**
573
+ * Sets a default option for all DocumentArray instances.
574
+ *
575
+ * #### Example:
576
+ *
577
+ * // Make all document arrays not have `_id` by default.
578
+ * mongoose.Schema.Types.DocumentArray.set('_id', false);
579
+ *
580
+ * @param {String} option The name of the option you'd like to set (e.g. trim, lowercase, etc...)
581
+ * @param {Any} value The value of the option you'd like to set.
582
+ * @return {void}
583
+ * @function set
584
+ * @static
585
+ * @api public
586
+ */
587
+
588
+ SchemaDocumentArray.set = SchemaType.set;
589
+
590
+ SchemaDocumentArray.setters = [];
591
+
592
+ /**
593
+ * Attaches a getter for all DocumentArrayPath instances
594
+ *
595
+ * @param {Function} getter
596
+ * @return {this}
597
+ * @function get
598
+ * @static
599
+ * @api public
600
+ */
601
+
602
+ SchemaDocumentArray.get = SchemaType.get;
603
+
604
+ /*!
605
+ * Handle casting $elemMatch operators
606
+ */
607
+
608
+ SchemaDocumentArray.prototype.$conditionalHandlers.$elemMatch = cast$elemMatch;
609
+
610
+ function cast$elemMatch(val, context) {
611
+ const keys = Object.keys(val);
612
+ const numKeys = keys.length;
613
+ for (let i = 0; i < numKeys; ++i) {
614
+ const key = keys[i];
615
+ const value = val[key];
616
+ if (isOperator(key) && value != null) {
617
+ val[key] = this.castForQuery(key, value, context);
618
+ }
619
+ }
620
+
621
+ // Is this an embedded discriminator and is the discriminator key set?
622
+ // If so, use the discriminator schema. See gh-7449
623
+ const discriminatorKey = this?.Constructor?.schema?.options?.discriminatorKey;
624
+ const discriminators = this?.Constructor?.schema?.discriminators || {};
625
+ if (discriminatorKey != null &&
626
+ val[discriminatorKey] != null &&
627
+ discriminators[val[discriminatorKey]] != null) {
628
+ return cast(discriminators[val[discriminatorKey]], val, null, this?.$$context);
629
+ }
630
+
631
+ const schema = this.Constructor.schema ?? context.schema;
632
+ return cast(schema, val, null, this?.$$context);
633
+ }
634
+
635
+ /**
636
+ * Returns this schema type's representation in a JSON schema.
637
+ *
638
+ * @param [options]
639
+ * @param [options.useBsonType=false] If true, return a representation with `bsonType` for use with MongoDB's `$jsonSchema`.
640
+ * @returns {Object} JSON schema properties
641
+ */
642
+
643
+ SchemaDocumentArray.prototype.toJSONSchema = function toJSONSchema(options) {
644
+ const itemsTypeDefinition = createJSONSchemaTypeDefinition('object', 'object', options?.useBsonType, false);
645
+ const isRequired = this.options.required && typeof this.options.required !== 'function';
646
+ return {
647
+ ...createJSONSchemaTypeDefinition('array', 'array', options?.useBsonType, isRequired),
648
+ items: { ...itemsTypeDefinition, ...this.schema.toJSONSchema(options) }
649
+ };
650
+ };
651
+
652
+ /*!
653
+ * Module exports.
654
+ */
655
+
656
+ module.exports = SchemaDocumentArray;