@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,316 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const MongooseError = require('../../error/mongooseError');
|
|
4
|
+
const getDiscriminatorByValue = require('../../helpers/discriminator/getDiscriminatorByValue');
|
|
5
|
+
const applyTimestampsToChildren = require('../update/applyTimestampsToChildren');
|
|
6
|
+
const applyTimestampsToUpdate = require('../update/applyTimestampsToUpdate');
|
|
7
|
+
const cast = require('../../cast');
|
|
8
|
+
const castUpdate = require('../query/castUpdate');
|
|
9
|
+
const clone = require('../clone');
|
|
10
|
+
const decorateUpdateWithVersionKey = require('../update/decorateUpdateWithVersionKey');
|
|
11
|
+
const { inspect } = require('util');
|
|
12
|
+
const setDefaultsOnInsert = require('../setDefaultsOnInsert');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Given a model and a bulkWrite op, return a thunk that handles casting and
|
|
16
|
+
* validating the individual op.
|
|
17
|
+
* @param {Model} originalModel
|
|
18
|
+
* @param {Object} op
|
|
19
|
+
* @param {Object} [options]
|
|
20
|
+
* @api private
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
module.exports = function castBulkWrite(originalModel, op, options) {
|
|
24
|
+
const now = originalModel.base.now();
|
|
25
|
+
|
|
26
|
+
if (op['insertOne']) {
|
|
27
|
+
return callback => module.exports.castInsertOne(originalModel, op['insertOne'], options).then(() => callback(null), err => callback(err));
|
|
28
|
+
} else if (op['updateOne']) {
|
|
29
|
+
return (callback) => {
|
|
30
|
+
try {
|
|
31
|
+
module.exports.castUpdateOne(originalModel, op['updateOne'], options, now);
|
|
32
|
+
callback(null);
|
|
33
|
+
} catch (err) {
|
|
34
|
+
callback(err);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
} else if (op['updateMany']) {
|
|
38
|
+
return (callback) => {
|
|
39
|
+
try {
|
|
40
|
+
module.exports.castUpdateMany(originalModel, op['updateMany'], options, now);
|
|
41
|
+
callback(null);
|
|
42
|
+
} catch (err) {
|
|
43
|
+
callback(err);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
} else if (op['replaceOne']) {
|
|
47
|
+
return (callback) => {
|
|
48
|
+
module.exports.castReplaceOne(originalModel, op['replaceOne'], options).then(() => callback(null), err => callback(err));
|
|
49
|
+
};
|
|
50
|
+
} else if (op['deleteOne']) {
|
|
51
|
+
return (callback) => {
|
|
52
|
+
try {
|
|
53
|
+
module.exports.castDeleteOne(originalModel, op['deleteOne']);
|
|
54
|
+
callback(null);
|
|
55
|
+
} catch (err) {
|
|
56
|
+
callback(err);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
} else if (op['deleteMany']) {
|
|
60
|
+
return (callback) => {
|
|
61
|
+
try {
|
|
62
|
+
module.exports.castDeleteMany(originalModel, op['deleteMany']);
|
|
63
|
+
callback(null);
|
|
64
|
+
} catch (err) {
|
|
65
|
+
callback(err);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
} else {
|
|
69
|
+
return (callback) => {
|
|
70
|
+
const error = new MongooseError(`Invalid op passed to \`bulkWrite()\`: ${inspect(op)}`);
|
|
71
|
+
callback(error, null);
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
module.exports.castInsertOne = async function castInsertOne(originalModel, insertOne, options) {
|
|
77
|
+
const model = decideModelByObject(originalModel, insertOne['document']);
|
|
78
|
+
|
|
79
|
+
const doc = new model(insertOne['document']);
|
|
80
|
+
if (model.schema.options.timestamps && getTimestampsOpt(insertOne, options)) {
|
|
81
|
+
doc.initializeTimestamps();
|
|
82
|
+
}
|
|
83
|
+
if (options.session != null) {
|
|
84
|
+
doc.$session(options.session);
|
|
85
|
+
}
|
|
86
|
+
const versionKey = model?.schema?.options?.versionKey;
|
|
87
|
+
if (versionKey && doc[versionKey] == null) {
|
|
88
|
+
doc[versionKey] = 0;
|
|
89
|
+
}
|
|
90
|
+
insertOne['document'] = doc;
|
|
91
|
+
|
|
92
|
+
if (options.skipValidation || insertOne.skipValidation) {
|
|
93
|
+
return insertOne;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
await insertOne['document'].$validate();
|
|
97
|
+
return insertOne;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
module.exports.castUpdateOne = function castUpdateOne(originalModel, updateOne, options, now) {
|
|
101
|
+
if (!updateOne['filter']) {
|
|
102
|
+
throw new Error('Must provide a filter object.');
|
|
103
|
+
}
|
|
104
|
+
if (!updateOne['update']) {
|
|
105
|
+
throw new Error('Must provide an update object.');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const model = decideModelByObject(originalModel, updateOne['filter']);
|
|
109
|
+
const schema = model.schema;
|
|
110
|
+
const strict = options.strict ?? model.schema.options.strict;
|
|
111
|
+
|
|
112
|
+
const update = clone(updateOne['update']);
|
|
113
|
+
|
|
114
|
+
_addDiscriminatorToObject(schema, updateOne['filter']);
|
|
115
|
+
|
|
116
|
+
const doInitTimestamps = getTimestampsOpt(updateOne, options);
|
|
117
|
+
|
|
118
|
+
if (model.schema.$timestamps != null && doInitTimestamps) {
|
|
119
|
+
const createdAt = model.schema.$timestamps.createdAt;
|
|
120
|
+
const updatedAt = model.schema.$timestamps.updatedAt;
|
|
121
|
+
applyTimestampsToUpdate(now, createdAt, updatedAt, update, {
|
|
122
|
+
timestamps: updateOne.timestamps,
|
|
123
|
+
overwriteImmutable: updateOne.overwriteImmutable
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (doInitTimestamps) {
|
|
128
|
+
applyTimestampsToChildren(now, update, model.schema);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const globalSetDefaultsOnInsert = originalModel.base.options.setDefaultsOnInsert;
|
|
132
|
+
const shouldSetDefaultsOnInsert = updateOne.setDefaultsOnInsert ?? globalSetDefaultsOnInsert;
|
|
133
|
+
if (shouldSetDefaultsOnInsert !== false) {
|
|
134
|
+
setDefaultsOnInsert(updateOne['filter'], model.schema, update, {
|
|
135
|
+
setDefaultsOnInsert: true,
|
|
136
|
+
upsert: updateOne.upsert
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
decorateUpdateWithVersionKey(
|
|
141
|
+
update,
|
|
142
|
+
updateOne,
|
|
143
|
+
model.schema.options.versionKey
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
updateOne['filter'] = cast(model.schema, updateOne['filter'], {
|
|
147
|
+
strict: strict,
|
|
148
|
+
upsert: updateOne.upsert
|
|
149
|
+
});
|
|
150
|
+
updateOne['update'] = castUpdate(model.schema, update, {
|
|
151
|
+
strict: strict,
|
|
152
|
+
upsert: updateOne.upsert,
|
|
153
|
+
arrayFilters: updateOne.arrayFilters,
|
|
154
|
+
overwriteDiscriminatorKey: updateOne.overwriteDiscriminatorKey,
|
|
155
|
+
overwriteImmutable: updateOne.overwriteImmutable
|
|
156
|
+
}, model, updateOne['filter']);
|
|
157
|
+
|
|
158
|
+
return updateOne;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
module.exports.castUpdateMany = function castUpdateMany(originalModel, updateMany, options, now) {
|
|
162
|
+
if (!updateMany['filter']) {
|
|
163
|
+
throw new Error('Must provide a filter object.');
|
|
164
|
+
}
|
|
165
|
+
if (!updateMany['update']) {
|
|
166
|
+
throw new Error('Must provide an update object.');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const model = decideModelByObject(originalModel, updateMany['filter']);
|
|
170
|
+
const schema = model.schema;
|
|
171
|
+
const strict = options.strict ?? model.schema.options.strict;
|
|
172
|
+
|
|
173
|
+
const globalSetDefaultsOnInsert = originalModel.base.options.setDefaultsOnInsert;
|
|
174
|
+
const shouldSetDefaultsOnInsert = updateMany.setDefaultsOnInsert ?? globalSetDefaultsOnInsert;
|
|
175
|
+
|
|
176
|
+
if (shouldSetDefaultsOnInsert !== false) {
|
|
177
|
+
setDefaultsOnInsert(updateMany['filter'], model.schema, updateMany['update'], {
|
|
178
|
+
setDefaultsOnInsert: true,
|
|
179
|
+
upsert: updateMany.upsert
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const doInitTimestamps = getTimestampsOpt(updateMany, options);
|
|
184
|
+
|
|
185
|
+
if (model.schema.$timestamps != null && doInitTimestamps) {
|
|
186
|
+
const createdAt = model.schema.$timestamps.createdAt;
|
|
187
|
+
const updatedAt = model.schema.$timestamps.updatedAt;
|
|
188
|
+
applyTimestampsToUpdate(now, createdAt, updatedAt, updateMany['update'], {
|
|
189
|
+
timestamps: updateMany.timestamps,
|
|
190
|
+
overwriteImmutable: updateMany.overwriteImmutable
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
if (doInitTimestamps) {
|
|
194
|
+
applyTimestampsToChildren(now, updateMany['update'], model.schema);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
_addDiscriminatorToObject(schema, updateMany['filter']);
|
|
198
|
+
|
|
199
|
+
decorateUpdateWithVersionKey(
|
|
200
|
+
updateMany['update'],
|
|
201
|
+
updateMany,
|
|
202
|
+
model.schema.options.versionKey
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
updateMany['filter'] = cast(model.schema, updateMany['filter'], {
|
|
206
|
+
strict: strict,
|
|
207
|
+
upsert: updateMany.upsert
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
updateMany['update'] = castUpdate(model.schema, updateMany['update'], {
|
|
211
|
+
strict: strict,
|
|
212
|
+
upsert: updateMany.upsert,
|
|
213
|
+
arrayFilters: updateMany.arrayFilters,
|
|
214
|
+
overwriteDiscriminatorKey: updateMany.overwriteDiscriminatorKey,
|
|
215
|
+
overwriteImmutable: updateMany.overwriteImmutable
|
|
216
|
+
}, model, updateMany['filter']);
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
module.exports.castReplaceOne = async function castReplaceOne(originalModel, replaceOne, options) {
|
|
220
|
+
const model = decideModelByObject(originalModel, replaceOne['filter']);
|
|
221
|
+
const schema = model.schema;
|
|
222
|
+
const strict = options.strict ?? model.schema.options.strict;
|
|
223
|
+
|
|
224
|
+
_addDiscriminatorToObject(schema, replaceOne['filter']);
|
|
225
|
+
replaceOne['filter'] = cast(model.schema, replaceOne['filter'], {
|
|
226
|
+
strict: strict,
|
|
227
|
+
upsert: replaceOne.upsert
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// set `skipId`, otherwise we get "_id field cannot be changed"
|
|
231
|
+
const doc = new model(replaceOne['replacement'], strict, { skipId: true });
|
|
232
|
+
if (model.schema.options.timestamps && getTimestampsOpt(replaceOne, options)) {
|
|
233
|
+
doc.initializeTimestamps();
|
|
234
|
+
}
|
|
235
|
+
if (options.session != null) {
|
|
236
|
+
doc.$session(options.session);
|
|
237
|
+
}
|
|
238
|
+
const versionKey = model?.schema?.options?.versionKey;
|
|
239
|
+
if (versionKey && doc[versionKey] == null) {
|
|
240
|
+
doc[versionKey] = 0;
|
|
241
|
+
}
|
|
242
|
+
replaceOne['replacement'] = doc;
|
|
243
|
+
|
|
244
|
+
if (options.skipValidation || replaceOne.skipValidation) {
|
|
245
|
+
replaceOne['replacement'] = replaceOne['replacement'].toBSON();
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
await replaceOne['replacement'].$validate();
|
|
250
|
+
replaceOne['replacement'] = replaceOne['replacement'].toBSON();
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
module.exports.castDeleteOne = function castDeleteOne(originalModel, deleteOne) {
|
|
254
|
+
const model = decideModelByObject(originalModel, deleteOne['filter']);
|
|
255
|
+
const schema = model.schema;
|
|
256
|
+
|
|
257
|
+
_addDiscriminatorToObject(schema, deleteOne['filter']);
|
|
258
|
+
|
|
259
|
+
deleteOne['filter'] = cast(model.schema, deleteOne['filter']);
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
module.exports.castDeleteMany = function castDeleteMany(originalModel, deleteMany) {
|
|
263
|
+
const model = decideModelByObject(originalModel, deleteMany['filter']);
|
|
264
|
+
const schema = model.schema;
|
|
265
|
+
|
|
266
|
+
_addDiscriminatorToObject(schema, deleteMany['filter']);
|
|
267
|
+
|
|
268
|
+
deleteMany['filter'] = cast(model.schema, deleteMany['filter']);
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
module.exports.cast = {
|
|
272
|
+
insertOne: module.exports.castInsertOne,
|
|
273
|
+
updateOne: module.exports.castUpdateOne,
|
|
274
|
+
updateMany: module.exports.castUpdateMany,
|
|
275
|
+
replaceOne: module.exports.castReplaceOne,
|
|
276
|
+
deleteOne: module.exports.castDeleteOne,
|
|
277
|
+
deleteMany: module.exports.castDeleteMany
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
function _addDiscriminatorToObject(schema, obj) {
|
|
281
|
+
if (schema == null) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (schema.discriminatorMapping && !schema.discriminatorMapping.isRoot) {
|
|
285
|
+
obj[schema.discriminatorMapping.key] = schema.discriminatorMapping.value;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* gets discriminator model if discriminator key is present in object
|
|
291
|
+
* @api private
|
|
292
|
+
*/
|
|
293
|
+
|
|
294
|
+
function decideModelByObject(model, object) {
|
|
295
|
+
const discriminatorKey = model.schema.options.discriminatorKey;
|
|
296
|
+
if (object != null && Object.hasOwn(object, discriminatorKey)) {
|
|
297
|
+
model = getDiscriminatorByValue(model.discriminators, object[discriminatorKey]) || model;
|
|
298
|
+
}
|
|
299
|
+
return model;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* gets timestamps option for a given operation. If the option is set within an individual operation, use it. Otherwise, use the global timestamps option configured in the `bulkWrite` options. Overall default is `true`.
|
|
304
|
+
* @api private
|
|
305
|
+
*/
|
|
306
|
+
|
|
307
|
+
function getTimestampsOpt(opCommand, options) {
|
|
308
|
+
const opLevelOpt = opCommand.timestamps;
|
|
309
|
+
const bulkLevelOpt = options.timestamps;
|
|
310
|
+
if (opLevelOpt != null) {
|
|
311
|
+
return opLevelOpt;
|
|
312
|
+
} else if (bulkLevelOpt != null) {
|
|
313
|
+
return bulkLevelOpt;
|
|
314
|
+
}
|
|
315
|
+
return true;
|
|
316
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = function decorateBulkWriteResult(resultOrError, validationErrors, results) {
|
|
4
|
+
resultOrError.mongoose = resultOrError.mongoose || {};
|
|
5
|
+
resultOrError.mongoose.validationErrors = validationErrors;
|
|
6
|
+
resultOrError.mongoose.results = results;
|
|
7
|
+
return resultOrError;
|
|
8
|
+
};
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const Mixed = require('../../schema/mixed');
|
|
4
|
+
const applyBuiltinPlugins = require('../schema/applyBuiltinPlugins');
|
|
5
|
+
const clone = require('../clone');
|
|
6
|
+
const defineKey = require('../document/compile').defineKey;
|
|
7
|
+
const get = require('../get');
|
|
8
|
+
const utils = require('../../utils');
|
|
9
|
+
const mergeDiscriminatorSchema = require('../../helpers/discriminator/mergeDiscriminatorSchema');
|
|
10
|
+
|
|
11
|
+
const CUSTOMIZABLE_DISCRIMINATOR_OPTIONS = {
|
|
12
|
+
toJSON: true,
|
|
13
|
+
toObject: true,
|
|
14
|
+
_id: true,
|
|
15
|
+
id: true,
|
|
16
|
+
virtuals: true,
|
|
17
|
+
methods: true,
|
|
18
|
+
statics: true
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Validate fields declared on the child schema when either schema is configured for encryption. Specifically, this function ensures that:
|
|
23
|
+
*
|
|
24
|
+
* - any encrypted fields are declared on exactly one of the schemas (not both)
|
|
25
|
+
* - encrypted fields cannot be declared on either the parent or child schema, where the other schema declares the same field without encryption.
|
|
26
|
+
*
|
|
27
|
+
* @param {Schema} parentSchema
|
|
28
|
+
* @param {Schema} childSchema
|
|
29
|
+
*/
|
|
30
|
+
function validateDiscriminatorSchemasForEncryption(parentSchema, childSchema) {
|
|
31
|
+
if (parentSchema.encryptionType() == null && childSchema.encryptionType() == null) return;
|
|
32
|
+
|
|
33
|
+
const allSharedNestedPaths = setIntersection(
|
|
34
|
+
allNestedPaths(parentSchema),
|
|
35
|
+
allNestedPaths(childSchema)
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
for (const path of allSharedNestedPaths) {
|
|
39
|
+
if (parentSchema._hasEncryptedField(path) && childSchema._hasEncryptedField(path)) {
|
|
40
|
+
throw new Error(`encrypted fields cannot be declared on both the base schema and the child schema in a discriminator. path=${path}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (parentSchema._hasEncryptedField(path) || childSchema._hasEncryptedField(path)) {
|
|
44
|
+
throw new Error(`encrypted fields cannot have the same path as a non-encrypted field for discriminators. path=${path}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function allNestedPaths(schema) {
|
|
49
|
+
return [...Object.keys(schema.paths), ...Object.keys(schema.singleNestedPaths)];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @param {Iterable<string>} i1
|
|
54
|
+
* @param {Iterable<string>} i2
|
|
55
|
+
*/
|
|
56
|
+
function* setIntersection(i1, i2) {
|
|
57
|
+
const s1 = new Set(i1);
|
|
58
|
+
for (const item of i2) {
|
|
59
|
+
if (s1.has(item)) {
|
|
60
|
+
yield item;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/*!
|
|
67
|
+
* ignore
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
module.exports = function discriminator(model, name, schema, tiedValue, applyPlugins, mergeHooks, overwriteExisting) {
|
|
71
|
+
if (!schema?.instanceOfSchema) {
|
|
72
|
+
throw new Error('You must pass a valid discriminator Schema');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
mergeHooks = mergeHooks == null ? true : mergeHooks;
|
|
76
|
+
|
|
77
|
+
if (model.schema.discriminatorMapping &&
|
|
78
|
+
!model.schema.discriminatorMapping.isRoot) {
|
|
79
|
+
throw new Error('Discriminator "' + name +
|
|
80
|
+
'" can only be a discriminator of the root model');
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (applyPlugins) {
|
|
84
|
+
const applyPluginsToDiscriminators = get(model.base,
|
|
85
|
+
'options.applyPluginsToDiscriminators', false) || !mergeHooks;
|
|
86
|
+
// Even if `applyPluginsToDiscriminators` isn't set, we should still apply
|
|
87
|
+
// global plugins to schemas embedded in the discriminator schema (gh-7370)
|
|
88
|
+
model.base._applyPlugins(schema, {
|
|
89
|
+
skipTopLevel: !applyPluginsToDiscriminators
|
|
90
|
+
});
|
|
91
|
+
} else if (!mergeHooks) {
|
|
92
|
+
applyBuiltinPlugins(schema);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const key = model.schema.options.discriminatorKey;
|
|
96
|
+
|
|
97
|
+
const existingPath = model.schema.path(key);
|
|
98
|
+
if (existingPath != null) {
|
|
99
|
+
if (!utils.hasUserDefinedProperty(existingPath.options, 'select')) {
|
|
100
|
+
existingPath.options.select = true;
|
|
101
|
+
}
|
|
102
|
+
existingPath.options.$skipDiscriminatorCheck = true;
|
|
103
|
+
} else {
|
|
104
|
+
const baseSchemaAddition = {};
|
|
105
|
+
baseSchemaAddition[key] = {
|
|
106
|
+
default: void 0,
|
|
107
|
+
select: true,
|
|
108
|
+
$skipDiscriminatorCheck: true
|
|
109
|
+
};
|
|
110
|
+
baseSchemaAddition[key][model.schema.options.typeKey] = String;
|
|
111
|
+
model.schema.add(baseSchemaAddition);
|
|
112
|
+
defineKey({
|
|
113
|
+
prop: key,
|
|
114
|
+
prototype: model.prototype,
|
|
115
|
+
options: model.schema.options
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (schema.path(key) && schema.path(key).options.$skipDiscriminatorCheck !== true) {
|
|
120
|
+
throw new Error('Discriminator "' + name +
|
|
121
|
+
'" cannot have field with name "' + key + '"');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let value = name;
|
|
125
|
+
if ((typeof tiedValue === 'string' && tiedValue.length) || tiedValue != null) {
|
|
126
|
+
value = tiedValue;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
validateDiscriminatorSchemasForEncryption(model.schema, schema);
|
|
130
|
+
|
|
131
|
+
function merge(schema, baseSchema) {
|
|
132
|
+
// Retain original schema before merging base schema
|
|
133
|
+
schema._baseSchema = baseSchema;
|
|
134
|
+
if (baseSchema.paths._id &&
|
|
135
|
+
baseSchema.paths._id.options &&
|
|
136
|
+
!baseSchema.paths._id.options.auto) {
|
|
137
|
+
schema.remove('_id');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Find conflicting paths: if something is a path in the base schema
|
|
141
|
+
// and a nested path in the child schema, overwrite the base schema path.
|
|
142
|
+
// See gh-6076
|
|
143
|
+
const baseSchemaPaths = Object.keys(baseSchema.paths);
|
|
144
|
+
const conflictingPaths = [];
|
|
145
|
+
|
|
146
|
+
for (const path of baseSchemaPaths) {
|
|
147
|
+
if (schema.nested[path]) {
|
|
148
|
+
conflictingPaths.push(path);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (path.indexOf('.') === -1) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const sp = path.split('.').slice(0, -1);
|
|
156
|
+
let cur = '';
|
|
157
|
+
for (const piece of sp) {
|
|
158
|
+
cur += (cur.length ? '.' : '') + piece;
|
|
159
|
+
if (schema.paths[cur] instanceof Mixed ||
|
|
160
|
+
schema.singleNestedPaths[cur] instanceof Mixed) {
|
|
161
|
+
conflictingPaths.push(path);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Shallow clone `obj` so we can add additional properties without modifying original
|
|
167
|
+
// schema. `Schema.prototype.clone()` copies `obj` by reference, no cloning.
|
|
168
|
+
schema.obj = { ...schema.obj };
|
|
169
|
+
mergeDiscriminatorSchema(schema, baseSchema);
|
|
170
|
+
schema._gatherChildSchemas();
|
|
171
|
+
|
|
172
|
+
// Clean up conflicting paths _after_ merging re: gh-6076
|
|
173
|
+
for (const conflictingPath of conflictingPaths) {
|
|
174
|
+
delete schema.paths[conflictingPath];
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Rebuild schema models because schemas may have been merged re: #7884
|
|
178
|
+
schema.childSchemas.forEach(obj => {
|
|
179
|
+
obj.model.prototype.$__setSchema(obj.schema);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
const obj = {};
|
|
183
|
+
obj[key] = {
|
|
184
|
+
default: value,
|
|
185
|
+
select: true,
|
|
186
|
+
set: function(newName) {
|
|
187
|
+
if (newName === value || (Array.isArray(value) && utils.deepEqual(newName, value))) {
|
|
188
|
+
return value;
|
|
189
|
+
}
|
|
190
|
+
throw new Error('Can\'t set discriminator key "' + key + '"');
|
|
191
|
+
},
|
|
192
|
+
$skipDiscriminatorCheck: true
|
|
193
|
+
};
|
|
194
|
+
obj[key][schema.options.typeKey] = existingPath ? existingPath.options[schema.options.typeKey] : String;
|
|
195
|
+
schema.add(obj);
|
|
196
|
+
|
|
197
|
+
schema.discriminatorMapping = { key: key, value: value, isRoot: false };
|
|
198
|
+
|
|
199
|
+
if (baseSchema.options.collection) {
|
|
200
|
+
schema.options.collection = baseSchema.options.collection;
|
|
201
|
+
}
|
|
202
|
+
const toJSON = schema.options.toJSON;
|
|
203
|
+
const toObject = schema.options.toObject;
|
|
204
|
+
const _id = schema.options._id;
|
|
205
|
+
const id = schema.options.id;
|
|
206
|
+
|
|
207
|
+
const keys = Object.keys(schema.options);
|
|
208
|
+
schema.options.discriminatorKey = baseSchema.options.discriminatorKey;
|
|
209
|
+
const userProvidedOptions = schema._userProvidedOptions;
|
|
210
|
+
for (const _key of keys) {
|
|
211
|
+
if (!CUSTOMIZABLE_DISCRIMINATOR_OPTIONS[_key]) {
|
|
212
|
+
// Use `schema.options` in `deepEqual()` because of `discriminatorKey`
|
|
213
|
+
// set above. We don't allow customizing discriminator key, always
|
|
214
|
+
// overwrite. See gh-9238
|
|
215
|
+
if (_key in userProvidedOptions && !utils.deepEqual(schema.options[_key], baseSchema.options[_key])) {
|
|
216
|
+
throw new Error('Can\'t customize discriminator option ' + _key +
|
|
217
|
+
' (can only modify ' +
|
|
218
|
+
Object.keys(CUSTOMIZABLE_DISCRIMINATOR_OPTIONS).join(', ') +
|
|
219
|
+
')');
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
schema.options = clone(baseSchema.options);
|
|
224
|
+
|
|
225
|
+
for (const _key of Object.keys(userProvidedOptions)) {
|
|
226
|
+
schema.options[_key] = userProvidedOptions[_key];
|
|
227
|
+
}
|
|
228
|
+
if (toJSON) schema.options.toJSON = toJSON;
|
|
229
|
+
if (toObject) schema.options.toObject = toObject;
|
|
230
|
+
if (typeof _id !== 'undefined') {
|
|
231
|
+
schema.options._id = _id;
|
|
232
|
+
}
|
|
233
|
+
schema.options.id = id;
|
|
234
|
+
if (mergeHooks) {
|
|
235
|
+
schema.s.hooks = model.schema.s.hooks.merge(schema.s.hooks);
|
|
236
|
+
}
|
|
237
|
+
if (applyPlugins) {
|
|
238
|
+
schema.plugins = Array.prototype.slice.call(baseSchema.plugins);
|
|
239
|
+
}
|
|
240
|
+
schema.callQueue = baseSchema.callQueue.concat(schema.callQueue);
|
|
241
|
+
delete schema._requiredpaths; // reset just in case Schema#requiredPaths() was called on either schema
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// merges base schema into new discriminator schema and sets new type field.
|
|
245
|
+
merge(schema, model.schema);
|
|
246
|
+
|
|
247
|
+
if (!model.discriminators) {
|
|
248
|
+
model.discriminators = {};
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (!model.schema.discriminatorMapping) {
|
|
252
|
+
model.schema.discriminatorMapping = { key: key, value: null, isRoot: true };
|
|
253
|
+
}
|
|
254
|
+
if (!model.schema.discriminators) {
|
|
255
|
+
model.schema.discriminators = {};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
model.schema.discriminators[name] = schema;
|
|
259
|
+
|
|
260
|
+
if (model.discriminators[name] && !schema.options.overwriteModels && !overwriteExisting) {
|
|
261
|
+
throw new Error('Discriminator with name "' + name + '" already exists');
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return schema;
|
|
265
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = function pushNestedArrayPaths(paths, nestedArray, path) {
|
|
4
|
+
if (nestedArray == null) {
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
for (let i = 0; i < nestedArray.length; ++i) {
|
|
9
|
+
if (Array.isArray(nestedArray[i])) {
|
|
10
|
+
pushNestedArrayPaths(paths, nestedArray[i], path + '.' + i);
|
|
11
|
+
} else {
|
|
12
|
+
paths.push(path + '.' + i);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = function omitUndefined(val) {
|
|
4
|
+
if (val == null || typeof val !== 'object') {
|
|
5
|
+
return val;
|
|
6
|
+
}
|
|
7
|
+
if (Array.isArray(val)) {
|
|
8
|
+
for (let i = val.length - 1; i >= 0; --i) {
|
|
9
|
+
if (val[i] === undefined) {
|
|
10
|
+
val.splice(i, 1);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
for (const key of Object.keys(val)) {
|
|
15
|
+
if (val[key] === void 0) {
|
|
16
|
+
delete val[key];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return val;
|
|
20
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = parallelLimit;
|
|
4
|
+
|
|
5
|
+
/*!
|
|
6
|
+
* ignore
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
async function parallelLimit(params, fn, limit) {
|
|
10
|
+
if (limit <= 0) {
|
|
11
|
+
throw new Error('Limit must be positive');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (params.length === 0) {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const results = [];
|
|
19
|
+
const executing = new Set();
|
|
20
|
+
|
|
21
|
+
for (let index = 0; index < params.length; index++) {
|
|
22
|
+
const param = params[index];
|
|
23
|
+
const p = fn(param, index);
|
|
24
|
+
results.push(p);
|
|
25
|
+
|
|
26
|
+
executing.add(p);
|
|
27
|
+
|
|
28
|
+
const clean = () => executing.delete(p);
|
|
29
|
+
p.then(clean).catch(clean);
|
|
30
|
+
|
|
31
|
+
if (executing.size >= limit) {
|
|
32
|
+
await Promise.race(executing);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return Promise.all(results);
|
|
37
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const dotRE = /\./g;
|
|
4
|
+
module.exports = function parentPaths(path) {
|
|
5
|
+
if (path.indexOf('.') === -1) {
|
|
6
|
+
return [path];
|
|
7
|
+
}
|
|
8
|
+
const pieces = path.split(dotRE);
|
|
9
|
+
const len = pieces.length;
|
|
10
|
+
const ret = new Array(len);
|
|
11
|
+
let cur = '';
|
|
12
|
+
for (let i = 0; i < len; ++i) {
|
|
13
|
+
cur += (cur.length !== 0) ? '.' + pieces[i] : pieces[i];
|
|
14
|
+
ret[i] = cur;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return ret;
|
|
18
|
+
};
|