diff --git a/internal/core/plugins/manager.go b/internal/core/plugins/manager.go index 0138969..bf71d51 100644 --- a/internal/core/plugins/manager.go +++ b/internal/core/plugins/manager.go @@ -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 -} diff --git a/internal/core/plugins/manager_test.go b/internal/core/plugins/manager_test.go index 799e15d..2e7c522 100644 --- a/internal/core/plugins/manager_test.go +++ b/internal/core/plugins/manager_test.go @@ -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) + } +}