Files
IdeaSDK/frontend/src/adapters/plugin.ts
Blomios a88307c5ff refactor(frontend,plugins): normalise les DTOs review backend et corrige le mock (#120)
- plugin.ts: normalizeReview() garantit issues/installable définis même si backend omet ces champs
- mock/index.ts: MockPluginGateway.uninstall() retourne removalOutcome pour cohérence avec le domaine
- domain/index.ts: PluginUninstallResult ajoute removalOutcome optionnel
- Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-01 19:12:16 +02:00

73 lines
2.4 KiB
TypeScript

/**
* Tauri adapter for {@link PluginGateway} (ticket #43, F1).
*
* Commands use snake_case (Tauri convention); payload keys are camelCase,
* consistent with the other adapters in this directory. Command names and
* envelope match the carnet §5 exactly — no contract improvised here.
*
* NOTE: The Tauri commands wired here are defined in the backend `app-tauri`
* crate (lots B1-B4, in progress in parallel on this branch). The mock gateway
* covers tests and offline dev today.
*/
import { invoke } from "@tauri-apps/api/core";
import type {
PluginAdmin,
PluginInstallResult,
PluginReview,
PluginRuntimeContributionCatalog,
PluginUninstallResult,
} from "@/domain";
import type { PluginGateway, ReviewPluginPackageInput } from "@/ports";
type TauriPluginReviewDto = Omit<PluginReview, "issues" | "installable"> & {
issues?: PluginReview["issues"];
installable?: boolean;
};
function normalizeReview(review: TauriPluginReviewDto): PluginReview {
return {
...review,
issues: review.issues ?? [],
installable: review.installable ?? true,
};
}
export class TauriPluginGateway implements PluginGateway {
listPlugins(): Promise<PluginAdmin[]> {
return invoke<PluginAdmin[]>("plugin_list_plugins");
}
async reviewPackage(input: ReviewPluginPackageInput): Promise<PluginReview> {
const review = await invoke<TauriPluginReviewDto>("plugin_review_package", {
input: { sourceKind: input.sourceKind, path: input.path },
});
return normalizeReview(review);
}
installFromArchive(path: string): Promise<PluginInstallResult> {
return invoke<PluginInstallResult>("plugin_install_from_archive", { path });
}
installFromDirectory(path: string): Promise<PluginInstallResult> {
return invoke<PluginInstallResult>("plugin_install_from_directory", { path });
}
setEnabled(pluginId: string, enabled: boolean): Promise<PluginAdmin> {
return invoke<PluginAdmin>("plugin_set_enabled", { pluginId, enabled });
}
uninstall(pluginId: string): Promise<PluginUninstallResult> {
return invoke<PluginUninstallResult>("plugin_uninstall", { pluginId });
}
listRuntimeContributions(): Promise<PluginRuntimeContributionCatalog> {
return invoke<PluginRuntimeContributionCatalog>("plugin_list_runtime_contributions");
}
async openPluginsFolder(pluginId?: string): Promise<void> {
await invoke("plugin_open_plugins_folder", { pluginId: pluginId ?? null });
}
}