feat: add "lts" version option (#97)

This commit is contained in:
Sebastian
2025-05-12 18:23:36 +02:00
committed by GitHub
parent 95bbb87724
commit a1496dd8d9
6 changed files with 52 additions and 4 deletions

View File

@@ -23,6 +23,7 @@ jobs:
- "~1.32" - "~1.32"
- "b290fd01f3f5d32f9d010fc719ced0240759c049" - "b290fd01f3f5d32f9d010fc719ced0240759c049"
- "rc" - "rc"
- "lts"
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
@@ -111,5 +112,5 @@ jobs:
- name: Build code - name: Build code
run: deno run -A scripts/build.ts run: deno run -A scripts/build.ts
- name: Assert no git changes - name: Assert no git changes (run `deno task build` if this fails)
run: git diff --quiet run: git diff --quiet

View File

@@ -70,6 +70,14 @@ Targets the latest major, minor and patch version of Deno.
deno-version: 2.0.0-rc.1 deno-version: 2.0.0-rc.1
``` ```
### Latest LTS
```yaml
- uses: denoland/setup-deno@v2
with:
deno-version: lts
```
### Version from file ### Version from file
The extension can also automatically read the version file from The extension can also automatically read the version file from

View File

@@ -6,7 +6,7 @@ branding:
color: "gray-dark" color: "gray-dark"
inputs: inputs:
deno-version: deno-version:
description: The Deno version to install. Can be a semver version of a stable release, "canary" for the latest canary, or the Git hash of a specific canary release. description: The Deno version to install. Can be a semver version of a stable release, "canary" for the latest canary, "lts" for the latest LTS, or the Git hash of a specific canary release.
default: "2.x" default: "2.x"
deno-version-file: deno-version-file:
description: File containing the Deno version to install such as .dvmrc or .tool-versions. description: File containing the Deno version to install such as .dvmrc or .tool-versions.

16
dist/main.mjs vendored
View File

@@ -36389,6 +36389,10 @@ function parseVersionRange(version) {
range: "latest", range: "latest",
kind: "stable" kind: "stable"
}; };
if (version === "lts") return {
range: "latest",
kind: "lts"
};
if (GIT_HASH_RE.test(version)) return { if (GIT_HASH_RE.test(version)) return {
range: version, range: version,
kind: "canary" kind: "canary"
@@ -36410,6 +36414,7 @@ function getDenoVersionFromFile(versionFilePath) {
function resolveVersion({ range, kind }) { function resolveVersion({ range, kind }) {
if (kind === "canary") return resolveCanary(range); if (kind === "canary") return resolveCanary(range);
else if (kind === "rc") return resolveReleaseCandidate(); else if (kind === "rc") return resolveReleaseCandidate();
else if (kind === "lts") return resolveLTS();
else return resolveRelease(range); else return resolveRelease(range);
} }
async function resolveCanary(range) { async function resolveCanary(range) {
@@ -36436,6 +36441,16 @@ async function resolveReleaseCandidate() {
kind: "rc" kind: "rc"
}; };
} }
async function resolveLTS() {
const res = await fetchWithRetries("https://dl.deno.land/release-lts-latest.txt");
if (res.status !== 200) throw new Error("Failed to fetch LTS version info from dl.deno.land. Please try again later.");
const version = import_semver.default.clean((await res.text()).trim());
if (version === null) throw new Error("Failed to parse LTS version.");
return {
version,
kind: "lts"
};
}
async function resolveRelease(range) { async function resolveRelease(range) {
if (range === "latest") { if (range === "latest") {
const res = await fetchWithRetries("https://dl.deno.land/release-latest.txt"); const res = await fetchWithRetries("https://dl.deno.land/release-latest.txt");
@@ -38230,6 +38245,7 @@ async function install(version) {
url = `https://dl.deno.land/release/v${version.version}/${zip}`; url = `https://dl.deno.land/release/v${version.version}/${zip}`;
break; break;
case "stable": case "stable":
case "lts":
url = `https://github.com/denoland/deno/releases/download/v${version.version}/${zip}`; url = `https://github.com/denoland/deno/releases/download/v${version.version}/${zip}`;
break; break;
} }

View File

@@ -28,6 +28,7 @@ export async function install(version: Version) {
url = `https://dl.deno.land/release/v${version.version}/${zip}`; url = `https://dl.deno.land/release/v${version.version}/${zip}`;
break; break;
case "stable": case "stable":
case "lts":
url = url =
`https://github.com/denoland/deno/releases/download/v${version.version}/${zip}`; `https://github.com/denoland/deno/releases/download/v${version.version}/${zip}`;
break; break;

View File

@@ -9,12 +9,12 @@ const GIT_HASH_RE = /^[0-9a-fA-F]{40}$/;
export interface VersionRange { export interface VersionRange {
range: string; range: string;
kind: "canary" | "rc" | "stable"; kind: "canary" | "rc" | "stable" | "lts";
} }
export interface Version { export interface Version {
version: string; version: string;
kind: "canary" | "rc" | "stable"; kind: "canary" | "rc" | "stable" | "lts";
} }
/** Parses the version from the user into a structure */ /** Parses the version from the user into a structure */
@@ -36,6 +36,10 @@ export function parseVersionRange(
return { range: "latest", kind: "stable" }; return { range: "latest", kind: "stable" };
} }
if (version === "lts") {
return { range: "latest", kind: "lts" };
}
if (GIT_HASH_RE.test(version)) { if (GIT_HASH_RE.test(version)) {
return { range: version, kind: "canary" }; return { range: version, kind: "canary" };
} }
@@ -82,6 +86,8 @@ export function resolveVersion(
} else if (kind === "rc") { } else if (kind === "rc") {
// range is always "latest" // range is always "latest"
return resolveReleaseCandidate(); return resolveReleaseCandidate();
} else if (kind === "lts") {
return resolveLTS();
} else { } else {
return resolveRelease(range); return resolveRelease(range);
} }
@@ -120,6 +126,22 @@ async function resolveReleaseCandidate(): Promise<Version | null> {
return { version, kind: "rc" }; return { version, kind: "rc" };
} }
async function resolveLTS(): Promise<Version | null> {
const res = await fetchWithRetries(
"https://dl.deno.land/release-lts-latest.txt",
);
if (res.status !== 200) {
throw new Error(
"Failed to fetch LTS version info from dl.deno.land. Please try again later.",
);
}
const version = semver.clean((await res.text()).trim());
if (version === null) {
throw new Error("Failed to parse LTS version.");
}
return { version, kind: "lts" };
}
async function resolveRelease(range: string): Promise<Version | null> { async function resolveRelease(range: string): Promise<Version | null> {
if (range === "latest") { if (range === "latest") {
const res = await fetchWithRetries( const res = await fetchWithRetries(