mirror of
https://github.com/oven-sh/setup-bun.git
synced 2025-07-19 13:08:27 +02:00
release: v2.0 🎉 (#80)
* feat: add input bun-version-file (#76) * feat: add input for bun-version-file * docs: update example bun version file * [autofix.ci] apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * refactor: reduce read from file code * [autofix.ci] apply automated fixes * feat: read from all known files if not specified * [autofix.ci] apply automated fixes * fix: just continue if file doesnt exist * [autofix.ci] apply automated fixes * fix: return output if found version * [autofix.ci] apply automated fixes * fix: make whitespace in .tool-versions optional * [autofix.ci] apply automated fixes * log loglog * [autofix.ci] apply automated fixes * log log log * [autofix.ci] apply automated fixes * better warnings, fix ci failing * [autofix.ci] apply automated fixes * feat: log obtained version * [autofix.ci] apply automated fixes * build: bump version * [autofix.ci] apply automated fixes * fix: add .zip extension if it's not present Workaround for https://github.com/actions/toolkit/issues/1179 Fixes https://github.com/oven-sh/setup-bun/issues/79 * [autofix.ci] apply automated fixes * docs: add comment for easier understanding * ci: more readable version * ci: match name * docs: add package.json and .tool-versions to bun-version-file examples * ci: add cache test * ci: install another pkg for cache test * ci: install more pkgs for cache test * ci: block all trusted deps in cache test * ci: more deps for cache test * ci: cache test should cache * refactor: dont try all files if not defined * [autofix.ci] apply automated fixes * ci: remove cache test * feat: support .bunrc * [autofix.ci] apply automated fixes * refactor: .bun-version instead .bunrc * [autofix.ci] apply automated fixes * feat: add bun paths and url to output Fixes https://github.com/oven-sh/setup-bun/issues/81 * [autofix.ci] apply automated fixes * ci: test for .bun-version * feat: make .bun-version as default in bun-version-file * ci: remove cache before test * ci: remove cache before test * ci: remove cache before test * ci: remove cache before test --------- Co-authored-by: Ade Hery Shopyan <51158020+adeherysh@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
43b2dc9ae8
commit
ef00e4ac8e
10 changed files with 228 additions and 164 deletions
|
@ -13,7 +13,7 @@ import { downloadTool, extractZip } from "@actions/tool-cache";
|
|||
import { getExecOutput } from "@actions/exec";
|
||||
import { writeBunfig } from "./bunfig";
|
||||
import { saveState } from "@actions/core";
|
||||
import { retry } from "./utils";
|
||||
import { addExtension, retry } from "./utils";
|
||||
|
||||
export type Input = {
|
||||
customUrl?: string;
|
||||
|
@ -30,6 +30,8 @@ export type Input = {
|
|||
export type Output = {
|
||||
version: string;
|
||||
revision: string;
|
||||
bunPath: string;
|
||||
url: string;
|
||||
cacheHit: boolean;
|
||||
};
|
||||
|
||||
|
@ -111,6 +113,8 @@ export default async (options: Input): Promise<Output> => {
|
|||
return {
|
||||
version,
|
||||
revision,
|
||||
bunPath,
|
||||
url,
|
||||
cacheHit,
|
||||
};
|
||||
};
|
||||
|
@ -119,7 +123,8 @@ async function downloadBun(
|
|||
url: string,
|
||||
bunPath: string
|
||||
): Promise<string | undefined> {
|
||||
const zipPath = await downloadTool(url);
|
||||
// Workaround for https://github.com/oven-sh/setup-bun/issues/79 and https://github.com/actions/toolkit/issues/1179
|
||||
const zipPath = addExtension(await downloadTool(url), ".zip");
|
||||
const extractedZipPath = await extractZip(zipPath);
|
||||
const extractedBunPath = await extractBun(extractedZipPath);
|
||||
try {
|
||||
|
|
60
src/index.ts
60
src/index.ts
|
@ -1,75 +1,27 @@
|
|||
import { tmpdir } from "node:os";
|
||||
import { join } from "node:path";
|
||||
import { existsSync, readFileSync } from "node:fs";
|
||||
import {
|
||||
getInput,
|
||||
setOutput,
|
||||
setFailed,
|
||||
warning,
|
||||
getBooleanInput,
|
||||
} from "@actions/core";
|
||||
import { getInput, setOutput, setFailed, getBooleanInput } from "@actions/core";
|
||||
import runAction from "./action.js";
|
||||
import { readVersionFromFile } from "./utils.js";
|
||||
|
||||
if (!process.env.RUNNER_TEMP) {
|
||||
process.env.RUNNER_TEMP = tmpdir();
|
||||
}
|
||||
|
||||
function readVersionFromPackageJson(): string | undefined {
|
||||
const cwd = process.env.GITHUB_WORKSPACE;
|
||||
if (!cwd) {
|
||||
return;
|
||||
}
|
||||
const path = join(cwd, "package.json");
|
||||
try {
|
||||
if (!existsSync(path)) {
|
||||
return;
|
||||
}
|
||||
const { packageManager } = JSON.parse(readFileSync(path, "utf8"));
|
||||
if (!packageManager?.includes("bun@")) {
|
||||
return;
|
||||
}
|
||||
const [_, version] = packageManager.split("bun@");
|
||||
return version;
|
||||
} catch (error) {
|
||||
const { message } = error as Error;
|
||||
warning(`Failed to read package.json: ${message}`);
|
||||
}
|
||||
}
|
||||
|
||||
function readVersionFromToolVersions(): string | undefined {
|
||||
const cwd = process.env.GITHUB_WORKSPACE;
|
||||
if (!cwd) {
|
||||
return;
|
||||
}
|
||||
const path = join(cwd, ".tool-versions");
|
||||
try {
|
||||
if (!existsSync(path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const match = readFileSync(path, "utf8").match(/^bun\s(?<version>.*?)$/m);
|
||||
|
||||
return match?.groups?.version;
|
||||
} catch (error) {
|
||||
const { message } = error as Error;
|
||||
warning(`Failed to read .tool-versions: ${message}`);
|
||||
}
|
||||
}
|
||||
|
||||
runAction({
|
||||
version:
|
||||
getInput("bun-version") ||
|
||||
readVersionFromPackageJson() ||
|
||||
readVersionFromToolVersions() ||
|
||||
readVersionFromFile(getInput("bun-version-file")) ||
|
||||
undefined,
|
||||
customUrl: getInput("bun-download-url") || undefined,
|
||||
registryUrl: getInput("registry-url") || undefined,
|
||||
scope: getInput("scope") || undefined,
|
||||
noCache: getBooleanInput("no-cache") || false,
|
||||
})
|
||||
.then(({ version, revision, cacheHit }) => {
|
||||
.then(({ version, revision, bunPath, url, cacheHit }) => {
|
||||
setOutput("bun-version", version);
|
||||
setOutput("bun-revision", revision);
|
||||
setOutput("bun-path", bunPath);
|
||||
setOutput("bun-download-url", url);
|
||||
setOutput("cache-hit", cacheHit);
|
||||
process.exit(0);
|
||||
})
|
||||
|
|
64
src/utils.ts
64
src/utils.ts
|
@ -1,3 +1,8 @@
|
|||
import { debug, warning } from "@actions/core";
|
||||
import { info } from "node:console";
|
||||
import { existsSync, readFileSync, renameSync } from "node:fs";
|
||||
import { join, basename } from "node:path";
|
||||
|
||||
export function retry<T>(
|
||||
fn: () => Promise<T>,
|
||||
retries: number,
|
||||
|
@ -12,3 +17,62 @@ export function retry<T>(
|
|||
);
|
||||
});
|
||||
}
|
||||
|
||||
export function addExtension(path: string, ext: string): string {
|
||||
if (!path.endsWith(ext)) {
|
||||
renameSync(path, path + ext);
|
||||
return path + ext;
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
const FILE_VERSION_READERS = {
|
||||
"package.json": (content: string) =>
|
||||
JSON.parse(content).packageManager?.split("bun@")?.[1],
|
||||
".tool-versions": (content: string) =>
|
||||
content.match(/^bun\s?(?<version>.*?)$/m)?.groups?.version,
|
||||
".bumrc": (content: string) => content, // https://github.com/owenizedd/bum
|
||||
".bun-version": (content: string) => content,
|
||||
};
|
||||
|
||||
export function readVersionFromFile(file: string): string | undefined {
|
||||
const cwd = process.env.GITHUB_WORKSPACE;
|
||||
if (!cwd) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!file) {
|
||||
return;
|
||||
}
|
||||
|
||||
debug(`Reading version from ${file}`);
|
||||
|
||||
const path = join(cwd, file);
|
||||
const base = basename(file);
|
||||
|
||||
if (!existsSync(path)) {
|
||||
warning(`File ${path} not found`);
|
||||
return;
|
||||
}
|
||||
|
||||
const reader = FILE_VERSION_READERS[base] ?? (() => undefined);
|
||||
|
||||
let output: string | undefined;
|
||||
try {
|
||||
output = reader(readFileSync(path, "utf8"))?.trim();
|
||||
|
||||
if (!output) {
|
||||
warning(`Failed to read version from ${file}`);
|
||||
return;
|
||||
}
|
||||
} catch (error) {
|
||||
const { message } = error as Error;
|
||||
warning(`Failed to read ${file}: ${message}`);
|
||||
} finally {
|
||||
if (output) {
|
||||
info(`Obtained version ${output} from ${file}`);
|
||||
return output;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue