1 import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
2 import { homedir } from "os";
3 import { join } from "path";
4 import Logger from "../logger.mjs";
6 export interface UnixConfig {
7 sdks: { [version: string]: SDKPaths };
10 export interface SDKPaths {
12 toolchainPath: string;
15 export default class UnixSDKManager {
16 public static isValidVersion(version: string): boolean {
17 const pattern = /^\d+\.\d+\.\d+$/;
19 return pattern.test(version);
22 public static saveConfig(config: UnixConfig): void {
24 this.saveConfigToFile(config, UnixSDKManager.configFile());
26 Logger.log(`Failed to save unix sdks: ${(error as Error).message}`);
30 private static saveConfigToFile(config: UnixConfig, file: string): void {
31 const jsonData = JSON.stringify(config, null, 2);
32 writeFileSync(file, jsonData);
35 public static loadConfig(): UnixConfig | undefined {
37 return this.loadConfigFromFile(UnixSDKManager.configFile());
39 Logger.log(`Failed to load unix sdks: ${(error as Error).message}`);
45 private static loadConfigFromFile(file: string): UnixConfig | undefined {
47 const jsonData = readFileSync(file, "utf8");
49 return JSON.parse(jsonData) as UnixConfig;
56 * Returns path to config file depending on operating system.
57 * (Supported: macOS, Linux)
59 * @returns Path to config file
60 * @throws Config directory cannot be created
62 private static configFile(): string {
63 if (process.platform === "darwin") {
64 const appSupportDir = join(homedir(), "Library", "Application Support");
65 const configDir = join(appSupportDir, "PicoSDK");
66 if (!existsSync(configDir)) {
68 mkdirSync(configDir, { recursive: true });
70 throw new Error(`Failed to create config directory`);
74 return join(configDir, "sdks.json");
75 } else if (process.platform === "linux") {
76 const homeDir = homedir();
78 throw new Error("Unable to determine home directory");
80 const configDir = join(homeDir, ".config", "PicoSDK");
82 return join(configDir, "sdks.json");
84 throw new Error("Unsupported operating system");