@vizejs/vite-plugin-musea 0.0.1-alpha.11 → 0.0.1-alpha.112
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/a11y-Bvx5TJb8.d.ts +61 -0
- package/dist/a11y-Bvx5TJb8.d.ts.map +1 -0
- package/dist/a11y-C6xqILwZ.js +305 -0
- package/dist/a11y-C6xqILwZ.js.map +1 -0
- package/dist/a11y.d.ts +3 -0
- package/dist/a11y.js +3 -0
- package/dist/autogen-D3Zjc3zI.d.ts +64 -0
- package/dist/autogen-D3Zjc3zI.d.ts.map +1 -0
- package/dist/autogen-ymQnARZK.js +193 -0
- package/dist/autogen-ymQnARZK.js.map +1 -0
- package/dist/autogen.d.ts +2 -0
- package/dist/autogen.js +3 -0
- package/dist/cli.js +207 -30
- package/dist/cli.js.map +1 -1
- package/dist/gallery/assets/abap-Cry0R76c.js +1 -0
- package/dist/gallery/assets/apex-GS4zZi0I.js +1 -0
- package/dist/gallery/assets/azcli-DMImymmY.js +1 -0
- package/dist/gallery/assets/bat-D6epFECU.js +1 -0
- package/dist/gallery/assets/bicep-7klDZ283.js +2 -0
- package/dist/gallery/assets/cameligo-PvLD8t4t.js +1 -0
- package/dist/gallery/assets/clojure-BTbSGpb3.js +1 -0
- package/dist/gallery/assets/codicon-DCmgc-ay.ttf +0 -0
- package/dist/gallery/assets/coffee-Bhl_9YuJ.js +1 -0
- package/dist/gallery/assets/cpp-CM5j04eT.js +1 -0
- package/dist/gallery/assets/csharp-Dh0Ee7SY.js +1 -0
- package/dist/gallery/assets/csp-CLRC61y6.js +1 -0
- package/dist/gallery/assets/css-B0t_muXd.js +3 -0
- package/dist/gallery/assets/css.worker-Cbw1kvi8.js +88 -0
- package/dist/gallery/assets/cssMode-DBTfE7c_.js +4 -0
- package/dist/gallery/assets/cypher-C5e5inIh.js +1 -0
- package/dist/gallery/assets/dart-DIK3l8YT.js +1 -0
- package/dist/gallery/assets/dockerfile-D7OAO0hl.js +1 -0
- package/dist/gallery/assets/ecl-CP7nM2KN.js +1 -0
- package/dist/gallery/assets/editor-B55U_qvj.css +1 -0
- package/dist/gallery/assets/editor-F8AxQWwE.css +1 -0
- package/dist/gallery/assets/editor.api-DOELtZec.js +644 -0
- package/dist/gallery/assets/editor.main-BWk0dmtj.js +63 -0
- package/dist/gallery/assets/editor.worker-Cs7HTPcl.js +12 -0
- package/dist/gallery/assets/elixir-DNRIIj6-.js +1 -0
- package/dist/gallery/assets/flow9-BC5Cr9X0.js +1 -0
- package/dist/gallery/assets/freemarker2-DaSd0g6o.js +3 -0
- package/dist/gallery/assets/fsharp-52P4yqMh.js +1 -0
- package/dist/gallery/assets/go-yKE3zUfB.js +1 -0
- package/dist/gallery/assets/graphql-D3sNVCLc.js +1 -0
- package/dist/gallery/assets/handlebars-B-cbMVnP.js +1 -0
- package/dist/gallery/assets/hcl-BB7aW7AX.js +1 -0
- package/dist/gallery/assets/html-BbDsaPQg.js +1 -0
- package/dist/gallery/assets/html.worker-CYmk49z4.js +495 -0
- package/dist/gallery/assets/htmlMode-C2OjYqY0.js +4 -0
- package/dist/gallery/assets/index-BIf-7q-k.css +1 -0
- package/dist/gallery/assets/index-DotH6Szk.js +63 -0
- package/dist/gallery/assets/ini-BdRufzJj.js +1 -0
- package/dist/gallery/assets/java-CeUu-z7Y.js +1 -0
- package/dist/gallery/assets/javascript-CogJNBNZ.js +1 -0
- package/dist/gallery/assets/json.worker-CWR6J9Qf.js +51 -0
- package/dist/gallery/assets/jsonMode-ssar7rkB.js +10 -0
- package/dist/gallery/assets/julia-CXu-Fn93.js +1 -0
- package/dist/gallery/assets/kotlin-TwsjxLJ3.js +1 -0
- package/dist/gallery/assets/less-CviwWNG4.js +2 -0
- package/dist/gallery/assets/lexon-BTOivnjP.js +1 -0
- package/dist/gallery/assets/liquid-D9uJH3tm.js +1 -0
- package/dist/gallery/assets/lua-6W3WJOvj.js +1 -0
- package/dist/gallery/assets/m3-tlthQ8Fo.js +1 -0
- package/dist/gallery/assets/markdown-CPR4Kr9O.js +1 -0
- package/dist/gallery/assets/mdx-D1ruboYf.js +1 -0
- package/dist/gallery/assets/mips-BfxZbsD8.js +1 -0
- package/dist/gallery/assets/monaco.contribution-w8cYIjzF.js +2 -0
- package/dist/gallery/assets/msdax-eKsr2VtO.js +1 -0
- package/dist/gallery/assets/mysql-D6-LO0bt.js +1 -0
- package/dist/gallery/assets/objective-c-DYtfYpNc.js +1 -0
- package/dist/gallery/assets/pascal-CPGyHbal.js +1 -0
- package/dist/gallery/assets/pascaligo-Dsp_VKxo.js +1 -0
- package/dist/gallery/assets/perl-CUVa2_Cu.js +1 -0
- package/dist/gallery/assets/pgsql-C2nbbU56.js +1 -0
- package/dist/gallery/assets/php-DxX2tlkL.js +1 -0
- package/dist/gallery/assets/pla-D55LHImG.js +1 -0
- package/dist/gallery/assets/postiats-Dw_nWtoT.js +1 -0
- package/dist/gallery/assets/powerquery-BldVOeNZ.js +1 -0
- package/dist/gallery/assets/powershell-fdqyoMut.js +1 -0
- package/dist/gallery/assets/protobuf-C-2cnAYL.js +2 -0
- package/dist/gallery/assets/pug-bDrVOc6m.js +1 -0
- package/dist/gallery/assets/python-Bk5JPOE3.js +1 -0
- package/dist/gallery/assets/qsharp-B83Ol6AR.js +1 -0
- package/dist/gallery/assets/r-DAxg6zn-.js +1 -0
- package/dist/gallery/assets/razor-BbS20zwD.js +1 -0
- package/dist/gallery/assets/redis-BSRYxJDu.js +1 -0
- package/dist/gallery/assets/redshift-BrtVU4Ki.js +1 -0
- package/dist/gallery/assets/restructuredtext-DdU6AjLQ.js +1 -0
- package/dist/gallery/assets/ruby-C-s7ovR-.js +1 -0
- package/dist/gallery/assets/rust-CmSb_pkG.js +1 -0
- package/dist/gallery/assets/sb-Bfo5Ukmr.js +1 -0
- package/dist/gallery/assets/scala-Cx2bkddK.js +1 -0
- package/dist/gallery/assets/scheme-DkT6GPaV.js +1 -0
- package/dist/gallery/assets/scss-DOPngiM2.js +3 -0
- package/dist/gallery/assets/shell-NYt6Xulf.js +1 -0
- package/dist/gallery/assets/solidity-CUiq_T3F.js +1 -0
- package/dist/gallery/assets/sophia-B4sI8Ij-.js +1 -0
- package/dist/gallery/assets/sparql-BNfhekQe.js +1 -0
- package/dist/gallery/assets/sql-Bzn3OZV3.js +1 -0
- package/dist/gallery/assets/st-CV0zI_0P.js +1 -0
- package/dist/gallery/assets/swift-CR3-zK7D.js +1 -0
- package/dist/gallery/assets/systemverilog-BxgPwTIi.js +1 -0
- package/dist/gallery/assets/tcl-BSnnsp36.js +1 -0
- package/dist/gallery/assets/ts.worker-B_5n269U.js +51339 -0
- package/dist/gallery/assets/tsMode-DWuHbc8i.js +11 -0
- package/dist/gallery/assets/twig-Bx06vatZ.js +1 -0
- package/dist/gallery/assets/typescript-FIdb5Wzk.js +1 -0
- package/dist/gallery/assets/typespec-COSap3s7.js +1 -0
- package/dist/gallery/assets/vb-DU0VXhXP.js +1 -0
- package/dist/gallery/assets/wgsl-BegdTer-.js +298 -0
- package/dist/gallery/assets/xml-BDyGXNxX.js +1 -0
- package/dist/gallery/assets/yaml-D3AYCCFt.js +1 -0
- package/dist/gallery/index.html +16 -0
- package/dist/index.d.ts +51 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1532 -65
- package/dist/index.js.map +1 -1
- package/dist/{vrt-DRwtnkE5.js → vrt-DP87vGIA.js} +222 -289
- package/dist/vrt-DP87vGIA.js.map +1 -0
- package/dist/vrt-Vb4aqPZE.d.ts +461 -0
- package/dist/vrt-Vb4aqPZE.d.ts.map +1 -0
- package/dist/vrt.d.ts +2 -2
- package/dist/vrt.js +1 -1
- package/package.json +28 -5
- package/dist/vrt-BfuTRv-J.d.ts +0 -217
- package/dist/vrt-BfuTRv-J.d.ts.map +0 -1
- package/dist/vrt-DRwtnkE5.js.map +0 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { A11yOptions, A11yResult, ArtFileInfo, MuseaVrtRunner$1 as MuseaVrtRunner } from "./vrt-Vb4aqPZE.js";
|
|
2
|
+
import { Page } from "playwright";
|
|
3
|
+
|
|
4
|
+
//#region src/a11y.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* A11y audit summary.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A11y audit summary.
|
|
11
|
+
*/
|
|
12
|
+
interface A11ySummary {
|
|
13
|
+
totalComponents: number;
|
|
14
|
+
totalVariants: number;
|
|
15
|
+
totalViolations: number;
|
|
16
|
+
criticalCount: number;
|
|
17
|
+
seriousCount: number;
|
|
18
|
+
moderateCount: number;
|
|
19
|
+
minorCount: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A11y runner using axe-core via Playwright.
|
|
23
|
+
*/
|
|
24
|
+
declare class MuseaA11yRunner {
|
|
25
|
+
private options;
|
|
26
|
+
constructor(options?: A11yOptions);
|
|
27
|
+
/**
|
|
28
|
+
* Run a11y audits on all art file variants.
|
|
29
|
+
* Reuses VRT runner's browser if available.
|
|
30
|
+
*/
|
|
31
|
+
runAudits(artFiles: ArtFileInfo[], baseUrl: string, vrtRunner?: MuseaVrtRunner): Promise<A11yResult[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Audit a single page using axe-core.
|
|
34
|
+
*/
|
|
35
|
+
auditPage(page: Page, artPath: string, variantName: string): Promise<A11yResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Get summary statistics from results.
|
|
38
|
+
*/
|
|
39
|
+
getSummary(results: A11yResult[]): A11ySummary;
|
|
40
|
+
/**
|
|
41
|
+
* Generate HTML report.
|
|
42
|
+
*/
|
|
43
|
+
generateHtmlReport(results: A11yResult[]): string;
|
|
44
|
+
/**
|
|
45
|
+
* Generate JSON report for CI integration.
|
|
46
|
+
*/
|
|
47
|
+
generateJsonReport(results: A11yResult[]): string;
|
|
48
|
+
/**
|
|
49
|
+
* Get axe-core source code for injection.
|
|
50
|
+
*/
|
|
51
|
+
private getAxeSource;
|
|
52
|
+
/**
|
|
53
|
+
* Build axe-core run options from configuration.
|
|
54
|
+
*/
|
|
55
|
+
private buildAxeOptions;
|
|
56
|
+
private buildVariantUrl;
|
|
57
|
+
} //#endregion
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=a11y.d.ts.map
|
|
60
|
+
export { A11ySummary, MuseaA11yRunner as MuseaA11yRunner$1 };
|
|
61
|
+
//# sourceMappingURL=a11y-Bvx5TJb8.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y-Bvx5TJb8.d.ts","names":[],"sources":["../src/a11y.ts"],"sourcesContent":null,"mappings":";;;;;;;;AAmBA;;;UAAiB,WAAA;EA4BJ,eAAA,EAAA,MAAe;EAAA,aAAA,EAAA,MAAA;EAAA,eAGL,EAAA,MAAA;EAAgB,aAczB,EAAA,MAAA;EAAW,YAET,EAAA,MAAA;EAAc,aACjB,EAAA,MAAA;EAAU,UAAlB,EAAA,MAAA;;;;;AAkGgC,cAtHxB,eAAA,CAsHwB;EAAW,QAkBlB,OAAA;EAAU,WA6IV,CAAA,OAAA,CAAA,EAlRP,WAkRO;EAAU;;;;sBApQ1B,4CAEE,iBACX,QAAQ;;;;kBA+DW,6CAA6C,QAAQ;;;;sBAmCvD,eAAe;;;;8BAkBP;;;;8BA6IA"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
|
|
3
|
+
//#region src/a11y.ts
|
|
4
|
+
/**
|
|
5
|
+
* A11y runner using axe-core via Playwright.
|
|
6
|
+
*/
|
|
7
|
+
var MuseaA11yRunner = class {
|
|
8
|
+
options;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.options = {
|
|
11
|
+
enabled: options.enabled ?? true,
|
|
12
|
+
includeRules: options.includeRules ?? [],
|
|
13
|
+
excludeRules: options.excludeRules ?? [],
|
|
14
|
+
level: options.level ?? "AA"
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Run a11y audits on all art file variants.
|
|
19
|
+
* Reuses VRT runner's browser if available.
|
|
20
|
+
*/
|
|
21
|
+
async runAudits(artFiles, baseUrl, vrtRunner) {
|
|
22
|
+
const results = [];
|
|
23
|
+
const defaultViewport = {
|
|
24
|
+
width: 1280,
|
|
25
|
+
height: 720,
|
|
26
|
+
name: "desktop"
|
|
27
|
+
};
|
|
28
|
+
for (const art of artFiles) for (const variant of art.variants) {
|
|
29
|
+
if (variant.skipVrt) continue;
|
|
30
|
+
let page = null;
|
|
31
|
+
let context = null;
|
|
32
|
+
try {
|
|
33
|
+
if (vrtRunner) {
|
|
34
|
+
context = await vrtRunner.createPage(defaultViewport);
|
|
35
|
+
page = context.page;
|
|
36
|
+
} else {
|
|
37
|
+
const { chromium } = await import("playwright");
|
|
38
|
+
const browser = await chromium.launch({ headless: true });
|
|
39
|
+
const ctx = await browser.newContext({ viewport: {
|
|
40
|
+
width: defaultViewport.width,
|
|
41
|
+
height: defaultViewport.height
|
|
42
|
+
} });
|
|
43
|
+
page = await ctx.newPage();
|
|
44
|
+
context = {
|
|
45
|
+
page,
|
|
46
|
+
context: ctx
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const variantUrl = this.buildVariantUrl(baseUrl, art.path, variant.name);
|
|
50
|
+
await page.goto(variantUrl, { waitUntil: "networkidle" });
|
|
51
|
+
await page.waitForSelector(".musea-variant", { timeout: 1e4 });
|
|
52
|
+
await page.waitForTimeout(200);
|
|
53
|
+
const result = await this.auditPage(page, art.path, variant.name);
|
|
54
|
+
results.push(result);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
results.push({
|
|
57
|
+
artPath: art.path,
|
|
58
|
+
variantName: variant.name,
|
|
59
|
+
violations: [{
|
|
60
|
+
id: "audit-error",
|
|
61
|
+
impact: "critical",
|
|
62
|
+
description: `Audit failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
63
|
+
helpUrl: "",
|
|
64
|
+
nodes: 0
|
|
65
|
+
}],
|
|
66
|
+
passes: 0,
|
|
67
|
+
incomplete: 0
|
|
68
|
+
});
|
|
69
|
+
} finally {
|
|
70
|
+
if (context) await context.context.close();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return results;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Audit a single page using axe-core.
|
|
77
|
+
*/
|
|
78
|
+
async auditPage(page, artPath, variantName) {
|
|
79
|
+
const axeSource = await this.getAxeSource();
|
|
80
|
+
await page.evaluate(axeSource);
|
|
81
|
+
const runOptions = this.buildAxeOptions();
|
|
82
|
+
const axeResult = await page.evaluate((opts) => {
|
|
83
|
+
return window.axe.run(document, opts);
|
|
84
|
+
}, runOptions);
|
|
85
|
+
const violations = axeResult.violations.map((v) => ({
|
|
86
|
+
id: v.id,
|
|
87
|
+
impact: v.impact,
|
|
88
|
+
description: v.description,
|
|
89
|
+
helpUrl: v.helpUrl,
|
|
90
|
+
nodes: v.nodes.length
|
|
91
|
+
}));
|
|
92
|
+
return {
|
|
93
|
+
artPath,
|
|
94
|
+
variantName,
|
|
95
|
+
violations,
|
|
96
|
+
passes: axeResult.passes.length,
|
|
97
|
+
incomplete: axeResult.incomplete.length
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get summary statistics from results.
|
|
102
|
+
*/
|
|
103
|
+
getSummary(results) {
|
|
104
|
+
const components = new Set(results.map((r) => r.artPath));
|
|
105
|
+
const allViolations = results.flatMap((r) => r.violations);
|
|
106
|
+
return {
|
|
107
|
+
totalComponents: components.size,
|
|
108
|
+
totalVariants: results.length,
|
|
109
|
+
totalViolations: allViolations.length,
|
|
110
|
+
criticalCount: allViolations.filter((v) => v.impact === "critical").length,
|
|
111
|
+
seriousCount: allViolations.filter((v) => v.impact === "serious").length,
|
|
112
|
+
moderateCount: allViolations.filter((v) => v.impact === "moderate").length,
|
|
113
|
+
minorCount: allViolations.filter((v) => v.impact === "minor").length
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Generate HTML report.
|
|
118
|
+
*/
|
|
119
|
+
generateHtmlReport(results) {
|
|
120
|
+
const summary = this.getSummary(results);
|
|
121
|
+
const timestamp = new Date().toLocaleString("ja-JP", {
|
|
122
|
+
year: "numeric",
|
|
123
|
+
month: "2-digit",
|
|
124
|
+
day: "2-digit",
|
|
125
|
+
hour: "2-digit",
|
|
126
|
+
minute: "2-digit"
|
|
127
|
+
});
|
|
128
|
+
const impactColor = (impact) => {
|
|
129
|
+
switch (impact) {
|
|
130
|
+
case "critical": return "#f87171";
|
|
131
|
+
case "serious": return "#fb923c";
|
|
132
|
+
case "moderate": return "#fbbf24";
|
|
133
|
+
case "minor": return "#60a5fa";
|
|
134
|
+
default: return "#7b8494";
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
const resultItems = results.filter((r) => r.violations.length > 0).map((r) => {
|
|
138
|
+
const artName = path.basename(r.artPath, ".art.vue");
|
|
139
|
+
const violationRows = r.violations.map((v) => `
|
|
140
|
+
<tr>
|
|
141
|
+
<td><span style="color:${impactColor(v.impact)};font-weight:600;text-transform:uppercase;font-size:0.6875rem">${escapeHtml(v.impact)}</span></td>
|
|
142
|
+
<td><code>${escapeHtml(v.id)}</code></td>
|
|
143
|
+
<td>${escapeHtml(v.description)}</td>
|
|
144
|
+
<td>${v.nodes}</td>
|
|
145
|
+
<td>${v.helpUrl ? `<a href="${escapeHtml(v.helpUrl)}" target="_blank" style="color:#60a5fa">docs</a>` : ""}</td>
|
|
146
|
+
</tr>`).join("");
|
|
147
|
+
return `
|
|
148
|
+
<div class="result">
|
|
149
|
+
<div class="result-header">
|
|
150
|
+
<div class="result-info">
|
|
151
|
+
<span class="result-name">${escapeHtml(artName)} / ${escapeHtml(r.variantName)}</span>
|
|
152
|
+
<span class="result-count">${r.violations.length} violation(s)</span>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
<table class="violations-table">
|
|
156
|
+
<thead><tr><th>Impact</th><th>Rule</th><th>Description</th><th>Nodes</th><th>Help</th></tr></thead>
|
|
157
|
+
<tbody>${violationRows}</tbody>
|
|
158
|
+
</table>
|
|
159
|
+
</div>`;
|
|
160
|
+
}).join("");
|
|
161
|
+
return `<!DOCTYPE html>
|
|
162
|
+
<html lang="en">
|
|
163
|
+
<head>
|
|
164
|
+
<meta charset="UTF-8">
|
|
165
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
166
|
+
<title>A11y Report - Musea</title>
|
|
167
|
+
<style>
|
|
168
|
+
:root {
|
|
169
|
+
--musea-bg-primary: #0d0d0d;
|
|
170
|
+
--musea-bg-secondary: #1a1815;
|
|
171
|
+
--musea-bg-tertiary: #252220;
|
|
172
|
+
--musea-accent: #a34828;
|
|
173
|
+
--musea-text: #e6e9f0;
|
|
174
|
+
--musea-text-muted: #7b8494;
|
|
175
|
+
--musea-border: #3a3530;
|
|
176
|
+
}
|
|
177
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
178
|
+
body {
|
|
179
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
180
|
+
background: var(--musea-bg-primary);
|
|
181
|
+
color: var(--musea-text);
|
|
182
|
+
min-height: 100vh;
|
|
183
|
+
line-height: 1.5;
|
|
184
|
+
}
|
|
185
|
+
.header {
|
|
186
|
+
background: var(--musea-bg-secondary);
|
|
187
|
+
border-bottom: 1px solid var(--musea-border);
|
|
188
|
+
padding: 1rem 2rem;
|
|
189
|
+
display: flex;
|
|
190
|
+
align-items: center;
|
|
191
|
+
justify-content: space-between;
|
|
192
|
+
}
|
|
193
|
+
.logo { font-size: 1.25rem; font-weight: 700; color: var(--musea-accent); }
|
|
194
|
+
.header-meta { color: var(--musea-text-muted); font-size: 0.8125rem; }
|
|
195
|
+
.main { max-width: 1200px; margin: 0 auto; padding: 2rem; }
|
|
196
|
+
.summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 1rem; margin-bottom: 2rem; }
|
|
197
|
+
.stat { background: var(--musea-bg-secondary); border: 1px solid var(--musea-border); border-radius: 8px; padding: 1rem; text-align: center; }
|
|
198
|
+
.stat-value { font-size: 1.75rem; font-weight: 700; font-variant-numeric: tabular-nums; }
|
|
199
|
+
.stat-label { color: var(--musea-text-muted); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; }
|
|
200
|
+
.stat.critical .stat-value { color: #f87171; }
|
|
201
|
+
.stat.serious .stat-value { color: #fb923c; }
|
|
202
|
+
.stat.moderate .stat-value { color: #fbbf24; }
|
|
203
|
+
.stat.minor .stat-value { color: #60a5fa; }
|
|
204
|
+
.stat.total .stat-value { color: var(--musea-text); }
|
|
205
|
+
.results { display: flex; flex-direction: column; gap: 1rem; }
|
|
206
|
+
.result { background: var(--musea-bg-secondary); border: 1px solid var(--musea-border); border-radius: 8px; overflow: hidden; }
|
|
207
|
+
.result-header { padding: 1rem; background: var(--musea-bg-tertiary); display: flex; justify-content: space-between; align-items: center; }
|
|
208
|
+
.result-name { font-weight: 600; }
|
|
209
|
+
.result-count { color: var(--musea-text-muted); font-size: 0.8125rem; }
|
|
210
|
+
.violations-table { width: 100%; border-collapse: collapse; font-size: 0.8125rem; }
|
|
211
|
+
.violations-table th { padding: 0.75rem 1rem; text-align: left; color: var(--musea-text-muted); font-weight: 500; font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.08em; border-bottom: 1px solid var(--musea-border); }
|
|
212
|
+
.violations-table td { padding: 0.75rem 1rem; border-bottom: 1px solid var(--musea-border); }
|
|
213
|
+
.violations-table code { background: var(--musea-bg-tertiary); padding: 0.125rem 0.375rem; border-radius: 3px; font-size: 0.75rem; }
|
|
214
|
+
.all-clear { background: rgba(74, 222, 128, 0.1); border: 1px solid rgba(74, 222, 128, 0.2); border-radius: 8px; padding: 2rem; text-align: center; }
|
|
215
|
+
.all-clear-text { color: #4ade80; font-weight: 600; }
|
|
216
|
+
</style>
|
|
217
|
+
</head>
|
|
218
|
+
<body>
|
|
219
|
+
<header class="header">
|
|
220
|
+
<div><span class="logo">Musea</span> <span style="color:var(--musea-text-muted);font-size:0.875rem;margin-left:1rem">Accessibility Report</span></div>
|
|
221
|
+
<div class="header-meta">${timestamp}</div>
|
|
222
|
+
</header>
|
|
223
|
+
<main class="main">
|
|
224
|
+
<div class="summary">
|
|
225
|
+
<div class="stat total"><div class="stat-value">${summary.totalViolations}</div><div class="stat-label">Violations</div></div>
|
|
226
|
+
<div class="stat critical"><div class="stat-value">${summary.criticalCount}</div><div class="stat-label">Critical</div></div>
|
|
227
|
+
<div class="stat serious"><div class="stat-value">${summary.seriousCount}</div><div class="stat-label">Serious</div></div>
|
|
228
|
+
<div class="stat moderate"><div class="stat-value">${summary.moderateCount}</div><div class="stat-label">Moderate</div></div>
|
|
229
|
+
<div class="stat minor"><div class="stat-value">${summary.minorCount}</div><div class="stat-label">Minor</div></div>
|
|
230
|
+
</div>
|
|
231
|
+
${summary.totalViolations === 0 ? `<div class="all-clear"><div class="all-clear-text">No accessibility violations found across ${summary.totalVariants} variant(s)</div></div>` : `<div class="results">${resultItems}</div>`}
|
|
232
|
+
</main>
|
|
233
|
+
</body>
|
|
234
|
+
</html>`;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Generate JSON report for CI integration.
|
|
238
|
+
*/
|
|
239
|
+
generateJsonReport(results) {
|
|
240
|
+
const summary = this.getSummary(results);
|
|
241
|
+
return JSON.stringify({
|
|
242
|
+
timestamp: new Date().toISOString(),
|
|
243
|
+
summary,
|
|
244
|
+
results: results.map((r) => ({
|
|
245
|
+
art: path.basename(r.artPath, ".art.vue"),
|
|
246
|
+
variant: r.variantName,
|
|
247
|
+
violations: r.violations,
|
|
248
|
+
passes: r.passes,
|
|
249
|
+
incomplete: r.incomplete
|
|
250
|
+
}))
|
|
251
|
+
}, null, 2);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Get axe-core source code for injection.
|
|
255
|
+
*/
|
|
256
|
+
async getAxeSource() {
|
|
257
|
+
try {
|
|
258
|
+
const axeCore = await import("axe-core");
|
|
259
|
+
return axeCore.source;
|
|
260
|
+
} catch {
|
|
261
|
+
throw new Error("axe-core is not installed. Install it as a peer dependency: npm install axe-core");
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Build axe-core run options from configuration.
|
|
266
|
+
*/
|
|
267
|
+
buildAxeOptions() {
|
|
268
|
+
const runOnly = {};
|
|
269
|
+
const tags = [];
|
|
270
|
+
switch (this.options.level) {
|
|
271
|
+
case "A":
|
|
272
|
+
tags.push("wcag2a", "wcag21a");
|
|
273
|
+
break;
|
|
274
|
+
case "AA":
|
|
275
|
+
tags.push("wcag2a", "wcag2aa", "wcag21a", "wcag21aa", "wcag22aa");
|
|
276
|
+
break;
|
|
277
|
+
case "AAA":
|
|
278
|
+
tags.push("wcag2a", "wcag2aa", "wcag2aaa", "wcag21a", "wcag21aa", "wcag22aa");
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
if (tags.length > 0) {
|
|
282
|
+
runOnly.type = "tag";
|
|
283
|
+
runOnly.values = tags;
|
|
284
|
+
}
|
|
285
|
+
const rules = {};
|
|
286
|
+
for (const ruleId of this.options.includeRules) rules[ruleId] = { enabled: true };
|
|
287
|
+
for (const ruleId of this.options.excludeRules) rules[ruleId] = { enabled: false };
|
|
288
|
+
return {
|
|
289
|
+
...Object.keys(runOnly).length > 0 ? { runOnly } : {},
|
|
290
|
+
...Object.keys(rules).length > 0 ? { rules } : {}
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
buildVariantUrl(baseUrl, artPath, variantName) {
|
|
294
|
+
const encodedPath = encodeURIComponent(artPath);
|
|
295
|
+
const encodedVariant = encodeURIComponent(variantName);
|
|
296
|
+
return `${baseUrl}/__musea__/preview?art=${encodedPath}&variant=${encodedVariant}`;
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
function escapeHtml(str) {
|
|
300
|
+
return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
//#endregion
|
|
304
|
+
export { MuseaA11yRunner };
|
|
305
|
+
//# sourceMappingURL=a11y-C6xqILwZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y-C6xqILwZ.js","names":["options: A11yOptions","artFiles: ArtFileInfo[]","baseUrl: string","vrtRunner?: MuseaVrtRunner","results: A11yResult[]","defaultViewport: ViewportConfig","page: Page | null","context: { page: Page; context: { close(): Promise<void> } } | null","page: Page","artPath: string","variantName: string","violations: A11yViolation[]","impact: string","runOnly: Record<string, unknown>","tags: string[]","rules: Record<string, { enabled: boolean }>","str: string"],"sources":["../src/a11y.ts"],"sourcesContent":["/**\n * Accessibility (a11y) testing module for Musea.\n * Uses axe-core for automated accessibility auditing via Playwright.\n */\n\nimport type { Page } from \"playwright\";\nimport type {\n ArtFileInfo,\n A11yResult,\n A11yViolation,\n A11yOptions,\n ViewportConfig,\n} from \"./types.js\";\nimport type { MuseaVrtRunner } from \"./vrt.js\";\nimport path from \"node:path\";\n\n/**\n * A11y audit summary.\n */\nexport interface A11ySummary {\n totalComponents: number;\n totalVariants: number;\n totalViolations: number;\n criticalCount: number;\n seriousCount: number;\n moderateCount: number;\n minorCount: number;\n}\n\n/**\n * axe-core result shape (subset).\n */\ninterface AxeResult {\n violations: Array<{\n id: string;\n impact: string;\n description: string;\n helpUrl: string;\n nodes: Array<unknown>;\n }>;\n passes: Array<unknown>;\n incomplete: Array<unknown>;\n}\n\n/**\n * A11y runner using axe-core via Playwright.\n */\nexport class MuseaA11yRunner {\n private options: Required<A11yOptions>;\n\n constructor(options: A11yOptions = {}) {\n this.options = {\n enabled: options.enabled ?? true,\n includeRules: options.includeRules ?? [],\n excludeRules: options.excludeRules ?? [],\n level: options.level ?? \"AA\",\n };\n }\n\n /**\n * Run a11y audits on all art file variants.\n * Reuses VRT runner's browser if available.\n */\n async runAudits(\n artFiles: ArtFileInfo[],\n baseUrl: string,\n vrtRunner?: MuseaVrtRunner,\n ): Promise<A11yResult[]> {\n const results: A11yResult[] = [];\n const defaultViewport: ViewportConfig = { width: 1280, height: 720, name: \"desktop\" };\n\n for (const art of artFiles) {\n for (const variant of art.variants) {\n if (variant.skipVrt) continue;\n\n let page: Page | null = null;\n let context: { page: Page; context: { close(): Promise<void> } } | null = null;\n\n try {\n if (vrtRunner) {\n context = await vrtRunner.createPage(defaultViewport);\n page = context.page;\n } else {\n // Standalone mode: launch own browser\n const { chromium } = await import(\"playwright\");\n const browser = await chromium.launch({ headless: true });\n const ctx = await browser.newContext({\n viewport: { width: defaultViewport.width, height: defaultViewport.height },\n });\n page = await ctx.newPage();\n context = { page, context: ctx };\n }\n\n const variantUrl = this.buildVariantUrl(baseUrl, art.path, variant.name);\n await page.goto(variantUrl, { waitUntil: \"networkidle\" });\n await page.waitForSelector(\".musea-variant\", { timeout: 10000 });\n await page.waitForTimeout(200);\n\n const result = await this.auditPage(page, art.path, variant.name);\n results.push(result);\n } catch (error) {\n results.push({\n artPath: art.path,\n variantName: variant.name,\n violations: [\n {\n id: \"audit-error\",\n impact: \"critical\",\n description: `Audit failed: ${error instanceof Error ? error.message : String(error)}`,\n helpUrl: \"\",\n nodes: 0,\n },\n ],\n passes: 0,\n incomplete: 0,\n });\n } finally {\n if (context) {\n await context.context.close();\n }\n }\n }\n }\n\n return results;\n }\n\n /**\n * Audit a single page using axe-core.\n */\n async auditPage(page: Page, artPath: string, variantName: string): Promise<A11yResult> {\n // Inject axe-core into the page\n const axeSource = await this.getAxeSource();\n await page.evaluate(axeSource);\n\n // Build axe-core run options\n const runOptions = this.buildAxeOptions();\n\n // Run axe-core\n const axeResult = (await page.evaluate((opts) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (window as any).axe.run(document, opts);\n }, runOptions)) as AxeResult;\n\n // Map to our result format\n const violations: A11yViolation[] = axeResult.violations.map((v) => ({\n id: v.id,\n impact: v.impact as A11yViolation[\"impact\"],\n description: v.description,\n helpUrl: v.helpUrl,\n nodes: v.nodes.length,\n }));\n\n return {\n artPath,\n variantName,\n violations,\n passes: axeResult.passes.length,\n incomplete: axeResult.incomplete.length,\n };\n }\n\n /**\n * Get summary statistics from results.\n */\n getSummary(results: A11yResult[]): A11ySummary {\n const components = new Set(results.map((r) => r.artPath));\n const allViolations = results.flatMap((r) => r.violations);\n\n return {\n totalComponents: components.size,\n totalVariants: results.length,\n totalViolations: allViolations.length,\n criticalCount: allViolations.filter((v) => v.impact === \"critical\").length,\n seriousCount: allViolations.filter((v) => v.impact === \"serious\").length,\n moderateCount: allViolations.filter((v) => v.impact === \"moderate\").length,\n minorCount: allViolations.filter((v) => v.impact === \"minor\").length,\n };\n }\n\n /**\n * Generate HTML report.\n */\n generateHtmlReport(results: A11yResult[]): string {\n const summary = this.getSummary(results);\n const timestamp = new Date().toLocaleString(\"ja-JP\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n const impactColor = (impact: string): string => {\n switch (impact) {\n case \"critical\":\n return \"#f87171\";\n case \"serious\":\n return \"#fb923c\";\n case \"moderate\":\n return \"#fbbf24\";\n case \"minor\":\n return \"#60a5fa\";\n default:\n return \"#7b8494\";\n }\n };\n\n const resultItems = results\n .filter((r) => r.violations.length > 0)\n .map((r) => {\n const artName = path.basename(r.artPath, \".art.vue\");\n const violationRows = r.violations\n .map(\n (v) => `\n <tr>\n <td><span style=\"color:${impactColor(v.impact)};font-weight:600;text-transform:uppercase;font-size:0.6875rem\">${escapeHtml(v.impact)}</span></td>\n <td><code>${escapeHtml(v.id)}</code></td>\n <td>${escapeHtml(v.description)}</td>\n <td>${v.nodes}</td>\n <td>${v.helpUrl ? `<a href=\"${escapeHtml(v.helpUrl)}\" target=\"_blank\" style=\"color:#60a5fa\">docs</a>` : \"\"}</td>\n </tr>`,\n )\n .join(\"\");\n\n return `\n <div class=\"result\">\n <div class=\"result-header\">\n <div class=\"result-info\">\n <span class=\"result-name\">${escapeHtml(artName)} / ${escapeHtml(r.variantName)}</span>\n <span class=\"result-count\">${r.violations.length} violation(s)</span>\n </div>\n </div>\n <table class=\"violations-table\">\n <thead><tr><th>Impact</th><th>Rule</th><th>Description</th><th>Nodes</th><th>Help</th></tr></thead>\n <tbody>${violationRows}</tbody>\n </table>\n </div>`;\n })\n .join(\"\");\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.0\">\n <title>A11y Report - Musea</title>\n <style>\n :root {\n --musea-bg-primary: #0d0d0d;\n --musea-bg-secondary: #1a1815;\n --musea-bg-tertiary: #252220;\n --musea-accent: #a34828;\n --musea-text: #e6e9f0;\n --musea-text-muted: #7b8494;\n --musea-border: #3a3530;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n background: var(--musea-bg-primary);\n color: var(--musea-text);\n min-height: 100vh;\n line-height: 1.5;\n }\n .header {\n background: var(--musea-bg-secondary);\n border-bottom: 1px solid var(--musea-border);\n padding: 1rem 2rem;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .logo { font-size: 1.25rem; font-weight: 700; color: var(--musea-accent); }\n .header-meta { color: var(--musea-text-muted); font-size: 0.8125rem; }\n .main { max-width: 1200px; margin: 0 auto; padding: 2rem; }\n .summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 1rem; margin-bottom: 2rem; }\n .stat { background: var(--musea-bg-secondary); border: 1px solid var(--musea-border); border-radius: 8px; padding: 1rem; text-align: center; }\n .stat-value { font-size: 1.75rem; font-weight: 700; font-variant-numeric: tabular-nums; }\n .stat-label { color: var(--musea-text-muted); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; }\n .stat.critical .stat-value { color: #f87171; }\n .stat.serious .stat-value { color: #fb923c; }\n .stat.moderate .stat-value { color: #fbbf24; }\n .stat.minor .stat-value { color: #60a5fa; }\n .stat.total .stat-value { color: var(--musea-text); }\n .results { display: flex; flex-direction: column; gap: 1rem; }\n .result { background: var(--musea-bg-secondary); border: 1px solid var(--musea-border); border-radius: 8px; overflow: hidden; }\n .result-header { padding: 1rem; background: var(--musea-bg-tertiary); display: flex; justify-content: space-between; align-items: center; }\n .result-name { font-weight: 600; }\n .result-count { color: var(--musea-text-muted); font-size: 0.8125rem; }\n .violations-table { width: 100%; border-collapse: collapse; font-size: 0.8125rem; }\n .violations-table th { padding: 0.75rem 1rem; text-align: left; color: var(--musea-text-muted); font-weight: 500; font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.08em; border-bottom: 1px solid var(--musea-border); }\n .violations-table td { padding: 0.75rem 1rem; border-bottom: 1px solid var(--musea-border); }\n .violations-table code { background: var(--musea-bg-tertiary); padding: 0.125rem 0.375rem; border-radius: 3px; font-size: 0.75rem; }\n .all-clear { background: rgba(74, 222, 128, 0.1); border: 1px solid rgba(74, 222, 128, 0.2); border-radius: 8px; padding: 2rem; text-align: center; }\n .all-clear-text { color: #4ade80; font-weight: 600; }\n </style>\n</head>\n<body>\n <header class=\"header\">\n <div><span class=\"logo\">Musea</span> <span style=\"color:var(--musea-text-muted);font-size:0.875rem;margin-left:1rem\">Accessibility Report</span></div>\n <div class=\"header-meta\">${timestamp}</div>\n </header>\n <main class=\"main\">\n <div class=\"summary\">\n <div class=\"stat total\"><div class=\"stat-value\">${summary.totalViolations}</div><div class=\"stat-label\">Violations</div></div>\n <div class=\"stat critical\"><div class=\"stat-value\">${summary.criticalCount}</div><div class=\"stat-label\">Critical</div></div>\n <div class=\"stat serious\"><div class=\"stat-value\">${summary.seriousCount}</div><div class=\"stat-label\">Serious</div></div>\n <div class=\"stat moderate\"><div class=\"stat-value\">${summary.moderateCount}</div><div class=\"stat-label\">Moderate</div></div>\n <div class=\"stat minor\"><div class=\"stat-value\">${summary.minorCount}</div><div class=\"stat-label\">Minor</div></div>\n </div>\n ${\n summary.totalViolations === 0\n ? `<div class=\"all-clear\"><div class=\"all-clear-text\">No accessibility violations found across ${summary.totalVariants} variant(s)</div></div>`\n : `<div class=\"results\">${resultItems}</div>`\n }\n </main>\n</body>\n</html>`;\n }\n\n /**\n * Generate JSON report for CI integration.\n */\n generateJsonReport(results: A11yResult[]): string {\n const summary = this.getSummary(results);\n return JSON.stringify(\n {\n timestamp: new Date().toISOString(),\n summary,\n results: results.map((r) => ({\n art: path.basename(r.artPath, \".art.vue\"),\n variant: r.variantName,\n violations: r.violations,\n passes: r.passes,\n incomplete: r.incomplete,\n })),\n },\n null,\n 2,\n );\n }\n\n /**\n * Get axe-core source code for injection.\n */\n private async getAxeSource(): Promise<string> {\n try {\n const axeCore = await import(\"axe-core\");\n return axeCore.source;\n } catch {\n throw new Error(\n \"axe-core is not installed. Install it as a peer dependency: npm install axe-core\",\n );\n }\n }\n\n /**\n * Build axe-core run options from configuration.\n */\n private buildAxeOptions(): Record<string, unknown> {\n const runOnly: Record<string, unknown> = {};\n\n // Set WCAG level\n const tags: string[] = [];\n switch (this.options.level) {\n case \"A\":\n tags.push(\"wcag2a\", \"wcag21a\");\n break;\n case \"AA\":\n tags.push(\"wcag2a\", \"wcag2aa\", \"wcag21a\", \"wcag21aa\", \"wcag22aa\");\n break;\n case \"AAA\":\n tags.push(\"wcag2a\", \"wcag2aa\", \"wcag2aaa\", \"wcag21a\", \"wcag21aa\", \"wcag22aa\");\n break;\n }\n\n if (tags.length > 0) {\n runOnly.type = \"tag\";\n runOnly.values = tags;\n }\n\n const rules: Record<string, { enabled: boolean }> = {};\n\n for (const ruleId of this.options.includeRules) {\n rules[ruleId] = { enabled: true };\n }\n for (const ruleId of this.options.excludeRules) {\n rules[ruleId] = { enabled: false };\n }\n\n return {\n ...(Object.keys(runOnly).length > 0 ? { runOnly } : {}),\n ...(Object.keys(rules).length > 0 ? { rules } : {}),\n };\n }\n\n private buildVariantUrl(baseUrl: string, artPath: string, variantName: string): string {\n const encodedPath = encodeURIComponent(artPath);\n const encodedVariant = encodeURIComponent(variantName);\n return `${baseUrl}/__musea__/preview?art=${encodedPath}&variant=${encodedVariant}`;\n }\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n"],"mappings":"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"}
|
package/dist/a11y.d.ts
ADDED
package/dist/a11y.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
//#region src/autogen.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Variant auto-generation module.
|
|
4
|
+
* Generates .art.vue files from component prop analysis.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Autogen configuration options.
|
|
8
|
+
*/
|
|
9
|
+
interface AutogenOptions {
|
|
10
|
+
/** Maximum number of variants to generate (default: 20) */
|
|
11
|
+
maxVariants?: number;
|
|
12
|
+
/** Include a "Default" variant with all default values (default: true) */
|
|
13
|
+
includeDefault?: boolean;
|
|
14
|
+
/** Include boolean toggle variants (default: true) */
|
|
15
|
+
includeBooleanToggles?: boolean;
|
|
16
|
+
/** Include enum/union variants (default: true) */
|
|
17
|
+
includeEnumVariants?: boolean;
|
|
18
|
+
/** Include boundary value variants for numbers (default: false) */
|
|
19
|
+
includeBoundaryValues?: boolean;
|
|
20
|
+
/** Include empty string variants for optional strings (default: false) */
|
|
21
|
+
includeEmptyStrings?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Prop definition for variant generation.
|
|
25
|
+
*/
|
|
26
|
+
interface PropDefinition {
|
|
27
|
+
name: string;
|
|
28
|
+
propType: string;
|
|
29
|
+
required: boolean;
|
|
30
|
+
defaultValue?: unknown;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Generated variant.
|
|
34
|
+
*/
|
|
35
|
+
interface GeneratedVariant {
|
|
36
|
+
name: string;
|
|
37
|
+
isDefault: boolean;
|
|
38
|
+
props: Record<string, unknown>;
|
|
39
|
+
description?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Autogen output.
|
|
43
|
+
*/
|
|
44
|
+
interface AutogenOutput {
|
|
45
|
+
variants: GeneratedVariant[];
|
|
46
|
+
artFileContent: string;
|
|
47
|
+
componentName: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generate .art.vue file for a component.
|
|
51
|
+
*
|
|
52
|
+
* @param componentPath - Path to the Vue component file
|
|
53
|
+
* @param options - Auto-generation options
|
|
54
|
+
* @returns Generated .art.vue content and metadata
|
|
55
|
+
*/
|
|
56
|
+
declare function generateArtFile(componentPath: string, options?: AutogenOptions): Promise<AutogenOutput>;
|
|
57
|
+
/**
|
|
58
|
+
* Write generated .art.vue file to disk.
|
|
59
|
+
*/
|
|
60
|
+
declare function writeArtFile(componentPath: string, options?: AutogenOptions, outputPath?: string): Promise<string>; //#endregion
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=autogen.d.ts.map
|
|
63
|
+
export { AutogenOptions, AutogenOutput, GeneratedVariant, PropDefinition, generateArtFile as generateArtFile$1, writeArtFile as writeArtFile$1 };
|
|
64
|
+
//# sourceMappingURL=autogen-D3Zjc3zI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autogen-D3Zjc3zI.d.ts","names":[],"sources":["../src/autogen.ts"],"sourcesContent":null,"mappings":";;;;;;;;UAYiB,cAAA;EAAA;;;;EAkBA;;;;EAUA;;;;AAUjB;;;;UApBiB,cAAA;;;;EAqFK,YAAA,CAAA,EAAA,OAAe;;;;;AAG3B,UA9EO,gBAAA,CA8EP;;;SA3ED;EAiJa,WAAA,CAAA,EAAA,MAAY;;;;AAIxB;UA9IO,aAAA;YACL;;;;;;;;;;;iBAgEU,eAAA,kCAEX,iBACR,QAAQ;;;;iBAsEW,YAAA,kCAEX,sCAER"}
|