{"version":3,"sources":["../src/soft-delete.module.ts","../src/soft-delete.constants.ts","../src/services/soft-delete.service.ts","../src/errors/cascade-relation-not-found.error.ts","../src/prisma/cascade-handler.ts","../src/services/soft-delete-context.ts","../src/events/soft-delete-event-emitter.ts","../src/events/soft-delete.events.ts","../src/prisma/audit-lifecycle.ts","../src/interceptors/soft-delete-filter.interceptor.ts","../src/middleware/soft-delete-actor.middleware.ts","../src/errors/cascade-dmmf-missing.error.ts","../src/prisma/dmmf-resolver.ts","../src/prisma/soft-delete-extension.ts","../src/prisma/relation-filter.ts","../src/errors/relation-dmmf-missing.error.ts","../src/decorators/with-deleted.decorator.ts","../src/decorators/only-deleted.decorator.ts","../src/decorators/skip-soft-delete.decorator.ts","../src/decorators/with-deleted-relations.decorator.ts","../src/errors/soft-delete-field-missing.error.ts"],"sourcesContent":["import { DynamicModule, MiddlewareConsumer, Module, NestModule } from '@nestjs/common';\nimport { APP_INTERCEPTOR } from '@nestjs/core';\nimport { SOFT_DELETE_MODULE_OPTIONS, SOFT_DELETE_PRISMA_SERVICE } from './soft-delete.constants';\nimport { SoftDeleteModuleOptions, SoftDeleteModuleAsyncOptions } from './interfaces/soft-delete-options.interface';\nimport { SoftDeleteService } from './services/soft-delete.service';\nimport { SoftDeleteFilterInterceptor } from './interceptors/soft-delete-filter.interceptor';\nimport { SoftDeleteActorMiddleware } from './middleware/soft-delete-actor.middleware';\nimport { SoftDeleteEventEmitter } from './events/soft-delete-event-emitter';\nimport { CascadeHandler } from './prisma/cascade-handler';\nimport { isCascadeConfigured, requireCascadeDmmf } from './prisma/dmmf-resolver';\nimport { DEFAULT_DELETED_AT_FIELD, DEFAULT_MAX_CASCADE_DEPTH } from './soft-delete.constants';\n\nfunction buildCascadeHandlerProvider() {\n  return {\n    provide: CascadeHandler,\n    useFactory: (options: SoftDeleteModuleOptions) => {\n      if (!isCascadeConfigured(options.cascade)) {\n        return null;\n      }\n\n      const dmmf = requireCascadeDmmf({\n        optionsDmmf: options.dmmf,\n      });\n\n      return new CascadeHandler({\n        cascade: options.cascade!,\n        deletedAtField: options.deletedAtField ?? DEFAULT_DELETED_AT_FIELD,\n        deletedByField: options.deletedByField,\n        maxCascadeDepth: options.maxCascadeDepth ?? DEFAULT_MAX_CASCADE_DEPTH,\n        dmmf,\n      });\n    },\n    inject: [SOFT_DELETE_MODULE_OPTIONS],\n  };\n}\n\nfunction buildEventEmitterProvider() {\n  return {\n    provide: SoftDeleteEventEmitter,\n    useFactory: (options: SoftDeleteModuleOptions, eventEmitter: any | null) => {\n      if (!options.enableEvents) {\n        return null;\n      }\n      return new SoftDeleteEventEmitter(eventEmitter);\n    },\n    inject: [\n      SOFT_DELETE_MODULE_OPTIONS,\n      { token: 'EventEmitter2', optional: true },\n    ],\n  };\n}\n\n@Module({})\nexport class SoftDeleteModule implements NestModule {\n  static forRoot(options: SoftDeleteModuleOptions): DynamicModule {\n    const providers: any[] = [\n      {\n        provide: SOFT_DELETE_MODULE_OPTIONS,\n        useValue: options,\n      },\n      {\n        provide: SOFT_DELETE_PRISMA_SERVICE,\n        useExisting: options.prismaServiceToken,\n      },\n      buildCascadeHandlerProvider(),\n      SoftDeleteService,\n      {\n        provide: APP_INTERCEPTOR,\n        useClass: SoftDeleteFilterInterceptor,\n      },\n    ];\n\n    const exports: any[] = [SoftDeleteService, SOFT_DELETE_MODULE_OPTIONS];\n\n    if (options.enableEvents) {\n      providers.push(SoftDeleteEventEmitter);\n      exports.push(SoftDeleteEventEmitter);\n    }\n\n    return {\n      module: SoftDeleteModule,\n      global: true,\n      providers,\n      exports,\n    };\n  }\n\n  static forRootAsync(options: SoftDeleteModuleAsyncOptions): DynamicModule {\n    const providers: any[] = [\n      {\n        provide: SOFT_DELETE_MODULE_OPTIONS,\n        useFactory: options.useFactory,\n        inject: options.inject ?? [],\n      },\n      {\n        provide: SOFT_DELETE_PRISMA_SERVICE,\n        useExisting: options.prismaServiceToken,\n      },\n      buildCascadeHandlerProvider(),\n      SoftDeleteService,\n      buildEventEmitterProvider(),\n      {\n        provide: APP_INTERCEPTOR,\n        useClass: SoftDeleteFilterInterceptor,\n      },\n    ];\n\n    return {\n      module: SoftDeleteModule,\n      global: true,\n      imports: options.imports ?? [],\n      providers,\n      exports: [SoftDeleteService, SOFT_DELETE_MODULE_OPTIONS, SoftDeleteEventEmitter],\n    };\n  }\n\n  configure(consumer: MiddlewareConsumer) {\n    consumer.apply(SoftDeleteActorMiddleware).forRoutes('*');\n  }\n}\n","export const SOFT_DELETE_MODULE_OPTIONS = Symbol('SOFT_DELETE_MODULE_OPTIONS');\nexport const SOFT_DELETE_PRISMA_SERVICE = Symbol('SOFT_DELETE_PRISMA_SERVICE');\nexport const WITH_DELETED_KEY = 'SOFT_DELETE_WITH_DELETED';\nexport const ONLY_DELETED_KEY = 'SOFT_DELETE_ONLY_DELETED';\nexport const SKIP_SOFT_DELETE_KEY = 'SOFT_DELETE_SKIP';\nexport const WITH_DELETED_RELATIONS_KEY = 'SOFT_DELETE_WITH_DELETED_RELATIONS';\nexport const DEFAULT_DELETED_AT_FIELD = 'deletedAt';\nexport const DEFAULT_MAX_CASCADE_DEPTH = 3;\nexport const SOFT_DELETE_EVENT_EMITTER = Symbol('SOFT_DELETE_EVENT_EMITTER');\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { SOFT_DELETE_MODULE_OPTIONS, SOFT_DELETE_PRISMA_SERVICE } from '../soft-delete.constants';\nimport { SoftDeleteModuleOptions } from '../interfaces/soft-delete-options.interface';\nimport { CascadeHandler } from '../prisma/cascade-handler';\nimport { SoftDeleteContext } from './soft-delete-context';\nimport { SoftDeleteEventEmitter } from '../events/soft-delete-event-emitter';\nimport { RestoredEvent, PurgedEvent } from '../events/soft-delete.events';\nimport {\n  DEFAULT_AUDIT_MAX_BATCH_RECORDS,\n  runAuditLifecycle,\n  validateAuditLifecycleOptions,\n} from '../prisma/audit-lifecycle';\n\n@Injectable()\nexport class SoftDeleteService {\n  private readonly deletedAtField: string;\n  private readonly deletedByField: string | null;\n\n  constructor(\n    @Inject(SOFT_DELETE_MODULE_OPTIONS) private readonly options: SoftDeleteModuleOptions,\n    @Inject(SOFT_DELETE_PRISMA_SERVICE) private readonly prisma: any,\n    @Optional() @Inject(CascadeHandler) private readonly cascadeHandler: CascadeHandler | null,\n    @Optional()\n    @Inject(SoftDeleteEventEmitter)\n    private readonly eventEmitter: SoftDeleteEventEmitter | null,\n  ) {\n    validateAuditLifecycleOptions(options);\n    this.deletedAtField = options.deletedAtField ?? 'deletedAt';\n    this.deletedByField = options.deletedByField ?? null;\n  }\n\n  /**\n   * Helper: get Prisma model delegate by name.\n   * Converts model name (e.g. \"User\") to camelCase key (e.g. \"user\").\n   */\n  private getModelDelegate(model: string): any {\n    const key = model.charAt(0).toLowerCase() + model.slice(1);\n    return this.prisma[key];\n  }\n\n  private buildRestoreData(): Record<string, any> {\n    const data: Record<string, any> = {\n      [this.deletedAtField]: null,\n    };\n    if (this.deletedByField) {\n      data[this.deletedByField] = null;\n    }\n    return data;\n  }\n\n  private buildDeletedWhere(where: Record<string, any> | undefined): Record<string, any> {\n    return {\n      ...(where ?? {}),\n      [this.deletedAtField]: { not: null },\n    };\n  }\n\n  private findPrimaryKey(model: string): string {\n    if (this.cascadeHandler) {\n      return this.cascadeHandler.findPrimaryKey(model);\n    }\n\n    const modelDef = this.options.dmmf?.datamodel.models.find(\n      (candidate: any) => candidate.name === model,\n    );\n    const pkField = modelDef?.fields.find((field: any) => field.isId);\n    return pkField?.name ?? 'id';\n  }\n\n  private async runLifecycle<T>(\n    model: string,\n    operation: string,\n    action: 'restored' | 'purged',\n    callback: (client: any) => Promise<T>,\n  ): Promise<T> {\n    return runAuditLifecycle(this.prisma, this.options, model, operation, action, callback);\n  }\n\n  /**\n   * Restore a soft-deleted record by setting deletedAt (and optionally deletedBy) back to null.\n   * If cascade is configured, cascade-restores child records as well.\n   */\n  async restore<T = any>(model: string, where: Record<string, any>): Promise<T> {\n    const restored = await this.runLifecycle(model, 'restore', 'restored', (client) =>\n      SoftDeleteContext.run(\n        {\n          filterMode: 'withDeleted',\n          skipSoftDelete: false,\n          actorId: SoftDeleteContext.getActorId(),\n        },\n        async () => {\n          const modelKey = model.charAt(0).toLowerCase() + model.slice(1);\n          const delegate = client[modelKey];\n          const deletedWhere = this.buildDeletedWhere(where);\n          const record = await delegate.findFirst({ where: deletedWhere });\n          if (!record) {\n            throw new Error(\n              `Record not found for model \"${model}\" with query ${JSON.stringify(where)}`,\n            );\n          }\n          const deletedAt = record[this.deletedAtField];\n          const result = await delegate.update({\n            where: {\n              ...deletedWhere,\n              [this.deletedAtField]: deletedAt,\n            },\n            data: this.buildRestoreData(),\n          });\n          if (this.cascadeHandler && deletedAt) {\n            const pkField = this.cascadeHandler.findPrimaryKey(model);\n            await this.cascadeHandler.cascadeRestore(\n              client,\n              model,\n              record[pkField],\n              deletedAt,\n              0,\n              this.options.auditLifecycle === 'atomic-required'\n                ? (childModel, callback) =>\n                    this.runLifecycle(childModel, 'cascadeRestore', 'restored', callback)\n                : undefined,\n            );\n          }\n          return result;\n        },\n      ),\n    );\n\n    this.eventEmitter?.emitRestored(\n      new RestoredEvent(model, where, SoftDeleteContext.getActorId()),\n    );\n\n    return restored as T;\n  }\n\n  /**\n   * Restore all soft-deleted records matching the given filter.\n   * If cascade is configured, cascade-restores child records for each affected parent.\n   */\n  async restoreMany(\n    model: string,\n    options: { where?: Record<string, any> } = {},\n  ): Promise<{ count: number }> {\n    const delegate = this.getModelDelegate(model);\n    const where = options.where ?? {};\n    const deletedWhere = this.buildDeletedWhere(where);\n    const data = this.buildRestoreData();\n\n    if (this.options.auditLifecycle === 'atomic-required') {\n      const maxRecords = this.options.auditMaxBatchRecords ?? DEFAULT_AUDIT_MAX_BATCH_RECORDS;\n      const result = await this.runLifecycle(model, 'restoreMany', 'restored', (client) =>\n        SoftDeleteContext.run(\n          {\n            filterMode: 'withDeleted',\n            skipSoftDelete: false,\n            actorId: SoftDeleteContext.getActorId(),\n          },\n          async () => {\n            const key = model.charAt(0).toLowerCase() + model.slice(1);\n            const delegate = client[key];\n            const records = await delegate.findMany({\n              where: deletedWhere,\n              take: maxRecords + 1,\n            });\n            if (records.length > maxRecords) {\n              throw new Error(\n                `[@nestarc/soft-delete] ${model}.restoreMany exceeds auditMaxBatchRecords (${maxRecords})`,\n              );\n            }\n            const pkField = this.findPrimaryKey(model);\n            for (const record of records) {\n              await delegate.update({\n                where: {\n                  ...deletedWhere,\n                  [pkField]: record[pkField],\n                  [this.deletedAtField]: record[this.deletedAtField],\n                },\n                data,\n              });\n              const deletedAt = record[this.deletedAtField];\n              if (this.cascadeHandler && deletedAt) {\n                await this.cascadeHandler.cascadeRestore(\n                  client,\n                  model,\n                  record[pkField],\n                  deletedAt,\n                  0,\n                  (childModel, callback) =>\n                    this.runLifecycle(childModel, 'cascadeRestore', 'restored', callback),\n                );\n              }\n            }\n            return { count: records.length };\n          },\n        ),\n      );\n      if (result.count > 0) {\n        this.eventEmitter?.emitRestored(\n          new RestoredEvent(model, where, SoftDeleteContext.getActorId(), result.count),\n        );\n      }\n      return result;\n    }\n\n    let recordsToCascade: Array<Record<string, any>> = [];\n    let pkField = 'id';\n\n    if (this.cascadeHandler) {\n      pkField = this.cascadeHandler.findPrimaryKey(model);\n      recordsToCascade = await this.withDeleted(() =>\n        delegate.findMany({\n          where: deletedWhere,\n          select: {\n            [pkField]: true,\n            [this.deletedAtField]: true,\n          },\n        }),\n      );\n    }\n\n    const result = await delegate.updateMany({\n      where: deletedWhere,\n      data,\n    });\n\n    if (this.cascadeHandler) {\n      for (const record of recordsToCascade) {\n        const deletedAt = record[this.deletedAtField];\n        if (!deletedAt) {\n          continue;\n        }\n\n        await SoftDeleteContext.run(\n          {\n            filterMode: 'withDeleted',\n            skipSoftDelete: false,\n            actorId: SoftDeleteContext.getActorId(),\n          },\n          () =>\n            this.cascadeHandler!.cascadeRestore(this.prisma, model, record[pkField], deletedAt, 0),\n        );\n      }\n    }\n\n    if (result.count > 0) {\n      this.eventEmitter?.emitRestored(\n        new RestoredEvent(model, where, SoftDeleteContext.getActorId(), result.count),\n      );\n    }\n\n    return result;\n  }\n\n  /**\n   * Permanently delete a record, bypassing soft-delete logic.\n   */\n  async forceDelete<T = any>(model: string, where: Record<string, any>): Promise<T> {\n    return this.runLifecycle(model, 'forceDelete', 'purged', (client) =>\n      SoftDeleteContext.run({ filterMode: 'default', skipSoftDelete: true }, async () => {\n        const key = model.charAt(0).toLowerCase() + model.slice(1);\n        return client[key].delete({ where }) as T;\n      }),\n    );\n  }\n\n  /**\n   * Permanently delete soft-deleted records older than the specified date.\n   * Runs within skipSoftDelete context so the extension does not intercept the deleteMany.\n   */\n  async purge(\n    model: string,\n    options: { olderThan: Date; where?: Record<string, any> },\n  ): Promise<{ count: number }> {\n    const { olderThan, where: extraWhere } = options;\n\n    const result = await this.runLifecycle(model, 'purge', 'purged', (client) =>\n      SoftDeleteContext.run({ filterMode: 'default', skipSoftDelete: true }, async () => {\n        const key = model.charAt(0).toLowerCase() + model.slice(1);\n        return client[key].deleteMany({\n          where: {\n            ...extraWhere,\n            [this.deletedAtField]: { not: null, lt: olderThan },\n          },\n        });\n      }),\n    );\n\n    if (result.count > 0) {\n      this.eventEmitter?.emitPurged(new PurgedEvent(model, result.count, olderThan));\n    }\n\n    return result;\n  }\n\n  /**\n   * Execute a callback where all queries include soft-deleted records.\n   */\n  async withDeleted<T>(callback: () => T | Promise<T>): Promise<T> {\n    return SoftDeleteContext.run({ filterMode: 'withDeleted', skipSoftDelete: false }, callback);\n  }\n\n  /**\n   * Execute a callback where only soft-deleted records are returned.\n   */\n  async onlyDeleted<T>(callback: () => T | Promise<T>): Promise<T> {\n    return SoftDeleteContext.run({ filterMode: 'onlyDeleted', skipSoftDelete: false }, callback);\n  }\n}\n","export class CascadeRelationNotFoundError extends Error {\n  constructor(parent: string, child: string) {\n    super(\n      `Cannot find a relation from \"${child}\" to \"${parent}\" in Prisma DMMF. ` +\n      `Ensure \"${child}\" has a @relation field pointing to \"${parent}\".`,\n    );\n    this.name = 'CascadeRelationNotFoundError';\n  }\n}\n","import type { PrismaDmmfLike } from '../interfaces/soft-delete-options.interface';\nimport { CascadeRelationNotFoundError } from '../errors/cascade-relation-not-found.error';\n\nexport interface CascadeHandlerOptions {\n  cascade: Record<string, string[]>;\n  deletedAtField: string;\n  deletedByField?: string | null;\n  maxCascadeDepth: number;\n  dmmf: PrismaDmmfLike;\n}\n\nexport type CascadeLifecycleRunner = <T>(\n  model: string,\n  callback: (client: any) => Promise<T>,\n) => Promise<T>;\n\n/**\n * Handles cascading soft-delete and restore operations by walking\n * the cascade graph defined in the module options and using Prisma\n * DMMF metadata to resolve foreign-key relationships.\n */\nexport class CascadeHandler {\n  private readonly cascade: Record<string, string[]>;\n  private readonly deletedAtField: string;\n  private readonly maxCascadeDepth: number;\n  private readonly dmmf: PrismaDmmfLike;\n  private readonly fkCache = new Map<string, string>();\n\n  constructor(options: CascadeHandlerOptions) {\n    this.cascade = options.cascade;\n    this.deletedAtField = options.deletedAtField;\n    this.maxCascadeDepth = options.maxCascadeDepth;\n    this.dmmf = options.dmmf;\n  }\n\n  /**\n   * Finds the primary key field name for a given model by inspecting the\n   * Prisma DMMF datamodel. Falls back to 'id' if the model or PK is not found.\n   */\n  findPrimaryKey(model: string): string {\n    const modelDef = this.dmmf.datamodel.models.find((m: any) => m.name === model);\n    const pkField = modelDef?.fields.find((f: any) => f.isId);\n    return pkField?.name ?? 'id';\n  }\n\n  /**\n   * Finds the foreign key field on the child model that references the parent model\n   * by inspecting the Prisma DMMF datamodel. Results are cached for performance.\n   *\n   * @throws CascadeRelationNotFoundError if no relation from child to parent exists\n   */\n  findForeignKey(parent: string, child: string): string {\n    const cacheKey = `${parent}:${child}`;\n    const cached = this.fkCache.get(cacheKey);\n    if (cached) {\n      return cached;\n    }\n\n    const childModel = this.dmmf.datamodel.models.find((m: any) => m.name === child);\n\n    if (!childModel) {\n      throw new CascadeRelationNotFoundError(parent, child);\n    }\n\n    for (const field of childModel.fields) {\n      if (\n        field.kind === 'object' &&\n        field.type === parent &&\n        field.relationFromFields &&\n        field.relationFromFields.length > 0\n      ) {\n        const fk = field.relationFromFields[0];\n        this.fkCache.set(cacheKey, fk);\n        return fk;\n      }\n    }\n\n    throw new CascadeRelationNotFoundError(parent, child);\n  }\n\n  /**\n   * Cascades a soft-delete from a parent record to all configured child models.\n   * Recursively walks the cascade graph up to maxCascadeDepth.\n   */\n  async cascadeSoftDelete(\n    prisma: any,\n    parentModel: string,\n    parentId: unknown,\n    deletedAt: Date,\n    depth: number,\n    lifecycle?: CascadeLifecycleRunner,\n  ): Promise<void> {\n    if (depth >= this.maxCascadeDepth) {\n      return;\n    }\n\n    const children = this.cascade[parentModel];\n    if (!children || children.length === 0) {\n      return;\n    }\n\n    for (const childModel of children) {\n      const fk = this.findForeignKey(parentModel, childModel);\n      const childKey = childModel.charAt(0).toLowerCase() + childModel.slice(1);\n      const pkField = this.findPrimaryKey(childModel);\n\n      if (!lifecycle) {\n        await prisma[childKey].updateMany({\n          where: {\n            [fk]: parentId,\n            [this.deletedAtField]: null,\n          },\n          data: {\n            [this.deletedAtField]: deletedAt,\n          },\n        });\n        const affectedChildren = await prisma[childKey].findMany({\n          where: { [fk]: parentId, [this.deletedAtField]: deletedAt },\n          select: { [pkField]: true },\n        });\n        for (const child of affectedChildren) {\n          await this.cascadeSoftDelete(prisma, childModel, child[pkField], deletedAt, depth + 1);\n        }\n        continue;\n      }\n\n      const affectedChildren = await prisma[childKey].findMany({\n        where: { [fk]: parentId, [this.deletedAtField]: null },\n        select: { [pkField]: true },\n      });\n\n      for (const child of affectedChildren) {\n        const data: Record<string, unknown> = {\n          [this.deletedAtField]: deletedAt,\n        };\n        const update = (mutationClient: any) =>\n          mutationClient[childKey].update({\n            where: {\n              [pkField]: child[pkField],\n              [fk]: parentId,\n              [this.deletedAtField]: null,\n            },\n            data,\n          });\n        await lifecycle(childModel, update);\n        await this.cascadeSoftDelete(\n          prisma,\n          childModel,\n          child[pkField],\n          deletedAt,\n          depth + 1,\n          lifecycle,\n        );\n      }\n    }\n  }\n\n  /**\n   * Cascades a restore from a parent record to all configured child models.\n   * Uses +/-1 second timestamp matching to find children that were soft-deleted\n   * at approximately the same time as the parent.\n   */\n  async cascadeRestore(\n    prisma: any,\n    parentModel: string,\n    parentId: unknown,\n    deletedAt: Date,\n    depth: number,\n    lifecycle?: CascadeLifecycleRunner,\n  ): Promise<void> {\n    if (depth >= this.maxCascadeDepth) {\n      return;\n    }\n\n    const children = this.cascade[parentModel];\n    if (!children || children.length === 0) {\n      return;\n    }\n\n    const lowerBound = new Date(deletedAt.getTime() - 1000);\n    const upperBound = new Date(deletedAt.getTime() + 1000);\n\n    for (const childModel of children) {\n      const fk = this.findForeignKey(parentModel, childModel);\n      const childKey = childModel.charAt(0).toLowerCase() + childModel.slice(1);\n      const pkField = this.findPrimaryKey(childModel);\n\n      // Find affected children BEFORE restoring (to capture their deletedAt for recursion)\n      const affectedChildren = await prisma[childKey].findMany({\n        where: {\n          [fk]: parentId,\n          [this.deletedAtField]: {\n            gte: lowerBound,\n            lte: upperBound,\n          },\n        },\n        select: { [pkField]: true, [this.deletedAtField]: true },\n      });\n\n      if (!lifecycle) {\n        await prisma[childKey].updateMany({\n          where: {\n            [fk]: parentId,\n            [this.deletedAtField]: {\n              gte: lowerBound,\n              lte: upperBound,\n            },\n          },\n          data: {\n            [this.deletedAtField]: null,\n          },\n        });\n        for (const child of affectedChildren) {\n          await this.cascadeRestore(\n            prisma,\n            childModel,\n            child[pkField],\n            child[this.deletedAtField],\n            depth + 1,\n          );\n        }\n        continue;\n      }\n\n      // Recurse for each affected child with its original deletedAt\n      for (const child of affectedChildren) {\n        const data: Record<string, unknown> = {\n          [this.deletedAtField]: null,\n        };\n        const update = (mutationClient: any) =>\n          mutationClient[childKey].update({\n            where: {\n              [pkField]: child[pkField],\n              [fk]: parentId,\n              [this.deletedAtField]: child[this.deletedAtField],\n            },\n            data,\n          });\n        await lifecycle(childModel, update);\n        await this.cascadeRestore(\n          prisma,\n          childModel,\n          child[pkField],\n          child[this.deletedAtField],\n          depth + 1,\n          lifecycle,\n        );\n      }\n    }\n  }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { SoftDeleteFilterMode, SoftDeleteStore } from '../interfaces/soft-delete-context.interface';\n\nexport class SoftDeleteContext {\n  private static storage = new AsyncLocalStorage<SoftDeleteStore>();\n\n  /**\n   * Runs a callback within the given soft-delete context store.\n   *\n   * Supports both synchronous and asynchronous callbacks. When the callback\n   * returns a Promise (e.g. a Prisma query), the context is preserved\n   * throughout the entire async chain — including inside Prisma extension\n   * handlers whose internal Promise implementation may not propagate\n   * AsyncLocalStorage context on its own.\n   */\n  static run<T>(store: SoftDeleteStore, callback: () => T): T {\n    return this.storage.run(store, () => {\n      const result = callback();\n      // If the callback returns a thenable (Promise), wrap it so the\n      // continuation executes inside the same AsyncLocalStorage context.\n      // Prisma's internal query-engine Promises may not propagate the\n      // Node.js async context, so we re-enter via an async IIFE that\n      // keeps the store active for every `await` in the chain.\n      if (result != null && typeof (result as any).then === 'function') {\n        return new Promise<any>((resolve, reject) => {\n          (result as any).then(\n            (val: any) => resolve(val),\n            (err: any) => reject(err),\n          );\n        }) as any as T;\n      }\n      return result;\n    });\n  }\n\n  static getFilterMode(): SoftDeleteFilterMode {\n    return this.storage.getStore()?.filterMode ?? 'default';\n  }\n\n  static isSkipped(): boolean {\n    return this.storage.getStore()?.skipSoftDelete ?? false;\n  }\n\n  static getActorId(): string | null {\n    return this.storage.getStore()?.actorId ?? null;\n  }\n\n  static getWithDeletedRelationPaths(): string[] {\n    return this.storage.getStore()?.withDeletedRelationPaths ?? [];\n  }\n\n  static isWithDeletedRelationPath(path: string): boolean {\n    return this.getWithDeletedRelationPaths().includes(path);\n  }\n}\n","import { Injectable, Optional, Inject } from '@nestjs/common';\nimport { SoftDeletedEvent } from './soft-delete.events';\nimport { RestoredEvent } from './soft-delete.events';\nimport { PurgedEvent } from './soft-delete.events';\n\nlet registeredSoftDeleteEventEmitter: SoftDeleteEventEmitter | null = null;\n\nfunction registerSoftDeleteEventEmitter(instance: SoftDeleteEventEmitter): void {\n  registeredSoftDeleteEventEmitter = instance;\n}\n\nexport function getRegisteredSoftDeleteEventEmitter(): SoftDeleteEventEmitter | null {\n  return registeredSoftDeleteEventEmitter;\n}\n\nexport function resetRegisteredSoftDeleteEventEmitter(): void {\n  registeredSoftDeleteEventEmitter = null;\n}\n\n@Injectable()\nexport class SoftDeleteEventEmitter {\n  constructor(\n    @Optional() @Inject('EventEmitter2') private readonly eventEmitter: any | null,\n  ) {\n    if (this.eventEmitter) {\n      registerSoftDeleteEventEmitter(this);\n    }\n  }\n\n  get isEnabled(): boolean {\n    return this.eventEmitter != null;\n  }\n\n  emitSoftDeleted(event: SoftDeletedEvent): void {\n    this.eventEmitter?.emit(SoftDeletedEvent.EVENT_NAME, event);\n  }\n\n  emitRestored(event: RestoredEvent): void {\n    this.eventEmitter?.emit(RestoredEvent.EVENT_NAME, event);\n  }\n\n  emitPurged(event: PurgedEvent): void {\n    this.eventEmitter?.emit(PurgedEvent.EVENT_NAME, event);\n  }\n}\n","export class SoftDeletedEvent {\n  static readonly EVENT_NAME = 'soft-delete.deleted' as const;\n\n  constructor(\n    public readonly model: string,\n    public readonly where: Record<string, unknown>,\n    public readonly deletedAt: Date,\n    public readonly actorId: string | null = null,\n    public readonly count?: number,\n  ) {}\n}\n\nexport class RestoredEvent {\n  static readonly EVENT_NAME = 'soft-delete.restored' as const;\n\n  constructor(\n    public readonly model: string,\n    public readonly where: Record<string, unknown>,\n    public readonly actorId: string | null = null,\n    public readonly count?: number,\n  ) {}\n}\n\nexport class PurgedEvent {\n  static readonly EVENT_NAME = 'soft-delete.purged' as const;\n\n  constructor(\n    public readonly model: string,\n    public readonly count: number,\n    public readonly olderThan: Date,\n  ) {}\n}\n","import type {\n  SoftDeleteExtensionOptions,\n  SoftDeleteModuleOptions,\n} from '../interfaces/soft-delete-options.interface';\n\nexport const DEFAULT_AUDIT_MAX_BATCH_RECORDS = 1000;\n\ntype AuditLifecycleOptions = Pick<\n  SoftDeleteExtensionOptions | SoftDeleteModuleOptions,\n  'auditLifecycle' | 'auditMaxBatchRecords'\n>;\n\ninterface AuditLifecycleClient {\n  getAuditCapabilities(): {\n    consistency: string;\n    atomicLifecycle: boolean;\n  };\n  withAuditLifecycle<T>(\n    input: {\n      action: string;\n      metadata?: Record<string, unknown>;\n      suppressOuterOperation?: {\n        model: string;\n        operation: 'delete' | 'deleteMany';\n      };\n    },\n    callback: (tx: any) => Promise<T>,\n  ): Promise<T>;\n}\n\nexport function validateAuditLifecycleOptions(options: AuditLifecycleOptions): void {\n  if (options.auditLifecycle !== undefined && options.auditLifecycle !== 'atomic-required') {\n    throw new Error(\n      '[@nestarc/soft-delete] auditLifecycle must be \"atomic-required\" when provided',\n    );\n  }\n\n  if (\n    options.auditMaxBatchRecords !== undefined &&\n    (!Number.isInteger(options.auditMaxBatchRecords) || options.auditMaxBatchRecords < 1)\n  ) {\n    throw new Error('[@nestarc/soft-delete] auditMaxBatchRecords must be a positive integer');\n  }\n}\n\nexport function requireAuditLifecycleClient(client: any): AuditLifecycleClient {\n  if (typeof client?.withAuditLifecycle !== 'function') {\n    throw new Error(\n      '[@nestarc/soft-delete] auditLifecycle: \"atomic-required\" requires the extension order tenancy -> audit-log -> soft-delete and execution inside withAuditTransaction()',\n    );\n  }\n  if (typeof client?.getAuditCapabilities !== 'function') {\n    throw new Error(\n      '[@nestarc/soft-delete] auditLifecycle: \"atomic-required\" requires @nestarc/audit-log >=0.4.1 with atomic lifecycle capabilities',\n    );\n  }\n  const capabilities = client.getAuditCapabilities();\n  if (capabilities?.consistency !== 'atomic-required' || capabilities?.atomicLifecycle !== true) {\n    throw new Error(\n      '[@nestarc/soft-delete] auditLifecycle: \"atomic-required\" requires audit-log consistency: \"atomic-required\"',\n    );\n  }\n  return client as AuditLifecycleClient;\n}\n\nexport async function runAuditLifecycle<T>(\n  client: any,\n  options: AuditLifecycleOptions,\n  model: string,\n  operation: string,\n  action: 'softDeleted' | 'restored' | 'purged',\n  callback: (mutationClient: any) => Promise<T>,\n  suppressOuterOperation?: 'delete' | 'deleteMany',\n): Promise<T> {\n  if (options.auditLifecycle !== 'atomic-required') {\n    return callback(client);\n  }\n\n  return requireAuditLifecycleClient(client).withAuditLifecycle(\n    {\n      action: `${model}.${action}`,\n      metadata: {\n        auditKind: 'record',\n        lifecycle: 'soft-delete',\n        lifecycleOperation: operation,\n      },\n      ...(suppressOuterOperation\n        ? { suppressOuterOperation: { model, operation: suppressOuterOperation } }\n        : {}),\n    },\n    callback,\n  );\n}\n","import { CallHandler, ExecutionContext, Inject, Injectable, NestInterceptor } from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport { Observable } from 'rxjs';\nimport {\n  WITH_DELETED_KEY,\n  ONLY_DELETED_KEY,\n  SKIP_SOFT_DELETE_KEY,\n  WITH_DELETED_RELATIONS_KEY,\n} from '../soft-delete.constants';\nimport { SoftDeleteContext } from '../services/soft-delete-context';\nimport type { SoftDeleteFilterMode, SoftDeleteStore } from '../interfaces/soft-delete-context.interface';\n\n@Injectable()\nexport class SoftDeleteFilterInterceptor implements NestInterceptor {\n  constructor(@Inject(Reflector) private readonly reflector: Reflector) {}\n\n  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {\n    const targets = [context.getHandler(), context.getClass()];\n\n    const withDeleted = this.reflector.getAllAndOverride<boolean>(WITH_DELETED_KEY, targets) ?? false;\n    const onlyDeleted = this.reflector.getAllAndOverride<boolean>(ONLY_DELETED_KEY, targets) ?? false;\n    const skipSoftDelete = this.reflector.getAllAndOverride<boolean>(SKIP_SOFT_DELETE_KEY, targets) ?? false;\n    const withDeletedRelationPaths =\n      this.reflector.getAllAndOverride<string[]>(WITH_DELETED_RELATIONS_KEY, targets) ?? [];\n\n    let filterMode: SoftDeleteFilterMode = 'default';\n    if (withDeleted) {\n      filterMode = 'withDeleted';\n    } else if (onlyDeleted) {\n      filterMode = 'onlyDeleted';\n    }\n\n    // Preserve actorId from middleware context (AsyncLocalStorage.run replaces the entire store)\n    const currentActorId = SoftDeleteContext.getActorId();\n\n    const store: SoftDeleteStore = {\n      filterMode,\n      skipSoftDelete,\n      actorId: currentActorId,\n      withDeletedRelationPaths,\n    };\n\n    return new Observable((subscriber) => {\n      SoftDeleteContext.run(store, () => {\n        next.handle().subscribe({\n          next: (value) => subscriber.next(value),\n          error: (err) => subscriber.error(err),\n          complete: () => subscriber.complete(),\n        });\n      });\n    });\n  }\n}\n","import { Inject, Injectable, NestMiddleware } from '@nestjs/common';\nimport { Request, Response, NextFunction } from 'express';\nimport { SOFT_DELETE_MODULE_OPTIONS } from '../soft-delete.constants';\nimport { SoftDeleteModuleOptions } from '../interfaces/soft-delete-options.interface';\nimport { SoftDeleteContext } from '../services/soft-delete-context';\n\n@Injectable()\nexport class SoftDeleteActorMiddleware implements NestMiddleware {\n  constructor(\n    @Inject(SOFT_DELETE_MODULE_OPTIONS) private readonly options: SoftDeleteModuleOptions,\n  ) {}\n\n  use(req: Request, res: Response, next: NextFunction): void {\n    // If deletedByField or actorExtractor are not configured, pass through\n    if (!this.options.deletedByField || !this.options.actorExtractor) {\n      next();\n      return;\n    }\n\n    const actorId = this.options.actorExtractor(req) ?? null;\n\n    SoftDeleteContext.run(\n      {\n        filterMode: 'default',\n        skipSoftDelete: false,\n        actorId,\n      },\n      () => {\n        next();\n      },\n    );\n  }\n}\n","export class CascadeDmmfMissingError extends Error {\n  constructor() {\n    super(\n      'Cascade soft-delete requires Prisma DMMF metadata, but none was provided. ' +\n        'Pass DMMF via the dmmf option, or disable cascade.',\n    );\n    this.name = 'CascadeDmmfMissingError';\n  }\n}\n","import { CascadeDmmfMissingError } from '../errors/cascade-dmmf-missing.error';\nimport type { PrismaDmmfLike } from '../interfaces/soft-delete-options.interface';\n\nexport interface ResolveCascadeDmmfOptions {\n  optionsDmmf?: PrismaDmmfLike;\n  fallbackDmmf?: PrismaDmmfLike;\n  prismaDmmf?: PrismaDmmfLike;\n}\n\nexport function isCascadeConfigured(cascade?: Record<string, string[]>): boolean {\n  return !!cascade && Object.keys(cascade).length > 0;\n}\n\nexport function resolveCascadeDmmf({\n  optionsDmmf,\n  fallbackDmmf,\n  prismaDmmf,\n}: ResolveCascadeDmmfOptions): PrismaDmmfLike | undefined {\n  return optionsDmmf ?? fallbackDmmf ?? prismaDmmf;\n}\n\nexport function requireCascadeDmmf(options: ResolveCascadeDmmfOptions): PrismaDmmfLike {\n  const dmmf = resolveCascadeDmmf(options);\n\n  if (!dmmf) {\n    throw new CascadeDmmfMissingError();\n  }\n\n  return dmmf;\n}\n","import { Prisma } from '@prisma/client/extension';\nimport { CascadeHandler } from './cascade-handler';\nimport { isCascadeConfigured, requireCascadeDmmf } from './dmmf-resolver';\nimport { applyRelationReadFilters } from './relation-filter';\nimport type {\n  PrismaDmmfLike,\n  RelationFilterOptions,\n  SoftDeleteExtensionOptions,\n} from '../interfaces/soft-delete-options.interface';\nimport { SoftDeleteContext } from '../services/soft-delete-context';\nimport { DEFAULT_DELETED_AT_FIELD, DEFAULT_MAX_CASCADE_DEPTH } from '../soft-delete.constants';\nimport { SoftDeletedEvent } from '../events/soft-delete.events';\nimport { getRegisteredSoftDeleteEventEmitter } from '../events/soft-delete-event-emitter';\nimport { RelationDmmfMissingError } from '../errors/relation-dmmf-missing.error';\nimport {\n  DEFAULT_AUDIT_MAX_BATCH_RECORDS,\n  runAuditLifecycle,\n  validateAuditLifecycleOptions,\n} from './audit-lifecycle';\n\n/**\n * Determines whether a given model name is in the list of soft-delete models.\n * Comparison is case-insensitive to handle variations in casing.\n */\nfunction isSoftDeleteModel(model: string, softDeleteModels: string[]): boolean {\n  const normalized = model.toLowerCase();\n  return softDeleteModels.some((m) => m.toLowerCase() === normalized);\n}\n\n/**\n * Builds the data payload for a soft-delete update operation.\n */\nfunction buildSoftDeleteData(\n  deletedAtField: string,\n  deletedByField: string | null | undefined,\n): Record<string, unknown> {\n  const data: Record<string, unknown> = {\n    [deletedAtField]: new Date(),\n  };\n\n  if (deletedByField) {\n    const actorId = SoftDeleteContext.getActorId();\n    if (actorId != null) {\n      data[deletedByField] = actorId;\n    }\n  }\n\n  return data;\n}\n\n/**\n * Injects the appropriate soft-delete filter into a where clause\n * based on the current filter mode from SoftDeleteContext.\n */\nfunction applyReadFilter(\n  where: Record<string, unknown> | undefined,\n  deletedAtField: string,\n): Record<string, unknown> {\n  const filterMode = SoftDeleteContext.getFilterMode();\n\n  if (filterMode === 'withDeleted') {\n    return where ?? {};\n  }\n\n  const filter =\n    filterMode === 'onlyDeleted' ? { [deletedAtField]: { not: null } } : { [deletedAtField]: null };\n\n  if (!where) {\n    return filter;\n  }\n\n  return { ...where, ...filter };\n}\n\nfunction applyActiveWriteFilter(\n  where: Record<string, unknown> | undefined,\n  deletedAtField: string,\n): Record<string, unknown> {\n  return { ...(where ?? {}), [deletedAtField]: null };\n}\n\nfunction findPrimaryKey(model: string, dmmf?: PrismaDmmfLike): string {\n  const modelDef = dmmf?.datamodel.models.find((candidate: any) => candidate.name === model);\n  const pkField = modelDef?.fields.find((field: any) => field.isId);\n  return pkField?.name ?? 'id';\n}\n\nfunction resolveRelationFilterOptions(\n  relationFilters: boolean | RelationFilterOptions | undefined,\n): { enabled: boolean; maxDepth: number } {\n  if (relationFilters === true) {\n    return { enabled: true, maxDepth: 3 };\n  }\n\n  if (!relationFilters) {\n    return { enabled: false, maxDepth: 3 };\n  }\n\n  return {\n    enabled: relationFilters.enabled ?? true,\n    maxDepth: relationFilters.maxDepth ?? 3,\n  };\n}\n\nexport interface SoftDeleteQueryHandlers {\n  delete: (params: {\n    model: string;\n    args: any;\n    query: (args: any) => Promise<unknown>;\n    client: any;\n  }) => Promise<unknown>;\n  deleteMany: (params: {\n    model: string;\n    args: any;\n    query: (args: any) => Promise<unknown>;\n    client: any;\n  }) => Promise<unknown>;\n  findMany: (params: {\n    model: string;\n    args: any;\n    query: (args: any) => Promise<unknown>;\n  }) => Promise<unknown>;\n  findFirst: (params: {\n    model: string;\n    args: any;\n    query: (args: any) => Promise<unknown>;\n  }) => Promise<unknown>;\n  findUnique: (params: {\n    model: string;\n    args: any;\n    query: (args: any) => Promise<unknown>;\n  }) => Promise<unknown>;\n  findFirstOrThrow: (params: {\n    model: string;\n    args: any;\n    query: (args: any) => Promise<unknown>;\n  }) => Promise<unknown>;\n  findUniqueOrThrow: (params: {\n    model: string;\n    args: any;\n    query: (args: any) => Promise<unknown>;\n  }) => Promise<unknown>;\n  count: (params: {\n    model: string;\n    args: any;\n    query: (args: any) => Promise<unknown>;\n  }) => Promise<unknown>;\n  aggregate: (params: {\n    model: string;\n    args: any;\n    query: (args: any) => Promise<unknown>;\n  }) => Promise<unknown>;\n  groupBy: (params: {\n    model: string;\n    args: any;\n    query: (args: any) => Promise<unknown>;\n  }) => Promise<unknown>;\n}\n\n/**\n * Builds the raw soft-delete query handler functions.\n * Exported for unit testing so handlers can be tested without\n * requiring a real Prisma client or Prisma.defineExtension.\n *\n * @param options - Soft delete extension configuration\n * @param dmmf - Optional Prisma DMMF metadata; required when cascade is configured\n */\nexport function _buildSoftDeleteQueryHandlers(\n  options: SoftDeleteExtensionOptions,\n  dmmf?: PrismaDmmfLike,\n): SoftDeleteQueryHandlers {\n  const deletedAtField = options.deletedAtField ?? DEFAULT_DELETED_AT_FIELD;\n  const deletedByField = options.deletedByField ?? null;\n  const softDeleteModels = options.softDeleteModels;\n  const getEventEmitter = () => options.eventEmitter ?? getRegisteredSoftDeleteEventEmitter();\n  const relationFilterOptions = resolveRelationFilterOptions(options.relationFilters);\n  const relationFilterDmmf = options.dmmf ?? dmmf;\n\n  validateAuditLifecycleOptions(options);\n\n  if (relationFilterOptions.enabled && !relationFilterDmmf) {\n    throw new RelationDmmfMissingError();\n  }\n\n  let cascadeHandler: CascadeHandler | null = null;\n  if (isCascadeConfigured(options.cascade)) {\n    const cascadeDmmf = requireCascadeDmmf({\n      optionsDmmf: options.dmmf,\n      fallbackDmmf: dmmf,\n    });\n\n    cascadeHandler = new CascadeHandler({\n      cascade: options.cascade!,\n      deletedAtField,\n      deletedByField,\n      maxCascadeDepth: options.maxCascadeDepth ?? DEFAULT_MAX_CASCADE_DEPTH,\n      dmmf: cascadeDmmf,\n    });\n  }\n\n  function createReadHandler(_operationName: string) {\n    return async ({\n      model,\n      args,\n      query,\n    }: {\n      model: string;\n      args: any;\n      query: (args: any) => Promise<unknown>;\n    }): Promise<unknown> => {\n      if (!isSoftDeleteModel(model, softDeleteModels) || SoftDeleteContext.isSkipped()) {\n        return query(args);\n      }\n\n      const updatedArgs = { ...args };\n      updatedArgs.where = applyReadFilter(updatedArgs.where, deletedAtField);\n\n      const relationFilteredArgs =\n        relationFilterOptions.enabled && relationFilterDmmf\n          ? applyRelationReadFilters(updatedArgs, model, {\n              dmmf: relationFilterDmmf,\n              softDeleteModels,\n              deletedAtField,\n              maxDepth: relationFilterOptions.maxDepth,\n            })\n          : updatedArgs;\n\n      return query(relationFilteredArgs);\n    };\n  }\n\n  return {\n    async delete({ model, args, query, client }) {\n      if (!isSoftDeleteModel(model, softDeleteModels) || SoftDeleteContext.isSkipped()) {\n        return query(args);\n      }\n\n      const data = buildSoftDeleteData(deletedAtField, deletedByField);\n      const modelKey = model.charAt(0).toLowerCase() + model.slice(1);\n      const result = await runAuditLifecycle(\n        client,\n        options,\n        model,\n        'delete',\n        'softDeleted',\n        async (mutationClient) => {\n          const updated = await mutationClient[modelKey].update({\n            where: applyActiveWriteFilter(args.where, deletedAtField),\n            data,\n          });\n          if (cascadeHandler) {\n            const pkField = cascadeHandler.findPrimaryKey(model);\n            await cascadeHandler.cascadeSoftDelete(\n              mutationClient,\n              model,\n              updated[pkField],\n              data[deletedAtField] as Date,\n              0,\n              options.auditLifecycle === 'atomic-required'\n                ? (childModel, callback) =>\n                    runAuditLifecycle(\n                      client,\n                      options,\n                      childModel,\n                      'cascadeDelete',\n                      'softDeleted',\n                      callback,\n                    )\n                : undefined,\n            );\n          }\n          return updated;\n        },\n        'delete',\n      );\n\n      getEventEmitter()?.emitSoftDeleted(\n        new SoftDeletedEvent(\n          model,\n          args.where,\n          data[deletedAtField] as Date,\n          SoftDeleteContext.getActorId(),\n          1,\n        ),\n      );\n\n      return result;\n    },\n\n    async deleteMany({ model, args, query, client }) {\n      if (!isSoftDeleteModel(model, softDeleteModels) || SoftDeleteContext.isSkipped()) {\n        return query(args);\n      }\n\n      const data = buildSoftDeleteData(deletedAtField, deletedByField);\n      const modelKey = model.charAt(0).toLowerCase() + model.slice(1);\n\n      if (options.auditLifecycle === 'atomic-required') {\n        const maxRecords = options.auditMaxBatchRecords ?? DEFAULT_AUDIT_MAX_BATCH_RECORDS;\n        const result = await runAuditLifecycle(\n          client,\n          options,\n          model,\n          'deleteMany',\n          'softDeleted',\n          async (tx) => {\n            const activeWhere = applyActiveWriteFilter(args.where, deletedAtField);\n            const records = await tx[modelKey].findMany({\n              where: activeWhere,\n              take: maxRecords + 1,\n            });\n            if (records.length > maxRecords) {\n              throw new Error(\n                `[@nestarc/soft-delete] ${model}.deleteMany exceeds auditMaxBatchRecords (${maxRecords})`,\n              );\n            }\n            const pkField =\n              cascadeHandler?.findPrimaryKey(model) ?? findPrimaryKey(model, relationFilterDmmf);\n            for (const record of records) {\n              await tx[modelKey].update({\n                where: applyActiveWriteFilter(\n                  { ...(args.where ?? {}), [pkField]: record[pkField] },\n                  deletedAtField,\n                ),\n                data,\n              });\n              if (cascadeHandler) {\n                await cascadeHandler.cascadeSoftDelete(\n                  tx,\n                  model,\n                  record[pkField],\n                  data[deletedAtField] as Date,\n                  0,\n                  (childModel, callback) =>\n                    runAuditLifecycle(\n                      client,\n                      options,\n                      childModel,\n                      'cascadeDelete',\n                      'softDeleted',\n                      callback,\n                    ),\n                );\n              }\n            }\n            return { count: records.length };\n          },\n          'deleteMany',\n        );\n\n        getEventEmitter()?.emitSoftDeleted(\n          new SoftDeletedEvent(\n            model,\n            args.where,\n            data[deletedAtField] as Date,\n            SoftDeleteContext.getActorId(),\n            result.count,\n          ),\n        );\n        return result;\n      }\n\n      if (cascadeHandler) {\n        const pkField = cascadeHandler.findPrimaryKey(model);\n        const activeWhere = applyActiveWriteFilter(args.where, deletedAtField);\n        // Find records BEFORE soft-deleting them\n        const toDelete = await (client as any)[modelKey].findMany({\n          where: activeWhere,\n          select: { [pkField]: true },\n        });\n\n        const result = await (client as any)[modelKey].updateMany({\n          where: activeWhere,\n          data,\n        });\n\n        for (const record of toDelete) {\n          await cascadeHandler.cascadeSoftDelete(\n            client,\n            model,\n            record[pkField],\n            data[deletedAtField] as Date,\n            0,\n          );\n        }\n\n        getEventEmitter()?.emitSoftDeleted(\n          new SoftDeletedEvent(\n            model,\n            args.where,\n            data[deletedAtField] as Date,\n            SoftDeleteContext.getActorId(),\n            typeof (result as any).count === 'number' ? (result as any).count : undefined,\n          ),\n        );\n\n        return result;\n      }\n\n      const result = await (client as any)[modelKey].updateMany({\n        where: applyActiveWriteFilter(args.where, deletedAtField),\n        data,\n      });\n\n      getEventEmitter()?.emitSoftDeleted(\n        new SoftDeletedEvent(\n          model,\n          args.where,\n          data[deletedAtField] as Date,\n          SoftDeleteContext.getActorId(),\n          typeof (result as any).count === 'number' ? (result as any).count : undefined,\n        ),\n      );\n\n      return result;\n    },\n\n    findMany: createReadHandler('findMany'),\n    findFirst: createReadHandler('findFirst'),\n    findUnique: createReadHandler('findUnique'),\n    findFirstOrThrow: createReadHandler('findFirstOrThrow'),\n    findUniqueOrThrow: createReadHandler('findUniqueOrThrow'),\n    count: createReadHandler('count'),\n    aggregate: createReadHandler('aggregate'),\n    groupBy: createReadHandler('groupBy'),\n  };\n}\n\n/**\n * Creates a Prisma client extension that intercepts delete operations\n * (converting them to soft-delete updates) and read operations\n * (injecting deletedAt filters based on the current context).\n */\nexport function createPrismaSoftDeleteExtension(\n  options: SoftDeleteExtensionOptions,\n): ReturnType<typeof Prisma.defineExtension> {\n  return Prisma.defineExtension((client) => {\n    const handlers = _buildSoftDeleteQueryHandlers(options);\n\n    return client.$extends({\n      query: {\n        $allModels: {\n          async delete({ model, args, query }) {\n            return handlers.delete({ model, args, query, client });\n          },\n          async deleteMany({ model, args, query }) {\n            return handlers.deleteMany({ model, args, query, client });\n          },\n          async findMany({ model, args, query }) {\n            return handlers.findMany({ model, args, query });\n          },\n          async findFirst({ model, args, query }) {\n            return handlers.findFirst({ model, args, query });\n          },\n          async findUnique({ model, args, query }) {\n            return handlers.findUnique({ model, args, query });\n          },\n          async findFirstOrThrow({ model, args, query }) {\n            return handlers.findFirstOrThrow({ model, args, query });\n          },\n          async findUniqueOrThrow({ model, args, query }) {\n            return handlers.findUniqueOrThrow({ model, args, query });\n          },\n          async count({ model, args, query }) {\n            return handlers.count({ model, args, query });\n          },\n          async aggregate({ model, args, query }) {\n            return handlers.aggregate({ model, args, query });\n          },\n          async groupBy({ model, args, query }) {\n            return handlers.groupBy({ model, args, query });\n          },\n        },\n      },\n    });\n  });\n}\n","import type { PrismaDmmfLike } from '../interfaces/soft-delete-options.interface';\nimport { SoftDeleteContext } from '../services/soft-delete-context';\n\nexport interface RelationReadFilterOptions {\n  dmmf: PrismaDmmfLike;\n  softDeleteModels: string[];\n  deletedAtField: string;\n  maxDepth?: number;\n}\n\nfunction modelKey(model: string): string {\n  return model.toLowerCase();\n}\n\nfunction isSoftDeleteModel(model: string, softDeleteModels: string[]): boolean {\n  const normalized = modelKey(model);\n  return softDeleteModels.some((m) => modelKey(m) === normalized);\n}\n\nfunction findModel(dmmf: PrismaDmmfLike, model: string) {\n  return dmmf.datamodel.models.find((m) => m.name === model);\n}\n\nfunction relationFilter(deletedAtField: string): Record<string, unknown> | null {\n  const filterMode = SoftDeleteContext.getFilterMode();\n\n  if (filterMode === 'withDeleted' || SoftDeleteContext.isSkipped()) {\n    return null;\n  }\n\n  return filterMode === 'onlyDeleted'\n    ? { [deletedAtField]: { not: null } }\n    : { [deletedAtField]: null };\n}\n\nfunction applyFilterToRelationValue(\n  value: unknown,\n  filter: Record<string, unknown> | null,\n): unknown {\n  if (!filter) {\n    return value;\n  }\n\n  if (value === true) {\n    return { where: filter };\n  }\n\n  if (value && typeof value === 'object') {\n    const relationArgs = { ...(value as Record<string, unknown>) };\n    relationArgs.where = {\n      ...((relationArgs.where as Record<string, unknown> | undefined) ?? {}),\n      ...filter,\n    };\n    return relationArgs;\n  }\n\n  return value;\n}\n\nfunction walkRelationSelections(\n  args: Record<string, unknown>,\n  model: string,\n  options: Required<RelationReadFilterOptions>,\n  depth: number,\n  pathPrefix: string,\n): Record<string, unknown> {\n  if (depth >= options.maxDepth) {\n    return args;\n  }\n\n  const modelDef = findModel(options.dmmf, model);\n  if (!modelDef) {\n    return args;\n  }\n\n  const nextArgs = { ...args };\n\n  for (const selectionKey of ['include', 'select'] as const) {\n    const selection = nextArgs[selectionKey];\n    if (!selection || typeof selection !== 'object') {\n      continue;\n    }\n\n    const nextSelection = { ...(selection as Record<string, unknown>) };\n\n    for (const [fieldName, fieldSelection] of Object.entries(nextSelection)) {\n      const field = modelDef.fields.find((candidate) => candidate.name === fieldName);\n      if (!field || field.kind !== 'object' || !field.type) {\n        continue;\n      }\n\n      const relationPath = pathPrefix ? `${pathPrefix}.${fieldName}` : fieldName;\n      const isToManySoftDeleteRelation =\n        field.isList === true && isSoftDeleteModel(field.type, options.softDeleteModels);\n\n      let nextFieldSelection = fieldSelection;\n      if (\n        isToManySoftDeleteRelation &&\n        !SoftDeleteContext.isWithDeletedRelationPath(relationPath)\n      ) {\n        nextFieldSelection = applyFilterToRelationValue(\n          fieldSelection,\n          relationFilter(options.deletedAtField),\n        );\n      }\n\n      if (nextFieldSelection && typeof nextFieldSelection === 'object') {\n        nextFieldSelection = walkRelationSelections(\n          nextFieldSelection as Record<string, unknown>,\n          field.type,\n          options,\n          depth + 1,\n          relationPath,\n        );\n      }\n\n      nextSelection[fieldName] = nextFieldSelection;\n    }\n\n    nextArgs[selectionKey] = nextSelection;\n  }\n\n  return nextArgs;\n}\n\nexport function applyRelationReadFilters(\n  args: Record<string, unknown>,\n  model: string,\n  options: RelationReadFilterOptions,\n): Record<string, unknown> {\n  return walkRelationSelections(\n    { ...args },\n    model,\n    {\n      ...options,\n      maxDepth: options.maxDepth ?? 3,\n    },\n    0,\n    '',\n  );\n}\n","export class RelationDmmfMissingError extends Error {\n  constructor() {\n    super(\n      'Relation read filters require Prisma DMMF metadata, but none was provided. ' +\n        'Pass DMMF via the dmmf option, or disable relationFilters.',\n    );\n    this.name = 'RelationDmmfMissingError';\n  }\n}\n","import { SetMetadata } from '@nestjs/common';\nimport { WITH_DELETED_KEY } from '../soft-delete.constants';\n\nexport const WithDeleted = () => SetMetadata(WITH_DELETED_KEY, true);\n","import { SetMetadata } from '@nestjs/common';\nimport { ONLY_DELETED_KEY } from '../soft-delete.constants';\n\nexport const OnlyDeleted = () => SetMetadata(ONLY_DELETED_KEY, true);\n","import { SetMetadata } from '@nestjs/common';\nimport { SKIP_SOFT_DELETE_KEY } from '../soft-delete.constants';\n\nexport const SkipSoftDelete = () => SetMetadata(SKIP_SOFT_DELETE_KEY, true);\n","import { SetMetadata } from '@nestjs/common';\nimport { WITH_DELETED_RELATIONS_KEY } from '../soft-delete.constants';\n\nexport const WithDeletedRelations = (...paths: string[]) =>\n  SetMetadata(WITH_DELETED_RELATIONS_KEY, paths);\n","export class SoftDeleteFieldMissingError extends Error {\n  constructor(model: string, field: string) {\n    super(\n      `Model \"${model}\" is listed in softDeleteModels but does not have a \"${field}\" field. ` +\n      `Add \"${field} DateTime? @map(\"${field.replace(/([A-Z])/g, '_$1').toLowerCase()}\")\" to your Prisma schema.`,\n    );\n    this.name = 'SoftDeleteFieldMissingError';\n  }\n}\n"],"mappings":"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","names":["Inject","Injectable","Optional","affectedChildren","modelKey","result","delegate","pkField","Injectable","Inject","Optional","Inject","Injectable","Injectable","Inject","Inject","Injectable","Injectable","Inject","isSoftDeleteModel","modelKey","result","SetMetadata","SetMetadata","SetMetadata","SetMetadata","SetMetadata","SetMetadata"]}