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.
@@ -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.1.1",
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
- "main": "index.js",
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
+ }