{"version":3,"sources":["../src/lib/cache/NodeCacheAdapter.ts","../src/lib/validation/FastestValidatorAdapter.ts","../src/lib/module/CrudmanRegistry.ts","../src/index.ts","../src/lib/module/CrudmanModule.ts","../src/lib/crudman.service.ts","../src/lib/utils/localFileStorage.ts","../src/lib/utils/csv.ts","../src/lib/response/defaultResponseFormatter.ts","../src/lib/module/dataSource.ts","../src/lib/decorators/crud.decorators.ts","../src/lib/utils/safeSwagger.ts","../src/lib/query/query-utils.ts","../src/lib/adapters/typeorm.adapter.ts","../src/lib/decorators/CrudControllerBase.ts","../src/lib/module/moduleRef.ts","../src/lib/utils/swaggerSchema.ts"],"sourcesContent":["import NodeCache from 'node-cache'\nimport { CacheAdapter } from './CacheAdapter'\n\nexport class NodeCacheAdapter implements CacheAdapter {\n  private cache: NodeCache\n  constructor(options?: { stdTTL?: number; checkperiod?: number; maxKeys?: number }) {\n    this.cache = new NodeCache({ stdTTL: options?.stdTTL, checkperiod: options?.checkperiod, maxKeys: options?.maxKeys })\n  }\n  get<T = any>(key: string): T | undefined {\n    return this.cache.get<T>(key)\n  }\n  set(key: string, value: any, ttlSeconds?: number): boolean {\n    return this.cache.set(key, value, ttlSeconds || 0)\n  }\n  del(key: string | string[]): number {\n    return this.cache.del(key as any)\n  }\n  flush() {\n    this.cache.flushAll()\n  }\n}\n\n\n","import Validator from 'fastest-validator'\nimport { ValidatorAdapter } from '../types/ValidatorAdapter'\n import { CrudmanRegistry } from '../module/CrudmanRegistry'\n\nexport class FastestValidatorAdapter implements ValidatorAdapter {\n  private validator: any\n  constructor() {\n    this.validator = new Validator()\n  }\n\n  generateSchemaFromModel(model: any, isUpdate: boolean, exclude: string[] = ['created_at','modified_at','deleted_at']): any {\n    const rules: any = {}\n    let columns: Array<{ propertyName: string; isNullable?: boolean; type?: any; length?: number; isPrimary?: boolean; isGenerated?: boolean; isCreateDate?: boolean; isUpdateDate?: boolean; hasDefault?: boolean }> = []\n    try {\n      const ds = CrudmanRegistry.get().getDataSource?.()\n      if (ds && model) {\n        let meta: any | undefined\n        try { meta = ds.getMetadata(model) } catch {}\n        if (!meta) {\n          const all = (ds as any).entityMetadatas || []\n          meta = all.find((m: any) => m.target === model || m.name === model?.name)\n        }\n        if (meta?.columns?.length) {\n          columns = meta.columns.map((c: any) => ({\n            propertyName: c.propertyName,\n            isNullable: c.isNullable,\n            type: c.type,\n            length: c.length,\n            isPrimary: c.isPrimary,\n            isGenerated: c.isGenerated,\n            isCreateDate: c.isCreateDate,\n            isUpdateDate: c.isUpdateDate,\n            hasDefault: c.default !== undefined\n          }))\n        }\n      }\n    } catch {\n      // ignore, fallback below\n    }\n    if (!columns.length) {\n      columns = (model?.columns || model?.prototype?._columns || []) as any\n    }\n\n    if (Array.isArray(columns) && columns.length) {\n      for (const col of columns) {\n        const field = col.propertyName\n        if (!field) continue\n        if (exclude.includes(field)) continue\n        if (!isUpdate && field === 'id') continue\n        // Skip generated/auto timestamp columns for validation, but allow id in updates\n        if (col.isPrimary || col.isGenerated || col.isCreateDate || col.isUpdateDate) {\n          if (isUpdate && field === 'id') {\n            rules.id = { type: 'any', optional: true }\n          }\n          continue\n        }\n\n        const rule: any = {}\n        // Requiredness: if column is non-nullable but has a DB default, keep it optional.\n        // Otherwise, reflect nullability.\n        if (col.isNullable === false && !col.hasDefault) rule.optional = false\n        else rule.optional = true\n\n        const typ = (typeof col.type === 'string' ? col.type.toLowerCase() : col.type)\n        if (typ === 'varchar' || typ === 'text' || typ === String) {\n          rule.type = 'string';\n          if (col.length) rule.max = Number(col.length)\n          // For non-nullable string columns without default, require non-empty string\n          if (col.isNullable === false && !col.hasDefault && !isUpdate) rule.min = 1\n        } else if (typ === 'int' || typ === 'integer' || typ === Number) {\n          rule.type = 'number'; rule.integer = true\n        } else if (typ === 'float' || typ === 'double' || typ === 'decimal') {\n          rule.type = 'number'\n        } else if (typ === 'date' || typ === 'datetime' || typ === 'timestamp' || typ === Date) {\n          rule.type = 'date'\n        } else if (typ === 'boolean' || typ === Boolean) {\n          rule.type = 'boolean'\n        } else {\n          rule.type = 'any'\n        }\n\n        if (isUpdate && field !== 'id') rule.optional = true\n        rules[field] = rule\n      }\n    }\n    const fieldKeys = Object.keys(rules).filter(k => !k.startsWith('$$'))\n    // For updates, be lenient with extra keys (e.g., framework-injected) by removing them\n    rules.$$strict = isUpdate ? 'remove' : fieldKeys.length > 0\n    return rules\n  }\n\n  validate(input: any, schema: any): { valid: boolean; errors: any[] } {\n    const result = this.validator.validate(input, schema)\n    return result === true ? { valid: true, errors: [] } : { valid: false, errors: result as any[] }\n  }\n}\n\n\n","import { CrudModuleOptions } from '../types/CrudModuleOptions'\nimport { ResponseFormatter } from '../types/ResponseEnvelope'\nimport { NodeCacheAdapter } from '../cache/NodeCacheAdapter'\nimport { CacheAdapter } from '../cache/CacheAdapter'\nimport { FastestValidatorAdapter } from '../validation/FastestValidatorAdapter'\n\nexport class CrudmanRegistry {\n  private static instance: CrudmanRegistry\n  private options: CrudModuleOptions\n  private cache?: CacheAdapter\n  private moduleRef?: any\n\n  private constructor(options: CrudModuleOptions = {}) {\n    this.options = options\n    if (options.cache?.enabled) {\n      this.cache = new NodeCacheAdapter({ stdTTL: options.cache.stdTTL, checkperiod: options.cache.checkperiod, maxKeys: options.cache.maxKeys })\n    }\n  }\n\n  static init(options: CrudModuleOptions = {}) {\n    this.instance = new CrudmanRegistry(options)\n  }\n\n  static get(): CrudmanRegistry {\n    if (!this.instance) this.instance = new CrudmanRegistry({})\n    return this.instance\n  }\n\n  getOptions(): CrudModuleOptions { return this.options }\n  getCache(): CacheAdapter | undefined { return this.cache }\n  getResponseFormatter(): ResponseFormatter<any> | undefined { return this.options.defaultResponseFormatter }\n  getValidator() { return this.options.defaultValidator || new FastestValidatorAdapter() }\n  getIdentityAccessor() { return this.options.identityAccessor || ((req: any) => req.identity || req.user || {}) }\n  getRoleChecker() { return this.options.roleChecker || ((identity: any, roles?: string[]) => !roles?.length || roles.includes(identity?.role)) }\n  getDataSource() { return (this.options as any).dataSource }\n  setDataSource(ds: any) { (this.options as any).dataSource = ds }\n  setModuleRef(ref: any) { this.moduleRef = ref }\n  getModuleRef() { return this.moduleRef }\n  getUpdateMethod() { return this.options.updateMethod || 'patch' }\n  getSwaggerMeta() { return (this.options as any).swaggerMeta || {} }\n  getSwaggerRequestBodyContentTypes(): Array<'json'|'form'|'multipart'> {\n    const ct = (this.options as any).swagger?.requestBodyContentTypes\n    return Array.isArray(ct) && ct.length ? ct as any : ['json','form','multipart']\n  }\n  getIncludeRelationsInWriteBody(): boolean {\n    const v = (this.options as any).swagger?.includeRelationsInWriteBody\n    return v === true\n  }\n  getExportContentTypes(): Array<'json'|'csv'|'excel'> {\n    const list = (this.options as any).exportContentTypes\n    return Array.isArray(list) && list.length ? list : ['json','csv','excel']\n  }\n  getFileStorage(name?: string): any {\n    const storages = (this.options as any).fileStorages || {}\n    const def = (this.options as any).defaultFileStorage\n    const key = name || def\n    return key ? storages[key] : undefined\n  }\n  getUploadLimits(): { maxSizeMB?: number; allowedMimeTypes?: string[] } {\n    return (this.options as any).uploadLimits || {}\n  }\n\n  getUploadResponseOptions(): { fileFieldMode?: 'filename_in_field'|'key_url_fields'; includeBaseUrlsOn?: Array<'list'|'details'|'create'|'update'|'save'>; allowRequestOverride?: boolean } {\n    return (this.options as any).uploadResponse || {}\n  }\n\n  getThrowOnError(): boolean {\n    const v = (this.options as any).throwOnError\n    return v !== false\n  }\n}\n\n\n","export * from './lib/module/CrudmanModule'\nexport * from './lib/crudman.service'\nexport * from './lib/decorators/crud.decorators'\nexport * from './lib/decorators/CrudControllerBase'\nexport * from './lib/response/defaultResponseFormatter'\nexport { setCrudmanDataSource, getCrudmanDataSource } from './lib/module/dataSource'\nexport { setCrudmanModuleRef, getCrudmanModuleRef } from './lib/module/moduleRef'\n\nexport * from './lib/types/CrudActionConfig'\nexport * from './lib/types/HookContext'\nexport * from './lib/types/CrudSectionConfig'\nexport * from './lib/types/CrudConfig'\nexport * from './lib/types/OrmAdapter'\nexport * from './lib/types/ValidatorAdapter'\nexport * from './lib/types/ResponseEnvelope'\nexport * from './lib/types/Pagination'\nexport * from './lib/types/Sorting'\nexport * from './lib/types/Filters'\nexport * from './lib/types/Identity'\nexport * from './lib/types/CrudModuleOptions'\nexport * from './lib/types/Upload'\nexport * from './lib/utils/localFileStorage'\nexport { TypeormAdapter } from './lib/adapters/typeorm.adapter'\n\n// Utilities\nexport * from './lib/utils/swaggerSchema'\nexport { ApiHeader } from './lib/utils/safeSwagger'\n\n","import { DynamicModule, Module, OnApplicationBootstrap } from '@nestjs/common'\nimport { ModuleRef } from '@nestjs/core'\nimport { CrudmanService } from '../crudman.service'\nimport { CrudModuleOptions } from '../types/CrudModuleOptions'\nimport { CrudmanRegistry } from './CrudmanRegistry'\nimport { setCrudmanDataSource } from './dataSource'\n\n@Module({\n  providers: [CrudmanService],\n  exports: [CrudmanService]\n})\nexport class CrudmanModule implements OnApplicationBootstrap {\n  constructor(private readonly moduleRef: ModuleRef) {}\n\n  async onApplicationBootstrap() {\n    const registry = CrudmanRegistry.get()\n    // Save ModuleRef in registry for late/lazy resolutions in service\n    registry.setModuleRef(this.moduleRef)\n    if (registry.getDataSource()) return\n\n    try {\n      // Resolve TypeORM DataSource if present in the app context\n      // Use dynamic require to avoid hard dependency on typeorm\n      const maybeTypeorm = (() => {\n        try { return require('typeorm') } catch { return undefined }\n      })()\n      const maybeNestTypeorm = (() => {\n        try { return require('@nestjs/typeorm') } catch { return undefined }\n      })()\n      const DataSourceClass = maybeTypeorm && maybeTypeorm.DataSource\n      const tokenCandidates: any[] = []\n      if (maybeNestTypeorm && typeof maybeNestTypeorm.getDataSourceToken === 'function') {\n        try { tokenCandidates.push(maybeNestTypeorm.getDataSourceToken()) } catch {}\n        try { tokenCandidates.push(maybeNestTypeorm.getDataSourceToken('default')) } catch {}\n      }\n      if (DataSourceClass) tokenCandidates.push(DataSourceClass)\n      tokenCandidates.push('DataSource', 'DEFAULT_DATA_SOURCE', 'TypeOrmDataSource')\n\n      const ref: any = this.moduleRef as any\n      if (!ref || typeof ref.get !== 'function') return\n      for (const token of tokenCandidates) {\n        if (registry.getDataSource()) break\n        try {\n          const ds = ref.get(token as any, { strict: false })\n          if (ds) setCrudmanDataSource(ds)\n        } catch {\n          // ignore lookup errors; other tokens may resolve\n        }\n      }\n    } catch {\n      // ignore – fallback to manual setCrudmanDataSource if user chooses\n    }\n  }\n\n  static forRoot(options: CrudModuleOptions = {}): DynamicModule {\n    CrudmanRegistry.init(options)\n    return {\n      module: CrudmanModule,\n      providers: [CrudmanService],\n      exports: [CrudmanService]\n    }\n  }\n}\n\n\n","import { Injectable } from '@nestjs/common';\nimport { ModuleRef } from '@nestjs/core'\nimport { promises as fs } from 'fs'\nimport * as path from 'path'\nimport {\n  UploadConfig,\n  UploadMapEntry,\n  UploadSource,\n  UploadStorageMode,\n  FileStorageAdapter\n} from './types/Upload'\nimport { LocalDiskAdapter } from './utils/localFileStorage'\nimport * as csv from './utils/csv'\nimport { CrudmanRegistry } from './module/CrudmanRegistry'\nimport { defaultResponseFormatter } from './response/defaultResponseFormatter'\nimport type { HookContext, AdditionalContext, HookContextBuilder } from './types/HookContext'\n\n@Injectable()\nexport class CrudmanService {\n  private config: any\n  private options: any\n  constructor(private readonly moduleRef?: ModuleRef) {}\n\n  private getSection(section: string) {\n    \n    if (!this.config) {\n      const meta = (global as any).__crudman_global_meta\n      this.config = meta?.config || { sections: {} }\n      this.options = meta?.options || {}\n    }  \n    return this.config.sections[section]\n  }\n\n  private getResponseFormatter() {\n    return CrudmanRegistry.get().getResponseFormatter() || defaultResponseFormatter\n  }\n\n  private getValidator(sectionCfg: any) {\n    return sectionCfg.validator || CrudmanRegistry.get().getValidator()\n  }\n\n  private getOrm(sectionCfg: any) {\n    return sectionCfg.orm || this.options?.defaultOrm\n  }\n\n  getDataSource() {\n    const reg = CrudmanRegistry.get()\n    const existing = reg.getDataSource()\n    if (existing) return existing\n    const ref = this.moduleRef || reg.getModuleRef()\n    if (!ref) return undefined\n    try {\n      const maybeTypeorm = (() => { try { return require('typeorm') } catch { return undefined } })()\n      const maybeNestTypeorm = (() => { try { return require('@nestjs/typeorm') } catch { return undefined } })()\n      const DataSourceClass = maybeTypeorm && maybeTypeorm.DataSource\n      const tokenCandidates: any[] = []\n      if (maybeNestTypeorm && typeof maybeNestTypeorm.getDataSourceToken === 'function') {\n        try { tokenCandidates.push(maybeNestTypeorm.getDataSourceToken()) } catch {}\n        try { tokenCandidates.push(maybeNestTypeorm.getDataSourceToken('default')) } catch {}\n      }\n      if (DataSourceClass) tokenCandidates.push(DataSourceClass)\n      tokenCandidates.push('DataSource', 'DEFAULT_DATA_SOURCE', 'TypeOrmDataSource')\n\n      for (const token of tokenCandidates) {\n        try {\n          const ds = ref.get(token as any, { strict: false })\n          if (ds) { reg.setDataSource(ds); return ds }\n        } catch {}\n      }\n    } catch {}\n    return undefined\n  }\n\n  private async buildHookContext(section: string, action: 'list'|'details'|'create'|'update'|'save'|'delete', actionCfg: any, req: any, res: any): Promise<HookContext> {\n    const registry = CrudmanRegistry.get()\n    const moduleRef = registry.getModuleRef?.() || this.moduleRef\n    const dataSource = this.getDataSource()\n    // Base auto context (repository will be finalized after user context merge)\n    const base: HookContext = {\n      service: this,\n      repository: undefined,\n      moduleRef,\n      section,\n      action,\n      model: actionCfg?.model,\n      dataSource,\n      services: {},\n      repositories: {}\n    }\n\n    // Helper to merge user objects without overriding reserved keys\n    const mergeUserCtx = (target: HookContext, incoming?: AdditionalContext) => {\n      if (!incoming || typeof incoming !== 'object') return\n      // merge services\n      if (incoming.services && typeof incoming.services === 'object') {\n        target.services = { ...(target.services || {}), ...incoming.services }\n      }\n      // merge repositories\n      if (incoming.repositories && typeof incoming.repositories === 'object') {\n        target.repositories = { ...(target.repositories || {}), ...incoming.repositories }\n      }\n      // allow setting repo/ds only if not already set by auto\n      if (!target.repository && (incoming as any).repository) (target as any).repository = (incoming as any).repository\n      if (!target.dataSource && (incoming as any).dataSource) (target as any).dataSource = (incoming as any).dataSource\n      // copy any other non-reserved keys\n      for (const k of Object.keys(incoming)) {\n        if ((['services','repositories'] as string[]).includes(k)) continue\n        if ((['service','repository','moduleRef','section','action','model','dataSource'] as string[]).includes(k)) continue\n        ;(target as any)[k] = (incoming as any)[k]\n      }\n    }\n\n    const resolveCtxPiece = async (cfgLevel: any) => {\n      if (!cfgLevel || typeof cfgLevel !== 'object') return\n      const raw = cfgLevel.context\n      if (!raw) return\n      // Smart form: function or object\n      if (typeof raw === 'function') {\n        const extra = await Promise.resolve((raw as HookContextBuilder)(req, res, actionCfg, moduleRef as any))\n        mergeUserCtx(base, extra)\n        return\n      }\n      if (typeof raw === 'object') {\n        // Legacy/object form: honor services/repositories as function-or-object, then getHookContext\n        const sv = raw.services\n        if (sv) {\n          const val = typeof sv === 'function' ? await Promise.resolve((sv as any)(req, res, actionCfg, moduleRef)) : sv\n          if (val && typeof val === 'object') base.services = { ...(base.services || {}), ...val }\n        }\n        const rp = raw.repositories\n        if (rp) {\n          const val = typeof rp === 'function' ? await Promise.resolve((rp as any)(req, res, actionCfg, moduleRef)) : rp\n          if (val && typeof val === 'object') base.repositories = { ...(base.repositories || {}), ...val }\n        }\n        const ghc = raw.getHookContext\n        if (ghc && typeof ghc === 'function') {\n          const extra = await Promise.resolve((ghc as HookContextBuilder)(req, res, actionCfg, moduleRef as any))\n          mergeUserCtx(base, extra)\n        }\n        // Also allow extra top-level keys on object shorthand\n        mergeUserCtx(base, raw as any)\n      }\n    }\n\n    // Merge from section then action (action overrides)\n    const sectionCfg = this.getSection(section) || {}\n    await resolveCtxPiece(sectionCfg)\n    await resolveCtxPiece(actionCfg)\n    // Finalize repository resolution priority:\n    // 1) explicit additionalSettings.repo (function or object)\n    // 2) ctx.repository already set by user context\n    // 3) derive from dataSource & model\n    try {\n      const repoSpec = actionCfg?.additionalSettings?.repo\n      if (!base.repository && typeof repoSpec === 'function') {\n        const maybe = await Promise.resolve(repoSpec(actionCfg, base))\n        if (maybe) (base as any).repository = maybe\n      } else if (!base.repository && repoSpec && typeof repoSpec === 'object') {\n        (base as any).repository = repoSpec\n      }\n    } catch {}\n    if (!base.repository && base.dataSource && base.model) {\n      try { (base as any).repository = (base.dataSource as any).getRepository(base.model) } catch {}\n    }\n    return base\n  }\n\n  private async applyHooks(cfg: any, hook: string, ...args: any[]) {\n    const fn = cfg?.[hook]\n    if (!fn) return undefined\n    return await Promise.resolve(fn(...args))\n  }\n\n  private getCacheCfg(actionCfg: any) {\n    return actionCfg?.enableCache\n  }\n\n  private cacheKey(section: string, action: string, req: any, relations?: string[]) {\n    const custom = this.getCacheCfg(this.getActionCfg(section, action))\n    if (custom && typeof custom === 'object' && custom.key) return custom.key({ section, action, req, relations })\n    return `${section}:${action}:${JSON.stringify({ p: req.params, q: req.query, b: req.body, r: relations || [] })}`\n  }\n\n  private getActionCfg(section: string, action: string) {\n    const sectionCfg = this.getSection(section) || {} \n    const base = { model: sectionCfg.model, ...sectionCfg }\n    const specific = sectionCfg[action] || {}\n    return { ...base, ...specific }\n  }\n\n  private expandUploadableShorthand(sectionCfg: any): UploadConfig | undefined {\n    const uploadable = sectionCfg?.uploadable\n    if (!uploadable || typeof uploadable !== 'object') return sectionCfg?.upload\n    const defaults = sectionCfg?.uploadDefaults || {}\n    const out: UploadConfig = { sources: ['multipart'], map: [] }\n    const ensureArray = (v: any) => Array.isArray(v) ? v : (v ? [v] : [])\n    const reg = CrudmanRegistry.get()\n    const fileResp = reg.getUploadResponseOptions?.() || {}\n    const fileFieldMode = fileResp.fileFieldMode || 'filename_in_field'\n    for (const [baseField, raw] of Object.entries<any>(uploadable)) {\n      const spec = String(raw || '').trim()\n      const isArray = spec.includes('[]')\n      const mode: UploadStorageMode = spec.includes(':base64') ? 'base64' : (spec.includes(':blob') ? 'blob' : 'filename')\n      const typeHint = spec.split(':')[0].replace('[]','') // image, image-*, video, video-*, pdf, doc, spreadsheet(-*), text, xml, html, json, csv, archive, binary, any\n      const sources: UploadSource[] = defaults.sources || ['multipart']\n      const validators = this.getValidatorsForTypeHint(typeHint, defaults.validators)\n      const storage = defaults.storage || CrudmanRegistry.get().getOptions()?.defaultFileStorage\n      const entry: UploadMapEntry = {\n        sourceField: baseField,\n        targetField: (() => {\n          if (mode === 'filename') {\n            if (fileFieldMode === 'filename_in_field') {\n              return baseField\n            }\n            return isArray ? { keys: `${baseField}Keys`, urls: `${baseField}Urls` } : { key: `${baseField}Key`, url: `${baseField}Url` }\n          }\n          if (mode === 'blob') return { blob: `${baseField}Blob`, mime: `${baseField}Mime` }\n          // base64\n          return `${baseField}Base64`\n        })(),\n        isArray,\n        storageMode: mode,\n        storage,\n        sources,\n        validators,\n        typeHint: typeHint as any\n      }\n      out.map.push(entry)\n    }\n    // merge any explicit upload.map\n    if (sectionCfg?.upload?.map?.length) out.map.push(...ensureArray(sectionCfg.upload.map))\n    return out\n  }\n\n  private getValidatorsForTypeHint(typeHint: string, override?: any): any {\n    if (override) return override\n    const map: Record<string, any> = {\n      // images\n      'image': { allowedMimeTypes: ['image/jpeg','image/png','image/gif','image/webp','image/avif'], allowedExtensions: ['.jpg','.jpeg','.png','.gif','.webp','.avif'], maxSizeMB: 5 },\n      'image-jpg': { allowedMimeTypes: ['image/jpeg'], allowedExtensions: ['.jpg','.jpeg'], maxSizeMB: 5 },\n      'image-png': { allowedMimeTypes: ['image/png'], allowedExtensions: ['.png'], maxSizeMB: 5 },\n      'image-gif': { allowedMimeTypes: ['image/gif'], allowedExtensions: ['.gif'], maxSizeMB: 5 },\n      'image-webp': { allowedMimeTypes: ['image/webp'], allowedExtensions: ['.webp'], maxSizeMB: 5 },\n      'image-avif': { allowedMimeTypes: ['image/avif'], allowedExtensions: ['.avif'], maxSizeMB: 5 },\n      'image-avatar': { allowedMimeTypes: ['image/jpeg','image/png','image/gif','image/webp','image/avif'], allowedExtensions: ['.jpg','.jpeg','.png','.gif','.webp','.avif'], maxSizeMB: 2, _avatar: true },\n      'image-jpg-avatar': { allowedMimeTypes: ['image/jpeg'], allowedExtensions: ['.jpg','.jpeg'], maxSizeMB: 2, _avatar: true },\n      'image-png-avatar': { allowedMimeTypes: ['image/png'], allowedExtensions: ['.png'], maxSizeMB: 2, _avatar: true },\n      'image-webp-avatar': { allowedMimeTypes: ['image/webp'], allowedExtensions: ['.webp'], maxSizeMB: 2, _avatar: true },\n      'image-avif-avatar': { allowedMimeTypes: ['image/avif'], allowedExtensions: ['.avif'], maxSizeMB: 2, _avatar: true },\n      // video\n      'video': { allowedMimeTypes: ['video/mp4','video/webm','video/ogg'], allowedExtensions: ['.mp4','.webm','.ogg'], maxSizeMB: 100 },\n      'video-mp4': { allowedMimeTypes: ['video/mp4'], allowedExtensions: ['.mp4'], maxSizeMB: 100 },\n      'video-webm': { allowedMimeTypes: ['video/webm'], allowedExtensions: ['.webm'], maxSizeMB: 100 },\n      'video-ogg': { allowedMimeTypes: ['video/ogg'], allowedExtensions: ['.ogg'], maxSizeMB: 100 },\n      'video-short': { allowedMimeTypes: ['video/mp4','video/webm'], allowedExtensions: ['.mp4','.webm'], maxSizeMB: 25, _shortVideo: true },\n      // audio\n      'audio': { allowedMimeTypes: ['audio/mpeg','audio/mp4','audio/aac','audio/ogg','audio/wav'], allowedExtensions: ['.mp3','.m4a','.aac','.ogg','.wav'], maxSizeMB: 20 },\n      // docs\n      'pdf': { allowedExtensions: ['.pdf'], maxSizeMB: 10 },\n      'doc': { allowedExtensions: ['.pdf','.doc','.docx','.odt'], maxSizeMB: 10 },\n      // spreadsheets\n      'spreadsheet': { allowedExtensions: ['.xls','.xlsx','.csv'], maxSizeMB: 10 },\n      'spreadsheet-csv': { allowedMimeTypes: ['text/csv'], allowedExtensions: ['.csv'], maxSizeMB: 5 },\n      'spreadsheet-xls': { allowedMimeTypes: ['application/vnd.ms-excel'], allowedExtensions: ['.xls'], maxSizeMB: 10 },\n      'spreadsheet-xlsx': { allowedMimeTypes: ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'], allowedExtensions: ['.xlsx'], maxSizeMB: 10 },\n      // text/web\n      'text': { allowedMimeTypes: ['text/plain','text/markdown'], allowedExtensions: ['.txt','.md'], maxSizeMB: 2 },\n      'csv': { allowedMimeTypes: ['text/csv'], allowedExtensions: ['.csv'], maxSizeMB: 5 },\n      'xml': { allowedMimeTypes: ['application/xml','text/xml'], allowedExtensions: ['.xml'], maxSizeMB: 2 },\n      'html': { allowedMimeTypes: ['text/html'], allowedExtensions: ['.html','.htm'], maxSizeMB: 2 },\n      'json': { allowedMimeTypes: ['application/json'], allowedExtensions: ['.json'], maxSizeMB: 2 },\n      // archive/binary/any\n      'archive': { allowedExtensions: ['.zip','.tar','.gz','.rar','.7z'], maxSizeMB: 200 },\n      'binary': { allowedMimeTypes: ['application/octet-stream'], maxSizeMB: 50 },\n      'any': {}\n    }\n    return map[typeHint] || {}\n  }\n\n  private getEffectiveUploadCfg(actionCfg: any): UploadConfig | undefined {\n    // action overrides section-level\n    const fromAction: UploadConfig | undefined = actionCfg?.upload\n    if (fromAction?.map?.length) return fromAction\n    return this.expandUploadableShorthand(actionCfg)\n  }\n\n  private getStorageAdapter(name?: string): FileStorageAdapter | undefined {\n    const cfg = CrudmanRegistry.get().getFileStorage(name)\n    if (!cfg) return undefined\n    if (cfg.type === 'local') {\n      return new LocalDiskAdapter({ dest: cfg.dest || 'uploads', publicBaseUrl: cfg.publicBaseUrl })\n    }\n    return cfg as FileStorageAdapter\n  }\n\n  private async readFileBufferIfPath(file: any): Promise<Buffer | undefined> {\n    if (file?.buffer) return file.buffer as Buffer\n    if (file?.path) {\n      try { return await fs.readFile(file.path) } catch { return undefined }\n    }\n    return undefined\n  }\n\n  private async processUploads(section: string, actionCfg: any, req: any): Promise<void> {\n    const uploadCfg = this.getEffectiveUploadCfg(actionCfg)\n    if (!uploadCfg || !uploadCfg.map || !uploadCfg.map.length) return\n    const files: any[] = Array.isArray(req?.files) ? req.files : []\n    const errors: any[] = []\n    for (const rule of uploadCfg.map) {\n      const field = rule.sourceField\n      const incomingFiles = files.filter((f) => f && String(f.fieldname) === field)\n      const base64Value = req?.body?.[field]\n      const items: Array<{ buffer?: Buffer; stream?: NodeJS.ReadableStream; base64?: string; mime?: string; filename?: string }> = []\n      if (incomingFiles.length) {\n        for (const f of incomingFiles) {\n          items.push({ buffer: await this.readFileBufferIfPath(f), stream: f.stream, mime: f.mimetype, filename: f.originalname })\n        }\n      } else if (base64Value) {\n        const arr = Array.isArray(base64Value) ? base64Value : [base64Value]\n        for (const v of arr) items.push({ base64: String(v), mime: undefined, filename: undefined })\n      }\n      if (!items.length) {\n        // If no file provided on create, mark as required for filename uploads\n        const isCreate = !(req?.params?.id || req?.body?.id)\n        if (isCreate && rule.storageMode === 'filename' && !rule.isArray) {\n          errors.push({ type: 'required', field: rule.sourceField, message: `The ${rule.sourceField} field is required.` })\n        }\n        continue\n      }\n\n      // Effective validators precedence: rule.validators > section.uploadDefaults.validators > global uploadLimits + typeHint defaults\n      const globalLimits = CrudmanRegistry.get().getUploadLimits() || {}\n      const typeDefaults = this.getValidatorsForTypeHint(String((rule as any)?.typeHint || ''), undefined)\n      const sectionDefaults = (actionCfg?.uploadDefaults?.validators) || {}\n      const eff: any = { ...typeDefaults, ...globalLimits, ...sectionDefaults, ...(rule.validators || {}) }\n\n      // Validate each item\n      for (const it of items) {\n        const errPrefix = field\n        // size\n        if (eff.maxSizeMB && eff.maxSizeMB > 0) {\n          const sizeBytes = it.buffer?.length || 0\n          const b64len = it.base64 ? Buffer.byteLength(String(it.base64).split('base64,').pop() || '', 'base64') : 0\n          const size = sizeBytes || b64len\n          const maxBytes = eff.maxSizeMB * 1024 * 1024\n          if (size > maxBytes) errors.push({ type: 'fileSize', field: errPrefix, message: `File too large. Max ${eff.maxSizeMB} MB` })\n        }\n        // extension\n        if (Array.isArray(eff.allowedExtensions) && eff.allowedExtensions.length) {\n          const ext = (it.filename ? require('path').extname(it.filename) : '').toLowerCase()\n          if (!ext || !eff.allowedExtensions.map((e: string) => e.toLowerCase()).includes(ext)) {\n            errors.push({ type: 'fileExtension', field: errPrefix, message: `Invalid extension. Allowed: ${eff.allowedExtensions.join(', ')}` })\n          }\n        }\n        // mime\n        if (Array.isArray(eff.allowedMimeTypes) && eff.allowedMimeTypes.length) {\n          const mime = (it.mime || '').toLowerCase()\n          if (!mime || !eff.allowedMimeTypes.map((m: string) => m.toLowerCase()).includes(mime)) {\n            errors.push({ type: 'fileMime', field: errPrefix, message: `Invalid MIME type. Allowed: ${eff.allowedMimeTypes.join(', ')}` })\n          }\n        }\n        // avatar dimensions (optional)\n        if (eff._avatar && (it.buffer || it.base64)) {\n          try {\n            // eslint-disable-next-line @typescript-eslint/no-var-requires\n            const sizeOf = require('image-size') as (input: Buffer) => { width: number; height: number }\n            const buf = it.buffer || Buffer.from(String(it.base64).split('base64,').pop() || '', 'base64')\n            const dim = sizeOf(buf)\n            if (dim?.width && dim?.height) {\n              const w = dim.width, h = dim.height\n              if (w < 128 || h < 128) errors.push({ type: 'imageDimensions', field: errPrefix, message: `Image too small. Min 128x128` })\n              if (w > 4096 || h > 4096) errors.push({ type: 'imageDimensions', field: errPrefix, message: `Image too large. Max 4096x4096` })\n              const ratio = w / h\n              if (Math.abs(ratio - 1) > 0.2) errors.push({ type: 'imageAspect', field: errPrefix, message: `Image should be near 1:1 aspect (±20%)` })\n            }\n          } catch {}\n        }\n        // video-short optional checks\n        if (typeDefaults && typeDefaults._shortVideo) {\n          // Implement only when external tools are available; skipped gracefully\n        }\n      }\n      if (errors.length) continue\n      const adapter = this.getStorageAdapter(rule.storage)\n      const assign = (key: string, value: any) => { if (!req.body) req.body = {}; (req.body as any)[key] = value }\n      if (rule.storageMode === 'filename') {\n        if (!adapter) throw new Error('No file storage adapter configured')\n        if (rule.isArray) {\n          const keys: string[] = []\n          const urls: string[] = []\n          for (const it of items) {\n            const saved = await adapter.save({ buffer: it.buffer, stream: it.stream, base64: it.base64, mime: it.mime, filename: it.filename })\n            keys.push(saved.key); if (saved.url) urls.push(saved.url)\n          }\n          const tf = rule.targetField as any\n          if (typeof tf === 'string') {\n            assign(tf, keys)\n          } else {\n            if (tf?.keys) assign(tf.keys, keys)\n            if (tf?.urls) assign(tf.urls, urls)\n          }\n        } else {\n          const it = items[0]\n          const saved = await adapter.save({ buffer: it.buffer, stream: it.stream, base64: it.base64, mime: it.mime, filename: it.filename })\n          const tf = rule.targetField as any\n          if (typeof tf === 'string') {\n            assign(tf, saved.key)\n          } else {\n            if (tf?.key) assign(tf.key, saved.key)\n            if (tf?.url && saved.url) assign(tf.url, saved.url)\n          }\n        }\n      } else if (rule.storageMode === 'base64') {\n        const tf = rule.targetField as string\n        if (rule.isArray) assign(tf, items.map((it) => it.base64 || ''))\n        else assign(tf, items[0].base64 || '')\n      } else if (rule.storageMode === 'blob') {\n        if (rule.isArray) {\n          // Not supported in shorthand for arrays; skip\n        } else {\n          const it = items[0]\n          const buf = it.buffer || (it.base64 ? Buffer.from(String(it.base64).split('base64,').pop() || '', 'base64') : undefined)\n          const tf = rule.targetField as any\n          if (buf) assign(tf.blob, buf)\n          if (tf?.mime) assign(tf.mime, it.mime || 'application/octet-stream')\n        }\n      }\n    }\n    if (errors.length) (req as any)._fileValidationErrors = errors\n  }\n\n  private async computeAdditionalResponse(section: string, action: string, actionCfg: any, body: any, req: any, res: any): Promise<any | undefined> {\n    let extra: any = undefined\n    const add = (obj?: any) => {\n      if (obj && typeof obj === 'object') extra = { ...(extra || {}), ...obj }\n    }\n    // User-specified additional response(s)\n    const ar = actionCfg?.additionalResponse\n    if (typeof ar === 'function') {\n      try { add(await Promise.resolve(ar(req, res, body))) } catch {}\n    } else if (ar && typeof ar === 'object') add(ar)\n    if (typeof actionCfg?.getAdditionalResponse === 'function') {\n      try { add(await Promise.resolve(actionCfg.getAdditionalResponse(req, res, body))) } catch {}\n    }\n\n    // Auto baseUrls for shorthand uploadable image fields (actions per options)\n    const includeOn = CrudmanRegistry.get().getUploadResponseOptions()?.includeBaseUrlsOn || ['list','details']\n    if (includeOn.includes(action as any)) {\n      const uploadCfg = this.getEffectiveUploadCfg(actionCfg)\n      const rules = (uploadCfg?.map || []).filter((m) => m.storageMode === 'filename' && !m.isArray)\n      if (rules.length) {\n        const bases: Record<string,string> = {}\n        for (const r of rules) {\n          const adapter = this.getStorageAdapter(r.storage)\n          const base = (adapter?.getUrl && typeof adapter.getUrl === 'function') ? String((adapter as any).opts?.publicBaseUrl || '') : ''\n          if (base) bases[r.sourceField] = base.endsWith('/') ? base : base + '/'\n        }\n        if (Object.keys(bases).length) add({ baseUrls: bases })\n      }\n    }\n    return extra\n  }\n\n  private async validateIfNeeded(actionCfg: any, req: any, res: any, isUpdate: boolean) { \n    const validator = this.getValidator(actionCfg) \n    let rules = validator.generateSchemaFromModel(actionCfg.model, isUpdate)\n    if (actionCfg.getFinalValidationRules) {\n      const ctx = await this.buildHookContext(actionCfg?.name || '', (req?.params?.id ? 'update' : 'create') as any, actionCfg, req, res)\n      const mod = await Promise.resolve(actionCfg.getFinalValidationRules(rules, ctx, req, res, validator))\n      if (mod) rules = mod\n    }\n    const ctxForVal = await this.buildHookContext(actionCfg?.name || '', (req?.params?.id ? 'update' : 'create') as any, actionCfg, req, res)\n    const proceed = await this.applyHooks(actionCfg, 'onBeforeValidate', req, res, ctxForVal, rules, validator)\n    if (proceed === false) return { valid: false, errors: [{ message: 'Validation stopped by onBeforeValidate' }] }\n    const input = { ...req.body }\n    const result = validator.validate(input, rules)\n    // Uniqueness validation (DB-level check; adapter-agnostic via orm.exists)\n    try {\n     \n      \n      // const fields = actionCfg.fieldsForUniquenessValidation || actionCfg.fieldsForUniquenessValidation === undefined\n      //   ? (this.getSection(actionCfg?.name || '')?.fieldsForUniquenessValidation || [])\n      //   : actionCfg.fieldsForUniquenessValidation\n      const fields = actionCfg.fieldsForUniquenessValidation  || []\n\n      const conditionType: 'or'|'and' = actionCfg.conditionTypeForUniquenessValidation || 'or'\n      if (Array.isArray(fields) && fields.length) {\n        const orm = this.getOrm(actionCfg)\n        if (orm && typeof orm.exists === 'function' && typeof (orm as any).buildUniquenessWhere === 'function') {\n          const idField = actionCfg.recordSelectionField || 'id'\n          const idValue = isUpdate ? (req.params?.[idField] ?? req.body?.[idField]) : undefined \n          const where = (orm as any).buildUniquenessWhere(idValue, fields, input, conditionType) \n\n          const exists = await orm.exists(where, actionCfg)\n          if (exists) { \n            const errs = fields.map((f: string) => ({ type: 'unique', field: f, message: `${f} must be unique` }))\n            result.valid = false\n            result.errors = [...(result.errors || []), ...errs]\n          }  \n        }\n      }  \n    } catch {}\n    const proceedAfter = await this.applyHooks(actionCfg, 'onAfterValidate', req, res, ctxForVal, result.errors, validator)\n    if (proceedAfter === false) return { valid: false, errors: result.errors }\n    return result\n  }\n\n  private send(res: any, body: any) { if (res && !res.headersSent) res.send(body); return body }\n  private async sendNegotiated(res: any, action: 'list'|'details', result: any, req?: any) {\n    if (!res || res.headersSent) return result\n    const rawHeader = (\n      req?.headers?.['x-content-type'] || req?.headers?.['X-Content-Type'] || req?.headers?.accept ||\n      res?.req?.headers?.['x-content-type'] || res?.req?.headers?.['X-Content-Type'] || res?.req?.headers?.accept ||\n      ''\n    ).toString().toLowerCase()\n    const rawQuery = (req?.query?.['x-content-type'] || req?.query?.['x_content_type'] || req?.query?.format || '').toString().toLowerCase()\n    const allowed = CrudmanRegistry.get().getExportContentTypes()\n    // normalize aliases and mime types\n    const normalized = (() => {\n      const source = rawHeader || rawQuery\n      if (!source) return ''\n      if (source.includes('excel') || source.includes('xlsx') || source.includes('sheet')) return 'excel'\n      if (source.includes('csv') || source.includes('text/csv')) return 'csv'\n      if (source.includes('json') || source.includes('application/json')) return 'json'\n      return source\n    })()\n    const requested = normalized || 'json'\n    const type = allowed.includes(requested as any) ? requested : 'json'\n    if (type === 'csv') {\n      res.setHeader('Content-Type', 'text/csv; charset=utf-8')\n      if (action === 'list') {\n        const items = Array.isArray(result?.data) ? result.data : []\n        // echo pagination/meta in headers\n        const p = result?.pagination || {}\n        if (p.totalItemsCount !== undefined) res.setHeader('X-Pagination-Total', String(p.totalItemsCount))\n        if (p.page !== undefined) res.setHeader('X-Pagination-Page', String(p.page))\n        if (p.perPage !== undefined) res.setHeader('X-Pagination-PerPage', String(p.perPage))\n        if (result?.filters) res.setHeader('X-Filters', encodeURIComponent(JSON.stringify(result.filters)))\n        if (result?.sorting) res.setHeader('X-Sorting', encodeURIComponent(JSON.stringify(result.sorting)))\n        const csvText = csv.toCsvFromArray(items, { flattenDepth: 1 })\n        return this.send(res, csvText)\n      } else {\n        const obj = result?.data || {}\n        const csvText = csv.toCsvFromObject(obj, { flattenDepth: 1 })\n        return this.send(res, csvText)\n      }\n    }\n\n    if (type === 'excel') {\n      try {\n        // eslint-disable-next-line @typescript-eslint/no-var-requires\n        const ExcelJS = require('exceljs')\n        const workbook = new ExcelJS.Workbook()\n        const sheet = workbook.addWorksheet('data')\n        const flatten = (input: any, depth = 1, prefix = ''): Record<string, any> => {\n          if (!input || typeof input !== 'object') return { [prefix || 'value']: input }\n          const out: Record<string, any> = {}\n          for (const [k, v] of Object.entries(input)) {\n            const key = prefix ? `${prefix}.${k}` : k\n            if (v && typeof v === 'object' && depth > 0) Object.assign(out, flatten(v, depth - 1, key))\n            else out[key] = v\n          }\n          return out\n        }\n\n        if (action === 'list') {\n          const items = Array.isArray(result?.data) ? result.data : []\n          const flattened = items.map((i: any) => flatten(i, 1))\n          const headersSet = new Set<string>()\n          for (const it of flattened) Object.keys(it).forEach((h) => headersSet.add(h))\n          const headers = Array.from(headersSet)\n          sheet.columns = headers.map((h) => ({ header: h, key: h }))\n          for (const it of flattened) {\n            const row: Record<string, any> = {}\n            for (const h of headers) row[h] = (it as any)[h]\n            sheet.addRow(row)\n          }\n          const p = result?.pagination || {}\n          if (p.totalItemsCount !== undefined) res.setHeader('X-Pagination-Total', String(p.totalItemsCount))\n          if (p.page !== undefined) res.setHeader('X-Pagination-Page', String(p.page))\n          if (p.perPage !== undefined) res.setHeader('X-Pagination-PerPage', String(p.perPage))\n          if (result?.filters) res.setHeader('X-Filters', encodeURIComponent(JSON.stringify(result.filters)))\n          if (result?.sorting) res.setHeader('X-Sorting', encodeURIComponent(JSON.stringify(result.sorting)))\n        } else {\n          const obj = result?.data || {}\n          const flattened = flatten(obj, 1)\n          const headers = Object.keys(flattened)\n          sheet.columns = headers.map((h) => ({ header: h, key: h }))\n          const row: Record<string, any> = {}\n          for (const h of headers) row[h] = (flattened as any)[h]\n          sheet.addRow(row)\n        }\n\n        res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')\n        res.setHeader('Content-Disposition', 'attachment; filename=\"data.xlsx\"')\n        try {\n          const buffer: Buffer = await workbook.xlsx.writeBuffer()\n          return this.send(res, buffer)\n        } catch {\n          await workbook.xlsx.write(res)\n          return res\n        }\n      } catch (err) {\n        // exceljs not installed or failed → inform user clearly\n        res.setHeader('Content-Type', 'application/json; charset=utf-8')\n        const body = {\n          data: null,\n          errors: [{ message: 'Excel export requires optional dependency \"exceljs\". Install with: npm i exceljs' }],\n          success: false\n        }\n        return this.send(res, body)\n      }\n    }\n    // Default JSON\n    res.setHeader('Content-Type', 'application/json; charset=utf-8')\n    // Per-request URL expansion override\n    try {\n      const urlPrefRaw = (req?.headers?.['x-file-url'] || req?.headers?.['X-File-Url'] || req?.query?.['x-file-url'] || req?.query?.['x_file_url'] || '').toString().toLowerCase()\n      const urlPref = urlPrefRaw === 'full' ? 'full' : (urlPrefRaw === 'key_only' ? 'key_only' : undefined)\n      const includeOn = CrudmanRegistry.get().getUploadResponseOptions()?.includeBaseUrlsOn || ['list','details']\n      if (urlPref && includeOn.includes(action)) {\n        const body = { ...result }\n        ;(body as any).meta = (body as any).meta || {}\n        ;(body as any).meta.fileUrlMode = urlPref\n        return this.send(res, body)\n      }\n    } catch {}\n    return this.send(res, result)\n  }\n\n  async list(section: string, req: any, res: any) {\n    const sectionCfg = this.getSection(section)\n    const actionCfg = this.getActionCfg(section, 'list')\n    const orm = this.getOrm(actionCfg)\n    if (!sectionCfg || !orm) {\n      const throwOn = CrudmanRegistry.get().getThrowOnError()\n      if (throwOn) {\n        const { BadRequestException } = require('@nestjs/common')\n        throw new BadRequestException({ success: false, errors: [{ message: 'Invalid section' }] })\n      }\n      return this.send(res, { success: false, errors: [{ message: 'Invalid section' }] })\n    }\n    const ctx = await this.buildHookContext(section, 'list', actionCfg, req, res)\n    // Ensure registry has DS for adapter fallback\n    try { if (ctx.dataSource) CrudmanRegistry.get().setDataSource(ctx.dataSource) } catch {}\n    const beforeAction = await this.applyHooks(actionCfg, 'onBeforeAction', req, res, ctx)\n    // After onBeforeAction, finalize ctx dataSource/repository and update registry\n    try {\n      if (!ctx.dataSource) ctx.dataSource = this.getDataSource()\n      if (ctx.dataSource) CrudmanRegistry.get().setDataSource(ctx.dataSource)\n      if (!ctx.repository && ctx.dataSource && actionCfg?.model) {\n        try { ctx.repository = (ctx.dataSource as any).getRepository(actionCfg.model) } catch {}\n      }\n      // Hard fallback to registry DS if still missing\n      if (!ctx.dataSource) {\n        const regDs = CrudmanRegistry.get().getDataSource()\n        if (regDs) ctx.dataSource = regDs\n      }\n      if (!ctx.repository && ctx.dataSource && actionCfg?.model) {\n        try { ctx.repository = (ctx.dataSource as any).getRepository(actionCfg.model) } catch {}\n      }\n    } catch {}\n    if (beforeAction === false) return\n\n    // Default: include all relations unless excluded/overridden\n    const baseRels = actionCfg.getRelations ? await actionCfg.getRelations(req, res, actionCfg) : (actionCfg.relations ?? '*')\n    const relations = baseRels\n    const cache = CrudmanRegistry.get().getCache()\n    const cacheCfg = this.getCacheCfg(actionCfg)\n    const additionalSettingsBase: any = actionCfg?.additionalSettings || {}\n    // Guarantee a concrete repository is passed to the adapter\n    try {\n      const dsPref = (ctx as any).dataSource || this.getDataSource()\n      const hardRepo = (ctx as any).repository || (dsPref && actionCfg?.model ? (dsPref as any).getRepository(actionCfg.model) : undefined)\n      if (hardRepo) additionalSettingsBase.repo = hardRepo\n    } catch {}\n    const cfgForOrmBase = { ...actionCfg, relations, service: this, _ctx: ctx, additionalSettings: additionalSettingsBase }\n    if (cache && cacheCfg) {\n      const key = this.cacheKey(section, 'list', req, relations)\n      const hit = cache.get<any>(key)\n      if (hit) return await this.sendNegotiated(res, 'list', hit, req)\n      const payload = await orm.list(req, cfgForOrmBase)\n      const fmt = this.getResponseFormatter()\n      const body = fmt({ action: 'list', payload, errors: [], success: true, meta: { pagination: payload.pagination, filters: payload.filters, sorting: payload.sorting }, req, res })\n      await this.applyHooks(actionCfg, 'onAfterAction', body, req, ctx)\n      cache.set(key, body, typeof cacheCfg === 'object' ? cacheCfg.ttl : undefined)\n      return await this.sendNegotiated(res, 'list', body, req)\n    }\n    const payload = await orm.list(req, cfgForOrmBase)\n    const fmt = this.getResponseFormatter()\n    const body = fmt({ action: 'list', payload, errors: [], success: true, meta: { pagination: payload.pagination, filters: payload.filters, sorting: payload.sorting }, req, res })\n    const extra = await this.computeAdditionalResponse(section, 'list', actionCfg, body, req, res)\n    if (extra) (body as any).meta = { ...(body as any).meta, ...(extra || {}) }\n    await this.applyHooks(actionCfg, 'onAfterAction', body, req, ctx)\n    return this.sendNegotiated(res, 'list', body, req)\n  }\n\n  async details(section: string, req: any, res: any) {\n    const actionCfg = this.getActionCfg(section, 'details')\n    const orm = this.getOrm(actionCfg)\n    if (!orm) {\n      const throwOn = CrudmanRegistry.get().getThrowOnError()\n      if (throwOn) {\n        const { BadRequestException } = require('@nestjs/common')\n        throw new BadRequestException({ success: false, errors: [{ message: 'Invalid section' }] })\n      }\n      return this.send(res, { success: false, errors: [{ message: 'Invalid section' }] })\n    }\n    const ctx = await this.buildHookContext(section, 'details', actionCfg, req, res)\n    try { if (ctx.dataSource) CrudmanRegistry.get().setDataSource(ctx.dataSource) } catch {}\n    const beforeAction = await this.applyHooks(actionCfg, 'onBeforeAction', req, res, ctx)\n    if (beforeAction === false) return\n    // Default: include all relations unless excluded/overridden\n    const baseRels = actionCfg.getRelations ? await actionCfg.getRelations(req, res, actionCfg) : (actionCfg.relations ?? '*')\n    const relations = baseRels\n    const cache = CrudmanRegistry.get().getCache()\n    const cacheCfg = this.getCacheCfg(actionCfg)\n    if (cache && cacheCfg) {\n      const key = this.cacheKey(section, 'details', req, relations)\n      const hit = cache.get<any>(key)\n      if (hit) return await this.sendNegotiated(res, 'details', hit, req)\n      const entity = await orm.details(req, { ...actionCfg, relations, service: this, _ctx: ctx })\n      const fmt = this.getResponseFormatter()\n      const body = fmt({ action: 'details', payload: entity, errors: [], success: !!entity, meta: {}, req, res })\n      await this.applyHooks(actionCfg, 'onAfterAction', body, req, ctx)\n      cache.set(key, body, typeof cacheCfg === 'object' ? cacheCfg.ttl : undefined)\n      return await this.sendNegotiated(res, 'details', body, req)\n    }\n    const entity = await orm.details(req, { ...actionCfg, relations, service: this, _ctx: ctx })\n    const fmt = this.getResponseFormatter()\n    const body = fmt({ action: 'details', payload: entity, errors: [], success: !!entity, meta: {}, req, res })\n    const extra = await this.computeAdditionalResponse(section, 'details', actionCfg, body, req, res)\n    if (extra) (body as any).meta = { ...(body as any).meta, ...(extra || {}) }\n    await this.applyHooks(actionCfg, 'onAfterAction', body, req, ctx)\n    return this.sendNegotiated(res, 'details', body, req)\n  }\n\n  async create(section: string, req: any, res: any) { \n    const actionCfg = this.getActionCfg(section, 'create')\n    const orm = this.getOrm(actionCfg)\n    if (!orm) {\n      const throwOn = CrudmanRegistry.get().getThrowOnError()\n      if (throwOn) {\n        const { BadRequestException } = require('@nestjs/common')\n        throw new BadRequestException({ success: false, errors: [{ message: 'Invalid section' }] })\n      }\n      return this.send(res, { success: false, errors: [{ message: 'Invalid section' }] })\n    }\n    await this.processUploads(section, actionCfg, req)\n    const val = await this.validateIfNeeded(actionCfg, req, res, false)\n    const combinedErrors = [ ...(((req as any)._fileValidationErrors as any[]) || []), ...(val.valid ? [] : val.errors) ]\n    if (combinedErrors.length) {\n      const throwOn = CrudmanRegistry.get().getThrowOnError()\n      if (throwOn) {\n        const { BadRequestException } = require('@nestjs/common')\n        throw new BadRequestException({ success: false, errors: combinedErrors })\n      }\n      try { if (res?.status) res.status(400) } catch {}\n      return this.send(res, this.getResponseFormatter()({ action: 'create', payload: null, errors: combinedErrors, success: false, meta: {}, req, res }))\n    }\n    const ctx = await this.buildHookContext(section, 'create', actionCfg, req, res)\n    try { if (ctx.dataSource) CrudmanRegistry.get().setDataSource(ctx.dataSource) } catch {}\n    const beforeAction = await this.applyHooks(actionCfg, 'onBeforeAction', req, res, ctx)\n    if (beforeAction === false) return\n    const saved = await orm.create(req, { ...actionCfg, service: this, _ctx: ctx })\n    this.invalidateSection(section)\n    const body = this.getResponseFormatter()({ action: 'create', payload: saved, errors: [], success: true, meta: {}, req, res })\n    const extra = await this.computeAdditionalResponse(section, 'create', actionCfg, body, req, res)\n    if (extra) (body as any).meta = { ...(body as any).meta, ...(extra || {}) }\n    await this.applyHooks(actionCfg, 'onAfterAction', body, req, ctx)\n    return this.send(res, body)\n  }\n\n  async update(section: string, req: any, res: any) {\n    const actionCfg = this.getActionCfg(section, 'update')\n    const orm = this.getOrm(actionCfg)\n    if (!orm) {\n      const throwOn = CrudmanRegistry.get().getThrowOnError()\n      if (throwOn) {\n        const { BadRequestException } = require('@nestjs/common')\n        throw new BadRequestException({ success: false, errors: [{ message: 'Invalid section' }] })\n      }\n      return this.send(res, { success: false, errors: [{ message: 'Invalid section' }] })\n    }\n    await this.processUploads(section, actionCfg, req)\n    const val = await this.validateIfNeeded(actionCfg, req, res, true)\n    const combinedErrors = [ ...(((req as any)._fileValidationErrors as any[]) || []), ...(val.valid ? [] : val.errors) ]\n    if (combinedErrors.length) {\n      const throwOn = CrudmanRegistry.get().getThrowOnError()\n      if (throwOn) {\n        const { BadRequestException } = require('@nestjs/common')\n        throw new BadRequestException({ success: false, errors: combinedErrors })\n      }\n      try { if (res?.status) res.status(400) } catch {}\n      return this.send(res, this.getResponseFormatter()({ action: 'update', payload: null, errors: combinedErrors, success: false, meta: {}, req, res }))\n    }\n    const ctx = await this.buildHookContext(section, 'update', actionCfg, req, res)\n    try { if (ctx.dataSource) CrudmanRegistry.get().setDataSource(ctx.dataSource) } catch {}\n    const beforeAction = await this.applyHooks(actionCfg, 'onBeforeAction', req, res, ctx)\n    if (beforeAction === false) return\n    const saved = await orm.update(req, { ...actionCfg, service: this, _ctx: ctx })\n    this.invalidateSection(section)\n    const body = this.getResponseFormatter()({ action: 'update', payload: saved, errors: [], success: true, meta: {}, req, res })\n    const extra = await this.computeAdditionalResponse(section, 'update', actionCfg, body, req, res)\n    if (extra) (body as any).meta = { ...(body as any).meta, ...(extra || {}) }\n    await this.applyHooks(actionCfg, 'onAfterAction', body, req, ctx)\n    return this.send(res, body)\n  }\n\n  async save(section: string, req: any, res: any) {\n    const actionCfg = this.getActionCfg(section, 'save')\n    const orm = this.getOrm(actionCfg)\n    if (!orm) return this.send(res, { success: false, errors: [{ message: 'Invalid section' }] })\n    await this.processUploads(section, actionCfg, req)\n    const isUpdate = !!(req.params?.id || req.body?.id)\n    const val = await this.validateIfNeeded(actionCfg, req, res, isUpdate)\n    const combinedErrors = [ ...(((req as any)._fileValidationErrors as any[]) || []), ...(val.valid ? [] : val.errors) ]\n    if (combinedErrors.length) {\n      const throwOn = CrudmanRegistry.get().getThrowOnError()\n      if (throwOn) {\n        const { BadRequestException } = require('@nestjs/common')\n        throw new BadRequestException({ success: false, errors: combinedErrors })\n      }\n      try { if (res?.status) res.status(400) } catch {}\n      return this.send(res, this.getResponseFormatter()({ action: 'save', payload: null, errors: combinedErrors, success: false, meta: {}, req, res }))\n    }\n    const ctx = await this.buildHookContext(section, 'save', actionCfg, req, res)\n    try { if (ctx.dataSource) CrudmanRegistry.get().setDataSource(ctx.dataSource) } catch {}\n    const beforeAction = await this.applyHooks(actionCfg, 'onBeforeAction', req, res, ctx)\n    if (beforeAction === false) return\n    const saved = orm.save ? await orm.save(req, { ...actionCfg, service: this, _ctx: ctx }) : (isUpdate ? await orm.update(req, { ...actionCfg, service: this, _ctx: ctx }) : await orm.create(req, { ...actionCfg, service: this, _ctx: ctx }))\n    this.invalidateSection(section)\n    const body = this.getResponseFormatter()({ action: 'save', payload: saved, errors: [], success: true, meta: {}, req, res })\n    const extra = await this.computeAdditionalResponse(section, 'save', actionCfg, body, req, res)\n    if (extra) (body as any).meta = { ...(body as any).meta, ...(extra || {}) }\n    await this.applyHooks(actionCfg, 'onAfterAction', body, req, ctx)\n    return this.send(res, body)\n  }\n\n  async delete(section: string, req: any, res: any) {\n    const actionCfg = this.getActionCfg(section, 'delete')\n    const orm = this.getOrm(actionCfg)\n    if (!orm) return this.send(res, { success: false, errors: [{ message: 'Invalid section' }] })\n    const ctx = await this.buildHookContext(section, 'delete', actionCfg, req, res)\n    try { if (ctx.dataSource) CrudmanRegistry.get().setDataSource(ctx.dataSource) } catch {}\n    const beforeAction = await this.applyHooks(actionCfg, 'onBeforeAction', req, res, ctx)\n    if (beforeAction === false) return\n    await orm.delete(req, { ...actionCfg, service: this, _ctx: ctx })\n    this.invalidateSection(section)\n    const body = this.getResponseFormatter()({ action: 'delete', payload: { message: 'Successfully deleted' }, errors: [], success: true, meta: {}, req, res })\n    await this.applyHooks(actionCfg, 'onAfterAction', body, req, ctx)\n    return this.send(res, body)\n  }\n\n  private invalidateSection(section: string) {\n    const cache = CrudmanRegistry.get().getCache()\n    const opts = CrudmanRegistry.get().getOptions()\n    if (!cache || !opts.cache?.invalidateListsOnWrite) return\n    // naive approach: flush all section list keys by flushing all (node-cache has no namespace)\n    cache.flush && cache.flush()\n  }\n\n  async callAction(section: string, action: 'list'|'details'|'create'|'update'|'save'|'delete', req: any, res: any, isResponseToBeSent = false): Promise<{ statusCode: number; data: any; headers?: Record<string, any> }> {\n    const originalRes = res\n    const capture = createResponseCapture(originalRes, isResponseToBeSent)\n    let data: any\n    switch (action) {\n      case 'list': data = await this.list(section, req, capture); break\n      case 'details': data = await this.details(section, req, capture); break\n      case 'create': data = await this.create(section, req, capture); break\n      case 'update': data = await this.update(section, req, capture); break\n      case 'save': data = await this.save(section, req, capture); break\n      case 'delete': data = await this.delete(section, req, capture); break\n      default: data = { success: false, errors: [{ message: 'Invalid action'}] }\n    }\n    // If the action didn't call res.send, fallback to returned data\n    if (!capture.headersSent && data !== undefined) capture.send(data)\n    return { statusCode: capture.statusCode, data: capture.getResponse(), headers: capture.headers }\n  }\n}\n\nfunction createResponseCapture(originalRes: any, passThrough: boolean) {\n  const headers: Record<string, any> = {}\n  const capture: any = {\n    headersSent: false,\n    statusCode: 200,\n    headers,\n    setHeader: (k: string, v: any) => { headers[k.toLowerCase()] = v; if (passThrough && originalRes?.setHeader) originalRes.setHeader(k, v) },\n    status: function (code: number) { this.statusCode = code; if (passThrough && originalRes?.status) originalRes.status(code); return this },\n    getResponse: () => capture._data,\n    send: (body: any) => {\n      capture._data = body\n      capture.headersSent = true\n      if (passThrough && originalRes && typeof originalRes.send === 'function') originalRes.send(body)\n      return capture\n    }\n  }\n  return capture\n}\n\n \n","import { promises as fs, createWriteStream } from 'fs'\nimport * as path from 'path'\nimport { randomUUID } from 'crypto'\nimport { FileStorageAdapter, FileStorageSaveInput, FileStorageSaveResult } from '../types/Upload'\n\nexport interface LocalDiskOptions {\n  dest: string\n  publicBaseUrl?: string\n}\n\nexport class LocalDiskAdapter implements FileStorageAdapter {\n  private opts: LocalDiskOptions\n  constructor(opts: LocalDiskOptions) { this.opts = opts }\n\n  async save(input: FileStorageSaveInput): Promise<FileStorageSaveResult> {\n    const id = randomUUID()\n    const ext = input.filename ? path.extname(input.filename) : ''\n    const diskKey = path.join(this.opts.dest, id + ext)\n    const abs = path.isAbsolute(diskKey) ? diskKey : path.join(process.cwd(), diskKey)\n    await fs.mkdir(path.dirname(abs), { recursive: true })\n    if (input.buffer) {\n      await fs.writeFile(abs, input.buffer)\n    } else if (input.base64) {\n      await fs.writeFile(abs, Buffer.from(stripDataUrl(input.base64), 'base64'))\n    } else if (input.stream) {\n      await new Promise<void>((resolve, reject) => {\n        const ws = createWriteStream(abs)\n        input.stream!.once('error', reject)\n        ws.once('error', reject)\n        ws.once('finish', () => resolve())\n        input.stream!.pipe(ws)\n      })\n    } else {\n      throw new Error('LocalDiskAdapter.save requires buffer, base64 or stream')\n    }\n    const relKey = path.relative(this.opts.dest, diskKey).replace(/^\\.*\\//, '').replace(/\\\\/g, '/')\n    const url = this.opts.publicBaseUrl ? joinUrl(this.opts.publicBaseUrl, relKey) : undefined\n    return { key: relKey, url, mime: input.mime, size: input.buffer?.length }\n  }\n\n  async delete(key: string): Promise<void> {\n    const abs = path.isAbsolute(key) ? key : path.join(process.cwd(), this.opts.dest, key)\n    try { await fs.unlink(abs) } catch {}\n  }\n\n  getUrl(key: string): string {\n    if (this.opts.publicBaseUrl) {\n      const rel = key.replace(/^\\.*\\//, '').replace(/\\\\/g, '/')\n      return joinUrl(this.opts.publicBaseUrl, rel)\n    }\n    return key\n  }\n}\n\nfunction stripDataUrl(s: string): string {\n  const i = s.indexOf('base64,')\n  return i >= 0 ? s.slice(i + 7) : s\n}\n\nfunction joinUrl(a: string, b: string): string {\n  if (!a.endsWith('/')) a += '/'\n  return a + b.replace(/^\\//, '')\n}\n\n\n","function escapeCsvValue(value: any): string {\n  if (value === null || value === undefined) return ''\n  const s = String(value)\n  if (/[\",\\n]/.test(s)) return '\"' + s.replace(/\"/g, '\"\"') + '\"'\n  return s\n}\n\nfunction flattenObject(input: any, depth = 1, prefix = ''): Record<string, any> {\n  if (!input || typeof input !== 'object') return { [prefix || 'value']: input }\n  const out: Record<string, any> = {}\n  for (const [k, v] of Object.entries(input)) {\n    const key = prefix ? `${prefix}.${k}` : k\n    if (v && typeof v === 'object' && depth > 0) {\n      Object.assign(out, flattenObject(v, depth - 1, key))\n    } else {\n      out[key] = v\n    }\n  }\n  return out\n}\n\nexport function toCsvFromArray(items: any[], options?: { flattenDepth?: 1 | 2 | 0 }): string {\n  const depth = options?.flattenDepth ?? 1\n  const flatItems = items.map((i) => flattenObject(i, depth))\n  const headersSet = new Set<string>()\n  for (const it of flatItems) Object.keys(it).forEach((h) => headersSet.add(h))\n  const headers = Array.from(headersSet)\n  const lines: string[] = []\n  lines.push(headers.map(escapeCsvValue).join(','))\n  for (const it of flatItems) {\n    lines.push(headers.map((h) => escapeCsvValue((it as any)[h])).join(','))\n  }\n  return lines.join('\\n')\n}\n\nexport function toCsvFromObject(obj: any, options?: { flattenDepth?: 1 | 2 | 0 }): string {\n  return toCsvFromArray([obj], options)\n}\n\nexport function parseCsv(text: string): Array<Record<string, string>> {\n  const lines = text.split(/\\r?\\n/).filter((l) => l.trim().length > 0)\n  if (!lines.length) return []\n  const parseLine = (line: string): string[] => {\n    const out: string[] = []\n    let cur = ''\n    let inQuotes = false\n    for (let i = 0; i < line.length; i++) {\n      const ch = line[i]\n      if (inQuotes) {\n        if (ch === '\"') {\n          if (line[i + 1] === '\"') { cur += '\"'; i++ } else { inQuotes = false }\n        } else cur += ch\n      } else {\n        if (ch === '\"') inQuotes = true\n        else if (ch === ',') { out.push(cur); cur = '' }\n        else cur += ch\n      }\n    }\n    out.push(cur)\n    return out\n  }\n  const headers = parseLine(lines[0]).map((h) => h.trim())\n  const rows: Array<Record<string, string>> = []\n  for (let i = 1; i < lines.length; i++) {\n    const cols = parseLine(lines[i])\n    const row: Record<string, string> = {}\n    headers.forEach((h, idx) => { row[h] = (cols[idx] ?? '').trim() })\n    rows.push(row)\n  }\n  return rows\n}\n\n\n","import { ResponseFormatter } from '../types/ResponseEnvelope'\n\nexport const defaultResponseFormatter: ResponseFormatter = ({ action, payload, errors, success, meta }) => {\n  if (action === 'list') {\n    return {\n      data: payload?.items || [],\n      errors: errors || [],\n      success: success !== false,\n      pagination: meta?.pagination || {\n        page: 1,\n        perPage: 0,\n        totalItemsCount: 0,\n        totalPagesCount: 0,\n        isHavingNextPage: false,\n        isHavingPreviousPage: false\n      },\n      filters: meta?.filters || [],\n      sorting: meta?.sorting || [],\n      meta: meta?.extra || meta?.meta\n    }\n  }\n  return {\n    data: payload || null,\n    errors: errors || [],\n    success: success !== false,\n    meta: meta?.extra || meta?.meta\n  }\n}\n\n\n","import { CrudmanRegistry } from './CrudmanRegistry'\n\nexport function setCrudmanDataSource(dataSource: any) {\n  CrudmanRegistry.get().setDataSource(dataSource)\n}\n\nexport function getCrudmanDataSource() {\n  return CrudmanRegistry.get().getDataSource()\n}\n\n\n","import 'reflect-metadata'\nimport { applyDecorators, Get, Post, Put, Patch, Delete, SetMetadata, HttpCode } from '@nestjs/common'\nimport { ApiOperation, ApiParam, ApiOkResponse, ApiBody } from '../utils/safeSwagger'\nimport { TypeormAdapter } from '../adapters/typeorm.adapter'\nimport { CrudmanRegistry } from '../module/CrudmanRegistry'\n\nconst CRD_META = 'crudman:meta'\n\nexport const UseCrud = (config: any, options?: any): ClassDecorator => {\n  return (target: any) => {\n    const opts = { defaultOrm: TypeormAdapter, ...(options || {}) }\n    const existing = (global as any).__crudman_global_meta || { config: { sections: {} }, options: {} }\n    // Shorthand: models → sections\n    const shorthandToSections = (): Record<string, any> => {\n      const out: Record<string, any> = {}\n      const models = config?.models\n      const shared = config?.defaults || {}\n      const toPlural = (s: string) => {\n        const lower = String(s || '').toLowerCase()\n        if (/(s|x|z|ch|sh)$/.test(lower)) return lower + 'es'\n        if (/y$/.test(lower) && !/[aeiou]y$/.test(lower)) return lower.replace(/y$/, 'ies')\n        return lower + 's'\n      }\n      const apply = (model: any, overrides?: any) => {\n        const name = model?.name || model?.model?.name || 'resource'\n        const section = overrides?.section || toPlural(name)\n        out[section] = { model, ...shared, ...(overrides || {}) }\n      }\n      if (!models) return out\n      if (Array.isArray(models)) {\n        for (const m of models) {\n          if (Array.isArray(m)) apply(m[0], m[1] || {})\n          else apply(m)\n        }\n      } else if (typeof models === 'object') {\n        for (const key of Object.keys(models)) apply({ name: key }, models[key])\n      }\n      return out\n    }\n    // Deep merge sections to avoid overwriting existing detailed configurations with empty objects\n    const deepMergeSections = (existing: any, incoming: any) => {\n      const result = { ...existing }\n      for (const [key, value] of Object.entries(incoming || {})) {\n        if (value && typeof value === 'object' && !Array.isArray(value)) {\n          // If the incoming value is an object (not empty), merge it\n          if (Object.keys(value).length > 0) {\n            result[key] = { ...(result[key] || {}), ...value }\n          }\n          // If it's an empty object, don't overwrite existing configuration\n        } else {\n          result[key] = value\n        }\n      }\n      return result\n    }\n    \n    const mergedSections = deepMergeSections(existing.config?.sections || {}, { ...(config?.sections || {}), ...shorthandToSections() })\n    const mergedConfig = { ...existing.config, ...config, sections: mergedSections }\n    const mergedOptions = { ...existing.options, ...opts }\n    const meta = { config: mergedConfig, options: mergedOptions }\n    Reflect.defineMetadata(CRD_META, meta, target)\n    ;(global as any).__crudman_global_meta = meta\n  }\n}\n\nexport const CrudList = (section: string, opts?: any) => applyDecorators(\n  SetMetadata('crudman:action', { section, action: 'list', opts }),\n  ApiOperation({ summary: `${section}: list` }),\n  ApiOkResponse({ description: 'List response' }),\n  Get()\n)\nexport const CrudDetails = (section: string, opts?: any) => applyDecorators(\n  SetMetadata('crudman:action', { section, action: 'details', opts }),\n  ApiOperation({ summary: `${section}: details` }),\n  ApiParam({ name: 'id', required: true }),\n  ApiOkResponse({ description: 'Details response' }),\n  Get(':id')\n)\nexport const CrudCreate = (section: string, opts?: any) => applyDecorators(\n  SetMetadata('crudman:action', { section, action: 'create', opts }),\n  ApiOperation({ summary: `${section}: create` }),\n  ApiOkResponse({ description: 'Create response' }),\n  Post(),\n  HttpCode(200)\n)\nexport const CrudUpdate = (section: string, opts?: any) => {\n  const method = CrudmanRegistry.get().getUpdateMethod()\n  const verbDecorator = method === 'patch' ? Patch(':id') : Put(':id')\n  return applyDecorators(\n    SetMetadata('crudman:action', { section, action: 'update', opts }),\n    ApiOperation({ summary: `${section}: update` }),\n    ApiParam({ name: 'id', required: true }),\n    ApiOkResponse({ description: 'Update response' }),\n    verbDecorator\n  )\n}\nexport const CrudDelete = (section: string, opts?: any) => applyDecorators(\n  SetMetadata('crudman:action', { section, action: 'delete', opts }),\n  ApiOperation({ summary: `${section}: delete` }),\n  ApiParam({ name: 'id', required: true }),\n  ApiOkResponse({ description: 'Delete response' }),\n  Delete(':id')\n)\nexport const CrudSave = (section: string, opts?: any) => applyDecorators(\n  SetMetadata('crudman:action', { section, action: 'save', opts }),\n  ApiOperation({ summary: `${section}: save (upsert)` }),\n  ApiOkResponse({ description: 'Save response' }),\n  Post(),\n  HttpCode(200)\n)\n\nexport const getCrudMeta = (target: any) => Reflect.getMetadata(CRD_META, target.constructor || target)\n\n// Bulk operations\nexport const CrudBulkImport = (section: string, opts?: any) => applyDecorators(\n  SetMetadata('crudman:action', { section, action: 'bulkImport', opts }),\n  ApiOperation({ summary: `${section}: bulk import` }),\n  ApiBody({ description: 'Array of JSON records or CSV text when x-content-type=csv', required: true }),\n  ApiOkResponse({ description: 'Bulk import summary' }),\n  Post('bulk/import'),\n  HttpCode(200)\n)\n\nexport const CrudBulkDelete = (section: string, opts?: any) => applyDecorators(\n  SetMetadata('crudman:action', { section, action: 'bulkDelete', opts }),\n  ApiOperation({ summary: `${section}: bulk delete` }),\n  ApiBody({ description: 'Body: { ids: [] } or CSV when x-content-type=csv', required: true }),\n  ApiOkResponse({ description: 'Bulk delete summary' }),\n  Post('bulk/delete'),\n  HttpCode(200)\n)\n\n\n","type AnyDecorator = (...args: any[]) => any\n\nfunction noOp(): AnyDecorator { return () => () => {} }\n\nfunction getSwagger(): any | null {\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-var-requires\n    return require('@nestjs/swagger')\n  } catch {\n    return null\n  }\n}\n\nconst swagger = getSwagger()\n\nexport const ApiOperation: AnyDecorator = swagger?.ApiOperation || noOp()\nexport const ApiParam: AnyDecorator = swagger?.ApiParam || noOp()\nexport const ApiBody: AnyDecorator = swagger?.ApiBody || noOp()\nexport const ApiOkResponse: AnyDecorator = swagger?.ApiOkResponse || noOp()\nexport const ApiTags: AnyDecorator = swagger?.ApiTags || noOp()\nexport const ApiQuery: AnyDecorator = swagger?.ApiQuery || noOp()\nexport const ApiHeader: AnyDecorator = swagger?.ApiHeader || noOp()\n\n\n\n","import { FilterItem } from '../types/Filters'\nimport { SortItem } from '../types/Sorting'\nimport { PaginationInfo } from '../types/Pagination'\n\nconst toCamel = (s: string) => s.replace(/[_-](\\w)/g, (_, c) => c.toUpperCase())\nconst normalizeKeysCamel = (obj: any): any => {\n  if (!obj || typeof obj !== 'object') return obj\n  const out: any = {}\n  for (const k of Object.keys(obj)) {\n    out[toCamel(k)] = obj[k]\n  }\n  return out\n}\n\nexport const parsePagination = (\n  rawQuery: any,\n  names?: { page?: string; perPage?: string; paginate?: string },\n  opts?: { isPaginationEnabled?: boolean; allowDisable?: boolean; defaultEnabled?: boolean; maxPerPage?: number },\n  defaults: { page?: number; perPage?: number } = {}\n): { info: PaginationInfo; skip?: number; take?: number; disabled: boolean } => {\n  const raw = rawQuery || {}\n  const query = normalizeKeysCamel(raw)\n  const pageKey = (names && names.page) || 'page'\n  const perPageKey = (names && names.perPage) || 'perPage'\n  const paginateKey = (names && names.paginate) || 'paginate'\n  const enabled = opts?.isPaginationEnabled !== undefined ? opts.isPaginationEnabled : true\n  let disabled = false\n  let page = Math.max(1, parseInt(query[pageKey] ?? String(defaults.page ?? 1), 10) || 1)\n  let perPage = Math.max(1, parseInt(query[perPageKey] ?? String(defaults.perPage ?? 30), 10) || 30)\n\n  // Allow disabling via query\n  const pagVal = String(query[paginateKey] ?? '').toLowerCase()\n  const isDisableFlag = pagVal === 'false' || pagVal === '0' || pagVal === 'no'\n  const isPerPageZero = String(query[perPageKey] ?? '').toLowerCase() === '0'\n  if (opts?.isDisableAllowed !== false && (isDisableFlag || isPerPageZero)) disabled = true\n\n  if (opts?.maxPerPage && perPage > opts.maxPerPage) perPage = opts.maxPerPage\n  const defaultEnabled = opts?.isDefaultEnabled !== undefined ? opts.isDefaultEnabled : true\n  if (!enabled) disabled = true\n  if (enabled && !defaultEnabled && query[pageKey] === undefined && query[perPageKey] === undefined) disabled = true\n\n  const info: PaginationInfo = {\n    page,\n    perPage,\n    totalItemsCount: 0,\n    totalPagesCount: 0,\n    isHavingNextPage: false,\n    isHavingPreviousPage: page > 1\n  }\n  if (disabled) return { info, disabled }\n  const skip = (page - 1) * perPage\n  const take = perPage\n  return { info, skip, take, disabled: false }\n}\n\nexport const parseSorting = (rawQuery: any, whitelist: string[] = [], sortPrefix = 'sort.'): SortItem[] => {\n  const query = normalizeKeysCamel(rawQuery || {})\n  const result: SortItem[] = []\n  for (const key in query) {\n    if (!key.startsWith(sortPrefix)) continue\n    const field = key.replace(sortPrefix, '')\n    if (whitelist.length && !whitelist.includes(field)) continue\n    const raw = String(query[key] || 'desc').toLowerCase()\n    const order = raw === 'asc' ? 'ASC' : 'DESC'\n    result.push({ field, order })\n  }\n  return result\n}\n\nconst numericOps = ['min', 'max', 'gt', 'lt'] as const\ntype NumericOp = typeof numericOps[number]\n\nexport const parseFilters = (\n  rawQuery: any,\n  whitelist: string[] = [],\n  ops: { minOp: string; maxOp: string; gtOp: string; ltOp: string; betweenOp: string; likeOp: string } = { minOp: 'min', maxOp: 'max', gtOp: 'gt', ltOp: 'lt', betweenOp: 'between', likeOp: 'like' }\n): { where: Record<string, any>; filters: FilterItem[] } => {\n  const query = normalizeKeysCamel(rawQuery || {})\n  const where: Record<string, any> = {}\n  const filters: FilterItem[] = []\n  for (const key in query) {\n    const val = query[key]\n    if (val === undefined || val === null || String(val) === '') continue\n    const parts = key.split('.')\n    const field = parts[0]\n    const op = parts[1]\n    if (whitelist.length && !whitelist.includes(field)) continue\n    if (!op) {\n      where[field] = val\n      filters.push({ field, op: 'eq', value: val, param: `${field}` })\n      continue\n    }\n    const numericOpsConfigured = [ops.minOp, ops.maxOp, ops.gtOp, ops.ltOp]\n    if (numericOpsConfigured.includes(op)) {\n      where[field] = where[field] || {}\n      const n = Number(val)\n      if (!Number.isNaN(n)) {\n        const mapAny: Record<string, string> = {\n          [ops.minOp]: 'gte',\n          [ops.maxOp]: 'lte',\n          [ops.gtOp]: 'gt',\n          [ops.ltOp]: 'lt'\n        }\n        where[field][mapAny[op]] = n\n        filters.push({ field, op: mapAny[op], value: n, param: `${field}.${op}` })\n      }\n      continue\n    }\n    if (op === ops.betweenOp) {\n      const [start, end] = String(val).split(',')\n      where[field] = { between: [start, end] }\n      filters.push({ field, op: 'between', value: [start, end], param: `${field}.${op}` })\n      continue\n    }\n    if (op === ops.likeOp) {\n      where[field] = { like: String(val) }\n      filters.push({ field, op: 'like', value: String(val), param: `${field}.${op}` })\n      continue\n    }\n  }\n  return { where, filters }\n}\n\n\n","import { parseFilters, parsePagination, parseSorting } from '../query/query-utils'\nimport { OrmAdapter } from '../types/OrmAdapter'\nimport { Not } from 'typeorm'\n\n// This adapter expects the consumer app to inject repositories via config.additionalSettings.repo\n// It operates on a minimal repository interface: find, findOne, save, update, delete, count, createQueryBuilder\n\nfunction resolveRepository(cfg: any): any {\n  const hasRepoBasics = (r: any) => r && typeof r.find === 'function' && (typeof r.findAndCount === 'function' || typeof r.findOne === 'function')\n  // 1) Prefer ctx.repository if present (trust the provided instance)\n  const ctxRepo = (cfg as any)._ctx?.repository\n  if (ctxRepo) return ctxRepo\n  // 2) Evaluate additionalSettings.repo (function or object) and trust if provided\n  let repo = cfg?.additionalSettings?.repo\n  if (typeof repo === 'function') {\n    try { repo = (repo as any)(cfg, (cfg as any)._ctx) } catch { repo = undefined }\n  }\n  if (repo) return repo\n  // 3) Derive from any available DataSource\n  const ctxDs = (cfg as any)._ctx?.dataSource\n  let ds = ctxDs || ((cfg.service && (cfg.service as any).getDataSource?.()) || undefined)\n  if (!ds) {\n    try {\n      const mr = (cfg as any)._ctx?.moduleRef\n      if (mr) ds = mr.get('DataSource', { strict: false }) || mr.get((require('typeorm') as any).DataSource, { strict: false })\n    } catch {}\n  }\n  const regDs = (require('../module/CrudmanRegistry') as any).CrudmanRegistry.get().getDataSource()\n  const dataSource = ds || regDs\n  if (dataSource) {\n    try { repo = dataSource.getRepository(cfg.model) } catch (err) { throw err }\n  }\n  return repo\n}\n\nexport const TypeormAdapter: OrmAdapter = {\n  async list(req, cfg) {\n    let repo = resolveRepository(cfg)\n    if (!repo) {\n      const dbg = {\n        hasCtx: !!(cfg as any)._ctx,\n        hasCtxRepo: !!((cfg as any)._ctx?.repository),\n        hasAddRepo: !!(cfg?.additionalSettings?.repo),\n        model: !!cfg?.model,\n        hasCtxDs: !!((cfg as any)._ctx?.dataSource),\n        hasRegDs: !!(require('../module/CrudmanRegistry').CrudmanRegistry.get().getDataSource())\n      }\n      throw new Error('RepoMissing-X ' + JSON.stringify(dbg))\n    }\n    const qn = cfg.queryParamNames || {}\n    const pageNames = { page: qn.page || 'page', perPage: qn.perPage || 'perPage', paginate: qn.paginate || 'paginate' }\n    const pagOpts = cfg.pagination || {}\n    const { info: paginationInfo, skip, take, disabled: paginationDisabled } = parsePagination(req.query, pageNames, pagOpts)\n    // If no whitelist provided, default to all entity columns (safe model-scoped default)\n    const repoColumns: string[] = Array.isArray(repo?.metadata?.columns)\n      ? repo.metadata.columns.map((c: any) => c.propertyName)\n      : []\n    const effectiveWhitelist: string[] = (cfg.filtersWhitelist && cfg.filtersWhitelist.length)\n      ? cfg.filtersWhitelist\n      : repoColumns\n    const sortingRequested = parseSorting(req.query, effectiveWhitelist, qn.sortPrefix || 'sort.')\n    // Default sort: createdAt DESC if present, else primary key DESC (fallback to id)\n    const hasCreatedAt = repoColumns.includes('createdAt')\n    const primaryField = Array.isArray((repo as any)?.metadata?.primaryColumns) && (repo as any).metadata.primaryColumns[0]\n      ? (repo as any).metadata.primaryColumns[0].propertyName\n      : 'id'\n    const effectiveSorting = sortingRequested.length\n      ? sortingRequested\n      : (\n        hasCreatedAt\n          ? (\n            primaryField && primaryField !== 'createdAt'\n              ? [ { field: 'createdAt', order: 'DESC' as const }, { field: primaryField, order: 'DESC' as const } ]\n              : [ { field: 'createdAt', order: 'DESC' as const } ]\n          )\n          : [ { field: primaryField, order: 'DESC' as const } ]\n      )\n    const { where, filters } = parseFilters(req.query, effectiveWhitelist, {\n      minOp: qn.minOp || 'min',\n      maxOp: qn.maxOp || 'max',\n      gtOp: qn.gtOp || 'gt',\n      ltOp: qn.ltOp || 'lt',\n      betweenOp: qn.betweenOp || 'between',\n      likeOp: qn.likeOp || 'like'\n    })\n\n    // Keyword search\n    const keywordParam = (qn.keyword || cfg.keywordParamName || 'keyword')\n    const kwRaw = (req.query ? req.query[keywordParam] : undefined) as string | undefined\n    const kwCfg = cfg.keyword || {}\n    const kwEnabled = kwCfg.isEnabled !== false\n    const kwMin = kwCfg.minLength ?? 2\n    const kwCaseSensitive = kwCfg.isCaseSensitive === true\n    const kw = (typeof kwRaw === 'string' ? kwRaw.trim() : '')\n    let keywordWhereOr: any[] = []\n    let requiredRelations: string[] = []\n    if (kwEnabled && kw && kw.length >= kwMin) {\n      const paths: string[] = Array.isArray(kwCfg.searchableFields) && kwCfg.searchableFields.length\n        ? kwCfg.searchableFields\n        : repoColumns\n      const maxDepth = kwCfg.maxRelationDepth ?? 1\n      const likeValue = `%${kw}%`\n\n      // Build OR conditions for each path\n      for (const path of paths) {\n        const segments = String(path).split('.')\n        if (!segments.length || segments.length > 3) continue\n        if (segments.length === 1) {\n          const col = segments[0]\n          if (!repoColumns.includes(col)) continue\n          keywordWhereOr.push(buildLikeCondition('root', col, likeValue, kwCaseSensitive))\n        } else {\n          // nested: relation[.relation].column\n          if (segments.length - 1 > maxDepth) continue\n          const column = segments.pop() as string\n          const relationPath = segments.join('.')\n          requiredRelations.push(relationPath)\n          keywordWhereOr.push(buildLikeCondition(relationPath, column, likeValue, kwCaseSensitive))\n        }\n      }\n    }\n\n    // Merge relations (existing + required by keyword nested paths)\n    const relationsBaseRaw = cfg.getRelations ? await cfg.getRelations(req, null, cfg) : (cfg.relations || undefined)\n    const relations = resolveRelations(repo, relationsBaseRaw, requiredRelations)\n\n    // Combine where with keyword OR block\n    let whereFinal: any = where\n    if (keywordWhereOr.length) {\n      // AND existing where with (OR keyword...) semantics; using a structure our helper understands later\n      whereFinal = { AND: [ where || {}, { OR: keywordWhereOr } ] }\n    }\n\n    const hasLikeFilter = filters.some((f) => f.op === 'like')\n    const hasRangeFilter = filters.some((f) => f.op === 'gte' || f.op === 'lte' || f.op === 'gt' || f.op === 'lt' || f.op === 'between')\n    let findOptions: any = { where: convertToTypeormWhere(whereFinal), relations, order: toTypeormOrder(effectiveSorting), skip, take, select: normalizeSelect(cfg.attributes, repo) }\n    if (cfg.onBeforeQuery) {\n      const mod = await cfg.onBeforeQuery(findOptions, cfg.model, (cfg as any)._ctx, req, null)\n      if (mod) findOptions = mod\n    }\n    let items: any[] = []\n    let total = 0\n    if (hasLikeFilter || hasRangeFilter) {\n      // Use QueryBuilder for robust LIKE behavior across drivers\n      const qb = repo.createQueryBuilder('t')\n      // Ensure default relations are included (left join + select) when using QB path\n      const relsForJoin: string[] = Array.isArray(relations) ? relations : []\n      if (relsForJoin.length) joinRelationsIntoQueryBuilder(qb, relsForJoin)\n      // Apply simple filters\n      for (const f of filters) {\n        if (f.op === 'like') {\n          const param = `%${String(f.value)}%`.toLowerCase()\n          qb.andWhere(`LOWER(t.${f.field}) LIKE :p_${f.field}`, { [`p_${f.field}`]: param })\n        } else if (f.op === 'eq') {\n          qb.andWhere(`t.${f.field} = :p_${f.field}`, { [`p_${f.field}`]: f.value })\n        } else if (f.op === 'between' && Array.isArray(f.value)) {\n          qb.andWhere(`t.${f.field} BETWEEN :p_${f.field}_a AND :p_${f.field}_b`, { [`p_${f.field}_a`]: f.value[0], [`p_${f.field}_b`]: f.value[1] })\n        } else if (f.op === 'gte') {\n          qb.andWhere(`t.${f.field} >= :p_${f.field}`, { [`p_${f.field}`]: f.value })\n        } else if (f.op === 'lte') {\n          qb.andWhere(`t.${f.field} <= :p_${f.field}`, { [`p_${f.field}`]: f.value })\n        } else if (f.op === 'gt') {\n          qb.andWhere(`t.${f.field} > :p_${f.field}`, { [`p_${f.field}`]: f.value })\n        } else if (f.op === 'lt') {\n          qb.andWhere(`t.${f.field} < :p_${f.field}`, { [`p_${f.field}`]: f.value })\n        }\n      }\n      // Sorting (apply default when none specified)\n      for (const s of effectiveSorting) {\n        qb.addOrderBy(`t.${s.field}`, s.order as any)\n      }\n      // Pagination\n      if (!paginationDisabled) {\n        if (typeof skip === 'number') qb.skip(skip)\n        if (typeof take === 'number') qb.take(take)\n      }\n      const resQB = await qb.getManyAndCount()\n      items = resQB[0]; total = resQB[1]\n      if (paginationDisabled) {\n        paginationInfo.page = 1\n        paginationInfo.perPage = items.length\n        paginationInfo.totalItemsCount = total\n        paginationInfo.totalPagesCount = 1\n        paginationInfo.isHavingNextPage = false\n        paginationInfo.isHavingPreviousPage = false\n      } else {\n        const totalPagesCount = take ? Math.ceil(total / take) : 0\n        paginationInfo.totalItemsCount = total\n        paginationInfo.totalPagesCount = totalPagesCount\n        paginationInfo.isHavingNextPage = take ? paginationInfo.page < totalPagesCount : false\n      }\n    } else {\n      if (paginationDisabled) {\n        items = await repo.find({ where: findOptions.where, relations: findOptions.relations, order: findOptions.order, select: findOptions.select })\n        total = items.length\n        paginationInfo.page = 1\n        paginationInfo.perPage = items.length\n        paginationInfo.totalItemsCount = total\n        paginationInfo.totalPagesCount = 1\n        paginationInfo.isHavingNextPage = false\n        paginationInfo.isHavingPreviousPage = false\n      } else {\n        const res = await repo.findAndCount(findOptions)\n        items = res[0]; total = res[1]\n        const totalPagesCount = take ? Math.ceil(total / take) : 0\n        paginationInfo.totalItemsCount = total\n        paginationInfo.totalPagesCount = totalPagesCount\n        paginationInfo.isHavingNextPage = take ? paginationInfo.page < totalPagesCount : false\n      }\n    }\n    if (cfg.onAfterFetch) {\n      const mod = await cfg.onAfterFetch(items, req, (cfg as any)._ctx, null)\n      if (mod) items = mod\n    }\n\n    return { items, pagination: paginationInfo, filters, sorting: effectiveSorting }\n  },\n\n  async details(req, cfg) {\n    const repo = resolveRepository(cfg)\n    if (!repo) throw new Error('Repository not provided (additionalSettings.repo or module dataSource needed)')\n    const field = cfg.recordSelectionField || 'id'\n    const value = (req.params && (req.params[field] ?? req.params.id ?? Object.values(req.params)[0]))\n    const relationsBaseRaw = cfg.getRelations ? await cfg.getRelations(req, null, cfg) : (cfg.relations || undefined)\n    const relations = resolveRelations(repo, relationsBaseRaw, [])\n    let findOptions: any = { where: { [field]: castId(value) } as any, relations, select: normalizeSelect(cfg.attributes, repo) }\n    if (cfg.onBeforeQuery) {\n      const mod = await cfg.onBeforeQuery(findOptions, cfg.model, (cfg as any)._ctx, req, null)\n      if (mod) findOptions = mod\n    }\n    let entity = await repo.findOne(findOptions)\n    if (cfg.onAfterFetch && entity) {\n      const mod = await cfg.onAfterFetch(entity, req, (cfg as any)._ctx, null)\n      if (mod) entity = mod\n    }\n    return entity\n  },\n\n  async create(req, cfg) {\n    const repo = resolveRepository(cfg)\n    if (!repo) throw new Error('Repository not provided (additionalSettings.repo or module dataSource needed)')\n    const input = this.normalizeInput(req.body, cfg.model)\n    const entity = repo.create ? repo.create(input) : input\n    return await repo.save(entity)\n  },\n\n  async update(req, cfg) {\n    const repo = resolveRepository(cfg)\n    if (!repo) throw new Error('Repository not provided (additionalSettings.repo or module dataSource needed)')\n    const field = cfg.recordSelectionField || 'id'\n    const rawParam = req.params && (req.params[field] ?? req.params.id ?? Object.values(req.params)[0])\n    const value = castId(rawParam ?? req.body[field])\n    const input = this.normalizeInput({ ...req.body }, cfg.model)\n    const updateKeys = Object.keys(input).filter((k) => k !== field)\n    if (updateKeys.length) {\n      try {\n        // Use QueryBuilder update with explicit where clause\n        const primary = (repo as any)?.metadata?.primaryColumns?.[0]?.propertyName || field\n        const qb = repo.createQueryBuilder()\n        await qb.update(cfg.model).set(input as any).where(`${primary} = :id`, { id: value }).execute()\n      } catch {\n        try {\n          // Prefer load-merge-save\n          const existing = await repo.findOne({ where: { [field]: value } as any })\n          if (existing) {\n            for (const k of updateKeys) (existing as any)[k] = (input as any)[k]\n            await repo.save(existing)\n          } else {\n            const toSave = repo.create({ [field]: value, ...input } as any)\n            await repo.save(toSave)\n          }\n        } catch {\n          await repo.update({ [field]: value } as any, input)\n        }\n      }\n    }\n    return await repo.findOne({ where: { [field]: value } as any })\n  },\n\n  async save(req, cfg) {\n    const field = cfg.recordSelectionField || 'id'\n    if (req.params[field] || req.body[field]) return this.update(req, cfg)\n    return this.create(req, cfg)\n  },\n\n  async delete(req, cfg) {\n    const repo = resolveRepository(cfg)\n    if (!repo) throw new Error('Repository not provided (additionalSettings.repo or module dataSource needed)')\n    const field = cfg.recordSelectionField || 'id'\n    const rawParam = req.params && (req.params[field] ?? req.params.id ?? Object.values(req.params)[0])\n    const value = castId(rawParam)\n    await repo.delete({ [field]: value } as any)\n  },\n\n  async exists(where, cfg) {\n    const repo = resolveRepository(cfg)\n    if (!repo) throw new Error('Repository not provided (additionalSettings.repo or module dataSource needed)')\n    const count = await repo.count({ where })\n    return count > 0\n  },\n\n  async findOne(where, options, cfg) {\n    const repo = resolveRepository(cfg)\n    if (!repo) throw new Error('Repository not provided (additionalSettings.repo or module dataSource needed)')\n    return await repo.findOne({ where, ...(options || {}) })\n  },\n\n  normalizeInput(input, _model) {\n    const out: any = { ...input }\n    for (const key in out) {\n      const val = out[key]\n      if (val instanceof Date) continue\n      if (typeof val === 'string') {\n        const d = new Date(val)\n        if (!Number.isNaN(d.getTime()) && /\\d{4}-\\d{2}-\\d{2}/.test(val)) out[key] = d\n      }\n    }\n    return out\n  },\n\n  buildUniquenessWhere(id, fields, values, type) {\n    let where: any\n    \n    if (fields.length === 1) {\n      // Single field - return direct condition\n      const field = fields[0]\n      where = { [field]: values[field] }\n    } else {\n      // Multiple fields - use AND/OR logic\n      if (type === 'and') {\n        // AND: combine all fields in single object\n        where = {}\n        fields.forEach((f: string) => {\n          where[f] = values[f]\n        })\n      } else {\n        // OR: array of objects, each with one field\n        where = fields.map((f: string) => ({ [f]: values[f] }))\n      }\n    }\n    \n    if (id !== undefined && id !== null) {\n      // Exclude current record by primary key for update paths\n      const primaryField = Array.isArray((this as any)?.metadata?.primaryColumns) && (this as any).metadata.primaryColumns[0]\n        ? (this as any).metadata.primaryColumns[0].propertyName\n        : 'id'\n      \n      // Add primary key condition to existing where\n      if (Array.isArray(where)) {\n        // OR case: add primary key condition to each clause\n        where = where.map(clause => ({\n          ...clause,\n          [primaryField]: Not(id)\n        }))\n      } else {\n        // AND case: add primary key condition to single object\n        where[primaryField] = Not(id)\n      }\n    }\n    console.log(\"Where is\", JSON.stringify(where, null, 2))\n    \n    return where\n  }\n}\n\nfunction toTypeormOrder(sorting: Array<{ field: string; order: 'ASC'|'DESC' }>): any {\n  const order: any = {}\n  for (const s of sorting) order[s.field] = s.order\n  return order\n}\n\nfunction normalizeSelect(attrs: any, repo: any): any {\n  if (!attrs || attrs === '*') return undefined\n  if (Array.isArray(attrs)) return attrs\n  if (attrs && typeof attrs === 'object') {\n    const cols: string[] = Array.isArray(repo?.metadata?.columns)\n      ? repo.metadata.columns.map((c: any) => c.propertyName)\n      : []\n    if (attrs.include && Array.isArray(attrs.include) && attrs.include.length) return attrs.include\n    if (attrs.exclude && Array.isArray(attrs.exclude) && attrs.exclude.length) return cols.filter(c => !attrs.exclude.includes(c))\n  }\n  return undefined\n}\n\nfunction resolveRelations(repo: any, rels: any, required: string[]): string[] | undefined {\n  const allRels: string[] = Array.isArray(repo?.metadata?.relations)\n    ? repo.metadata.relations.map((r: any) => r.propertyName)\n    : []\n  let base: string[]\n  if (!rels || rels === '*') {\n    base = allRels\n  } else if (Array.isArray(rels)) {\n    base = rels\n  } else if (typeof rels === 'object') {\n    if (rels.include && Array.isArray(rels.include)) base = rels.include\n    else if (rels.exclude && Array.isArray(rels.exclude)) base = allRels.filter((r) => !rels.exclude.includes(r))\n    else base = allRels\n  } else {\n    base = []\n  }\n  const merged = Array.from(new Set([ ...base, ...(required || []) ]))\n  return merged.length ? merged : undefined\n}\n\nfunction castId(v: any) { const n = Number(v); return Number.isNaN(n) ? v : n }\n\nfunction buildLikeCondition(relationPath: string, column: string, likeValue: string, caseSensitive: boolean) {\n  // We can't access QueryBuilder aliases in find options directly; use a pseudo expression format.\n  // Consumer repos that support advanced where can map LOWER() semantics. Here we store intent.\n  const target = relationPath === 'root' ? column : `${relationPath}.${column}`\n  return caseSensitive\n    ? { [target]: { like: likeValue } }\n    : { [target]: { ilike: likeValue } } // signal case-insensitive intent\n}\n\nfunction joinRelationsIntoQueryBuilder(qb: any, relations: string[]) {\n  const added: Set<string> = new Set()\n  for (const path of relations) {\n    const segments = String(path).split('.')\n    let prevAlias = 't'\n    let relPath = ''\n    for (const seg of segments) {\n      relPath = relPath ? `${relPath}.${seg}` : seg\n      const alias = `t_${relPath.replace(/\\./g, '_')}`\n      const joinKey = `${prevAlias}.${seg}__${alias}`\n      if (!added.has(joinKey)) {\n        qb.leftJoinAndSelect(`${prevAlias}.${seg}`, alias)\n        added.add(joinKey)\n      }\n      prevAlias = alias\n    }\n  }\n}\n\n// Convert our generic where structure into TypeORM FindOptionsWhere format\nfunction convertToTypeormWhere(where: any): any {\n  if (!where) return {}\n  // Handle AND/OR composition\n  if (where.AND) {\n    return (where.AND as any[]).map(convertToTypeormWhere)\n  }\n  if (where.OR) {\n    return (where.OR as any[]).map(convertToTypeormWhere)\n  }\n  const out: any = {}\n  for (const key of Object.keys(where)) {\n    const value = where[key]\n    if (value && typeof value === 'object' && !Array.isArray(value)) {\n      if ('like' in value) {\n        const raw = String((value as any).like)\n        const pattern = raw.includes('%') ? raw : `%${raw}%`\n        out[key] = CaseInsensitiveLike(pattern)\n      } else if ('ilike' in value) {\n        const raw = String((value as any).ilike)\n        const pattern = raw.includes('%') ? raw : `%${raw}%`\n        out[key] = CaseInsensitiveLike(pattern)\n      } else if ('between' in value && Array.isArray((value as any).between)) {\n        const [a, b] = (value as any).between\n        out[key] = Between(a, b)\n      } else if ('gte' in value || 'lte' in value || 'gt' in value || 'lt' in value) {\n        const range: any[] = []\n        if ('gte' in value && 'lte' in value) out[key] = Between((value as any).gte, (value as any).lte)\n        else if ('gt' in value) out[key] = MoreThan((value as any).gt)\n        else if ('gte' in value) out[key] = MoreThanOrEqual((value as any).gte)\n        else if ('lt' in value) out[key] = LessThan((value as any).lt)\n        else if ('lte' in value) out[key] = LessThanOrEqual((value as any).lte)\n      } else {\n        // nested relation path: split by dot\n        if (key.includes('.')) {\n          const [rel, ...rest] = key.split('.')\n          const nestedKey = rest.join('.')\n          out[rel] = out[rel] || {}\n          out[rel][nestedKey] = convertToTypeormWhere({ [nestedKey]: value })[nestedKey]\n        } else {\n          out[key] = convertToTypeormWhere(value)\n        }\n      }\n    } else {\n      out[key] = value\n    }\n  }\n  return out\n}\n\n// Helpers that defer importing from typeorm to runtime to avoid hard deps at import time\nfunction Like(pattern: string): any { return dynamicTypeormOperator('Like', pattern) }\nfunction Between(a: any, b: any): any { return dynamicTypeormOperator('Between', a, b) }\nfunction MoreThan(v: any): any { return dynamicTypeormOperator('MoreThan', v) }\nfunction MoreThanOrEqual(v: any): any { return dynamicTypeormOperator('MoreThanOrEqual', v) }\nfunction LessThan(v: any): any { return dynamicTypeormOperator('LessThan', v) }\nfunction LessThanOrEqual(v: any): any { return dynamicTypeormOperator('LessThanOrEqual', v) }\nfunction Raw(...args: any[]): any { return dynamicTypeormOperator('Raw', ...args) }\n\n// Case-insensitive like fallback: lower both sides via simple pattern; we map to Like on lowercased input\nfunction CaseInsensitiveLike(pattern: string): any {\n  // Use a LOWER() based Raw expression for cross-database case-insensitive matching\n  return Raw((alias: string) => `LOWER(${alias}) LIKE LOWER(:pattern)`, { pattern })\n}\n\nfunction dynamicTypeormOperator(name: string, ...args: any[]): any {\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-var-requires\n    const typeorm = require('typeorm')\n    return (typeorm as any)[name](...args)\n  } catch {\n    // If typeorm isn't available at import time, just return a shape TypeORM understands minimally\n    return { __op: name, __args: args }\n  }\n}\n\n\n","import { Get, Post, Put, Patch, Delete, Req, Res, UseInterceptors } from '@nestjs/common'\nimport { AnyFilesInterceptor } from '@nestjs/platform-express'\nimport { CrudmanService } from '../crudman.service'\nimport { CrudmanRegistry } from '../module/CrudmanRegistry'\nimport { applyDecorators, SetMetadata } from '@nestjs/common'\nimport { ApiOperation, ApiParam, ApiOkResponse, ApiBody } from '../utils/safeSwagger'\n\nexport function CrudControllerBase(section: string | string[]): any {\n  const paramMetaKey = 'design:paramtypes'\n\n  // Single-section controller (existing behavior)\n  if (typeof section === 'string' && section !== '*') {\n    const sec = section as string\n    class BaseController {\n      protected readonly crud: CrudmanService\n      constructor() { this.crud = new CrudmanService() }\n\n      @Get()\n      list(@Req() req: any, @Res() res: any) { const s = this.crud || new CrudmanService(); return s.list(sec, req, res) }\n\n      @Get(':id')\n      details(@Req() req: any, @Res() res: any) { const s = this.crud || new CrudmanService(); return s.details(sec, req, res) }\n\n      @Post()\n      @UseInterceptors(AnyFilesInterceptor())\n      create(@Req() req: any, @Res() res: any) { const s = this.crud || new CrudmanService(); return s.create(sec, req, res) }\n\n      @(CrudmanRegistry.get().getUpdateMethod() === 'patch' ? Patch(':id') : Put(':id'))\n      @UseInterceptors(AnyFilesInterceptor())\n      update(@Req() req: any, @Res() res: any) { const s = this.crud || new CrudmanService(); return s.update(sec, req, res) }\n\n      @Delete(':id')\n      remove(@Req() req: any, @Res() res: any) { const s = this.crud || new CrudmanService(); return s.delete(sec, req, res) }\n    }\n    try {\n      const proto: any = (BaseController as any).prototype\n      for (const m of ['list','details','create','update','remove']) {\n        ;(Reflect as any).defineMetadata(paramMetaKey, [Object, Object], proto, m)\n        ;(Reflect as any).defineMetadata('design:returntype', Object, proto, m)\n        ;(Reflect as any).defineMetadata('design:type', Function, proto, m)\n      }\n    } catch {}\n    return BaseController\n  }\n\n  // Multi-section shorthand controller: generate routes per section\n  class MultiController {\n    protected readonly crud: CrudmanService\n    constructor() { this.crud = new CrudmanService() }\n  }\n\n  try {\n    const allowList: string[] = Array.isArray(section) ? section : []\n    const updateMethod = CrudmanRegistry.get().getUpdateMethod()\n    const proto: any = (MultiController as any).prototype\n\n    const define = (name: string, fn: Function) => {\n      Object.defineProperty(proto, name, { value: fn, writable: false, configurable: true })\n      ;(Reflect as any).defineMetadata(paramMetaKey, [Object, Object], proto, name)\n      ;(Reflect as any).defineMetadata('design:returntype', Object, proto, name)\n      ;(Reflect as any).defineMetadata('design:type', Function, proto, name)\n    }\n\n    const decorate = (name: string, decorators: any[]) => {\n      const desc = Object.getOwnPropertyDescriptor(proto, name) as PropertyDescriptor\n      for (const d of decorators) d(proto, name, desc)\n    }\n\n    for (const sectionKey of allowList) {\n      // list\n      const listName = `list__${sectionKey}`\n      define(listName, function(this: any, req: any, res: any) { return this.crud.list(sectionKey, req, res) })\n      try { (Req() as any)(proto, listName, 0); (Res() as any)(proto, listName, 1) } catch {}\n      decorate(listName, [\n        applyDecorators(SetMetadata('crudman:action', { section: sectionKey, action: 'list' }), ApiOperation({ summary: `${sectionKey}: list` }), ApiOkResponse({ description: 'List response' })),\n        Get(sectionKey)\n      ])\n\n      // details\n      const detName = `details__${sectionKey}`\n      define(detName, function(this: any, req: any, res: any) { return this.crud.details(sectionKey, req, res) })\n      try { (Req() as any)(proto, detName, 0); (Res() as any)(proto, detName, 1) } catch {}\n      decorate(detName, [\n        applyDecorators(SetMetadata('crudman:action', { section: sectionKey, action: 'details' }), ApiOperation({ summary: `${sectionKey}: details` }), ApiParam({ name: 'id', required: true }), ApiOkResponse({ description: 'Details response' })),\n        Get(`${sectionKey}/:id`)\n      ])\n\n      // create\n      const createName = `create__${sectionKey}`\n      define(createName, function(this: any, req: any, res: any) { return this.crud.create(sectionKey, req, res) })\n      try { (Req() as any)(proto, createName, 0); (Res() as any)(proto, createName, 1) } catch {}\n      decorate(createName, [\n        UseInterceptors(AnyFilesInterceptor()) as any,\n        applyDecorators(SetMetadata('crudman:action', { section: sectionKey, action: 'create' }), ApiOperation({ summary: `${sectionKey}: create` }), ApiOkResponse({ description: 'Create response' })),\n        Post(sectionKey)\n      ])\n\n      // update\n      const updateName = `update__${sectionKey}`\n      define(updateName, function(this: any, req: any, res: any) { return this.crud.update(sectionKey, req, res) })\n      try { (Req() as any)(proto, updateName, 0); (Res() as any)(proto, updateName, 1) } catch {}\n      decorate(updateName, [\n        UseInterceptors(AnyFilesInterceptor()) as any,\n        applyDecorators(SetMetadata('crudman:action', { section: sectionKey, action: 'update' }), ApiOperation({ summary: `${sectionKey}: update` }), ApiParam({ name: 'id', required: true }), ApiOkResponse({ description: 'Update response' })),\n        updateMethod === 'patch' ? Patch(`${sectionKey}/:id`) : Put(`${sectionKey}/:id`)\n      ])\n\n      // delete\n      const removeName = `remove__${sectionKey}`\n      define(removeName, function(this: any, req: any, res: any) { return this.crud.delete(sectionKey, req, res) })\n      try { (Req() as any)(proto, removeName, 0); (Res() as any)(proto, removeName, 1) } catch {}\n      decorate(removeName, [\n        applyDecorators(SetMetadata('crudman:action', { section: sectionKey, action: 'delete' }), ApiOperation({ summary: `${sectionKey}: delete` }), ApiParam({ name: 'id', required: true }), ApiOkResponse({ description: 'Delete response' })),\n        Delete(`${sectionKey}/:id`)\n      ])\n    }\n  } catch {}\n\n  return MultiController\n}\n\n\n","import { CrudmanRegistry } from './CrudmanRegistry'\n\nexport function setCrudmanModuleRef(moduleRef: any) {\n  CrudmanRegistry.get().setModuleRef(moduleRef)\n}\n\nexport function getCrudmanModuleRef() {\n  return CrudmanRegistry.get().getModuleRef()\n}\n\n\n","import { CrudmanRegistry } from '../module/CrudmanRegistry'\n\nexport function generateOpenApiSchemaFromEntity(entity: any): any | null {\n  try {\n    let ds = CrudmanRegistry.get().getDataSource?.()\n    if (!ds) {\n      try {\n        lazyResolveDataSourceFromModuleRef()\n        ds = CrudmanRegistry.get().getDataSource?.()\n      } catch {}\n    }\n    if (!entity) return null\n    let meta = ds ? safeGetMetadata(ds, entity) : null\n    // Fallback: use TypeORM global metadata args storage when DataSource is not available\n    if (!meta) {\n      // Use globally installed typeorm first; if empty, try resolving storage relative to the entity's module\n      let storage = getTypeormArgsStorage()\n      if (storage && (!Array.isArray(storage.columns) || storage.columns.length === 0)) {\n        const alt = getTypeormStorageFromEntityModule(entity)\n        if (alt) storage = alt\n      }\n      if (storage) {\n        const matches = (t: any, ent: any) => {\n          try {\n            if (t === ent) return true\n            const tName = typeof t === 'function' ? t.name : String(t)\n            const eName = typeof ent === 'function' ? ent.name : String(ent)\n            return !!tName && !!eName && tName === eName\n          } catch { return false }\n        }\n        const cols = (storage.columns || []).filter((c: any) => matches(c.target, entity))\n        const rels = (storage.relations || []).filter((r: any) => matches(r.target, entity))\n        meta = {\n          columns: cols.map((c: any) => ({ propertyName: c.propertyName, type: c.options?.type || 'string', length: c.options?.length, isNullable: c.options?.nullable !== false ? true : false, isPrimary: !!c.options?.primary, isGenerated: !!c.options?.generated, isCreateDate: c.options?.type === 'timestamp' && c.propertyName?.toLowerCase()?.includes('created'), isUpdateDate: c.options?.type === 'timestamp' && c.propertyName?.toLowerCase()?.includes('updated') })),\n          relations: rels.map((r: any) => ({ propertyName: r.propertyName, type: r.type, inverseEntityMetadata: { name: (typeof r.type === 'function' ? (r.type as any).name : String(r.type)) } }))\n        }\n      }\n    }\n    if (!meta) return null\n    const properties: Record<string, any> = {}\n    const required: string[] = []\n    // Determine section-level uniqueness config by scanning global sections for this model\n    const globalMeta = (global as any).__crudman_global_meta || { config: { sections: {} } }\n    const sections: Record<string, any> = globalMeta.config?.sections || {}\n    const uniquenessMap: Record<string, boolean> = {}\n    try {\n      for (const [, cfg] of Object.entries(sections)) {\n        if ((cfg as any)?.model === entity) {\n          const gather = (a: any) => Array.isArray(a?.fieldsForUniquenessValidation) ? a.fieldsForUniquenessValidation : []\n          const fields = new Set<string>([...gather(cfg), ...gather((cfg as any).create), ...gather((cfg as any).update), ...gather((cfg as any).save)])\n          for (const f of fields) uniquenessMap[f] = true\n        }\n      }\n    } catch {}\n    for (const col of meta.columns) {\n      const name = col.propertyName\n      const typ = normalizeType(col.type)\n      const prop: any = { type: typ }\n      if (col.length) prop.maxLength = Number(col.length)\n      if (typ === 'integer' || typ === 'number') {}\n      if (typ === 'string' && (String(col.type).toLowerCase().includes('date') || col.isCreateDate || col.isUpdateDate)) {\n        prop.type = 'string'; prop.format = 'date-time'\n      }\n      if (uniquenessMap[name]) {\n        prop.description = prop.description ? `${prop.description} | Should be unique` : 'Should be unique'\n      }\n      properties[name] = prop\n      if (col.isNullable === false && !col.isPrimary && !col.isGenerated && !col.isCreateDate && !col.isUpdateDate) required.push(name)\n    }\n    // Add relation objects by default (document shape as object refs when possible)\n    for (const rel of meta.relations || []) {\n      const relName = rel.propertyName\n      const inv = (rel as any).inverseEntityMetadata\n      const relSchemaName = inv?.name || (typeof rel.type === 'function' ? (rel.type as any).name : String(rel.type)) || 'Entity'\n      properties[relName] = { $ref: `#/components/schemas/${relSchemaName}` }\n    }\n\n    return { type: 'object', properties, required: required.length ? required : undefined }\n  } catch { return null }\n}\n\nexport function registerSchemas(swagger: any, app: any, entities: any[]) {\n  if (!swagger || !app) return\n  const schemas: Record<string, any> = {}\n  for (const ent of entities) {\n    const name = ent.name || 'Entity'\n    const schema = generateOpenApiSchemaFromEntity(ent)\n    if (schema) schemas[name] = schema\n  }\n  if (Object.keys(schemas).length) {\n    const doc = swagger.SwaggerModule.createDocument(app, new swagger.DocumentBuilder().setTitle('API').setVersion('1.0').build(), { extraSchemas: schemas })\n    swagger.SwaggerModule.setup('docs', app, doc)\n  }\n}\n\nexport function enhanceCrudSwaggerDocument(document: any) {\n  if (!document || typeof document !== 'object') return\n  const meta = (global as any).__crudman_global_meta || { config: { sections: {} } }\n  const sections: Record<string, any> = meta.config?.sections || {}\n  if (!document.components) document.components = {}\n  if (!document.components.schemas) document.components.schemas = {}\n  // Apply global swagger meta (title/version/description) with fallbacks to package.json\n  try {\n    const reg = CrudmanRegistry.get()\n    const cfg = reg.getSwaggerMeta() || {}\n    const allowedContentTypes: Array<'json'|'csv'|'excel'> = reg.getExportContentTypes()\n    const humanize = (s: string) => String(s || '').replace(/[-_]+/g, ' ').replace(/\\s+/g, ' ').trim().replace(/(^|\\s)\\S/g, (t) => t.toUpperCase())\n    let pkg: any = null\n    try { pkg = require(process.cwd() + '/package.json') } catch {\n      try { pkg = require('../../../../package.json') } catch {}\n    }\n    const defaultTitle = humanize(pkg?.name || 'API')\n    const defaultVersion = pkg?.version || '1.0.0'\n    const defaultDescription = `CRUD APIs for ${cfg.title ? humanize(cfg.title) : defaultTitle}`\n    document.info = document.info || {}\n    document.info.title = cfg.title ? humanize(cfg.title) : (document.info.title || defaultTitle)\n    document.info.version = cfg.version || (document.info.version || defaultVersion)\n    document.info.description = cfg.description || (document.info.description || defaultDescription)\n  } catch {}\n\n  const sectionToEntityName: Record<string, string> = {}\n  const sectionToSelectionField: Record<string, string> = {}\n  const capitalize = (s: string) => (s && s.length ? s.charAt(0).toUpperCase() + s.slice(1) : s)\n  for (const [sectionKey, cfg] of Object.entries(sections)) {\n    const ent = (cfg as any)?.model\n    if (!ent) continue\n    const rawTitle = (cfg as any)?.title || ent.name || 'Entity'\n    const name = capitalize(String(rawTitle))\n    sectionToEntityName[sectionKey] = name\n    const selectionField = (cfg as any)?.recordSelectionField || 'id'\n    sectionToSelectionField[sectionKey] = selectionField\n    // Register main entity schema\n    const schema = generateOpenApiSchemaFromEntity(ent)\n    if (schema) {\n      ;(schema as any).title = name\n      if ((cfg as any)?.description) (schema as any).description = (cfg as any).description\n      else if (!(schema as any).description) (schema as any).description = `CRUD options for ${name}`\n      document.components.schemas[name] = schema\n    }\n    // Also register direct relation target schemas\n    try {\n      const ds = CrudmanRegistry.get().getDataSource?.()\n      const meta = ds ? safeGetMetadata(ds, ent) : null\n      const relTargets: any[] = meta?.relations?.map((r: any) => r.inverseEntityMetadata?.target).filter(Boolean) || []\n      for (const tgt of relTargets) {\n        const tgtName = (tgt as any).name || 'Entity'\n        if (!document.components.schemas[tgtName]) {\n          const tgtSchema = generateOpenApiSchemaFromEntity(tgt)\n          if (tgtSchema) document.components.schemas[tgtName] = tgtSchema\n        }\n      }\n    } catch {}\n  }\n\n  const isDetailsPath = (p: string) => /\\{[^}]+\\}$/.test(p)\n  const singularize = (word: string) => {\n    if (word.endsWith('ies')) return word.slice(0, -3) + 'y'\n    if (word.endsWith('s')) return word.slice(0, -1)\n    return word\n  }\n  const sectionKeys = Object.keys(sections)\n  const sectionKeyToSingular: Record<string, string> = Object.fromEntries(sectionKeys.map(k => [k, singularize(k)]))\n  const getSectionFromPath = (p: string): string | null => {\n    const parts = p.split('/').filter(Boolean)\n    if (!parts.length) return null\n    // Prefer any segment that matches a known section key\n    for (const seg of parts) {\n      if (sectionKeys.includes(seg)) return seg\n    }\n    // Try common transforms (e.g., upload-image-* route → uploads-image-* section)\n    for (const seg of parts) {\n      const candidates = new Set<string>([\n        seg,\n        seg + 's',\n        seg.replace(/^upload-/, 'uploads-'),\n        seg.replace(/^(.*?)-(.*)$/, (_: any, a: string, b: string) => (a.endsWith('s') ? `${a}-${b}` : `${a}s-${b}`))\n      ])\n      for (const cand of candidates) {\n        if (sectionKeys.includes(cand)) return cand\n      }\n    }\n    // Fallback: match singular segment to a section\n    for (const seg of parts) {\n      const match = sectionKeys.find(k => sectionKeyToSingular[k] === seg)\n      if (match) return match\n    }\n    // Last non-parameter fallback\n    for (let i = parts.length - 1; i >= 0; i--) {\n      const seg = parts[i]\n      if (!seg.startsWith('{')) return seg\n    }\n    return null\n  }\n\n  // Fallback: derive section from operation summary like \"<section>: <action>\"\n  const getSectionFromOperation = (op: any): string | null => {\n    try {\n      const s = String(op?.summary || '')\n      if (!s || s.indexOf(':') === -1) return null\n      const left = s.split(':')[0].trim()\n      return left || null\n    } catch { return null }\n  }\n\n  // Inject/rename path params according to recordSelectionField\n  const newPaths: Record<string, any> = {}\n  for (const [path, item] of Object.entries<any>(document.paths || {})) {\n    const sectionFromPath = getSectionFromPath(path)\n    let entityName = sectionFromPath ? sectionToEntityName[sectionFromPath] : undefined\n    let selectionField = sectionFromPath ? sectionToSelectionField[sectionFromPath] || 'id' : 'id'\n    // Fallback: infer entity name from path segment when registry sections are unavailable\n    if (!entityName && sectionFromPath) {\n      const guess = capitalize(singularize(sectionFromPath))\n      // Allow guessing even if the schema isn't registered yet; we'll ensure the schema below\n      if (guess) entityName = guess\n    }\n    // Try deriving from operation summaries before giving up\n    if (!entityName) {\n      const opSection = getSectionFromOperation(item.post || item.put || item.patch || item.get)\n      if (opSection) {\n        entityName = sectionToEntityName[opSection]\n        selectionField = sectionToSelectionField[opSection] || 'id'\n      }\n    }\n    if (!entityName) { newPaths[path] = item; continue }\n\n    // Ensure a component schema exists before creating a $ref to it. If missing, try to derive and register.\n    const ensureComponentSchema = (name: string | undefined, sectionKeyGuess?: string | null) => {\n      try {\n        if (!name) return\n        if (!document.components) document.components = {}\n        if (!document.components.schemas) document.components.schemas = {}\n      if (document.components.schemas[name] && !isGenericObjectSchema(document.components.schemas[name])) return\n      const cfg: any = (sections as any)[String(sectionKeyGuess || '')] || {}\n      let derived = generateOpenApiSchemaFromEntity(cfg?.model)\n      if (!derived) derived = deriveOpenApiSchemaByEntityName(name)\n      document.components.schemas[name] = derived || { type: 'object', additionalProperties: true }\n      } catch {}\n    }\n\n    const sectionKeyGuess: string | null = (sectionFromPath as string) || getSectionFromOperation(item.post || item.put || item.patch || item.get)\n    ensureComponentSchema(entityName, sectionKeyGuess)\n\n    const ref = { $ref: `#/components/schemas/${entityName}` }\n\n    // List: GET without id param (also detect custom routes like /company/details/{id} using singular)\n    if (item.get && !isDetailsPath(path)) {\n      const section = sectionFromPath || getSectionFromOperation(item.get)\n      if (!entityName && section) entityName = sectionToEntityName[section]\n      if (section) selectionField = sectionToSelectionField[section] || 'id'\n      item.get.responses = item.get.responses || {}\n      item.get.responses['200'] = item.get.responses['200'] || {}\n      const regList = CrudmanRegistry.get(); const allowedList = regList.getExportContentTypes();\n      const listContent: any = { 'application/json': { schema: buildListEnvelopeSchema(ref) } }\n      if (allowedList.includes('csv' as any)) listContent['text/csv'] = { schema: { type: 'string', description: 'CSV of data array. Pagination meta in headers.' } }\n      if (allowedList.includes('excel' as any)) listContent['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'] = { schema: { type: 'string', format: 'binary', description: 'Excel (.xlsx) of data array. Pagination meta in headers.' } }\n      item.get.responses['200'].content = listContent\n\n      // Inject query params: pagination, sorting, filters, keyword\n      const sectionKey = (section as string) || (sectionFromPath as string)\n      const sectionCfg: any = (sections as any)[sectionKey] || {}\n      const listCfg: any = { ...(sectionCfg || {}), ...(sectionCfg.list || {}) }\n      const qn = listCfg.queryParamNames || {}\n      const pageName = qn.page || 'page'\n      const perPageName = qn.perPage || 'perPage'\n      const paginateName = qn.paginate || 'paginate'\n      const sortPrefix = qn.sortPrefix || 'sort.'\n      const keywordName = (qn.keyword || listCfg.keywordParamName || 'keyword')\n      const ds = CrudmanRegistry.get().getDataSource?.()\n      const meta = ds ? safeGetMetadata(ds, (sectionCfg as any).model) : null\n      const allCols: Array<{ name: string; type: string }> = Array.isArray(meta?.columns)\n        ? meta!.columns.map((c: any) => ({ name: c.propertyName, type: normalizeType(c.type) }))\n        : []\n      const filtersWhitelist: string[] = Array.isArray(listCfg.filtersWhitelist) && listCfg.filtersWhitelist.length ? listCfg.filtersWhitelist : allCols.map(c => c.name)\n      const sortingWhitelist: string[] = Array.isArray(listCfg.sortingWhitelist) && listCfg.sortingWhitelist.length ? listCfg.sortingWhitelist : allCols.map(c => c.name)\n\n      const params: any[] = item.get.parameters || []\n      const pushParam = (p: any) => {\n        if (!params.some((e) => e.in === p.in && e.name === p.name)) params.push(p)\n      }\n      // Pagination\n      pushParam({ in: 'query', name: pageName, required: false, schema: { type: 'integer', minimum: 1 } })\n      pushParam({ in: 'query', name: perPageName, required: false, schema: { type: 'integer', minimum: 0 } })\n      pushParam({ in: 'query', name: paginateName, required: false, schema: { type: 'string', enum: ['true','false','0','1','yes','no'] } })\n      // Sorting\n      for (const f of sortingWhitelist) {\n        pushParam({ in: 'query', name: `${sortPrefix}${f}`, required: false, schema: { type: 'string', enum: ['asc','desc'] } })\n      }\n      // Filters\n      const colType: Record<string, string> = Object.fromEntries(allCols.map(c => [c.name, c.type]))\n      const opNames = { min: qn.minOp || 'min', max: qn.maxOp || 'max', gt: qn.gtOp || 'gt', lt: qn.ltOp || 'lt', between: qn.betweenOp || 'between', like: qn.likeOp || 'like' }\n      for (const f of filtersWhitelist) {\n        const baseType = colType[f] === 'number' || colType[f] === 'integer' ? 'number' : (colType[f] === 'boolean' ? 'boolean' : 'string')\n        pushParam({ in: 'query', name: f, required: false, schema: { type: baseType } })\n        pushParam({ in: 'query', name: `${f}.${opNames.like}`, required: false, schema: { type: 'string' } })\n        pushParam({ in: 'query', name: `${f}.${opNames.min}`, required: false, schema: { type: baseType } })\n        pushParam({ in: 'query', name: `${f}.${opNames.max}`, required: false, schema: { type: baseType } })\n        pushParam({ in: 'query', name: `${f}.${opNames.gt}`, required: false, schema: { type: baseType } })\n        pushParam({ in: 'query', name: `${f}.${opNames.lt}`, required: false, schema: { type: baseType } })\n        pushParam({ in: 'query', name: `${f}.${opNames.between}`, required: false, schema: { type: 'string' }, description: 'start,end' })\n      }\n      // Keyword search\n      const kwCfg = listCfg.keyword || {}\n      const kwEnabled = kwCfg.isEnabled !== false\n      if (kwEnabled) pushParam({ in: 'query', name: keywordName, required: false, schema: { type: 'string' } })\n      // x-content-type header (respect configured allowed types)\n      const reg = CrudmanRegistry.get()\n      const allowed = reg.getExportContentTypes()\n      pushParam({ in: 'header', name: 'x-content-type', required: false, description: 'Response content type (default json). Aliases: xlsx→excel', schema: { type: 'string', enum: allowed, default: 'json' } })\n      item.get.parameters = params\n    }\n    // Details: ensure param name matches selectionField and add param definition\n    if (item.get && isDetailsPath(path)) {\n      const section = sectionFromPath || getSectionFromOperation(item.get)\n      if (!entityName && section) entityName = sectionToEntityName[section]\n      if (section) selectionField = sectionToSelectionField[section] || 'id'\n      item.get.responses = item.get.responses || {}\n      item.get.responses['200'] = item.get.responses['200'] || {}\n      const regDet = CrudmanRegistry.get(); const allowedDet = regDet.getExportContentTypes();\n      const detContent: any = { 'application/json': { schema: buildDetailEnvelopeSchema(ref) } }\n      if (allowedDet.includes('csv' as any)) detContent['text/csv'] = { schema: { type: 'string', description: 'CSV single row' } }\n      if (allowedDet.includes('excel' as any)) detContent['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'] = { schema: { type: 'string', format: 'binary', description: 'Excel (.xlsx) single row' } }\n      item.get.responses['200'].content = detContent\n      // x-content-type header for details\n      const paramsD: any[] = item.get.parameters || []\n      if (!paramsD.some((p) => p.in === 'header' && p.name === 'x-content-type')) {\n        const reg = CrudmanRegistry.get()\n        const allowed = reg.getExportContentTypes()\n        paramsD.push({ in: 'header', name: 'x-content-type', required: false, description: 'Response content type (default json)', schema: { type: 'string', enum: allowed, default: 'json' } })\n      }\n      item.get.parameters = paramsD\n      item.get.parameters = item.get.parameters || []\n      const hasParam = (item.get.parameters as any[]).some((p) => p.name === selectionField)\n      if (!hasParam) (item.get.parameters as any[]).push({ in: 'path', name: selectionField, required: true, schema: { type: 'string' } })\n    }\n    if (item.patch) {\n      const section = sectionFromPath || getSectionFromOperation(item.patch)\n      if (!entityName && section) entityName = sectionToEntityName[section]\n      if (section) selectionField = sectionToSelectionField[section] || 'id'\n      item.patch.responses = item.patch.responses || {}\n      item.patch.responses['200'] = item.patch.responses['200'] || {}\n      item.patch.responses['200'].content = {\n        'application/json': {\n          schema: buildDetailEnvelopeSchema(ref)\n        }\n      }\n      // Indicate multipart support for uploads\n      {\n        const sectionKey = (section as string) || (sectionFromPath as string)\n        const sectionCfg: any = (sections as any)[sectionKey] || {}\n        let mpSchema = buildCombinedMultipartSchema(document, entityName, sectionKey, sectionCfg, 'update')\n        item.patch.requestBody = item.patch.requestBody || { required: false, content: {} }\n        const content = item.patch.requestBody.content as any\n        if (mpSchema) {\n          const allow = CrudmanRegistry.get().getSwaggerRequestBodyContentTypes()\n          if (allow.includes('multipart' as any)) {\n            content['multipart/form-data'] = content['multipart/form-data'] || { schema: { type: 'object' } }\n            content['multipart/form-data'].schema = stripRelationPropsFromSchema(mpSchema, document, entityName, (sections as any)[sectionKey])\n          }\n        }\n        const allow = CrudmanRegistry.get().getSwaggerRequestBodyContentTypes()\n          if (allow.includes('json' as any)) {\n          const existing = content['application/json']?.schema\n          const shouldOverride = !existing || isGenericObjectSchema(existing)\n          if (shouldOverride) {\n            const mode = (CrudmanRegistry.get().getOptions() as any)?.swagger?.requestBodySchemaMode || 'inline'\n            if (mode === 'ref') {\n              content['application/json'] = { schema: { $ref: `#/components/schemas/${entityName}` } }\n            } else {\n              const inline = buildInlineJsonSchema(document, entityName, (sections as any)[sectionKey], 'update')\n              if (inline) content['application/json'] = { schema: stripRelationPropsFromSchema(inline, document, entityName, (sections as any)[sectionKey]) }\n              else content['application/json'] = { schema: { $ref: `#/components/schemas/${entityName}` } }\n            }\n          }\n        }\n        if (allow.includes('form' as any)) {\n          const inline = buildInlineJsonSchema(document, entityName, (sections as any)[sectionKey], 'update')\n          if (inline) content['application/x-www-form-urlencoded'] = { schema: stripRelationPropsFromSchema(inline, document, entityName, (sections as any)[sectionKey]) }\n        }\n      }\n      item.patch.parameters = item.patch.parameters || []\n      const hasParam = (item.patch.parameters as any[]).some((p) => p.name === selectionField)\n      if (!hasParam) (item.patch.parameters as any[]).push({ in: 'path', name: selectionField, required: true, schema: { type: 'string' } })\n    }\n    if (item.put) {\n      const section = sectionFromPath || getSectionFromOperation(item.put)\n      if (!entityName && section) entityName = sectionToEntityName[section]\n      if (section) selectionField = sectionToSelectionField[section] || 'id'\n      item.put.responses = item.put.responses || {}\n      item.put.responses['200'] = item.put.responses['200'] || {}\n      item.put.responses['200'].content = {\n        'application/json': {\n          schema: buildDetailEnvelopeSchema(ref)\n        }\n      }\n      {\n        const sectionKey = (section as string) || (sectionFromPath as string)\n        const sectionCfg: any = (sections as any)[sectionKey] || {}\n        let mpSchema = buildCombinedMultipartSchema(document, entityName, sectionKey, sectionCfg, 'update')\n        item.put.requestBody = item.put.requestBody || { required: false, content: {} }\n        const content = item.put.requestBody.content as any\n        if (mpSchema) {\n          const allow = CrudmanRegistry.get().getSwaggerRequestBodyContentTypes()\n          if (allow.includes('multipart' as any)) {\n            content['multipart/form-data'] = content['multipart/form-data'] || { schema: { type: 'object' } }\n            content['multipart/form-data'].schema = stripRelationPropsFromSchema(mpSchema, document, entityName, (sections as any)[sectionKey])\n          }\n        }\n        {\n          const allow = CrudmanRegistry.get().getSwaggerRequestBodyContentTypes()\n          if (allow.includes('json' as any)) {\n            const existing = content['application/json']?.schema\n            const shouldOverride = !existing || isGenericObjectSchema(existing)\n            if (shouldOverride) {\n              const mode = (CrudmanRegistry.get().getOptions() as any)?.swagger?.requestBodySchemaMode || 'inline'\n              if (mode === 'ref') {\n                content['application/json'] = { schema: { $ref: `#/components/schemas/${entityName}` } }\n              } else {\n                const inline = buildInlineJsonSchema(document, entityName, (sections as any)[sectionKey], 'update')\n                if (inline) content['application/json'] = { schema: stripRelationPropsFromSchema(inline, document, entityName, (sections as any)[sectionKey]) }\n                else content['application/json'] = { schema: { $ref: `#/components/schemas/${entityName}` } }\n              }\n            }\n          }\n          if (allow.includes('form' as any)) {\n            const inline = buildInlineJsonSchema(document, entityName, (sections as any)[sectionKey], 'update')\n            if (inline) content['application/x-www-form-urlencoded'] = { schema: stripRelationPropsFromSchema(inline, document, entityName, (sections as any)[sectionKey]) }\n          }\n        }\n      }\n      item.put.parameters = item.put.parameters || []\n      const hasParam = (item.put.parameters as any[]).some((p) => p.name === selectionField)\n      if (!hasParam) (item.put.parameters as any[]).push({ in: 'path', name: selectionField, required: true, schema: { type: 'string' } })\n    }\n    if (item.post) {\n      const section = sectionFromPath || getSectionFromOperation(item.post)\n      if (!entityName && section) entityName = sectionToEntityName[section]\n      if (section) selectionField = sectionToSelectionField[section] || 'id'\n      item.post.responses = item.post.responses || {}\n      item.post.responses['200'] = item.post.responses['200'] || {}\n      item.post.responses['200'].content = {\n        'application/json': {\n          schema: buildDetailEnvelopeSchema(ref)\n        }\n      }\n      // Add multipart requestBody hint for create with uploads or entity fields\n      {\n        const sectionKey = (section as string) || (sectionFromPath as string)\n        const sectionCfg: any = (sections as any)[sectionKey] || {}\n        let mpSchema = buildCombinedMultipartSchema(document, entityName, sectionKey, sectionCfg, 'create')\n        item.post.requestBody = item.post.requestBody || { required: false, content: {} }\n        const content = item.post.requestBody.content as any\n        if (mpSchema) {\n          const allow = CrudmanRegistry.get().getSwaggerRequestBodyContentTypes()\n          if (allow.includes('multipart' as any)) {\n            content['multipart/form-data'] = content['multipart/form-data'] || { schema: { type: 'object' } }\n            content['multipart/form-data'].schema = stripRelationPropsFromSchema(mpSchema, document, entityName, (sections as any)[sectionKey])\n          }\n        }\n        {\n          const allow = CrudmanRegistry.get().getSwaggerRequestBodyContentTypes()\n          if (allow.includes('json' as any)) {\n            const existing = content['application/json']?.schema\n            const shouldOverride = !existing || isGenericObjectSchema(existing)\n            if (shouldOverride) {\n              const mode = (CrudmanRegistry.get().getOptions() as any)?.swagger?.requestBodySchemaMode || 'inline'\n              if (mode === 'ref') {\n                content['application/json'] = { schema: { $ref: `#/components/schemas/${entityName}` } }\n              } else {\n                const inline = buildInlineJsonSchema(document, entityName, (sections as any)[sectionKey], 'create')\n                if (inline) content['application/json'] = { schema: stripRelationPropsFromSchema(inline, document, entityName, (sections as any)[sectionKey]) }\n                else content['application/json'] = { schema: { $ref: `#/components/schemas/${entityName}` } }\n              }\n            }\n            // Add example payload for JSON body\n            const example: any = buildExampleForEntity(document, entityName, (sections as any)[sectionKey])\n            if (example) {\n              content['application/json'].example = example\n            }\n          }\n          if (allow.includes('form' as any)) {\n            const inline = buildInlineJsonSchema(document, entityName, (sections as any)[sectionKey], 'create')\n            if (inline) content['application/x-www-form-urlencoded'] = { schema: stripRelationPropsFromSchema(inline, document, entityName, (sections as any)[sectionKey]) }\n          }\n        }\n      }\n    }\n    if (item.delete) {\n      item.delete.responses = item.delete.responses || {}\n      item.delete.responses['200'] = item.delete.responses['200'] || {}\n      item.delete.responses['200'].content = {\n        'application/json': {\n          schema: buildDeleteEnvelopeSchema()\n        }\n      }\n      item.delete.parameters = item.delete.parameters || []\n      const hasParam = (item.delete.parameters as any[]).some((p) => p.name === selectionField)\n      if (!hasParam) (item.delete.parameters as any[]).push({ in: 'path', name: selectionField, required: true, schema: { type: 'string' } })\n    }\n\n    // If the current path ends with {id} but selectionField is not 'id', clone the path with the right param name\n    let finalPath = path\n    if (isDetailsPath(path)) {\n      finalPath = path.replace(/\\{[^}]+\\}$/, `{${selectionField}}`)\n    }\n    newPaths[finalPath] = item\n  }\n  document.paths = newPaths\n\n  // Capitalize tag names globally and update path item tags\n  if (Array.isArray(document.tags)) {\n    document.tags = document.tags.map((t: any) => ({ ...t, name: capitalize(String(t?.name || '')) }))\n  }\n  for (const [, item] of Object.entries<any>(document.paths || {})) {\n    for (const method of ['get','post','put','patch','delete']) {\n      if (item[method] && Array.isArray(item[method].tags)) {\n        item[method].tags = item[method].tags.map((n: any) => capitalize(String(n)))\n      }\n    }\n  }\n}\n\nfunction buildListEnvelopeSchema(itemRef: any) {\n  return {\n    type: 'object',\n    properties: {\n      data: { type: 'array', items: itemRef },\n      errors: { type: 'array', items: {} },\n      success: { type: 'boolean' },\n      meta: { type: 'object', additionalProperties: true },\n      pagination: {\n        type: 'object',\n        properties: {\n          page: { type: 'integer' },\n          perPage: { type: 'integer' },\n          totalItemsCount: { type: 'integer' },\n          totalPagesCount: { type: 'integer' },\n          isHavingNextPage: { type: 'boolean' },\n          isHavingPreviousPage: { type: 'boolean' }\n        }\n      },\n      filters: {\n        type: 'array',\n        items: {\n          type: 'object',\n          properties: {\n            field: { type: 'string' },\n            op: { type: 'string' },\n            value: {}\n          }\n        }\n      },\n      sorting: {\n        type: 'array',\n        items: {\n          type: 'object',\n          properties: {\n            field: { type: 'string' },\n            order: { type: 'string', enum: ['ASC', 'DESC'] }\n          }\n        }\n      }\n    }\n  }\n}\n\nfunction buildDetailEnvelopeSchema(itemRef: any) {\n  return {\n    type: 'object',\n    properties: {\n      data: itemRef,\n      errors: { type: 'array', items: {} },\n      success: { type: 'boolean' },\n      meta: { type: 'object', additionalProperties: true }\n    }\n  }\n}\n\nfunction buildDeleteEnvelopeSchema() {\n  return {\n    type: 'object',\n    properties: {\n      data: {\n        type: 'object',\n        properties: {\n          message: { type: 'string' }\n        }\n      },\n      errors: { type: 'array', items: {} },\n      success: { type: 'boolean' },\n      meta: { type: 'object', additionalProperties: true }\n    }\n  }\n}\n\nfunction buildMultipartUploadSchema(sectionKey: string, sectionCfg: any) {\n  try {\n    // Prefer explicit upload config if present, otherwise expand shorthand\n    const uploadCfg = (sectionCfg && sectionCfg.upload) || expandUploadableShorthandSafe(sectionCfg)\n    if (!uploadCfg || !Array.isArray(uploadCfg.map) || !uploadCfg.map.length) return null\n    const properties: Record<string, any> = {}\n    const required: string[] = []\n    for (const rule of uploadCfg.map) {\n      const field = String(rule.sourceField)\n      const isArray = !!rule.isArray\n      // In multipart, files use type: string + format: binary per OpenAPI\n      const fileSchema: any = { type: 'string', format: 'binary' }\n      // Add validation notes to schema description\n      const v = computeEffectiveUploadValidators(rule, sectionCfg)\n      const parts: string[] = []\n      if (Array.isArray(v.allowedMimeTypes) && v.allowedMimeTypes.length) parts.push(`MIME: ${v.allowedMimeTypes.join(', ')}`)\n      if (Array.isArray(v.allowedExtensions) && v.allowedExtensions.length) parts.push(`Ext: ${v.allowedExtensions.join(', ')}`)\n      if (v.maxSizeMB) parts.push(`Max: ${v.maxSizeMB} MB`)\n      const th = (rule as any).typeHint || ''\n      if (String(th).includes('avatar')) parts.push('Dimensions: min 128x128, max 4096x4096, aspect ~1:1')\n      if (parts.length) fileSchema.description = parts.join(' | ')\n      properties[field] = isArray ? { type: 'array', items: fileSchema } : fileSchema\n      // Only mark required if validators explicitly require; keep optional by default\n    }\n    return { type: 'object', properties, required: required.length ? required : undefined }\n  } catch {\n    return null\n  }\n}\n\nfunction expandUploadableShorthandSafe(sectionCfg: any): any | undefined {\n  try {\n    const uploadable = sectionCfg?.uploadable\n    if (!uploadable || typeof uploadable !== 'object') return sectionCfg?.upload\n    const defaults = sectionCfg?.uploadDefaults || {}\n    const out: any = { sources: ['multipart'], map: [] }\n    for (const [field, hint] of Object.entries<any>(uploadable)) {\n      const isArray = Array.isArray(hint)\n      const typeHint = (isArray ? hint[0] : hint) as any\n      const storageMode = defaults.storageMode || 'filename'\n      const targetField = storageMode === 'filename'\n        ? (isArray ? { keys: `${field}Keys`, urls: `${field}Urls` } : { key: `${field}Key`, url: `${field}Url` })\n        : (storageMode === 'blob' ? { blob: `${field}Blob`, mime: `${field}Mime` } : `${field}`)\n      out.map.push({\n        sourceField: field,\n        targetField,\n        isArray,\n        storageMode,\n        storage: defaults.storage,\n        sources: ['multipart', 'base64'],\n        typeHint: typeof typeHint === 'string' ? typeHint : undefined\n      })\n    }\n    return out\n  } catch { return undefined }\n}\n\n// Build a multipart schema that includes both file fields (binary) and regular entity fields (string/number/etc.)\nfunction buildCombinedMultipartSchema(document: any, entityName: string, sectionKey: string, sectionCfg: any, mode: 'create' | 'update' = 'create'): any | null {\n  const fileSchema = buildMultipartUploadSchema(sectionKey, sectionCfg)\n  let entityRef = document?.components?.schemas?.[entityName]\n  // Fallback: derive entity schema directly from ORM metadata if component ref is missing\n  if (!entityRef || isGenericObjectSchema(entityRef)) {\n    let derived = generateOpenApiSchemaFromEntity((sectionCfg as any)?.model)\n    if (!derived || !derived.properties) {\n      derived = deriveOpenApiSchemaByEntityName(entityName)\n    }\n    if (derived && derived.properties) entityRef = derived\n  }\n  if (!fileSchema && !entityRef) return null\n  // Merge properties: file fields override by name to ensure binary input\n  const properties: Record<string, any> = {}\n  // Derive readonly fields from ORM metadata (primary, generated, timestamps)\n  const readonlyFields = new Set<string>()\n  try {\n    const ds = CrudmanRegistry.get().getDataSource?.()\n    const meta = ds ? safeGetMetadata(ds, (sectionCfg as any).model) : null\n    for (const col of meta?.columns || []) {\n      if (col.isPrimary || col.isGenerated || col.isCreateDate || col.isUpdateDate) readonlyFields.add(col.propertyName)\n    }\n    // Also exclude upload target fields (e.g., avatarKey, avatarUrl)\n    const uploadCfg = (sectionCfg && sectionCfg.upload) || expandUploadableShorthandSafe(sectionCfg)\n    if (uploadCfg && Array.isArray(uploadCfg.map)) {\n      for (const rule of uploadCfg.map) {\n        const tf = rule?.targetField\n        if (typeof tf === 'string') readonlyFields.add(tf)\n        else if (tf && typeof tf === 'object') {\n          for (const v of Object.values(tf)) if (typeof v === 'string') readonlyFields.add(v)\n        }\n      }\n    }\n  } catch {}\n  if (entityRef && entityRef.properties && typeof entityRef.properties === 'object') {\n    const relationNames = getRelationFieldNames(document, entityName, sectionCfg)\n    for (const [name, prop] of Object.entries<any>(entityRef.properties)) {\n      const n = String(name)\n      if (readonlyFields.has(n)) continue\n      // Exclude relations from write multipart fields by default\n      try {\n        const includeRelations = CrudmanRegistry.get().getIncludeRelationsInWriteBody()\n        const looksLikeRelation = !!(prop && (prop.$ref || (prop.items && (prop.items as any).$ref) || prop.type === 'object' || (prop.type === 'array' && (prop.items && (prop.items as any).type === 'object'))))\n        if (!includeRelations && (relationNames.has(n) || looksLikeRelation)) continue\n      } catch {}\n      if (!isWritableScalarProperty(prop)) continue\n      // Swagger UI needs primitive types for multipart; map object/array to string by default\n      const base = mapToMultipartFriendly(prop)\n      // preserve description (e.g., unique labels)\n      if (prop && prop.description) base.description = prop.description\n      properties[n] = base\n    }\n  }\n  if (fileSchema && fileSchema.properties) {\n    for (const [name, prop] of Object.entries<any>(fileSchema.properties)) {\n      properties[name] = prop\n    }\n  }\n  return { type: 'object', properties }\n}\n\nfunction mapToMultipartFriendly(prop: any): any {\n  const t = (prop && prop.type) || 'string'\n  if (prop && prop.format === 'date-time') return { type: 'string', format: 'date-time' }\n  if (t === 'string' || t === 'number' || t === 'integer' || t === 'boolean') return { type: t }\n  // For arrays/objects/refs, default to string (client can send JSON string)\n  return { type: 'string' }\n}\n\nfunction isWritableScalarProperty(prop: any): boolean {\n  try {\n    if (!prop || typeof prop !== 'object') return false\n    if (prop.$ref) return false\n    const t = prop.type\n    if (t === 'string' || t === 'number' || t === 'integer' || t === 'boolean') return true\n    if (prop.format === 'date-time') return true\n    if (t === 'array') {\n      const items = prop.items || {}\n      if ((items as any).$ref) return false\n      const it = (items as any).type\n      return it === 'string' || it === 'number' || it === 'integer' || it === 'boolean'\n    }\n    return false\n  } catch { return false }\n}\n\nfunction normalizeType(t: any): string {\n  const s = typeof t === 'string' ? t.toLowerCase() : t\n  if (s === String || s === 'varchar' || s === 'text' ) return 'string'\n  if (s === Number || s === 'int' || s === 'integer' || s === 'float' || s === 'double' || s === 'decimal') return 'number'\n  if (s === Boolean || s === 'boolean') return 'boolean'\n  if (s === Date || String(s).includes('date') || String(s).includes('time')) return 'string'\n  return 'string'\n}\n\nfunction safeGetMetadata(ds: any, entity: any): any | null {\n  try { return ds.getMetadata(entity) } catch {\n    const all = (ds as any).entityMetadatas || []\n    return all.find((m: any) => m.target === entity || m.name === entity?.name) || null\n  }\n}\n\nfunction getTypeormArgsStorage(): any | null {\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-var-requires\n    const typeorm = require('typeorm')\n    return typeof typeorm.getMetadataArgsStorage === 'function' ? typeorm.getMetadataArgsStorage() : null\n  } catch { return null }\n}\n\n// Try to resolve the same TypeORM instance that defined the entity decorators\nfunction getTypeormStorageFromEntityModule(entity: any): any | null {\n  try {\n    if (!entity) return null\n    const cache: Record<string, any> = (require as any).cache || {}\n    let entityModulePath: string | null = null\n    for (const [id, mod] of Object.entries<any>(cache)) {\n      const exp = mod && mod.exports\n      if (!exp) continue\n      if (exp === entity) { entityModulePath = id; break }\n      if (typeof exp === 'object') {\n        for (const [k, v] of Object.entries<any>(exp)) {\n          if (v === entity) { entityModulePath = id; break }\n        }\n        if (entityModulePath) break\n      }\n    }\n    if (!entityModulePath) return null\n    const mod = require('module')\n    const createRequire = (mod as any).createRequire || (mod as any).createRequireFromPath\n    if (!createRequire) return null\n    const r = createRequire(entityModulePath)\n    const typeorm = r('typeorm')\n    return typeof typeorm.getMetadataArgsStorage === 'function' ? typeorm.getMetadataArgsStorage() : null\n  } catch { return null }\n}\n\n// Derive OpenAPI schema using TypeORM global storage by matching entity class name\nfunction deriveOpenApiSchemaByEntityName(entityName: string): any | null {\n  try {\n    const storage = getTypeormArgsStorage()\n    if (!storage) return null\n    const cols = (storage.columns || []).filter((c: any) => {\n      const t = c.target\n      const n = typeof t === 'function' ? t.name : String(t)\n      return n === entityName\n    })\n    const rels = (storage.relations || []).filter((r: any) => {\n      const t = r.target\n      const n = typeof t === 'function' ? t.name : String(t)\n      return n === entityName\n    })\n    if (!cols.length && !rels.length) return null\n    const properties: Record<string, any> = {}\n    const required: string[] = []\n    for (const c of cols) {\n      const name = c.propertyName\n      const typ = normalizeType(c.options?.type || 'string')\n      const prop: any = { type: typ }\n      if (c.options?.length) prop.maxLength = Number(c.options.length)\n      if (typ === 'string' && (String(c.options?.type).toLowerCase().includes('date'))) prop.format = 'date-time'\n      properties[name] = prop\n      if (c.options?.nullable === false && !c.options?.primary && !c.options?.generated) required.push(name)\n    }\n    for (const r of rels) {\n      const relName = r.propertyName\n      const inv = r.type\n      const relSchemaName = typeof inv === 'function' ? inv.name : String(inv)\n      properties[relName] = { $ref: `#/components/schemas/${relSchemaName}` }\n    }\n    return { type: 'object', properties, required: required.length ? required : undefined }\n  } catch { return null }\n}\n\nfunction lazyResolveDataSourceFromModuleRef() {\n  try {\n    const reg = CrudmanRegistry.get()\n    const ref = reg.getModuleRef?.()\n    if (!ref) return\n    // dynamic require to avoid hard dep\n    const nx = (() => { try { return require('@nestjs/typeorm') } catch { return undefined } })()\n    const orm = (() => { try { return require('typeorm') } catch { return undefined } })()\n    const tokenCandidates: any[] = []\n    if (nx && typeof nx.getDataSourceToken === 'function') {\n      try { tokenCandidates.push(nx.getDataSourceToken()) } catch {}\n      try { tokenCandidates.push(nx.getDataSourceToken('default')) } catch {}\n    }\n    if (orm && orm.DataSource) tokenCandidates.push(orm.DataSource)\n    tokenCandidates.push('DataSource','DEFAULT_DATA_SOURCE','TypeOrmDataSource')\n    for (const t of tokenCandidates) {\n      try {\n        const ds = ref.get(t as any, { strict: false })\n        if (ds) { (CrudmanRegistry.get() as any).setDataSource(ds); return }\n      } catch {}\n    }\n  } catch {}\n}\n\n// Build inline JSON schema (entity properties with readonly fields removed). For update, make all fields optional.\nfunction buildInlineJsonSchema(document: any, entityName: string, sectionCfg: any, mode: 'create' | 'update'): any | null {\n  try {\n    let comp = document?.components?.schemas?.[entityName]\n    if (!comp || typeof comp !== 'object' || !comp.properties) {\n      // Fallback: derive from ORM metadata directly (no app.init required)\n      let derived = generateOpenApiSchemaFromEntity((sectionCfg as any)?.model)\n      if (!derived) derived = deriveOpenApiSchemaByEntityName(entityName)\n      if (!derived) return null\n      comp = derived\n    }\n    const properties: Record<string, any> = {}\n    const required: string[] = []\n    // Determine readonly fields using ORM metadata and upload targets like in multipart\n    const readonlyFields = new Set<string>()\n    const relationFields = new Set<string>()\n    try {\n      const ds = CrudmanRegistry.get().getDataSource?.()\n      const meta = ds ? safeGetMetadata(ds, (sectionCfg as any)?.model) : null\n      for (const col of meta?.columns || []) {\n        if (col.isPrimary || col.isGenerated || col.isCreateDate || col.isUpdateDate) readonlyFields.add(col.propertyName)\n      }\n      for (const rel of meta?.relations || []) {\n        relationFields.add(rel.propertyName)\n      }\n      const uploadCfg = (sectionCfg && sectionCfg.upload) || expandUploadableShorthandSafe(sectionCfg)\n      if (uploadCfg && Array.isArray(uploadCfg.map)) {\n        for (const rule of uploadCfg.map) {\n          const tf = rule?.targetField\n          if (typeof tf === 'string') readonlyFields.add(tf)\n          else if (tf && typeof tf === 'object') {\n            for (const v of Object.values(tf)) if (typeof v === 'string') readonlyFields.add(v as string)\n          }\n        }\n      }\n    } catch {}\n    const relationNames = getRelationFieldNames(document, entityName, sectionCfg)\n    for (const [name, prop] of Object.entries<any>(comp.properties)) {\n      const n = String(name)\n      if (readonlyFields.has(n)) continue\n      const includeRelations = CrudmanRegistry.get().getIncludeRelationsInWriteBody()\n      const looksLikeRelation = !!(prop && (prop.$ref || (prop.items && (prop.items as any).$ref)))\n      if (!includeRelations && (relationFields.has(n) || relationNames.has(n) || looksLikeRelation)) continue\n      if (!isWritableScalarProperty(prop)) continue\n      properties[name] = prop\n    }\n    if (mode === 'create') {\n      const baseReq = Array.isArray((comp as any).required) ? (comp as any).required : []\n      for (const r of baseReq) if (!readonlyFields.has(String(r)) && properties[r]) required.push(String(r))\n    }\n    return { type: 'object', properties, required: required.length ? required : undefined }\n  } catch { return null }\n}\n\nfunction isGenericObjectSchema(schema: any): boolean {\n  try {\n    if (!schema || typeof schema !== 'object') return false\n    if (schema.$ref) return false\n    const t = schema.type\n    const hasProps = !!schema.properties || !!schema.items\n    return t === 'object' && !hasProps\n  } catch { return false }\n}\n\n// Build an example JSON object for the given entity from its schema (component or derived)\nfunction buildExampleForEntity(document: any, entityName: string, sectionCfg: any): any | null {\n  try {\n    let comp = document?.components?.schemas?.[entityName]\n    if (!comp || typeof comp !== 'object' || !comp.properties || isGenericObjectSchema(comp)) {\n      const derived = generateOpenApiSchemaFromEntity((sectionCfg as any)?.model)\n      if (!derived || !derived.properties) return null\n      comp = derived\n    }\n    const example: Record<string, any> = {}\n    for (const [name, prop] of Object.entries<any>(comp.properties || {})) {\n      if (prop?.readOnly) continue\n      const n = String(name)\n      const t = prop?.type || 'string'\n      // Simple heuristics for realistic samples\n      if (prop?.format === 'date-time') example[n] = new Date().toISOString()\n      else if (/email/i.test(n)) example[n] = 'user@example.com'\n      else if (/name/i.test(n)) example[n] = 'John Doe'\n      else if (/phone|mobile|contact/i.test(n)) example[n] = '+1-555-123-4567'\n      else if (t === 'integer' || t === 'number') example[n] = 123\n      else if (t === 'boolean') example[n] = true\n      else if (t === 'array') example[n] = []\n      else example[n] = 'string'\n    }\n    return Object.keys(example).length ? example : null\n  } catch { return null }\n}\n\n// Collect relation field names from ORM metadata and from component schema refs\nfunction getRelationFieldNames(document: any, entityName: string, sectionCfg: any): Set<string> {\n  const out = new Set<string>()\n  try {\n    const ds = CrudmanRegistry.get().getDataSource?.()\n    const meta = ds ? safeGetMetadata(ds, (sectionCfg as any)?.model) : null\n    for (const rel of meta?.relations || []) out.add(String(rel.propertyName))\n  } catch {}\n  try {\n    const comp = document?.components?.schemas?.[entityName]\n    for (const [k, v] of Object.entries<any>(comp?.properties || {})) {\n      if (!v) continue\n      if (v.$ref) out.add(String(k))\n      else if (v.type === 'array' && v.items && (v.items as any).$ref) out.add(String(k))\n      else if (v.type === 'object' && !v.properties) out.add(String(k))\n    }\n  } catch {}\n  return out\n}\n\n// Remove relation-like properties from a schema object (does not mutate original)\nfunction stripRelationPropsFromSchema(schema: any, document: any, entityName: string, sectionCfg: any): any {\n  try {\n    const include = CrudmanRegistry.get().getIncludeRelationsInWriteBody()\n    if (include) return schema\n    const rels = getRelationFieldNames(document, entityName, sectionCfg)\n    const copy = JSON.parse(JSON.stringify(schema))\n    const props = (copy && copy.properties && typeof copy.properties === 'object') ? copy.properties : null\n    if (!props) return copy\n    for (const [k, v] of Object.entries<any>(props)) {\n      const looksLikeRelation = !!(v && (v.$ref || (v.type === 'array' && v.items && (v.items as any).$ref) || v.type === 'object'))\n      if (rels.has(String(k)) || looksLikeRelation) delete (props as any)[k]\n    }\n    if (Array.isArray(copy.required)) copy.required = copy.required.filter((r: any) => !!props[r])\n    return copy\n  } catch { return schema }\n}\n\nfunction computeEffectiveUploadValidators(rule: any, sectionCfg: any): any {\n  try {\n    const reg = CrudmanRegistry.get()\n    const globalLimits = reg.getUploadLimits() || {}\n    const typeDefaults = getTypeHintDefaults(String(rule?.typeHint || ''))\n    const sectionDefaults = (sectionCfg?.uploadDefaults?.validators) || {}\n    return { ...typeDefaults, ...globalLimits, ...sectionDefaults, ...(rule.validators || {}) }\n  } catch { return rule?.validators || {} }\n}\n\nfunction getTypeHintDefaults(typeHint: string): any {\n  const map: Record<string, any> = {\n    'image': { allowedMimeTypes: ['image/jpeg','image/png','image/gif','image/webp','image/avif'], allowedExtensions: ['.jpg','.jpeg','.png','.gif','.webp','.avif'], maxSizeMB: 5 },\n    'image-jpg': { allowedMimeTypes: ['image/jpeg'], allowedExtensions: ['.jpg','.jpeg'], maxSizeMB: 5 },\n    'image-png': { allowedMimeTypes: ['image/png'], allowedExtensions: ['.png'], maxSizeMB: 5 },\n    'image-gif': { allowedMimeTypes: ['image/gif'], allowedExtensions: ['.gif'], maxSizeMB: 5 },\n    'image-webp': { allowedMimeTypes: ['image/webp'], allowedExtensions: ['.webp'], maxSizeMB: 5 },\n    'image-avif': { allowedMimeTypes: ['image/avif'], allowedExtensions: ['.avif'], maxSizeMB: 5 },\n    'image-avatar': { allowedMimeTypes: ['image/jpeg','image/png','image/gif','image/webp','image/avif'], allowedExtensions: ['.jpg','.jpeg','.png','.gif','.webp','.avif'], maxSizeMB: 2 },\n    'image-jpg-avatar': { allowedMimeTypes: ['image/jpeg'], allowedExtensions: ['.jpg','.jpeg'], maxSizeMB: 2 },\n    'image-png-avatar': { allowedMimeTypes: ['image/png'], allowedExtensions: ['.png'], maxSizeMB: 2 },\n    'image-webp-avatar': { allowedMimeTypes: ['image/webp'], allowedExtensions: ['.webp'], maxSizeMB: 2 },\n    'image-avif-avatar': { allowedMimeTypes: ['image/avif'], allowedExtensions: ['.avif'], maxSizeMB: 2 },\n    'video': { allowedMimeTypes: ['video/mp4','video/webm','video/ogg'], allowedExtensions: ['.mp4','.webm','.ogg'], maxSizeMB: 100 },\n    'video-mp4': { allowedMimeTypes: ['video/mp4'], allowedExtensions: ['.mp4'], maxSizeMB: 100 },\n    'video-webm': { allowedMimeTypes: ['video/webm'], allowedExtensions: ['.webm'], maxSizeMB: 100 },\n    'video-ogg': { allowedMimeTypes: ['video/ogg'], allowedExtensions: ['.ogg'], maxSizeMB: 100 },\n    'video-short': { allowedMimeTypes: ['video/mp4','video/webm'], allowedExtensions: ['.mp4','.webm'], maxSizeMB: 25 },\n    'audio': { allowedMimeTypes: ['audio/mpeg','audio/mp4','audio/aac','audio/ogg','audio/wav'], allowedExtensions: ['.mp3','.m4a','.aac','.ogg','.wav'], maxSizeMB: 20 },\n    'pdf': { allowedExtensions: ['.pdf'], maxSizeMB: 10 },\n    'doc': { allowedExtensions: ['.pdf','.doc','.docx','.odt'], maxSizeMB: 10 },\n    'spreadsheet': { allowedExtensions: ['.xls','.xlsx','.csv'], maxSizeMB: 10 },\n    'spreadsheet-csv': { allowedMimeTypes: ['text/csv'], allowedExtensions: ['.csv'], maxSizeMB: 5 },\n    'spreadsheet-xls': { allowedMimeTypes: ['application/vnd.ms-excel'], allowedExtensions: ['.xls'], maxSizeMB: 10 },\n    'spreadsheet-xlsx': { allowedMimeTypes: ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'], allowedExtensions: ['.xlsx'], maxSizeMB: 10 },\n    'text': { allowedMimeTypes: ['text/plain','text/markdown'], allowedExtensions: ['.txt','.md'], maxSizeMB: 2 },\n    'csv': { allowedMimeTypes: ['text/csv'], allowedExtensions: ['.csv'], maxSizeMB: 5 },\n    'xml': { allowedMimeTypes: ['application/xml','text/xml'], allowedExtensions: ['.xml'], maxSizeMB: 2 },\n    'html': { allowedMimeTypes: ['text/html'], allowedExtensions: ['.html','.htm'], maxSizeMB: 2 },\n    'json': { allowedMimeTypes: ['application/json'], allowedExtensions: ['.json'], maxSizeMB: 2 },\n    'archive': { allowedExtensions: ['.zip','.tar','.gz','.rar','.7z'], maxSizeMB: 200 },\n    'binary': { allowedMimeTypes: ['application/octet-stream'], maxSizeMB: 50 },\n    'any': {}\n  }\n  return map[typeHint] || {}\n}\n\n\n"],"mappings":"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","names":["NodeCache","Validator","import_common","import_fs","fs","fs","payload","fmt","body","entity","import_common","path","existing","import_common","import_common","swagger","meta","path","sectionKeyGuess","allow","mod"]}