Security News
Oracle Drags Its Feet in the JavaScript Trademark Dispute
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
ts-mongoose
Advanced tools
Automatically infer TypeScript interfaces from mongoose schemas.
npm i ts-mongoose mongoose @types/mongoose
yarn add ts-mongoose mongoose @types/mongoose
When using mongoose and Typescript, you must define schemas and interfaces. Both definitions must be maintained separately and must match each other. It can be error-prone during development and cause overhead.
ts-mongoose
is a very lightweight library that allows you to create a mongoose schema and a typescript type from a common definition.
All types as created from 1-liner functions and does not depend on decorators❗️.
For example:
Type.string()
returns {type: String, required: true}
, which is the same definition required in the original mongoose library.
Before:
import { Schema, model, Model, Document } from 'mongoose';
const AddressSchema = new Schema({
city: { type: String, required: true },
country: String,
zip: String,
});
const UserSchema = new Schema({
title: { type: String, required: true },
author: { type: String, required: true },
body: { type: String, required: true },
comments: [
{
body: { type: String, required: true },
date: { type: Date, required: true },
},
],
date: { type: Date, default: Date.now, required: true },
hidden: { type: Boolean, required: true },
meta: {
votes: { type: Schema.Types.Number },
favs: { type: Schema.Types.Number },
},
m: {
type: Schema.Types.Mixed,
required: true,
},
otherId: {
type: Schema.Types.ObjectId,
required: true,
},
address: {
type: AddressSchema,
required: true,
},
});
interface UserProps extends Document {
title: string;
author: string;
body: string;
// Duplicate all props from the above schema :(
}
const User: Model<UserProps> = model('User', UserSchema);
🎉🎉🎉 After:
import { createSchema, Type, typedModel } from 'ts-mongoose';
const AddressSchema = createSchema({
city: Type.string(),
country: Type.optionalString(),
zip: Type.optionalString(),
});
const UserSchema = createSchema({
title: Type.string(),
author: Type.string(),
body: Type.string(),
comments: Type.array().of({
body: Type.string(),
date: Type.date(),
}),
date: Type.date({ default: Date.now as any }),
hidden: Type.boolean(),
meta: Type.object().of({
votes: Type.number(),
favs: Type.number(),
}),
m: Type.mixed(),
otherId: Type.objectId(),
address: Type.schema().of(AddressSchema),
});
const User = typedModel('User', UserSchema);
User.findById('123').then(user => {
if (user) {
user. // autocomplete here
}
});
{
// same as {type: String}
firstName: Type.optionalString(),
// same as {type: String, required: true}
email: Type.string(),
}
{
// same as {type: String, required: true, unique: true, index: true}
email: Type.string({unique: true, index: true})
}
schema
, object
, array
types have a method of
where you must provide a child type{
// same as {type: [String], required: true}
tags: Type.array().of(Type.string())
}
ref
is a special type for creating references{
// same as [{type: Schema.Types.ObjectId, ref: 'Comment'}]
comments: Type.array().of(
Type.ref(Type.objectId()).to('Comment', CommentSchema)
),
}
populateTs(property: string)
use this function to populate a property and adjust the returned type automatically. Under the hood it calls only the native populate
method.// models.ts
import 'ts-mongoose/plugin'
User.find().populateTs('comments');
Refs and populations are supported.
Check code under example/example4.ts
.
If you need to specify custom fields in the model, you can add a fake annotation.
It's only required if you add virtual fields or custom methods to the model.
const UserSchema = createSchema({
title: Type.string(),
author: Type.string(),
...({} as {
generatedField: string;
customFunction: () => number;
}),
});
const User = typedModel('User', UserSchema);
Autocomplete popup:
MIT
FAQs
Automatically infer TypeScript interfaces from mongoose schemas.
The npm package ts-mongoose receives a total of 1,559 weekly downloads. As such, ts-mongoose popularity was classified as popular.
We found that ts-mongoose demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
Security News
The Linux Foundation is warning open source developers that compliance with global sanctions is mandatory, highlighting legal risks and restrictions on contributions.
Security News
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.