From 195b46ccbbe56ac014ad92daafdf0e3dc9bda012 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Fri, 12 Jan 2024 10:07:42 -0500 Subject: [PATCH 01/16] fix(document): allow calling `push()` with different `$position` arguments Fix #14244 Re: #4322 --- lib/types/array/methods/index.js | 18 ++++++++---------- test/document.test.js | 13 +++++++------ 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/types/array/methods/index.js b/lib/types/array/methods/index.js index 13b3f493c98..45c88a9b2ad 100644 --- a/lib/types/array/methods/index.js +++ b/lib/types/array/methods/index.js @@ -2,7 +2,6 @@ const Document = require('../../../document'); const ArraySubdocument = require('../../ArraySubdocument'); -const MongooseError = require('../../../error/mongooseError'); const cleanModifiedSubpaths = require('../../../helpers/document/cleanModifiedSubpaths'); const internalToObjectOptions = require('../../../options').internalToObjectOptions; const mpath = require('mpath'); @@ -684,22 +683,21 @@ const methods = { if ((atomics.$push && atomics.$push.$each && atomics.$push.$each.length || 0) !== 0 && atomics.$push.$position != atomic.$position) { - throw new MongooseError('Cannot call `Array#push()` multiple times ' + - 'with different `$position`'); - } + if (atomic.$position != null) { + [].splice.apply(arr, [atomic.$position, 0].concat(values)); + ret = arr.length; + } else { + ret = [].push.apply(arr, values); + } - if (atomic.$position != null) { + this._registerAtomic('$set', this); + } else if (atomic.$position != null) { [].splice.apply(arr, [atomic.$position, 0].concat(values)); ret = this.length; } else { ret = [].push.apply(arr, values); } } else { - if ((atomics.$push && atomics.$push.$each && atomics.$push.$each.length || 0) !== 0 && - atomics.$push.$position != null) { - throw new MongooseError('Cannot call `Array#push()` multiple times ' + - 'with different `$position`'); - } atomic = values; ret = [].push.apply(arr, values); } diff --git a/test/document.test.js b/test/document.test.js index 627a43cf1d7..cd2246a1e9b 100644 --- a/test/document.test.js +++ b/test/document.test.js @@ -8232,12 +8232,13 @@ describe('document', function() { $each: [0], $position: 0 }); - assert.throws(() => { - doc.nums.push({ $each: [5] }); - }, /Cannot call.*multiple times/); - assert.throws(() => { - doc.nums.push(5); - }, /Cannot call.*multiple times/); + assert.deepStrictEqual(doc.nums.$__getAtomics(), [['$push', { $each: [0], $position: 0 }]]); + + doc.nums.push({ $each: [5] }); + assert.deepStrictEqual(doc.nums.$__getAtomics(), [['$set', [0, 1, 2, 3, 4, 5]]]); + + doc.nums.push({ $each: [0.5], $position: 1 }); + assert.deepStrictEqual(doc.nums.$__getAtomics(), [['$set', [0, 0.5, 1, 2, 3, 4, 5]]]); }); it('setting a path to a single nested document should update the single nested doc parent (gh-8400)', function() { From 6bc42cee9803cc056ecf8a83e697a7f617d60e17 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Fri, 12 Jan 2024 10:30:32 -0500 Subject: [PATCH 02/16] test: add missing issue to test title --- test/document.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/document.test.js b/test/document.test.js index cd2246a1e9b..beefe366d1f 100644 --- a/test/document.test.js +++ b/test/document.test.js @@ -8208,7 +8208,7 @@ describe('document', function() { assert.deepEqual(Object.keys(err.errors), ['age']); }); - it('array push with $position (gh-4322)', async function() { + it('array push with $position (gh-14244) (gh-4322)', async function() { const schema = Schema({ nums: [Number] }); From 73bea51b3f306d1f4553bbb03864b8098aa02ea3 Mon Sep 17 00:00:00 2001 From: Rohan Kothapalli Date: Thu, 18 Jan 2024 17:19:25 +0530 Subject: [PATCH 03/16] null check --- lib/types/ArraySubdocument.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/types/ArraySubdocument.js b/lib/types/ArraySubdocument.js index 55889caa839..af0bdd0d4a1 100644 --- a/lib/types/ArraySubdocument.js +++ b/lib/types/ArraySubdocument.js @@ -137,7 +137,7 @@ ArraySubdocument.prototype.$__fullPath = function(path, skipIndex) { */ ArraySubdocument.prototype.$__pathRelativeToParent = function(path, skipIndex) { - if (this.__index == null) { + if (this.__index == null || (!this.__parentArray || !this.__parentArray.$path)) { return null; } if (skipIndex) { From 900e9fa7e5e0fc1a9e368bd8c1327b4fdf2a9207 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Sun, 21 Jan 2024 07:13:00 -0500 Subject: [PATCH 04/16] fix(collection): correctly handle buffer timeouts with `find()` Fix #14184 --- lib/drivers/node-mongodb-native/collection.js | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/drivers/node-mongodb-native/collection.js b/lib/drivers/node-mongodb-native/collection.js index 8cb3cbf8586..8f874542574 100644 --- a/lib/drivers/node-mongodb-native/collection.js +++ b/lib/drivers/node-mongodb-native/collection.js @@ -138,10 +138,23 @@ function iter(i) { let _args = args; let promise = null; let timeout = null; - if (syncCollectionMethods[i]) { - this.addQueue(() => { - lastArg.call(this, null, this[i].apply(this, _args.slice(0, _args.length - 1))); - }, []); + if (syncCollectionMethods[i] && typeof lastArg === 'function') { + this.addQueue(i, _args); + callback = lastArg; + } else if (syncCollectionMethods[i]) { + promise = new this.Promise((resolve, reject) => { + callback = function collectionOperationCallback(err, res) { + if (timeout != null) { + clearTimeout(timeout); + } + if (err != null) { + return reject(err); + } + resolve(res); + }; + _args = args.concat([callback]); + this.addQueue(i, _args); + }); } else if (typeof lastArg === 'function') { callback = function collectionOperationCallback() { if (timeout != null) { From 6b67f9bf65001b36a99a1fb86b55a10706c3b2ee Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Sun, 21 Jan 2024 13:09:08 -0500 Subject: [PATCH 05/16] test: add test case for #14184 --- test/collection.test.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/collection.test.js b/test/collection.test.js index 8b4fa71ea4c..627050413e3 100644 --- a/test/collection.test.js +++ b/test/collection.test.js @@ -68,6 +68,19 @@ describe('collections:', function() { }); }); + it('returns a promise if buffering and callback with find() (gh-14184)', function(done) { + db = mongoose.createConnection(); + const collection = db.collection('gh14184'); + collection.opts.bufferTimeoutMS = 100; + + collection.find({ foo: 'bar' }, {}, (err, docs) => { + assert.ok(err); + assert.ok(err.message.includes('buffering timed out after 100ms')); + assert.equal(docs, undefined); + done(); + }); + }); + it('methods should that throw (unimplemented)', function() { const collection = new Collection('test', mongoose.connection); let thrown = false; From 09181ef655e1d0360c3b4a60f1ef15c39c56cb15 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Mon, 22 Jan 2024 11:03:26 -0500 Subject: [PATCH 06/16] chore: release 6.12.6 --- CHANGELOG.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e18dc705af4..1a112597b79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +6.12.6 / 2024-01-22 +=================== + * fix(collection): correctly handle buffer timeouts with find() #14277 + * fix(document): allow calling push() with different $position arguments #14254 + 6.12.5 / 2024-01-03 =================== * perf(schema): remove unnecessary lookahead in numeric subpath check diff --git a/package.json b/package.json index f4d2b41c199..9cb365a38b0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mongoose", "description": "Mongoose MongoDB ODM", - "version": "6.12.5", + "version": "6.12.6", "author": "Guillermo Rauch ", "keywords": [ "mongodb", From 34feac04113fa9b7263d167b0d89cc0c51a010aa Mon Sep 17 00:00:00 2001 From: Brown Date: Tue, 13 Feb 2024 16:42:01 +0900 Subject: [PATCH 07/16] introduce resumeTokenChanged into 6.x --- lib/cursor/ChangeStream.js | 2 +- test/model.test.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/cursor/ChangeStream.js b/lib/cursor/ChangeStream.js index 24c2f55665a..6cee9f8b371 100644 --- a/lib/cursor/ChangeStream.js +++ b/lib/cursor/ChangeStream.js @@ -75,7 +75,7 @@ class ChangeStream extends EventEmitter { this.closed = true; }); - ['close', 'change', 'end', 'error'].forEach(ev => { + ['close', 'change', 'end', 'error', 'resumeTokenChanged'].forEach(ev => { this.driverChangeStream.on(ev, data => { // Sometimes Node driver still polls after close, so // avoid any uncaught exceptions due to closed change streams diff --git a/test/model.test.js b/test/model.test.js index 700dfb87502..00573da4440 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -5406,6 +5406,20 @@ describe('Model', function() { assert.equal(changeData.operationType, 'insert'); assert.equal(changeData.fullDocument.name, 'Child'); }); + + it('bubbles up resumeTokenChanged events (gh-14349)', async function() { + const MyModel = db.model('Test', new Schema({ name: String })); + + const resumeTokenChangedEvent = new Promise(resolve => { + changeStream = MyModel.watch(); + listener = data => resolve(data); + changeStream.once('resumeTokenChanged', listener); + }); + + await MyModel.create({ name: 'test' }); + const { _data } = await resumeTokenChangedEvent; + assert.ok(_data); + }); }); describe('sessions (gh-6362)', function() { From 5dfb62f5d2aa6833a20a72ca3a530cae95a7888c Mon Sep 17 00:00:00 2001 From: Daniel Diaz <39510674+IslandRhythms@users.noreply.github.com> Date: Wed, 3 May 2023 12:24:35 -0400 Subject: [PATCH 08/16] test: fix issues with cherry-picking #13376 to 6.x --- lib/helpers/processConnectionOptions.js | 7 ++++--- test/connection.test.js | 9 +++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/helpers/processConnectionOptions.js b/lib/helpers/processConnectionOptions.js index a9d862b1030..1dbb767ebee 100644 --- a/lib/helpers/processConnectionOptions.js +++ b/lib/helpers/processConnectionOptions.js @@ -9,11 +9,12 @@ function processConnectionOptions(uri, options) { ? opts.readPreference : getUriReadPreference(uri); + const clonedOpts = clone(opts); const resolvedOpts = (readPreference && readPreference !== 'primary' && readPreference !== 'primaryPreferred') - ? resolveOptsConflicts(readPreference, opts) - : opts; + ? resolveOptsConflicts(readPreference, clonedOpts) + : clonedOpts; - return clone(resolvedOpts); + return resolvedOpts; } function resolveOptsConflicts(pref, opts) { diff --git a/test/connection.test.js b/test/connection.test.js index dcf4cf621c7..49f715a8f4a 100644 --- a/test/connection.test.js +++ b/test/connection.test.js @@ -1537,4 +1537,13 @@ describe('connections:', function() { }); assert.deepEqual(m.connections.length, 0); }); + + describe('processConnectionOptions', function() { + it('should not throw an error when attempting to mutate unmutable options object gh-13335', async function() { + const m = new mongoose.Mongoose(); + const opts = Object.preventExtensions({}); + const conn = await m.connect('mongodb://localhost:27017/db?retryWrites=true&w=majority&readPreference=secondaryPreferred', opts); + assert.ok(conn); + }); + }); }); From 45f5c4c6091a47bb0a2761ba0be7a7c18d11a084 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Sun, 25 Feb 2024 17:16:13 -0500 Subject: [PATCH 09/16] perf(model): make `insertMany()` `lean` option skip hydrating Mongoose docs Fix #14372 --- lib/model.js | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/model.js b/lib/model.js index c5e54c46f67..d6a3026c7fd 100644 --- a/lib/model.js +++ b/lib/model.js @@ -3430,6 +3430,13 @@ Model.$__insertMany = function(arr, options, callback) { const results = ordered ? null : new Array(arr.length); const toExecute = arr.map((doc, index) => callback => { + // If option `lean` is set to true bypass validation and hydration + if (lean) { + // we have to execute callback at the nextTick to be compatible + // with parallelLimit, as `results` variable has TDZ issue if we + // execute the callback synchronously + return immediate(() => callback(null, doc)); + } if (!(doc instanceof _this)) { try { doc = new _this(doc); @@ -3440,13 +3447,6 @@ Model.$__insertMany = function(arr, options, callback) { if (options.session != null) { doc.$session(options.session); } - // If option `lean` is set to true bypass validation - if (lean) { - // we have to execute callback at the nextTick to be compatible - // with parallelLimit, as `results` variable has TDZ issue if we - // execute the callback synchronously - return immediate(() => callback(null, doc)); - } doc.$validate({ __noPromise: true }, function(error) { if (error) { // Option `ordered` signals that insert should be continued after reaching @@ -3510,7 +3510,7 @@ Model.$__insertMany = function(arr, options, callback) { callback(null, []); return; } - const docObjects = docAttributes.map(function(doc) { + const docObjects = lean ? docAttributes : docAttributes.map(function(doc) { if (doc.$__schema.options.versionKey) { doc[doc.$__schema.options.versionKey] = 0; } @@ -3572,6 +3572,9 @@ Model.$__insertMany = function(arr, options, callback) { return !isErrored; }). map(function setIsNewForInsertedDoc(doc) { + if (lean) { + return doc; + } doc.$__reset(); _setIsNew(doc, false); return doc; @@ -3588,9 +3591,11 @@ Model.$__insertMany = function(arr, options, callback) { return; } - for (const attribute of docAttributes) { - attribute.$__reset(); - _setIsNew(attribute, false); + if (!lean) { + for (const attribute of docAttributes) { + attribute.$__reset(); + _setIsNew(attribute, false); + } } if (rawResult) { From ac9ea0157b42a5c5848705d4827a42bb71a7763c Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Sun, 25 Feb 2024 17:20:17 -0500 Subject: [PATCH 10/16] test: quick connection string fix --- test/connection.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/connection.test.js b/test/connection.test.js index 49f715a8f4a..36290280b47 100644 --- a/test/connection.test.js +++ b/test/connection.test.js @@ -1542,7 +1542,7 @@ describe('connections:', function() { it('should not throw an error when attempting to mutate unmutable options object gh-13335', async function() { const m = new mongoose.Mongoose(); const opts = Object.preventExtensions({}); - const conn = await m.connect('mongodb://localhost:27017/db?retryWrites=true&w=majority&readPreference=secondaryPreferred', opts); + const conn = await m.connect('mongodb://127.0.0.1:27017/db?retryWrites=true&w=majority&readPreference=secondaryPreferred', opts); assert.ok(conn); }); }); From 635c79510160fcf4aab3fd5212bb80f2d649f9d8 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Mon, 26 Feb 2024 10:59:35 -0500 Subject: [PATCH 11/16] perf(document+schema): small optimizations to make `init()` faster Re: #14113 --- lib/document.js | 25 +++++++++++++------------ lib/schema.js | 3 +++ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lib/document.js b/lib/document.js index fe636a4c351..757f5101c32 100644 --- a/lib/document.js +++ b/lib/document.js @@ -741,7 +741,7 @@ function init(self, obj, doc, opts, prefix) { if (i === '__proto__' || i === 'constructor') { return; } - path = prefix + i; + path = prefix ? prefix + i : i; schemaType = docSchema.path(path); // Should still work if not a model-level discriminator, but should not be @@ -751,7 +751,8 @@ function init(self, obj, doc, opts, prefix) { return; } - if (!schemaType && utils.isPOJO(obj[i])) { + const value = obj[i]; + if (!schemaType && utils.isPOJO(value)) { // assume nested object if (!doc[i]) { doc[i] = {}; @@ -759,30 +760,30 @@ function init(self, obj, doc, opts, prefix) { self[i] = doc[i]; } } - init(self, obj[i], doc[i], opts, path + '.'); + init(self, value, doc[i], opts, path + '.'); } else if (!schemaType) { - doc[i] = obj[i]; + doc[i] = value; if (!strict && !prefix) { - self[i] = obj[i]; + self[i] = value; } } else { // Retain order when overwriting defaults - if (doc.hasOwnProperty(i) && obj[i] !== void 0) { + if (doc.hasOwnProperty(i) && value !== void 0) { delete doc[i]; } - if (obj[i] === null) { + if (value === null) { doc[i] = schemaType._castNullish(null); - } else if (obj[i] !== undefined) { - const wasPopulated = obj[i].$__ == null ? null : obj[i].$__.wasPopulated; + } else if (value !== undefined) { + const wasPopulated = value.$__ == null ? null : value.$__.wasPopulated; if (schemaType && !wasPopulated) { try { if (opts && opts.setters) { // Call applySetters with `init = false` because otherwise setters are a noop const overrideInit = false; - doc[i] = schemaType.applySetters(obj[i], self, overrideInit); + doc[i] = schemaType.applySetters(value, self, overrideInit); } else { - doc[i] = schemaType.cast(obj[i], self, true); + doc[i] = schemaType.cast(value, self, true); } } catch (e) { self.invalidate(e.path, new ValidatorError({ @@ -794,7 +795,7 @@ function init(self, obj, doc, opts, prefix) { })); } } else { - doc[i] = obj[i]; + doc[i] = value; } } // mark as hydrated diff --git a/lib/schema.js b/lib/schema.js index 88e427d417d..dc0ebbd5003 100644 --- a/lib/schema.js +++ b/lib/schema.js @@ -955,6 +955,9 @@ reserved.collection = 1; Schema.prototype.path = function(path, obj) { if (obj === undefined) { + if (this.paths[path] != null) { + return this.paths[path]; + } // Convert to '.$' to check subpaths re: gh-6405 const cleanPath = _pathToPositionalSyntax(path); let schematype = _getPath(this, path, cleanPath); From a9f661436d6f62bc6fc5ff282179efd7e4daefea Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Tue, 27 Feb 2024 16:19:24 -0500 Subject: [PATCH 12/16] test: try fixing tests --- test/connection.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/connection.test.js b/test/connection.test.js index 36290280b47..111432160a6 100644 --- a/test/connection.test.js +++ b/test/connection.test.js @@ -1542,7 +1542,7 @@ describe('connections:', function() { it('should not throw an error when attempting to mutate unmutable options object gh-13335', async function() { const m = new mongoose.Mongoose(); const opts = Object.preventExtensions({}); - const conn = await m.connect('mongodb://127.0.0.1:27017/db?retryWrites=true&w=majority&readPreference=secondaryPreferred', opts); + const conn = await m.connect('mongodb://127.0.0.1:27017/db?retryWrites=true&w=majority&readPreference=primaryPreferred', opts); assert.ok(conn); }); }); From 867f7b75cb9b31731ab31d477d7ca67201303d32 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Tue, 27 Feb 2024 16:24:41 -0500 Subject: [PATCH 13/16] test: fix #13335 tests --- test/connection.test.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/connection.test.js b/test/connection.test.js index 111432160a6..3d65b001870 100644 --- a/test/connection.test.js +++ b/test/connection.test.js @@ -1542,7 +1542,12 @@ describe('connections:', function() { it('should not throw an error when attempting to mutate unmutable options object gh-13335', async function() { const m = new mongoose.Mongoose(); const opts = Object.preventExtensions({}); - const conn = await m.connect('mongodb://127.0.0.1:27017/db?retryWrites=true&w=majority&readPreference=primaryPreferred', opts); + + const uri = start.uri.lastIndexOf('?') === -1 ? + start.uri + '?retryWrites=true&w=majority&readPreference=primaryPreferred' : + start.uri.slice(0, start.uri.lastIndexOf('?')) + '?retryWrites=true&w=majority&readPreference=primaryPreferred'; + + const conn = await m.connect(uri, opts); assert.ok(conn); }); }); From 5096630bc236b1406d0f427c02aa1498f5850796 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Tue, 27 Feb 2024 16:27:30 -0500 Subject: [PATCH 14/16] style: fix lint --- test/connection.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/connection.test.js b/test/connection.test.js index 3d65b001870..446f4b0ccff 100644 --- a/test/connection.test.js +++ b/test/connection.test.js @@ -1546,7 +1546,7 @@ describe('connections:', function() { const uri = start.uri.lastIndexOf('?') === -1 ? start.uri + '?retryWrites=true&w=majority&readPreference=primaryPreferred' : start.uri.slice(0, start.uri.lastIndexOf('?')) + '?retryWrites=true&w=majority&readPreference=primaryPreferred'; - + const conn = await m.connect(uri, opts); assert.ok(conn); }); From 222ad3b2f89f3957f9b87c057f974ea41d7c4da1 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Wed, 28 Feb 2024 15:43:02 -0500 Subject: [PATCH 15/16] chore: pin tmp@0.2.1 re: raszi/node-tmp#293 --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 9cb365a38b0..fa048ad6cb2 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "q": "1.5.1", "sinon": "15.0.1", "stream-browserify": "3.0.0", + "tmp": "0.2.1", "tsd": "0.25.0", "typescript": "4.9.5", "uuid": "9.0.0", From 29f57c12caee006f2434a0ef9b21aace9b30fdcf Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Fri, 1 Mar 2024 13:34:32 -0500 Subject: [PATCH 16/16] chore: release 6.12.7 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a112597b79..e1f7bb87b8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +6.12.7 / 2024-03-01 +=================== + * perf(model): make insertMany() lean option skip hydrating Mongoose docs #14376 #14372 + * perf(document+schema): small optimizations to make init() faster #14383 #14113 + * fix(connection): don't modify passed options object to `openUri()` #14370 #13376 #13335 + * fix(ChangeStream): bubble up resumeTokenChanged changeStream event #14355 #14349 [3150](https://github.com/3150) + 6.12.6 / 2024-01-22 =================== * fix(collection): correctly handle buffer timeouts with find() #14277 diff --git a/package.json b/package.json index fa048ad6cb2..9f3a3889566 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mongoose", "description": "Mongoose MongoDB ODM", - "version": "6.12.6", + "version": "6.12.7", "author": "Guillermo Rauch ", "keywords": [ "mongodb",