-
Notifications
You must be signed in to change notification settings - Fork 85
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c9f83bf
commit 86a9fbe
Showing
17 changed files
with
235 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
import toJSON from './toJSON.plugin'; | ||
import toJSON from './toJSON'; | ||
// eslint-disable-next-line import/prefer-default-export | ||
export { toJSON }; | ||
// # sourceMappingURL=index.js.map |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
/* eslint-disable no-param-reassign */ | ||
/** | ||
* A mongoose schema plugin which applies the following in the toJSON transform call: | ||
* - removes __v, createdAt, updatedAt, and any path that has private: true | ||
* - replaces _id with id | ||
*/ | ||
const deleteAtPath = (obj, path, index) => { | ||
if (index === path.length - 1) { | ||
delete obj[path[index]]; | ||
return; | ||
} | ||
deleteAtPath(obj[path[index]], path, index + 1); | ||
}; | ||
const toJSON = (schema) => { | ||
let transform; | ||
if (schema.options.toJSON && schema.options.toJSON.transform) { | ||
transform = schema.options.toJSON.transform; | ||
} | ||
schema.options.toJSON = Object.assign(schema.options.toJSON || {}, { | ||
transform(doc, ret, options) { | ||
Object.keys(schema.paths).forEach((path) => { | ||
if (schema.paths[path].options && schema.paths[path].options.private) { | ||
deleteAtPath(ret, path.split('.'), 0); | ||
} | ||
}); | ||
ret.id = ret._id.toString(); | ||
delete ret._id; | ||
delete ret.__v; | ||
delete ret.createdAt; | ||
delete ret.updatedAt; | ||
if (transform) { | ||
return transform(doc, ret, options); | ||
} | ||
}, | ||
}); | ||
}; | ||
export default toJSON; | ||
// # sourceMappingURL=toJSON.js.map |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
import mongoose from 'mongoose'; | ||
import { toJSON } from '.'; | ||
|
||
describe('toJSON plugin', () => { | ||
let connection; | ||
beforeEach(() => { | ||
connection = mongoose.createConnection(); | ||
}); | ||
it('should replace _id with id', () => { | ||
const schema = new mongoose.Schema(); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model('Model', schema); | ||
const doc = new SampleModel(); | ||
expect(doc.toJSON()).not.toHaveProperty('_id'); | ||
expect(doc.toJSON()).toHaveProperty('id', doc._id.toString()); | ||
}); | ||
it('should remove __v', () => { | ||
const schema = new mongoose.Schema(); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model('Model', schema); | ||
const doc = new SampleModel(); | ||
expect(doc.toJSON()).not.toHaveProperty('__v'); | ||
}); | ||
it('should remove createdAt and updatedAt', () => { | ||
const schema = new mongoose.Schema({}, { timestamps: true }); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model('Model', schema); | ||
const doc = new SampleModel(); | ||
expect(doc.toJSON()).not.toHaveProperty('createdAt'); | ||
expect(doc.toJSON()).not.toHaveProperty('updatedAt'); | ||
}); | ||
it('should remove any path set as private', () => { | ||
const schema = new mongoose.Schema({ | ||
public: { type: String }, | ||
private: { type: String, private: true }, | ||
}); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model('Model', schema); | ||
const doc = new SampleModel({ public: 'some public value', private: 'some private value' }); | ||
expect(doc.toJSON()).not.toHaveProperty('private'); | ||
expect(doc.toJSON()).toHaveProperty('public'); | ||
}); | ||
it('should remove any nested paths set as private', () => { | ||
const schema = new mongoose.Schema({ | ||
public: { type: String }, | ||
nested: { | ||
private: { type: String, private: true }, | ||
}, | ||
}); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model('Model', schema); | ||
const doc = new SampleModel({ | ||
public: 'some public value', | ||
nested: { | ||
private: 'some nested private value', | ||
}, | ||
}); | ||
expect(doc.toJSON()).not.toHaveProperty('nested.private'); | ||
expect(doc.toJSON()).toHaveProperty('public'); | ||
}); | ||
it('should also call the schema toJSON transform function', () => { | ||
const schema = new mongoose.Schema( | ||
{ | ||
public: { type: String }, | ||
private: { type: String }, | ||
}, | ||
{ | ||
toJSON: { | ||
transform: (_doc, ret) => { | ||
// eslint-disable-next-line no-param-reassign | ||
delete ret.private; | ||
}, | ||
}, | ||
} | ||
); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model('Model', schema); | ||
const doc = new SampleModel({ public: 'some public value', private: 'some private value' }); | ||
expect(doc.toJSON()).not.toHaveProperty('private'); | ||
expect(doc.toJSON()).toHaveProperty('public'); | ||
}); | ||
}); | ||
// # sourceMappingURL=toJSON.test.js.map |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
import toJSON from './toJSON.plugin'; | ||
import toJSON from './toJSON'; | ||
|
||
// eslint-disable-next-line import/prefer-default-export | ||
export { toJSON }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
import mongoose, { Model, Document } from 'mongoose'; | ||
import { toJSON } from '.'; | ||
|
||
interface SampleSchema { | ||
public: string; | ||
private: string; | ||
nested: { | ||
private: string; | ||
}; | ||
} | ||
|
||
interface SampleSchemaDoc extends SampleSchema, Document {} | ||
interface SampleSchemaModel extends Model<SampleSchemaDoc> {} | ||
|
||
describe('toJSON plugin', () => { | ||
let connection: mongoose.Connection; | ||
|
||
beforeEach(() => { | ||
connection = mongoose.createConnection(); | ||
}); | ||
|
||
it('should replace _id with id', () => { | ||
const schema = new mongoose.Schema<SampleSchemaDoc, SampleSchemaModel>(); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model<SampleSchemaDoc, SampleSchemaModel>('Model', schema); | ||
const doc = new SampleModel(); | ||
expect(doc.toJSON()).not.toHaveProperty('_id'); | ||
expect(doc.toJSON()).toHaveProperty('id', doc._id.toString()); | ||
}); | ||
|
||
it('should remove __v', () => { | ||
const schema = new mongoose.Schema<SampleSchemaDoc, SampleSchemaModel>(); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model<SampleSchemaDoc, SampleSchemaModel>('Model', schema); | ||
const doc = new SampleModel(); | ||
expect(doc.toJSON()).not.toHaveProperty('__v'); | ||
}); | ||
|
||
it('should remove createdAt and updatedAt', () => { | ||
const schema = new mongoose.Schema<SampleSchemaDoc, SampleSchemaModel>({}, { timestamps: true }); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model<SampleSchemaDoc, SampleSchemaModel>('Model', schema); | ||
const doc = new SampleModel(); | ||
expect(doc.toJSON()).not.toHaveProperty('createdAt'); | ||
expect(doc.toJSON()).not.toHaveProperty('updatedAt'); | ||
}); | ||
|
||
it('should remove any path set as private', () => { | ||
const schema = new mongoose.Schema<SampleSchemaDoc, SampleSchemaModel>({ | ||
public: { type: String }, | ||
private: { type: String, private: true }, | ||
}); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model<SampleSchemaDoc, SampleSchemaModel>('Model', schema); | ||
const doc = new SampleModel({ public: 'some public value', private: 'some private value' }); | ||
expect(doc.toJSON()).not.toHaveProperty('private'); | ||
expect(doc.toJSON()).toHaveProperty('public'); | ||
}); | ||
|
||
it('should remove any nested paths set as private', () => { | ||
const schema = new mongoose.Schema<SampleSchemaDoc, SampleSchemaModel>({ | ||
public: { type: String }, | ||
nested: { | ||
private: { type: String, private: true }, | ||
}, | ||
}); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model<SampleSchemaDoc, SampleSchemaModel>('Model', schema); | ||
const doc = new SampleModel({ | ||
public: 'some public value', | ||
nested: { | ||
private: 'some nested private value', | ||
}, | ||
}); | ||
expect(doc.toJSON()).not.toHaveProperty('nested.private'); | ||
expect(doc.toJSON()).toHaveProperty('public'); | ||
}); | ||
|
||
it('should also call the schema toJSON transform function', () => { | ||
const schema = new mongoose.Schema<SampleSchemaDoc, SampleSchemaModel>( | ||
{ | ||
public: { type: String }, | ||
private: { type: String }, | ||
}, | ||
{ | ||
toJSON: { | ||
transform: (_doc, ret) => { | ||
// eslint-disable-next-line no-param-reassign | ||
delete ret.private; | ||
}, | ||
}, | ||
} | ||
); | ||
schema.plugin(toJSON); | ||
const SampleModel = connection.model<SampleSchemaDoc, SampleSchemaModel>('Model', schema); | ||
const doc = new SampleModel({ public: 'some public value', private: 'some private value' }); | ||
expect(doc.toJSON()).not.toHaveProperty('private'); | ||
expect(doc.toJSON()).toHaveProperty('public'); | ||
}); | ||
}); |
File renamed without changes.
Oops, something went wrong.