Skip to content

Instantly share code, notes, and snippets.

@js2me
Created January 27, 2020 20:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save js2me/48b8e5515933f7fd5e6eb18d08d356b1 to your computer and use it in GitHub Desktop.
Save js2me/48b8e5515933f7fd5e6eb18d08d356b1 to your computer and use it in GitHub Desktop.
mongoose little enhacenment of schema types
import { Schema } from "mongoose"
const modifierGetters = {
'array': input => [{...input}],
'required': input => {
const inputClone = input instanceof Array ? [{...input[0]}] : {...input}
if (inputClone instanceof Array) {
inputClone[0].required = true;
} else {
inputClone.required = true;
}
}
}
const createModifierGetters = (input, nextGetters, includedGetters) => {
const nested = {}
const getters = includedGetters || Object.keys(modifierGetters)
getters.forEach(getterName => {
Object.defineProperty(nested, getterName, {
get: () =>
createMongooseType(modifierGetters[getterName](input), createModifierGetters, Object.keys(modifierGetters).filter(name => name !== getterName))
})
})
return nested
}
const typeGetters = {
'string': Schema.Types.String,
'number': Schema.Types.Number,
'boolean': Schema.Types.Boolean,
'objectId': Schema.Types.ObjectId,
'buffer': Schema.Types.Buffer,
'date': Schema.Types.Date,
}
const createTypeGetters = (input, nextGetters) => {
const nested = {}
Object.keys(typeGetters).forEach(getterName => {
Object.defineProperty(nested, getterName, {
get: () => createMongooseType({
type: typeGetters[getterName]
}, nextGetters)
})
})
return nested
}
export const createMongooseType = (input, getters?, includedGetters?) => {
const v = Object.create((getters || createTypeGetters)(input, createModifierGetters, includedGetters))
Object.assign(v, input);
return v;
}
type MongooseSchemaModifiers = {
required: Omit<MongooseSchemaModifiers, "required">,
array: Omit<MongooseSchemaModifiers, "array">
}
type MongooseSchemaType = Record<keyof typeof typeGetters, MongooseSchemaModifiers>
export const type = createMongooseType({}) as MongooseSchemaType
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment