From a1496dd8d99ad4ed7d1950362d4d3e03e18f8f09 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 12 May 2025 18:23:36 +0200 Subject: [PATCH] feat: add "lts" version option (#97) --- .github/workflows/test.yml | 3 ++- README.md | 8 ++++++++ action.yml | 2 +- dist/main.mjs | 16 ++++++++++++++++ src/install.ts | 1 + src/version.ts | 26 ++++++++++++++++++++++++-- 6 files changed, 52 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 276c3fe..e5a4de1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,6 +23,7 @@ jobs: - "~1.32" - "b290fd01f3f5d32f9d010fc719ced0240759c049" - "rc" + - "lts" steps: - uses: actions/checkout@v3 @@ -111,5 +112,5 @@ jobs: - name: Build code 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 diff --git a/README.md b/README.md index 385aa20..4085bee 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,14 @@ Targets the latest major, minor and patch version of Deno. deno-version: 2.0.0-rc.1 ``` +### Latest LTS + +```yaml +- uses: denoland/setup-deno@v2 + with: + deno-version: lts +``` + ### Version from file The extension can also automatically read the version file from diff --git a/action.yml b/action.yml index 67931e1..3d03b46 100644 --- a/action.yml +++ b/action.yml @@ -6,7 +6,7 @@ branding: color: "gray-dark" inputs: 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" deno-version-file: description: File containing the Deno version to install such as .dvmrc or .tool-versions. diff --git a/dist/main.mjs b/dist/main.mjs index 92d559b..6a0a1ab 100644 --- a/dist/main.mjs +++ b/dist/main.mjs @@ -36389,6 +36389,10 @@ function parseVersionRange(version) { range: "latest", kind: "stable" }; + if (version === "lts") return { + range: "latest", + kind: "lts" + }; if (GIT_HASH_RE.test(version)) return { range: version, kind: "canary" @@ -36410,6 +36414,7 @@ function getDenoVersionFromFile(versionFilePath) { function resolveVersion({ range, kind }) { if (kind === "canary") return resolveCanary(range); else if (kind === "rc") return resolveReleaseCandidate(); + else if (kind === "lts") return resolveLTS(); else return resolveRelease(range); } async function resolveCanary(range) { @@ -36436,6 +36441,16 @@ async function resolveReleaseCandidate() { 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) { if (range === "latest") { 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}`; break; case "stable": + case "lts": url = `https://github.com/denoland/deno/releases/download/v${version.version}/${zip}`; break; } diff --git a/src/install.ts b/src/install.ts index 6249272..aacdf29 100644 --- a/src/install.ts +++ b/src/install.ts @@ -28,6 +28,7 @@ export async function install(version: Version) { url = `https://dl.deno.land/release/v${version.version}/${zip}`; break; case "stable": + case "lts": url = `https://github.com/denoland/deno/releases/download/v${version.version}/${zip}`; break; diff --git a/src/version.ts b/src/version.ts index 243e8c4..226b168 100644 --- a/src/version.ts +++ b/src/version.ts @@ -9,12 +9,12 @@ const GIT_HASH_RE = /^[0-9a-fA-F]{40}$/; export interface VersionRange { range: string; - kind: "canary" | "rc" | "stable"; + kind: "canary" | "rc" | "stable" | "lts"; } export interface Version { version: string; - kind: "canary" | "rc" | "stable"; + kind: "canary" | "rc" | "stable" | "lts"; } /** Parses the version from the user into a structure */ @@ -36,6 +36,10 @@ export function parseVersionRange( return { range: "latest", kind: "stable" }; } + if (version === "lts") { + return { range: "latest", kind: "lts" }; + } + if (GIT_HASH_RE.test(version)) { return { range: version, kind: "canary" }; } @@ -82,6 +86,8 @@ export function resolveVersion( } else if (kind === "rc") { // range is always "latest" return resolveReleaseCandidate(); + } else if (kind === "lts") { + return resolveLTS(); } else { return resolveRelease(range); } @@ -120,6 +126,22 @@ async function resolveReleaseCandidate(): Promise { return { version, kind: "rc" }; } +async function resolveLTS(): Promise { + 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 { if (range === "latest") { const res = await fetchWithRetries(