{"version":3,"file":"index.mjs","sources":["../src/utils/path.ts","../src/utils/strings.ts","../src/utils/mime.ts","../src/utils/url.ts","../src/index.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\n\n/**\n * Sanitizes a \"directory path\" value (relative path).\n * - normalizes to NFD\n * - strips diacritics\n * - keeps only [a-zA-Z0-9._-] in segments\n * - prevents empty segments, \".\", \"..\", and leading dots\n * - joins segments with forward slashes\n */\nexport function sanitizePathDir(input: string): string {\n  const raw = (input ?? '').toString().normalize('NFD').trim().replace(/\\\\/g, '/');\n  if (!raw) return '';\n\n  const parts = raw.split('/').map((p) => p.trim()).filter(Boolean);\n  const out: string[] = [];\n\n  for (const part of parts) {\n    let s = part.normalize('NFD');\n    s = s.replace(/[\\u0300-\\u036f]/g, '');\n    s = s.replace(/\\s+/g, '-');\n    s = s.replace(/[^a-zA-Z0-9._-]/g, '');\n    s = s.replace(/-+/g, '-');\n    s = s.replace(/^[.\\-]+/, '');\n    s = s.replace(/-+$/, '');\n\n    if (!s || s === '.' || s === '..') continue;\n    if (s.length > 128) s = s.slice(0, 128);\n    out.push(s);\n  }\n\n  const joined = out.join('/');\n  return joined.length > 512 ? joined.slice(0, 512) : joined;\n}\n\n/**\n * Sanitize an Admin (Media Library) folder name.\n * Rules:\n * - NFD normalize\n * - remove diacritics\n * - allow only: a-zA-Z0-9, space, underscore, hyphen\n * - collapse multiple spaces\n * - trim\n */\nexport function sanitizeAdminFolderName(input: string): string {\n  let s = (input ?? '').toString().normalize('NFD');\n  s = s.replace(/[\\u0300-\\u036f]/g, '');\n  s = s.replace(/[^a-zA-Z0-9 _-]/g, '');\n  s = s.replace(/\\s+/g, ' ').trim();\n  if (s.length > 128) s = s.slice(0, 128).trim();\n  return s;\n}\n\n/**\n * Sanitize an Admin (Media Library) folder path like \"a/b/c\".\n */\nexport function sanitizeAdminFolderPath(input: string): string {\n  const raw = (input ?? '').toString().trim().replace(/\\\\/g, '/');\n  if (!raw) return '';\n\n  const parts = raw.split('/').map((p) => sanitizeAdminFolderName(p)).filter(Boolean);\n  return parts.join('/');\n}\n\nexport function normalizeRelativeSlashPath(v: unknown): string {\n  return (typeof v === 'string' ? v : '')\n    .trim()\n    .replace(/\\\\/g, '/')\n    .replace(/^\\/+/, '')\n    .replace(/\\/+$/, '');\n}\n\nexport function safeResolveUnderRoot(root: string, rel: string): string | null {\n  const rootAbs = path.resolve(root);\n  const abs = path.resolve(rootAbs, rel);\n  if (abs === rootAbs) return null;\n  if (!abs.startsWith(rootAbs + path.sep)) return null;\n  return abs;\n}\n\n/**\n * Best-effort cleanup of empty directories under `root`.\n * Attempts to remove parents of `absFilePath` until it reaches `root` or finds a non-empty dir.\n */\nexport async function cleanupEmptyDirs(absFilePath: string, root: string): Promise<void> {\n  const rootAbs = path.resolve(root);\n  let current = path.dirname(absFilePath);\n\n  while (current.startsWith(rootAbs + path.sep) && current !== rootAbs) {\n    try {\n      const entries = await fs.promises.readdir(current);\n      if (entries.length > 0) return;\n      await fs.promises.rmdir(current);\n    } catch {\n      return;\n    }\n    current = path.dirname(current);\n  }\n}\n\n","export function getStringOrUndefined(v: unknown): string | undefined {\n  return typeof v === 'string' && v.trim().length > 0 ? v : undefined;\n}\n\nexport function escapeRegexLiteral(s: string): string {\n  return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n","import { getStringOrUndefined } from './strings';\n\nexport function normalizeExt(ext: unknown): string | null {\n  const raw = getStringOrUndefined(ext);\n  if (!raw) return null;\n  return raw.startsWith('.') ? raw : `.${raw}`;\n}\n\nexport function extFromMime(mime: unknown): string | null {\n  const m = getStringOrUndefined(mime)?.toLowerCase();\n  if (!m) return null;\n  if (m === 'image/jpeg' || m === 'image/jpg') return '.jpg';\n  if (m === 'image/png') return '.png';\n  if (m === 'image/webp') return '.webp';\n  if (m === 'image/gif') return '.gif';\n  if (m === 'image/svg+xml') return '.svg';\n  if (m === 'application/pdf') return '.pdf';\n  return null;\n}\n\n","import { getStringOrUndefined } from './strings';\n\nexport type ExtractObjectPathOptions = {\n  /**\n   * Marker inside pathname (e.g. \"/uploads/\") used to extract the objectPath.\n   * Default: \"/uploads/\"\n   */\n  marker?: string;\n  /**\n   * If provided, and the raw url starts with baseUrl, we will strip it and treat the remainder as objectPath.\n   * Useful when `file.url` is generated as `${baseUrl}/${objectPath}` without a \"/uploads/\" marker.\n   */\n  baseUrl?: string;\n};\n\nexport function extractObjectPathFromUrl(url: unknown, opts: ExtractObjectPathOptions = {}): string | null {\n  const raw = getStringOrUndefined(url);\n  if (!raw) return null;\n\n  const marker = opts.marker ?? '/uploads/';\n\n  let pathname = raw;\n  try {\n    if (/^\\w+:\\/\\//.test(raw)) {\n      pathname = new URL(raw).pathname;\n    } else {\n      pathname = raw.split('?')[0];\n    }\n  } catch {\n    pathname = raw.split('?')[0];\n  }\n\n  // 1) Preferred: marker extraction\n  const idx = pathname.indexOf(marker);\n  if (idx !== -1) {\n    const objectPath = pathname.slice(idx + marker.length).replace(/^\\/+/, '');\n    if (!objectPath) return null;\n    try {\n      return decodeURIComponent(objectPath);\n    } catch {\n      return objectPath;\n    }\n  }\n\n  // 2) Fallback: strip baseUrl prefix (if the full url was built as baseUrl + objectPath)\n  const baseUrl = getStringOrUndefined(opts.baseUrl);\n  if (baseUrl && raw.startsWith(baseUrl)) {\n    const remainder = raw.slice(baseUrl.length).replace(/^\\/+/, '').split('?')[0];\n    if (!remainder) return null;\n    try {\n      return decodeURIComponent(remainder);\n    } catch {\n      return remainder;\n    }\n  }\n\n  return null;\n}\n\n","import { pipeline } from 'stream';\nimport crypto from 'crypto';\nimport fs, { ReadStream } from 'fs';\nimport path from 'path';\nimport fse from 'fs-extra';\nimport * as utils from '@strapi/utils';\nimport {\n  cleanupEmptyDirs,\n  sanitizeAdminFolderPath,\n  normalizeRelativeSlashPath,\n  safeResolveUnderRoot,\n  sanitizePathDir,\n} from './utils/path';\nimport { escapeRegexLiteral, getStringOrUndefined } from './utils/strings';\nimport { extFromMime, normalizeExt } from './utils/mime';\nimport { extractObjectPathFromUrl } from './utils/url';\n\n// Needed to load global.strapi without having to put @strapi/types in the regular dependencies\nimport type {} from '@strapi/types';\n\ninterface Config {\n  sizeLimit?: number;\n  baseUrl?: string;\n  prefix?: string;\n  debug?: boolean;\n  /**\n   * If true, providing `pathDir` that sanitizes to an empty string will throw instead of falling back.\n   */\n  strictPathDir?: boolean;\n  /**\n   * If true, after deleting a file, try to remove empty parent directories under uploads root.\n   */\n  cleanupEmptyDirs?: boolean;\n  /**\n   * If true, after deleting a file, try to delete empty Media Library folders (Admin) as well.\n   * Safety rules:\n   * - only deletes a folder if it has no child folders\n   * - only deletes a folder if it has no other files (excluding the file currently being deleted)\n   * - then repeats the same check for the parent folder (recursive upwards)\n   */\n  cleanupEmptyAdminFolders?: boolean;\n  /**\n   * If true (default), when `pathDir` is not provided, filesystem path will use `path` (admin path) for compatibility.\n   */\n  usePathAsPathDir?: boolean;\n  /**\n   * Marker used to extract objectPath from url during delete. Default: \"/uploads/\".\n   */\n  uploadsUrlMarker?: string;\n  /**\n   * If true, saved file name becomes `<uuidv4>_<hash><ext>` (e.g. `a1b2c3d4-..._abc123hash.ext`).\n   * Strapi's hash is still used; the UUID is added for a unique, non-guessable filename.\n   */\n  renameToUuid?: boolean;\n  /**\n   * If true, enables private folder: files under this path are only accessible when authenticated\n   * (Admin: full access; API: only if JWT user's documentId matches path, or valid HMAC URL).\n   */\n  privateEnable?: boolean;\n  /**\n   * Name of the private folder in filesystem and Admin (no leading/trailing slashes). Default: \"private\".\n   * URL pattern: /uploads/<privateFolder>/<documentId>/file.ext\n   */\n  privateFolder?: string;\n  /**\n   * TTL in seconds for HMAC-signed URLs. Default: 60.\n   */\n  privateTTL?: number;\n  /**\n   * Secret for HMAC-signed URLs (required if you want ?token=...&expires=... access).\n   */\n  privateSecret?: string;\n  /**\n   * Field on the users-permissions user entity used as documentId for path matching. Default: \"id\".\n   */\n  privateUserDocumentIdField?: string;\n}\n\nexport interface File {\n  stream?: ReadStream;\n  buffer?: Buffer;\n  name?: string;\n  alternativeText?: string;\n  caption?: string;\n  width?: number;\n  height?: number;\n  formats?: Record<string, unknown>;\n  hash: string;\n  ext?: string;\n  mime?: string;\n  size?: number;\n  sizeInBytes?: number;\n  url?: string;\n  previewUrl?: string;\n  path?: string;\n  folder?: number | null;\n  folderPath?: string | null;\n  provider?: string;\n}\n\nconst { PayloadTooLargeError } = utils.errors;\nconst { kbytesToBytes, bytesToHumanReadable } = utils.file;\n\nconst UPLOADS_FOLDER_NAME = 'uploads';\n\n/** Build HMAC signature for private URL (token = base64url(hmac(secret, path + expires))) */\nfunction signPrivateUrl(secret: string, requestPath: string, expiresAt: number): string {\n  const payload = `${requestPath}\\n${expiresAt}`;\n  const hmac = crypto.createHmac('sha256', secret).update(payload).digest();\n  return hmac.toString('base64url');\n}\n\n/** Verify HMAC token for private URL */\nfunction verifyPrivateUrlToken(secret: string, requestPath: string, expiresAt: number, token: string): boolean {\n  if (!secret || !token) return false;\n  const expected = signPrivateUrl(secret, requestPath, expiresAt);\n  return crypto.timingSafeEqual(Buffer.from(expected, 'base64url'), Buffer.from(token, 'base64url'));\n}\n\n/**\n * Removes leading and trailing slashes from a path prefix\n * @param prefix path prefix to normalize\n * @returns normalized prefix string\n */\nfunction normalizePrefix(prefix: string): string {\n  prefix = prefix.trim().replace(/^\\/+/, '').replace(/\\/+$/, '');\n  if (!prefix) {\n    return '';\n  }\n  return prefix + '/';\n}\n\n/**\n * Safely joins path segments with forward slashes\n * @param segments path segments\n * @returns joined path string\n */\nfunction join(...segments: string[]): string {\n  let s = '';\n  for (let i = 0; i < segments.length - 1; i++) {\n    const l = segments[i];\n    s += l.endsWith('/') || l === '' ? l : l + '/';\n  }\n  s += segments[segments.length - 1];\n  return s;\n}\n\n/**\n * Ensure a media-library (admin) folder exists for a given \"path\" (e.g. \"a/b/c\"),\n * and return the id of the leaf folder.\n */\nasync function ensureUploadFolderFromPath(\n  folderPath: string,\n  opts?: { user?: { id: string | number } }\n): Promise<number> {\n  const sanitizedFolderPath = sanitizeAdminFolderPath(folderPath);\n  const parts = sanitizedFolderPath.split('/').map((p) => p.trim()).filter(Boolean);\n  if (parts.length === 0) throw new Error('Invalid folder path');\n\n  const folderService: any = strapi?.plugin?.('upload')?.service?.('folder');\n  if (!folderService?.create) throw new Error('Upload folder service is not available');\n\n  let parent: number | null = null;\n  for (const name of parts) {\n    const existing = await strapi.db.query('plugin::upload.folder').findOne({\n      where: { name, parent },\n    });\n\n    if (existing?.id) {\n      parent = existing.id;\n      continue;\n    }\n\n    const created = await folderService.create(\n      { name, parent },\n      opts?.user ? { user: opts.user } : undefined\n    );\n    parent = created.id;\n  }\n\n  if (!parent) throw new Error('Could not create or resolve folder path');\n  return parent;\n}\n\n/**\n * Monkey-patch Strapi's upload service to support:\n * - `data.path`: creates/targets a Media Library folder (admin)\n * - `data.pathDir`: filesystem directory path (sanitized NFD) mapped to provider `file.path`\n * - `data.private`: when true and privateEnable, path becomes privateFolder/documentId (pathDir = documentId)\n *\n * Backward compatible: if `pathDir` is not provided, the filesystem path will use `path`.\n */\nfunction patchUploadServiceForPathDirSupport(patchOpts: {\n  strictPathDir: boolean;\n  usePathAsPathDir: boolean;\n  debugLog: (...args: unknown[]) => void;\n  privateEnable?: boolean;\n  privateFolder?: string;\n}) {\n  const uploadService: any = strapi?.plugin?.('upload')?.service?.('upload');\n  if (!uploadService?.upload || typeof uploadService.upload !== 'function') return;\n\n  if (uploadService.__strapiProviderUploadLocalPathPatched) return;\n  uploadService.__strapiProviderUploadLocalPathPatched = true;\n\n  const applyPathMapping = async (data: Record<string, unknown>, uploadOpts?: any) => {\n    const isPrivate = patchOpts.privateEnable && (data as any).private === true;\n    const pathDirRaw = getStringOrUndefined((data as any).pathDir);\n    let adminPath = getStringOrUndefined(data.path);\n\n    if (isPrivate) {\n      if (!pathDirRaw || !patchOpts.privateFolder) {\n        throw new Error('When data.private is true, pathDir (documentId) is required and privateFolder must be set');\n      }\n      const privateFolderNorm = patchOpts.privateFolder!.replace(/^\\/+|\\/+$/g, '').trim() || 'private';\n      const documentId = sanitizePathDir(pathDirRaw);\n      if (!documentId) {\n        throw new Error('When data.private is true, pathDir (documentId) must not sanitize to empty');\n      }\n      adminPath = `${privateFolderNorm}/${documentId}`;\n      (data as any).path = adminPath;\n      delete (data as any).pathDir;\n      patchOpts.debugLog('[upload-local-path] private path mapped', { adminPath, documentId });\n    }\n\n    // If nothing special requested (and not private), keep original behavior\n    if (!adminPath && !pathDirRaw && !isPrivate) {\n      return { changed: false };\n    }\n\n    // 1) Media Library folder (Admin)\n    if (adminPath) {\n      const folderId = await ensureUploadFolderFromPath(adminPath, { user: uploadOpts?.user });\n\n      // Multi-upload support: fileInfo can be object or array (one per file).\n      const fileInfoAny = (data as any).fileInfo;\n      if (Array.isArray(fileInfoAny)) {\n        (data as any).fileInfo = fileInfoAny.map((fi) => ({ ...(fi ?? {}), folder: folderId }));\n      } else {\n        const fileInfo = ((data as any).fileInfo ?? {}) as Record<string, unknown>;\n        (data as any).fileInfo = { ...fileInfo, folder: folderId };\n      }\n    }\n\n    // 2) Filesystem path -> metas.path (provider file.path)\n    if (!isPrivate) {\n      const fsPathSource = pathDirRaw ?? (patchOpts.usePathAsPathDir ? adminPath ?? '' : '');\n      const fsPath = fsPathSource ? sanitizePathDir(fsPathSource) : '';\n\n      if (pathDirRaw && patchOpts.strictPathDir && !fsPath) {\n        throw new Error('Invalid pathDir (sanitizes to empty)');\n      }\n\n      if (fsPath) {\n        data.path = fsPath;\n      } else {\n        delete data.path;\n      }\n\n      if ('pathDir' in data) delete (data as any).pathDir;\n    }\n\n    patchOpts.debugLog('[upload-local-path] metas mapped', {\n      adminPath,\n      pathDirRaw,\n      fsPath: (data as any).path,\n      hasFolder: !!((data as any).fileInfo as any)?.folder,\n      fileInfoIsArray: Array.isArray((data as any).fileInfo),\n    });\n\n    return { changed: true };\n  };\n\n  const originalUpload = uploadService.upload.bind(uploadService);\n  uploadService.upload = async (payload: any, uploadOpts?: any) => {\n    const data = (payload?.data ?? {}) as Record<string, unknown>;\n    const res = await applyPathMapping(data, uploadOpts);\n    if (!res.changed) return originalUpload(payload, uploadOpts);\n    return originalUpload({ ...payload, data }, uploadOpts);\n  };\n\n  // Replace compatibility (Strapi upload service has `replace` in core upload plugin)\n  if (typeof uploadService.replace === 'function') {\n    const originalReplace = uploadService.replace.bind(uploadService);\n    uploadService.replace = async (id: any, payload: any, uploadOpts?: any) => {\n      const data = (payload?.data ?? {}) as Record<string, unknown>;\n      const res = await applyPathMapping(data, uploadOpts);\n      if (!res.changed) return originalReplace(id, payload, uploadOpts);\n      return originalReplace(id, { ...payload, data }, uploadOpts);\n    };\n  }\n}\n\n/**\n * Initialize the plugin with configuration\n * @param config Provider configuration\n * @returns Provider object with upload, uploadStream, and delete handlers\n */\nexport function init(config: Config = {}) {\n  // TODO V5: remove providerOptions sizeLimit\n  if (config.sizeLimit) {\n    process.emitWarning(\n      '[deprecated] In future versions, \"sizeLimit\" argument will be ignored from upload.config.providerOptions. Move it to upload.config'\n    );\n  }\n\n  // Use default Strapi uploads folder\n  const uploadPath = path.resolve(strapi.dirs.static.public, UPLOADS_FOLDER_NAME);\n  const prefix = config.prefix ? normalizePrefix(config.prefix) : '';\n  const baseUrl = config.baseUrl;\n  const strictPathDir = config.strictPathDir === true;\n  const cleanupDirs = config.cleanupEmptyDirs === true;\n  const cleanupAdminFolders = config.cleanupEmptyAdminFolders === true;\n  const usePathAsPathDir = config.usePathAsPathDir !== false;\n  const uploadsUrlMarker = config.uploadsUrlMarker ?? `/${UPLOADS_FOLDER_NAME}/`;\n  const renameToUuid = config.renameToUuid === true;\n  const privateEnable = config.privateEnable === true;\n  const privateFolderNorm = privateEnable\n    ? (config.privateFolder ?? 'private').replace(/^\\/+|\\/+$/g, '').trim() || 'private'\n    : '';\n  const privateTTL = Math.max(1, Math.floor((config.privateTTL ?? 60) as number));\n  const privateSecret = config.privateSecret ?? '';\n  const privateUserDocumentIdField = config.privateUserDocumentIdField ?? 'id';\n\n  const debugEnabled =\n    config.debug === true ||\n    process.env.STRAPI_PROVIDER_UPLOAD_LOCAL_PATH_DEBUG === '1' ||\n    process.env.STRAPI_PROVIDER_UPLOAD_LOCAL_PATH_DEBUG === 'true';\n\n  const debugLog = (...args: unknown[]) => {\n    if (!debugEnabled) return;\n    const msg = args\n      .map((a) => (typeof a === 'string' ? a : a instanceof Error ? a.message : JSON.stringify(a)))\n      .join(' ');\n\n    // Prefer Strapi logger when available\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const logger: any = (global as any).strapi?.log;\n    if (logger?.debug) {\n      logger.debug(msg);\n      return;\n    }\n\n    // Fallback for environments without strapi logger\n    // eslint-disable-next-line no-console\n    console.debug(msg);\n  };\n\n  // Enable `data.pathDir` + Admin `data.path` + `data.private` support (once)\n  try {\n    patchUploadServiceForPathDirSupport({\n      strictPathDir,\n      usePathAsPathDir,\n      debugLog,\n      privateEnable,\n      privateFolder: privateFolderNorm || undefined,\n    });\n    debugLog('[upload-local-path] upload service patched (path + pathDir + private)');\n  } catch {\n    // provider should keep working even if patch fails\n    debugLog('[upload-local-path] could not patch upload service');\n  }\n\n  // Ensure uploads folder exists\n  if (!fse.pathExistsSync(uploadPath)) {\n    try {\n      fse.ensureDirSync(uploadPath);\n    } catch (error) {\n      throw new Error(\n        `The upload folder (${uploadPath}) doesn't exist or could not be created. Please check permissions.`\n      );\n    }\n  }\n\n  const privateUrlPrefix = `/${UPLOADS_FOLDER_NAME}/${privateFolderNorm}/`;\n  if (privateEnable && privateFolderNorm) {\n    try {\n      const server = (strapi as any).server;\n      if (server?.use) {\n        server.use(async (ctx: any, next: () => Promise<void>) => {\n          if (ctx.method !== 'GET' || !ctx.path.startsWith(privateUrlPrefix)) {\n            return next();\n          }\n          const pathAfterUploads = ctx.path.slice(`/${UPLOADS_FOLDER_NAME}/`.length);\n          const objectPath = pathAfterUploads.replace(/^\\/+/, '').replace(/\\\\/g, '/');\n          const absPath = safeResolveUnderRoot(uploadPath, objectPath);\n          if (!absPath || !fs.existsSync(absPath) || !fs.statSync(absPath).isFile()) {\n            ctx.status = 404;\n            return;\n          }\n          const pathSegments = pathAfterUploads.split('/').filter(Boolean);\n          const documentIdInPath = pathSegments[1] ?? '';\n          let allowed = false;\n\n          const authHeader = ctx.request.headers?.authorization;\n          const bearerToken = typeof authHeader === 'string' && authHeader.toLowerCase().startsWith('bearer ')\n            ? authHeader.slice(7).trim()\n            : '';\n\n          if (bearerToken) {\n            try {\n              const adminTokenService = (strapi as any).admin?.services?.token;\n              if (adminTokenService?.decode) {\n                const decoded = adminTokenService.decode(bearerToken);\n                if (decoded) {\n                  allowed = true;\n                  debugLog('[upload-local-path] private access allowed (admin)');\n                }\n              }\n            } catch {\n              // not admin token\n            }\n            if (!allowed) {\n              try {\n                const jwtService = (strapi as any).plugin?.('users-permissions')?.service?.('jwt');\n                if (jwtService?.verify) {\n                  const decoded = await jwtService.verify(bearerToken);\n                  const userId = decoded?.id ?? decoded?.sub;\n                  if (userId != null) {\n                    const user = await (strapi as any).db?.query?.('plugin::users-permissions.user')?.findOne({\n                      where: { id: userId },\n                    });\n                    const userDocumentId = user != null ? String((user as any)[privateUserDocumentIdField] ?? user.id) : '';\n                    if (userDocumentId && documentIdInPath === userDocumentId) {\n                      allowed = true;\n                      debugLog('[upload-local-path] private access allowed (user documentId match)');\n                    }\n                  }\n                }\n              } catch {\n                // invalid user token\n              }\n            }\n          }\n          if (!allowed && privateSecret) {\n            const token = ctx.request.query?.token;\n            const expires = ctx.request.query?.expires;\n            const expiresNum = typeof expires === 'string' ? parseInt(expires, 10) : NaN;\n            if (token && !Number.isNaN(expiresNum) && expiresNum * 1000 > Date.now() && verifyPrivateUrlToken(privateSecret, ctx.path, expiresNum, token)) {\n              allowed = true;\n              debugLog('[upload-local-path] private access allowed (HMAC)');\n            }\n          }\n          if (!allowed) {\n            ctx.status = 403;\n            return;\n          }\n          ctx.type = path.extname(absPath);\n          ctx.body = fs.createReadStream(absPath);\n        });\n        debugLog('[upload-local-path] private route registered', privateUrlPrefix);\n      }\n    } catch (err) {\n      debugLog('[upload-local-path] could not register private route', err);\n    }\n  }\n\n  /**\n   * Unified upload function for both buffer and stream\n   * @param file File object from strapi controller\n   * @param customParams action parameters, overridable from config\n   */\n  const upload = async (\n    file: File,\n    customParams: Record<string, unknown> = {}\n  ) => {\n    const rawPath = file.path ?? '';\n    const dynamicPath = rawPath ? sanitizePathDir(rawPath) : '';\n    if (strictPathDir && file.path && !dynamicPath) {\n      throw new Error('Invalid file.path (sanitizes to empty)');\n    }\n    const filename = renameToUuid\n      ? `${crypto.randomUUID()}_${file.hash}${file.ext ?? ''}`\n      : `${file.hash}${file.ext ?? ''}`;\n    const objectPath = join(prefix, dynamicPath, filename);\n    const finalUploadPath = path.join(uploadPath, objectPath);\n\n    try {\n      debugLog('[upload-local-path] upload', {\n        hash: file.hash,\n        ext: file.ext,\n        dynamicPath,\n        objectPath,\n        finalUploadPath,\n      });\n\n      // Ensure directory exists\n      await fse.ensureDir(path.dirname(finalUploadPath));\n\n      // Handle stream or buffer\n      if (file.stream) {\n        const writeStream = fs.createWriteStream(finalUploadPath);\n        await new Promise<void>((resolve, reject) => {\n          pipeline(file.stream!, writeStream, (err) => {\n            if (err) reject(err);\n            else resolve();\n          });\n        });\n      } else if (file.buffer) {\n        await fs.promises.writeFile(finalUploadPath, file.buffer);\n      } else {\n        throw new Error('File must have either stream or buffer');\n      }\n\n      // Generate URL\n      if (baseUrl) {\n        file.url = join(baseUrl, objectPath);\n      } else {\n        file.url = `/${UPLOADS_FOLDER_NAME}/${objectPath}`;\n      }\n      debugLog('[upload-local-path] url', file.url);\n\n    } catch (err) {\n      console.error('Error uploading file to %s', finalUploadPath, err);\n      throw err;\n    }\n  };\n\n  const maybeCleanupEmptyAdminFolders = async (file: File) => {\n    if (!cleanupAdminFolders) return;\n    // Strapi may call provider.delete before removing the DB row.\n    // We predict the \"post-delete\" state by excluding the current file hash.\n\n    let folderId: number | null = typeof file.folder === 'number' ? file.folder : null;\n    const folderPathFromPayload =\n      typeof file.folderPath === 'string' && file.folderPath.trim().length > 0\n        ? file.folderPath.trim()\n        : null;\n\n    if (!folderId) {\n      // Try resolving from folderPath (works even if DB file row is already deleted)\n      if (folderPathFromPayload) {\n        try {\n          const folderByPath = await strapi.db.query('plugin::upload.folder').findOne({\n            where: { path: folderPathFromPayload },\n          });\n          folderId = typeof folderByPath?.id === 'number' ? folderByPath.id : null;\n        } catch {\n          folderId = null;\n        }\n      }\n    }\n\n    if (!folderId) {\n      try {\n        const dbFile = await strapi.db.query('plugin::upload.file').findOne({\n          where: { hash: file.hash },\n        });\n        folderId = typeof dbFile?.folder === 'number' ? dbFile.folder : dbFile?.folder?.id ?? null;\n        if (!folderId && typeof dbFile?.folderPath === 'string' && dbFile.folderPath) {\n          const folderByPath = await strapi.db.query('plugin::upload.folder').findOne({\n            where: { path: dbFile.folderPath },\n          });\n          folderId = typeof folderByPath?.id === 'number' ? folderByPath.id : null;\n        }\n      } catch {\n        folderId = null;\n      }\n    }\n\n    if (!folderId) return;\n\n    const folderService: any = strapi?.plugin?.('upload')?.service?.('folder');\n    const deleteFolderById = async (id: number) => {\n      if (folderService?.deleteByIds) {\n        await folderService.deleteByIds([id]);\n        return;\n      }\n      await strapi.db.query('plugin::upload.folder').delete({ where: { id } });\n    };\n\n    // Walk up and delete empty folders\n    // eslint-disable-next-line no-constant-condition\n    while (true) {\n      let currentFolder: any = null;\n      try {\n        currentFolder = await strapi.db.query('plugin::upload.folder').findOne({\n          where: { id: folderId },\n          populate: { parent: { select: ['id'] } },\n        });\n      } catch {\n        return;\n      }\n\n      if (!currentFolder) return;\n\n      // Has child folders?\n      let childCount = 0;\n      try {\n        childCount = await strapi.db.query('plugin::upload.folder').count({\n          where: { parent: folderId },\n        });\n      } catch {\n        return;\n      }\n\n      if (childCount > 0) return;\n\n      // Has other files?\n      let fileCount = 0;\n      try {\n        // Prefer checking by folderPath (Strapi stores file.folderPath = folder.path)\n        fileCount = await strapi.db.query('plugin::upload.file').count({\n          where: {\n            folderPath: currentFolder.path,\n            hash: { $ne: file.hash },\n          },\n        });\n      } catch {\n        return;\n      }\n\n      if (fileCount > 0) return;\n\n      const parentId: number | null =\n        typeof currentFolder?.parent === 'number'\n          ? currentFolder.parent\n          : currentFolder?.parent?.id ?? null;\n\n      try {\n        await deleteFolderById(folderId);\n        debugLog('[upload-local-path] admin folder deleted (empty)', { id: folderId });\n      } catch {\n        return;\n      }\n\n      if (!parentId) return;\n      folderId = parentId;\n    }\n  };\n\n  const provider = {\n    isPrivate(file?: File) {\n      if (!privateEnable || !privateFolderNorm) return false;\n      if (!file) return true;\n      const u = file?.url ?? '';\n      return u.includes(`/${UPLOADS_FOLDER_NAME}/${privateFolderNorm}/`);\n    },\n\n    async getSignedUrl(file: File, customParams: Record<string, unknown> = {}): Promise<{ url: string }> {\n      const raw = file?.url ?? '';\n      if (!privateEnable || !privateSecret || !raw) return { url: raw };\n      const canonicalUrl = raw.split('?')[0];\n      const requestPath = canonicalUrl.startsWith('http') ? new URL(canonicalUrl).pathname : canonicalUrl;\n      const expiresAt = Math.floor(Date.now() / 1000) + privateTTL;\n      const token = signPrivateUrl(privateSecret, requestPath, expiresAt);\n      return { url: `${canonicalUrl}?token=${encodeURIComponent(token)}&expires=${expiresAt}` };\n    },\n\n    checkFileSize(file: File, options: { sizeLimit?: number } = {}) {\n      const { sizeLimit } = options;\n\n      // TODO V5: remove providerOptions sizeLimit\n      if (config.sizeLimit) {\n        if (kbytesToBytes(file.size || 0) > config.sizeLimit)\n          throw new PayloadTooLargeError(\n            `${file.name} exceeds size limit of ${bytesToHumanReadable(\n              config.sizeLimit\n            )}.`\n          );\n      } else if (sizeLimit) {\n        if (kbytesToBytes(file.size || 0) > sizeLimit)\n          throw new PayloadTooLargeError(\n            `${file.name} exceeds size limit of ${bytesToHumanReadable(sizeLimit)}.`\n          );\n      }\n    },\n\n    uploadStream(file: File, customParams: Record<string, unknown> = {}) {\n      return upload(file, customParams);\n    },\n\n    upload(file: File, customParams: Record<string, unknown> = {}) {\n      return upload(file, customParams);\n    },\n\n    async delete(file: File, customParams: Record<string, unknown> = {}) {\n      // Some delete payloads can miss `ext` or `path`.\n      // Build a set of filename candidates from multiple sources.\n      const extCandidates = new Set<string>();\n\n      const extDirect = normalizeExt(file.ext);\n      if (extDirect) extCandidates.add(extDirect);\n\n      const objectFromUrl = extractObjectPathFromUrl(file.url, {\n        marker: uploadsUrlMarker,\n        baseUrl,\n      });\n      if (objectFromUrl) {\n        const extFromUrl = path.posix.extname(objectFromUrl);\n        if (extFromUrl) extCandidates.add(extFromUrl);\n      }\n\n      const objectFromPreviewUrl = extractObjectPathFromUrl(file.previewUrl, {\n        marker: uploadsUrlMarker,\n        baseUrl,\n      });\n      if (objectFromPreviewUrl) {\n        const extFromPUrl = path.posix.extname(objectFromPreviewUrl);\n        if (extFromPUrl) extCandidates.add(extFromPUrl);\n      }\n\n      const nameExt = file.name ? path.extname(file.name) : '';\n      if (nameExt) extCandidates.add(nameExt);\n\n      const mimeExt = extFromMime(file.mime);\n      if (mimeExt) extCandidates.add(mimeExt);\n\n      // If still unknown, allow empty ext (best-effort)\n      if (extCandidates.size === 0) extCandidates.add('');\n\n      const rawPath = file.path ?? '';\n      const dynamicPathSanitized = rawPath ? sanitizePathDir(rawPath) : '';\n      const dynamicPathRaw = normalizeRelativeSlashPath(rawPath);\n\n      try {\n        const objectPaths = new Set<string>();\n        const dirCandidates = new Set<string>();\n\n        for (const ext of extCandidates) {\n          const filename = `${file.hash}${ext}`;\n\n          // 1) Most common: use file.path (sanitized)\n          objectPaths.add(join(prefix, dynamicPathSanitized, filename));\n\n          // 2) In case legacy uploads stored raw path (or sanitization differs)\n          if (dynamicPathRaw) {\n            objectPaths.add(join(prefix, dynamicPathRaw, filename));\n          }\n\n          // 3) Absolute fallback: root of uploads (no dynamic path)\n          objectPaths.add(join(prefix, filename));\n          objectPaths.add(filename);\n        }\n\n        // 4) Fallback: try to infer the full objectPath from URL(s) (already includes filename)\n        if (objectFromUrl) objectPaths.add(objectFromUrl);\n        if (objectFromPreviewUrl) objectPaths.add(objectFromPreviewUrl);\n\n        for (const objectPath of objectPaths) {\n          const rel = normalizeRelativeSlashPath(objectPath);\n          if (!rel) continue;\n\n          const abs = safeResolveUnderRoot(uploadPath, rel);\n          if (!abs) continue;\n\n          if (!fs.existsSync(abs)) continue;\n\n          await fs.promises.unlink(abs);\n          debugLog('[upload-local-path] delete removed (direct)', abs);\n          if (cleanupDirs) {\n            await cleanupEmptyDirs(abs, uploadPath);\n          }\n          await maybeCleanupEmptyAdminFolders(file);\n          return;\n        }\n\n        // Last resort: scan likely directories and delete by filename match.\n        // This covers cases where Strapi doesn't pass `path` or `ext` correctly for the main file.\n        for (const objectPath of objectPaths) {\n          const rel = normalizeRelativeSlashPath(objectPath);\n          if (!rel) continue;\n          const relDir = rel.includes('/') ? rel.slice(0, rel.lastIndexOf('/')) : '';\n          const absDir = safeResolveUnderRoot(uploadPath, relDir || '.');\n          if (absDir) dirCandidates.add(absDir);\n        }\n\n        dirCandidates.add(path.resolve(uploadPath));\n\n        const hash = file.hash;\n        const hashEscaped = escapeRegexLiteral(hash);\n        const knownExts = Array.from(extCandidates).filter((e) => e);\n        const filenameRegex =\n          knownExts.length > 0\n            ? new RegExp(`^${hashEscaped}(${knownExts.map(escapeRegexLiteral).join('|')})$`, 'i')\n            : new RegExp(`^${hashEscaped}\\\\.[a-z0-9]{1,6}$`, 'i');\n\n        for (const dir of dirCandidates) {\n          let entries: string[] = [];\n          try {\n            entries = await fs.promises.readdir(dir);\n          } catch {\n            continue;\n          }\n\n          for (const name of entries) {\n            if (!filenameRegex.test(name)) continue;\n            const abs = safeResolveUnderRoot(uploadPath, path.relative(uploadPath, path.join(dir, name)));\n            if (!abs) continue;\n            if (!fs.existsSync(abs)) continue;\n            await fs.promises.unlink(abs);\n            debugLog('[upload-local-path] delete removed (scan)', abs);\n            if (cleanupDirs) {\n              await cleanupEmptyDirs(abs, uploadPath);\n            }\n            await maybeCleanupEmptyAdminFolders(file);\n            return;\n          }\n        }\n\n        debugLog('[upload-local-path]   not found', {\n          hash: file.hash,\n          url: file.url,\n          previewUrl: file.previewUrl,\n          path: file.path,\n          ext: file.ext,\n        });\n        return \"File doesn't exist\";\n      } catch (err) {\n        console.error('Error deleting file (hash=%s)', file.hash, err);\n        throw err;\n      }\n    },\n  };\n\n  if (privateEnable && privateSecret) {\n    try {\n      const uploadService = (strapi as any).plugin?.('upload')?.service?.('upload');\n      if (uploadService && !(uploadService as any).__uploadLocalPathSignedUrlEnrichPatched) {\n        (uploadService as any).__uploadLocalPathSignedUrlEnrichPatched = true;\n        const enrichFile = async (file: any) => {\n          if (!file || !provider.isPrivate(file)) return;\n          try {\n            file.url = (await provider.getSignedUrl(file)).url;\n          } catch {\n            // keep original url\n          }\n          if (file.formats && typeof file.formats === 'object') {\n            for (const key of Object.keys(file.formats)) {\n              const fmt = file.formats[key];\n              if (fmt?.url && provider.isPrivate(fmt)) {\n                try {\n                  fmt.url = (await provider.getSignedUrl(fmt)).url;\n                } catch {\n                  //\n                }\n              }\n            }\n          }\n        };\n        const originalFind = uploadService.find?.bind(uploadService);\n        if (typeof originalFind === 'function') {\n          uploadService.find = async (params: any) => {\n            const result = await originalFind(params);\n            if (result?.results && Array.isArray(result.results)) {\n              for (const file of result.results) await enrichFile(file);\n            }\n            return result;\n          };\n        }\n        const originalFindOne = uploadService.findOne?.bind(uploadService);\n        if (typeof originalFindOne === 'function') {\n          uploadService.findOne = async (id: any, params?: any) => {\n            const file = await originalFindOne(id, params);\n            await enrichFile(file);\n            return file;\n          };\n        }\n        debugLog('[upload-local-path] upload service patched (signed URL enrich for find/findOne)');\n      }\n    } catch (err) {\n      debugLog('[upload-local-path] could not patch upload service for signed URLs', err);\n    }\n  }\n\n  return provider;\n}\n\n// Default export for backward compatibility\nexport default init;\n"],"names":[],"mappings":"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"}