@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,66 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const SchemaTypeOptions = require('./schemaTypeOptions');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The options defined on a single nested schematype.
|
|
7
|
+
*
|
|
8
|
+
* #### Example:
|
|
9
|
+
*
|
|
10
|
+
* const schema = Schema({ child: Schema({ name: String }) });
|
|
11
|
+
* schema.path('child').options; // SchemaSubdocumentOptions instance
|
|
12
|
+
*
|
|
13
|
+
* @api public
|
|
14
|
+
* @inherits SchemaTypeOptions
|
|
15
|
+
* @constructor SchemaSubdocumentOptions
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
class SchemaSubdocumentOptions extends SchemaTypeOptions {}
|
|
19
|
+
|
|
20
|
+
const opts = require('./propertyOptions');
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* If set, overwrites the child schema's `_id` option.
|
|
24
|
+
*
|
|
25
|
+
* #### Example:
|
|
26
|
+
*
|
|
27
|
+
* const childSchema = Schema({ name: String });
|
|
28
|
+
* const parentSchema = Schema({
|
|
29
|
+
* child: { type: childSchema, _id: false }
|
|
30
|
+
* });
|
|
31
|
+
* parentSchema.path('child').schema.options._id; // false
|
|
32
|
+
*
|
|
33
|
+
* @api public
|
|
34
|
+
* @property _id
|
|
35
|
+
* @memberOf SchemaSubdocumentOptions
|
|
36
|
+
* @type {Function|string}
|
|
37
|
+
* @instance
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
Object.defineProperty(SchemaSubdocumentOptions.prototype, '_id', opts);
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* If set, overwrites the child schema's `minimize` option. In addition, configures whether the entire
|
|
44
|
+
* subdocument can be minimized out.
|
|
45
|
+
*
|
|
46
|
+
* #### Example:
|
|
47
|
+
*
|
|
48
|
+
* const childSchema = Schema({ name: String });
|
|
49
|
+
* const parentSchema = Schema({
|
|
50
|
+
* child: { type: childSchema, minimize: false }
|
|
51
|
+
* });
|
|
52
|
+
* const ParentModel = mongoose.model('Parent', parentSchema);
|
|
53
|
+
* // Saves `{ child: {} }` to the db. Without `minimize: false`, Mongoose would remove the empty
|
|
54
|
+
* // object and save `{}` to the db.
|
|
55
|
+
* await ParentModel.create({ child: {} });
|
|
56
|
+
*
|
|
57
|
+
* @api public
|
|
58
|
+
* @property minimize
|
|
59
|
+
* @memberOf SchemaSubdocumentOptions
|
|
60
|
+
* @type {Function|string}
|
|
61
|
+
* @instance
|
|
62
|
+
*/
|
|
63
|
+
|
|
64
|
+
Object.defineProperty(SchemaSubdocumentOptions.prototype, 'minimize', opts);
|
|
65
|
+
|
|
66
|
+
module.exports = SchemaSubdocumentOptions;
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const clone = require('../helpers/clone');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The options defined on a schematype.
|
|
7
|
+
*
|
|
8
|
+
* #### Example:
|
|
9
|
+
*
|
|
10
|
+
* const schema = new Schema({ name: String });
|
|
11
|
+
* schema.path('name').options instanceof mongoose.SchemaTypeOptions; // true
|
|
12
|
+
*
|
|
13
|
+
* @api public
|
|
14
|
+
* @constructor SchemaTypeOptions
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
class SchemaTypeOptions {
|
|
18
|
+
constructor(obj) {
|
|
19
|
+
if (obj == null) {
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
Object.assign(this, clone(obj));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const opts = require('./propertyOptions');
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The type to cast this path to.
|
|
30
|
+
*
|
|
31
|
+
* @api public
|
|
32
|
+
* @property type
|
|
33
|
+
* @memberOf SchemaTypeOptions
|
|
34
|
+
* @type {Function|String|Object}
|
|
35
|
+
* @instance
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'type', opts);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Function or object describing how to validate this schematype.
|
|
42
|
+
*
|
|
43
|
+
* @api public
|
|
44
|
+
* @property validate
|
|
45
|
+
* @memberOf SchemaTypeOptions
|
|
46
|
+
* @type {Function|Object}
|
|
47
|
+
* @instance
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'validate', opts);
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Allows overriding casting logic for this individual path. If a string, the
|
|
54
|
+
* given string overwrites Mongoose's default cast error message.
|
|
55
|
+
*
|
|
56
|
+
* #### Example:
|
|
57
|
+
*
|
|
58
|
+
* const schema = new Schema({
|
|
59
|
+
* num: {
|
|
60
|
+
* type: Number,
|
|
61
|
+
* cast: '{VALUE} is not a valid number'
|
|
62
|
+
* }
|
|
63
|
+
* });
|
|
64
|
+
*
|
|
65
|
+
* // Throws 'CastError: "bad" is not a valid number'
|
|
66
|
+
* schema.path('num').cast('bad');
|
|
67
|
+
*
|
|
68
|
+
* const Model = mongoose.model('Test', schema);
|
|
69
|
+
* const doc = new Model({ num: 'fail' });
|
|
70
|
+
* const err = doc.validateSync();
|
|
71
|
+
*
|
|
72
|
+
* err.errors['num']; // 'CastError: "fail" is not a valid number'
|
|
73
|
+
*
|
|
74
|
+
* @api public
|
|
75
|
+
* @property cast
|
|
76
|
+
* @memberOf SchemaTypeOptions
|
|
77
|
+
* @type {String}
|
|
78
|
+
* @instance
|
|
79
|
+
*/
|
|
80
|
+
|
|
81
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'cast', opts);
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* If true, attach a required validator to this path, which ensures this path
|
|
85
|
+
* cannot be set to a nullish value. If a function, Mongoose calls the
|
|
86
|
+
* function and only checks for nullish values if the function returns a truthy value.
|
|
87
|
+
*
|
|
88
|
+
* @api public
|
|
89
|
+
* @property required
|
|
90
|
+
* @memberOf SchemaTypeOptions
|
|
91
|
+
* @type {Function|Boolean}
|
|
92
|
+
* @instance
|
|
93
|
+
*/
|
|
94
|
+
|
|
95
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'required', opts);
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The default value for this path. If a function, Mongoose executes the function
|
|
99
|
+
* and uses the return value as the default.
|
|
100
|
+
*
|
|
101
|
+
* @api public
|
|
102
|
+
* @property default
|
|
103
|
+
* @memberOf SchemaTypeOptions
|
|
104
|
+
* @type {Function|Any}
|
|
105
|
+
* @instance
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'default', opts);
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The model that `populate()` should use if populating this path.
|
|
112
|
+
*
|
|
113
|
+
* @api public
|
|
114
|
+
* @property ref
|
|
115
|
+
* @memberOf SchemaTypeOptions
|
|
116
|
+
* @type {Function|String}
|
|
117
|
+
* @instance
|
|
118
|
+
*/
|
|
119
|
+
|
|
120
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'ref', opts);
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* The path in the document that `populate()` should use to find the model
|
|
124
|
+
* to use.
|
|
125
|
+
*
|
|
126
|
+
* @api public
|
|
127
|
+
* @property ref
|
|
128
|
+
* @memberOf SchemaTypeOptions
|
|
129
|
+
* @type {Function|String}
|
|
130
|
+
* @instance
|
|
131
|
+
*/
|
|
132
|
+
|
|
133
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'refPath', opts);
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Whether to include or exclude this path by default when loading documents
|
|
137
|
+
* using `find()`, `findOne()`, etc.
|
|
138
|
+
*
|
|
139
|
+
* @api public
|
|
140
|
+
* @property select
|
|
141
|
+
* @memberOf SchemaTypeOptions
|
|
142
|
+
* @type {Boolean|Number}
|
|
143
|
+
* @instance
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'select', opts);
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose will
|
|
150
|
+
* build an index on this path when the model is compiled.
|
|
151
|
+
*
|
|
152
|
+
* @api public
|
|
153
|
+
* @property index
|
|
154
|
+
* @memberOf SchemaTypeOptions
|
|
155
|
+
* @type {Boolean|Number|Object}
|
|
156
|
+
* @instance
|
|
157
|
+
*/
|
|
158
|
+
|
|
159
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'index', opts);
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose
|
|
163
|
+
* will build a unique index on this path when the
|
|
164
|
+
* model is compiled. [The `unique` option is **not** a validator](https://mongoosejs.com/docs/validation.html#the-unique-option-is-not-a-validator).
|
|
165
|
+
*
|
|
166
|
+
* @api public
|
|
167
|
+
* @property unique
|
|
168
|
+
* @memberOf SchemaTypeOptions
|
|
169
|
+
* @type {Boolean|Number}
|
|
170
|
+
* @instance
|
|
171
|
+
*/
|
|
172
|
+
|
|
173
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'unique', opts);
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose will
|
|
177
|
+
* disallow changes to this path once the document
|
|
178
|
+
* is saved to the database for the first time. Read more about [immutability in Mongoose here](https://thecodebarbarian.com/whats-new-in-mongoose-5-6-immutable-properties.html).
|
|
179
|
+
*
|
|
180
|
+
* @api public
|
|
181
|
+
* @property immutable
|
|
182
|
+
* @memberOf SchemaTypeOptions
|
|
183
|
+
* @type {Function|Boolean}
|
|
184
|
+
* @instance
|
|
185
|
+
*/
|
|
186
|
+
|
|
187
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'immutable', opts);
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose will
|
|
191
|
+
* build a sparse index on this path.
|
|
192
|
+
*
|
|
193
|
+
* @api public
|
|
194
|
+
* @property sparse
|
|
195
|
+
* @memberOf SchemaTypeOptions
|
|
196
|
+
* @type {Boolean|Number}
|
|
197
|
+
* @instance
|
|
198
|
+
*/
|
|
199
|
+
|
|
200
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'sparse', opts);
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose
|
|
204
|
+
* will build a text index on this path.
|
|
205
|
+
*
|
|
206
|
+
* @api public
|
|
207
|
+
* @property text
|
|
208
|
+
* @memberOf SchemaTypeOptions
|
|
209
|
+
* @type {Boolean|Number|Object}
|
|
210
|
+
* @instance
|
|
211
|
+
*/
|
|
212
|
+
|
|
213
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'text', opts);
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Define a transform function for this individual schema type.
|
|
217
|
+
* Only called when calling `toJSON()` or `toObject()`.
|
|
218
|
+
*
|
|
219
|
+
* #### Example:
|
|
220
|
+
*
|
|
221
|
+
* const schema = Schema({
|
|
222
|
+
* myDate: {
|
|
223
|
+
* type: Date,
|
|
224
|
+
* transform: v => v.getFullYear()
|
|
225
|
+
* }
|
|
226
|
+
* });
|
|
227
|
+
* const Model = mongoose.model('Test', schema);
|
|
228
|
+
*
|
|
229
|
+
* const doc = new Model({ myDate: new Date('2019/06/01') });
|
|
230
|
+
* doc.myDate instanceof Date; // true
|
|
231
|
+
*
|
|
232
|
+
* const res = doc.toObject({ transform: true });
|
|
233
|
+
* res.myDate; // 2019
|
|
234
|
+
*
|
|
235
|
+
* @api public
|
|
236
|
+
* @property transform
|
|
237
|
+
* @memberOf SchemaTypeOptions
|
|
238
|
+
* @type {Function}
|
|
239
|
+
* @instance
|
|
240
|
+
*/
|
|
241
|
+
|
|
242
|
+
Object.defineProperty(SchemaTypeOptions.prototype, 'transform', opts);
|
|
243
|
+
|
|
244
|
+
module.exports = SchemaTypeOptions;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const SchemaTypeOptions = require('./schemaTypeOptions');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The options defined on a Union schematype.
|
|
7
|
+
*
|
|
8
|
+
* @api public
|
|
9
|
+
* @inherits SchemaTypeOptions
|
|
10
|
+
* @constructor SchemaUnionOptions
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
class SchemaUnionOptions extends SchemaTypeOptions {}
|
|
14
|
+
|
|
15
|
+
const opts = require('./propertyOptions');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* If set, specifies the types that this union can take. Mongoose will cast
|
|
19
|
+
* the value to one of the given types.
|
|
20
|
+
*
|
|
21
|
+
* If not set, Mongoose will not cast the value to any specific type.
|
|
22
|
+
*
|
|
23
|
+
* @api public
|
|
24
|
+
* @property of
|
|
25
|
+
* @memberOf SchemaUnionOptions
|
|
26
|
+
* @type {Function|Function[]|string|string[]}
|
|
27
|
+
* @instance
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
Object.defineProperty(SchemaUnionOptions.prototype, 'of', opts);
|
|
31
|
+
|
|
32
|
+
module.exports = SchemaUnionOptions;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const opts = require('./propertyOptions');
|
|
4
|
+
|
|
5
|
+
class VirtualOptions {
|
|
6
|
+
constructor(obj) {
|
|
7
|
+
Object.assign(this, obj);
|
|
8
|
+
|
|
9
|
+
if (obj?.options != null) {
|
|
10
|
+
this.options = Object.assign({}, obj.options);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Marks this virtual as a populate virtual, and specifies the model to
|
|
17
|
+
* use for populate.
|
|
18
|
+
*
|
|
19
|
+
* @api public
|
|
20
|
+
* @property ref
|
|
21
|
+
* @memberOf VirtualOptions
|
|
22
|
+
* @type {String|Model|Function}
|
|
23
|
+
* @instance
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
Object.defineProperty(VirtualOptions.prototype, 'ref', opts);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Marks this virtual as a populate virtual, and specifies the path that
|
|
30
|
+
* contains the name of the model to populate
|
|
31
|
+
*
|
|
32
|
+
* @api public
|
|
33
|
+
* @property refPath
|
|
34
|
+
* @memberOf VirtualOptions
|
|
35
|
+
* @type {String|Function}
|
|
36
|
+
* @instance
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
Object.defineProperty(VirtualOptions.prototype, 'refPath', opts);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The name of the property in the local model to match to `foreignField`
|
|
43
|
+
* in the foreign model.
|
|
44
|
+
*
|
|
45
|
+
* @api public
|
|
46
|
+
* @property localField
|
|
47
|
+
* @memberOf VirtualOptions
|
|
48
|
+
* @type {String|Function}
|
|
49
|
+
* @instance
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
Object.defineProperty(VirtualOptions.prototype, 'localField', opts);
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The name of the property in the foreign model to match to `localField`
|
|
56
|
+
* in the local model.
|
|
57
|
+
*
|
|
58
|
+
* @api public
|
|
59
|
+
* @property foreignField
|
|
60
|
+
* @memberOf VirtualOptions
|
|
61
|
+
* @type {String|Function}
|
|
62
|
+
* @instance
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
Object.defineProperty(VirtualOptions.prototype, 'foreignField', opts);
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Whether to populate this virtual as a single document (true) or an
|
|
69
|
+
* array of documents (false).
|
|
70
|
+
*
|
|
71
|
+
* @api public
|
|
72
|
+
* @property justOne
|
|
73
|
+
* @memberOf VirtualOptions
|
|
74
|
+
* @type {Boolean}
|
|
75
|
+
* @instance
|
|
76
|
+
*/
|
|
77
|
+
|
|
78
|
+
Object.defineProperty(VirtualOptions.prototype, 'justOne', opts);
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* If true, populate just the number of documents where `localField`
|
|
82
|
+
* matches `foreignField`, as opposed to the documents themselves.
|
|
83
|
+
*
|
|
84
|
+
* If `count` is set, it overrides `justOne`.
|
|
85
|
+
*
|
|
86
|
+
* @api public
|
|
87
|
+
* @property count
|
|
88
|
+
* @memberOf VirtualOptions
|
|
89
|
+
* @type {Boolean}
|
|
90
|
+
* @instance
|
|
91
|
+
*/
|
|
92
|
+
|
|
93
|
+
Object.defineProperty(VirtualOptions.prototype, 'count', opts);
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Add an additional filter to populate, in addition to `localField`
|
|
97
|
+
* matches `foreignField`.
|
|
98
|
+
*
|
|
99
|
+
* @api public
|
|
100
|
+
* @property match
|
|
101
|
+
* @memberOf VirtualOptions
|
|
102
|
+
* @type {Object|Function}
|
|
103
|
+
* @instance
|
|
104
|
+
*/
|
|
105
|
+
|
|
106
|
+
Object.defineProperty(VirtualOptions.prototype, 'match', opts);
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Additional options to pass to the query used to `populate()`:
|
|
110
|
+
*
|
|
111
|
+
* - `sort`
|
|
112
|
+
* - `skip`
|
|
113
|
+
* - `limit`
|
|
114
|
+
*
|
|
115
|
+
* @api public
|
|
116
|
+
* @property options
|
|
117
|
+
* @memberOf VirtualOptions
|
|
118
|
+
* @type {Object}
|
|
119
|
+
* @instance
|
|
120
|
+
*/
|
|
121
|
+
|
|
122
|
+
Object.defineProperty(VirtualOptions.prototype, 'options', opts);
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* If true, add a `skip` to the query used to `populate()`.
|
|
126
|
+
*
|
|
127
|
+
* @api public
|
|
128
|
+
* @property skip
|
|
129
|
+
* @memberOf VirtualOptions
|
|
130
|
+
* @type {Number}
|
|
131
|
+
* @instance
|
|
132
|
+
*/
|
|
133
|
+
|
|
134
|
+
Object.defineProperty(VirtualOptions.prototype, 'skip', opts);
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* If true, add a `limit` to the query used to `populate()`.
|
|
138
|
+
*
|
|
139
|
+
* @api public
|
|
140
|
+
* @property limit
|
|
141
|
+
* @memberOf VirtualOptions
|
|
142
|
+
* @type {Number}
|
|
143
|
+
* @instance
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
Object.defineProperty(VirtualOptions.prototype, 'limit', opts);
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The `limit` option for `populate()` has [some unfortunate edge cases](https://mongoosejs.com/docs/populate.html#query-conditions)
|
|
150
|
+
* when working with multiple documents, like `.find().populate()`. The
|
|
151
|
+
* `perDocumentLimit` option makes `populate()` execute a separate query
|
|
152
|
+
* for each document returned from `find()` to ensure each document
|
|
153
|
+
* gets up to `perDocumentLimit` populated docs if possible.
|
|
154
|
+
*
|
|
155
|
+
* @api public
|
|
156
|
+
* @property perDocumentLimit
|
|
157
|
+
* @memberOf VirtualOptions
|
|
158
|
+
* @type {Number}
|
|
159
|
+
* @instance
|
|
160
|
+
*/
|
|
161
|
+
|
|
162
|
+
Object.defineProperty(VirtualOptions.prototype, 'perDocumentLimit', opts);
|
|
163
|
+
|
|
164
|
+
module.exports = VirtualOptions;
|
package/lib/options.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* ignore
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
exports.internalToObjectOptions = {
|
|
8
|
+
transform: false,
|
|
9
|
+
virtuals: false,
|
|
10
|
+
getters: false,
|
|
11
|
+
_skipDepopulateTopLevel: true,
|
|
12
|
+
depopulate: true,
|
|
13
|
+
flattenDecimals: false,
|
|
14
|
+
useProjection: false,
|
|
15
|
+
versionKey: true,
|
|
16
|
+
flattenObjectIds: false
|
|
17
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* ignore
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
module.exports = function saveSubdocs(schema) {
|
|
8
|
+
const unshift = true;
|
|
9
|
+
schema.s.hooks.pre('save', false, async function saveSubdocsPreSave() {
|
|
10
|
+
if (this.$isSubdocument) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const subdocs = this.$getAllSubdocs({ useCache: true });
|
|
15
|
+
|
|
16
|
+
if (!subdocs.length) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const options = this.$__.saveOptions;
|
|
21
|
+
await Promise.all(subdocs.map(subdoc => subdoc._execDocumentPreHooks('save', options)));
|
|
22
|
+
|
|
23
|
+
// Invalidate subdocs cache because subdoc pre hooks can add new subdocuments
|
|
24
|
+
if (this.$__.saveOptions) {
|
|
25
|
+
this.$__.saveOptions.__subdocs = null;
|
|
26
|
+
}
|
|
27
|
+
}, null, unshift);
|
|
28
|
+
|
|
29
|
+
schema.s.hooks.pre('save', async function saveSubdocsPreDeleteOne() {
|
|
30
|
+
const removedSubdocs = this.$__.removedSubdocs;
|
|
31
|
+
if (!removedSubdocs?.length) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const promises = [];
|
|
36
|
+
for (const subdoc of removedSubdocs) {
|
|
37
|
+
promises.push(subdoc._execDocumentPreHooks('deleteOne'));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
await Promise.all(promises);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
schema.s.hooks.post('save', async function saveSubdocsPostDeleteOne() {
|
|
44
|
+
const removedSubdocs = this.$__.removedSubdocs;
|
|
45
|
+
if (!removedSubdocs?.length) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const promises = [];
|
|
50
|
+
for (const subdoc of removedSubdocs) {
|
|
51
|
+
promises.push(subdoc._execDocumentPostHooks('deleteOne'));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
this.$__.removedSubdocs = null;
|
|
55
|
+
await Promise.all(promises);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
schema.s.hooks.post('save', async function saveSubdocsPostSave() {
|
|
59
|
+
if (this.$isSubdocument) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const subdocs = this.$getAllSubdocs({ useCache: true });
|
|
64
|
+
|
|
65
|
+
if (!subdocs.length) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const promises = [];
|
|
70
|
+
for (const subdoc of subdocs) {
|
|
71
|
+
promises.push(subdoc._execDocumentPostHooks('save'));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
await Promise.all(promises);
|
|
75
|
+
}, null, unshift);
|
|
76
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const objectIdSymbol = require('../helpers/symbols').objectIdSymbol;
|
|
4
|
+
const utils = require('../utils');
|
|
5
|
+
|
|
6
|
+
/*!
|
|
7
|
+
* ignore
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
module.exports = function shardingPlugin(schema) {
|
|
11
|
+
schema.post('init', function shardingPluginPostInit() {
|
|
12
|
+
storeShard.call(this);
|
|
13
|
+
return this;
|
|
14
|
+
});
|
|
15
|
+
schema.pre('save', function shardingPluginPreSave() {
|
|
16
|
+
applyWhere.call(this);
|
|
17
|
+
});
|
|
18
|
+
schema.pre('deleteOne', { document: true, query: false }, function shardingPluginPreDeleteOne() {
|
|
19
|
+
applyWhere.call(this);
|
|
20
|
+
});
|
|
21
|
+
schema.pre('updateOne', { document: true, query: false }, function shardingPluginPreUpdateOne() {
|
|
22
|
+
applyWhere.call(this);
|
|
23
|
+
});
|
|
24
|
+
schema.post('save', function shardingPluginPostSave() {
|
|
25
|
+
storeShard.call(this);
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/*!
|
|
30
|
+
* ignore
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
function applyWhere() {
|
|
34
|
+
let paths;
|
|
35
|
+
let len;
|
|
36
|
+
|
|
37
|
+
if (this.$__.shardval) {
|
|
38
|
+
paths = Object.keys(this.$__.shardval);
|
|
39
|
+
len = paths.length;
|
|
40
|
+
|
|
41
|
+
this.$where = this.$where || {};
|
|
42
|
+
for (let i = 0; i < len; ++i) {
|
|
43
|
+
this.$where[paths[i]] = this.$__.shardval[paths[i]];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/*!
|
|
49
|
+
* ignore
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
module.exports.storeShard = storeShard;
|
|
53
|
+
|
|
54
|
+
/*!
|
|
55
|
+
* ignore
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
function storeShard() {
|
|
59
|
+
// backwards compat
|
|
60
|
+
const key = this.$__schema.options.shardKey || this.$__schema.options.shardkey;
|
|
61
|
+
if (!utils.isPOJO(key)) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const orig = this.$__.shardval = {};
|
|
66
|
+
const paths = Object.keys(key);
|
|
67
|
+
const len = paths.length;
|
|
68
|
+
let val;
|
|
69
|
+
|
|
70
|
+
for (let i = 0; i < len; ++i) {
|
|
71
|
+
val = this.$__getValue(paths[i]);
|
|
72
|
+
if (val == null) {
|
|
73
|
+
orig[paths[i]] = val;
|
|
74
|
+
} else if (utils.isMongooseObject(val)) {
|
|
75
|
+
orig[paths[i]] = val.toObject({ depopulate: true, _isNested: true });
|
|
76
|
+
} else if (val instanceof Date || val[objectIdSymbol]) {
|
|
77
|
+
orig[paths[i]] = val;
|
|
78
|
+
} else if (typeof val.valueOf === 'function') {
|
|
79
|
+
orig[paths[i]] = val.valueOf();
|
|
80
|
+
} else {
|
|
81
|
+
orig[paths[i]] = val;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|