feat: bundle plugin src/ on demand via esbuild

This commit is contained in:
Linus Rath
2026-05-05 18:35:22 +02:00
parent 3e336d459c
commit 1b0ca8967e
13 changed files with 2040 additions and 173 deletions
+16 -6
View File
@@ -19,6 +19,8 @@ interface PluginEntry {
permissions: string[];
installedAt: string;
updatedAt: string;
/** True when loaded from PLUGIN_DEV_DIR (read-only, managed via filesystem) */
dev?: boolean;
}
export default function AdminPluginsPage() {
@@ -396,6 +398,11 @@ export default function AdminPluginsPage() {
<span className={`text-xs px-1.5 py-0.5 rounded ${plugin.enabled ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-950/30 dark:text-emerald-400' : 'bg-muted text-muted-foreground'}`}>
{plugin.enabled ? 'Enabled' : 'Disabled'}
</span>
{plugin.dev && (
<span className="text-xs px-1.5 py-0.5 rounded bg-violet-100 text-violet-700 dark:bg-violet-950/30 dark:text-violet-400" title="Loaded from PLUGIN_DEV_DIR — managed via filesystem">
Dev
</span>
)}
{plugin.forceEnabled && (
<span className="text-xs px-1.5 py-0.5 rounded bg-amber-100 text-amber-700 dark:bg-amber-950/30 dark:text-amber-400 flex items-center gap-1">
<Lock className="w-3 h-3" /> Forced
@@ -428,22 +435,25 @@ export default function AdminPluginsPage() {
</Link>
<button
onClick={() => toggleForceEnabled(plugin.id, !plugin.forceEnabled)}
title={plugin.forceEnabled ? 'Remove force-enable (users can disable)' : 'Force enable (users cannot disable)'}
className={`p-2 rounded-md transition-colors ${plugin.forceEnabled ? 'bg-amber-100 text-amber-700 hover:bg-amber-200 dark:bg-amber-950/30 dark:text-amber-400 dark:hover:bg-amber-950/50' : 'hover:bg-accent text-muted-foreground hover:text-foreground'}`}
disabled={plugin.dev}
title={plugin.dev ? 'Dev plugins are managed via filesystem' : plugin.forceEnabled ? 'Remove force-enable (users can disable)' : 'Force enable (users cannot disable)'}
className={`p-2 rounded-md transition-colors disabled:opacity-40 disabled:cursor-not-allowed ${plugin.forceEnabled ? 'bg-amber-100 text-amber-700 hover:bg-amber-200 dark:bg-amber-950/30 dark:text-amber-400 dark:hover:bg-amber-950/50' : 'hover:bg-accent text-muted-foreground hover:text-foreground'}`}
>
{plugin.forceEnabled ? <Lock className="w-4 h-4" /> : <LockOpen className="w-4 h-4" />}
</button>
<button
onClick={() => togglePlugin(plugin.id, !plugin.enabled)}
title={plugin.enabled ? 'Disable' : 'Enable'}
className="p-2 rounded-md hover:bg-accent text-muted-foreground hover:text-foreground transition-colors"
disabled={plugin.dev}
title={plugin.dev ? 'Dev plugins are always enabled' : plugin.enabled ? 'Disable' : 'Enable'}
className="p-2 rounded-md hover:bg-accent text-muted-foreground hover:text-foreground transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent"
>
<Power className="w-4 h-4" />
</button>
<button
onClick={() => deletePlugin(plugin.id, plugin.name)}
title="Remove"
className="p-2 rounded-md hover:bg-destructive/10 text-muted-foreground hover:text-destructive transition-colors"
disabled={plugin.dev}
title={plugin.dev ? 'Delete the folder in PLUGIN_DEV_DIR to remove' : 'Remove'}
className="p-2 rounded-md hover:bg-destructive/10 text-muted-foreground hover:text-destructive transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-muted-foreground"
>
<Trash2 className="w-4 h-4" />
</button>