@mew-lab/a11y-cli 0.1.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 +80 -0
- package/bin/a11y.mjs +27 -0
- package/dist/api.d.ts +50 -0
- package/dist/api.js +17 -0
- package/dist/api.js.map +1 -0
- package/dist/chunk-Y6KJQSVY.js +3514 -0
- package/dist/chunk-Y6KJQSVY.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +393 -0
- package/dist/index.js.map +1 -0
- package/package.json +56 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import {
|
|
2
|
+
checklist,
|
|
3
|
+
humanLog,
|
|
4
|
+
isJsonMode,
|
|
5
|
+
jsonOut,
|
|
6
|
+
patternDetail,
|
|
7
|
+
patternList,
|
|
8
|
+
reportError,
|
|
9
|
+
search,
|
|
10
|
+
setJsonMode,
|
|
11
|
+
wcagDetail,
|
|
12
|
+
wcagList
|
|
13
|
+
} from "./chunk-Y6KJQSVY.js";
|
|
14
|
+
|
|
15
|
+
// src/index.ts
|
|
16
|
+
import { createRequire } from "module";
|
|
17
|
+
import { Command, Option } from "commander";
|
|
18
|
+
import pc2 from "picocolors";
|
|
19
|
+
|
|
20
|
+
// src/format.ts
|
|
21
|
+
import pc from "picocolors";
|
|
22
|
+
var REQUIREMENT_LABEL = {
|
|
23
|
+
required: "\u5FC5\u9808",
|
|
24
|
+
recommended: "\u63A8\u5968",
|
|
25
|
+
optional: "\u4EFB\u610F"
|
|
26
|
+
};
|
|
27
|
+
function displayWidth(s) {
|
|
28
|
+
let w = 0;
|
|
29
|
+
for (const ch of s) {
|
|
30
|
+
const code = ch.codePointAt(0) ?? 0;
|
|
31
|
+
const wide = code >= 4352 && code <= 4447 || code >= 11904 && code <= 42191 || code >= 44032 && code <= 55203 || code >= 63744 && code <= 64255 || code >= 65280 && code <= 65376 || code >= 65504 && code <= 65510 || code >= 131072 && code <= 262141;
|
|
32
|
+
w += wide ? 2 : 1;
|
|
33
|
+
}
|
|
34
|
+
return w;
|
|
35
|
+
}
|
|
36
|
+
function pad(s, width) {
|
|
37
|
+
const diff = width - displayWidth(s);
|
|
38
|
+
return diff > 0 ? s + " ".repeat(diff) : s;
|
|
39
|
+
}
|
|
40
|
+
function table(rows) {
|
|
41
|
+
if (rows.length === 0) return [];
|
|
42
|
+
const cols = Math.max(...rows.map((r) => r.length));
|
|
43
|
+
const widths = [];
|
|
44
|
+
for (let c = 0; c < cols; c++) {
|
|
45
|
+
widths[c] = Math.max(...rows.map((r) => displayWidth(r[c] ?? "")));
|
|
46
|
+
}
|
|
47
|
+
return rows.map(
|
|
48
|
+
(r) => r.map((cell, c) => c === r.length - 1 ? cell : pad(cell ?? "", widths[c] ?? 0)).join(" ").trimEnd()
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
function heading(text) {
|
|
52
|
+
return pc.bold(pc.cyan(text));
|
|
53
|
+
}
|
|
54
|
+
function levelBadge(level) {
|
|
55
|
+
return pc.bgBlue(pc.white(` ${level} `));
|
|
56
|
+
}
|
|
57
|
+
function formatPatternList(data) {
|
|
58
|
+
const out = [];
|
|
59
|
+
out.push(pc.bold(`APG \u30D1\u30BF\u30FC\u30F3\uFF08${data.total}\u4EF6\uFF09`));
|
|
60
|
+
for (const g of data.categories) {
|
|
61
|
+
if (g.items.length === 0) continue;
|
|
62
|
+
out.push("");
|
|
63
|
+
out.push(heading(`\u25A0 ${g.category}`));
|
|
64
|
+
for (const line of table(g.items.map((p) => [` ${pc.green(p.slug)}`, p.ja]))) {
|
|
65
|
+
out.push(line);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
out.push("");
|
|
69
|
+
out.push(pc.dim("\u8A73\u7D30: a11y pattern <slug>"));
|
|
70
|
+
return out.join("\n");
|
|
71
|
+
}
|
|
72
|
+
function formatPatternDetail(d) {
|
|
73
|
+
const out = [];
|
|
74
|
+
out.push(`${pc.bold(d.ja)} ${pc.dim(`(${d.en})`)} ${pc.green(d.slug)}`);
|
|
75
|
+
out.push(pc.dim(`\u30AB\u30C6\u30B4\u30EA: ${d.category}`));
|
|
76
|
+
out.push("");
|
|
77
|
+
out.push(d.summary);
|
|
78
|
+
const vp = d.viewpoint;
|
|
79
|
+
if (vp) {
|
|
80
|
+
if (vp.keyboard.length > 0) {
|
|
81
|
+
out.push("");
|
|
82
|
+
out.push(heading("\u30AD\u30FC\u30DC\u30FC\u30C9\u64CD\u4F5C"));
|
|
83
|
+
for (const line of table(
|
|
84
|
+
vp.keyboard.map((r) => [` ${r.keys}`, r.action, pc.dim(REQUIREMENT_LABEL[r.requirement])])
|
|
85
|
+
)) {
|
|
86
|
+
out.push(line);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (vp.aria.length > 0) {
|
|
90
|
+
out.push("");
|
|
91
|
+
out.push(heading("\u5FC5\u8981\u306A WAI-ARIA / \u30ED\u30FC\u30EB"));
|
|
92
|
+
for (const line of table(
|
|
93
|
+
vp.aria.map((r) => [` ${r.target}`, pc.yellow(r.attr), r.meaning])
|
|
94
|
+
)) {
|
|
95
|
+
out.push(line);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (vp.antipatterns.length > 0) {
|
|
99
|
+
out.push("");
|
|
100
|
+
out.push(heading("\u30A2\u30F3\u30C1\u30D1\u30BF\u30FC\u30F3"));
|
|
101
|
+
for (const a of vp.antipatterns) {
|
|
102
|
+
out.push(` ${pc.red("\u2717")} ${pc.bold(a.title)}`);
|
|
103
|
+
out.push(` ${pc.dim(a.why)}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (vp.checklist.length > 0) {
|
|
107
|
+
out.push("");
|
|
108
|
+
out.push(heading("\u5B9F\u88C5\u30C1\u30A7\u30C3\u30AF\u30EA\u30B9\u30C8"));
|
|
109
|
+
for (const item of vp.checklist) {
|
|
110
|
+
out.push(` ${pc.green("\u2610")} ${item}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (vp.notes && vp.notes.length > 0) {
|
|
114
|
+
out.push("");
|
|
115
|
+
out.push(heading("\u30E1\u30E2"));
|
|
116
|
+
for (const note of vp.notes) {
|
|
117
|
+
out.push(` - ${note}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
out.push("");
|
|
122
|
+
out.push(pc.dim("\uFF08\u3053\u306E\u30D1\u30BF\u30FC\u30F3\u306E\u69CB\u9020\u5316\u89B3\u70B9\u30C7\u30FC\u30BF\u306F\u6E96\u5099\u4E2D\u3067\u3059\uFF09"));
|
|
123
|
+
}
|
|
124
|
+
if (d.criteria.length > 0) {
|
|
125
|
+
out.push("");
|
|
126
|
+
out.push(heading("\u95A2\u9023\u3059\u308B WCAG 2.2 \u9054\u6210\u57FA\u6E96"));
|
|
127
|
+
for (const c of d.criteria) {
|
|
128
|
+
out.push(` ${levelBadge(c.level)} ${pc.green(c.slug)} ${c.num} ${c.ja}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return out.join("\n");
|
|
132
|
+
}
|
|
133
|
+
function formatWcagList(data) {
|
|
134
|
+
const out = [];
|
|
135
|
+
out.push(pc.bold(`WCAG 2.2 \u9054\u6210\u57FA\u6E96\uFF08${data.total}\u4EF6\u30FB\u672C\u30B5\u30A4\u30C8\u53CE\u9332\u5206\uFF09`));
|
|
136
|
+
for (const g of data.principles) {
|
|
137
|
+
if (g.items.length === 0) continue;
|
|
138
|
+
out.push("");
|
|
139
|
+
out.push(heading(`\u25A0 ${g.principle}`));
|
|
140
|
+
for (const line of table(
|
|
141
|
+
g.items.map((c) => [` ${pc.green(c.slug)}`, `${c.num} ${c.ja}`, levelBadge(c.level)])
|
|
142
|
+
)) {
|
|
143
|
+
out.push(line);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
out.push("");
|
|
147
|
+
out.push(pc.dim("\u8A73\u7D30: a11y wcag <slug>"));
|
|
148
|
+
return out.join("\n");
|
|
149
|
+
}
|
|
150
|
+
function formatWcagDetail(d) {
|
|
151
|
+
const out = [];
|
|
152
|
+
const isNew = d.isNew22 ? ` ${pc.bgGreen(pc.black(" 2.2 \u65B0\u8A2D "))}` : "";
|
|
153
|
+
out.push(`${levelBadge(d.level)} ${pc.bold(`${d.num} ${d.ja}`)} ${pc.dim(`(${d.en})`)}${isNew}`);
|
|
154
|
+
out.push(pc.dim(`${d.principle} / ${d.guideline} ${pc.green(d.slug)}`));
|
|
155
|
+
out.push("");
|
|
156
|
+
out.push(d.summary);
|
|
157
|
+
out.push("");
|
|
158
|
+
out.push(heading("\u53C2\u7167"));
|
|
159
|
+
out.push(` \u898F\u7BC4\u8A33(waic.jp): ${pc.underline(d.waicUrl)}`);
|
|
160
|
+
out.push(` Understanding : ${pc.underline(d.understandingUrl)}`);
|
|
161
|
+
if (d.relatedPatterns.length > 0) {
|
|
162
|
+
out.push("");
|
|
163
|
+
out.push(heading("\u95A2\u9023\u3059\u308B APG \u30D1\u30BF\u30FC\u30F3"));
|
|
164
|
+
for (const line of table(
|
|
165
|
+
d.relatedPatterns.map((p) => [` ${pc.green(p.slug)}`, p.ja])
|
|
166
|
+
)) {
|
|
167
|
+
out.push(line);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return out.join("\n");
|
|
171
|
+
}
|
|
172
|
+
function hitLabel(hit) {
|
|
173
|
+
return hit.kind === "pattern" ? pc.blue("[pattern]") : pc.magenta("[wcag]");
|
|
174
|
+
}
|
|
175
|
+
function formatSearch(data) {
|
|
176
|
+
if (data.total === 0) {
|
|
177
|
+
return pc.dim(`\u300C${data.query}\u300D\u306B\u4E00\u81F4\u3059\u308B\u9805\u76EE\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002`);
|
|
178
|
+
}
|
|
179
|
+
const out = [];
|
|
180
|
+
out.push(pc.bold(`\u300C${data.query}\u300D\u306E\u691C\u7D22\u7D50\u679C\uFF08${data.total}\u4EF6\uFF09`));
|
|
181
|
+
out.push("");
|
|
182
|
+
for (const hit of data.hits) {
|
|
183
|
+
out.push(`${hitLabel(hit)} ${pc.green(hit.slug)} ${hit.title}`);
|
|
184
|
+
out.push(` ${pc.dim(hit.subtitle)}`);
|
|
185
|
+
}
|
|
186
|
+
return out.join("\n");
|
|
187
|
+
}
|
|
188
|
+
function formatChecklist(data) {
|
|
189
|
+
const out = [];
|
|
190
|
+
out.push(pc.bold(`${data.ja} \u5B9F\u88C5\u30C1\u30A7\u30C3\u30AF\u30EA\u30B9\u30C8`));
|
|
191
|
+
out.push("");
|
|
192
|
+
if (data.checklist.length === 0) {
|
|
193
|
+
out.push(pc.dim("\uFF08\u30C1\u30A7\u30C3\u30AF\u30EA\u30B9\u30C8\u306F\u6E96\u5099\u4E2D\u3067\u3059\uFF09"));
|
|
194
|
+
} else {
|
|
195
|
+
for (const item of data.checklist) {
|
|
196
|
+
out.push(`${pc.green("\u2610")} ${item}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return out.join("\n");
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// src/index.ts
|
|
203
|
+
var require2 = createRequire(import.meta.url);
|
|
204
|
+
var pkg = require2("../package.json");
|
|
205
|
+
var VERSION = pkg.version;
|
|
206
|
+
function emit(jsonType, data, render) {
|
|
207
|
+
if (isJsonMode()) {
|
|
208
|
+
jsonOut(jsonType, data);
|
|
209
|
+
} else {
|
|
210
|
+
console.log(render());
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function buildProgram() {
|
|
214
|
+
const program = new Command();
|
|
215
|
+
program.name("a11y").description("WAI-ARIA APG / WCAG 2.2 \u306E\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u89B3\u70B9\u3092\u5F15\u304F CLI").version(VERSION, "-v, --version", "\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u8868\u793A").option("--json", "\u578B\u4ED8\u304D JSON \u3067\u51FA\u529B\u3059\u308B\uFF08AI \u30A8\u30FC\u30B8\u30A7\u30F3\u30C8 / \u30B9\u30AF\u30EA\u30D7\u30C8\u5411\u3051\uFF09").addOption(
|
|
216
|
+
new Option("--detail <level>", "\u51FA\u529B\u306E\u8A73\u3057\u3055").choices(["full", "compact", "brief"]).default("full")
|
|
217
|
+
).showHelpAfterError();
|
|
218
|
+
program.hook("preAction", (thisCommand) => {
|
|
219
|
+
const opts = thisCommand.opts();
|
|
220
|
+
setJsonMode(Boolean(opts.json));
|
|
221
|
+
});
|
|
222
|
+
program.command("pattern").argument("[slug]", "\u30D1\u30BF\u30FC\u30F3\u306E slug\uFF08\u7701\u7565\u3059\u308B\u3068\u4E00\u89A7\uFF09").description("APG \u30D1\u30BF\u30FC\u30F3\u306E\u89B3\u70B9\u3092\u8868\u793A\u3059\u308B\uFF08\u7121\u5F15\u6570\u3067\u4E00\u89A7\uFF09").action((slug) => {
|
|
223
|
+
try {
|
|
224
|
+
const detail = program.opts().detail ?? "full";
|
|
225
|
+
if (slug === void 0) {
|
|
226
|
+
const res = patternList();
|
|
227
|
+
emit(res.type, res.data, () => formatPatternList(res.data));
|
|
228
|
+
} else {
|
|
229
|
+
const res = patternDetail(slug);
|
|
230
|
+
emit(
|
|
231
|
+
res.type,
|
|
232
|
+
res.data,
|
|
233
|
+
() => detail === "brief" ? `${res.data.ja} (${res.data.en}) \u2014 ${res.data.slug}` : formatPatternDetail(res.data)
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
} catch (err) {
|
|
237
|
+
reportError(err);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
program.command("wcag").argument("[slug]", "\u9054\u6210\u57FA\u6E96\u306E slug\uFF08\u4F8B: 1-1-1\u3002\u7701\u7565\u3059\u308B\u3068\u4E00\u89A7\uFF09").description("WCAG 2.2 \u9054\u6210\u57FA\u6E96\u3092\u8868\u793A\u3059\u308B\uFF08\u7121\u5F15\u6570\u3067\u4E00\u89A7\uFF09").action((slug) => {
|
|
241
|
+
try {
|
|
242
|
+
const detail = program.opts().detail ?? "full";
|
|
243
|
+
if (slug === void 0) {
|
|
244
|
+
const res = wcagList();
|
|
245
|
+
emit(res.type, res.data, () => formatWcagList(res.data));
|
|
246
|
+
} else {
|
|
247
|
+
const res = wcagDetail(slug);
|
|
248
|
+
emit(
|
|
249
|
+
res.type,
|
|
250
|
+
res.data,
|
|
251
|
+
() => detail === "brief" ? `${res.data.num} ${res.data.ja} (${res.data.en}) \u2014 ${res.data.slug}` : formatWcagDetail(res.data)
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
} catch (err) {
|
|
255
|
+
reportError(err);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
program.command("search").argument("<query>", "\u691C\u7D22\u30AD\u30FC\u30EF\u30FC\u30C9").description("\u30D1\u30BF\u30FC\u30F3 + WCAG \u3092\u6A2A\u65AD\u691C\u7D22\u3059\u308B").action((query) => {
|
|
259
|
+
try {
|
|
260
|
+
const res = search(query);
|
|
261
|
+
emit(res.type, res.data, () => formatSearch(res.data));
|
|
262
|
+
} catch (err) {
|
|
263
|
+
reportError(err);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
program.command("checklist").argument("<slug>", "\u30D1\u30BF\u30FC\u30F3\u306E slug").description("\u30D1\u30BF\u30FC\u30F3\u306E\u5B9F\u88C5\u30C1\u30A7\u30C3\u30AF\u30EA\u30B9\u30C8\u3060\u3051\u3092\u8868\u793A\u3059\u308B").action((slug) => {
|
|
267
|
+
try {
|
|
268
|
+
const res = checklist(slug);
|
|
269
|
+
emit(res.type, res.data, () => formatChecklist(res.data));
|
|
270
|
+
} catch (err) {
|
|
271
|
+
reportError(err);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
program.command("manifest").description("\u5168\u30B3\u30DE\u30F3\u30C9/\u30EC\u30B9\u30DD\u30F3\u30B9\u578B\u306E\u69CB\u9020\u5316 manifest \u3092\u51FA\u529B\u3059\u308B\uFF08AI \u5411\u3051\uFF09").action(() => {
|
|
275
|
+
try {
|
|
276
|
+
const data = buildManifest();
|
|
277
|
+
emit("manifest", data, () => formatManifest(data));
|
|
278
|
+
} catch (err) {
|
|
279
|
+
reportError(err);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
program.command("doctor").description("\u5B9F\u884C\u74B0\u5883\u3092\u8A3A\u65AD\u3059\u308B").action(() => {
|
|
283
|
+
try {
|
|
284
|
+
const data = buildDoctor();
|
|
285
|
+
emit("doctor", data, () => formatDoctor(data));
|
|
286
|
+
} catch (err) {
|
|
287
|
+
reportError(err);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
return program;
|
|
291
|
+
}
|
|
292
|
+
function buildManifest() {
|
|
293
|
+
return {
|
|
294
|
+
name: "a11y",
|
|
295
|
+
version: VERSION,
|
|
296
|
+
globalOptions: [
|
|
297
|
+
{ flag: "--json", description: "\u578B\u4ED8\u304D JSON \u3067\u51FA\u529B\u3059\u308B" },
|
|
298
|
+
{ flag: "--detail <full|compact|brief>", description: "\u51FA\u529B\u306E\u8A73\u3057\u3055" }
|
|
299
|
+
],
|
|
300
|
+
commands: [
|
|
301
|
+
{
|
|
302
|
+
name: "pattern",
|
|
303
|
+
description: "APG \u30D1\u30BF\u30FC\u30F3\u306E\u89B3\u70B9\u3092\u8868\u793A\uFF08\u7121\u5F15\u6570\u3067\u4E00\u89A7\uFF09",
|
|
304
|
+
args: [{ name: "slug", required: false }],
|
|
305
|
+
json: true,
|
|
306
|
+
responseTypes: ["pattern.list", "pattern.detail"]
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
name: "wcag",
|
|
310
|
+
description: "WCAG 2.2 \u9054\u6210\u57FA\u6E96\u3092\u8868\u793A\uFF08\u7121\u5F15\u6570\u3067\u4E00\u89A7\uFF09",
|
|
311
|
+
args: [{ name: "slug", required: false }],
|
|
312
|
+
json: true,
|
|
313
|
+
responseTypes: ["wcag.list", "wcag.detail"]
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
name: "search",
|
|
317
|
+
description: "\u30D1\u30BF\u30FC\u30F3 + WCAG \u3092\u6A2A\u65AD\u691C\u7D22",
|
|
318
|
+
args: [{ name: "query", required: true }],
|
|
319
|
+
json: true,
|
|
320
|
+
responseTypes: ["search.results"]
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
name: "checklist",
|
|
324
|
+
description: "\u30D1\u30BF\u30FC\u30F3\u306E\u5B9F\u88C5\u30C1\u30A7\u30C3\u30AF\u30EA\u30B9\u30C8\u3092\u8868\u793A",
|
|
325
|
+
args: [{ name: "slug", required: true }],
|
|
326
|
+
json: true,
|
|
327
|
+
responseTypes: ["pattern.checklist"]
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
name: "manifest",
|
|
331
|
+
description: "\u69CB\u9020\u5316 manifest \u3092\u51FA\u529B",
|
|
332
|
+
args: [],
|
|
333
|
+
json: true,
|
|
334
|
+
responseTypes: ["manifest"]
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
name: "doctor",
|
|
338
|
+
description: "\u5B9F\u884C\u74B0\u5883\u3092\u8A3A\u65AD",
|
|
339
|
+
args: [],
|
|
340
|
+
json: true,
|
|
341
|
+
responseTypes: ["doctor"]
|
|
342
|
+
}
|
|
343
|
+
]
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
function formatManifest(data) {
|
|
347
|
+
const out = [];
|
|
348
|
+
out.push(pc2.bold(`${data.name} v${data.version}`));
|
|
349
|
+
out.push("");
|
|
350
|
+
out.push(pc2.cyan("\u30B3\u30DE\u30F3\u30C9:"));
|
|
351
|
+
for (const c of data.commands) {
|
|
352
|
+
const args = c.args.map((a) => a.required ? `<${a.name}>` : `[${a.name}]`).join(" ");
|
|
353
|
+
out.push(` ${pc2.green(c.name)} ${args}`);
|
|
354
|
+
out.push(` ${pc2.dim(c.description)}`);
|
|
355
|
+
out.push(` ${pc2.dim(`type: ${c.responseTypes.join(", ")}`)}`);
|
|
356
|
+
}
|
|
357
|
+
out.push("");
|
|
358
|
+
out.push(pc2.dim("\u69CB\u9020\u5316\u30C7\u30FC\u30BF\u306F `a11y manifest --json` \u3067\u53D6\u5F97\u3067\u304D\u307E\u3059\u3002"));
|
|
359
|
+
return out.join("\n");
|
|
360
|
+
}
|
|
361
|
+
function buildDoctor() {
|
|
362
|
+
const [major] = process.versions.node.split(".").map((n) => Number.parseInt(n, 10));
|
|
363
|
+
return {
|
|
364
|
+
cliVersion: VERSION,
|
|
365
|
+
node: process.versions.node,
|
|
366
|
+
nodeSupported: (major ?? 0) >= 18,
|
|
367
|
+
platform: process.platform,
|
|
368
|
+
arch: process.arch
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
function formatDoctor(data) {
|
|
372
|
+
const ok = data.nodeSupported ? pc2.green("OK") : pc2.red("\u8981\u66F4\u65B0 (Node 18+ \u304C\u5FC5\u8981)");
|
|
373
|
+
return [
|
|
374
|
+
pc2.bold("a11y doctor"),
|
|
375
|
+
` CLI \u30D0\u30FC\u30B8\u30E7\u30F3 : ${data.cliVersion}`,
|
|
376
|
+
` Node.js : ${data.node} ${ok}`,
|
|
377
|
+
` \u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0: ${data.platform} / ${data.arch}`
|
|
378
|
+
].join("\n");
|
|
379
|
+
}
|
|
380
|
+
async function run(argv) {
|
|
381
|
+
const program = buildProgram();
|
|
382
|
+
if (argv.length <= 2) {
|
|
383
|
+
humanLog(program.helpInformation());
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
await program.parseAsync(argv);
|
|
387
|
+
}
|
|
388
|
+
export {
|
|
389
|
+
VERSION,
|
|
390
|
+
buildProgram,
|
|
391
|
+
run
|
|
392
|
+
};
|
|
393
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/format.ts"],"sourcesContent":["// CLI 本体。bin/a11y.mjs から run(process.argv) で起動される。\nimport { createRequire } from 'node:module';\nimport { Command, Option } from 'commander';\nimport pc from 'picocolors';\nimport {\n checklist as apiChecklist,\n patternDetail,\n patternList,\n search as apiSearch,\n wcagDetail,\n wcagList,\n} from './api';\nimport {\n formatChecklist,\n formatPatternDetail,\n formatPatternList,\n formatSearch,\n formatWcagDetail,\n formatWcagList,\n} from './format';\nimport { isJsonMode, jsonOut, humanLog, reportError, setJsonMode } from './output';\n\nconst require = createRequire(import.meta.url);\nconst pkg = require('../package.json') as { version: string };\nexport const VERSION = pkg.version;\n\ntype DetailLevel = 'full' | 'compact' | 'brief';\n\ninterface GlobalOpts {\n json?: boolean;\n detail?: DetailLevel;\n}\n\n/** human モードのときだけ整形文字列を出す。 */\nfunction emit(jsonType: string, data: unknown, render: () => string): void {\n if (isJsonMode()) {\n jsonOut(jsonType, data);\n } else {\n console.log(render());\n }\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n\n program\n .name('a11y')\n .description('WAI-ARIA APG / WCAG 2.2 のアクセシビリティ観点を引く CLI')\n .version(VERSION, '-v, --version', 'バージョンを表示')\n .option('--json', '型付き JSON で出力する(AI エージェント / スクリプト向け)')\n .addOption(\n new Option('--detail <level>', '出力の詳しさ').choices(['full', 'compact', 'brief']).default('full'),\n )\n .showHelpAfterError();\n\n // --json は副作用の前にモードを確定する。\n program.hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts<GlobalOpts>();\n setJsonMode(Boolean(opts.json));\n });\n\n program\n .command('pattern')\n .argument('[slug]', 'パターンの slug(省略すると一覧)')\n .description('APG パターンの観点を表示する(無引数で一覧)')\n .action((slug: string | undefined) => {\n try {\n const detail = program.opts<GlobalOpts>().detail ?? 'full';\n if (slug === undefined) {\n const res = patternList();\n emit(res.type, res.data, () => formatPatternList(res.data));\n } else {\n const res = patternDetail(slug);\n emit(res.type, res.data, () =>\n detail === 'brief'\n ? `${res.data.ja} (${res.data.en}) — ${res.data.slug}`\n : formatPatternDetail(res.data),\n );\n }\n } catch (err) {\n reportError(err);\n }\n });\n\n program\n .command('wcag')\n .argument('[slug]', '達成基準の slug(例: 1-1-1。省略すると一覧)')\n .description('WCAG 2.2 達成基準を表示する(無引数で一覧)')\n .action((slug: string | undefined) => {\n try {\n const detail = program.opts<GlobalOpts>().detail ?? 'full';\n if (slug === undefined) {\n const res = wcagList();\n emit(res.type, res.data, () => formatWcagList(res.data));\n } else {\n const res = wcagDetail(slug);\n emit(res.type, res.data, () =>\n detail === 'brief'\n ? `${res.data.num} ${res.data.ja} (${res.data.en}) — ${res.data.slug}`\n : formatWcagDetail(res.data),\n );\n }\n } catch (err) {\n reportError(err);\n }\n });\n\n program\n .command('search')\n .argument('<query>', '検索キーワード')\n .description('パターン + WCAG を横断検索する')\n .action((query: string) => {\n try {\n const res = apiSearch(query);\n emit(res.type, res.data, () => formatSearch(res.data));\n } catch (err) {\n reportError(err);\n }\n });\n\n program\n .command('checklist')\n .argument('<slug>', 'パターンの slug')\n .description('パターンの実装チェックリストだけを表示する')\n .action((slug: string) => {\n try {\n const res = apiChecklist(slug);\n emit(res.type, res.data, () => formatChecklist(res.data));\n } catch (err) {\n reportError(err);\n }\n });\n\n program\n .command('manifest')\n .description('全コマンド/レスポンス型の構造化 manifest を出力する(AI 向け)')\n .action(() => {\n try {\n const data = buildManifest();\n emit('manifest', data, () => formatManifest(data));\n } catch (err) {\n reportError(err);\n }\n });\n\n program\n .command('doctor')\n .description('実行環境を診断する')\n .action(() => {\n try {\n const data = buildDoctor();\n emit('doctor', data, () => formatDoctor(data));\n } catch (err) {\n reportError(err);\n }\n });\n\n return program;\n}\n\n// ─────────────────────────── manifest ───────────────────────────\n\ninterface ManifestCommand {\n name: string;\n description: string;\n args: { name: string; required: boolean }[];\n json: boolean;\n responseTypes: string[];\n}\n\ninterface ManifestData {\n name: string;\n version: string;\n globalOptions: { flag: string; description: string }[];\n commands: ManifestCommand[];\n}\n\nfunction buildManifest(): ManifestData {\n return {\n name: 'a11y',\n version: VERSION,\n globalOptions: [\n { flag: '--json', description: '型付き JSON で出力する' },\n { flag: '--detail <full|compact|brief>', description: '出力の詳しさ' },\n ],\n commands: [\n {\n name: 'pattern',\n description: 'APG パターンの観点を表示(無引数で一覧)',\n args: [{ name: 'slug', required: false }],\n json: true,\n responseTypes: ['pattern.list', 'pattern.detail'],\n },\n {\n name: 'wcag',\n description: 'WCAG 2.2 達成基準を表示(無引数で一覧)',\n args: [{ name: 'slug', required: false }],\n json: true,\n responseTypes: ['wcag.list', 'wcag.detail'],\n },\n {\n name: 'search',\n description: 'パターン + WCAG を横断検索',\n args: [{ name: 'query', required: true }],\n json: true,\n responseTypes: ['search.results'],\n },\n {\n name: 'checklist',\n description: 'パターンの実装チェックリストを表示',\n args: [{ name: 'slug', required: true }],\n json: true,\n responseTypes: ['pattern.checklist'],\n },\n {\n name: 'manifest',\n description: '構造化 manifest を出力',\n args: [],\n json: true,\n responseTypes: ['manifest'],\n },\n {\n name: 'doctor',\n description: '実行環境を診断',\n args: [],\n json: true,\n responseTypes: ['doctor'],\n },\n ],\n };\n}\n\nfunction formatManifest(data: ManifestData): string {\n const out: string[] = [];\n out.push(pc.bold(`${data.name} v${data.version}`));\n out.push('');\n out.push(pc.cyan('コマンド:'));\n for (const c of data.commands) {\n const args = c.args.map((a) => (a.required ? `<${a.name}>` : `[${a.name}]`)).join(' ');\n out.push(` ${pc.green(c.name)} ${args}`);\n out.push(` ${pc.dim(c.description)}`);\n out.push(` ${pc.dim(`type: ${c.responseTypes.join(', ')}`)}`);\n }\n out.push('');\n out.push(pc.dim('構造化データは `a11y manifest --json` で取得できます。'));\n return out.join('\\n');\n}\n\n// ─────────────────────────── doctor ───────────────────────────\n\ninterface DoctorData {\n cliVersion: string;\n node: string;\n nodeSupported: boolean;\n platform: string;\n arch: string;\n}\n\nfunction buildDoctor(): DoctorData {\n const [major] = process.versions.node.split('.').map((n) => Number.parseInt(n, 10));\n return {\n cliVersion: VERSION,\n node: process.versions.node,\n nodeSupported: (major ?? 0) >= 18,\n platform: process.platform,\n arch: process.arch,\n };\n}\n\nfunction formatDoctor(data: DoctorData): string {\n const ok = data.nodeSupported ? pc.green('OK') : pc.red('要更新 (Node 18+ が必要)');\n return [\n pc.bold('a11y doctor'),\n ` CLI バージョン : ${data.cliVersion}`,\n ` Node.js : ${data.node} ${ok}`,\n ` プラットフォーム: ${data.platform} / ${data.arch}`,\n ].join('\\n');\n}\n\n// ─────────────────────────── run ───────────────────────────\n\nexport async function run(argv: string[]): Promise<void> {\n const program = buildProgram();\n // 引数なしで起動されたらヘルプを出す。\n if (argv.length <= 2) {\n humanLog(program.helpInformation());\n return;\n }\n await program.parseAsync(argv);\n}\n","// 人間向けの整形出力。色は picocolors(極小)。重いテーブル lib は使わない。\nimport pc from 'picocolors';\nimport type { CriterionDetail, PatternDetail, Requirement, SearchHit } from '@mew-lab/a11y-core';\nimport type { ChecklistData, PatternListData, SearchData, WcagListData } from './api';\n\nconst REQUIREMENT_LABEL: Record<Requirement, string> = {\n required: '必須',\n recommended: '推奨',\n optional: '任意',\n};\n\n// 全角(CJK 等)を2幅として数える簡易表示幅。\nfunction displayWidth(s: string): number {\n let w = 0;\n for (const ch of s) {\n const code = ch.codePointAt(0) ?? 0;\n const wide =\n (code >= 0x1100 && code <= 0x115f) ||\n (code >= 0x2e80 && code <= 0xa4cf) ||\n (code >= 0xac00 && code <= 0xd7a3) ||\n (code >= 0xf900 && code <= 0xfaff) ||\n (code >= 0xff00 && code <= 0xff60) ||\n (code >= 0xffe0 && code <= 0xffe6) ||\n (code >= 0x20000 && code <= 0x3fffd);\n w += wide ? 2 : 1;\n }\n return w;\n}\n\nfunction pad(s: string, width: number): string {\n const diff = width - displayWidth(s);\n return diff > 0 ? s + ' '.repeat(diff) : s;\n}\n\n/** 行配列を桁揃えして返す(各列の最大幅に合わせる)。 */\nfunction table(rows: string[][]): string[] {\n if (rows.length === 0) return [];\n const cols = Math.max(...rows.map((r) => r.length));\n const widths: number[] = [];\n for (let c = 0; c < cols; c++) {\n widths[c] = Math.max(...rows.map((r) => displayWidth(r[c] ?? '')));\n }\n return rows.map((r) =>\n r\n .map((cell, c) => (c === r.length - 1 ? cell : pad(cell ?? '', widths[c] ?? 0)))\n .join(' ')\n .trimEnd(),\n );\n}\n\nfunction heading(text: string): string {\n return pc.bold(pc.cyan(text));\n}\n\nfunction levelBadge(level: string): string {\n return pc.bgBlue(pc.white(` ${level} `));\n}\n\n// ─────────────────────────── pattern ───────────────────────────\n\nexport function formatPatternList(data: PatternListData): string {\n const out: string[] = [];\n out.push(pc.bold(`APG パターン(${data.total}件)`));\n for (const g of data.categories) {\n if (g.items.length === 0) continue;\n out.push('');\n out.push(heading(`■ ${g.category}`));\n for (const line of table(g.items.map((p) => [` ${pc.green(p.slug)}`, p.ja]))) {\n out.push(line);\n }\n }\n out.push('');\n out.push(pc.dim('詳細: a11y pattern <slug>'));\n return out.join('\\n');\n}\n\nexport function formatPatternDetail(d: PatternDetail): string {\n const out: string[] = [];\n out.push(`${pc.bold(d.ja)} ${pc.dim(`(${d.en})`)} ${pc.green(d.slug)}`);\n out.push(pc.dim(`カテゴリ: ${d.category}`));\n out.push('');\n out.push(d.summary);\n\n const vp = d.viewpoint;\n if (vp) {\n if (vp.keyboard.length > 0) {\n out.push('');\n out.push(heading('キーボード操作'));\n for (const line of table(\n vp.keyboard.map((r) => [` ${r.keys}`, r.action, pc.dim(REQUIREMENT_LABEL[r.requirement])]),\n )) {\n out.push(line);\n }\n }\n if (vp.aria.length > 0) {\n out.push('');\n out.push(heading('必要な WAI-ARIA / ロール'));\n for (const line of table(\n vp.aria.map((r) => [` ${r.target}`, pc.yellow(r.attr), r.meaning]),\n )) {\n out.push(line);\n }\n }\n if (vp.antipatterns.length > 0) {\n out.push('');\n out.push(heading('アンチパターン'));\n for (const a of vp.antipatterns) {\n out.push(` ${pc.red('✗')} ${pc.bold(a.title)}`);\n out.push(` ${pc.dim(a.why)}`);\n }\n }\n if (vp.checklist.length > 0) {\n out.push('');\n out.push(heading('実装チェックリスト'));\n for (const item of vp.checklist) {\n out.push(` ${pc.green('☐')} ${item}`);\n }\n }\n if (vp.notes && vp.notes.length > 0) {\n out.push('');\n out.push(heading('メモ'));\n for (const note of vp.notes) {\n out.push(` - ${note}`);\n }\n }\n } else {\n out.push('');\n out.push(pc.dim('(このパターンの構造化観点データは準備中です)'));\n }\n\n if (d.criteria.length > 0) {\n out.push('');\n out.push(heading('関連する WCAG 2.2 達成基準'));\n for (const c of d.criteria) {\n out.push(` ${levelBadge(c.level)} ${pc.green(c.slug)} ${c.num} ${c.ja}`);\n }\n }\n return out.join('\\n');\n}\n\n// ─────────────────────────── wcag ───────────────────────────\n\nexport function formatWcagList(data: WcagListData): string {\n const out: string[] = [];\n out.push(pc.bold(`WCAG 2.2 達成基準(${data.total}件・本サイト収録分)`));\n for (const g of data.principles) {\n if (g.items.length === 0) continue;\n out.push('');\n out.push(heading(`■ ${g.principle}`));\n for (const line of table(\n g.items.map((c) => [` ${pc.green(c.slug)}`, `${c.num} ${c.ja}`, levelBadge(c.level)]),\n )) {\n out.push(line);\n }\n }\n out.push('');\n out.push(pc.dim('詳細: a11y wcag <slug>'));\n return out.join('\\n');\n}\n\nexport function formatWcagDetail(d: CriterionDetail): string {\n const out: string[] = [];\n const isNew = d.isNew22 ? ` ${pc.bgGreen(pc.black(' 2.2 新設 '))}` : '';\n out.push(`${levelBadge(d.level)} ${pc.bold(`${d.num} ${d.ja}`)} ${pc.dim(`(${d.en})`)}${isNew}`);\n out.push(pc.dim(`${d.principle} / ${d.guideline} ${pc.green(d.slug)}`));\n out.push('');\n out.push(d.summary);\n out.push('');\n out.push(heading('参照'));\n out.push(` 規範訳(waic.jp): ${pc.underline(d.waicUrl)}`);\n out.push(` Understanding : ${pc.underline(d.understandingUrl)}`);\n if (d.relatedPatterns.length > 0) {\n out.push('');\n out.push(heading('関連する APG パターン'));\n for (const line of table(\n d.relatedPatterns.map((p) => [` ${pc.green(p.slug)}`, p.ja]),\n )) {\n out.push(line);\n }\n }\n return out.join('\\n');\n}\n\n// ─────────────────────────── search / checklist ───────────────────────────\n\nfunction hitLabel(hit: SearchHit): string {\n return hit.kind === 'pattern' ? pc.blue('[pattern]') : pc.magenta('[wcag]');\n}\n\nexport function formatSearch(data: SearchData): string {\n if (data.total === 0) {\n return pc.dim(`「${data.query}」に一致する項目はありませんでした。`);\n }\n const out: string[] = [];\n out.push(pc.bold(`「${data.query}」の検索結果(${data.total}件)`));\n out.push('');\n for (const hit of data.hits) {\n out.push(`${hitLabel(hit)} ${pc.green(hit.slug)} ${hit.title}`);\n out.push(` ${pc.dim(hit.subtitle)}`);\n }\n return out.join('\\n');\n}\n\nexport function formatChecklist(data: ChecklistData): string {\n const out: string[] = [];\n out.push(pc.bold(`${data.ja} 実装チェックリスト`));\n out.push('');\n if (data.checklist.length === 0) {\n out.push(pc.dim('(チェックリストは準備中です)'));\n } else {\n for (const item of data.checklist) {\n out.push(`${pc.green('☐')} ${item}`);\n }\n }\n return out.join('\\n');\n}\n"],"mappings":"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","names":["pc","require","pc"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mew-lab/a11y-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "WAI-ARIA APG パターンと WCAG 2.2 のアクセシビリティ観点を CLI/JSON で引けるツール(AI エージェント対応)",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"accessibility",
|
|
9
|
+
"a11y",
|
|
10
|
+
"wai-aria",
|
|
11
|
+
"apg",
|
|
12
|
+
"wcag",
|
|
13
|
+
"cli",
|
|
14
|
+
"japanese"
|
|
15
|
+
],
|
|
16
|
+
"homepage": "https://a11y.mew-lab.com",
|
|
17
|
+
"bin": {
|
|
18
|
+
"a11y": "./bin/a11y.mjs"
|
|
19
|
+
},
|
|
20
|
+
"exports": {
|
|
21
|
+
".": "./bin/a11y.mjs",
|
|
22
|
+
"./api": {
|
|
23
|
+
"types": "./dist/api.d.ts",
|
|
24
|
+
"import": "./dist/api.js"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist",
|
|
29
|
+
"bin"
|
|
30
|
+
],
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18.0.0"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsup",
|
|
36
|
+
"dev": "tsup --watch",
|
|
37
|
+
"cli": "node bin/a11y.mjs",
|
|
38
|
+
"test": "vitest run",
|
|
39
|
+
"typecheck": "tsc --noEmit"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"commander": "^12.1.0",
|
|
43
|
+
"picocolors": "^1.1.1",
|
|
44
|
+
"zod": "^3.24.1"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@mew-lab/a11y-core": "workspace:*",
|
|
48
|
+
"@types/node": "^22.10.5",
|
|
49
|
+
"tsup": "^8.3.5",
|
|
50
|
+
"typescript": "^5.7.3",
|
|
51
|
+
"vitest": "^2.1.8"
|
|
52
|
+
},
|
|
53
|
+
"publishConfig": {
|
|
54
|
+
"access": "public"
|
|
55
|
+
}
|
|
56
|
+
}
|