{
  "version": 3,
  "sources": ["../../../../src/packages/plugin-commands-store/cleanExpiredDlxCache.ts"],
  "sourcesContent": ["import { readdirSync, type Stats } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport util from 'node:util';\n\nexport async function cleanExpiredDlxCache({\n  cacheDir,\n  dlxCacheMaxAge,\n  now,\n}: {\n  cacheDir: string;\n  dlxCacheMaxAge: number;\n  now: Date;\n}): Promise<void> {\n  if (dlxCacheMaxAge === Number.POSITIVE_INFINITY) {\n    return;\n  }\n\n  const dlxCacheDir = path.join(cacheDir, 'dlx');\n\n  const dlxCacheNames = readOptDir(dlxCacheDir);\n\n  if (!dlxCacheNames) {\n    return;\n  }\n\n  await Promise.all(\n    dlxCacheNames.map(async (dlxCacheName: string): Promise<void> => {\n      const dlxCachePath = path.join(dlxCacheDir, dlxCacheName);\n\n      const dlxCacheLink = path.join(dlxCachePath, 'pkg');\n\n      let shouldClean: boolean;\n\n      if (dlxCacheMaxAge <= 0) {\n        shouldClean = true;\n      } else {\n        const dlxCacheLinkStats = await getStats(dlxCacheLink);\n\n        shouldClean =\n          dlxCacheLinkStats !== 'ENOENT' &&\n          isOutdated(dlxCacheLinkStats, dlxCacheMaxAge, now);\n      }\n\n      if (shouldClean) {\n        // delete the symlink, the symlink's target, and orphans (if any)\n        await fs.rm(dlxCachePath, { recursive: true, force: true });\n      }\n    })\n  );\n\n  await cleanOrphans(dlxCacheDir);\n}\n\nexport async function cleanOrphans(dlxCacheDir: string): Promise<void> {\n  const dlxCacheNames = readOptDir(dlxCacheDir);\n\n  if (!dlxCacheNames) {\n    return;\n  }\n\n  await Promise.all(\n    dlxCacheNames.map(async (dlxCacheName: string): Promise<void> => {\n      const dlxCachePath = path.join(dlxCacheDir, dlxCacheName);\n\n      const dlxCacheLink = path.join(dlxCachePath, 'pkg');\n\n      const dlxCacheLinkStats = await getStats(dlxCacheLink);\n\n      if (dlxCacheLinkStats === 'ENOENT') {\n        return fs.rm(dlxCachePath, { recursive: true, force: true });\n      }\n\n      const dlxCacheLinkTarget = await getRealPath(dlxCacheLink);\n\n      const children = await fs.readdir(dlxCachePath);\n\n      await Promise.all(\n        children.map(async (name: string): Promise<void> => {\n          if (name === 'pkg') {\n            return;\n          }\n\n          const fullPath = path.join(dlxCachePath, name);\n\n          if (fullPath === dlxCacheLinkTarget) {\n            return;\n          }\n\n          await fs.rm(fullPath, { recursive: true, force: true });\n        })\n      );\n    })\n  );\n}\n\nfunction isOutdated(stats: Stats, dlxCacheMaxAge: number, now: Date): boolean {\n  return stats.mtime.getTime() + dlxCacheMaxAge * 60_000 < now.getTime();\n}\n\nasync function getStats(path: string): Promise<Stats | 'ENOENT'> {\n  try {\n    return await fs.lstat(path);\n  } catch (err: unknown) {\n    if (\n      util.types.isNativeError(err) &&\n      'code' in err &&\n      err.code === 'ENOENT'\n    ) {\n      return 'ENOENT';\n    }\n\n    throw err;\n  }\n}\n\nfunction readOptDir(dirPath: string): string[] | null {\n  try {\n    return readdirSync(dirPath, 'utf-8');\n  } catch (err: unknown) {\n    if (\n      util.types.isNativeError(err) &&\n      'code' in err &&\n      err.code === 'ENOENT'\n    ) {\n      return null;\n    }\n\n    throw err;\n  }\n}\n\nasync function getRealPath(linkPath: string): Promise<string | null> {\n  try {\n    return await fs.realpath(linkPath);\n  } catch (err: unknown) {\n    if (\n      util.types.isNativeError(err) &&\n      'code' in err &&\n      err.code === 'ENOENT'\n    ) {\n      return null;\n    }\n\n    throw err;\n  }\n}\n"],
  "mappings": "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",
  "names": ["path"]
}
