lintpage 0.3.1 → 0.4.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/README.md +20 -19
- package/dist/cli.cjs +4 -3
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +4 -3
- package/dist/cli.mjs.map +1 -1
- package/dist/formatter-BFKK5Mks.cjs +5 -0
- package/dist/formatter-BFKK5Mks.cjs.map +1 -0
- package/dist/formatter-CuMgo6fc.mjs +5 -0
- package/dist/formatter-CuMgo6fc.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/formatter-BhulhYos.mjs +0 -6
- package/dist/formatter-BhulhYos.mjs.map +0 -1
- package/dist/formatter-CJEdbkqw.cjs +0 -6
- package/dist/formatter-CJEdbkqw.cjs.map +0 -1
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`chalk`);c=s(c);const l={CRITICAL:c.default.red.bold(`✗`),WARNING:c.default.yellow(`⚠`),INFO:c.default.blue(`ℹ`)};function u(e,t){let n=`${e.warn} ${e.warn===1?`warning`:`warnings`}`;return t===`FAIL`?`DEPLOY BLOCKED · ${e.crit} critical · ${n} · ${e.info} info`:t===`AI-FAIL`?`AI VISIBILITY FAIL · ${e.crit} AI critical · ${n} · ${e.info} info`:`READY TO SHIP · ${n} · ${e.info} info`}function d(e,t){let n=[],r={crit:e.results.filter(e=>e.severity===`CRITICAL`).length,warn:e.results.filter(e=>e.severity===`WARNING`).length,info:e.results.filter(e=>e.severity===`INFO`).length};if(t)return n.push(` ${c.default.red.bold(`${r.crit} critical`)} ${c.default.yellow(`${r.warn} ${r.warn===1?`warning`:`warnings`}`)} ${c.default.blue(`${r.info} info`)}`),n.push(``),n.join(`
|
|
2
|
+
`);if(n.push(``),e.results.length===0)n.push(c.default.green(` No issues found.`)),n.push(``);else{let t=[...e.results].sort((e,t)=>f(t.severity)-f(e.severity));t.forEach((e,r)=>{let i=l[e.severity],a=`${e.category.toLowerCase()}/${e.ruleId}`;n.push(`${i} ${c.default.bold(a)} — ${e.message}`),e.fix&&n.push(` ${c.default.dim(e.fix)}`),r<t.length-1&&n.push(``)}),n.push(``)}let i=u(r,e.overallStatus),a=e.overallStatus===`FAIL`?c.default.red.bold:e.overallStatus===`AI-FAIL`?c.default.yellow.bold:c.default.green.bold;return n.push(a(i)),n.push(``),n.join(`
|
|
3
|
+
`)}function f(e){return e===`CRITICAL`?3:e===`WARNING`?2:1}function p(e){return JSON.stringify(e,null,2)}const m={CRITICAL:`error`,WARNING:`warning`,INFO:`notice`};function h(e){return e.replace(/%/g,`%25`).replace(/\r/g,`%0D`).replace(/\n/g,`%0A`).replace(/:/g,`%3A`).replace(/,/g,`%2C`)}function g(e){let t=[];for(let n of e.results){let e=m[n.severity],r=h(`[${n.ruleId}] ${n.ruleName}`),i=h(n.message);t.push(`::${e} title=${r}::${i}`)}let n=u({crit:e.results.filter(e=>e.severity===`CRITICAL`).length,warn:e.results.filter(e=>e.severity===`WARNING`).length,info:e.results.filter(e=>e.severity===`INFO`).length},e.overallStatus),r=h(`${e.url} — ${n}`);return t.push(`::notice title=LintPage Verdict::${r}`),t.join(`
|
|
4
|
+
`)}function _(e,t,n){switch(t){case`json`:return p(e);case`github`:return g(e);default:return d(e,n)}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return _}});
|
|
5
|
+
//# sourceMappingURL=formatter-BFKK5Mks.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter-BFKK5Mks.cjs","names":[],"sources":["../src/formatter.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { PageResult, Severity } from '@lintpage/core';\n\nexport type Format = 'text' | 'json' | 'github';\n\n// ── Text formatter ─────────────────────────────────────────────\n\nconst SEVERITY_ICON: Record<Severity, string> = {\n CRITICAL: chalk.red.bold('✗'),\n WARNING: chalk.yellow('⚠'),\n INFO: chalk.blue('ℹ'),\n};\n\nfunction buildVerdict(\n counts: { crit: number; warn: number; info: number },\n status: PageResult['overallStatus'],\n): string {\n const w = `${counts.warn} ${counts.warn === 1 ? 'warning' : 'warnings'}`;\n if (status === 'FAIL') {\n return `DEPLOY BLOCKED · ${counts.crit} critical · ${w} · ${counts.info} info`;\n }\n if (status === 'AI-FAIL') {\n return `AI VISIBILITY FAIL · ${counts.crit} AI critical · ${w} · ${counts.info} info`;\n }\n return `READY TO SHIP · ${w} · ${counts.info} info`;\n}\n\nexport function formatText(result: PageResult, quiet: boolean): string {\n const lines: string[] = [];\n const counts = {\n crit: result.results.filter((r) => r.severity === 'CRITICAL').length,\n warn: result.results.filter((r) => r.severity === 'WARNING').length,\n info: result.results.filter((r) => r.severity === 'INFO').length,\n };\n\n if (quiet) {\n lines.push(\n ` ${chalk.red.bold(`${counts.crit} critical`)} ${chalk.yellow(\n `${counts.warn} ${counts.warn === 1 ? 'warning' : 'warnings'}`,\n )} ${chalk.blue(`${counts.info} info`)}`,\n );\n lines.push('');\n return lines.join('\\n');\n }\n\n lines.push('');\n\n if (result.results.length === 0) {\n lines.push(chalk.green(' No issues found.'));\n lines.push('');\n } else {\n const sorted = [...result.results].sort(\n (a, b) => severityRank(b.severity) - severityRank(a.severity),\n );\n sorted.forEach((issue, idx) => {\n const icon = SEVERITY_ICON[issue.severity];\n const path = `${issue.category.toLowerCase()}/${issue.ruleId}`;\n lines.push(`${icon} ${chalk.bold(path)} — ${issue.message}`);\n if (issue.fix) {\n lines.push(` ${chalk.dim(issue.fix)}`);\n }\n if (idx < sorted.length - 1) {\n lines.push('');\n }\n });\n lines.push('');\n }\n\n const verdict = buildVerdict(counts, result.overallStatus);\n const colour =\n result.overallStatus === 'FAIL'\n ? chalk.red.bold\n : result.overallStatus === 'AI-FAIL'\n ? chalk.yellow.bold\n : chalk.green.bold;\n lines.push(colour(verdict));\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction severityRank(s: Severity): number {\n return s === 'CRITICAL' ? 3 : s === 'WARNING' ? 2 : 1;\n}\n\n// ── JSON formatter ─────────────────────────────────────────────\n\nexport function formatJson(result: PageResult): string {\n return JSON.stringify(result, null, 2);\n}\n\n// ── GitHub Actions formatter ───────────────────────────────────\n\nconst GH_LEVEL: Record<Severity, string> = {\n CRITICAL: 'error',\n WARNING: 'warning',\n INFO: 'notice',\n};\n\n/**\n * Sanitize a string for use in GitHub Actions workflow commands.\n * Escapes characters that could break or inject annotations.\n * @see https://github.com/actions/toolkit/blob/main/packages/core/src/command.ts\n */\nfunction sanitizeAnnotation(str: string): string {\n return str\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n\nexport function formatGithub(result: PageResult): string {\n const lines: string[] = [];\n\n for (const issue of result.results) {\n const level = GH_LEVEL[issue.severity];\n const title = sanitizeAnnotation(`[${issue.ruleId}] ${issue.ruleName}`);\n const message = sanitizeAnnotation(issue.message);\n // GitHub annotation format: ::level title=TITLE::MESSAGE\n lines.push(`::${level} title=${title}::${message}`);\n }\n\n // Summary annotation\n const counts = {\n crit: result.results.filter((r) => r.severity === 'CRITICAL').length,\n warn: result.results.filter((r) => r.severity === 'WARNING').length,\n info: result.results.filter((r) => r.severity === 'INFO').length,\n };\n const verdict = buildVerdict(counts, result.overallStatus);\n const summaryMessage = sanitizeAnnotation(`${result.url} — ${verdict}`);\n lines.push(`::notice title=LintPage Verdict::${summaryMessage}`);\n\n return lines.join('\\n');\n}\n\n// ── Dispatcher ─────────────────────────────────────────────────\n\nexport function format(\n result: PageResult,\n fmt: Format,\n quiet: boolean\n): string {\n switch (fmt) {\n case 'json':\n return formatJson(result);\n case 'github':\n return formatGithub(result);\n case 'text':\n default:\n return formatText(result, quiet);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import e from"chalk";const t={CRITICAL:e.red.bold(`✗`),WARNING:e.yellow(`⚠`),INFO:e.blue(`ℹ`)};function n(e,t){let n=`${e.warn} ${e.warn===1?`warning`:`warnings`}`;return t===`FAIL`?`DEPLOY BLOCKED · ${e.crit} critical · ${n} · ${e.info} info`:t===`AI-FAIL`?`AI VISIBILITY FAIL · ${e.crit} AI critical · ${n} · ${e.info} info`:`READY TO SHIP · ${n} · ${e.info} info`}function r(r,a){let o=[],s={crit:r.results.filter(e=>e.severity===`CRITICAL`).length,warn:r.results.filter(e=>e.severity===`WARNING`).length,info:r.results.filter(e=>e.severity===`INFO`).length};if(a)return o.push(` ${e.red.bold(`${s.crit} critical`)} ${e.yellow(`${s.warn} ${s.warn===1?`warning`:`warnings`}`)} ${e.blue(`${s.info} info`)}`),o.push(``),o.join(`
|
|
2
|
+
`);if(o.push(``),r.results.length===0)o.push(e.green(` No issues found.`)),o.push(``);else{let n=[...r.results].sort((e,t)=>i(t.severity)-i(e.severity));n.forEach((r,i)=>{let a=t[r.severity],s=`${r.category.toLowerCase()}/${r.ruleId}`;o.push(`${a} ${e.bold(s)} — ${r.message}`),r.fix&&o.push(` ${e.dim(r.fix)}`),i<n.length-1&&o.push(``)}),o.push(``)}let c=n(s,r.overallStatus),l=r.overallStatus===`FAIL`?e.red.bold:r.overallStatus===`AI-FAIL`?e.yellow.bold:e.green.bold;return o.push(l(c)),o.push(``),o.join(`
|
|
3
|
+
`)}function i(e){return e===`CRITICAL`?3:e===`WARNING`?2:1}function a(e){return JSON.stringify(e,null,2)}const o={CRITICAL:`error`,WARNING:`warning`,INFO:`notice`};function s(e){return e.replace(/%/g,`%25`).replace(/\r/g,`%0D`).replace(/\n/g,`%0A`).replace(/:/g,`%3A`).replace(/,/g,`%2C`)}function c(e){let t=[];for(let n of e.results){let e=o[n.severity],r=s(`[${n.ruleId}] ${n.ruleName}`),i=s(n.message);t.push(`::${e} title=${r}::${i}`)}let r=n({crit:e.results.filter(e=>e.severity===`CRITICAL`).length,warn:e.results.filter(e=>e.severity===`WARNING`).length,info:e.results.filter(e=>e.severity===`INFO`).length},e.overallStatus),i=s(`${e.url} — ${r}`);return t.push(`::notice title=LintPage Verdict::${i}`),t.join(`
|
|
4
|
+
`)}function l(e,t,n){switch(t){case`json`:return a(e);case`github`:return c(e);default:return r(e,n)}}export{r as i,c as n,a as r,l as t};
|
|
5
|
+
//# sourceMappingURL=formatter-CuMgo6fc.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter-CuMgo6fc.mjs","names":[],"sources":["../src/formatter.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { PageResult, Severity } from '@lintpage/core';\n\nexport type Format = 'text' | 'json' | 'github';\n\n// ── Text formatter ─────────────────────────────────────────────\n\nconst SEVERITY_ICON: Record<Severity, string> = {\n CRITICAL: chalk.red.bold('✗'),\n WARNING: chalk.yellow('⚠'),\n INFO: chalk.blue('ℹ'),\n};\n\nfunction buildVerdict(\n counts: { crit: number; warn: number; info: number },\n status: PageResult['overallStatus'],\n): string {\n const w = `${counts.warn} ${counts.warn === 1 ? 'warning' : 'warnings'}`;\n if (status === 'FAIL') {\n return `DEPLOY BLOCKED · ${counts.crit} critical · ${w} · ${counts.info} info`;\n }\n if (status === 'AI-FAIL') {\n return `AI VISIBILITY FAIL · ${counts.crit} AI critical · ${w} · ${counts.info} info`;\n }\n return `READY TO SHIP · ${w} · ${counts.info} info`;\n}\n\nexport function formatText(result: PageResult, quiet: boolean): string {\n const lines: string[] = [];\n const counts = {\n crit: result.results.filter((r) => r.severity === 'CRITICAL').length,\n warn: result.results.filter((r) => r.severity === 'WARNING').length,\n info: result.results.filter((r) => r.severity === 'INFO').length,\n };\n\n if (quiet) {\n lines.push(\n ` ${chalk.red.bold(`${counts.crit} critical`)} ${chalk.yellow(\n `${counts.warn} ${counts.warn === 1 ? 'warning' : 'warnings'}`,\n )} ${chalk.blue(`${counts.info} info`)}`,\n );\n lines.push('');\n return lines.join('\\n');\n }\n\n lines.push('');\n\n if (result.results.length === 0) {\n lines.push(chalk.green(' No issues found.'));\n lines.push('');\n } else {\n const sorted = [...result.results].sort(\n (a, b) => severityRank(b.severity) - severityRank(a.severity),\n );\n sorted.forEach((issue, idx) => {\n const icon = SEVERITY_ICON[issue.severity];\n const path = `${issue.category.toLowerCase()}/${issue.ruleId}`;\n lines.push(`${icon} ${chalk.bold(path)} — ${issue.message}`);\n if (issue.fix) {\n lines.push(` ${chalk.dim(issue.fix)}`);\n }\n if (idx < sorted.length - 1) {\n lines.push('');\n }\n });\n lines.push('');\n }\n\n const verdict = buildVerdict(counts, result.overallStatus);\n const colour =\n result.overallStatus === 'FAIL'\n ? chalk.red.bold\n : result.overallStatus === 'AI-FAIL'\n ? chalk.yellow.bold\n : chalk.green.bold;\n lines.push(colour(verdict));\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction severityRank(s: Severity): number {\n return s === 'CRITICAL' ? 3 : s === 'WARNING' ? 2 : 1;\n}\n\n// ── JSON formatter ─────────────────────────────────────────────\n\nexport function formatJson(result: PageResult): string {\n return JSON.stringify(result, null, 2);\n}\n\n// ── GitHub Actions formatter ───────────────────────────────────\n\nconst GH_LEVEL: Record<Severity, string> = {\n CRITICAL: 'error',\n WARNING: 'warning',\n INFO: 'notice',\n};\n\n/**\n * Sanitize a string for use in GitHub Actions workflow commands.\n * Escapes characters that could break or inject annotations.\n * @see https://github.com/actions/toolkit/blob/main/packages/core/src/command.ts\n */\nfunction sanitizeAnnotation(str: string): string {\n return str\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n\nexport function formatGithub(result: PageResult): string {\n const lines: string[] = [];\n\n for (const issue of result.results) {\n const level = GH_LEVEL[issue.severity];\n const title = sanitizeAnnotation(`[${issue.ruleId}] ${issue.ruleName}`);\n const message = sanitizeAnnotation(issue.message);\n // GitHub annotation format: ::level title=TITLE::MESSAGE\n lines.push(`::${level} title=${title}::${message}`);\n }\n\n // Summary annotation\n const counts = {\n crit: result.results.filter((r) => r.severity === 'CRITICAL').length,\n warn: result.results.filter((r) => r.severity === 'WARNING').length,\n info: result.results.filter((r) => r.severity === 'INFO').length,\n };\n const verdict = buildVerdict(counts, result.overallStatus);\n const summaryMessage = sanitizeAnnotation(`${result.url} — ${verdict}`);\n lines.push(`::notice title=LintPage Verdict::${summaryMessage}`);\n\n return lines.join('\\n');\n}\n\n// ── Dispatcher ─────────────────────────────────────────────────\n\nexport function format(\n result: PageResult,\n fmt: Format,\n quiet: boolean\n): string {\n switch (fmt) {\n case 'json':\n return formatJson(result);\n case 'github':\n return formatGithub(result);\n case 'text':\n default:\n return formatText(result, quiet);\n }\n}\n"],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./formatter-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./formatter-BFKK5Mks.cjs`);exports.format=e.t,exports.formatGithub=e.n,exports.formatJson=e.r,exports.formatText=e.i;
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.mts
CHANGED
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,n as t,r as n,t as r}from"./formatter-
|
|
1
|
+
import{i as e,n as t,r as n,t as r}from"./formatter-CuMgo6fc.mjs";export{r as format,t as formatGithub,n as formatJson,e as formatText};
|
package/package.json
CHANGED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import e from"chalk";const t={CRITICAL:e.red.bold(`✗`),WARNING:e.yellow(`⚠`),INFO:e.blue(`ℹ`)},n={CRITICAL:e.red.bold(`CRITICAL`),WARNING:e.yellow(`WARNING`),INFO:e.blue(`INFO`)};function r(e){let t={};for(let n of e)(t[n.category]??=[]).push(n);return t}function i(i,a){let o=[],s=i.overallStatus===`PASS`?e.green:e.red;if(o.push(``),o.push(`${e.bold(`LintPage`)} audit for ${e.underline(i.url)}`),o.push(`Score: ${s.bold(String(i.score))}/100 Status: ${s.bold(i.overallStatus)}`),o.push(``),i.results.length===0)return o.push(e.green(` No issues found!`)),o.push(``),o.join(`
|
|
2
|
-
`);if(a){let t=i.results.filter(e=>e.severity===`CRITICAL`).length,n=i.results.filter(e=>e.severity===`WARNING`).length,r=i.results.filter(e=>e.severity===`INFO`).length;return o.push(` ${e.red.bold(`${t} critical`)} ${e.yellow(`${n} warnings`)} ${e.blue(`${r} info`)}`),o.push(``),o.join(`
|
|
3
|
-
`)}for(let[t,n]of Object.entries(i.categoryScores)){let r=n.max>0?Math.round(n.score/n.max*100):100,i=r>=80?e.green:r>=50?e.yellow:e.red;o.push(` ${e.bold(t.padEnd(16))} ${i(`${n.score}/${n.max}`)} ${e.dim(`(${r}%)`)}`)}o.push(``);let c=r(i.results);for(let[r,i]of Object.entries(c)){o.push(e.bold.underline(` ${r}`));for(let r of i)o.push(` ${t[r.severity]} ${n[r.severity].padEnd(20)} ${r.message}`),r.fix&&o.push(` ${e.dim(r.fix)}`);o.push(``)}return o.join(`
|
|
4
|
-
`)}function a(e){return JSON.stringify(e,null,2)}const o={CRITICAL:`error`,WARNING:`warning`,INFO:`notice`};function s(e){return e.replace(/%/g,`%25`).replace(/\r/g,`%0D`).replace(/\n/g,`%0A`).replace(/:/g,`%3A`).replace(/,/g,`%2C`)}function c(e){let t=[];for(let n of e.results){let e=o[n.severity],r=s(`[${n.ruleId}] ${n.ruleName}`),i=s(n.message);t.push(`::${e} title=${r}::${i}`)}let n=s(`${e.overallStatus===`PASS`?`✅`:`❌`} ${e.url} — Score: ${e.score}/100 (${e.overallStatus})`);return t.push(`::notice title=LintPage Score::${n}`),t.join(`
|
|
5
|
-
`)}function l(e,t,n){switch(t){case`json`:return a(e);case`github`:return c(e);default:return i(e,n)}}export{i,c as n,a as r,l as t};
|
|
6
|
-
//# sourceMappingURL=formatter-BhulhYos.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formatter-BhulhYos.mjs","names":[],"sources":["../src/formatter.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { PageResult, RuleResult, Severity } from '@lintpage/core';\n\nexport type Format = 'text' | 'json' | 'github';\n\n// ── Text formatter ─────────────────────────────────────────────\n\nconst SEVERITY_ICON: Record<Severity, string> = {\n CRITICAL: chalk.red.bold('✗'),\n WARNING: chalk.yellow('⚠'),\n INFO: chalk.blue('ℹ'),\n};\n\nconst SEVERITY_LABEL: Record<Severity, string> = {\n CRITICAL: chalk.red.bold('CRITICAL'),\n WARNING: chalk.yellow('WARNING'),\n INFO: chalk.blue('INFO'),\n};\n\nfunction groupByCategory(results: RuleResult[]): Record<string, RuleResult[]> {\n const groups: Record<string, RuleResult[]> = {};\n for (const r of results) {\n (groups[r.category] ??= []).push(r);\n }\n return groups;\n}\n\nexport function formatText(result: PageResult, quiet: boolean): string {\n const lines: string[] = [];\n\n const statusColor = result.overallStatus === 'PASS' ? chalk.green : chalk.red;\n lines.push('');\n lines.push(\n `${chalk.bold('LintPage')} audit for ${chalk.underline(result.url)}`\n );\n lines.push(\n `Score: ${statusColor.bold(String(result.score))}/100 Status: ${statusColor.bold(result.overallStatus)}`\n );\n lines.push('');\n\n if (result.results.length === 0) {\n lines.push(chalk.green(' No issues found!'));\n lines.push('');\n return lines.join('\\n');\n }\n\n if (quiet) {\n const critical = result.results.filter((r) => r.severity === 'CRITICAL').length;\n const warnings = result.results.filter((r) => r.severity === 'WARNING').length;\n const info = result.results.filter((r) => r.severity === 'INFO').length;\n lines.push(\n ` ${chalk.red.bold(`${critical} critical`)} ${chalk.yellow(`${warnings} warnings`)} ${chalk.blue(`${info} info`)}`\n );\n lines.push('');\n return lines.join('\\n');\n }\n\n // Category scores\n for (const [category, scores] of Object.entries(result.categoryScores)) {\n const pct = scores.max > 0 ? Math.round((scores.score / scores.max) * 100) : 100;\n const color = pct >= 80 ? chalk.green : pct >= 50 ? chalk.yellow : chalk.red;\n lines.push(\n ` ${chalk.bold(category.padEnd(16))} ${color(`${scores.score}/${scores.max}`)} ${chalk.dim(`(${pct}%)`)}`\n );\n }\n lines.push('');\n\n // Issues grouped by category\n const grouped = groupByCategory(result.results);\n for (const [category, issues] of Object.entries(grouped)) {\n lines.push(chalk.bold.underline(` ${category}`));\n for (const issue of issues) {\n lines.push(\n ` ${SEVERITY_ICON[issue.severity]} ${SEVERITY_LABEL[issue.severity].padEnd(20)} ${issue.message}`\n );\n if (issue.fix) {\n lines.push(` ${chalk.dim(issue.fix)}`);\n }\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n// ── JSON formatter ─────────────────────────────────────────────\n\nexport function formatJson(result: PageResult): string {\n return JSON.stringify(result, null, 2);\n}\n\n// ── GitHub Actions formatter ───────────────────────────────────\n\nconst GH_LEVEL: Record<Severity, string> = {\n CRITICAL: 'error',\n WARNING: 'warning',\n INFO: 'notice',\n};\n\n/**\n * Sanitize a string for use in GitHub Actions workflow commands.\n * Escapes characters that could break or inject annotations.\n * @see https://github.com/actions/toolkit/blob/main/packages/core/src/command.ts\n */\nfunction sanitizeAnnotation(str: string): string {\n return str\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n\nexport function formatGithub(result: PageResult): string {\n const lines: string[] = [];\n\n for (const issue of result.results) {\n const level = GH_LEVEL[issue.severity];\n const title = sanitizeAnnotation(`[${issue.ruleId}] ${issue.ruleName}`);\n const message = sanitizeAnnotation(issue.message);\n // GitHub annotation format: ::level title=TITLE::MESSAGE\n lines.push(`::${level} title=${title}::${message}`);\n }\n\n // Summary annotation\n const statusEmoji = result.overallStatus === 'PASS' ? '✅' : '❌';\n const summaryMessage = sanitizeAnnotation(\n `${statusEmoji} ${result.url} — Score: ${result.score}/100 (${result.overallStatus})`\n );\n lines.push(\n `::notice title=LintPage Score::${summaryMessage}`\n );\n\n return lines.join('\\n');\n}\n\n// ── Dispatcher ─────────────────────────────────────────────────\n\nexport function format(\n result: PageResult,\n fmt: Format,\n quiet: boolean\n): string {\n switch (fmt) {\n case 'json':\n return formatJson(result);\n case 'github':\n return formatGithub(result);\n case 'text':\n default:\n return formatText(result, quiet);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`chalk`);c=s(c);const l={CRITICAL:c.default.red.bold(`✗`),WARNING:c.default.yellow(`⚠`),INFO:c.default.blue(`ℹ`)},u={CRITICAL:c.default.red.bold(`CRITICAL`),WARNING:c.default.yellow(`WARNING`),INFO:c.default.blue(`INFO`)};function d(e){let t={};for(let n of e)(t[n.category]??=[]).push(n);return t}function f(e,t){let n=[],r=e.overallStatus===`PASS`?c.default.green:c.default.red;if(n.push(``),n.push(`${c.default.bold(`LintPage`)} audit for ${c.default.underline(e.url)}`),n.push(`Score: ${r.bold(String(e.score))}/100 Status: ${r.bold(e.overallStatus)}`),n.push(``),e.results.length===0)return n.push(c.default.green(` No issues found!`)),n.push(``),n.join(`
|
|
2
|
-
`);if(t){let t=e.results.filter(e=>e.severity===`CRITICAL`).length,r=e.results.filter(e=>e.severity===`WARNING`).length,i=e.results.filter(e=>e.severity===`INFO`).length;return n.push(` ${c.default.red.bold(`${t} critical`)} ${c.default.yellow(`${r} warnings`)} ${c.default.blue(`${i} info`)}`),n.push(``),n.join(`
|
|
3
|
-
`)}for(let[t,r]of Object.entries(e.categoryScores)){let e=r.max>0?Math.round(r.score/r.max*100):100,i=e>=80?c.default.green:e>=50?c.default.yellow:c.default.red;n.push(` ${c.default.bold(t.padEnd(16))} ${i(`${r.score}/${r.max}`)} ${c.default.dim(`(${e}%)`)}`)}n.push(``);let i=d(e.results);for(let[e,t]of Object.entries(i)){n.push(c.default.bold.underline(` ${e}`));for(let e of t)n.push(` ${l[e.severity]} ${u[e.severity].padEnd(20)} ${e.message}`),e.fix&&n.push(` ${c.default.dim(e.fix)}`);n.push(``)}return n.join(`
|
|
4
|
-
`)}function p(e){return JSON.stringify(e,null,2)}const m={CRITICAL:`error`,WARNING:`warning`,INFO:`notice`};function h(e){return e.replace(/%/g,`%25`).replace(/\r/g,`%0D`).replace(/\n/g,`%0A`).replace(/:/g,`%3A`).replace(/,/g,`%2C`)}function g(e){let t=[];for(let n of e.results){let e=m[n.severity],r=h(`[${n.ruleId}] ${n.ruleName}`),i=h(n.message);t.push(`::${e} title=${r}::${i}`)}let n=h(`${e.overallStatus===`PASS`?`✅`:`❌`} ${e.url} — Score: ${e.score}/100 (${e.overallStatus})`);return t.push(`::notice title=LintPage Score::${n}`),t.join(`
|
|
5
|
-
`)}function _(e,t,n){switch(t){case`json`:return p(e);case`github`:return g(e);default:return f(e,n)}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return _}});
|
|
6
|
-
//# sourceMappingURL=formatter-CJEdbkqw.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formatter-CJEdbkqw.cjs","names":[],"sources":["../src/formatter.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { PageResult, RuleResult, Severity } from '@lintpage/core';\n\nexport type Format = 'text' | 'json' | 'github';\n\n// ── Text formatter ─────────────────────────────────────────────\n\nconst SEVERITY_ICON: Record<Severity, string> = {\n CRITICAL: chalk.red.bold('✗'),\n WARNING: chalk.yellow('⚠'),\n INFO: chalk.blue('ℹ'),\n};\n\nconst SEVERITY_LABEL: Record<Severity, string> = {\n CRITICAL: chalk.red.bold('CRITICAL'),\n WARNING: chalk.yellow('WARNING'),\n INFO: chalk.blue('INFO'),\n};\n\nfunction groupByCategory(results: RuleResult[]): Record<string, RuleResult[]> {\n const groups: Record<string, RuleResult[]> = {};\n for (const r of results) {\n (groups[r.category] ??= []).push(r);\n }\n return groups;\n}\n\nexport function formatText(result: PageResult, quiet: boolean): string {\n const lines: string[] = [];\n\n const statusColor = result.overallStatus === 'PASS' ? chalk.green : chalk.red;\n lines.push('');\n lines.push(\n `${chalk.bold('LintPage')} audit for ${chalk.underline(result.url)}`\n );\n lines.push(\n `Score: ${statusColor.bold(String(result.score))}/100 Status: ${statusColor.bold(result.overallStatus)}`\n );\n lines.push('');\n\n if (result.results.length === 0) {\n lines.push(chalk.green(' No issues found!'));\n lines.push('');\n return lines.join('\\n');\n }\n\n if (quiet) {\n const critical = result.results.filter((r) => r.severity === 'CRITICAL').length;\n const warnings = result.results.filter((r) => r.severity === 'WARNING').length;\n const info = result.results.filter((r) => r.severity === 'INFO').length;\n lines.push(\n ` ${chalk.red.bold(`${critical} critical`)} ${chalk.yellow(`${warnings} warnings`)} ${chalk.blue(`${info} info`)}`\n );\n lines.push('');\n return lines.join('\\n');\n }\n\n // Category scores\n for (const [category, scores] of Object.entries(result.categoryScores)) {\n const pct = scores.max > 0 ? Math.round((scores.score / scores.max) * 100) : 100;\n const color = pct >= 80 ? chalk.green : pct >= 50 ? chalk.yellow : chalk.red;\n lines.push(\n ` ${chalk.bold(category.padEnd(16))} ${color(`${scores.score}/${scores.max}`)} ${chalk.dim(`(${pct}%)`)}`\n );\n }\n lines.push('');\n\n // Issues grouped by category\n const grouped = groupByCategory(result.results);\n for (const [category, issues] of Object.entries(grouped)) {\n lines.push(chalk.bold.underline(` ${category}`));\n for (const issue of issues) {\n lines.push(\n ` ${SEVERITY_ICON[issue.severity]} ${SEVERITY_LABEL[issue.severity].padEnd(20)} ${issue.message}`\n );\n if (issue.fix) {\n lines.push(` ${chalk.dim(issue.fix)}`);\n }\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n// ── JSON formatter ─────────────────────────────────────────────\n\nexport function formatJson(result: PageResult): string {\n return JSON.stringify(result, null, 2);\n}\n\n// ── GitHub Actions formatter ───────────────────────────────────\n\nconst GH_LEVEL: Record<Severity, string> = {\n CRITICAL: 'error',\n WARNING: 'warning',\n INFO: 'notice',\n};\n\n/**\n * Sanitize a string for use in GitHub Actions workflow commands.\n * Escapes characters that could break or inject annotations.\n * @see https://github.com/actions/toolkit/blob/main/packages/core/src/command.ts\n */\nfunction sanitizeAnnotation(str: string): string {\n return str\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n\nexport function formatGithub(result: PageResult): string {\n const lines: string[] = [];\n\n for (const issue of result.results) {\n const level = GH_LEVEL[issue.severity];\n const title = sanitizeAnnotation(`[${issue.ruleId}] ${issue.ruleName}`);\n const message = sanitizeAnnotation(issue.message);\n // GitHub annotation format: ::level title=TITLE::MESSAGE\n lines.push(`::${level} title=${title}::${message}`);\n }\n\n // Summary annotation\n const statusEmoji = result.overallStatus === 'PASS' ? '✅' : '❌';\n const summaryMessage = sanitizeAnnotation(\n `${statusEmoji} ${result.url} — Score: ${result.score}/100 (${result.overallStatus})`\n );\n lines.push(\n `::notice title=LintPage Score::${summaryMessage}`\n );\n\n return lines.join('\\n');\n}\n\n// ── Dispatcher ─────────────────────────────────────────────────\n\nexport function format(\n result: PageResult,\n fmt: Format,\n quiet: boolean\n): string {\n switch (fmt) {\n case 'json':\n return formatJson(result);\n case 'github':\n return formatGithub(result);\n case 'text':\n default:\n return formatText(result, quiet);\n }\n}\n"],"mappings":"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"}
|