fix: keep plugin templates separate from system templates

This commit is contained in:
mirivlad 2026-06-04 03:34:18 +08:00
parent a526661825
commit 0c0b0d98c7
2 changed files with 34 additions and 40 deletions

View File

@ -4,7 +4,6 @@ import (
"encoding/json"
"os"
"path/filepath"
"strings"
)
// Meta is the plugin.json descriptor.
@ -85,13 +84,9 @@ func (m *Manager) Active() []Plugin {
return out
}
// Templates returns all templates from all active plugins + builtins.
// Templates returns all templates from active plugins.
func (m *Manager) Templates() []TemplateDefinition {
var out []TemplateDefinition
// Built-in templates.
for _, t := range builtinTemplates {
out = append(out, t)
}
// Plugin templates.
for _, p := range m.Active() {
for _, tmplName := range p.Meta.Templates {
@ -182,37 +177,3 @@ func (m *Manager) MigrationFiles() []string {
}
return out
}
// Silence unused strings import.
var _ = strings.ToLower
// builtinTemplates are shipped with the application.
var builtinTemplates = loadBuiltinTemplates()
func loadBuiltinTemplates() []TemplateDefinition {
var out []TemplateDefinition
dir := "internal/core/plugins/builtin/templates"
entries, err := os.ReadDir(dir)
if err != nil {
return out
}
for _, e := range entries {
if e.IsDir() || !strings.HasSuffix(e.Name(), ".json") {
continue
}
data, err := os.ReadFile(filepath.Join(dir, e.Name()))
if err != nil {
continue
}
var tmpl TemplateDefinition
if err := json.Unmarshal(data, &tmpl); err != nil {
continue
}
if tmpl.Name == "" {
tmpl.Name = strings.TrimSuffix(e.Name(), ".json")
}
tmpl.Plugin = "builtin"
out = append(out, tmpl)
}
return out
}

View File

@ -160,3 +160,36 @@ func TestNoPluginsDir(t *testing.T) {
t.Errorf("plugins = %d, want 0", len(mgr.Plugins()))
}
}
func TestTemplatesDoesNotLoadBuiltinsFromWorkingDirectory(t *testing.T) {
root := setupPluginDir(t, nil)
cwd := t.TempDir()
builtinDir := filepath.Join(cwd, "internal", "core", "plugins", "builtin", "templates")
if err := os.MkdirAll(builtinDir, 0o750); err != nil {
t.Fatalf("mkdir fake builtin dir: %v", err)
}
if err := os.WriteFile(filepath.Join(builtinDir, "fake.json"), []byte(`{
"name": "Fake Builtin",
"root_type": "folder",
"tree": []
}`), 0o640); err != nil {
t.Fatalf("write fake builtin template: %v", err)
}
oldWD, err := os.Getwd()
if err != nil {
t.Fatalf("getwd: %v", err)
}
t.Cleanup(func() {
_ = os.Chdir(oldWD)
})
if err := os.Chdir(cwd); err != nil {
t.Fatalf("chdir: %v", err)
}
mgr := NewManager(root)
mgr.Discover()
if got := len(mgr.Templates()); got != 0 {
t.Fatalf("Templates loaded %d working-directory builtin templates, want 0", got)
}
}