Skip to content

Commit f87354c

Browse files
authored
Expand versions returned by getAllVersions(), fixes refresh-downstream bug (#30)
* getAllVersions() now includes 'beta' and 'nightly' versions and pre 2015 versions which are marked as "pre_baseline". The "supports" value is omitted for versions that don't support Widely or Newly. * Fixes version comparison issues in refresh-downstream.ts
1 parent 8dc799c commit f87354c

18 files changed

+4032
-1231
lines changed

package-lock.json

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,12 @@
2020
"refresh-static": "npx tsx scripts/refresh-static.ts"
2121
},
2222
"license": "Apache-2.0",
23-
"dependencies": {
24-
"@mdn/browser-compat-data": "^6.0.9",
25-
"web-features": "^2.34.1"
26-
},
2723
"devDependencies": {
28-
"@types/node": "^22.15.3",
24+
"@types/node": "^22.15.17",
2925
"prettier": "^3.5.3",
30-
"typescript": "^5.7.2"
26+
"typescript": "^5.7.2",
27+
"@mdn/browser-compat-data": "^6.0.13",
28+
"web-features": "^2.34.2"
3129
},
3230
"repository": "git+https://github.com/web-platform-dx/baseline-browser-mapping.git"
3331
}

scripts/refresh-downstream.ts

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ const compareVersions = (
3131
incomingVersionString: string,
3232
previousVersionString: string,
3333
): number => {
34+
if (incomingVersionString === previousVersionString) {
35+
return 0;
36+
}
37+
3438
let [incomingVersionStringMajor, incomingVersionStringMinor] =
3539
incomingVersionString.split(".");
3640
let [previousVersionStringMajor, previousVersionStringMinor] =
@@ -46,22 +50,24 @@ const compareVersions = (
4650
);
4751
}
4852

53+
if (
54+
parseInt(incomingVersionStringMajor) > parseInt(previousVersionStringMajor)
55+
) {
56+
return 1;
57+
}
58+
4959
if (incomingVersionStringMinor) {
5060
if (
51-
parseInt(incomingVersionStringMajor) >=
61+
parseInt(incomingVersionStringMajor) ==
5262
parseInt(previousVersionStringMajor) &&
5363
(!previousVersionStringMinor ||
5464
parseInt(incomingVersionStringMinor) >
5565
parseInt(previousVersionStringMinor))
5666
) {
5767
return 1;
5868
}
59-
} else {
60-
if (incomingVersionStringMajor > previousVersionStringMajor) {
61-
return 1;
62-
}
6369
}
64-
return 0;
70+
return -1;
6571
};
6672

6773
const findLatestVersion = (releases: {
@@ -78,7 +84,7 @@ const handleUas = (
7884
let somethingChanged = false;
7985

8086
const existingData: DownstreamBrowsersData = JSON.parse(
81-
readFileSync(process.cwd() + "/src/data/downstream-browsers.json", {
87+
readFileSync(process.cwd() + "/static/downstream-browsers.json", {
8288
encoding: "utf8",
8389
}),
8490
);
@@ -130,9 +136,9 @@ const handleUas = (
130136
compareVersions(
131137
browserVersion,
132138
browser.latestExistingVersion?.[0] ?? "",
133-
) &&
134-
parseFloat(chromiumVersion) >=
135-
parseFloat(
139+
) === 1 &&
140+
parseInt(chromiumVersion) >=
141+
parseInt(
136142
browser.latestExistingVersion?.[1].engine_version ?? "",
137143
) &&
138144
!Object.keys(existingData.browsers[browserName].releases).includes(
@@ -193,25 +199,31 @@ if (process.argv.length === 2) {
193199
res.on("end", () => {
194200
latestUas = JSON.parse(Buffer.concat(output).toString());
195201
let [willWrite, fileOutput] = handleUas(latestUas);
202+
Object.keys(fileOutput.browsers).forEach((browserName) => {
203+
const releases = fileOutput.browsers[browserName].releases;
204+
const sortedReleases = Object.entries(releases)
205+
.sort((a, b) => compareVersions(a[0], b[0]))
206+
.reduce(
207+
(acc, [version, release]) => {
208+
acc[version] = release;
209+
return acc;
210+
},
211+
{} as { [version: string]: BrowserRelease },
212+
);
213+
fileOutput.browsers[browserName].releases = sortedReleases;
214+
});
196215
if (willWrite) {
197216
fileOutput.lastUpdated = new Date().toISOString();
217+
writeFileSync(
218+
process.cwd() + "/static/downstream-browsers.json",
219+
JSON.stringify(fileOutput, null, 2),
220+
{ flag: "w" },
221+
);
198222
writeFileSync(
199223
process.cwd() + "/src/data/downstream-browsers.json",
200224
JSON.stringify(fileOutput, null, 2),
201225
{ flag: "w" },
202226
);
203-
204-
// let packageJson = JSON.parse(
205-
// readFileSync(process.cwd() + "/package.json", { encoding: "utf8" }),
206-
// );
207-
// let currentVersion = packageJson.version.split(".");
208-
// currentVersion[2]++;
209-
// packageJson.version = currentVersion.join(".");
210-
// writeFileSync(
211-
// process.cwd() + "/package.json",
212-
// JSON.stringify(packageJson, null, 2),
213-
// { encoding: "utf8" },
214-
// );
215227
} else {
216228
console.log("no updates at this time");
217229
}

src/data/downstream-browsers.json

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,24 @@
652652
"engine_version": "130",
653653
"status": "unknown",
654654
"release_date": "2024-11-30"
655+
},
656+
"25.2": {
657+
"engine": "Blink",
658+
"engine_version": "132",
659+
"status": "unknown",
660+
"release_date": "2025-04-24"
661+
},
662+
"25.3": {
663+
"engine": "Blink",
664+
"engine_version": "132",
665+
"status": "unknown",
666+
"release_date": "2025-04-23"
667+
},
668+
"25.4": {
669+
"engine": "Blink",
670+
"engine_version": "134",
671+
"status": "unknown",
672+
"release_date": "2025-04-23"
655673
}
656674
}
657675
},
@@ -1504,5 +1522,5 @@
15041522
}
15051523
}
15061524
},
1507-
"lastUpdated": "2025-04-09T14:12:33.205Z"
1525+
"lastUpdated": "2025-04-30T13:52:05.731Z"
15081526
}

src/scripts/baseline-browser-versions.ts

Lines changed: 66 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ type BrowserVersion = {
4747
};
4848

4949
interface AllBrowsersBrowserVersion extends BrowserVersion {
50-
year: number;
50+
year: number | string;
5151
supports?: string;
5252
wa_compatible?: boolean;
5353
}
@@ -96,7 +96,15 @@ const downstreamBrowserData: [string, Browser][] = [
9696
][]),
9797
];
9898

99-
const acceptableStatuses: string[] = ["current", "esr", "retired", "unknown"];
99+
const acceptableStatuses: string[] = [
100+
"current",
101+
"esr",
102+
"retired",
103+
"unknown",
104+
"beta",
105+
"nightly",
106+
];
107+
let suppressPre2015Warning: boolean = false;
100108

101109
const stripLTEPrefix = (str: string): string => {
102110
if (!str) {
@@ -251,9 +259,17 @@ const getCoreVersionsByDate = (
251259
date: Date,
252260
listAllCompatibleVersions: boolean = false,
253261
): BrowserVersion[] => {
254-
if (date.getFullYear() < 2016) {
262+
if (date.getFullYear() < 2015 && !suppressPre2015Warning) {
263+
console.warn(
264+
new Error(
265+
"There are no browser versions compatible with Baseline before 2015. You may receive unexpected results.",
266+
),
267+
);
268+
}
269+
270+
if (date.getFullYear() < 2002) {
255271
throw new Error(
256-
"There are no browser versions compatible with Baseline before 2016",
272+
"None of the browsers in the core set were released before 2002. Please use a date after 2002.",
257273
);
258274
}
259275

@@ -371,7 +387,7 @@ type Options = {
371387
*/
372388
widelyAvailableOnDate?: string | number;
373389
/**
374-
* Pass a year between 2016 and the current year to get browser versions compatible with all
390+
* Pass a year between 2015 and the current year to get browser versions compatible with all
375391
* Newly Available features as of the end of the year specified.
376392
* > NOTE: cannot be used with `widelyAvailableOnDate`.
377393
*/
@@ -466,6 +482,8 @@ type AllVersionsOptions = {
466482
export function getAllVersions(
467483
userOptions?: AllVersionsOptions,
468484
): AllBrowsersBrowserVersion[] | NestedBrowserVersions | string {
485+
suppressPre2015Warning = true;
486+
469487
let incomingOptions = userOptions ?? {};
470488

471489
let options: AllVersionsOptions = {
@@ -477,7 +495,7 @@ export function getAllVersions(
477495

478496
let nextYear = new Date().getFullYear() + 1;
479497

480-
const yearArray = [...Array(nextYear).keys()].slice(2016);
498+
const yearArray = [...Array(nextYear).keys()].slice(2002);
481499
const yearMinimumVersions: YearVersions = {};
482500
yearArray.forEach((year: number) => {
483501
yearMinimumVersions[year] = {};
@@ -505,7 +523,7 @@ export function getAllVersions(
505523
});
506524

507525
const allVersions = getCompatibleVersions({
508-
targetYear: 2016,
526+
targetYear: 2002,
509527
listAllCompatibleVersions: true,
510528
});
511529

@@ -545,17 +563,12 @@ export function getAllVersions(
545563

546564
let versionToPush: AllBrowsersBrowserVersion = {
547565
...version,
548-
year: year - 1,
566+
year: year <= 2015 ? "pre_baseline" : year - 1,
549567
};
550568

551569
if (options.useSupports) {
552-
let supports = "year_only";
553-
if (isWaCcompatible && isNaCompatible) supports = "newly";
554-
if (isWaCcompatible && !isNaCompatible) supports = "widely";
555-
versionToPush = {
556-
...versionToPush,
557-
supports: supports,
558-
};
570+
if (isWaCcompatible) versionToPush.supports = "widely";
571+
if (isNaCompatible) versionToPush.supports = "newly";
559572
} else {
560573
versionToPush = {
561574
...versionToPush,
@@ -602,13 +615,32 @@ export function getAllVersions(
602615
}
603616

604617
outputArray.sort((a, b) => {
605-
if (a.year < b.year) {
618+
// Sort by year: "pre_baseline" first, then numerical year in ascending order
619+
if (a.year === "pre_baseline" && b.year !== "pre_baseline") {
606620
return -1;
607-
} else if (a.browser > b.browser) {
621+
}
622+
if (b.year === "pre_baseline" && a.year !== "pre_baseline") {
608623
return 1;
609-
} else {
610-
return compareVersions(a.version, b.version);
611624
}
625+
if (a.year !== "pre_baseline" && b.year !== "pre_baseline") {
626+
if (a.year < b.year) {
627+
return -1;
628+
}
629+
if (a.year > b.year) {
630+
return 1;
631+
}
632+
}
633+
634+
// Sort by browser alphabetically
635+
if (a.browser < b.browser) {
636+
return -1;
637+
}
638+
if (a.browser > b.browser) {
639+
return 1;
640+
}
641+
642+
// Sort by version using compareVersions
643+
return compareVersions(a.version, b.version);
612644
});
613645

614646
if (options.outputFormat === "object") {
@@ -624,10 +656,19 @@ export function getAllVersions(
624656
engine: version.engine,
625657
engine_version: version.engine_version,
626658
};
627-
//@ts-ignore
628-
outputObject[version.browser][version.version] = options.useSupports
629-
? { ...versionToAdd, supports: version.supports }
630-
: { ...versionToAdd, wa_compatible: version.wa_compatible };
659+
660+
if (options.useSupports) {
661+
//@ts-ignore
662+
outputObject[version.browser][version.version] = version.supports
663+
? { ...versionToAdd, supports: version.supports }
664+
: versionToAdd;
665+
} else {
666+
//@ts-ignores
667+
outputObject[version.browser][version.version] = {
668+
...versionToAdd,
669+
wa_compatible: version.wa_compatible,
670+
};
671+
}
631672
});
632673

633674
return outputObject ?? {};
@@ -643,7 +684,7 @@ export function getAllVersions(
643684
let outputs: {
644685
browser: string;
645686
version: string;
646-
year: number;
687+
year: number | string;
647688
release_date: string;
648689
engine: string;
649690
engine_version: string;
@@ -659,7 +700,7 @@ export function getAllVersions(
659700
};
660701

661702
outputs = options.useSupports
662-
? { ...outputs, supports: version.supports }
703+
? { ...outputs, supports: version.supports ?? "" }
663704
: { ...outputs, wa_compatible: version.wa_compatible };
664705

665706
outputString +=

0 commit comments

Comments
 (0)