@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.
- package/LICENSE.md +22 -0
- package/README.md +397 -0
- package/SECURITY.md +1 -0
- package/eslint.config.mjs +198 -0
- package/index.js +64 -0
- package/lib/aggregate.js +1189 -0
- package/lib/cast/bigint.js +46 -0
- package/lib/cast/boolean.js +32 -0
- package/lib/cast/date.js +41 -0
- package/lib/cast/decimal128.js +39 -0
- package/lib/cast/double.js +50 -0
- package/lib/cast/int32.js +36 -0
- package/lib/cast/number.js +42 -0
- package/lib/cast/objectid.js +29 -0
- package/lib/cast/string.js +37 -0
- package/lib/cast/uuid.js +35 -0
- package/lib/cast.js +436 -0
- package/lib/collection.js +321 -0
- package/lib/connection.js +1855 -0
- package/lib/connectionState.js +26 -0
- package/lib/constants.js +73 -0
- package/lib/cursor/aggregationCursor.js +466 -0
- package/lib/cursor/changeStream.js +198 -0
- package/lib/cursor/queryCursor.js +622 -0
- package/lib/document.js +5521 -0
- package/lib/driver.js +15 -0
- package/lib/drivers/SPEC.md +4 -0
- package/lib/drivers/node-mongodb-native/bulkWriteResult.js +5 -0
- package/lib/drivers/node-mongodb-native/collection.js +393 -0
- package/lib/drivers/node-mongodb-native/connection.js +506 -0
- package/lib/drivers/node-mongodb-native/index.js +10 -0
- package/lib/error/browserMissingSchema.js +29 -0
- package/lib/error/bulkSaveIncompleteError.js +44 -0
- package/lib/error/bulkWriteError.js +41 -0
- package/lib/error/cast.js +158 -0
- package/lib/error/createCollectionsError.js +26 -0
- package/lib/error/divergentArray.js +40 -0
- package/lib/error/eachAsyncMultiError.js +41 -0
- package/lib/error/index.js +237 -0
- package/lib/error/invalidSchemaOption.js +32 -0
- package/lib/error/messages.js +47 -0
- package/lib/error/missingSchema.js +33 -0
- package/lib/error/mongooseError.js +13 -0
- package/lib/error/notFound.js +47 -0
- package/lib/error/objectExpected.js +31 -0
- package/lib/error/objectParameter.js +31 -0
- package/lib/error/overwriteModel.js +31 -0
- package/lib/error/parallelSave.js +33 -0
- package/lib/error/parallelValidate.js +33 -0
- package/lib/error/serverSelection.js +62 -0
- package/lib/error/setOptionError.js +103 -0
- package/lib/error/strict.js +35 -0
- package/lib/error/strictPopulate.js +31 -0
- package/lib/error/syncIndexes.js +30 -0
- package/lib/error/validation.js +97 -0
- package/lib/error/validator.js +100 -0
- package/lib/error/version.js +38 -0
- package/lib/helpers/aggregate/prepareDiscriminatorPipeline.js +39 -0
- package/lib/helpers/aggregate/stringifyFunctionOperators.js +50 -0
- package/lib/helpers/arrayDepth.js +33 -0
- package/lib/helpers/clone.js +204 -0
- package/lib/helpers/common.js +127 -0
- package/lib/helpers/createJSONSchemaTypeDefinition.js +24 -0
- package/lib/helpers/cursor/eachAsync.js +225 -0
- package/lib/helpers/discriminator/applyEmbeddedDiscriminators.js +36 -0
- package/lib/helpers/discriminator/areDiscriminatorValuesEqual.js +16 -0
- package/lib/helpers/discriminator/checkEmbeddedDiscriminatorKeyProjection.js +12 -0
- package/lib/helpers/discriminator/getConstructor.js +29 -0
- package/lib/helpers/discriminator/getDiscriminatorByValue.js +28 -0
- package/lib/helpers/discriminator/getSchemaDiscriminatorByValue.js +27 -0
- package/lib/helpers/discriminator/mergeDiscriminatorSchema.js +91 -0
- package/lib/helpers/document/applyDefaults.js +132 -0
- package/lib/helpers/document/applyTimestamps.js +106 -0
- package/lib/helpers/document/applyVirtuals.js +147 -0
- package/lib/helpers/document/cleanModifiedSubpaths.js +45 -0
- package/lib/helpers/document/compile.js +238 -0
- package/lib/helpers/document/getDeepestSubdocumentForPath.js +38 -0
- package/lib/helpers/document/getEmbeddedDiscriminatorPath.js +53 -0
- package/lib/helpers/document/handleSpreadDoc.js +35 -0
- package/lib/helpers/each.js +25 -0
- package/lib/helpers/error/combinePathErrors.js +22 -0
- package/lib/helpers/firstKey.js +8 -0
- package/lib/helpers/get.js +65 -0
- package/lib/helpers/getConstructorName.js +16 -0
- package/lib/helpers/getDefaultBulkwriteResult.js +18 -0
- package/lib/helpers/getFunctionName.js +10 -0
- package/lib/helpers/immediate.js +16 -0
- package/lib/helpers/indexes/applySchemaCollation.js +13 -0
- package/lib/helpers/indexes/decorateDiscriminatorIndexOptions.js +14 -0
- package/lib/helpers/indexes/getRelatedIndexes.js +63 -0
- package/lib/helpers/indexes/isDefaultIdIndex.js +18 -0
- package/lib/helpers/indexes/isIndexEqual.js +95 -0
- package/lib/helpers/indexes/isIndexSpecEqual.js +32 -0
- package/lib/helpers/indexes/isTextIndex.js +16 -0
- package/lib/helpers/indexes/isTimeseriesIndex.js +16 -0
- package/lib/helpers/isAsyncFunction.js +9 -0
- package/lib/helpers/isBsonType.js +15 -0
- package/lib/helpers/isMongooseObject.js +22 -0
- package/lib/helpers/isObject.js +16 -0
- package/lib/helpers/isPOJO.js +12 -0
- package/lib/helpers/isPromise.js +6 -0
- package/lib/helpers/isSimpleValidator.js +22 -0
- package/lib/helpers/minimize.js +41 -0
- package/lib/helpers/model/applyDefaultsToPOJO.js +52 -0
- package/lib/helpers/model/applyHooks.js +140 -0
- package/lib/helpers/model/applyMethods.js +70 -0
- package/lib/helpers/model/applyStaticHooks.js +33 -0
- package/lib/helpers/model/applyStatics.js +13 -0
- package/lib/helpers/model/castBulkWrite.js +316 -0
- package/lib/helpers/model/decorateBulkWriteResult.js +8 -0
- package/lib/helpers/model/discriminator.js +265 -0
- package/lib/helpers/model/pushNestedArrayPaths.js +15 -0
- package/lib/helpers/omitUndefined.js +20 -0
- package/lib/helpers/once.js +12 -0
- package/lib/helpers/parallelLimit.js +37 -0
- package/lib/helpers/path/parentPaths.js +18 -0
- package/lib/helpers/path/setDottedPath.js +33 -0
- package/lib/helpers/pluralize.js +95 -0
- package/lib/helpers/populate/assignRawDocsToIdStructure.js +129 -0
- package/lib/helpers/populate/assignVals.js +360 -0
- package/lib/helpers/populate/createPopulateQueryFilter.js +97 -0
- package/lib/helpers/populate/getModelsMapForPopulate.js +776 -0
- package/lib/helpers/populate/getSchemaTypes.js +228 -0
- package/lib/helpers/populate/getVirtual.js +103 -0
- package/lib/helpers/populate/leanPopulateMap.js +7 -0
- package/lib/helpers/populate/lookupLocalFields.js +40 -0
- package/lib/helpers/populate/markArraySubdocsPopulated.js +49 -0
- package/lib/helpers/populate/modelNamesFromRefPath.js +66 -0
- package/lib/helpers/populate/removeDeselectedForeignField.js +31 -0
- package/lib/helpers/populate/setPopulatedVirtualValue.js +33 -0
- package/lib/helpers/populate/skipPopulateValue.js +10 -0
- package/lib/helpers/populate/validateRef.js +19 -0
- package/lib/helpers/printJestWarning.js +21 -0
- package/lib/helpers/processConnectionOptions.js +65 -0
- package/lib/helpers/projection/applyProjection.js +83 -0
- package/lib/helpers/projection/hasIncludedChildren.js +41 -0
- package/lib/helpers/projection/isDefiningProjection.js +18 -0
- package/lib/helpers/projection/isExclusive.js +37 -0
- package/lib/helpers/projection/isInclusive.js +39 -0
- package/lib/helpers/projection/isNestedProjection.js +8 -0
- package/lib/helpers/projection/isPathExcluded.js +40 -0
- package/lib/helpers/projection/isPathSelectedInclusive.js +28 -0
- package/lib/helpers/projection/isSubpath.js +14 -0
- package/lib/helpers/projection/parseProjection.js +33 -0
- package/lib/helpers/query/applyGlobalOption.js +29 -0
- package/lib/helpers/query/cast$expr.js +287 -0
- package/lib/helpers/query/castFilterPath.js +54 -0
- package/lib/helpers/query/castUpdate.js +643 -0
- package/lib/helpers/query/getEmbeddedDiscriminatorPath.js +103 -0
- package/lib/helpers/query/handleImmutable.js +44 -0
- package/lib/helpers/query/handleReadPreferenceAliases.js +23 -0
- package/lib/helpers/query/hasDollarKeys.js +23 -0
- package/lib/helpers/query/isOperator.js +14 -0
- package/lib/helpers/query/sanitizeFilter.js +38 -0
- package/lib/helpers/query/sanitizeProjection.js +14 -0
- package/lib/helpers/query/selectPopulatedFields.js +62 -0
- package/lib/helpers/query/trusted.js +13 -0
- package/lib/helpers/query/validOps.js +3 -0
- package/lib/helpers/schema/addAutoId.js +7 -0
- package/lib/helpers/schema/applyBuiltinPlugins.js +12 -0
- package/lib/helpers/schema/applyPlugins.js +55 -0
- package/lib/helpers/schema/applyReadConcern.js +20 -0
- package/lib/helpers/schema/applyWriteConcern.js +39 -0
- package/lib/helpers/schema/cleanPositionalOperators.js +12 -0
- package/lib/helpers/schema/getIndexes.js +171 -0
- package/lib/helpers/schema/getKeysInSchemaOrder.js +28 -0
- package/lib/helpers/schema/getPath.js +43 -0
- package/lib/helpers/schema/getSubdocumentStrictValue.js +32 -0
- package/lib/helpers/schema/handleIdOption.js +20 -0
- package/lib/helpers/schema/handleTimestampOption.js +24 -0
- package/lib/helpers/schema/idGetter.js +34 -0
- package/lib/helpers/schema/merge.js +36 -0
- package/lib/helpers/schematype/handleImmutable.js +50 -0
- package/lib/helpers/setDefaultsOnInsert.js +158 -0
- package/lib/helpers/specialProperties.js +3 -0
- package/lib/helpers/symbols.js +20 -0
- package/lib/helpers/timers.js +3 -0
- package/lib/helpers/timestamps/setDocumentTimestamps.js +26 -0
- package/lib/helpers/timestamps/setupTimestamps.js +116 -0
- package/lib/helpers/topology/allServersUnknown.js +12 -0
- package/lib/helpers/topology/isAtlas.js +31 -0
- package/lib/helpers/topology/isSSLError.js +16 -0
- package/lib/helpers/update/applyTimestampsToChildren.js +193 -0
- package/lib/helpers/update/applyTimestampsToUpdate.js +131 -0
- package/lib/helpers/update/castArrayFilters.js +113 -0
- package/lib/helpers/update/decorateUpdateWithVersionKey.js +35 -0
- package/lib/helpers/update/modifiedPaths.js +33 -0
- package/lib/helpers/update/moveImmutableProperties.js +53 -0
- package/lib/helpers/update/removeUnusedArrayFilters.js +32 -0
- package/lib/helpers/update/updatedPathsByArrayFilter.js +27 -0
- package/lib/helpers/updateValidators.js +193 -0
- package/lib/index.js +17 -0
- package/lib/internal.js +46 -0
- package/lib/model.js +5010 -0
- package/lib/modifiedPathsSnapshot.js +9 -0
- package/lib/mongoose.js +1411 -0
- package/lib/options/populateOptions.js +36 -0
- package/lib/options/propertyOptions.js +8 -0
- package/lib/options/saveOptions.js +16 -0
- package/lib/options/schemaArrayOptions.js +78 -0
- package/lib/options/schemaBufferOptions.js +38 -0
- package/lib/options/schemaDateOptions.js +71 -0
- package/lib/options/schemaDocumentArrayOptions.js +68 -0
- package/lib/options/schemaMapOptions.js +43 -0
- package/lib/options/schemaNumberOptions.js +101 -0
- package/lib/options/schemaObjectIdOptions.js +64 -0
- package/lib/options/schemaStringOptions.js +138 -0
- package/lib/options/schemaSubdocumentOptions.js +66 -0
- package/lib/options/schemaTypeOptions.js +244 -0
- package/lib/options/schemaUnionOptions.js +32 -0
- package/lib/options/virtualOptions.js +164 -0
- package/lib/options.js +17 -0
- package/lib/plugins/index.js +6 -0
- package/lib/plugins/saveSubdocs.js +76 -0
- package/lib/plugins/sharding.js +84 -0
- package/lib/plugins/trackTransaction.js +84 -0
- package/lib/plugins/validateBeforeSave.js +41 -0
- package/lib/query.js +5673 -0
- package/lib/queryHelpers.js +387 -0
- package/lib/schema/array.js +699 -0
- package/lib/schema/bigint.js +282 -0
- package/lib/schema/boolean.js +332 -0
- package/lib/schema/buffer.js +343 -0
- package/lib/schema/date.js +467 -0
- package/lib/schema/decimal128.js +263 -0
- package/lib/schema/documentArray.js +656 -0
- package/lib/schema/documentArrayElement.js +137 -0
- package/lib/schema/double.js +246 -0
- package/lib/schema/index.js +32 -0
- package/lib/schema/int32.js +289 -0
- package/lib/schema/map.js +201 -0
- package/lib/schema/mixed.js +146 -0
- package/lib/schema/number.js +510 -0
- package/lib/schema/objectId.js +333 -0
- package/lib/schema/operators/bitwise.js +38 -0
- package/lib/schema/operators/exists.js +12 -0
- package/lib/schema/operators/geospatial.js +107 -0
- package/lib/schema/operators/helpers.js +32 -0
- package/lib/schema/operators/text.js +39 -0
- package/lib/schema/operators/type.js +20 -0
- package/lib/schema/string.js +733 -0
- package/lib/schema/subdocument.js +436 -0
- package/lib/schema/symbols.js +5 -0
- package/lib/schema/union.js +113 -0
- package/lib/schema/uuid.js +305 -0
- package/lib/schema.js +3226 -0
- package/lib/schemaType.js +1835 -0
- package/lib/stateMachine.js +232 -0
- package/lib/types/array/index.js +119 -0
- package/lib/types/array/isMongooseArray.js +5 -0
- package/lib/types/array/methods/index.js +1095 -0
- package/lib/types/arraySubdocument.js +207 -0
- package/lib/types/buffer.js +294 -0
- package/lib/types/decimal128.js +13 -0
- package/lib/types/documentArray/index.js +113 -0
- package/lib/types/documentArray/isMongooseDocumentArray.js +5 -0
- package/lib/types/documentArray/methods/index.js +415 -0
- package/lib/types/double.js +13 -0
- package/lib/types/index.js +23 -0
- package/lib/types/map.js +419 -0
- package/lib/types/objectid.js +41 -0
- package/lib/types/subdocument.js +464 -0
- package/lib/types/uuid.js +13 -0
- package/lib/utils.js +1054 -0
- package/lib/validOptions.js +42 -0
- package/lib/virtualType.js +204 -0
- package/package.json +148 -0
- package/types/aggregate.d.ts +180 -0
- package/types/augmentations.d.ts +9 -0
- package/types/callback.d.ts +8 -0
- package/types/collection.d.ts +49 -0
- package/types/connection.d.ts +297 -0
- package/types/cursor.d.ts +67 -0
- package/types/document.d.ts +374 -0
- package/types/error.d.ts +143 -0
- package/types/expressions.d.ts +3053 -0
- package/types/helpers.d.ts +32 -0
- package/types/index.d.ts +1056 -0
- package/types/indexes.d.ts +97 -0
- package/types/inferhydrateddoctype.d.ts +115 -0
- package/types/inferrawdoctype.d.ts +135 -0
- package/types/inferschematype.d.ts +337 -0
- package/types/middlewares.d.ts +59 -0
- package/types/models.d.ts +1306 -0
- package/types/mongooseoptions.d.ts +228 -0
- package/types/pipelinestage.d.ts +333 -0
- package/types/populate.d.ts +53 -0
- package/types/query.d.ts +934 -0
- package/types/schemaoptions.d.ts +282 -0
- package/types/schematypes.d.ts +654 -0
- package/types/session.d.ts +32 -0
- package/types/types.d.ts +109 -0
- package/types/utility.d.ts +175 -0
- package/types/validation.d.ts +39 -0
- 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']);
|
package/lib/cast/date.js
ADDED
|
@@ -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
|
+
};
|
package/lib/cast/uuid.js
ADDED
|
@@ -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;
|