@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,46 @@
1
+ 'use strict';
2
+
3
+ const { Long } = require('mongodb/lib/bson');
4
+
5
+ /**
6
+ * Given a value, cast it to a BigInt, or throw an `Error` if the value
7
+ * cannot be casted. `null` and `undefined` are considered valid.
8
+ *
9
+ * @param {Any} value
10
+ * @return {Number}
11
+ * @throws {Error} if `value` is not one of the allowed values
12
+ * @api private
13
+ */
14
+
15
+ const MAX_BIGINT = 9223372036854775807n;
16
+ const MIN_BIGINT = -9223372036854775808n;
17
+ const ERROR_MESSAGE = `Mongoose only supports BigInts between ${MIN_BIGINT} and ${MAX_BIGINT} because MongoDB does not support arbitrary precision integers`;
18
+
19
+ module.exports = function castBigInt(val) {
20
+ if (val == null) {
21
+ return val;
22
+ }
23
+ if (val === '') {
24
+ return null;
25
+ }
26
+ if (typeof val === 'bigint') {
27
+ if (val > MAX_BIGINT || val < MIN_BIGINT) {
28
+ throw new Error(ERROR_MESSAGE);
29
+ }
30
+ return val;
31
+ }
32
+
33
+ if (val instanceof Long) {
34
+ return val.toBigInt();
35
+ }
36
+
37
+ if (typeof val === 'string' || typeof val === 'number') {
38
+ val = BigInt(val);
39
+ if (val > MAX_BIGINT || val < MIN_BIGINT) {
40
+ throw new Error(ERROR_MESSAGE);
41
+ }
42
+ return val;
43
+ }
44
+
45
+ throw new Error(`Cannot convert value to BigInt: "${val}"`);
46
+ };
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ const CastError = require('../error/cast');
4
+
5
+ /**
6
+ * Given a value, cast it to a boolean, or throw a `CastError` if the value
7
+ * cannot be casted. `null` and `undefined` are considered valid.
8
+ *
9
+ * @param {Any} value
10
+ * @param {String} [path] optional the path to set on the CastError
11
+ * @return {Boolean|null|undefined}
12
+ * @throws {CastError} if `value` is not one of the allowed values
13
+ * @api private
14
+ */
15
+
16
+ module.exports = function castBoolean(value, path) {
17
+ if (module.exports.convertToTrue.has(value)) {
18
+ return true;
19
+ }
20
+ if (module.exports.convertToFalse.has(value)) {
21
+ return false;
22
+ }
23
+
24
+ if (value == null) {
25
+ return value;
26
+ }
27
+
28
+ throw new CastError('boolean', value, path);
29
+ };
30
+
31
+ module.exports.convertToTrue = new Set([true, 'true', 1, '1', 'yes']);
32
+ module.exports.convertToFalse = new Set([false, 'false', 0, '0', 'no']);
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ const assert = require('assert');
4
+
5
+ module.exports = function castDate(value) {
6
+ // Support empty string because of empty form values. Originally introduced
7
+ // in https://github.com/Automattic/mongoose/commit/efc72a1898fc3c33a319d915b8c5463a22938dfe
8
+ if (value == null || value === '') {
9
+ return null;
10
+ }
11
+
12
+ if (value instanceof Date) {
13
+ assert.ok(!isNaN(value.valueOf()));
14
+
15
+ return value;
16
+ }
17
+
18
+ let date;
19
+
20
+ assert.ok(typeof value !== 'boolean');
21
+
22
+ if (value instanceof Number || typeof value === 'number') {
23
+ date = new Date(value);
24
+ } else if (typeof value === 'string' && !isNaN(Number(value)) && (Number(value) >= 275761 || Number(value) < -271820)) {
25
+ // string representation of milliseconds take this path
26
+ date = new Date(Number(value));
27
+ } else if (typeof value.valueOf === 'function') {
28
+ // support for moment.js. This is also the path strings will take because
29
+ // strings have a `valueOf()`
30
+ date = new Date(value.valueOf());
31
+ } else {
32
+ // fallback
33
+ date = new Date(value);
34
+ }
35
+
36
+ if (!isNaN(date.valueOf())) {
37
+ return date;
38
+ }
39
+
40
+ assert.ok(false);
41
+ };
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ const Decimal128Type = require('../types/decimal128');
4
+ const assert = require('assert');
5
+
6
+ module.exports = function castDecimal128(value) {
7
+ if (value == null) {
8
+ return value;
9
+ }
10
+
11
+ if (typeof value === 'object' && typeof value.$numberDecimal === 'string') {
12
+ return Decimal128Type.fromString(value.$numberDecimal);
13
+ }
14
+
15
+ if (value instanceof Decimal128Type) {
16
+ return value;
17
+ }
18
+
19
+ if (typeof value === 'string') {
20
+ return Decimal128Type.fromString(value);
21
+ }
22
+
23
+ if (typeof Buffer === 'function' && Buffer.isBuffer(value)) {
24
+ return new Decimal128Type(value);
25
+ }
26
+ if (typeof Uint8Array === 'function' && value instanceof Uint8Array) {
27
+ return new Decimal128Type(value);
28
+ }
29
+
30
+ if (typeof value === 'number') {
31
+ return Decimal128Type.fromString(String(value));
32
+ }
33
+
34
+ if (typeof value.valueOf === 'function' && typeof value.valueOf() === 'string') {
35
+ return Decimal128Type.fromString(value.valueOf());
36
+ }
37
+
38
+ assert.ok(false);
39
+ };
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ const assert = require('assert');
4
+ const BSON = require('mongodb/lib/bson');
5
+ const isBsonType = require('../helpers/isBsonType');
6
+
7
+ /**
8
+ * Given a value, cast it to a IEEE 754-2008 floating point, or throw an `Error` if the value
9
+ * cannot be casted. `null`, `undefined`, and `NaN` are considered valid inputs.
10
+ *
11
+ * @param {Any} value
12
+ * @return {Number}
13
+ * @throws {Error} if `value` does not represent a IEEE 754-2008 floating point. If casting from a string, see [BSON Double.fromString API documentation](https://mongodb.github.io/node-mongodb-native/Next/classes/BSON.Double.html#fromString)
14
+ * @api private
15
+ */
16
+
17
+ module.exports = function castDouble(val) {
18
+ if (val == null || val === '') {
19
+ return null;
20
+ }
21
+
22
+ let coercedVal;
23
+ if (isBsonType(val, 'Long')) {
24
+ coercedVal = val.toNumber();
25
+ } else if (typeof val === 'string') {
26
+ try {
27
+ coercedVal = BSON.Double.fromString(val);
28
+ return coercedVal;
29
+ } catch {
30
+ assert.ok(false);
31
+ }
32
+ } else if (typeof val === 'object') {
33
+ const tempVal = val.valueOf() ?? val.toString();
34
+ // ex: { a: 'im an object, valueOf: () => 'helloworld' } // throw an error
35
+ if (typeof tempVal === 'string') {
36
+ try {
37
+ coercedVal = BSON.Double.fromString(tempVal);
38
+ return coercedVal;
39
+ } catch {
40
+ assert.ok(false);
41
+ }
42
+ } else {
43
+ coercedVal = Number(tempVal);
44
+ }
45
+ } else {
46
+ coercedVal = Number(val);
47
+ }
48
+
49
+ return new BSON.Double(coercedVal);
50
+ };
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ const isBsonType = require('../helpers/isBsonType');
4
+ const assert = require('assert');
5
+
6
+ /**
7
+ * Given a value, cast it to a Int32, or throw an `Error` if the value
8
+ * cannot be casted. `null` and `undefined` are considered valid.
9
+ *
10
+ * @param {Any} value
11
+ * @return {Number}
12
+ * @throws {Error} if `value` does not represent an integer, or is outside the bounds of an 32-bit integer.
13
+ * @api private
14
+ */
15
+
16
+ module.exports = function castInt32(val) {
17
+ if (val == null) {
18
+ return val;
19
+ }
20
+ if (val === '') {
21
+ return null;
22
+ }
23
+
24
+ const coercedVal = isBsonType(val, 'Long') ? val.toNumber() : Number(val);
25
+
26
+ const INT32_MAX = 0x7FFFFFFF;
27
+ const INT32_MIN = -0x80000000;
28
+
29
+ if (coercedVal === (coercedVal | 0) &&
30
+ coercedVal >= INT32_MIN &&
31
+ coercedVal <= INT32_MAX
32
+ ) {
33
+ return coercedVal;
34
+ }
35
+ assert.ok(false);
36
+ };
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ const assert = require('assert');
4
+
5
+ /**
6
+ * Given a value, cast it to a number, or throw an `Error` if the value
7
+ * cannot be casted. `null` and `undefined` are considered valid.
8
+ *
9
+ * @param {Any} value
10
+ * @return {Number}
11
+ * @throws {Error} if `value` is not one of the allowed values
12
+ * @api private
13
+ */
14
+
15
+ module.exports = function castNumber(val) {
16
+ if (val == null) {
17
+ return val;
18
+ }
19
+ if (val === '') {
20
+ return null;
21
+ }
22
+
23
+ if (typeof val === 'string' || typeof val === 'boolean') {
24
+ val = Number(val);
25
+ }
26
+
27
+ assert.ok(!isNaN(val));
28
+ if (val instanceof Number) {
29
+ return val.valueOf();
30
+ }
31
+ if (typeof val === 'number') {
32
+ return val;
33
+ }
34
+ if (!Array.isArray(val) && typeof val.valueOf === 'function') {
35
+ return Number(val.valueOf());
36
+ }
37
+ if (val.toString && !Array.isArray(val) && val.toString() == Number(val)) {
38
+ return Number(val);
39
+ }
40
+
41
+ assert.ok(false);
42
+ };
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ const isBsonType = require('../helpers/isBsonType');
4
+ const ObjectId = require('../types/objectid');
5
+
6
+ module.exports = function castObjectId(value) {
7
+ if (value == null) {
8
+ return value;
9
+ }
10
+
11
+ if (isBsonType(value, 'ObjectId')) {
12
+ return value;
13
+ }
14
+
15
+ if (value._id) {
16
+ if (isBsonType(value._id, 'ObjectId')) {
17
+ return value._id;
18
+ }
19
+ if (value._id.toString instanceof Function) {
20
+ return new ObjectId(value._id.toString());
21
+ }
22
+ }
23
+
24
+ if (value.toString instanceof Function) {
25
+ return new ObjectId(value.toString());
26
+ }
27
+
28
+ return new ObjectId(value);
29
+ };
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ const CastError = require('../error/cast');
4
+
5
+ /**
6
+ * Given a value, cast it to a string, or throw a `CastError` if the value
7
+ * cannot be casted. `null` and `undefined` are considered valid.
8
+ *
9
+ * @param {Any} value
10
+ * @param {String} [path] optional the path to set on the CastError
11
+ * @return {string|null|undefined}
12
+ * @throws {CastError}
13
+ * @api private
14
+ */
15
+
16
+ module.exports = function castString(value, path) {
17
+ // If null or undefined
18
+ if (value == null) {
19
+ return value;
20
+ }
21
+
22
+ // handle documents being passed
23
+ if (typeof value?._id === 'string') {
24
+ return value._id;
25
+ }
26
+
27
+ // Re: gh-647 and gh-3030, we're ok with casting using `toString()`
28
+ // **unless** its the default Object.toString, because "[object Object]"
29
+ // doesn't really qualify as useful data
30
+ if (value.toString &&
31
+ value.toString !== Object.prototype.toString &&
32
+ !Array.isArray(value)) {
33
+ return value.toString();
34
+ }
35
+
36
+ throw new CastError('string', value, path);
37
+ };
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ const UUID = require('mongodb/lib/bson').UUID;
4
+
5
+ const UUID_FORMAT = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i;
6
+
7
+ module.exports = function castUUID(value) {
8
+ if (value == null) {
9
+ return value;
10
+ }
11
+
12
+ if (value instanceof UUID) {
13
+ return value;
14
+ }
15
+ if (typeof value === 'string') {
16
+ if (UUID_FORMAT.test(value)) {
17
+ return new UUID(value);
18
+ } else {
19
+ throw new Error(`"${value}" is not a valid UUID string`);
20
+ }
21
+ }
22
+
23
+ // Re: gh-647 and gh-3030, we're ok with casting using `toString()`
24
+ // **unless** its the default Object.toString, because "[object Object]"
25
+ // doesn't really qualify as useful data
26
+ if (value.toString && value.toString !== Object.prototype.toString) {
27
+ if (UUID_FORMAT.test(value.toString())) {
28
+ return new UUID(value.toString());
29
+ }
30
+ }
31
+
32
+ throw new Error(`"${value}" cannot be casted to a UUID`);
33
+ };
34
+
35
+ module.exports.UUID_FORMAT = UUID_FORMAT;