-
Notifications
You must be signed in to change notification settings - Fork 11
/
run.ts
119 lines (90 loc) · 2.85 KB
/
run.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/// <reference types="node" />
import * as fs from "fs";
import { Audit, Outcome } from "@siteimprove/alfa-act";
import { Command } from "@siteimprove/alfa-command";
import { Formatter } from "@siteimprove/alfa-formatter";
import { Interviewer } from "@siteimprove/alfa-interviewer";
import { Iterable } from "@siteimprove/alfa-iterable";
import { Option, None } from "@siteimprove/alfa-option";
import { Result, Err } from "@siteimprove/alfa-result";
import { Page } from "@siteimprove/alfa-web";
import rules from "@siteimprove/alfa-rules";
import { Profiler } from "../../profiler";
import type { Arguments } from "./arguments";
import type { Flags } from "./flags";
import * as scrape from "../scrape/run";
export const run: Command.Runner<typeof Flags, typeof Arguments> = async ({
flags,
args: { url: target },
}) => {
const formatter = await Formatter.load<any, any, any, any>(flags.format);
if (formatter.isErr()) {
return formatter;
}
const interviewer = Option.from(
await flags.interviewer
.map((interviewer) => Interviewer.load<any, any, any, any>(interviewer))
.getOr(undefined)
);
if (interviewer.some((interviewer) => interviewer.isErr())) {
return interviewer.get() as Err<string>;
}
let json: string;
if (target.isNone()) {
json = fs.readFileSync(0, "utf-8");
} else {
const result = await scrape.run({
flags: {
...flags,
output: None,
},
args: {
url: target.get(),
},
});
if (result.isErr()) {
return result;
}
json = result.get();
}
const page = Page.from(JSON.parse(json));
const oracle = interviewer
.map((interviewer) => interviewer.get()(page, rules))
.getOr(undefined);
const audit = Audit.of(page, rules, oracle);
for (const _ of flags.cpuProfile) {
await Profiler.CPU.start();
}
for (const _ of flags.heapProfile) {
await Profiler.Heap.start();
}
let outcomes = await audit.evaluate();
for (const path of flags.cpuProfile) {
fs.writeFileSync(path, JSON.stringify(await Profiler.CPU.stop()) + "\n");
}
for (const path of flags.heapProfile) {
fs.writeFileSync(path, JSON.stringify(await Profiler.Heap.stop()) + "\n");
}
if (flags.outcomes.isSome()) {
const filter = new Set(flags.outcomes.get());
outcomes = Iterable.filter(outcomes, (outcome) => {
if (Outcome.isPassed(outcome)) {
return filter.has("passed");
}
if (Outcome.isFailed(outcome)) {
return filter.has("failed");
}
if (Outcome.isInapplicable(outcome)) {
return filter.has("inapplicable");
}
return filter.has("cantTell");
});
}
const output = formatter.get()(page, rules, outcomes);
if (flags.output.isNone()) {
return Result.of(output);
} else {
fs.writeFileSync(flags.output.get(), output + "\n");
return Result.of("");
}
};