@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,207 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Module dependencies.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const EventEmitter = require('events').EventEmitter;
|
|
8
|
+
const Subdocument = require('./subdocument');
|
|
9
|
+
const utils = require('../utils');
|
|
10
|
+
|
|
11
|
+
const documentArrayParent = require('../helpers/symbols').documentArrayParent;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A constructor.
|
|
15
|
+
*
|
|
16
|
+
* @param {Object} obj js object returned from the db
|
|
17
|
+
* @param {MongooseDocumentArray} parentArr the parent array of this document
|
|
18
|
+
* @param {Boolean} skipId
|
|
19
|
+
* @param {Object} fields
|
|
20
|
+
* @param {Number} index
|
|
21
|
+
* @inherits Document
|
|
22
|
+
* @api private
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
function ArraySubdocument(obj, parentArr, skipId, fields, index) {
|
|
26
|
+
if (utils.isMongooseDocumentArray(parentArr)) {
|
|
27
|
+
this.__parentArray = parentArr;
|
|
28
|
+
this[documentArrayParent] = parentArr.$parent();
|
|
29
|
+
} else {
|
|
30
|
+
this.__parentArray = undefined;
|
|
31
|
+
this[documentArrayParent] = undefined;
|
|
32
|
+
}
|
|
33
|
+
this.$setIndex(index);
|
|
34
|
+
this.$__parent = this[documentArrayParent];
|
|
35
|
+
|
|
36
|
+
let options;
|
|
37
|
+
if (typeof skipId === 'object' && skipId != null) {
|
|
38
|
+
options = { isNew: true, ...skipId };
|
|
39
|
+
skipId = undefined;
|
|
40
|
+
} else {
|
|
41
|
+
options = { isNew: true };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
Subdocument.call(this, obj, fields, this[documentArrayParent], options);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/*!
|
|
48
|
+
* Inherit from Subdocument
|
|
49
|
+
*/
|
|
50
|
+
ArraySubdocument.prototype = Object.create(Subdocument.prototype);
|
|
51
|
+
ArraySubdocument.prototype.constructor = ArraySubdocument;
|
|
52
|
+
|
|
53
|
+
Object.defineProperty(ArraySubdocument.prototype, '$isSingleNested', {
|
|
54
|
+
configurable: false,
|
|
55
|
+
writable: false,
|
|
56
|
+
value: false
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
Object.defineProperty(ArraySubdocument.prototype, '$isDocumentArrayElement', {
|
|
60
|
+
configurable: false,
|
|
61
|
+
writable: false,
|
|
62
|
+
value: true
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
for (const i in EventEmitter.prototype) {
|
|
66
|
+
ArraySubdocument[i] = EventEmitter.prototype[i];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/*!
|
|
70
|
+
* ignore
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
ArraySubdocument.prototype.$setIndex = function(index) {
|
|
74
|
+
this.__index = index;
|
|
75
|
+
|
|
76
|
+
if (this.$__?.validationError != null) {
|
|
77
|
+
const keys = Object.keys(this.$__.validationError.errors);
|
|
78
|
+
for (const key of keys) {
|
|
79
|
+
this.invalidate(key, this.$__.validationError.errors[key]);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/*!
|
|
85
|
+
* ignore
|
|
86
|
+
*/
|
|
87
|
+
|
|
88
|
+
ArraySubdocument.prototype.populate = function() {
|
|
89
|
+
throw new Error('Mongoose does not support calling populate() on nested ' +
|
|
90
|
+
'docs. Instead of `doc.arr[0].populate("path")`, use ' +
|
|
91
|
+
'`doc.populate("arr.0.path")`');
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/*!
|
|
95
|
+
* ignore
|
|
96
|
+
*/
|
|
97
|
+
|
|
98
|
+
ArraySubdocument.prototype.$__removeFromParent = function() {
|
|
99
|
+
const _id = this._doc._id;
|
|
100
|
+
if (!_id) {
|
|
101
|
+
throw new Error('For your own good, Mongoose does not know ' +
|
|
102
|
+
'how to remove an ArraySubdocument that has no _id');
|
|
103
|
+
}
|
|
104
|
+
this.__parentArray.pull({ _id: _id });
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Returns the full path to this document. If optional `path` is passed, it is appended to the full path.
|
|
109
|
+
*
|
|
110
|
+
* @param {String} [path]
|
|
111
|
+
* @param {Boolean} [skipIndex] Skip adding the array index. For example `arr.foo` instead of `arr.0.foo`.
|
|
112
|
+
* @return {String}
|
|
113
|
+
* @api private
|
|
114
|
+
* @method $__fullPath
|
|
115
|
+
* @memberOf ArraySubdocument
|
|
116
|
+
* @instance
|
|
117
|
+
*/
|
|
118
|
+
|
|
119
|
+
ArraySubdocument.prototype.$__fullPath = function(path, skipIndex) {
|
|
120
|
+
if (this.__index == null) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
if (!this.$__.fullPath) {
|
|
124
|
+
this.ownerDocument();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (skipIndex) {
|
|
128
|
+
return path ?
|
|
129
|
+
this.$__.fullPath + '.' + path :
|
|
130
|
+
this.$__.fullPath;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return path ?
|
|
134
|
+
this.$__.fullPath + '.' + this.__index + '.' + path :
|
|
135
|
+
this.$__.fullPath + '.' + this.__index;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Given a path relative to this document, return the path relative
|
|
140
|
+
* to the top-level document.
|
|
141
|
+
* @method $__pathRelativeToParent
|
|
142
|
+
* @memberOf ArraySubdocument
|
|
143
|
+
* @instance
|
|
144
|
+
* @api private
|
|
145
|
+
*/
|
|
146
|
+
|
|
147
|
+
ArraySubdocument.prototype.$__pathRelativeToParent = function(path, skipIndex) {
|
|
148
|
+
if (this.__index == null || !this.__parentArray?.$path) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
if (skipIndex) {
|
|
152
|
+
return path == null ? this.__parentArray.$path() : this.__parentArray.$path() + '.' + path;
|
|
153
|
+
}
|
|
154
|
+
if (path == null) {
|
|
155
|
+
return this.__parentArray.$path() + '.' + this.__index;
|
|
156
|
+
}
|
|
157
|
+
return this.__parentArray.$path() + '.' + this.__index + '.' + path;
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Returns this sub-documents parent document.
|
|
162
|
+
* @method $parent
|
|
163
|
+
* @memberOf ArraySubdocument
|
|
164
|
+
* @instance
|
|
165
|
+
* @api public
|
|
166
|
+
*/
|
|
167
|
+
|
|
168
|
+
ArraySubdocument.prototype.$parent = function() {
|
|
169
|
+
return this[documentArrayParent];
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
/*!
|
|
173
|
+
* Sets this sub-documents parent document.
|
|
174
|
+
*
|
|
175
|
+
* @api private
|
|
176
|
+
*/
|
|
177
|
+
|
|
178
|
+
ArraySubdocument.prototype.$__setParent = function $__setParent(parent) {
|
|
179
|
+
this[documentArrayParent] = parent;
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Returns this subdocument's parent array.
|
|
184
|
+
*
|
|
185
|
+
* #### Example:
|
|
186
|
+
*
|
|
187
|
+
* const Test = mongoose.model('Test', new Schema({
|
|
188
|
+
* docArr: [{ name: String }]
|
|
189
|
+
* }));
|
|
190
|
+
* const doc = new Test({ docArr: [{ name: 'test subdoc' }] });
|
|
191
|
+
*
|
|
192
|
+
* doc.docArr[0].parentArray() === doc.docArr; // true
|
|
193
|
+
*
|
|
194
|
+
* @api public
|
|
195
|
+
* @method parentArray
|
|
196
|
+
* @returns DocumentArray
|
|
197
|
+
*/
|
|
198
|
+
|
|
199
|
+
ArraySubdocument.prototype.parentArray = function() {
|
|
200
|
+
return this.__parentArray;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
/*!
|
|
204
|
+
* Module exports.
|
|
205
|
+
*/
|
|
206
|
+
|
|
207
|
+
module.exports = ArraySubdocument;
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Module dependencies.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const Binary = require('mongodb/lib/bson').Binary;
|
|
8
|
+
const UUID = require('mongodb/lib/bson').UUID;
|
|
9
|
+
const utils = require('../utils');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Mongoose Buffer constructor.
|
|
13
|
+
*
|
|
14
|
+
* Values always have to be passed to the constructor to initialize.
|
|
15
|
+
*
|
|
16
|
+
* @param {Buffer} value
|
|
17
|
+
* @param {String} encode
|
|
18
|
+
* @param {Number} offset
|
|
19
|
+
* @api private
|
|
20
|
+
* @inherits Buffer https://nodejs.org/api/buffer.html
|
|
21
|
+
* @see https://bit.ly/f6CnZU
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
function MongooseBuffer(value, encode, offset) {
|
|
25
|
+
let val = value;
|
|
26
|
+
if (value == null) {
|
|
27
|
+
val = 0;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let encoding;
|
|
31
|
+
let path;
|
|
32
|
+
let doc;
|
|
33
|
+
|
|
34
|
+
if (Array.isArray(encode)) {
|
|
35
|
+
// internal casting
|
|
36
|
+
path = encode[0];
|
|
37
|
+
doc = encode[1];
|
|
38
|
+
} else {
|
|
39
|
+
encoding = encode;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
let buf;
|
|
43
|
+
if (typeof val === 'number' || val instanceof Number) {
|
|
44
|
+
buf = Buffer.alloc(val);
|
|
45
|
+
} else { // string, array or object { type: 'Buffer', data: [...] }
|
|
46
|
+
buf = Buffer.from(val, encoding, offset);
|
|
47
|
+
}
|
|
48
|
+
utils.decorate(buf, MongooseBuffer.mixin);
|
|
49
|
+
buf.isMongooseBuffer = true;
|
|
50
|
+
|
|
51
|
+
// make sure these internal props don't show up in Object.keys()
|
|
52
|
+
buf[MongooseBuffer.pathSymbol] = path;
|
|
53
|
+
buf[parentSymbol] = doc;
|
|
54
|
+
|
|
55
|
+
buf._subtype = 0;
|
|
56
|
+
return buf;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const pathSymbol = Symbol.for('mongoose#Buffer#_path');
|
|
60
|
+
const parentSymbol = Symbol.for('mongoose#Buffer#_parent');
|
|
61
|
+
MongooseBuffer.pathSymbol = pathSymbol;
|
|
62
|
+
|
|
63
|
+
/*!
|
|
64
|
+
* Inherit from Buffer.
|
|
65
|
+
*/
|
|
66
|
+
|
|
67
|
+
MongooseBuffer.mixin = {
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Default subtype for the Binary representing this Buffer
|
|
71
|
+
*
|
|
72
|
+
* @api private
|
|
73
|
+
* @property _subtype
|
|
74
|
+
* @memberOf MongooseBuffer.mixin
|
|
75
|
+
* @static
|
|
76
|
+
*/
|
|
77
|
+
|
|
78
|
+
_subtype: undefined,
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Marks this buffer as modified.
|
|
82
|
+
*
|
|
83
|
+
* @api private
|
|
84
|
+
* @method _markModified
|
|
85
|
+
* @memberOf MongooseBuffer.mixin
|
|
86
|
+
* @static
|
|
87
|
+
*/
|
|
88
|
+
|
|
89
|
+
_markModified: function() {
|
|
90
|
+
const parent = this[parentSymbol];
|
|
91
|
+
|
|
92
|
+
if (parent) {
|
|
93
|
+
parent.markModified(this[MongooseBuffer.pathSymbol]);
|
|
94
|
+
}
|
|
95
|
+
return this;
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Writes the buffer.
|
|
100
|
+
*
|
|
101
|
+
* @api public
|
|
102
|
+
* @method write
|
|
103
|
+
* @memberOf MongooseBuffer.mixin
|
|
104
|
+
* @static
|
|
105
|
+
*/
|
|
106
|
+
|
|
107
|
+
write: function() {
|
|
108
|
+
const written = Buffer.prototype.write.apply(this, arguments);
|
|
109
|
+
|
|
110
|
+
if (written > 0) {
|
|
111
|
+
this._markModified();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return written;
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Copies the buffer.
|
|
119
|
+
*
|
|
120
|
+
* #### Note:
|
|
121
|
+
*
|
|
122
|
+
* `Buffer#copy` does not mark `target` as modified so you must copy from a `MongooseBuffer` for it to work as expected. This is a work around since `copy` modifies the target, not this.
|
|
123
|
+
*
|
|
124
|
+
* @return {Number} The number of bytes copied.
|
|
125
|
+
* @param {Buffer} target
|
|
126
|
+
* @method copy
|
|
127
|
+
* @memberOf MongooseBuffer.mixin
|
|
128
|
+
* @static
|
|
129
|
+
*/
|
|
130
|
+
|
|
131
|
+
copy: function(target) {
|
|
132
|
+
const ret = Buffer.prototype.copy.apply(this, arguments);
|
|
133
|
+
|
|
134
|
+
if (target?.isMongooseBuffer) {
|
|
135
|
+
target._markModified();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return ret;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
/*!
|
|
143
|
+
* Compile other Buffer methods marking this buffer as modified.
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
utils.each(
|
|
147
|
+
[
|
|
148
|
+
// node < 0.5
|
|
149
|
+
'writeUInt8', 'writeUInt16', 'writeUInt32', 'writeInt8', 'writeInt16', 'writeInt32',
|
|
150
|
+
'writeFloat', 'writeDouble', 'fill',
|
|
151
|
+
'utf8Write', 'binaryWrite', 'asciiWrite', 'set',
|
|
152
|
+
|
|
153
|
+
// node >= 0.5
|
|
154
|
+
'writeUInt16LE', 'writeUInt16BE', 'writeUInt32LE', 'writeUInt32BE',
|
|
155
|
+
'writeInt16LE', 'writeInt16BE', 'writeInt32LE', 'writeInt32BE', 'writeFloatLE', 'writeFloatBE', 'writeDoubleLE', 'writeDoubleBE']
|
|
156
|
+
, function(method) {
|
|
157
|
+
if (!Buffer.prototype[method]) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
MongooseBuffer.mixin[method] = function() {
|
|
161
|
+
const ret = Buffer.prototype[method].apply(this, arguments);
|
|
162
|
+
this._markModified();
|
|
163
|
+
return ret;
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Converts this buffer to its Binary type representation.
|
|
169
|
+
*
|
|
170
|
+
* #### SubTypes:
|
|
171
|
+
*
|
|
172
|
+
* const mongodb = require('mongodb')
|
|
173
|
+
* mongodb.BSON.BSON_BINARY_SUBTYPE_DEFAULT
|
|
174
|
+
* mongodb.BSON.BSON_BINARY_SUBTYPE_FUNCTION
|
|
175
|
+
* mongodb.BSON.BSON_BINARY_SUBTYPE_BYTE_ARRAY
|
|
176
|
+
* mongodb.BSON.BSON_BINARY_SUBTYPE_UUID
|
|
177
|
+
* mongodb.BSON.BSON_BINARY_SUBTYPE_MD5
|
|
178
|
+
* mongodb.BSON.BSON_BINARY_SUBTYPE_USER_DEFINED
|
|
179
|
+
* doc.buffer.toObject(mongodb.BSON.BSON_BINARY_SUBTYPE_USER_DEFINED);
|
|
180
|
+
*
|
|
181
|
+
* @see bsonspec https://bsonspec.org/#/specification
|
|
182
|
+
* @param {Hex} [subtype]
|
|
183
|
+
* @return {Binary}
|
|
184
|
+
* @api public
|
|
185
|
+
* @method toObject
|
|
186
|
+
* @memberOf MongooseBuffer
|
|
187
|
+
*/
|
|
188
|
+
|
|
189
|
+
MongooseBuffer.mixin.toObject = function(options) {
|
|
190
|
+
const subtype = typeof options === 'number'
|
|
191
|
+
? options
|
|
192
|
+
: (this._subtype || 0);
|
|
193
|
+
return new Binary(Buffer.from(this), subtype);
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
MongooseBuffer.mixin.$toObject = MongooseBuffer.mixin.toObject;
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Converts this buffer for storage in MongoDB, including subtype
|
|
200
|
+
*
|
|
201
|
+
* @return {Binary}
|
|
202
|
+
* @api public
|
|
203
|
+
* @method toBSON
|
|
204
|
+
* @memberOf MongooseBuffer
|
|
205
|
+
*/
|
|
206
|
+
|
|
207
|
+
MongooseBuffer.mixin.toBSON = function() {
|
|
208
|
+
return new Binary(this, this._subtype || 0);
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Converts this buffer to a UUID. Throws an error if subtype is not 4.
|
|
213
|
+
*
|
|
214
|
+
* @return {UUID}
|
|
215
|
+
* @api public
|
|
216
|
+
* @method toUUID
|
|
217
|
+
* @memberOf MongooseBuffer
|
|
218
|
+
*/
|
|
219
|
+
|
|
220
|
+
MongooseBuffer.mixin.toUUID = function() {
|
|
221
|
+
if (this._subtype !== 4) {
|
|
222
|
+
throw new Error('Cannot convert a Buffer with subtype ' + this._subtype + ' to a UUID');
|
|
223
|
+
}
|
|
224
|
+
return new UUID(this);
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Determines if this buffer is equals to `other` buffer
|
|
229
|
+
*
|
|
230
|
+
* @param {Buffer} other
|
|
231
|
+
* @return {Boolean}
|
|
232
|
+
* @method equals
|
|
233
|
+
* @memberOf MongooseBuffer
|
|
234
|
+
*/
|
|
235
|
+
|
|
236
|
+
MongooseBuffer.mixin.equals = function(other) {
|
|
237
|
+
if (!Buffer.isBuffer(other)) {
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (this.length !== other.length) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
for (let i = 0; i < this.length; ++i) {
|
|
246
|
+
if (this[i] !== other[i]) {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return true;
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Sets the subtype option and marks the buffer modified.
|
|
256
|
+
*
|
|
257
|
+
* #### SubTypes:
|
|
258
|
+
*
|
|
259
|
+
* const bson = require('bson')
|
|
260
|
+
* bson.BSON_BINARY_SUBTYPE_DEFAULT
|
|
261
|
+
* bson.BSON_BINARY_SUBTYPE_FUNCTION
|
|
262
|
+
* bson.BSON_BINARY_SUBTYPE_BYTE_ARRAY
|
|
263
|
+
* bson.BSON_BINARY_SUBTYPE_UUID
|
|
264
|
+
* bson.BSON_BINARY_SUBTYPE_MD5
|
|
265
|
+
* bson.BSON_BINARY_SUBTYPE_USER_DEFINED
|
|
266
|
+
*
|
|
267
|
+
* doc.buffer.subtype(bson.BSON_BINARY_SUBTYPE_UUID);
|
|
268
|
+
*
|
|
269
|
+
* @see bsonspec https://bsonspec.org/#/specification
|
|
270
|
+
* @param {Hex} subtype
|
|
271
|
+
* @api public
|
|
272
|
+
* @method subtype
|
|
273
|
+
* @memberOf MongooseBuffer
|
|
274
|
+
*/
|
|
275
|
+
|
|
276
|
+
MongooseBuffer.mixin.subtype = function(subtype) {
|
|
277
|
+
if (typeof subtype !== 'number') {
|
|
278
|
+
throw new TypeError('Invalid subtype. Expected a number');
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (this._subtype !== subtype) {
|
|
282
|
+
this._markModified();
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
this._subtype = subtype;
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
/*!
|
|
289
|
+
* Module exports.
|
|
290
|
+
*/
|
|
291
|
+
|
|
292
|
+
MongooseBuffer.Binary = Binary;
|
|
293
|
+
|
|
294
|
+
module.exports = MongooseBuffer;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*!
|
|
4
|
+
* Module dependencies.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const ArrayMethods = require('../array/methods');
|
|
8
|
+
const DocumentArrayMethods = require('./methods');
|
|
9
|
+
|
|
10
|
+
const arrayAtomicsSymbol = require('../../helpers/symbols').arrayAtomicsSymbol;
|
|
11
|
+
const arrayAtomicsBackupSymbol = require('../../helpers/symbols').arrayAtomicsBackupSymbol;
|
|
12
|
+
const arrayParentSymbol = require('../../helpers/symbols').arrayParentSymbol;
|
|
13
|
+
const arrayPathSymbol = require('../../helpers/symbols').arrayPathSymbol;
|
|
14
|
+
const arraySchemaSymbol = require('../../helpers/symbols').arraySchemaSymbol;
|
|
15
|
+
|
|
16
|
+
const _basePush = Array.prototype.push;
|
|
17
|
+
const numberRE = /^\d+$/;
|
|
18
|
+
/**
|
|
19
|
+
* DocumentArray constructor
|
|
20
|
+
*
|
|
21
|
+
* @param {Array} values
|
|
22
|
+
* @param {String} path the path to this array
|
|
23
|
+
* @param {Document} doc parent document
|
|
24
|
+
* @api private
|
|
25
|
+
* @return {MongooseDocumentArray}
|
|
26
|
+
* @inherits MongooseArray
|
|
27
|
+
* @see https://bit.ly/f6CnZU
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
function MongooseDocumentArray(values, path, doc, schematype) {
|
|
31
|
+
const __array = [];
|
|
32
|
+
|
|
33
|
+
const internals = {
|
|
34
|
+
[arrayAtomicsSymbol]: {},
|
|
35
|
+
[arrayAtomicsBackupSymbol]: void 0,
|
|
36
|
+
[arrayPathSymbol]: path,
|
|
37
|
+
[arraySchemaSymbol]: void 0,
|
|
38
|
+
[arrayParentSymbol]: void 0
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
if (Array.isArray(values)) {
|
|
42
|
+
if (values[arrayPathSymbol] === path &&
|
|
43
|
+
values[arrayParentSymbol] === doc) {
|
|
44
|
+
internals[arrayAtomicsSymbol] = Object.assign({}, values[arrayAtomicsSymbol]);
|
|
45
|
+
}
|
|
46
|
+
values.forEach(v => {
|
|
47
|
+
_basePush.call(__array, v);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
internals[arrayPathSymbol] = path;
|
|
51
|
+
internals.__array = __array;
|
|
52
|
+
|
|
53
|
+
if (doc?.$__) {
|
|
54
|
+
internals[arrayParentSymbol] = doc;
|
|
55
|
+
internals[arraySchemaSymbol] = doc.$__schema.path(path);
|
|
56
|
+
|
|
57
|
+
// `schema.path()` doesn't drill into nested arrays properly yet, see
|
|
58
|
+
// gh-6398, gh-6602. This is a workaround because nested arrays are
|
|
59
|
+
// always plain non-document arrays, so once you get to a document array
|
|
60
|
+
// nesting is done. Matryoshka code.
|
|
61
|
+
while (internals[arraySchemaSymbol] != null &&
|
|
62
|
+
internals[arraySchemaSymbol].$isMongooseArray &&
|
|
63
|
+
!internals[arraySchemaSymbol].$isMongooseDocumentArray) {
|
|
64
|
+
internals[arraySchemaSymbol] = internals[arraySchemaSymbol].embeddedSchemaType;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const proxy = new Proxy(__array, {
|
|
69
|
+
get: function(target, prop) {
|
|
70
|
+
if (prop === 'isMongooseArray' ||
|
|
71
|
+
prop === 'isMongooseArrayProxy' ||
|
|
72
|
+
prop === 'isMongooseDocumentArray' ||
|
|
73
|
+
prop === 'isMongooseDocumentArrayProxy') {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
if (Object.hasOwn(internals, prop)) {
|
|
77
|
+
return internals[prop];
|
|
78
|
+
}
|
|
79
|
+
if (Object.hasOwn(DocumentArrayMethods, prop)) {
|
|
80
|
+
return DocumentArrayMethods[prop];
|
|
81
|
+
}
|
|
82
|
+
if (schematype?.virtuals && Object.hasOwn(schematype.virtuals, prop)) {
|
|
83
|
+
return schematype.virtuals[prop].applyGetters(undefined, target);
|
|
84
|
+
}
|
|
85
|
+
if (Object.hasOwn(ArrayMethods, prop)) {
|
|
86
|
+
return ArrayMethods[prop];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return __array[prop];
|
|
90
|
+
},
|
|
91
|
+
set: function(target, prop, value) {
|
|
92
|
+
if (typeof prop === 'string' && numberRE.test(prop)) {
|
|
93
|
+
DocumentArrayMethods.set.call(proxy, prop, value, false);
|
|
94
|
+
} else if (Object.hasOwn(internals, prop)) {
|
|
95
|
+
internals[prop] = value;
|
|
96
|
+
} else if (schematype?.virtuals && Object.hasOwn(schematype.virtuals, prop)) {
|
|
97
|
+
schematype.virtuals[prop].applySetters(value, target);
|
|
98
|
+
} else {
|
|
99
|
+
__array[prop] = value;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
return proxy;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/*!
|
|
110
|
+
* Module exports.
|
|
111
|
+
*/
|
|
112
|
+
|
|
113
|
+
module.exports = MongooseDocumentArray;
|