This repository has been archived on 2026-08-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
pi-web/pi-web-plugins/workspace-tasks/workspaceTasksClient.ts
T

66 lines
2.3 KiB
TypeScript

import { TASKS_CONFIG_PATH, parseTasksConfigText, type WorkspaceTasksConfig } from "./config.js";
export const tasksConfigMissingMessage = "No workspace tasks configured here.";
export const tasksConfigMissingHint = `${TASKS_CONFIG_PATH} is optional. Create it in this workspace if you want custom tasks.`;
export const tasksConfigUnavailableMessage = "Could not load workspace tasks.";
export const tasksConfigRefreshHint = `Fix ${TASKS_CONFIG_PATH}, then click Refresh.`;
const missingWorkspaceFileError = "Path does not exist";
export interface WorkspaceTasksFileReader {
readFile(path: string): Promise<WorkspaceTasksFileContent>;
}
interface WorkspaceTasksFileContent {
content: string;
truncated: boolean;
binary: boolean;
}
export type WorkspaceTasksConfigLoadResult =
| { kind: "loaded"; config: WorkspaceTasksConfig; path: string }
| { kind: "missing"; message: string; hint: string }
| { kind: "unavailable"; message: string; hint: string; detail?: string };
export async function loadWorkspaceTasksConfig(files: WorkspaceTasksFileReader): Promise<WorkspaceTasksConfigLoadResult> {
let file: WorkspaceTasksFileContent;
try {
file = await files.readFile(TASKS_CONFIG_PATH);
} catch (error) {
if (errorMessage(error) === missingWorkspaceFileError) return missing();
return unavailable(`Unable to read ${TASKS_CONFIG_PATH}: ${formatUnknownError(error)}`);
}
if (file.binary) return unavailable(`${TASKS_CONFIG_PATH} must be a text file`);
if (file.truncated) return unavailable(`${TASKS_CONFIG_PATH} is too large and was truncated`);
const result = parseTasksConfigText(file.content);
if (!result.ok) return unavailable(result.error);
return { kind: "loaded", config: result.config, path: TASKS_CONFIG_PATH };
}
function missing(): WorkspaceTasksConfigLoadResult {
return {
kind: "missing",
message: tasksConfigMissingMessage,
hint: tasksConfigMissingHint,
};
}
function unavailable(detail: string): WorkspaceTasksConfigLoadResult {
return {
kind: "unavailable",
message: tasksConfigUnavailableMessage,
hint: tasksConfigRefreshHint,
detail,
};
}
function errorMessage(error: unknown): string | undefined {
return error instanceof Error ? error.message : undefined;
}
function formatUnknownError(error: unknown): string {
return error instanceof Error ? error.message : String(error);
}