{"version":3,"file":"iconConverter.js","sourceRoot":"","sources":["../../src/util/iconConverter.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, readdir, rename, stat } from \"fs/promises\"\nimport * as path from \"path\"\nimport { runIconsTool } from \"../toolsets/icons\"\n\nclass IconConversionError extends Error {\n  constructor(\n    message: string,\n    readonly errorCode: string\n  ) {\n    super(message)\n    ;(this as NodeJS.ErrnoException).code = errorCode\n  }\n}\n\nexport interface IconInfo {\n  file: string\n  size: number\n}\n\nexport type IconFormat = \"icns\" | \"ico\" | \"set\"\n\nexport interface IconConvertResult {\n  icons: IconInfo[]\n  isFallback: boolean\n  error?: string\n  errorCode?: string\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\ntype IconConversionConfig = {\n  sources: string[]\n  fallbackSources: string[]\n  roots: string[]\n  format: IconFormat\n  outDir: string\n}\n\nexport async function convertIcon({ sources, fallbackSources, roots, format, outDir }: IconConversionConfig): Promise<IconConvertResult> {\n  const candidates = buildSourceCandidates(sources, format)\n\n  let icons = await doConvertIcon(candidates, roots, format, outDir)\n\n  let isFallback = false\n  if (icons == null) {\n    const fallbackCandidates = buildSourceCandidates(fallbackSources, format)\n    icons = await doConvertIcon(fallbackCandidates, roots, format, outDir)\n    isFallback = true\n  }\n\n  return { icons: icons ?? [], isFallback }\n}\n\n// ─── PNG dimension reader ─────────────────────────────────────────────────────\n// Reads width/height from the PNG IHDR chunk at a fixed offset (no dependencies).\n\nexport async function getPngSize(filePath: string): Promise<{ width: number; height: number }> {\n  const buf = await readFile(filePath)\n  // PNG signature = 8 bytes, IHDR chunk header = 8 bytes → width at 16, height at 20\n  if (buf.length < 24) {\n    return { width: 0, height: 0 }\n  }\n  return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) }\n}\n\n// ─── ICO header parser ────────────────────────────────────────────────────────\n\nasync function getIcoMaxSize(filePath: string): Promise<number | null> {\n  const buf = await readFile(filePath)\n  if (buf.length < 6 || buf[0] !== 0 || buf[1] !== 0 || buf[2] !== 1 || buf[3] !== 0) {\n    return null\n  }\n  const count = buf.readUInt16LE(4)\n  let max = 0\n  for (let i = 0; i < count; i++) {\n    const off = 6 + i * 16\n    if (off + 2 > buf.length) {\n      break\n    }\n    const w = buf[off] || 256\n    const h = buf[off + 1] || 256\n    if (w > max) {\n      max = w\n    }\n    if (h > max) {\n      max = h\n    }\n  }\n  return max\n}\n\n// ─── Set output remapper ──────────────────────────────────────────────────────\n// CLI outputs NxN.png; remap to icon_NxN.png to preserve existing naming convention.\n\nasync function remapSetOutput(outDir: string): Promise<IconInfo[]> {\n  const entries = await readdir(outDir)\n  const result: IconInfo[] = []\n  for (const name of entries) {\n    const match = name.match(/^(\\d+)x\\d+\\.png$/)\n    if (!match) {\n      continue\n    }\n    const size = parseInt(match[1], 10)\n    const oldPath = path.join(outDir, name)\n    const newPath = path.join(outDir, `icon_${size}x${size}.png`)\n    await rename(oldPath, newPath)\n    result.push({ file: newPath, size })\n  }\n  return result.sort((a, b) => a.size - b.size)\n}\n\n// ─── CLI output collector ─────────────────────────────────────────────────────\n\nasync function collectCliOutput(outDir: string, format: IconFormat, sourceMaxSize = 0): Promise<IconInfo[]> {\n  if (format === \"icns\") {\n    return [{ file: path.join(outDir, \"icon.icns\"), size: sourceMaxSize }]\n  }\n  if (format === \"ico\") {\n    const icoFile = path.join(outDir, \"icon.ico\")\n    const size = await getIcoMaxSize(icoFile)\n    return [{ file: icoFile, size: size ?? sourceMaxSize }]\n  }\n  return remapSetOutput(outDir)\n}\n\n// ─── File resolution (matches go fileResolver.go + icon-converter.go) ────────\n\nfunction imageHasExtension(name: string, format: string): boolean {\n  return name.endsWith(\".\" + format) || name.endsWith(\".png\") || name.endsWith(\".ico\") || name.endsWith(\".svg\") || name.endsWith(\".icns\")\n}\n\nexport function buildSourceCandidates(sources: string[], format: IconFormat): string[] {\n  const result: string[] = []\n  for (const src of sources) {\n    if (imageHasExtension(src, format)) {\n      result.push(src)\n    } else {\n      if (format !== \"set\") {\n        result.push(src + \".\" + format)\n      }\n      result.push(src)\n      result.push(src + \".png\")\n      result.push(src + \".svg\")\n      if (format !== \"icns\") {\n        result.push(src + \".icns\")\n        if (format !== \"ico\") {\n          result.push(src + \".ico\")\n        }\n      }\n    }\n  }\n  if (format !== \"set\") {\n    result.push(\"icon.\" + format)\n  }\n  for (const setName of [\"icons\", \"icon\"]) {\n    result.push(setName)\n  }\n  result.push(\"icon.png\")\n  result.push(\"icon.svg\")\n  if (format !== \"icns\") {\n    result.push(\"icon.icns\")\n    if (format !== \"ico\") {\n      result.push(\"icon.ico\")\n    }\n  }\n  // Deduplicate while preserving order so resolveSourceFile never stats the same path twice\n  return [...new Set(result)]\n}\n\nasync function resolveSourceFile(candidates: string[], roots: string[]): Promise<{ resolved: string; isDir: boolean } | null> {\n  for (const candidate of candidates) {\n    const absPath = path.isAbsolute(candidate) ? path.normalize(candidate) : null\n    const searchPaths = absPath ? [absPath] : roots.map(r => path.join(r, candidate))\n\n    for (const p of searchPaths) {\n      try {\n        const s = await stat(p)\n        return { resolved: p, isDir: s.isDirectory() }\n      } catch {\n        // not found, try next\n      }\n    }\n  }\n  return null\n}\n\n// ─── Directory icon collection (go collect-icons.go) ────────────────────────\n\nasync function collectIconsFromDir(dir: string): Promise<{ icons: IconInfo[]; fallbackFile: string | null }> {\n  const entries = await readdir(dir)\n  const sizeMap = new Map<number, IconInfo>()\n  let fallbackFile: string | null = null\n\n  for (const name of entries) {\n    if (name === \"icon.png\" || name === \"icon.PNG\") {\n      fallbackFile = path.join(dir, name)\n      continue\n    }\n    const match = name.match(/^(\\d+)(?:x\\d+)?\\.png$/i)\n    if (!match) {\n      continue\n    }\n    const size = parseInt(match[1], 10)\n    if (isNaN(size)) {\n      continue\n    }\n    const filePath = path.join(dir, name)\n    const existing = sizeMap.get(size)\n    if (!existing || name.length < path.basename(existing.file).length) {\n      sizeMap.set(size, { file: filePath, size })\n    }\n  }\n\n  const icons = Array.from(sizeMap.values()).sort((a, b) => a.size - b.size)\n  return { icons, fallbackFile }\n}\n\n// ─── Main conversion logic ───────────────────────────────────────────────────\n\nasync function doConvertIcon(candidates: string[], roots: string[], format: IconFormat, outDir: string): Promise<IconInfo[] | null> {\n  const found = await resolveSourceFile(candidates, roots)\n  if (!found) {\n    return null\n  }\n\n  const { resolved, isDir } = found\n\n  // SVG source for set format: return the SVG directly — Linux targets place it in\n  // the freedesktop scalable/ dir. Never call getPngSize on an SVG file.\n  if (!isDir && resolved.endsWith(\".svg\") && format === \"set\") {\n    return [{ file: resolved, size: 1024 }]\n  }\n\n  const outExt = format === \"set\" ? \".png\" : \".\" + format\n\n  // If source already has the target extension and is not a directory, return it directly\n  if (!isDir && resolved.endsWith(outExt)) {\n    if (format === \"icns\") {\n      return [{ file: resolved, size: 0 }]\n    }\n    if (format === \"ico\") {\n      const size = await getIcoMaxSize(resolved)\n      if (size === null) {\n        throw new IconConversionError(`Icon is not a valid ICO file: ${resolved}`, \"ERR_ICON_UNKNOWN_FORMAT\")\n      }\n      if (size < 256) {\n        throw new IconConversionError(`Icon must be at least 256x256 pixels, provided: ${size}x${size}`, \"ERR_ICON_TOO_SMALL\")\n      }\n      return [{ file: resolved, size }]\n    }\n    // set: source is already a .png — return as-is with its dimensions\n    const { width, height } = await getPngSize(resolved)\n    return [{ file: resolved, size: Math.max(width, height) }]\n  }\n\n  if (isDir) {\n    const { icons, fallbackFile } = await collectIconsFromDir(resolved)\n\n    if (format === \"set\") {\n      if (icons.length > 0) {\n        return icons\n      }\n      if (fallbackFile) {\n        return doConvertSingleFile(fallbackFile, format, outDir)\n      }\n      return null\n    }\n\n    if (icons.length > 0) {\n      // Use largest available PNG from the directory as CLI input\n      const maxIcon = icons[icons.length - 1]\n      await mkdir(outDir, { recursive: true })\n      await runIconsTool({ inputFile: maxIcon.file, outputFormat: format, outDir })\n      return collectCliOutput(outDir, format, maxIcon.size)\n    }\n\n    if (fallbackFile) {\n      return doConvertSingleFile(fallbackFile, format, outDir)\n    }\n    return null\n  }\n\n  // Single file: ICNS → ico or set — pass ICNS directly to CLI (CLI handles extraction)\n  if (resolved.endsWith(\".icns\") && format !== \"icns\") {\n    await mkdir(outDir, { recursive: true })\n    await runIconsTool({ inputFile: resolved, outputFormat: format, outDir })\n    return collectCliOutput(outDir, format)\n  }\n\n  return doConvertSingleFile(resolved, format, outDir)\n}\n\nasync function doConvertSingleFile(sourceFile: string, format: IconFormat, outDir: string): Promise<IconInfo[] | null> {\n  const ext = path.extname(sourceFile).toLowerCase()\n  let maxSize: number\n\n  if (ext === \".svg\") {\n    maxSize = 1024 // CLI rasterizes SVG at 1024px\n  } else {\n    const { width, height } = await getPngSize(sourceFile)\n    maxSize = Math.max(width, height)\n    if (maxSize === 0) {\n      return null\n    }\n    const recommendedMin = format === \"icns\" ? 512 : 256\n    if (maxSize < recommendedMin) {\n      throw new IconConversionError(`Icon must be at least ${recommendedMin}x${recommendedMin} pixels, provided: ${maxSize}x${maxSize}`, \"ERR_ICON_TOO_SMALL\")\n    }\n  }\n\n  await mkdir(outDir, { recursive: true })\n  await runIconsTool({ inputFile: sourceFile, outputFormat: format, outDir })\n  return collectCliOutput(outDir, format, maxSize)\n}\n"]}