@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,95 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const get = require('../get');
|
|
4
|
+
const utils = require('../../utils');
|
|
5
|
+
/**
|
|
6
|
+
* Given a Mongoose index definition (key + options objects) and a MongoDB server
|
|
7
|
+
* index definition, determine if the two indexes are equal.
|
|
8
|
+
*
|
|
9
|
+
* @param {Object} schemaIndexKeysObject the Mongoose index spec
|
|
10
|
+
* @param {Object} options the Mongoose index definition's options
|
|
11
|
+
* @param {Object} dbIndex the index in MongoDB as returned by `listIndexes()`
|
|
12
|
+
* @api private
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
module.exports = function isIndexEqual(schemaIndexKeysObject, options, dbIndex) {
|
|
16
|
+
// Special case: text indexes have a special format in the db. For example,
|
|
17
|
+
// `{ name: 'text' }` becomes:
|
|
18
|
+
// {
|
|
19
|
+
// v: 2,
|
|
20
|
+
// key: { _fts: 'text', _ftsx: 1 },
|
|
21
|
+
// name: 'name_text',
|
|
22
|
+
// ns: 'test.tests',
|
|
23
|
+
// weights: { name: 1 },
|
|
24
|
+
// default_language: 'english',
|
|
25
|
+
// language_override: 'language',
|
|
26
|
+
// textIndexVersion: 3
|
|
27
|
+
// }
|
|
28
|
+
if (dbIndex.textIndexVersion != null) {
|
|
29
|
+
delete dbIndex.key._fts;
|
|
30
|
+
delete dbIndex.key._ftsx;
|
|
31
|
+
const weights = { ...dbIndex.weights, ...dbIndex.key };
|
|
32
|
+
if (Object.keys(weights).length !== Object.keys(schemaIndexKeysObject).length) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
for (const prop of Object.keys(weights)) {
|
|
36
|
+
if (!(prop in schemaIndexKeysObject)) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
const weight = weights[prop];
|
|
40
|
+
if (weight !== get(options, 'weights.' + prop) && !(weight === 1 && get(options, 'weights.' + prop) == null)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (options['default_language'] !== dbIndex['default_language']) {
|
|
46
|
+
return dbIndex['default_language'] === 'english' && options['default_language'] == null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const optionKeys = [
|
|
53
|
+
'unique',
|
|
54
|
+
'partialFilterExpression',
|
|
55
|
+
'sparse',
|
|
56
|
+
'expireAfterSeconds',
|
|
57
|
+
'collation'
|
|
58
|
+
];
|
|
59
|
+
for (const key of optionKeys) {
|
|
60
|
+
if (!(key in options) && !(key in dbIndex)) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (key === 'collation') {
|
|
64
|
+
if (options[key] == null || dbIndex[key] == null) {
|
|
65
|
+
return options[key] == null && dbIndex[key] == null;
|
|
66
|
+
}
|
|
67
|
+
const definedKeys = Object.keys(options.collation);
|
|
68
|
+
const schemaCollation = options.collation;
|
|
69
|
+
const dbCollation = dbIndex.collation;
|
|
70
|
+
for (const opt of definedKeys) {
|
|
71
|
+
if (get(schemaCollation, opt) !== get(dbCollation, opt)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
} else if (!utils.deepEqual(options[key], dbIndex[key])) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const schemaIndexKeys = Object.keys(schemaIndexKeysObject);
|
|
81
|
+
const dbIndexKeys = Object.keys(dbIndex.key);
|
|
82
|
+
if (schemaIndexKeys.length !== dbIndexKeys.length) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
for (let i = 0; i < schemaIndexKeys.length; ++i) {
|
|
86
|
+
if (schemaIndexKeys[i] !== dbIndexKeys[i]) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
if (!utils.deepEqual(schemaIndexKeysObject[schemaIndexKeys[i]], dbIndex.key[dbIndexKeys[i]])) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return true;
|
|
95
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Compares two index specifications to determine if they are equal.
|
|
5
|
+
*
|
|
6
|
+
* #### Example:
|
|
7
|
+
* isIndexSpecEqual({ a: 1, b: 1 }, { a: 1, b: 1 }); // true
|
|
8
|
+
* isIndexSpecEqual({ a: 1, b: 1 }, { b: 1, a: 1 }); // false
|
|
9
|
+
* isIndexSpecEqual({ a: 1, b: -1 }, { a: 1, b: 1 }); // false
|
|
10
|
+
*
|
|
11
|
+
* @param {Object} spec1 The first index specification to compare.
|
|
12
|
+
* @param {Object} spec2 The second index specification to compare.
|
|
13
|
+
* @returns {Boolean} Returns true if the index specifications are equal, otherwise returns false.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
module.exports = function isIndexSpecEqual(spec1, spec2) {
|
|
17
|
+
const spec1Keys = Object.keys(spec1);
|
|
18
|
+
const spec2Keys = Object.keys(spec2);
|
|
19
|
+
|
|
20
|
+
if (spec1Keys.length !== spec2Keys.length) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
for (let i = 0; i < spec1Keys.length; i++) {
|
|
25
|
+
const key = spec1Keys[i];
|
|
26
|
+
if (key !== spec2Keys[i] || spec1[key] !== spec2[key]) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return true;
|
|
32
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns `true` if the given index options have a `text` option.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
module.exports = function isTextIndex(indexKeys) {
|
|
8
|
+
let isTextIndex = false;
|
|
9
|
+
for (const key of Object.keys(indexKeys)) {
|
|
10
|
+
if (indexKeys[key] === 'text') {
|
|
11
|
+
isTextIndex = true;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return isTextIndex;
|
|
16
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns `true` if the given index matches the schema's `timestamps` options
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
module.exports = function isTimeseriesIndex(dbIndex, schemaOptions) {
|
|
8
|
+
if (schemaOptions.timeseries == null) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
const { timeField, metaField } = schemaOptions.timeseries;
|
|
12
|
+
if (typeof timeField !== 'string' || typeof metaField !== 'string') {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return Object.keys(dbIndex.key).length === 2 && dbIndex.key[timeField] === 1 && dbIndex.key[metaField] === 1;
|
|
16
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const isMongooseArray = require('../types/array/isMongooseArray').isMongooseArray;
|
|
4
|
+
/**
|
|
5
|
+
* Returns if `v` is a mongoose object that has a `toObject()` method we can use.
|
|
6
|
+
*
|
|
7
|
+
* This is for compatibility with libs like Date.js which do foolish things to Natives.
|
|
8
|
+
*
|
|
9
|
+
* @param {Any} v
|
|
10
|
+
* @api private
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
module.exports = function(v) {
|
|
14
|
+
return (
|
|
15
|
+
v != null && (
|
|
16
|
+
isMongooseArray(v) || // Array or Document Array
|
|
17
|
+
v.$__ != null || // Document
|
|
18
|
+
v.isMongooseBuffer || // Buffer
|
|
19
|
+
v.$isMongooseMap // Map
|
|
20
|
+
)
|
|
21
|
+
);
|
|
22
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Determines if `arg` is an object.
|
|
5
|
+
*
|
|
6
|
+
* @param {Object|Array|String|Function|RegExp|any} arg
|
|
7
|
+
* @api private
|
|
8
|
+
* @return {Boolean}
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
module.exports = function(arg) {
|
|
12
|
+
return (
|
|
13
|
+
Buffer.isBuffer(arg) ||
|
|
14
|
+
Object.prototype.toString.call(arg) === '[object Object]'
|
|
15
|
+
);
|
|
16
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = function isPOJO(arg) {
|
|
4
|
+
if (arg == null || typeof arg !== 'object') {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
const proto = Object.getPrototypeOf(arg);
|
|
8
|
+
// Prototype may be null if you used `Object.create(null)`
|
|
9
|
+
// Checking `proto`'s constructor is safe because `getPrototypeOf()`
|
|
10
|
+
// explicitly crosses the boundary from object data to object metadata
|
|
11
|
+
return !proto || proto.constructor.name === 'Object';
|
|
12
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Determines if `arg` is a flat object.
|
|
5
|
+
*
|
|
6
|
+
* @param {Object|Array|String|Function|RegExp|any} arg
|
|
7
|
+
* @api private
|
|
8
|
+
* @return {Boolean}
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
module.exports = function isSimpleValidator(obj) {
|
|
12
|
+
const keys = Object.keys(obj);
|
|
13
|
+
let result = true;
|
|
14
|
+
for (let i = 0, len = keys.length; i < len; ++i) {
|
|
15
|
+
if (typeof obj[keys[i]] === 'object' && obj[keys[i]] !== null) {
|
|
16
|
+
result = false;
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return result;
|
|
22
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { isPOJO } = require('../utils');
|
|
4
|
+
|
|
5
|
+
module.exports = minimize;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Minimizes an object, removing undefined values and empty objects
|
|
9
|
+
*
|
|
10
|
+
* @param {Object} object to minimize
|
|
11
|
+
* @return {Object|undefined}
|
|
12
|
+
* @api private
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
function minimize(obj) {
|
|
16
|
+
const keys = Object.keys(obj);
|
|
17
|
+
let i = keys.length;
|
|
18
|
+
let hasKeys;
|
|
19
|
+
let key;
|
|
20
|
+
let val;
|
|
21
|
+
|
|
22
|
+
while (i--) {
|
|
23
|
+
key = keys[i];
|
|
24
|
+
val = obj[key];
|
|
25
|
+
|
|
26
|
+
if (isPOJO(val)) {
|
|
27
|
+
obj[key] = minimize(val);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (undefined === obj[key]) {
|
|
31
|
+
delete obj[key];
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
hasKeys = true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return hasKeys
|
|
39
|
+
? obj
|
|
40
|
+
: undefined;
|
|
41
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = function applyDefaultsToPOJO(doc, schema) {
|
|
4
|
+
const paths = Object.keys(schema.paths);
|
|
5
|
+
const plen = paths.length;
|
|
6
|
+
|
|
7
|
+
for (let i = 0; i < plen; ++i) {
|
|
8
|
+
let curPath = '';
|
|
9
|
+
const p = paths[i];
|
|
10
|
+
|
|
11
|
+
const type = schema.paths[p];
|
|
12
|
+
const path = type.splitPath();
|
|
13
|
+
const len = path.length;
|
|
14
|
+
let doc_ = doc;
|
|
15
|
+
for (let j = 0; j < len; ++j) {
|
|
16
|
+
if (doc_ == null) {
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const piece = path[j];
|
|
21
|
+
curPath += (!curPath.length ? '' : '.') + piece;
|
|
22
|
+
|
|
23
|
+
if (j === len - 1) {
|
|
24
|
+
if (typeof doc_[piece] !== 'undefined') {
|
|
25
|
+
if (type.$isSingleNested) {
|
|
26
|
+
applyDefaultsToPOJO(doc_[piece], type.schema);
|
|
27
|
+
} else if (type.$isMongooseDocumentArray && Array.isArray(doc_[piece])) {
|
|
28
|
+
doc_[piece].forEach(el => applyDefaultsToPOJO(el, type.schema));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const def = type.getDefault(doc, false, { skipCast: true });
|
|
35
|
+
if (typeof def !== 'undefined') {
|
|
36
|
+
doc_[piece] = def;
|
|
37
|
+
|
|
38
|
+
if (type.$isSingleNested) {
|
|
39
|
+
applyDefaultsToPOJO(def, type.schema);
|
|
40
|
+
} else if (type.$isMongooseDocumentArray && Array.isArray(def)) {
|
|
41
|
+
def.forEach(el => applyDefaultsToPOJO(el, type.schema));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
} else {
|
|
45
|
+
if (doc_[piece] == null) {
|
|
46
|
+
doc_[piece] = {};
|
|
47
|
+
}
|
|
48
|
+
doc_ = doc_[piece];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* ignore
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
module.exports = applyHooks;
|
|
8
|
+
|
|
9
|
+
/*!
|
|
10
|
+
* ignore
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
applyHooks.middlewareFunctions = [
|
|
14
|
+
'deleteOne',
|
|
15
|
+
'remove',
|
|
16
|
+
'save',
|
|
17
|
+
'updateOne',
|
|
18
|
+
'validate',
|
|
19
|
+
'init'
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
/*!
|
|
23
|
+
* ignore
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
const alreadyHookedFunctions = new Set(applyHooks.middlewareFunctions.flatMap(fn => ([fn, `$__${fn}`])));
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Register hooks for this model
|
|
30
|
+
*
|
|
31
|
+
* @param {Model} model
|
|
32
|
+
* @param {Schema} schema
|
|
33
|
+
* @param {Object} options
|
|
34
|
+
* @api private
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
function applyHooks(model, schema, options) {
|
|
38
|
+
options = options || {};
|
|
39
|
+
|
|
40
|
+
const kareemOptions = {
|
|
41
|
+
useErrorHandlers: true,
|
|
42
|
+
numCallbackParams: 1,
|
|
43
|
+
nullResultByDefault: true,
|
|
44
|
+
contextParameter: true
|
|
45
|
+
};
|
|
46
|
+
const objToDecorate = options.decorateDoc ? model : model.prototype;
|
|
47
|
+
model.$appliedHooks = true;
|
|
48
|
+
for (const key of Object.keys(schema.paths)) {
|
|
49
|
+
let type = schema.paths[key];
|
|
50
|
+
let childModel = null;
|
|
51
|
+
|
|
52
|
+
const result = findChildModel(type);
|
|
53
|
+
if (result) {
|
|
54
|
+
childModel = result.childModel;
|
|
55
|
+
type = result.type;
|
|
56
|
+
} else {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (childModel.$appliedHooks) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
applyHooks(childModel, type.schema, {
|
|
65
|
+
...options,
|
|
66
|
+
decorateDoc: false,
|
|
67
|
+
isChildSchema: true
|
|
68
|
+
});
|
|
69
|
+
if (childModel.discriminators != null) {
|
|
70
|
+
const keys = Object.keys(childModel.discriminators);
|
|
71
|
+
for (const key of keys) {
|
|
72
|
+
applyHooks(childModel.discriminators[key],
|
|
73
|
+
childModel.discriminators[key].schema, options);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Built-in hooks rely on hooking internal functions in order to support
|
|
79
|
+
// promises and make it so that `doc.save.toString()` provides meaningful
|
|
80
|
+
// information.
|
|
81
|
+
|
|
82
|
+
const middleware = schema._getDocumentMiddleware();
|
|
83
|
+
|
|
84
|
+
model._middleware = middleware;
|
|
85
|
+
|
|
86
|
+
objToDecorate.$__init = middleware.
|
|
87
|
+
createWrapperSync('init', objToDecorate.$__init, null, kareemOptions);
|
|
88
|
+
|
|
89
|
+
// Support hooks for custom methods
|
|
90
|
+
const customMethods = Object.keys(schema.methods);
|
|
91
|
+
const customMethodOptions = Object.assign({}, kareemOptions, {
|
|
92
|
+
// Only use `checkForPromise` for custom methods, because mongoose
|
|
93
|
+
// query thunks are not as consistent as I would like about returning
|
|
94
|
+
// a nullish value rather than the query. If a query thunk returns
|
|
95
|
+
// a query, `checkForPromise` causes infinite recursion
|
|
96
|
+
checkForPromise: true
|
|
97
|
+
});
|
|
98
|
+
for (const method of customMethods) {
|
|
99
|
+
if (alreadyHookedFunctions.has(method)) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (!middleware.hasHooks(method)) {
|
|
103
|
+
// Don't wrap if there are no hooks for the custom method to avoid
|
|
104
|
+
// surprises. Also, `createWrapper()` enforces consistent async,
|
|
105
|
+
// so wrapping a sync method would break it.
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const originalMethod = objToDecorate[method];
|
|
109
|
+
objToDecorate[`$__${method}`] = objToDecorate[method];
|
|
110
|
+
objToDecorate[method] = middleware.
|
|
111
|
+
createWrapper(method, originalMethod, null, customMethodOptions);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Check if there is an embedded schematype in the given schematype. Handles drilling down into primitive
|
|
117
|
+
* arrays and maps in case of array of array of subdocs or map of subdocs.
|
|
118
|
+
*
|
|
119
|
+
* @param {SchemaType} curType
|
|
120
|
+
* @returns {{ childModel: Model | typeof Subdocument, curType: SchemaType } | null}
|
|
121
|
+
*/
|
|
122
|
+
|
|
123
|
+
function findChildModel(curType) {
|
|
124
|
+
if (curType.$isSingleNested || curType.$isMongooseDocumentArray) {
|
|
125
|
+
return { childModel: curType.Constructor, type: curType };
|
|
126
|
+
}
|
|
127
|
+
if (curType.instance === 'Array') {
|
|
128
|
+
const embedded = curType.getEmbeddedSchemaType();
|
|
129
|
+
if (embedded) {
|
|
130
|
+
return findChildModel(embedded);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (curType.instance === 'Map') {
|
|
134
|
+
const mapType = curType.getEmbeddedSchemaType();
|
|
135
|
+
if (mapType) {
|
|
136
|
+
return findChildModel(mapType);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const get = require('../get');
|
|
4
|
+
const utils = require('../../utils');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Register methods for this model
|
|
8
|
+
*
|
|
9
|
+
* @param {Model} model
|
|
10
|
+
* @param {Schema} schema
|
|
11
|
+
* @api private
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
module.exports = function applyMethods(model, schema) {
|
|
15
|
+
const Model = require('../../model');
|
|
16
|
+
|
|
17
|
+
function apply(method, schema) {
|
|
18
|
+
Object.defineProperty(model.prototype, method, {
|
|
19
|
+
get: function() {
|
|
20
|
+
const h = {};
|
|
21
|
+
for (const k in schema.methods[method]) {
|
|
22
|
+
h[k] = schema.methods[method][k].bind(this);
|
|
23
|
+
}
|
|
24
|
+
return h;
|
|
25
|
+
},
|
|
26
|
+
configurable: true
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
for (const method of Object.keys(schema.methods)) {
|
|
30
|
+
const fn = schema.methods[method];
|
|
31
|
+
if (Object.hasOwn(schema.tree, method)) {
|
|
32
|
+
throw new Error('You have a method and a property in your schema both ' +
|
|
33
|
+
'named "' + method + '"');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Avoid making custom methods if user sets a method to itself, e.g.
|
|
37
|
+
// `schema.method(save, Document.prototype.save)`. Can happen when
|
|
38
|
+
// calling `loadClass()` with a class that `extends Document`. See gh-12254
|
|
39
|
+
if (typeof fn === 'function' &&
|
|
40
|
+
Model.prototype[method] === fn) {
|
|
41
|
+
delete schema.methods[method];
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (schema.reserved[method] &&
|
|
46
|
+
!get(schema, `methodOptions.${method}.suppressWarning`, false)) {
|
|
47
|
+
utils.warn(`mongoose: the method name "${method}" is used by mongoose ` +
|
|
48
|
+
'internally, overwriting it may cause bugs. If you\'re sure you know ' +
|
|
49
|
+
'what you\'re doing, you can suppress this error by using ' +
|
|
50
|
+
`\`schema.method('${method}', fn, { suppressWarning: true })\`.`);
|
|
51
|
+
}
|
|
52
|
+
if (typeof fn === 'function') {
|
|
53
|
+
model.prototype[method] = fn;
|
|
54
|
+
} else {
|
|
55
|
+
apply(method, schema);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Recursively call `applyMethods()` on child schemas
|
|
60
|
+
model.$appliedMethods = true;
|
|
61
|
+
for (const key of Object.keys(schema.paths)) {
|
|
62
|
+
const type = schema.paths[key];
|
|
63
|
+
if (type.$isSingleNested && !type.Constructor.$appliedMethods) {
|
|
64
|
+
applyMethods(type.Constructor, type.schema);
|
|
65
|
+
}
|
|
66
|
+
if (type.$isMongooseDocumentArray && !type.Constructor.$appliedMethods) {
|
|
67
|
+
applyMethods(type.Constructor, type.schema);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { queryMiddlewareFunctions, aggregateMiddlewareFunctions, modelMiddlewareFunctions, documentMiddlewareFunctions } = require('../../constants');
|
|
4
|
+
|
|
5
|
+
const middlewareFunctions = Array.from(
|
|
6
|
+
new Set([
|
|
7
|
+
...queryMiddlewareFunctions,
|
|
8
|
+
...aggregateMiddlewareFunctions,
|
|
9
|
+
...modelMiddlewareFunctions,
|
|
10
|
+
...documentMiddlewareFunctions
|
|
11
|
+
])
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
module.exports = function applyStaticHooks(model, hooks, statics) {
|
|
15
|
+
hooks = hooks.filter(hook => {
|
|
16
|
+
// If the custom static overwrites an existing middleware, don't apply
|
|
17
|
+
// middleware to it by default. This avoids a potential backwards breaking
|
|
18
|
+
// change with plugins like `mongoose-delete` that use statics to overwrite
|
|
19
|
+
// built-in Mongoose functions.
|
|
20
|
+
if (middlewareFunctions.indexOf(hook.name) !== -1) {
|
|
21
|
+
return !!hook.model;
|
|
22
|
+
}
|
|
23
|
+
return hook.model !== false;
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
for (const key of Object.keys(statics)) {
|
|
27
|
+
if (hooks.hasHooks(key)) {
|
|
28
|
+
const original = model[key];
|
|
29
|
+
|
|
30
|
+
model[key] = hooks.createWrapper(key, original);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Register statics for this model
|
|
5
|
+
* @param {Model} model
|
|
6
|
+
* @param {Schema} schema
|
|
7
|
+
* @api private
|
|
8
|
+
*/
|
|
9
|
+
module.exports = function applyStatics(model, schema) {
|
|
10
|
+
for (const i in schema.statics) {
|
|
11
|
+
model[i] = schema.statics[i];
|
|
12
|
+
}
|
|
13
|
+
};
|