import mongoose, { Schema, Document } from "mongoose"; import mongooseAutoPopulate from "mongoose-autopopulate"; type UpdateWithAggregationPipeline = UpdateAggregationStage[]; type UpdateAggregationStage = | { $addFields: any } | { $set: any } | { $project: any } | { $unset: any } | { $replaceRoot: any } | { $replaceWith: any }; type EnforceDocument = T extends Document ? T : T & Document & TMethods; declare module "mongoose" { interface Model { // removed null -> always return document -> throw error if it doesn't exist findOne( filter?: FilterQuery, projection?: any | null, options?: QueryOptions | null, callback?: (err: CallbackError, doc: EnforceDocument) => void ): QueryWithHelpers, EnforceDocument, TQueryHelpers>; findOneAndUpdate( filter?: FilterQuery, update?: UpdateQuery | UpdateWithAggregationPipeline, options?: QueryOptions | null, callback?: (err: any, doc: EnforceDocument | null, res: any) => void ): QueryWithHelpers, EnforceDocument, TQueryHelpers>; } } var HTTPError: any; try { HTTPError = require("lambert-server").HTTPError; } catch (e) { HTTPError = Error; } mongoose.plugin(mongooseAutoPopulate); mongoose.plugin((schema: Schema, opts: any) => { schema.set("toObject", { virtuals: true, versionKey: false, transform(doc: any, ret: any) { delete ret._id; delete ret.__v; const props = schema.get("removeResponse") || []; props.forEach((prop: string) => { delete ret[prop]; }); }, }); schema.post("findOne", function (doc, next) { try { // @ts-ignore const isExistsQuery = JSON.stringify(this._userProvidedFields) === JSON.stringify({ _id: 1 }); if (!doc && !isExistsQuery) { // @ts-ignore return next(new HTTPError(`${this?.mongooseCollection?.name}.${this?._conditions?.id} not found`, 400)); } // @ts-ignore return next(); } catch (error) { // @ts-ignore next(); } }); }); export * from "./Activity"; export * from "./Application"; export * from "./Ban"; export * from "./Channel"; export * from "./Emoji"; export * from "./Event"; export * from "./Template"; export * from "./Guild"; export * from "./Invite"; export * from "./Interaction"; export * from "./Member"; export * from "./Message"; export * from "./Status"; export * from "./Role"; export * from "./User"; export * from "./VoiceState"; export * from "./ReadState"; export * from "./RateLimit";