baseline-browser-mapping 0.1.1 → 0.2.2
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/LICENSE.txt +201 -0
- package/README.md +71 -58
- package/dist/data/downstream-browsers.json +1459 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/scripts/baseline-browser-versions.d.ts +14 -0
- package/dist/scripts/baseline-browser-versions.js +212 -0
- package/package.json +13 -4
- package/data/downstream-browsers.json +0 -1459
- package/index.js +0 -3
- package/scripts/baseline-browser-versions.js +0 -184
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { getAllWidelyAvailable, getMinimumWidelyAvailable, getAllWidelyAvailableOnDate, getMinimumWidelyAvailableOnDate, getAllByYear, getMinimumByYear } from "./scripts/baseline-browser-versions.js";
|
|
2
|
+
export { getAllWidelyAvailable, getMinimumWidelyAvailable, getAllWidelyAvailableOnDate, getMinimumWidelyAvailableOnDate, getAllByYear, getMinimumByYear, };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { getAllWidelyAvailable, getMinimumWidelyAvailable, getAllWidelyAvailableOnDate, getMinimumWidelyAvailableOnDate, getAllByYear, getMinimumByYear, } from "./scripts/baseline-browser-versions.js";
|
|
2
|
+
export { getAllWidelyAvailable, getMinimumWidelyAvailable, getAllWidelyAvailableOnDate, getMinimumWidelyAvailableOnDate, getAllByYear, getMinimumByYear, };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface BrowserVersion {
|
|
2
|
+
browser: string;
|
|
3
|
+
version: string;
|
|
4
|
+
release_date: string;
|
|
5
|
+
engine: string | null;
|
|
6
|
+
engine_version: string | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function getMinimumWidelyAvailable(includeDownstream?: boolean): BrowserVersion[];
|
|
9
|
+
export declare function getAllWidelyAvailable(includeDownstream?: boolean): BrowserVersion[];
|
|
10
|
+
export declare function getMinimumWidelyAvailableOnDate(dateString: string, includeDownstream?: boolean): BrowserVersion[];
|
|
11
|
+
export declare function getAllWidelyAvailableOnDate(dateString: string, includeDownstream?: boolean): BrowserVersion[];
|
|
12
|
+
export declare function getMinimumByYear(year: string, includeDownstream?: boolean): BrowserVersion[];
|
|
13
|
+
export declare function getAllByYear(year: string, includeDownstream?: boolean): BrowserVersion[];
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import bcdBrowsers from "@mdn/browser-compat-data" assert { type: "json" };
|
|
2
|
+
import otherBrowsers from "../data/downstream-browsers.json" assert { type: "json" };
|
|
3
|
+
const bcdCoreBrowserNames = [
|
|
4
|
+
"chrome",
|
|
5
|
+
"chrome_android",
|
|
6
|
+
"edge",
|
|
7
|
+
"firefox",
|
|
8
|
+
"firefox_android",
|
|
9
|
+
"safari",
|
|
10
|
+
"safari_ios",
|
|
11
|
+
];
|
|
12
|
+
const coreBrowserData = Object.entries(bcdBrowsers.browsers).filter(([browserName, browserData]) => bcdCoreBrowserNames.includes(browserName));
|
|
13
|
+
const bcdDownstreamBrowserNames = [
|
|
14
|
+
"webview_android",
|
|
15
|
+
"samsunginternet_android",
|
|
16
|
+
"opera_android",
|
|
17
|
+
"opera",
|
|
18
|
+
];
|
|
19
|
+
const downstreamBrowserData = [
|
|
20
|
+
...Object.entries(bcdBrowsers.browsers).filter(([browserName, browserData]) => bcdDownstreamBrowserNames.includes(browserName)),
|
|
21
|
+
...Object.entries(otherBrowsers.browsers),
|
|
22
|
+
];
|
|
23
|
+
const acceptableStatuses = ["current", "esr", "retired", "unknown"];
|
|
24
|
+
const compareVersions = (incomingVersionString, previousVersionString) => {
|
|
25
|
+
let [incomingVersionStringMajor, incomingVersionStringMinor] = incomingVersionString.split(".");
|
|
26
|
+
let [previousVersionStringMajor, previousVersionStringMinor] = previousVersionString.split(".");
|
|
27
|
+
if (!incomingVersionStringMajor || !previousVersionStringMajor) {
|
|
28
|
+
throw new Error("One of these version strings is broken: " +
|
|
29
|
+
incomingVersionString +
|
|
30
|
+
" or " +
|
|
31
|
+
previousVersionString +
|
|
32
|
+
"");
|
|
33
|
+
}
|
|
34
|
+
if (incomingVersionStringMinor) {
|
|
35
|
+
if (parseInt(incomingVersionStringMajor) >=
|
|
36
|
+
parseInt(previousVersionStringMajor) &&
|
|
37
|
+
(!previousVersionStringMinor ||
|
|
38
|
+
parseInt(incomingVersionStringMinor) >
|
|
39
|
+
parseInt(previousVersionStringMinor))) {
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
if (incomingVersionStringMajor > previousVersionStringMajor) {
|
|
45
|
+
return 1;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return 0;
|
|
49
|
+
};
|
|
50
|
+
const getCoreVersionsByDate = (date, minOnly = true) => {
|
|
51
|
+
if (date.getFullYear() < 2015) {
|
|
52
|
+
throw new Error("There are no browser versions compatible with Baseline before 2015");
|
|
53
|
+
}
|
|
54
|
+
if (date.getFullYear() >= new Date().getFullYear()) {
|
|
55
|
+
throw new Error("There are no browser versions compatible with Baseline in the future");
|
|
56
|
+
}
|
|
57
|
+
let versions = new Array();
|
|
58
|
+
coreBrowserData.forEach(([browserName, browserData]) => {
|
|
59
|
+
let sortedVersions = Object.entries(browserData.releases)
|
|
60
|
+
.filter(([versionNumber, versionData]) => {
|
|
61
|
+
if (!acceptableStatuses.includes(versionData.status)) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
return true;
|
|
65
|
+
})
|
|
66
|
+
.sort((a, b) => {
|
|
67
|
+
{
|
|
68
|
+
return compareVersions(a[0], b[0]);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
for (let i = 1; i < sortedVersions.length; i++) {
|
|
72
|
+
const thisVersion = sortedVersions[i];
|
|
73
|
+
if (thisVersion) {
|
|
74
|
+
const versionData = thisVersion[1];
|
|
75
|
+
const prevVersion = sortedVersions[i - 1];
|
|
76
|
+
if (prevVersion) {
|
|
77
|
+
const [prevVersionNumber, prevVersionData] = prevVersion;
|
|
78
|
+
if (versionData.release_date &&
|
|
79
|
+
new Date(versionData.release_date) > date) {
|
|
80
|
+
versions.push({
|
|
81
|
+
browser: browserName,
|
|
82
|
+
version: prevVersionNumber,
|
|
83
|
+
release_date: prevVersionData.release_date
|
|
84
|
+
? prevVersionData.release_date
|
|
85
|
+
: "unknown",
|
|
86
|
+
engine: null,
|
|
87
|
+
engine_version: null,
|
|
88
|
+
});
|
|
89
|
+
if (minOnly) {
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return versions;
|
|
98
|
+
};
|
|
99
|
+
const getDownstreamBrowsers = (inputArray = [], minOnly = true) => {
|
|
100
|
+
let minimumChromeVersion = undefined;
|
|
101
|
+
if (inputArray && inputArray.length > 0) {
|
|
102
|
+
minimumChromeVersion = inputArray
|
|
103
|
+
.filter((browser) => browser.browser === "chrome")
|
|
104
|
+
.sort((a, b) => {
|
|
105
|
+
return compareVersions(a.version, b.version);
|
|
106
|
+
})[0]?.version;
|
|
107
|
+
}
|
|
108
|
+
if (!minimumChromeVersion) {
|
|
109
|
+
throw new Error("There are no browser versions compatible with Baseline before Chrome");
|
|
110
|
+
}
|
|
111
|
+
let downstreamArray = new Array();
|
|
112
|
+
downstreamBrowserData.forEach(([browserName, browserData]) => {
|
|
113
|
+
let sortedAndFilteredVersions = Object.entries(browserData.releases)
|
|
114
|
+
.filter(([versionNumber, versionData]) => {
|
|
115
|
+
if (!versionData.engine) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
if (versionData.engine != "Blink") {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
if (parseInt(versionData.engine_version) < parseInt(minimumChromeVersion)) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
return true;
|
|
125
|
+
})
|
|
126
|
+
.sort((a, b) => {
|
|
127
|
+
return compareVersions(a[0], b[0]);
|
|
128
|
+
});
|
|
129
|
+
for (let i = 0; i < sortedAndFilteredVersions.length; i++) {
|
|
130
|
+
const versionEntry = sortedAndFilteredVersions[i];
|
|
131
|
+
if (versionEntry) {
|
|
132
|
+
const [versionNumber, versionData] = versionEntry;
|
|
133
|
+
downstreamArray.push({
|
|
134
|
+
browser: browserName,
|
|
135
|
+
version: versionNumber,
|
|
136
|
+
release_date: versionData.release_date,
|
|
137
|
+
engine: versionData.engine,
|
|
138
|
+
engine_version: versionData.engine_version,
|
|
139
|
+
});
|
|
140
|
+
if (minOnly) {
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
let outputArray = [...inputArray, ...downstreamArray];
|
|
147
|
+
return outputArray;
|
|
148
|
+
};
|
|
149
|
+
export function getMinimumWidelyAvailable(includeDownstream = false) {
|
|
150
|
+
const date30MonthsAgo = new Date();
|
|
151
|
+
date30MonthsAgo.setMonth(new Date().getMonth() - 30);
|
|
152
|
+
let coreBrowserArray = getCoreVersionsByDate(date30MonthsAgo);
|
|
153
|
+
if (!includeDownstream) {
|
|
154
|
+
return coreBrowserArray;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
return getDownstreamBrowsers(coreBrowserArray);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
export function getAllWidelyAvailable(includeDownstream = false) {
|
|
161
|
+
let date30MonthsAgo = new Date();
|
|
162
|
+
date30MonthsAgo.setMonth(new Date().getMonth() - 30);
|
|
163
|
+
let coreBrowserArray = getCoreVersionsByDate(date30MonthsAgo, false);
|
|
164
|
+
if (!includeDownstream) {
|
|
165
|
+
return coreBrowserArray;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
return getDownstreamBrowsers(coreBrowserArray, false);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
export function getMinimumWidelyAvailableOnDate(dateString, includeDownstream = false) {
|
|
172
|
+
const givenDate = new Date(Date.parse(dateString));
|
|
173
|
+
const givenDateLess30Months = new Date(givenDate.setMonth(givenDate.getMonth() - 30));
|
|
174
|
+
let coreBrowserArray = getCoreVersionsByDate(givenDateLess30Months);
|
|
175
|
+
if (!includeDownstream) {
|
|
176
|
+
return coreBrowserArray;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
return getDownstreamBrowsers(coreBrowserArray);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
export function getAllWidelyAvailableOnDate(dateString, includeDownstream = false) {
|
|
183
|
+
const givenDate = new Date(Date.parse(dateString));
|
|
184
|
+
const givenDateLess30Months = new Date(givenDate.setMonth(givenDate.getMonth() - 30));
|
|
185
|
+
let coreBrowserArray = getCoreVersionsByDate(givenDateLess30Months, false);
|
|
186
|
+
if (!includeDownstream) {
|
|
187
|
+
return coreBrowserArray;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
return getDownstreamBrowsers(coreBrowserArray, false);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
export function getMinimumByYear(year, includeDownstream = false) {
|
|
194
|
+
const date = new Date(parseInt(year) + 1, 0, 1);
|
|
195
|
+
let coreBrowserArray = getCoreVersionsByDate(date);
|
|
196
|
+
if (!includeDownstream) {
|
|
197
|
+
return coreBrowserArray;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
return getDownstreamBrowsers(coreBrowserArray);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export function getAllByYear(year, includeDownstream = false) {
|
|
204
|
+
const date = new Date(parseInt(year) + 1, 0, 1);
|
|
205
|
+
let coreBrowserArray = getCoreVersionsByDate(date, false);
|
|
206
|
+
if (!includeDownstream) {
|
|
207
|
+
return coreBrowserArray;
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
return getDownstreamBrowsers(coreBrowserArray, false);
|
|
211
|
+
}
|
|
212
|
+
}
|
package/package.json
CHANGED
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "baseline-browser-mapping",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "A library for obtaining browser versions with their maximum supported Baseline feature set and Widely Available status.",
|
|
5
|
-
"
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./dist/index.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"LICENSE.txt",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
6
14
|
"type": "module",
|
|
7
15
|
"scripts": {
|
|
8
|
-
"test": "echo \"Error: no test specified\" && exit 1"
|
|
16
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
17
|
+
"prepare": "prettier . --write; tsc"
|
|
9
18
|
},
|
|
10
19
|
"license": "Apache-2.0",
|
|
11
20
|
"dependencies": {
|
|
12
21
|
"@mdn/browser-compat-data": "latest"
|
|
13
22
|
}
|
|
14
|
-
}
|
|
23
|
+
}
|