diff --git a/packages/orm/mongoose/src/decorators/postHook.spec.ts b/packages/orm/mongoose/src/decorators/postHook.spec.ts index 94f42b2bb11..77a0e799a99 100644 --- a/packages/orm/mongoose/src/decorators/postHook.spec.ts +++ b/packages/orm/mongoose/src/decorators/postHook.spec.ts @@ -8,7 +8,7 @@ describe("@PostHook()", () => { const fn = vi.fn(); // WHEN - @PostHook("method", fn) + @PostHook("save", fn) class Test {} // THEN @@ -17,7 +17,7 @@ describe("@PostHook()", () => { expect(options).toEqual({ post: [ { - method: "method", + method: "save", fn, options: undefined } diff --git a/packages/orm/mongoose/src/decorators/postHook.ts b/packages/orm/mongoose/src/decorators/postHook.ts index ef6fece2b8d..890841ca421 100644 --- a/packages/orm/mongoose/src/decorators/postHook.ts +++ b/packages/orm/mongoose/src/decorators/postHook.ts @@ -1,6 +1,6 @@ import {decoratorTypeOf, DecoratorTypes, StaticMethodDecorator} from "@tsed/core"; -import {MongooseHookOptions, MongoosePostHookCB} from "../interfaces/MongooseSchemaOptions.js"; +import {MongooseHookOptions, MongooseMethods, MongoosePostHookCB} from "../interfaces/MongooseSchemaOptions.js"; import {schemaOptions} from "../utils/schemaOptions.js"; /** @@ -46,10 +46,10 @@ import {schemaOptions} from "../utils/schemaOptions.js"; * @mongoose * @class */ -export function PostHook(method: string, fn: MongoosePostHookCB): ClassDecorator; -export function PostHook(method: string, fn: MongoosePostHookCB, options: MongooseHookOptions): ClassDecorator; -export function PostHook(method: string, options: MongooseHookOptions): StaticMethodDecorator; -export function PostHook(method: string, ...params: any[]): Function { +export function PostHook(method: MongooseMethods, fn: MongoosePostHookCB): ClassDecorator; +export function PostHook(method: MongooseMethods, fn: MongoosePostHookCB, options: MongooseHookOptions): ClassDecorator; +export function PostHook(method: MongooseMethods, options: MongooseHookOptions): StaticMethodDecorator; +export function PostHook(method: MongooseMethods, ...params: any[]): ClassDecorator | StaticMethodDecorator { return ((...args: any[]) => { let options: MongooseHookOptions = params[1]; let fn: MongoosePostHookCB = params[0]; diff --git a/packages/orm/mongoose/src/decorators/preHook.spec.ts b/packages/orm/mongoose/src/decorators/preHook.spec.ts index 2e1399b2d33..ba96856dd94 100644 --- a/packages/orm/mongoose/src/decorators/preHook.spec.ts +++ b/packages/orm/mongoose/src/decorators/preHook.spec.ts @@ -7,7 +7,7 @@ describe("@PreHook()", () => { const fn = vi.fn(); // WHEN - @PreHook("method", fn, {query: true}) + @PreHook("save", fn as any, {query: true}) class Test {} // THEN @@ -16,7 +16,7 @@ describe("@PreHook()", () => { expect(options).toEqual({ pre: [ { - method: "method", + method: "save", fn, options: { query: true @@ -32,7 +32,7 @@ describe("@PreHook()", () => { }); // WHEN - @PreHook("method", fn, {query: true}) + @PreHook("save", fn, {query: true}) class Test {} // THEN @@ -41,7 +41,7 @@ describe("@PreHook()", () => { expect(options).toEqual({ pre: [ { - method: "method", + method: "save", fn, options: { query: true diff --git a/packages/orm/mongoose/src/decorators/preHook.ts b/packages/orm/mongoose/src/decorators/preHook.ts index 89786a1c8f5..7dcc3bc89cd 100644 --- a/packages/orm/mongoose/src/decorators/preHook.ts +++ b/packages/orm/mongoose/src/decorators/preHook.ts @@ -1,6 +1,6 @@ -import {decoratorTypeOf, DecoratorTypes} from "@tsed/core"; +import {decoratorTypeOf, DecoratorTypes, StaticMethodDecorator} from "@tsed/core"; -import {MongooseHookOptions, MongoosePreHookCB} from "../interfaces/MongooseSchemaOptions.js"; +import type {MongooseHookOptions, MongooseMethods, MongoosePreHookCB} from "../interfaces/MongooseSchemaOptions.js"; import {schemaOptions} from "../utils/schemaOptions.js"; /** @@ -43,28 +43,37 @@ import {schemaOptions} from "../utils/schemaOptions.js"; * * This will execute the pre-save hook each time a `CarModel` document is saved. * - * @param {string} method - * @param fn - * @param options * @returns {Function} * @decorator * @class + * @param method + * @param fn + * @param options */ -export function PreHook(method: string, fn?: MongoosePreHookCB | MongooseHookOptions, options?: MongooseHookOptions): Function { +export function PreHook(method: MongooseMethods, fn: MongoosePreHookCB, options?: MongooseHookOptions): ClassDecorator; +export function PreHook(method: MongooseMethods, options?: MongooseHookOptions): StaticMethodDecorator; +export function PreHook(method: MongooseMethods, ...decoratorArgs: any[]): ClassDecorator | StaticMethodDecorator { return (...args: any[]) => { if (decoratorTypeOf(args) === DecoratorTypes.METHOD_STC) { - options = fn as MongooseHookOptions; - fn = args[0][args[1]].bind(args[0]); + schemaOptions(args[0], { + pre: [ + { + method, + fn: args[0][args[1]].bind(args[0]), + options: decoratorArgs[0] + } + ] + }); + } else { + schemaOptions(args[0], { + pre: [ + { + method, + fn: decoratorArgs[0], + options: decoratorArgs[1] + } + ] + }); } - - schemaOptions(args[0], { - pre: [ - { - method, - fn: fn as MongoosePreHookCB, - options - } - ] - }); }; } diff --git a/packages/orm/mongoose/src/interfaces/MongooseSchemaOptions.ts b/packages/orm/mongoose/src/interfaces/MongooseSchemaOptions.ts index 4da84387e44..cc30f529fcc 100644 --- a/packages/orm/mongoose/src/interfaces/MongooseSchemaOptions.ts +++ b/packages/orm/mongoose/src/interfaces/MongooseSchemaOptions.ts @@ -2,32 +2,42 @@ import {type IndexOptions, Schema, SchemaOptions} from "mongoose"; import {MongooseDocument} from "./MongooseDocument.js"; -export type MongooseNextCB = (err?: Error) => void; - -export interface MongooseHookOptions { - document?: boolean; - query?: boolean; - parallel?: boolean; -} +export type MongooseMethod = + | "aggregate" + | "bulkWrite" + | "createCollection" + | "save" + | "insertMany" + | "estimatedDocumentCount" + | "countDocuments" + | "deleteMany" + | "distinct" + | "find" + | "findOne" + | "findOneAndDelete" + | "findOneAndReplace" + | "findOneAndUpdate" + | "replaceOne" + | "updateMany" + | "init" + | "validate"; + +export type MongooseMethods = MongooseMethod | RegExp | MongooseMethod[]; -export type MongooseHookPromised = (doc: T | MongooseDocument) => Promise | void; - -export type MongoosePreHookCB = ((doc: T | MongooseDocument, next: MongooseNextCB) => void) | MongooseHookPromised; - -export type MongoosePostHookCB = - | ((doc: T | MongooseDocument, error: Error, next: MongooseNextCB) => void) - | ((doc: T | MongooseDocument, error: Error) => Promise | void) - | ((doc: T | MongooseDocument, next: MongooseNextCB) => void) - | MongooseHookPromised; +export type MongooseNextCB = (err?: Error) => void; +export type MongooseHookOptions = Record; +export type MongooseHookPromised = (doc: T | MongooseDocument) => Promise; +export type MongoosePreHookCB = (doc: T | MongooseDocument, ...args: unknown[]) => Promise | void; +export type MongoosePostHookCB = (doc: T | MongooseDocument, ...args: unknown[]) => Promise | void; export interface MongoosePreHook { - method: string | RegExp; + method: MongooseMethods; fn: MongoosePreHookCB; options?: MongooseHookOptions; } export interface MongoosePostHook { - method: string | RegExp; + method: MongooseMethods; fn: MongoosePostHookCB; options?: MongooseHookOptions; } diff --git a/packages/orm/mongoose/src/utils/schemaOptions.ts b/packages/orm/mongoose/src/utils/schemaOptions.ts index ddf3c61b34c..930fd21cd35 100644 --- a/packages/orm/mongoose/src/utils/schemaOptions.ts +++ b/packages/orm/mongoose/src/utils/schemaOptions.ts @@ -4,7 +4,6 @@ import {Schema} from "mongoose"; import {MONGOOSE_SCHEMA_OPTIONS} from "../constants/constants.js"; import { MongooseHookPromised, - MongooseNextCB, MongoosePostHook, MongoosePreHook, MongoosePreHookCB, @@ -40,8 +39,9 @@ export function buildPreHook(fn: MongoosePreHookCB) { ? function () { return (fn as MongooseHookPromised)(this); } - : function (next: MongooseNextCB) { - return fn(this, next); + : // we need to explicitly gives args to avoid a bug with mongoose + function (next: any, arg1: any, arg2: any) { + return (fn as any)(this, next, arg1, arg2); }; }