@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,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const get = require('../get');
|
|
4
|
+
|
|
5
|
+
module.exports = function getKeysInSchemaOrder(schema, val, path) {
|
|
6
|
+
const schemaKeys = path != null ? Object.keys(get(schema.tree, path, {})) : Object.keys(schema.tree);
|
|
7
|
+
const valKeys = new Set(Object.keys(val));
|
|
8
|
+
|
|
9
|
+
let keys;
|
|
10
|
+
if (valKeys.size > 1) {
|
|
11
|
+
keys = new Set();
|
|
12
|
+
for (const key of schemaKeys) {
|
|
13
|
+
if (valKeys.has(key)) {
|
|
14
|
+
keys.add(key);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
for (const key of valKeys) {
|
|
18
|
+
if (!keys.has(key)) {
|
|
19
|
+
keys.add(key);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
keys = Array.from(keys);
|
|
23
|
+
} else {
|
|
24
|
+
keys = Array.from(valKeys);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return keys;
|
|
28
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const numberRE = /^\d+$/;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Behaves like `Schema#path()`, except for it also digs into arrays without
|
|
7
|
+
* needing to put `.0.`, so `getPath(schema, 'docArr.elProp')` works.
|
|
8
|
+
* @api private
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
module.exports = function getPath(schema, path, discriminatorValueMap) {
|
|
12
|
+
let schematype = schema.path(path);
|
|
13
|
+
if (schematype != null) {
|
|
14
|
+
return schematype;
|
|
15
|
+
}
|
|
16
|
+
const pieces = path.split('.');
|
|
17
|
+
let cur = '';
|
|
18
|
+
let isArray = false;
|
|
19
|
+
|
|
20
|
+
for (const piece of pieces) {
|
|
21
|
+
if (isArray && numberRE.test(piece)) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
cur = cur.length === 0 ? piece : cur + '.' + piece;
|
|
25
|
+
|
|
26
|
+
schematype = schema.path(cur);
|
|
27
|
+
if (schematype?.schema) {
|
|
28
|
+
schema = schematype.schema;
|
|
29
|
+
if (!isArray && schematype.$isMongooseDocumentArray) {
|
|
30
|
+
isArray = true;
|
|
31
|
+
}
|
|
32
|
+
if (discriminatorValueMap && discriminatorValueMap[cur]) {
|
|
33
|
+
schema = schema.discriminators[discriminatorValueMap[cur]] ?? schema;
|
|
34
|
+
}
|
|
35
|
+
cur = '';
|
|
36
|
+
} else if (schematype?.instance === 'Mixed') {
|
|
37
|
+
// If we found a mixed path, no point in digging further, the end result is always Mixed
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return schematype;
|
|
43
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Find the `strict` mode setting for the deepest subdocument along a given path
|
|
5
|
+
* to ensure we have the correct default value for `strict`. When setting values
|
|
6
|
+
* underneath a subdocument, we should use the subdocument's `strict` setting by
|
|
7
|
+
* default, not the top-level document's.
|
|
8
|
+
*
|
|
9
|
+
* @param {Schema} schema
|
|
10
|
+
* @param {String[]} parts
|
|
11
|
+
* @returns {boolean | 'throw' | undefined}
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
module.exports = function getSubdocumentStrictValue(schema, parts) {
|
|
15
|
+
if (parts.length === 1) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
let cur = parts[0];
|
|
19
|
+
let strict = undefined;
|
|
20
|
+
for (let i = 0; i < parts.length - 1; ++i) {
|
|
21
|
+
const curSchemaType = schema.path(cur);
|
|
22
|
+
if (curSchemaType?.schema) {
|
|
23
|
+
strict = curSchemaType.schema.options.strict;
|
|
24
|
+
schema = curSchemaType.schema;
|
|
25
|
+
cur = curSchemaType.$isMongooseDocumentArray && !isNaN(parts[i + 1]) ? '' : parts[i + 1];
|
|
26
|
+
} else {
|
|
27
|
+
cur += cur.length ? ('.' + parts[i + 1]) : parts[i + 1];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return strict;
|
|
32
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const addAutoId = require('./addAutoId');
|
|
4
|
+
|
|
5
|
+
module.exports = function handleIdOption(schema, options) {
|
|
6
|
+
if (options?._id == null) {
|
|
7
|
+
return schema;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
schema = schema.clone();
|
|
11
|
+
if (!options._id) {
|
|
12
|
+
schema.remove('_id');
|
|
13
|
+
schema.options._id = false;
|
|
14
|
+
} else if (!schema.paths['_id']) {
|
|
15
|
+
addAutoId(schema);
|
|
16
|
+
schema.options._id = true;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return schema;
|
|
20
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = handleTimestampOption;
|
|
4
|
+
|
|
5
|
+
/*!
|
|
6
|
+
* ignore
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
function handleTimestampOption(arg, prop) {
|
|
10
|
+
if (arg == null) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (typeof arg === 'boolean') {
|
|
15
|
+
return prop;
|
|
16
|
+
}
|
|
17
|
+
if (typeof arg[prop] === 'boolean') {
|
|
18
|
+
return arg[prop] ? prop : null;
|
|
19
|
+
}
|
|
20
|
+
if (!(prop in arg)) {
|
|
21
|
+
return prop;
|
|
22
|
+
}
|
|
23
|
+
return arg[prop];
|
|
24
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* ignore
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
module.exports = function addIdGetter(schema) {
|
|
8
|
+
// ensure the documents receive an id getter unless disabled
|
|
9
|
+
const autoIdGetter = !schema.paths['id'] &&
|
|
10
|
+
schema.paths['_id'] &&
|
|
11
|
+
schema.options.id;
|
|
12
|
+
if (!autoIdGetter) {
|
|
13
|
+
return schema;
|
|
14
|
+
}
|
|
15
|
+
if (schema.aliases?.id) {
|
|
16
|
+
return schema;
|
|
17
|
+
}
|
|
18
|
+
schema.virtual('id').get(idGetter);
|
|
19
|
+
|
|
20
|
+
return schema;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Returns this documents _id cast to a string.
|
|
25
|
+
* @api private
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
function idGetter() {
|
|
29
|
+
if (this._id != null) {
|
|
30
|
+
return this._id.toString();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = function merge(s1, s2, skipConflictingPaths) {
|
|
4
|
+
const paths = Object.keys(s2.tree);
|
|
5
|
+
const pathsToAdd = {};
|
|
6
|
+
for (const key of paths) {
|
|
7
|
+
if (skipConflictingPaths && (s1.paths[key] || s1.nested[key] || s1.singleNestedPaths[key])) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
pathsToAdd[key] = s2.tree[key];
|
|
11
|
+
}
|
|
12
|
+
s1.options._isMerging = true;
|
|
13
|
+
s1.add(pathsToAdd, null);
|
|
14
|
+
delete s1.options._isMerging;
|
|
15
|
+
|
|
16
|
+
s1.callQueue = s1.callQueue.concat(s2.callQueue);
|
|
17
|
+
s1.method(s2.methods);
|
|
18
|
+
s1.static(s2.statics);
|
|
19
|
+
|
|
20
|
+
for (const [option, value] of Object.entries(s2._userProvidedOptions)) {
|
|
21
|
+
if (!(option in s1._userProvidedOptions)) {
|
|
22
|
+
s1.set(option, value);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
for (const query in s2.query) {
|
|
27
|
+
s1.query[query] = s2.query[query];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
for (const virtual in s2.virtuals) {
|
|
31
|
+
s1.virtuals[virtual] = s2.virtuals[virtual].clone();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
s1._indexes = s1._indexes.concat(s2._indexes || []);
|
|
35
|
+
s1.s.hooks.merge(s2.s.hooks, false);
|
|
36
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const StrictModeError = require('../../error/strict');
|
|
4
|
+
|
|
5
|
+
/*!
|
|
6
|
+
* ignore
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
module.exports = function(schematype) {
|
|
10
|
+
if (schematype.$immutable) {
|
|
11
|
+
schematype.$immutableSetter = createImmutableSetter(schematype.path,
|
|
12
|
+
schematype.options.immutable);
|
|
13
|
+
schematype.set(schematype.$immutableSetter);
|
|
14
|
+
} else if (schematype.$immutableSetter) {
|
|
15
|
+
schematype.setters = schematype.setters.
|
|
16
|
+
filter(fn => fn !== schematype.$immutableSetter);
|
|
17
|
+
delete schematype.$immutableSetter;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
function createImmutableSetter(path, immutable) {
|
|
22
|
+
return function immutableSetter(v, _priorVal, _doc, options) {
|
|
23
|
+
if (this == null || this.$__ == null) {
|
|
24
|
+
return v;
|
|
25
|
+
}
|
|
26
|
+
if (this.isNew) {
|
|
27
|
+
return v;
|
|
28
|
+
}
|
|
29
|
+
if (options?.overwriteImmutable) {
|
|
30
|
+
return v;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const _immutable = typeof immutable === 'function' ?
|
|
34
|
+
immutable.call(this, this) :
|
|
35
|
+
immutable;
|
|
36
|
+
if (!_immutable) {
|
|
37
|
+
return v;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const _value = this.$__.priorDoc != null ?
|
|
41
|
+
this.$__.priorDoc.$__getValue(path) :
|
|
42
|
+
this.$__getValue(path);
|
|
43
|
+
if (this.$__.strictMode === 'throw' && v !== _value) {
|
|
44
|
+
throw new StrictModeError(path, 'Path `' + path + '` is immutable ' +
|
|
45
|
+
'and strict mode is set to throw.', true);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return _value;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const get = require('./get');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Applies defaults to update and findOneAndUpdate operations.
|
|
6
|
+
*
|
|
7
|
+
* @param {Object} filter
|
|
8
|
+
* @param {Schema} schema
|
|
9
|
+
* @param {Object} castedDoc
|
|
10
|
+
* @param {Object} options
|
|
11
|
+
* @method setDefaultsOnInsert
|
|
12
|
+
* @api private
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
module.exports = function(filter, schema, castedDoc, options) {
|
|
16
|
+
options = options || {};
|
|
17
|
+
|
|
18
|
+
const shouldSetDefaultsOnInsert = options.setDefaultsOnInsert ?? schema.base.options.setDefaultsOnInsert;
|
|
19
|
+
|
|
20
|
+
if (!options.upsert || shouldSetDefaultsOnInsert === false) {
|
|
21
|
+
return castedDoc;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const keys = Object.keys(castedDoc || {});
|
|
25
|
+
const updatedKeys = {};
|
|
26
|
+
const updatedValues = {};
|
|
27
|
+
const numKeys = keys.length;
|
|
28
|
+
|
|
29
|
+
let hasDollarUpdate = false;
|
|
30
|
+
|
|
31
|
+
for (let i = 0; i < numKeys; ++i) {
|
|
32
|
+
if (keys[i].charAt(0) === '$') {
|
|
33
|
+
hasDollarUpdate = true;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const paths = Object.keys(filter);
|
|
39
|
+
const numPaths = paths.length;
|
|
40
|
+
for (let i = 0; i < numPaths; ++i) {
|
|
41
|
+
const path = paths[i];
|
|
42
|
+
const condition = filter[path];
|
|
43
|
+
if (condition && typeof condition === 'object') {
|
|
44
|
+
const conditionKeys = Object.keys(condition);
|
|
45
|
+
const numConditionKeys = conditionKeys.length;
|
|
46
|
+
let hasDollarKey = false;
|
|
47
|
+
for (let j = 0; j < numConditionKeys; ++j) {
|
|
48
|
+
if (conditionKeys[j].charAt(0) === '$') {
|
|
49
|
+
hasDollarKey = true;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (hasDollarKey) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
updatedKeys[path] = true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (options?.overwrite && !hasDollarUpdate) {
|
|
61
|
+
// Defaults will be set later, since we're overwriting we'll cast
|
|
62
|
+
// the whole update to a document
|
|
63
|
+
return castedDoc;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
schema.eachPath(function(path, schemaType) {
|
|
67
|
+
// Skip single nested paths if underneath a map
|
|
68
|
+
if (schemaType.path === '_id' && schemaType.options.auto) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const def = schemaType.getDefault(null, true);
|
|
72
|
+
if (typeof def === 'undefined') {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const pathPieces = schemaType.splitPath();
|
|
76
|
+
if (pathPieces.includes('$*')) {
|
|
77
|
+
// Skip defaults underneath maps. We should never do `$setOnInsert` on a path with `$*`
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (isModified(castedDoc, updatedKeys, path, pathPieces, hasDollarUpdate)) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
castedDoc = castedDoc || {};
|
|
85
|
+
castedDoc.$setOnInsert = castedDoc.$setOnInsert || {};
|
|
86
|
+
if (get(castedDoc, path) == null) {
|
|
87
|
+
castedDoc.$setOnInsert[path] = def;
|
|
88
|
+
}
|
|
89
|
+
updatedValues[path] = def;
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
return castedDoc;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
function isModified(castedDoc, updatedKeys, path, pathPieces, hasDollarUpdate) {
|
|
96
|
+
// Check if path is in filter (updatedKeys)
|
|
97
|
+
if (updatedKeys[path]) {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Check if any parent path is in filter
|
|
102
|
+
let cur = pathPieces[0];
|
|
103
|
+
for (let i = 1; i < pathPieces.length; ++i) {
|
|
104
|
+
if (updatedKeys[cur]) {
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
cur += '.' + pathPieces[i];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Check if path is modified in the update
|
|
111
|
+
if (hasDollarUpdate) {
|
|
112
|
+
// Check each update operator
|
|
113
|
+
for (const key in castedDoc) {
|
|
114
|
+
if (key.charAt(0) === '$') {
|
|
115
|
+
if (pathExistsInUpdate(castedDoc[key], path, pathPieces)) {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
// No dollar operators, check the castedDoc directly
|
|
122
|
+
if (pathExistsInUpdate(castedDoc, path, pathPieces)) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function pathExistsInUpdate(update, targetPath, pathPieces) {
|
|
131
|
+
if (update == null || typeof update !== 'object') {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Check exact match
|
|
136
|
+
if (Object.hasOwn(update, targetPath)) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Check if any parent path exists
|
|
141
|
+
let cur = pathPieces[0];
|
|
142
|
+
for (let i = 1; i < pathPieces.length; ++i) {
|
|
143
|
+
if (Object.hasOwn(update, cur)) {
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
cur += '.' + pathPieces[i];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Check if any child path exists (e.g., path is "a" and update has "a.b")
|
|
150
|
+
const prefix = targetPath + '.';
|
|
151
|
+
for (const key in update) {
|
|
152
|
+
if (key.startsWith(prefix)) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
exports.arrayAtomicsBackupSymbol = Symbol('mongoose#Array#atomicsBackup');
|
|
4
|
+
exports.arrayAtomicsSymbol = Symbol('mongoose#Array#_atomics');
|
|
5
|
+
exports.arrayParentSymbol = Symbol('mongoose#Array#_parent');
|
|
6
|
+
exports.arrayPathSymbol = Symbol('mongoose#Array#_path');
|
|
7
|
+
exports.arraySchemaSymbol = Symbol('mongoose#Array#_schema');
|
|
8
|
+
exports.documentArrayParent = Symbol('mongoose#documentArrayParent');
|
|
9
|
+
exports.documentIsSelected = Symbol('mongoose#Document#isSelected');
|
|
10
|
+
exports.documentIsModified = Symbol('mongoose#Document#isModified');
|
|
11
|
+
exports.documentModifiedPaths = Symbol('mongoose#Document#modifiedPaths');
|
|
12
|
+
exports.documentSchemaSymbol = Symbol('mongoose#Document#schema');
|
|
13
|
+
exports.getSymbol = Symbol('mongoose#Document#get');
|
|
14
|
+
exports.modelSymbol = Symbol('mongoose#Model');
|
|
15
|
+
exports.objectIdSymbol = Symbol('mongoose#ObjectId');
|
|
16
|
+
exports.populateModelSymbol = Symbol('mongoose#PopulateOptions#Model');
|
|
17
|
+
exports.schemaTypeSymbol = Symbol('mongoose#schemaType');
|
|
18
|
+
exports.sessionNewDocuments = Symbol('mongoose#ClientSession#newDocuments');
|
|
19
|
+
exports.scopeSymbol = Symbol('mongoose#Document#scope');
|
|
20
|
+
exports.validatorErrorSymbol = Symbol('mongoose#validatorError');
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = function setDocumentTimestamps(doc, timestampOption, currentTime, createdAt, updatedAt) {
|
|
4
|
+
const skipUpdatedAt = timestampOption?.updatedAt === false;
|
|
5
|
+
const skipCreatedAt = timestampOption?.createdAt === false;
|
|
6
|
+
|
|
7
|
+
const defaultTimestamp = currentTime != null ?
|
|
8
|
+
currentTime() :
|
|
9
|
+
doc.ownerDocument().constructor.base.now();
|
|
10
|
+
|
|
11
|
+
if (!skipCreatedAt &&
|
|
12
|
+
(doc.isNew || doc.$isSubdocument) &&
|
|
13
|
+
createdAt &&
|
|
14
|
+
!doc.$__getValue(createdAt) &&
|
|
15
|
+
doc.$__isSelected(createdAt)) {
|
|
16
|
+
doc.$set(createdAt, defaultTimestamp, undefined, { overwriteImmutable: true });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (!skipUpdatedAt && updatedAt && (doc.isNew || doc.$isModified())) {
|
|
20
|
+
let ts = defaultTimestamp;
|
|
21
|
+
if (doc.isNew && createdAt != null) {
|
|
22
|
+
ts = doc.$__getValue(createdAt);
|
|
23
|
+
}
|
|
24
|
+
doc.$set(updatedAt, ts);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const applyTimestampsToChildren = require('../update/applyTimestampsToChildren');
|
|
4
|
+
const applyTimestampsToUpdate = require('../update/applyTimestampsToUpdate');
|
|
5
|
+
const get = require('../get');
|
|
6
|
+
const handleTimestampOption = require('../schema/handleTimestampOption');
|
|
7
|
+
const setDocumentTimestamps = require('./setDocumentTimestamps');
|
|
8
|
+
const symbols = require('../../schema/symbols');
|
|
9
|
+
|
|
10
|
+
const replaceOps = new Set([
|
|
11
|
+
'replaceOne',
|
|
12
|
+
'findOneAndReplace'
|
|
13
|
+
]);
|
|
14
|
+
|
|
15
|
+
module.exports = function setupTimestamps(schema, timestamps) {
|
|
16
|
+
const childHasTimestamp = schema.childSchemas.find(withTimestamp);
|
|
17
|
+
function withTimestamp(s) {
|
|
18
|
+
const ts = s.schema.options.timestamps;
|
|
19
|
+
return !!ts;
|
|
20
|
+
}
|
|
21
|
+
if (!timestamps && !childHasTimestamp) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const createdAt = handleTimestampOption(timestamps, 'createdAt');
|
|
25
|
+
const updatedAt = handleTimestampOption(timestamps, 'updatedAt');
|
|
26
|
+
const currentTime = timestamps != null && Object.hasOwn(timestamps, 'currentTime') ?
|
|
27
|
+
timestamps.currentTime :
|
|
28
|
+
null;
|
|
29
|
+
const schemaAdditions = {};
|
|
30
|
+
|
|
31
|
+
schema.$timestamps = { createdAt: createdAt, updatedAt: updatedAt };
|
|
32
|
+
|
|
33
|
+
if (createdAt && !schema.paths[createdAt]) {
|
|
34
|
+
const baseImmutableCreatedAt = schema.base?.get('timestamps.createdAt.immutable') ?? null;
|
|
35
|
+
const immutable = baseImmutableCreatedAt ?? true;
|
|
36
|
+
schemaAdditions[createdAt] = { [schema.options.typeKey || 'type']: Date, immutable };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (updatedAt && !schema.paths[updatedAt]) {
|
|
40
|
+
schemaAdditions[updatedAt] = Date;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
schema.add(schemaAdditions);
|
|
44
|
+
|
|
45
|
+
schema.pre('save', function timestampsPreSave() {
|
|
46
|
+
const timestampOption = get(this, '$__.saveOptions.timestamps');
|
|
47
|
+
if (timestampOption === false) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
setDocumentTimestamps(this, timestampOption, currentTime, createdAt, updatedAt);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
schema.methods.initializeTimestamps = function(timestampsOptions) {
|
|
55
|
+
if (timestampsOptions === false) {
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
const ts = currentTime != null ?
|
|
59
|
+
currentTime() : this.constructor.base.now();
|
|
60
|
+
|
|
61
|
+
const initTimestampsCreatedAt = timestampsOptions != null ?
|
|
62
|
+
handleTimestampOption(timestampsOptions, 'createdAt') :
|
|
63
|
+
createdAt;
|
|
64
|
+
const initTimestampsUpdatedAt = timestampsOptions != null ?
|
|
65
|
+
handleTimestampOption(timestampsOptions, 'updatedAt') :
|
|
66
|
+
updatedAt;
|
|
67
|
+
|
|
68
|
+
if (initTimestampsCreatedAt && !this.get(initTimestampsCreatedAt)) {
|
|
69
|
+
this.$set(createdAt, ts);
|
|
70
|
+
}
|
|
71
|
+
if (initTimestampsUpdatedAt && !this.get(initTimestampsUpdatedAt)) {
|
|
72
|
+
this.$set(updatedAt, ts);
|
|
73
|
+
}
|
|
74
|
+
if (this.$isSubdocument) {
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const subdocs = this.$getAllSubdocs();
|
|
79
|
+
for (const subdoc of subdocs) {
|
|
80
|
+
if (subdoc.initializeTimestamps) {
|
|
81
|
+
subdoc.initializeTimestamps(timestampsOptions);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return this;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
_setTimestampsOnUpdate[symbols.builtInMiddleware] = true;
|
|
89
|
+
|
|
90
|
+
const opts = { query: true, model: false };
|
|
91
|
+
schema.pre('findOneAndReplace', opts, _setTimestampsOnUpdate);
|
|
92
|
+
schema.pre('findOneAndUpdate', opts, _setTimestampsOnUpdate);
|
|
93
|
+
schema.pre('replaceOne', opts, _setTimestampsOnUpdate);
|
|
94
|
+
schema.pre('update', opts, _setTimestampsOnUpdate);
|
|
95
|
+
schema.pre('updateOne', opts, _setTimestampsOnUpdate);
|
|
96
|
+
schema.pre('updateMany', opts, _setTimestampsOnUpdate);
|
|
97
|
+
|
|
98
|
+
function _setTimestampsOnUpdate() {
|
|
99
|
+
const now = currentTime != null ?
|
|
100
|
+
currentTime() :
|
|
101
|
+
this.model.base.now();
|
|
102
|
+
// Replacing with null update should still trigger timestamps
|
|
103
|
+
if (replaceOps.has(this.op) && this.getUpdate() == null) {
|
|
104
|
+
this.setUpdate({});
|
|
105
|
+
}
|
|
106
|
+
applyTimestampsToUpdate(
|
|
107
|
+
now,
|
|
108
|
+
createdAt,
|
|
109
|
+
updatedAt,
|
|
110
|
+
this.getUpdate(),
|
|
111
|
+
this._mongooseOptions,
|
|
112
|
+
replaceOps.has(this.op)
|
|
113
|
+
);
|
|
114
|
+
applyTimestampsToChildren(now, this.getUpdate(), this.model.schema);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const getConstructorName = require('../getConstructorName');
|
|
4
|
+
|
|
5
|
+
module.exports = function allServersUnknown(topologyDescription) {
|
|
6
|
+
if (getConstructorName(topologyDescription) !== 'TopologyDescription') {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const servers = Array.from(topologyDescription.servers.values());
|
|
11
|
+
return servers.length > 0 && servers.every(server => server.type === 'Unknown');
|
|
12
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const getConstructorName = require('../getConstructorName');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @typedef { import('mongodb').TopologyDescription } TopologyDescription
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Checks if topologyDescription contains servers connected to an atlas instance
|
|
11
|
+
*
|
|
12
|
+
* @param {TopologyDescription} topologyDescription
|
|
13
|
+
* @returns {boolean}
|
|
14
|
+
*/
|
|
15
|
+
module.exports = function isAtlas(topologyDescription) {
|
|
16
|
+
if (getConstructorName(topologyDescription) !== 'TopologyDescription') {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (topologyDescription.servers.size === 0) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
for (const server of topologyDescription.servers.values()) {
|
|
25
|
+
if (server.host.endsWith('.mongodb.net') === false || server.port !== 27017) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return true;
|
|
31
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const getConstructorName = require('../getConstructorName');
|
|
4
|
+
|
|
5
|
+
const nonSSLMessage = 'Client network socket disconnected before secure TLS ' +
|
|
6
|
+
'connection was established';
|
|
7
|
+
|
|
8
|
+
module.exports = function isSSLError(topologyDescription) {
|
|
9
|
+
if (getConstructorName(topologyDescription) !== 'TopologyDescription') {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const descriptions = Array.from(topologyDescription.servers.values());
|
|
14
|
+
return descriptions.length > 0 &&
|
|
15
|
+
descriptions.every(descr => descr.error && descr.error.message.indexOf(nonSSLMessage) !== -1);
|
|
16
|
+
};
|