Skip to content

Commit 6ce97cf

Browse files
committed
matrix: verify the four newest runtime releases; timeline marks LTS toolchains
Toolchain versions carry an lts flag where the notion exists: the Node.js feed provides it and the JDK list declares it. The detail timeline shows an LTS chip next to those versions.
1 parent 6c398ff commit 6ce97cf

8 files changed

Lines changed: 30 additions & 10 deletions

File tree

‎data/toolchains.json‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@
1919
{ "version": "30.0.3" }
2020
],
2121
"jdk": [
22-
{ "version": "25" },
23-
{ "version": "21" },
24-
{ "version": "17" },
25-
{ "version": "11" },
26-
{ "version": "8" }
22+
{ "version": "25", "lts": true },
23+
{ "version": "21", "lts": true },
24+
{ "version": "17", "lts": true },
25+
{ "version": "11", "lts": true },
26+
{ "version": "8", "lts": true }
2727
],
2828
"xcode": [{ "version": "26.3" }, { "version": "26.2" }, { "version": "16.4" }],
29-
"node": [{ "version": "24.0.0" }, { "version": "22.0.0" }, { "version": "20.0.0" }],
29+
"node": [
30+
{ "version": "24.0.0", "lts": true },
31+
{ "version": "22.0.0", "lts": true },
32+
{ "version": "20.0.0", "lts": true }
33+
],
3034
"cocoapods": [{ "version": "1.16.2" }, { "version": "1.15.2" }]
3135
}

‎schemas/compatibility.json‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
"prerelease": {
3939
"type": "boolean"
4040
},
41+
"lts": {
42+
"type": "boolean",
43+
"description": "A long-term-support line, where the toolchain has the notion."
44+
},
4145
"date": {
4246
"type": "string"
4347
}

‎scripts/build-matrix.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const ADOPTIUM_RELEASES = "https://api.adoptium.net/v3/info/available_releases";
2525
const RUNNER_IMAGES_README = "https://raw.githubusercontent.com/actions/runner-images/main/README.md";
2626

2727
const CLI_VERSIONS = 2; // newest stable CLI releases
28-
const RUNTIME_VERSIONS = 2; // newest stable releases of each runtime
28+
const RUNTIME_VERSIONS = 4; // newest stable releases of each runtime
2929
const NODE_MAJORS = 2; // newest even (LTS-track) Node.js majors
3030
const XCODE_LINES = 4; // newest major.minor lines
3131
const ANDROID_LEVELS = 3; // newest API levels

‎shared/compute.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ export interface CellSummary {
368368
verified: string[];
369369
advisories: Advisory[];
370370
/** State of every known toolchain version, newest first, for the detail view. */
371-
breakdown: Array<{ version: string; prerelease?: boolean; cell: Cell }>;
371+
breakdown: Array<{ version: string; prerelease?: boolean; lts?: boolean; cell: Cell }>;
372372
/** The newest stable toolchain version and how this package version fares with it. */
373373
latest?: { version: string; cell: Cell };
374374
/** A prerelease toolchain newer than `latest`, when one is known. */
@@ -400,6 +400,7 @@ export function summarizeCell(
400400
const breakdown = document.toolchains[key].map((tool) => ({
401401
version: tool.version,
402402
prerelease: tool.prerelease,
403+
lts: tool.lts,
403404
cell: cellFor(document, packageName, version, key, tool.version),
404405
}));
405406
const latest = breakdown.find((item) => !item.prerelease);

‎shared/types.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export const TOOLCHAIN_LABELS: Record<ToolchainKey, string> = {
2323
export interface ToolchainVersion {
2424
version: string;
2525
prerelease?: boolean;
26+
/** A long-term-support line, where the toolchain has the notion (Node.js, JDK). */
27+
lts?: boolean;
2628
/** ISO date the version shipped, when the feed provides one. */
2729
date?: string;
2830
}

‎test/compute.test.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ describe("latest supported", () => {
201201
it("names the newest usable version when the newest stable one is not", () => {
202202
const doc = buildDocument({
203203
generatedAt: "2026-09-09T00:00:00.000Z",
204-
toolchains: { xcode: [], cocoapods: [], compileSdk: [], buildTools: [], jdk: [{ version: "26", prerelease: true }, { version: "25" }, { version: "21" }, { version: "17" }], node: [] },
204+
toolchains: { xcode: [], cocoapods: [], compileSdk: [], buildTools: [], jdk: [{ version: "26", prerelease: true }, { version: "25" }, { version: "21", lts: true }, { version: "17" }], node: [] },
205205
packages: [
206206
{
207207
spec: { name: "@nativescript/android", toolchains: ["jdk"], keep: 5 },
@@ -215,6 +215,7 @@ describe("latest supported", () => {
215215
],
216216
});
217217
const cell = summarizeCell(doc, "@nativescript/android", "9.1.1", "jdk");
218+
expect(cell.breakdown.find((item) => item.version === "21")?.lts).toBe(true);
218219
expect(cell.latest).toMatchObject({ version: "25", cell: { state: "unsupported" } });
219220
expect(cell.latestSupported).toMatchObject({ version: "21", cell: { state: "verified" } });
220221
expect(cell.prerelease).toMatchObject({ version: "26" });

‎web/src/components/CellDetails.vue‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { CellSummary } from "../../../shared/compute";
44
import { TOOLCHAIN_LABELS, type CellState, type CompatibilityDocument, type ToolchainKey } from "../../../shared/types";
55
import { STATE_HELP } from "../states";
66
import BetaChip from "./BetaChip.vue";
7+
import Chip from "./Chip.vue";
78
import StateIcon from "./StateIcon.vue";
89
910
const INITIAL_NODES = 5;
@@ -104,6 +105,7 @@ function shortDate(version: string): string {
104105
<span class="flex h-6 items-center gap-1 text-sm leading-6 font-semibold tabular-nums whitespace-nowrap" :class="LABEL[item.cell.state]">
105106
{{ item.version }}
106107
<BetaChip v-if="item.prerelease" />
108+
<Chip v-else-if="item.lts" :title="`${label} ${item.version} is a long-term-support line`">LTS</Chip>
107109
</span>
108110
<span class="relative flex h-6 w-full items-center justify-center">
109111
<span

‎worker/sources/toolchains.ts‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,19 @@ async function fetchNode(): Promise<ToolchainVersion[]> {
7272
const releases = (await (await fetch(NODE_FEED)).json()) as Array<{
7373
version: string;
7474
date: string;
75+
/** The LTS codename once the line enters LTS, false before. */
76+
lts: string | false;
7577
}>;
7678
// Latest release per major line, newest majors first.
7779
const byMajor = new Map<number, ToolchainVersion>();
7880
for (const release of releases) {
7981
const major = semver.major(release.version);
8082
if (!byMajor.has(major)) {
81-
byMajor.set(major, { version: release.version.replace(/^v/, ""), date: release.date });
83+
byMajor.set(major, {
84+
version: release.version.replace(/^v/, ""),
85+
lts: release.lts ? true : undefined,
86+
date: release.date,
87+
});
8288
}
8389
}
8490
return Array.from(byMajor.entries())

0 commit comments

Comments
 (0)