63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
import chalk from "chalk";
|
|
import type { ProjectTrustContext } from "../core/extensions/types.ts";
|
|
import type { AppMode } from "../core/project-trust.ts";
|
|
import type { SettingsManager } from "../core/settings-manager.ts";
|
|
import { showStartupInput, showStartupSelector } from "./startup-ui.ts";
|
|
|
|
export function createProjectTrustContext(options: {
|
|
cwd: string;
|
|
mode: AppMode;
|
|
settingsManager: SettingsManager;
|
|
hasUI: boolean;
|
|
}): ProjectTrustContext {
|
|
return {
|
|
cwd: options.cwd,
|
|
mode: options.mode === "interactive" ? "tui" : options.mode,
|
|
hasUI: options.hasUI,
|
|
ui: {
|
|
select: async (title, selectOptions) => {
|
|
if (!options.hasUI) {
|
|
return undefined;
|
|
}
|
|
if (options.mode !== "interactive") {
|
|
return undefined;
|
|
}
|
|
return showStartupSelector(
|
|
options.settingsManager,
|
|
title,
|
|
selectOptions.map((option) => ({ label: option, value: option })),
|
|
);
|
|
},
|
|
confirm: async (title, message) => {
|
|
if (!options.hasUI) {
|
|
return false;
|
|
}
|
|
if (options.mode !== "interactive") {
|
|
return false;
|
|
}
|
|
return (
|
|
(await showStartupSelector(options.settingsManager, `${title}\n${message}`, [
|
|
{ label: "Yes", value: true },
|
|
{ label: "No", value: false },
|
|
])) ?? false
|
|
);
|
|
},
|
|
input: async (title, placeholder) => {
|
|
if (!options.hasUI) {
|
|
return undefined;
|
|
}
|
|
if (options.mode !== "interactive") {
|
|
return undefined;
|
|
}
|
|
return showStartupInput(options.settingsManager, title, placeholder);
|
|
},
|
|
notify: (message, type = "info") => {
|
|
if (options.mode !== "interactive") {
|
|
const color = type === "error" ? chalk.red : type === "warning" ? chalk.yellow : chalk.cyan;
|
|
console.error(color(message));
|
|
}
|
|
},
|
|
},
|
|
};
|
|
}
|