@pseolint/core 0.5.15 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/algorithms/wikipedia-paraphrase.d.ts +23 -0
- package/dist/algorithms/wikipedia-paraphrase.d.ts.map +1 -0
- package/dist/algorithms/wikipedia-paraphrase.js +82 -0
- package/dist/algorithms/wikipedia-paraphrase.js.map +1 -0
- package/dist/auditor.d.ts.map +1 -1
- package/dist/auditor.js +142 -5
- package/dist/auditor.js.map +1 -1
- package/dist/formatters/console.d.ts +16 -0
- package/dist/formatters/console.d.ts.map +1 -1
- package/dist/formatters/console.js +34 -7
- package/dist/formatters/console.js.map +1 -1
- package/dist/formatters/html.d.ts +7 -1
- package/dist/formatters/html.d.ts.map +1 -1
- package/dist/formatters/html.js +28 -2
- package/dist/formatters/html.js.map +1 -1
- package/dist/formatters/markdown.d.ts +10 -1
- package/dist/formatters/markdown.d.ts.map +1 -1
- package/dist/formatters/markdown.js +33 -6
- package/dist/formatters/markdown.js.map +1 -1
- package/dist/formatters/template-cards.d.ts +44 -0
- package/dist/formatters/template-cards.d.ts.map +1 -0
- package/dist/formatters/template-cards.js +191 -0
- package/dist/formatters/template-cards.js.map +1 -0
- package/dist/rules/content/common-phrase-reuse.d.ts +10 -0
- package/dist/rules/content/common-phrase-reuse.d.ts.map +1 -0
- package/dist/rules/content/common-phrase-reuse.js +132 -0
- package/dist/rules/content/common-phrase-reuse.js.map +1 -0
- package/dist/rules/content/value-add.d.ts +5 -2
- package/dist/rules/content/value-add.d.ts.map +1 -1
- package/dist/rules/content/value-add.js +29 -5
- package/dist/rules/content/value-add.js.map +1 -1
- package/dist/rules/content/wikipedia-paraphrase.d.ts +15 -0
- package/dist/rules/content/wikipedia-paraphrase.d.ts.map +1 -0
- package/dist/rules/content/wikipedia-paraphrase.js +39 -0
- package/dist/rules/content/wikipedia-paraphrase.js.map +1 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +92 -92
|
@@ -2,6 +2,12 @@ import type { AuditSummary } from "../types.js";
|
|
|
2
2
|
export interface HtmlFormatOptions {
|
|
3
3
|
/** No-op for HTML — every finding is rendered regardless. Accepted for option-signature parity. */
|
|
4
4
|
verbose?: boolean;
|
|
5
|
+
/** v0.5.11 — when true (default), render per-template cards when ≥2 templates were detected. */
|
|
6
|
+
perTemplate?: boolean;
|
|
7
|
+
/** v0.5.11 — filter per-URL findings to this template signature. */
|
|
8
|
+
filterTemplate?: string;
|
|
9
|
+
/** v0.5.11 — skip per-template view; render flat per-URL list. */
|
|
10
|
+
legacyFlat?: boolean;
|
|
5
11
|
}
|
|
6
|
-
export declare function formatHtml(summary: AuditSummary,
|
|
12
|
+
export declare function formatHtml(summary: AuditSummary, options?: HtmlFormatOptions): string;
|
|
7
13
|
//# sourceMappingURL=html.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/formatters/html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAQb,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/formatters/html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAQb,MAAM,aAAa,CAAC;AASrB,MAAM,WAAW,iBAAiB;IAChC,mGAAmG;IACnG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gGAAgG;IAChG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAsOD,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,CA2OrF"}
|
package/dist/formatters/html.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { renderTemplateCardsHtml, shouldRenderTemplateCards, TEMPLATE_CARDS_CSS, } from "./template-cards.js";
|
|
1
2
|
const VERDICT_LABEL = {
|
|
2
3
|
ready: "Ready",
|
|
3
4
|
caution: "Caution",
|
|
@@ -205,15 +206,37 @@ function renderTriageHtml(triage) {
|
|
|
205
206
|
<ol class="causes">${causes}</ol>
|
|
206
207
|
</section>`;
|
|
207
208
|
}
|
|
208
|
-
export function formatHtml(summary,
|
|
209
|
+
export function formatHtml(summary, options) {
|
|
209
210
|
const verdict = summary.verdict;
|
|
210
211
|
const verdictTone = VERDICT_TONE[verdict];
|
|
211
|
-
const
|
|
212
|
+
const perTemplate = options?.perTemplate !== false; // default ON
|
|
213
|
+
const legacyFlat = options?.legacyFlat ?? false;
|
|
214
|
+
const filterTemplate = options?.filterTemplate;
|
|
212
215
|
const crawl = summary.diagnostics?.crawlStats;
|
|
213
216
|
const readiness = summary.diagnostics?.originReadiness;
|
|
217
|
+
// Resolve findings, filtered when --template is active.
|
|
218
|
+
const templates = summary.templates;
|
|
219
|
+
let filteredBlockers = summary.issues.blockers;
|
|
220
|
+
let filteredShouldFix = summary.issues.shouldFix;
|
|
221
|
+
let filteredInfo = summary.issues.informational;
|
|
222
|
+
if (filterTemplate && Array.isArray(templates)) {
|
|
223
|
+
const matchedTemplate = templates.find((t) => t.signature === filterTemplate);
|
|
224
|
+
if (matchedTemplate) {
|
|
225
|
+
const urlSet = new Set(matchedTemplate.auditedUrls);
|
|
226
|
+
const keep = (f) => !f.pageUrl || urlSet.has(f.pageUrl);
|
|
227
|
+
filteredBlockers = summary.issues.blockers.filter(keep);
|
|
228
|
+
filteredShouldFix = summary.issues.shouldFix.filter(keep);
|
|
229
|
+
filteredInfo = summary.issues.informational.filter(keep);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const cardOpts = { legacyFlat: legacyFlat || !perTemplate, filterTemplate };
|
|
233
|
+
const templateCardsHtml = shouldRenderTemplateCards(templates, cardOpts)
|
|
234
|
+
? renderTemplateCardsHtml(templates, cardOpts)
|
|
235
|
+
: "";
|
|
214
236
|
const crawlMeta = crawl
|
|
215
237
|
? `${crawl.fetched} fetched · ${crawl.discovered} discovered · ${crawl.skipped} skipped`
|
|
216
238
|
: `${summary.pageCount} pages`;
|
|
239
|
+
const issues = { blockers: filteredBlockers, shouldFix: filteredShouldFix, informational: filteredInfo };
|
|
217
240
|
return `<!DOCTYPE html>
|
|
218
241
|
<html lang="en">
|
|
219
242
|
<head>
|
|
@@ -370,6 +393,7 @@ export function formatHtml(summary, _options) {
|
|
|
370
393
|
.footer-note{margin-top:56px;padding:20px 22px;border:1px solid var(--border);border-radius:var(--r-lg);
|
|
371
394
|
background:color-mix(in oklab,var(--card) 60%,transparent);color:var(--muted);font-size:12px;line-height:1.6}
|
|
372
395
|
.footer-note strong{color:var(--fg);font-weight:600}
|
|
396
|
+
${TEMPLATE_CARDS_CSS}
|
|
373
397
|
</style>
|
|
374
398
|
</head>
|
|
375
399
|
<body>
|
|
@@ -396,6 +420,8 @@ export function formatHtml(summary, _options) {
|
|
|
396
420
|
|
|
397
421
|
${renderOriginReadinessCard(readiness)}
|
|
398
422
|
|
|
423
|
+
${templateCardsHtml}
|
|
424
|
+
|
|
399
425
|
${renderBucketSection("Blockers", issues.blockers, "destructive")}
|
|
400
426
|
${renderBucketSection("Should fix", issues.shouldFix, "warning")}
|
|
401
427
|
${renderBucketSection("Informational", issues.informational, "muted")}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/formatters/html.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/formatters/html.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAa7B,MAAM,aAAa,GAA4B;IAC7C,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,MAAM,YAAY,GAAwE;IACxF,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,aAAa;IACzB,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,MAAM,UAAU,GAAsE;IACpF,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,UAAU;CACd,CAAC;AAEF,MAAM,cAAc,GAAkD;IACpE,SAAS,EAAE,WAAW;IACtB,eAAe,EAAE,iBAAiB;IAClC,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,aAAa,CAAC;IAC5D,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,WAAW,CAAC;QACrB,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,YAAY;YACf,OAAO,YAAY,CAAC;QACtB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa,EAAE,IAAmB;IAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,WAAW,GACf,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/F,OAAO,4BAA4B,IAAI;6BACZ,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;6BACtB,UAAU,CAAC,KAAK,CAAC;mCACX,UAAU,CAAC,WAAW,CAAC;SACjD,CAAC;AACV,CAAC;AAED,SAAS,mBAAmB,CAAC,UAA0B;IACrD,MAAM,KAAK,GAAyC;QAClD,WAAW;QACX,iBAAiB;QACjB,UAAU;QACV,MAAM;KACP,CAAC;IACF,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,OAAO,kBAAkB,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAyB;IACjD,IAAI,CAAC,KAAK,KAAK;QAAE,OAAO,8DAA8D,CAAC;IACvF,IAAI,CAAC,KAAK,aAAa;QAAE,OAAO,qDAAqD,CAAC;IACtF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAa;IACrC,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM;QACzB,CAAC,CAAC,oCAAoC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS;QACzG,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1G,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,sDAAsD,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACzG,MAAM,QAAQ,GACZ,CAAC,CAAC,OAAO,IAAI,8BAA8B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;IACrF,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM;QACvB,CAAC,CAAC,uBAAuB,UAAU,CAAC,MAAM,CAAC,QAAQ;QACnD,CAAC,CAAC,EAAE,CAAC;IAEP,yEAAyE;IACzE,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC;QACtB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC;QAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU;aAC9B,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,0BAA0B,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,gCAAgC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAC1M;aACA,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO;aACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;aAChE,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,GAAG;iBACG,GAAG,CAAC,WAAW,uBAAuB,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;8BAE/E,UAAU;;gCAER,OAAO;eACxB,CAAC;IACd,CAAC;IAED,OAAO,8BAA8B,IAAI;;8BAEb,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,UAAU;QAC9D,GAAG;;6BAEkB,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;MAC5C,UAAU;MACV,GAAG;MACH,OAAO;iCACoB,UAAU,CAAC,QAAQ,CAAC,oCAAoC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACjI,CAAC;AACT,CAAC;AAED,uEAAuE;AACvE,SAAS,aAAa,CAAC,CAAiC;IACtD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC;IAC5C,MAAM,cAAc,GAClB,UAAU,GAAG,CAAC;QACZ,CAAC,CAAC,IAAI,UAAU,kBAAkB,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,cAAc;QAC3E,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,8CAA8C,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,OAAO,iBAAiB,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC;AAClJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,KAAmB,EAAE,IAAY;IAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;yCAC8B,IAAI,qCAAqC,UAAU,CAAC,KAAK,CAAC;eACpF,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD,OAAO;uCAC8B,IAAI,qCAAqC,UAAU,CAAC,KAAK,CAAC,+BAA+B,KAAK,CAAC,MAAM;+BAC7G,IAAI;aACtB,CAAC;AACd,CAAC;AAED,SAAS,yBAAyB,CAAC,MAA0C;IAC3E,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,WAAW,GACf,MAAM,CAAC,OAAO,KAAK,OAAO;QACxB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,YAAY;YAC/B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,aAAa,CAAC;IACtB,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnG,OAAO;;;gCAGuB,MAAM,CAAC,cAAc,cAAc,MAAM,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;;;+EAGhC,WAAW,KAAK,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;+EAC1C,MAAM,CAAC,QAAQ;4EAClB,MAAM,CAAC,KAAK;kFACN,CAAC,MAAM,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;qFACvC,CAAC,MAAM,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;aAElH,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,MAA2C;IACnE,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACjF,MAAM,IAAI,GACR,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/F,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IACxD,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,EAAE,SAAS,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC;IACnH,MAAM,MAAM,GAAG,MAAM;SAClB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC;;;oCAGuB,CAAC,CAAC,QAAQ;cAChC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;+BACF,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;;8BAEpD,CAAC,CAAC,aAAa,eAAe,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;8BAC1E,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;UAC3C,CACL;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO;;;;8BAIqB,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,UAAU,MAAM,MAAM,GAAG,IAAI;;IAEzF,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,wBAAwB,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;uBAC/D,MAAM;WAClB,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAqB,EAAE,OAA2B;IAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,KAAK,KAAK,CAAC,CAAC,aAAa;IACjE,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,KAAK,CAAC;IAChD,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC;IAEvD,wDAAwD;IACxD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,IAAI,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC/C,IAAI,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;IACjD,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;IAChD,IAAI,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/C,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC;QAC9E,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,CAAC,CAAa,EAAW,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7E,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxD,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1D,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,UAAU,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC5E,MAAM,iBAAiB,GAAG,yBAAyB,CAAC,SAAS,EAAE,QAAQ,CAAC;QACtE,CAAC,CAAC,uBAAuB,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC9C,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,SAAS,GAAG,KAAK;QACrB,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,cAAc,KAAK,CAAC,UAAU,iBAAiB,KAAK,CAAC,OAAO,UAAU;QACxF,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,QAAQ,CAAC;IAEjC,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;IAEzG,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4JP,kBAAkB;;;;;;mCAMe,WAAW;;;;;;6BAMjB,UAAU,CAAC,SAAS,CAAC;;2BAEvB,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC;;;sCAGtB,WAAW,sCAAsC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;MACnH,aAAa,CAAC,OAAO,CAAC,kBAAkB,CAAC;qCACV,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;4BACrC,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC;;;IAG/D,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,oLAAoL,CAAC,CAAC,CAAC,EAAE;;IAEpN,yBAAyB,CAAC,SAAS,CAAC;;IAEpC,iBAAiB;;IAEjB,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;IAC/D,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9D,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC;;IAEnE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;QASlD,CAAC;AACT,CAAC"}
|
|
@@ -2,8 +2,17 @@ import type { AuditSummary } from "../types.js";
|
|
|
2
2
|
export interface MarkdownFormatOptions {
|
|
3
3
|
/** When true, list every finding bucketed by severity (kept for parity with other formatters; markdown always lists everything). */
|
|
4
4
|
verbose?: boolean;
|
|
5
|
+
/**
|
|
6
|
+
* v0.5.11 — when true (default), render per-template cards above the
|
|
7
|
+
* per-URL findings list when ≥2 templates were detected.
|
|
8
|
+
*/
|
|
9
|
+
perTemplate?: boolean;
|
|
10
|
+
/** v0.5.11 — filter per-URL findings to this template signature. Silently ignored on no match. */
|
|
11
|
+
filterTemplate?: string;
|
|
12
|
+
/** v0.5.11 — skip per-template view; render flat per-URL list. */
|
|
13
|
+
legacyFlat?: boolean;
|
|
5
14
|
}
|
|
6
15
|
declare function shortenUrl(url: string | undefined): string;
|
|
7
|
-
export declare function formatMarkdown(summary: AuditSummary,
|
|
16
|
+
export declare function formatMarkdown(summary: AuditSummary, options?: MarkdownFormatOptions): string;
|
|
8
17
|
export { shortenUrl };
|
|
9
18
|
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAQb,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAQb,MAAM,aAAa,CAAC;AAQrB,MAAM,WAAW,qBAAqB;IACpC,oIAAoI;IACpI,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kGAAkG;IAClG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAuBD,iBAAS,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAOnD;AA0ID,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAsGR;AAGD,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { bucketByTemplate } from "./bucket-findings.js";
|
|
2
|
+
import { renderTemplateCardsMarkdown, shouldRenderTemplateCards, } from "./template-cards.js";
|
|
2
3
|
const VERDICT_GLYPH = {
|
|
3
4
|
ready: "✅",
|
|
4
5
|
caution: "⚠️",
|
|
@@ -149,7 +150,10 @@ function categoryRows(categories) {
|
|
|
149
150
|
}
|
|
150
151
|
return rows;
|
|
151
152
|
}
|
|
152
|
-
export function formatMarkdown(summary,
|
|
153
|
+
export function formatMarkdown(summary, options) {
|
|
154
|
+
const perTemplate = options?.perTemplate !== false; // default ON
|
|
155
|
+
const legacyFlat = options?.legacyFlat ?? false;
|
|
156
|
+
const filterTemplate = options?.filterTemplate;
|
|
153
157
|
const lines = [];
|
|
154
158
|
lines.push(`# pseolint report`);
|
|
155
159
|
lines.push("");
|
|
@@ -180,6 +184,29 @@ export function formatMarkdown(summary, _options) {
|
|
|
180
184
|
lines.push(`_Crawl: ${crawl.fetched} fetched · ${crawl.discovered} discovered · ${crawl.skipped} skipped._`);
|
|
181
185
|
lines.push("");
|
|
182
186
|
}
|
|
187
|
+
// ── Per-template cards (v0.5.11) ────────────────────────────────────
|
|
188
|
+
const templates = summary.templates;
|
|
189
|
+
const cardOpts = { legacyFlat: legacyFlat || !perTemplate, filterTemplate };
|
|
190
|
+
if (shouldRenderTemplateCards(templates, cardOpts)) {
|
|
191
|
+
const cardsBlock = renderTemplateCardsMarkdown(templates, cardOpts);
|
|
192
|
+
if (cardsBlock) {
|
|
193
|
+
lines.push(cardsBlock);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Resolve findings, filtered when --template is active.
|
|
197
|
+
let filteredBlockers = summary.issues.blockers;
|
|
198
|
+
let filteredShouldFix = summary.issues.shouldFix;
|
|
199
|
+
let filteredInfo = summary.issues.informational;
|
|
200
|
+
if (filterTemplate && Array.isArray(templates)) {
|
|
201
|
+
const matchedTemplate = templates.find((t) => t.signature === filterTemplate);
|
|
202
|
+
if (matchedTemplate) {
|
|
203
|
+
const urlSet = new Set(matchedTemplate.auditedUrls);
|
|
204
|
+
const keep = (f) => !f.pageUrl || urlSet.has(f.pageUrl);
|
|
205
|
+
filteredBlockers = summary.issues.blockers.filter(keep);
|
|
206
|
+
filteredShouldFix = summary.issues.shouldFix.filter(keep);
|
|
207
|
+
filteredInfo = summary.issues.informational.filter(keep);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
183
210
|
// Issue buckets — blockers and should-fix render inline because they're
|
|
184
211
|
// the actionable items. Informational findings collapse behind a
|
|
185
212
|
// <details> on by default — they're often high-volume on catalog and
|
|
@@ -188,12 +215,12 @@ export function formatMarkdown(summary, _options) {
|
|
|
188
215
|
// every entry as a fresh markdown bullet drowns the actionable signal.
|
|
189
216
|
// The user can expand the block to see all entries, or run with
|
|
190
217
|
// `--explain` (console) for the full dump.
|
|
191
|
-
lines.push(...renderBucket("Blockers",
|
|
192
|
-
lines.push(...renderBucket("Should fix",
|
|
193
|
-
if (
|
|
194
|
-
const infoLines = renderBucket("Informational",
|
|
218
|
+
lines.push(...renderBucket("Blockers", filteredBlockers));
|
|
219
|
+
lines.push(...renderBucket("Should fix", filteredShouldFix));
|
|
220
|
+
if (filteredInfo.length > 0) {
|
|
221
|
+
const infoLines = renderBucket("Informational", filteredInfo);
|
|
195
222
|
lines.push(`<details>`);
|
|
196
|
-
lines.push(`<summary><strong>Informational (${
|
|
223
|
+
lines.push(`<summary><strong>Informational (${filteredInfo.length})</strong> — low-confidence or context-dependent findings. Click to expand.</summary>`);
|
|
197
224
|
lines.push("");
|
|
198
225
|
// Strip the duplicate ## header that renderBucket added; the <summary>
|
|
199
226
|
// already labels the section.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAWA,OAAO,EAAwB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v0.5.11 — per-template card rendering helpers.
|
|
3
|
+
*
|
|
4
|
+
* One shared module called by console, markdown, and html formatters.
|
|
5
|
+
* Each exported function takes a `Template[]` and returns a format-specific
|
|
6
|
+
* string segment. The formatters splice it in above the per-URL findings list
|
|
7
|
+
* when `summary.templates.length >= 2 && !opts.legacyFlat`.
|
|
8
|
+
*/
|
|
9
|
+
import type { Template } from "../types.js";
|
|
10
|
+
/** Options shared across all per-template card renderers. */
|
|
11
|
+
export interface TemplateCardOptions {
|
|
12
|
+
/** When true, skip per-template cards entirely (--legacy-flat). */
|
|
13
|
+
legacyFlat?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* When set, highlight / annotate the matching template card.
|
|
16
|
+
* Silently ignored when no template matches the signature.
|
|
17
|
+
*/
|
|
18
|
+
filterTemplate?: string;
|
|
19
|
+
}
|
|
20
|
+
/** True when templates array is present, has ≥2 entries, and not legacy-flat. */
|
|
21
|
+
export declare function shouldRenderTemplateCards(templates: Template[] | undefined, opts: TemplateCardOptions): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Render per-template cards for the console formatter.
|
|
24
|
+
* Returns an empty string when there is nothing to render.
|
|
25
|
+
*/
|
|
26
|
+
export declare function renderTemplateCardsConsole(templates: Template[], opts: TemplateCardOptions, noColor?: boolean): string;
|
|
27
|
+
/**
|
|
28
|
+
* Render per-template cards for the markdown formatter.
|
|
29
|
+
* Returns an empty string when there is nothing to render.
|
|
30
|
+
*/
|
|
31
|
+
export declare function renderTemplateCardsMarkdown(templates: Template[], opts: TemplateCardOptions): string;
|
|
32
|
+
/**
|
|
33
|
+
* Render per-template cards for the HTML formatter.
|
|
34
|
+
* Returns an empty string when there is nothing to render.
|
|
35
|
+
* The caller must ensure the CSS variables and existing styles are in scope —
|
|
36
|
+
* this helper generates markup only, no <style> block.
|
|
37
|
+
*/
|
|
38
|
+
export declare function renderTemplateCardsHtml(templates: Template[], opts: TemplateCardOptions): string;
|
|
39
|
+
/**
|
|
40
|
+
* CSS rules for the per-template card grid. Injected once by the HTML formatter
|
|
41
|
+
* into the document <style> block.
|
|
42
|
+
*/
|
|
43
|
+
export declare const TEMPLATE_CARDS_CSS = "\n .template-cards{margin-top:32px}\n .template-cards .section-title{font-size:13px;font-weight:700;letter-spacing:0.09em;text-transform:uppercase;color:var(--muted);margin-bottom:14px}\n .tmpl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}\n .tmpl-card{padding:16px 18px;border-radius:var(--r);background:var(--card);border:1px solid var(--border)}\n .tmpl-card[data-highlighted=\"true\"]{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary)}\n .tmpl-card.tmpl-success{border-left:3px solid var(--success)}\n .tmpl-card.tmpl-warning{border-left:3px solid var(--warning)}\n .tmpl-card.tmpl-destructive{border-left:3px solid var(--destructive)}\n .tmpl-card.tmpl-critical{border-left:3px solid var(--critical)}\n .tmpl-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}\n .tmpl-sig{font-size:12px;font-family:ui-monospace,\"SFMono-Regular\",Menlo,Consolas,monospace;color:var(--fg);background:var(--card-2);padding:2px 8px;border-radius:6px;border:1px solid var(--border)}\n .tmpl-grade{font-size:14px;font-weight:700;margin-left:auto}\n .tone-success{color:var(--success)} .tone-warning{color:var(--warning)} .tone-destructive{color:var(--destructive)} .tone-critical{color:var(--critical)}\n .tmpl-stats{display:flex;flex-wrap:wrap;gap:8px;font-size:12px;color:var(--muted);font-family:ui-monospace,\"SFMono-Regular\",Menlo,Consolas,monospace}\n .tmpl-driver{color:var(--fg)}\n";
|
|
44
|
+
//# sourceMappingURL=template-cards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-cards.d.ts","sourceRoot":"","sources":["../../src/formatters/template-cards.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAC;AAE5D,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,iFAAiF;AACjF,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,QAAQ,EAAE,GAAG,SAAS,EACjC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAGT;AAmDD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,QAAQ,EAAE,EACrB,IAAI,EAAE,mBAAmB,EACzB,OAAO,UAAQ,GACd,MAAM,CA+BR;AAWD;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,QAAQ,EAAE,EACrB,IAAI,EAAE,mBAAmB,GACxB,MAAM,CAuBR;AAuBD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,QAAQ,EAAE,EACrB,IAAI,EAAE,mBAAmB,GACxB,MAAM,CAiCR;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,o8CAgB9B,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// ── shared helpers ────────────────────────────────────────────────────────
|
|
2
|
+
/** True when templates array is present, has ≥2 entries, and not legacy-flat. */
|
|
3
|
+
export function shouldRenderTemplateCards(templates, opts) {
|
|
4
|
+
if (opts.legacyFlat)
|
|
5
|
+
return false;
|
|
6
|
+
return Array.isArray(templates) && templates.length >= 2;
|
|
7
|
+
}
|
|
8
|
+
function coveragePct(template) {
|
|
9
|
+
const denom = template.totalDiscoveredUrls > 0 ? template.totalDiscoveredUrls : template.totalUrls;
|
|
10
|
+
if (denom === 0)
|
|
11
|
+
return "0%";
|
|
12
|
+
return `${((template.totalUrls / denom) * 100).toFixed(1)}%`;
|
|
13
|
+
}
|
|
14
|
+
function topDriverLine(template) {
|
|
15
|
+
const td = template.variance.topDriver;
|
|
16
|
+
if (!td)
|
|
17
|
+
return "";
|
|
18
|
+
const sampleCount = template.auditedUrls.length;
|
|
19
|
+
const failCount = Math.round(td.fireRate * sampleCount);
|
|
20
|
+
return `${failCount}/${sampleCount} samples fail \`${td.ruleId}\``;
|
|
21
|
+
}
|
|
22
|
+
function uniformityPct(template) {
|
|
23
|
+
return `${Math.round(template.variance.uniformityScore * 100)}%`;
|
|
24
|
+
}
|
|
25
|
+
// ── Console renderer ──────────────────────────────────────────────────────
|
|
26
|
+
const RESET = "\x1b[0m";
|
|
27
|
+
const BOLD = "\x1b[1m";
|
|
28
|
+
const DIM = "\x1b[2m";
|
|
29
|
+
const RED = "\x1b[31m";
|
|
30
|
+
const GREEN = "\x1b[32m";
|
|
31
|
+
const YELLOW = "\x1b[33m";
|
|
32
|
+
const RED_BRIGHT = "\x1b[91m";
|
|
33
|
+
const ORANGE = "\x1b[38;5;208m";
|
|
34
|
+
const MAGENTA = "\x1b[35m";
|
|
35
|
+
const CYAN = "\x1b[36m";
|
|
36
|
+
function verdictColorConsole(v) {
|
|
37
|
+
switch (v) {
|
|
38
|
+
case "ready": return GREEN;
|
|
39
|
+
case "caution": return YELLOW;
|
|
40
|
+
case "concerning": return MAGENTA;
|
|
41
|
+
case "critical": return RED + BOLD;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function gradeColorConsole(g) {
|
|
45
|
+
switch (g) {
|
|
46
|
+
case "A":
|
|
47
|
+
case "B": return GREEN;
|
|
48
|
+
case "C": return YELLOW;
|
|
49
|
+
case "D": return ORANGE;
|
|
50
|
+
case "F": return RED + BOLD;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Render per-template cards for the console formatter.
|
|
55
|
+
* Returns an empty string when there is nothing to render.
|
|
56
|
+
*/
|
|
57
|
+
export function renderTemplateCardsConsole(templates, opts, noColor = false) {
|
|
58
|
+
if (!shouldRenderTemplateCards(templates, opts))
|
|
59
|
+
return "";
|
|
60
|
+
const lines = [];
|
|
61
|
+
lines.push(`${BOLD}Per-template breakdown (${templates.length} templates):${RESET}`);
|
|
62
|
+
lines.push("");
|
|
63
|
+
for (const t of templates) {
|
|
64
|
+
const isHighlighted = opts.filterTemplate === t.signature;
|
|
65
|
+
const marker = isHighlighted ? `${CYAN}▶ ${RESET}` : " ";
|
|
66
|
+
const vColor = verdictColorConsole(t.verdict);
|
|
67
|
+
const grade = t.categories.integrity.grade;
|
|
68
|
+
const gColor = gradeColorConsole(grade);
|
|
69
|
+
const coverage = `${t.auditedUrls.length}/${t.totalUrls} URLs (${coveragePct(t)})`;
|
|
70
|
+
const topDriver = topDriverLine(t);
|
|
71
|
+
const uniformity = `uniformity ${uniformityPct(t)}`;
|
|
72
|
+
lines.push(`${marker}${BOLD}${t.signature}${RESET} ${vColor}${t.verdict.toUpperCase()}${RESET} ${gColor}${grade}${RESET}`);
|
|
73
|
+
lines.push(` ${DIM}${coverage}${RESET} ${DIM}${uniformity}${RESET}`);
|
|
74
|
+
if (topDriver) {
|
|
75
|
+
lines.push(` ${topDriver}`);
|
|
76
|
+
}
|
|
77
|
+
lines.push("");
|
|
78
|
+
}
|
|
79
|
+
const out = lines.join("\n");
|
|
80
|
+
if (noColor)
|
|
81
|
+
return out.replace(/\x1b\[[0-9;]*m/g, "");
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
// ── Markdown renderer ─────────────────────────────────────────────────────
|
|
85
|
+
const VERDICT_GLYPH_MD = {
|
|
86
|
+
ready: "✅",
|
|
87
|
+
caution: "⚠️",
|
|
88
|
+
concerning: "⚠️",
|
|
89
|
+
critical: "🔴",
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Render per-template cards for the markdown formatter.
|
|
93
|
+
* Returns an empty string when there is nothing to render.
|
|
94
|
+
*/
|
|
95
|
+
export function renderTemplateCardsMarkdown(templates, opts) {
|
|
96
|
+
if (!shouldRenderTemplateCards(templates, opts))
|
|
97
|
+
return "";
|
|
98
|
+
const lines = [];
|
|
99
|
+
lines.push("## Templates");
|
|
100
|
+
lines.push("");
|
|
101
|
+
lines.push("| Template | Verdict | Grade | Coverage | Uniformity | Top driver |");
|
|
102
|
+
lines.push("|---|---|---|---|---|---|");
|
|
103
|
+
for (const t of templates) {
|
|
104
|
+
const glyph = VERDICT_GLYPH_MD[t.verdict];
|
|
105
|
+
const grade = t.categories.integrity.grade;
|
|
106
|
+
const coverage = `${t.auditedUrls.length}/${t.totalUrls} (${coveragePct(t)})`;
|
|
107
|
+
const uniformity = uniformityPct(t);
|
|
108
|
+
const topDriver = topDriverLine(t);
|
|
109
|
+
const highlight = opts.filterTemplate === t.signature ? " ◀" : "";
|
|
110
|
+
lines.push(`| \`${t.signature}\`${highlight} | ${glyph} ${t.verdict} | ${grade} | ${coverage} | ${uniformity} | ${topDriver || "—"} |`);
|
|
111
|
+
}
|
|
112
|
+
lines.push("");
|
|
113
|
+
return lines.join("\n");
|
|
114
|
+
}
|
|
115
|
+
// ── HTML renderer ─────────────────────────────────────────────────────────
|
|
116
|
+
function escapeHtml(s) {
|
|
117
|
+
return s
|
|
118
|
+
.replace(/&/g, "&")
|
|
119
|
+
.replace(/</g, "<")
|
|
120
|
+
.replace(/>/g, ">")
|
|
121
|
+
.replace(/"/g, """);
|
|
122
|
+
}
|
|
123
|
+
const VERDICT_TONE_HTML = {
|
|
124
|
+
ready: "success",
|
|
125
|
+
caution: "warning",
|
|
126
|
+
concerning: "destructive",
|
|
127
|
+
critical: "critical",
|
|
128
|
+
};
|
|
129
|
+
const GRADE_TONE_HTML = {
|
|
130
|
+
A: "success", B: "success", C: "warning", D: "destructive", F: "critical",
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Render per-template cards for the HTML formatter.
|
|
134
|
+
* Returns an empty string when there is nothing to render.
|
|
135
|
+
* The caller must ensure the CSS variables and existing styles are in scope —
|
|
136
|
+
* this helper generates markup only, no <style> block.
|
|
137
|
+
*/
|
|
138
|
+
export function renderTemplateCardsHtml(templates, opts) {
|
|
139
|
+
if (!shouldRenderTemplateCards(templates, opts))
|
|
140
|
+
return "";
|
|
141
|
+
const cards = templates.map((t) => {
|
|
142
|
+
const vTone = VERDICT_TONE_HTML[t.verdict];
|
|
143
|
+
const grade = t.categories.integrity.grade;
|
|
144
|
+
const gTone = GRADE_TONE_HTML[grade];
|
|
145
|
+
const coverage = `${t.auditedUrls.length}/${t.totalUrls} URLs (${coveragePct(t)})`;
|
|
146
|
+
const topDriver = topDriverLine(t);
|
|
147
|
+
const uniformity = uniformityPct(t);
|
|
148
|
+
const isHighlighted = opts.filterTemplate === t.signature;
|
|
149
|
+
const highlightAttr = isHighlighted ? ' data-highlighted="true"' : "";
|
|
150
|
+
return `<div class="tmpl-card tmpl-${vTone}"${highlightAttr}>
|
|
151
|
+
<div class="tmpl-head">
|
|
152
|
+
<code class="tmpl-sig">${escapeHtml(t.signature)}</code>
|
|
153
|
+
<span class="verdict-badge tone-${vTone}">${escapeHtml(t.verdict)}</span>
|
|
154
|
+
<span class="tmpl-grade tone-${gTone}">${escapeHtml(grade)}</span>
|
|
155
|
+
</div>
|
|
156
|
+
<div class="tmpl-stats">
|
|
157
|
+
<span class="tmpl-coverage">${escapeHtml(coverage)}</span>
|
|
158
|
+
<span class="tmpl-uniformity">uniformity ${escapeHtml(uniformity)}</span>
|
|
159
|
+
${topDriver ? `<span class="tmpl-driver">${escapeHtml(topDriver)}</span>` : ""}
|
|
160
|
+
</div>
|
|
161
|
+
</div>`;
|
|
162
|
+
}).join("\n");
|
|
163
|
+
return `<section class="template-cards">
|
|
164
|
+
<h2 class="section-title">Templates (${templates.length})</h2>
|
|
165
|
+
<div class="tmpl-grid">
|
|
166
|
+
${cards}
|
|
167
|
+
</div>
|
|
168
|
+
</section>`;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* CSS rules for the per-template card grid. Injected once by the HTML formatter
|
|
172
|
+
* into the document <style> block.
|
|
173
|
+
*/
|
|
174
|
+
export const TEMPLATE_CARDS_CSS = `
|
|
175
|
+
.template-cards{margin-top:32px}
|
|
176
|
+
.template-cards .section-title{font-size:13px;font-weight:700;letter-spacing:0.09em;text-transform:uppercase;color:var(--muted);margin-bottom:14px}
|
|
177
|
+
.tmpl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}
|
|
178
|
+
.tmpl-card{padding:16px 18px;border-radius:var(--r);background:var(--card);border:1px solid var(--border)}
|
|
179
|
+
.tmpl-card[data-highlighted="true"]{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary)}
|
|
180
|
+
.tmpl-card.tmpl-success{border-left:3px solid var(--success)}
|
|
181
|
+
.tmpl-card.tmpl-warning{border-left:3px solid var(--warning)}
|
|
182
|
+
.tmpl-card.tmpl-destructive{border-left:3px solid var(--destructive)}
|
|
183
|
+
.tmpl-card.tmpl-critical{border-left:3px solid var(--critical)}
|
|
184
|
+
.tmpl-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
|
|
185
|
+
.tmpl-sig{font-size:12px;font-family:ui-monospace,"SFMono-Regular",Menlo,Consolas,monospace;color:var(--fg);background:var(--card-2);padding:2px 8px;border-radius:6px;border:1px solid var(--border)}
|
|
186
|
+
.tmpl-grade{font-size:14px;font-weight:700;margin-left:auto}
|
|
187
|
+
.tone-success{color:var(--success)} .tone-warning{color:var(--warning)} .tone-destructive{color:var(--destructive)} .tone-critical{color:var(--critical)}
|
|
188
|
+
.tmpl-stats{display:flex;flex-wrap:wrap;gap:8px;font-size:12px;color:var(--muted);font-family:ui-monospace,"SFMono-Regular",Menlo,Consolas,monospace}
|
|
189
|
+
.tmpl-driver{color:var(--fg)}
|
|
190
|
+
`;
|
|
191
|
+
//# sourceMappingURL=template-cards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-cards.js","sourceRoot":"","sources":["../../src/formatters/template-cards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ParsedPage, RuleResult } from "../../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* content/common-phrase-reuse — per-page cliché density detector.
|
|
4
|
+
*
|
|
5
|
+
* Scans each page's contentText for a corpus of 42 known pSEO marketing
|
|
6
|
+
* clichés. Fires ONE warning/low-confidence finding per page when >=3 distinct
|
|
7
|
+
* phrases appear. Extends the content/value-add composite as its 6th signal.
|
|
8
|
+
*/
|
|
9
|
+
export declare function commonPhraseReuseRule(pages: ParsedPage[]): RuleResult[];
|
|
10
|
+
//# sourceMappingURL=common-phrase-reuse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common-phrase-reuse.d.ts","sourceRoot":"","sources":["../../../src/rules/content/common-phrase-reuse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAwH7D;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAoBvE"}
|