{"version":3,"file":"html-report.cjs","names":[],"sources":["../src/html-report.ts"],"sourcesContent":["import type { ProjectAnalysis } from './core';\n\nfunction escapeHtml(value: unknown): string {\n  return String(value == null ? '' : value)\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;');\n}\n\nexport function renderHtmlReport(result: ProjectAnalysis): string {\n  const pages = Object.values(result.pages);\n  const pageCards = pages\n    .map((page) => {\n      const rows = page.keys\n        .map((item) => {\n          const source = item.sourceName || item.generatedName || 'unknown';\n          const usage =\n            item.wxmlUsages.map((u) => `<code>${escapeHtml(u.snippet)}</code>`).join('<br>') ||\n            '<span class=\"muted\">not found</span>';\n          return `<tr>\n        <td><span class=\"key\">${escapeHtml(item.key)}</span></td>\n        <td>${escapeHtml(source)}</td>\n        <td><span class=\"pill ${escapeHtml(item.confidence)}\">${escapeHtml(item.confidence)}</span></td>\n        <td><code>${escapeHtml(item.expressionSummary || item.expression)}</code></td>\n        <td>${usage}</td>\n      </tr>`;\n        })\n        .join('\\n');\n\n      const sourcePreview = page.sourceMap?.sourcesContent?.[0]\n        ? `<details><summary>Source preview</summary><pre>${escapeHtml(page.sourceMap.sourcesContent[0])}</pre></details>`\n        : '';\n\n      return `<section class=\"card\">\n      <div class=\"card-title\">\n        <h2>${escapeHtml(page.page)}</h2>\n        <span>${escapeHtml(page.jsFile)}</span>\n      </div>\n      <table>\n        <thead><tr><th>Compiled key</th><th>Readable source</th><th>Confidence</th><th>Compiled expression</th><th>WXML usage</th></tr></thead>\n        <tbody>${rows || '<tr><td colspan=\"5\" class=\"muted\">No __returned__ keys found.</td></tr>'}</tbody>\n      </table>\n      ${sourcePreview}\n    </section>`;\n    })\n    .join('\\n');\n\n  return `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>uniappx keymap report</title>\n<style>\n:root { --ink:#18231f; --muted:#68736d; --paper:#f7f0df; --card:#fffaf0; --line:#dfd3b9; --green:#1f7a54; --amber:#a66b00; --red:#a43b32; }\n* { box-sizing: border-box; }\nbody { margin:0; color:var(--ink); background:radial-gradient(circle at 20% 0%, #d8f0c8 0, transparent 28rem), linear-gradient(135deg, #f7f0df, #efe1c1); font:15px/1.5 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }\nheader { padding:42px clamp(20px, 5vw, 70px) 24px; }\nh1 { margin:0 0 8px; font:800 clamp(32px, 6vw, 72px)/.95 Georgia, 'Times New Roman', serif; letter-spacing:-.05em; }\nheader p { margin:0; color:var(--muted); max-width:900px; }\nmain { padding:0 clamp(20px, 5vw, 70px) 60px; display:grid; gap:22px; }\n.card { background:rgba(255,250,240,.92); border:1px solid var(--line); border-radius:24px; box-shadow:0 22px 70px rgba(61,44,15,.12); overflow:hidden; }\n.card-title { display:flex; justify-content:space-between; gap:16px; align-items:flex-end; padding:22px 24px; border-bottom:1px solid var(--line); }\nh2 { margin:0; font:700 26px/1.1 Georgia, 'Times New Roman', serif; }\n.card-title span, .muted { color:var(--muted); }\ntable { width:100%; border-collapse:collapse; }\nth, td { text-align:left; vertical-align:top; padding:14px 16px; border-bottom:1px solid #eadfc7; }\nth { font-size:12px; text-transform:uppercase; color:var(--muted); letter-spacing:.08em; }\ncode { background:#f0e5cd; border:1px solid #e1d2b6; border-radius:7px; padding:2px 5px; white-space:pre-wrap; word-break:break-word; }\n.key { display:inline-grid; place-items:center; min-width:34px; min-height:34px; border-radius:12px; background:var(--ink); color:var(--paper); font-weight:800; }\n.pill { display:inline-block; border-radius:999px; padding:3px 9px; color:white; font-size:12px; }\n.pill.high { background:var(--green); } .pill.medium { background:var(--amber); } .pill.low { background:var(--red); } .pill.generated { background:#4d665b; }\ndetails { padding:16px 24px 24px; }\nsummary { cursor:pointer; color:var(--green); font-weight:700; }\npre { overflow:auto; background:#1e2924; color:#f8f0dc; border-radius:16px; padding:18px; }\n@media (max-width: 760px) { .card-title { display:block; } table, thead, tbody, tr, th, td { display:block; } thead { display:none; } td { border-bottom:0; padding:8px 16px; } tr { border-bottom:1px solid var(--line); padding:10px 0; } }\n</style>\n</head>\n<body>\n<header>\n  <h1>uniappx keymap</h1>\n  <p>Generated at ${escapeHtml(result.generatedAt)} for <code>${escapeHtml(result.targetRoot)}</code>. This report makes compiled mini-program keys like <code>a</code>, <code>b</code>, <code>c</code> readable during development.</p>\n</header>\n<main>${pageCards || '<p>No pages found.</p>'}</main>\n</body>\n</html>`;\n}\n"],"mappings":";;AAEA,SAAS,WAAW,OAAwB;AAC1C,QAAO,OAAO,SAAS,OAAO,KAAK,MAAM,CACtC,QAAQ,MAAM,QAAQ,CACtB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,SAAS;;AAG5B,SAAgB,iBAAiB,QAAiC;CAEhE,MAAM,YADQ,OAAO,OAAO,OAAO,MAAM,CAEtC,KAAK,SAAS;EACb,MAAM,OAAO,KAAK,KACf,KAAK,SAAS;GACb,MAAM,SAAS,KAAK,cAAc,KAAK,iBAAiB;GACxD,MAAM,QACJ,KAAK,WAAW,KAAK,MAAM,SAAS,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,OAAO,IAChF;AACF,UAAO;gCACe,WAAW,KAAK,IAAI,CAAC;cACvC,WAAW,OAAO,CAAC;gCACD,WAAW,KAAK,WAAW,CAAC,IAAI,WAAW,KAAK,WAAW,CAAC;oBACxE,WAAW,KAAK,qBAAqB,KAAK,WAAW,CAAC;cAC5D,MAAM;;IAEV,CACD,KAAK,KAAK;EAEb,MAAM,gBAAgB,KAAK,WAAW,iBAAiB,KACnD,kDAAkD,WAAW,KAAK,UAAU,eAAe,GAAG,CAAC,oBAC/F;AAEJ,SAAO;;cAEC,WAAW,KAAK,KAAK,CAAC;gBACpB,WAAW,KAAK,OAAO,CAAC;;;;iBAIvB,QAAQ,8EAA0E;;QAE3F,cAAc;;GAEhB,CACD,KAAK,KAAK;AAEb,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAkCW,WAAW,OAAO,YAAY,CAAC,aAAa,WAAW,OAAO,WAAW,CAAC;;QAEtF,aAAa,yBAAyB"}