@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,333 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Module dependencies.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const SchemaObjectIdOptions = require('../options/schemaObjectIdOptions');
|
|
8
|
+
const SchemaType = require('../schemaType');
|
|
9
|
+
const castObjectId = require('../cast/objectid');
|
|
10
|
+
const createJSONSchemaTypeDefinition = require('../helpers/createJSONSchemaTypeDefinition');
|
|
11
|
+
const getConstructorName = require('../helpers/getConstructorName');
|
|
12
|
+
const oid = require('../types/objectid');
|
|
13
|
+
const isBsonType = require('../helpers/isBsonType');
|
|
14
|
+
const utils = require('../utils');
|
|
15
|
+
|
|
16
|
+
const CastError = SchemaType.CastError;
|
|
17
|
+
let Document;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* ObjectId SchemaType constructor.
|
|
21
|
+
*
|
|
22
|
+
* @param {String} key
|
|
23
|
+
* @param {Object} options
|
|
24
|
+
* @param {Object} schemaOptions
|
|
25
|
+
* @param {Schema} parentSchema
|
|
26
|
+
* @inherits SchemaType
|
|
27
|
+
* @api public
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
function SchemaObjectId(key, options, _schemaOptions, parentSchema) {
|
|
31
|
+
const isKeyHexStr = typeof key === 'string' && key.length === 24 && /^[a-f0-9]+$/i.test(key);
|
|
32
|
+
const suppressWarning = options?.suppressWarning;
|
|
33
|
+
if ((isKeyHexStr || typeof key === 'undefined') && !suppressWarning) {
|
|
34
|
+
utils.warn('mongoose: To create a new ObjectId please try ' +
|
|
35
|
+
'`Mongoose.Types.ObjectId` instead of using ' +
|
|
36
|
+
'`Mongoose.Schema.Types.ObjectId`. Set the `suppressWarning` option if ' +
|
|
37
|
+
'you\'re trying to create a hex char path in your schema.');
|
|
38
|
+
}
|
|
39
|
+
SchemaType.call(this, key, options, 'ObjectId', parentSchema);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* This schema type's name, to defend against minifiers that mangle
|
|
44
|
+
* function names.
|
|
45
|
+
*
|
|
46
|
+
* @api public
|
|
47
|
+
*/
|
|
48
|
+
SchemaObjectId.schemaName = 'ObjectId';
|
|
49
|
+
|
|
50
|
+
SchemaObjectId.defaultOptions = {};
|
|
51
|
+
|
|
52
|
+
/*!
|
|
53
|
+
* Inherits from SchemaType.
|
|
54
|
+
*/
|
|
55
|
+
SchemaObjectId.prototype = Object.create(SchemaType.prototype);
|
|
56
|
+
SchemaObjectId.prototype.constructor = SchemaObjectId;
|
|
57
|
+
SchemaObjectId.prototype.OptionsConstructor = SchemaObjectIdOptions;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Attaches a getter for all ObjectId instances
|
|
61
|
+
*
|
|
62
|
+
* #### Example:
|
|
63
|
+
*
|
|
64
|
+
* // Always convert to string when getting an ObjectId
|
|
65
|
+
* mongoose.ObjectId.get(v => v.toString());
|
|
66
|
+
*
|
|
67
|
+
* const Model = mongoose.model('Test', new Schema({}));
|
|
68
|
+
* typeof (new Model({})._id); // 'string'
|
|
69
|
+
*
|
|
70
|
+
* @param {Function} getter
|
|
71
|
+
* @return {this}
|
|
72
|
+
* @function get
|
|
73
|
+
* @static
|
|
74
|
+
* @api public
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
SchemaObjectId.get = SchemaType.get;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Sets a default option for all ObjectId instances.
|
|
81
|
+
*
|
|
82
|
+
* #### Example:
|
|
83
|
+
*
|
|
84
|
+
* // Make all object ids have option `required` equal to true.
|
|
85
|
+
* mongoose.Schema.Types.ObjectId.set('required', true);
|
|
86
|
+
*
|
|
87
|
+
* const Order = mongoose.model('Order', new Schema({ userId: ObjectId }));
|
|
88
|
+
* new Order({ }).validateSync().errors.userId.message; // Path `userId` is required.
|
|
89
|
+
*
|
|
90
|
+
* @param {String} option The option you'd like to set the value for
|
|
91
|
+
* @param {Any} value value for option
|
|
92
|
+
* @return {undefined}
|
|
93
|
+
* @function set
|
|
94
|
+
* @static
|
|
95
|
+
* @api public
|
|
96
|
+
*/
|
|
97
|
+
|
|
98
|
+
SchemaObjectId.set = SchemaType.set;
|
|
99
|
+
|
|
100
|
+
SchemaObjectId.setters = [];
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Adds an auto-generated ObjectId default if turnOn is true.
|
|
104
|
+
* @param {Boolean} turnOn auto generated ObjectId defaults
|
|
105
|
+
* @api public
|
|
106
|
+
* @return {SchemaType} this
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
SchemaObjectId.prototype.auto = function(turnOn) {
|
|
110
|
+
if (turnOn) {
|
|
111
|
+
this.default(defaultId);
|
|
112
|
+
this.set(resetId);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return this;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/*!
|
|
119
|
+
* ignore
|
|
120
|
+
*/
|
|
121
|
+
|
|
122
|
+
SchemaObjectId._checkRequired = v => isBsonType(v, 'ObjectId');
|
|
123
|
+
|
|
124
|
+
/*!
|
|
125
|
+
* ignore
|
|
126
|
+
*/
|
|
127
|
+
|
|
128
|
+
SchemaObjectId._cast = castObjectId;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Get/set the function used to cast arbitrary values to objectids.
|
|
132
|
+
*
|
|
133
|
+
* #### Example:
|
|
134
|
+
*
|
|
135
|
+
* // Make Mongoose only try to cast length 24 strings. By default, any 12
|
|
136
|
+
* // char string is a valid ObjectId.
|
|
137
|
+
* const original = mongoose.ObjectId.cast();
|
|
138
|
+
* mongoose.ObjectId.cast(v => {
|
|
139
|
+
* assert.ok(typeof v !== 'string' || v.length === 24);
|
|
140
|
+
* return original(v);
|
|
141
|
+
* });
|
|
142
|
+
*
|
|
143
|
+
* // Or disable casting entirely
|
|
144
|
+
* mongoose.ObjectId.cast(false);
|
|
145
|
+
*
|
|
146
|
+
* @param {Function} caster
|
|
147
|
+
* @return {Function}
|
|
148
|
+
* @function cast
|
|
149
|
+
* @static
|
|
150
|
+
* @api public
|
|
151
|
+
*/
|
|
152
|
+
|
|
153
|
+
SchemaObjectId.cast = function cast(caster) {
|
|
154
|
+
if (arguments.length === 0) {
|
|
155
|
+
return this._cast;
|
|
156
|
+
}
|
|
157
|
+
if (caster === false) {
|
|
158
|
+
caster = this._defaultCaster;
|
|
159
|
+
}
|
|
160
|
+
this._cast = caster;
|
|
161
|
+
|
|
162
|
+
return this._cast;
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
/*!
|
|
166
|
+
* ignore
|
|
167
|
+
*/
|
|
168
|
+
|
|
169
|
+
SchemaObjectId._defaultCaster = v => {
|
|
170
|
+
if (!(isBsonType(v, 'ObjectId'))) {
|
|
171
|
+
throw new Error(v + ' is not an instance of ObjectId');
|
|
172
|
+
}
|
|
173
|
+
return v;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Override the function the required validator uses to check whether a string
|
|
178
|
+
* passes the `required` check.
|
|
179
|
+
*
|
|
180
|
+
* #### Example:
|
|
181
|
+
*
|
|
182
|
+
* // Allow empty strings to pass `required` check
|
|
183
|
+
* mongoose.Schema.Types.String.checkRequired(v => v != null);
|
|
184
|
+
*
|
|
185
|
+
* const M = mongoose.model({ str: { type: String, required: true } });
|
|
186
|
+
* new M({ str: '' }).validateSync(); // `null`, validation passes!
|
|
187
|
+
*
|
|
188
|
+
* @param {Function} fn
|
|
189
|
+
* @return {Function}
|
|
190
|
+
* @function checkRequired
|
|
191
|
+
* @static
|
|
192
|
+
* @api public
|
|
193
|
+
*/
|
|
194
|
+
|
|
195
|
+
SchemaObjectId.checkRequired = SchemaType.checkRequired;
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Check if the given value satisfies a required validator.
|
|
199
|
+
*
|
|
200
|
+
* @param {Any} value
|
|
201
|
+
* @param {Document} doc
|
|
202
|
+
* @return {Boolean}
|
|
203
|
+
* @api public
|
|
204
|
+
*/
|
|
205
|
+
|
|
206
|
+
SchemaObjectId.prototype.checkRequired = function checkRequired(value, doc) {
|
|
207
|
+
if (SchemaType._isRef(this, value, doc, true)) {
|
|
208
|
+
return !!value;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// `require('util').inherits()` does **not** copy static properties, and
|
|
212
|
+
// plugins like mongoose-float use `inherits()` for pre-ES6.
|
|
213
|
+
const _checkRequired = typeof this.constructor.checkRequired === 'function' ?
|
|
214
|
+
this.constructor.checkRequired() :
|
|
215
|
+
SchemaObjectId.checkRequired();
|
|
216
|
+
|
|
217
|
+
return _checkRequired(value);
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Casts to ObjectId
|
|
222
|
+
*
|
|
223
|
+
* @param {Object} value
|
|
224
|
+
* @param {Object} doc
|
|
225
|
+
* @param {Boolean} init whether this is an initialization cast
|
|
226
|
+
* @api private
|
|
227
|
+
*/
|
|
228
|
+
|
|
229
|
+
SchemaObjectId.prototype.cast = function(value, doc, init, prev, options) {
|
|
230
|
+
if (!(isBsonType(value, 'ObjectId')) && SchemaType._isRef(this, value, doc, init)) {
|
|
231
|
+
// wait! we may need to cast this to a document
|
|
232
|
+
if ((getConstructorName(value) || '').toLowerCase() === 'objectid') {
|
|
233
|
+
return new oid(value.toHexString());
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (value == null || utils.isNonBuiltinObject(value)) {
|
|
237
|
+
return this._castRef(value, doc, init, options);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
let castObjectId;
|
|
242
|
+
if (typeof this._castFunction === 'function') {
|
|
243
|
+
castObjectId = this._castFunction;
|
|
244
|
+
} else if (typeof this.constructor.cast === 'function') {
|
|
245
|
+
castObjectId = this.constructor.cast();
|
|
246
|
+
} else {
|
|
247
|
+
castObjectId = SchemaObjectId.cast();
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
try {
|
|
251
|
+
return castObjectId(value);
|
|
252
|
+
} catch (error) {
|
|
253
|
+
throw new CastError('ObjectId', value, this.path, error, this);
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
/*!
|
|
258
|
+
* ignore
|
|
259
|
+
*/
|
|
260
|
+
|
|
261
|
+
function handleSingle(val) {
|
|
262
|
+
return this.cast(val);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const $conditionalHandlers = {
|
|
266
|
+
...SchemaType.prototype.$conditionalHandlers,
|
|
267
|
+
$gt: handleSingle,
|
|
268
|
+
$gte: handleSingle,
|
|
269
|
+
$lt: handleSingle,
|
|
270
|
+
$lte: handleSingle
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Contains the handlers for different query operators for this schema type.
|
|
275
|
+
* For example, `$conditionalHandlers.$in` is the function Mongoose calls to cast `$in` filter operators.
|
|
276
|
+
*
|
|
277
|
+
* @property $conditionalHandlers
|
|
278
|
+
* @memberOf SchemaObjectId
|
|
279
|
+
* @instance
|
|
280
|
+
* @api public
|
|
281
|
+
*/
|
|
282
|
+
|
|
283
|
+
Object.defineProperty(SchemaObjectId.prototype, '$conditionalHandlers', {
|
|
284
|
+
enumerable: false,
|
|
285
|
+
value: $conditionalHandlers
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
/*!
|
|
289
|
+
* ignore
|
|
290
|
+
*/
|
|
291
|
+
|
|
292
|
+
function defaultId() {
|
|
293
|
+
return new oid();
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
defaultId.$runBeforeSetters = true;
|
|
297
|
+
|
|
298
|
+
function resetId(v) {
|
|
299
|
+
Document || (Document = require('../document'));
|
|
300
|
+
|
|
301
|
+
if (this instanceof Document) {
|
|
302
|
+
if (v === void 0) {
|
|
303
|
+
const _v = new oid();
|
|
304
|
+
return _v;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return v;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Returns this schema type's representation in a JSON schema.
|
|
313
|
+
*
|
|
314
|
+
* @param [options]
|
|
315
|
+
* @param [options.useBsonType=false] If true, return a representation with `bsonType` for use with MongoDB's `$jsonSchema`.
|
|
316
|
+
* @returns {Object} JSON schema properties
|
|
317
|
+
* @api public
|
|
318
|
+
*/
|
|
319
|
+
|
|
320
|
+
SchemaObjectId.prototype.toJSONSchema = function toJSONSchema(options) {
|
|
321
|
+
const isRequired = (this.options.required && typeof this.options.required !== 'function') || this.path === '_id';
|
|
322
|
+
return createJSONSchemaTypeDefinition('string', 'objectId', options?.useBsonType, isRequired);
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
SchemaObjectId.prototype.autoEncryptionType = function autoEncryptionType() {
|
|
326
|
+
return 'objectId';
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
/*!
|
|
330
|
+
* Module exports.
|
|
331
|
+
*/
|
|
332
|
+
|
|
333
|
+
module.exports = SchemaObjectId;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Module requirements.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const CastError = require('../../error/cast');
|
|
8
|
+
|
|
9
|
+
/*!
|
|
10
|
+
* ignore
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
function handleBitwiseOperator(val) {
|
|
14
|
+
const _this = this;
|
|
15
|
+
if (Array.isArray(val)) {
|
|
16
|
+
return val.map(function(v) {
|
|
17
|
+
return _castNumber(_this.path, v);
|
|
18
|
+
});
|
|
19
|
+
} else if (Buffer.isBuffer(val)) {
|
|
20
|
+
return val;
|
|
21
|
+
}
|
|
22
|
+
// Assume trying to cast to number
|
|
23
|
+
return _castNumber(_this.path, val);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/*!
|
|
27
|
+
* ignore
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
function _castNumber(path, num) {
|
|
31
|
+
const v = Number(num);
|
|
32
|
+
if (isNaN(v)) {
|
|
33
|
+
throw new CastError('number', num, path);
|
|
34
|
+
}
|
|
35
|
+
return v;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
module.exports = handleBitwiseOperator;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Module requirements.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const castArraysOfNumbers = require('./helpers').castArraysOfNumbers;
|
|
8
|
+
const castToNumber = require('./helpers').castToNumber;
|
|
9
|
+
|
|
10
|
+
/*!
|
|
11
|
+
* ignore
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
exports.cast$geoIntersects = cast$geoIntersects;
|
|
15
|
+
exports.cast$near = cast$near;
|
|
16
|
+
exports.cast$within = cast$within;
|
|
17
|
+
|
|
18
|
+
function cast$near(val) {
|
|
19
|
+
const SchemaArray = require('../array');
|
|
20
|
+
|
|
21
|
+
if (Array.isArray(val)) {
|
|
22
|
+
castArraysOfNumbers(val, this);
|
|
23
|
+
return val;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
_castMinMaxDistance(this, val);
|
|
27
|
+
|
|
28
|
+
if (val?.$geometry) {
|
|
29
|
+
return cast$geometry(val, this);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (!Array.isArray(val)) {
|
|
33
|
+
throw new TypeError('$near must be either an array or an object ' +
|
|
34
|
+
'with a $geometry property');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return SchemaArray.prototype.castForQuery.call(this, null, val);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function cast$geometry(val, self) {
|
|
41
|
+
switch (val.$geometry.type) {
|
|
42
|
+
case 'Polygon':
|
|
43
|
+
case 'LineString':
|
|
44
|
+
case 'Point':
|
|
45
|
+
castArraysOfNumbers(val.$geometry.coordinates, self);
|
|
46
|
+
break;
|
|
47
|
+
default:
|
|
48
|
+
// ignore unknowns
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
_castMinMaxDistance(self, val);
|
|
53
|
+
|
|
54
|
+
return val;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function cast$within(val) {
|
|
58
|
+
_castMinMaxDistance(this, val);
|
|
59
|
+
|
|
60
|
+
if (val.$box || val.$polygon) {
|
|
61
|
+
const type = val.$box ? '$box' : '$polygon';
|
|
62
|
+
val[type].forEach(arr => {
|
|
63
|
+
if (!Array.isArray(arr)) {
|
|
64
|
+
const msg = 'Invalid $within $box argument. '
|
|
65
|
+
+ 'Expected an array, received ' + arr;
|
|
66
|
+
throw new TypeError(msg);
|
|
67
|
+
}
|
|
68
|
+
arr.forEach((v, i) => {
|
|
69
|
+
arr[i] = castToNumber.call(this, v);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
} else if (val.$center || val.$centerSphere) {
|
|
73
|
+
const type = val.$center ? '$center' : '$centerSphere';
|
|
74
|
+
val[type].forEach((item, i) => {
|
|
75
|
+
if (Array.isArray(item)) {
|
|
76
|
+
item.forEach((v, j) => {
|
|
77
|
+
item[j] = castToNumber.call(this, v);
|
|
78
|
+
});
|
|
79
|
+
} else {
|
|
80
|
+
val[type][i] = castToNumber.call(this, item);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
} else if (val.$geometry) {
|
|
84
|
+
cast$geometry(val, this);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return val;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function cast$geoIntersects(val) {
|
|
91
|
+
const geo = val.$geometry;
|
|
92
|
+
if (!geo) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
cast$geometry(val, this);
|
|
97
|
+
return val;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function _castMinMaxDistance(self, val) {
|
|
101
|
+
if (val.$maxDistance) {
|
|
102
|
+
val.$maxDistance = castToNumber.call(self, val.$maxDistance);
|
|
103
|
+
}
|
|
104
|
+
if (val.$minDistance) {
|
|
105
|
+
val.$minDistance = castToNumber.call(self, val.$minDistance);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* Module requirements.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const SchemaNumber = require('../number');
|
|
8
|
+
|
|
9
|
+
/*!
|
|
10
|
+
* ignore
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
exports.castToNumber = castToNumber;
|
|
14
|
+
exports.castArraysOfNumbers = castArraysOfNumbers;
|
|
15
|
+
|
|
16
|
+
/*!
|
|
17
|
+
* ignore
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
function castToNumber(val) {
|
|
21
|
+
return SchemaNumber.cast()(val);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function castArraysOfNumbers(arr, self) {
|
|
25
|
+
arr.forEach(function(v, i) {
|
|
26
|
+
if (Array.isArray(v)) {
|
|
27
|
+
castArraysOfNumbers(v, self);
|
|
28
|
+
} else {
|
|
29
|
+
arr[i] = castToNumber.call(self, v);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const CastError = require('../../error/cast');
|
|
4
|
+
const castBoolean = require('../../cast/boolean');
|
|
5
|
+
const castString = require('../../cast/string');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Casts val to an object suitable for `$text`. Throws an error if the object
|
|
9
|
+
* can't be casted.
|
|
10
|
+
*
|
|
11
|
+
* @param {Any} val value to cast
|
|
12
|
+
* @param {String} [path] path to associate with any errors that occured
|
|
13
|
+
* @return {Object} casted object
|
|
14
|
+
* @see https://www.mongodb.com/docs/manual/reference/operator/query/text/
|
|
15
|
+
* @api private
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
module.exports = function castTextSearch(val, path) {
|
|
19
|
+
if (val == null || typeof val !== 'object') {
|
|
20
|
+
throw new CastError('$text', val, path);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (val.$search != null) {
|
|
24
|
+
val.$search = castString(val.$search, path + '.$search');
|
|
25
|
+
}
|
|
26
|
+
if (val.$language != null) {
|
|
27
|
+
val.$language = castString(val.$language, path + '.$language');
|
|
28
|
+
}
|
|
29
|
+
if (val.$caseSensitive != null) {
|
|
30
|
+
val.$caseSensitive = castBoolean(val.$caseSensitive,
|
|
31
|
+
path + '.$caseSensitive');
|
|
32
|
+
}
|
|
33
|
+
if (val.$diacriticSensitive != null) {
|
|
34
|
+
val.$diacriticSensitive = castBoolean(val.$diacriticSensitive,
|
|
35
|
+
path + '.$diacriticSensitive');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return val;
|
|
39
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* ignore
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
module.exports = function(val) {
|
|
8
|
+
if (Array.isArray(val)) {
|
|
9
|
+
if (!val.every(v => typeof v === 'number' || typeof v === 'string')) {
|
|
10
|
+
throw new Error('$type array values must be strings or numbers');
|
|
11
|
+
}
|
|
12
|
+
return val;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (typeof val !== 'number' && typeof val !== 'string') {
|
|
16
|
+
throw new Error('$type parameter must be number, string, or array of numbers and strings');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return val;
|
|
20
|
+
};
|