/// declare module '@ioc:Adonis/Addons/LucidObserver' { import type { ModelQueryBuilderContract, LucidModel, LucidRow, EventsList } from '@ioc:Adonis/Lucid/Orm'; import type { SimplePaginatorContract } from '@ioc:Adonis/Lucid/Database'; import type { NormalizeConstructor } from '@ioc:Adonis/Core/Helpers'; import { Constructor } from '@adonisjs/fold'; export type ObserverMethod = `${'before' | 'after'}${Capitalize}`; export type ObserverMethodParameter = LucidRow | Array | ModelQueryBuilderContract | [ countQuery: ModelQueryBuilderContract, query: ModelQueryBuilderContract ] | SimplePaginatorContract; export interface ObserverContract { /** * Indicate if observer methods should be executed * after transaction commit. */ afterCommit?: boolean; /** * Invoked before the insert or the update query. * * @param {LucidRow} model * @return {*} {Promise} * @memberof ObserverContract */ beforeSave?(model: LucidRow): Promise; /** * Invoked after the insert or the update query. * * @param {LucidRow} model * @return {*} {Promise} * @memberof ObserverContract */ afterSave?(model: LucidRow): Promise; /** * Invoked before the find query. * * @param {ModelQueryBuilderContract} query * @return {*} {Promise} * @memberof ObserverContract */ beforeFind?(query: ModelQueryBuilderContract): Promise; /** * Invoked after the find query. * * @param {LucidRow} model * @return {*} {Promise} * @memberof ObserverContract */ afterFind?(model: LucidRow): Promise; /** * Invoked before the fetch query. * * @param {ModelQueryBuilderContract} query * @return {*} {Promise} * @memberof ObserverContract */ beforeFetch?(query: ModelQueryBuilderContract): Promise; /** * Invoked after the fetch query. * * @param {Array} records * @return {*} {Promise} * @memberof ObserverContract */ afterFetch?(records: Array): Promise; /** * Invoked only before the insert query. * * @param {LucidRow} model * @return {*} {Promise} * @memberof ObserverContract */ beforeCreate?(model: LucidRow): Promise; /** * Invoked only after the insert query. * * @param {LucidRow} model * @return {*} {Promise} * @memberof ObserverContract */ afterCreate?(model: LucidRow): Promise; /** * Invoked only before the update query. * * @param {LucidRow} model * @return {*} {Promise} * @memberof ObserverContract */ beforeUpdate?(model: LucidRow): Promise; /** * Invoked only after the update query. * * @param {LucidRow} model * @return {*} {Promise} * @memberof ObserverContract */ afterUpdate?(model: LucidRow): Promise; /** * Invoked before the delete query. * * @param {LucidRow} model * @return {*} {Promise} * @memberof ObserverContract */ beforeDelete?(model: LucidRow): Promise; /** * Invoked after the delete query. * * @param {LucidRow} model * @return {*} {Promise} * @memberof ObserverContract */ afterDelete?(model: LucidRow): Promise; /** * Invoked before the paginate query. * * @param {ModelPaginatorContract} paginator * @return {*} {Promise} * @memberof ObserverContract */ beforePaginate?([countQuery, query]: [ ModelQueryBuilderContract, ModelQueryBuilderContract ]): Promise; /** * Invoked after the paginate query. * * @param {ModelPaginatorContract} paginator * @return {*} {Promise} * @memberof ObserverContract */ afterPaginate?(paginator: SimplePaginatorContract): Promise; } export interface ObservableModel extends LucidModel { /** * Add an observer to the model. * * @param {ObserverContract} observer * @memberof ObservableModel */ $addObserver(observer: Constructor): void; /** * Add multiple observers to a model. * * @param {Array} observers * @memberof ObservableModel */ $addObservers(observers: Array>): void; /** * Get a list of observers instances attached * to the model. * * @return {*} {Array} * @memberof ObservableModel */ $getObservers(): Array; /** * Get a list of all observers instances (including globals). * * @return {*} {Array} * @memberof ObservableModel */ $getAllObservers(): Array; /** * Add observers to the model and register hooks callbacks. * * @param {Array>} [observers] * @memberof ObservableModel */ observe(observers?: Array>): void; /** * Remove observers from the model and execute the callback, * then restore them. * * @param {(() => any | Promise)} callback * @return {*} {Promise} * @memberof ObservableModel */ withoutObservers any | Promise>(callback: T): Promise>; } export interface ObservableRow extends LucidRow { /** * Save without executing 0observers methods. */ saveQuietly(): Promise; } export interface ObservableMixin { >(superclass: T): T & ObservableModel & { new (...args: Array): ObservableRow; }; } const Observable: ObservableMixin; export { Observable }; }