Skip to content

Commit

Permalink
Merge pull request #14600 from Automattic/vkarpov15/gh-14589
Browse files Browse the repository at this point in the history
fix(document): ensure `transform` function passed to `toObject()` opt…
  • Loading branch information
vkarpov15 committed May 17, 2024
2 parents 5e08e3e + f8268c5 commit 40805aa
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 4 deletions.
6 changes: 2 additions & 4 deletions lib/document.js
Original file line number Diff line number Diff line change
Expand Up @@ -3831,16 +3831,14 @@ Document.prototype.$toObject = function(options, json) {
// need the original options the user passed in, plus `_isNested` and
// `_parentOptions` for checking whether we need to depopulate.
const cloneOptions = {
...options,
_isNested: true,
json: json,
minimize: _minimize,
flattenMaps: flattenMaps,
flattenObjectIds: flattenObjectIds,
_seen: (options && options._seen) || new Map(),
_calledWithOptions: options._calledWithOptions,
virtuals: options.virtuals,
getters: options.getters,
depopulate: options.depopulate
_calledWithOptions: options._calledWithOptions
};

const depopulate = options.depopulate ||
Expand Down
28 changes: 28 additions & 0 deletions test/document.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,34 @@ describe('document', function() {
docs.toObject({ transform: true });
});

it('propagates toObject transform function to all subdocuments (gh-14589)', async function() {
const schema = new mongoose.Schema({
name: String,
docArr: [{ name: String }],
subdoc: new mongoose.Schema({ name: String })
});
const TestModel = db.model('Test', schema);

const doc = new TestModel({
name: 'test',
docArr: [{ name: 'test' }],
subdoc: { name: 'test' }
});

// pass the transform as an inline option. Deletes `_id` property
// from both the top-level document and the subdocument.
const obj = doc.toObject({ transform: deleteId });

assert.equal(obj._id, undefined);
assert.equal(obj.subdoc._id, undefined);
assert.equal(obj.docArr[0]._id, undefined);

function deleteId(doc, ret) {
delete ret._id;
return ret;
}
});

it('disabling aliases in toObject options (gh-7548)', function() {
const schema = new mongoose.Schema({
name: {
Expand Down

0 comments on commit 40805aa

Please sign in to comment.