mirror of
https://github.com/oven-sh/setup-bun.git
synced 2025-07-23 13:13:17 +08:00
82 lines
2.0 KiB
TypeScript
82 lines
2.0 KiB
TypeScript
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
import { info } from "@actions/core";
|
|
import { parse, stringify } from "@iarna/toml";
|
|
import { Registry } from "./registry";
|
|
|
|
type BunfigConfig = {
|
|
install?: {
|
|
registry?: {
|
|
url: string;
|
|
token?: string;
|
|
};
|
|
scopes?: Record<string, { url: string; token?: string }>;
|
|
};
|
|
[key: string]: any;
|
|
};
|
|
|
|
export function writeBunfig(path: string, registries: Registry[]): void {
|
|
if (!registries.length) {
|
|
return;
|
|
}
|
|
|
|
let globalRegistryCount = 0;
|
|
registries.forEach((registry) => {
|
|
try {
|
|
new URL(registry.url);
|
|
} catch {
|
|
throw new Error(`Invalid registry URL: ${registry.url}`);
|
|
}
|
|
|
|
if (!registry.scope) {
|
|
globalRegistryCount++;
|
|
}
|
|
});
|
|
|
|
if (globalRegistryCount > 1) {
|
|
throw new Error("You can't have more than one global registry.");
|
|
}
|
|
|
|
info(`Writing bunfig.toml to '${path}'.`);
|
|
|
|
let config: BunfigConfig = {};
|
|
if (existsSync(path)) {
|
|
try {
|
|
const content = readFileSync(path, { encoding: "utf-8" });
|
|
config = parse(content) as BunfigConfig;
|
|
} catch (error) {
|
|
info(`Error reading existing bunfig: ${error.message}`);
|
|
config = {};
|
|
}
|
|
}
|
|
|
|
config.install = config?.install || {};
|
|
config.install.scopes = config?.install.scopes || {};
|
|
|
|
const globalRegistry = registries.find((r) => !r.scope);
|
|
if (globalRegistry) {
|
|
config.install.registry = {
|
|
url: globalRegistry.url,
|
|
...(globalRegistry.token ? { token: globalRegistry.token } : {}),
|
|
};
|
|
}
|
|
|
|
for (const registry of registries) {
|
|
if (registry.scope) {
|
|
const scopeName = registry.scope.startsWith("@")
|
|
? registry.scope.toLowerCase()
|
|
: `@${registry.scope.toLowerCase()}`;
|
|
|
|
config.install.scopes[scopeName] = {
|
|
url: registry.url,
|
|
...(registry.token ? { token: registry.token } : {}),
|
|
};
|
|
}
|
|
}
|
|
|
|
if (Object.keys(config.install.scopes).length === 0) {
|
|
delete config.install.scopes;
|
|
}
|
|
|
|
writeFileSync(path, stringify(config), { encoding: "utf8" });
|
|
}
|