-
Notifications
You must be signed in to change notification settings - Fork 55
/
browser.ts
74 lines (61 loc) · 1.93 KB
/
browser.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
import {
BrowserName,
BrowserStatement,
ReleaseStatement,
} from "@mdn/browser-compat-data";
import { compareVersions } from "compare-versions";
import { defaultCompat } from "./compat.js";
import { Release } from "./release.js";
export function browser(id: string, compat = defaultCompat): Browser {
let b = compat.browsers.get(id);
if (b) {
return b;
}
const data = compat.query(`browsers.${id}`) as BrowserStatement;
b = new Browser(id as BrowserName, data);
compat.browsers.set(id, b);
return b;
}
export class Browser {
id: BrowserName;
data: BrowserStatement;
releases: ReadonlyArray<Release>;
constructor(id: BrowserName, data: BrowserStatement) {
this.id = id;
this.data = data;
const sortedReleaseData: [version: string, data: ReleaseStatement][] =
Object.entries(data.releases).sort(([a], [b]) => compareVersions(a, b));
const releases = sortedReleaseData.map(
([version, data], index) => new Release(this, version, data, index),
);
if (this.data.preview_name) {
releases.push(
// For Safari TP, "nightly" isn't literally correct, but according to
// the BCD schema this can be any "current alpha / experimental
// release".
new Release(this, "preview", { status: "nightly" }, releases.length),
);
}
this.releases = releases;
}
toString(): string {
return `[Browser ${this.name}]`;
}
get name(): string {
return this.data.name;
}
current(): Release {
const curr = this.releases.find((r) => r.data.status === "current");
if (curr === undefined) {
throw new Error(`${browser} does not have a "current" release`);
}
return curr;
}
version(versionString: string): Release {
const result = this.releases.find((r) => r.version === versionString);
if (result === undefined) {
throw new Error(`${browser} does not have a '${versionString}' release.`);
}
return result;
}
}