diff --git a/.dvmrc b/.dvmrc new file mode 100644 index 0000000..3987c47 --- /dev/null +++ b/.dvmrc @@ -0,0 +1 @@ +1.43.1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 97f7d36..9af7705 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: matrix: os: [ubuntu-latest, windows-latest, macos-latest] deno: - [1.x, "1.33.1", canary, ~1.32, b31cf9fde6ad5398c20370c136695db77df6beeb] + [1.x, "1.33.1", canary, ~1.32, b290fd01f3f5d32f9d010fc719ced0240759c049] steps: - uses: actions/checkout@v3 @@ -38,3 +38,19 @@ jobs: - name: Lint if: runner.os == 'Linux' && matrix.deno == 'canary' run: npm run lint + + test-version-file: + runs-on: ubuntu-latest + strategy: + matrix: + deno-version-file: [.dvmrc, .tool-versions] + steps: + - uses: actions/checkout@v3 + + - name: Setup Deno + uses: ./ + with: + deno-version-file: ${{ matrix.deno-version-file }} + + - name: Check version + run: deno -V | grep -q "deno 1\.43\.1" diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..5d7d2f5 --- /dev/null +++ b/.tool-versions @@ -0,0 +1,7 @@ +nodejs 20.5.1 +bun 1.1.4 +ruby 3.3.0 +lua 5.4.4 +deno 1.43.1 +rust 1.65.0 +python 3.11.0 diff --git a/README.md b/README.md index 4d9a604..915c375 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,20 @@ Set up your GitHub Actions workflow with a specific version of Deno. ## Usage +### Version from file + +```yaml +- uses: denoland/setup-deno@v1 + with: + deno-version-file: .dvmrc +``` + +```yaml +- uses: denoland/setup-deno@v1 + with: + deno-version-file: .tool-versions +``` + ### Latest stable for a major ```yaml diff --git a/action.yml b/action.yml index dd4bef0..74d15ef 100644 --- a/action.yml +++ b/action.yml @@ -8,6 +8,8 @@ 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. default: "1.x" + deno-version-file: + description: File containing the Deno version to install such as .dvmrc or .tool-versions. outputs: deno-version: description: "The Deno version that was installed." diff --git a/main.js b/main.js index 9242d7d..33574a0 100644 --- a/main.js +++ b/main.js @@ -1,7 +1,11 @@ const process = require("process"); const core = require("@actions/core"); -const { parseVersionRange, resolveVersion } = require("./src/version.js"); +const { + parseVersionRange, + getDenoVersionFromFile, + resolveVersion, +} = require("./src/version.js"); const { install } = require("./src/install.js"); /** @@ -15,7 +19,13 @@ function exit(message) { async function main() { try { - const range = parseVersionRange(core.getInput("deno-version")); + const denoVersionFile = core.getInput("deno-version-file"); + const range = parseVersionRange( + denoVersionFile + ? getDenoVersionFromFile(denoVersionFile) + : core.getInput("deno-version"), + ); + if (range === null) { exit("The passed version range is not valid."); } diff --git a/src/version.js b/src/version.js index f053db0..b39bfe7 100644 --- a/src/version.js +++ b/src/version.js @@ -1,5 +1,6 @@ const semver = require("semver"); const { fetch } = require("undici"); +const fs = require("fs"); const GIT_HASH_RE = /^[0-9a-fA-F]{40}$/; @@ -41,6 +42,35 @@ function parseVersionRange(version) { return null; } +/** + * Parses the version from the version file + * + * @param {string} versionFilePath + * @returns {string | undefined} + */ +function getDenoVersionFromFile(versionFilePath) { + if (!fs.existsSync(versionFilePath)) { + throw new Error( + `The specified node version file at: ${versionFilePath} does not exist`, + ); + } + + const contents = fs.readFileSync(versionFilePath, "utf8"); + + // .tool-versions typically looks like + // ``` + // ruby 2.6.5 + // deno 1.43.1 + // node 20.0.0 + // ``` + // This parses the version of Deno from the file + const denoVersionInToolVersions = contents.match( + /^deno\s+v?(?[^\s]+)$/m, + ); + + return denoVersionInToolVersions?.groups?.version || contents.trim(); +} + /** * @param {VersionRange} range * @returns {Promise} @@ -115,4 +145,5 @@ async function fetchWithRetries(url, maxRetries = 5) { module.exports = { parseVersionRange, resolveVersion, + getDenoVersionFromFile, };