Documentation
¶
Overview ¶
Package plugins provides a public API for pgsquash plugin management.
This package exports plugin registration, detection, and compatibility functionality for use by external tools while keeping the internal plugin implementation details private. Detection and compatibility results are produced by the same plugin implementations and conflict-resolution logic the squashing engine uses, so they always agree with an actual squash run.
Available Plugins ¶
Built-in plugins:
- Supabase: RLS policy optimization, auth schema handling, storage integration
- Clerk: JWT v2 support, organization handling, user ID preservation
- Prisma: Migration table handling, shadow database optimizations
- Drizzle: Identity column preference, sequence optimization
Basic Usage ¶
Register all built-in plugins:
if err := plugins.RegisterDefault(); err != nil {
log.Fatal(err)
}
Plugin Detection ¶
Detect which plugins are applicable to your migrations:
migrations := []string{
"CREATE TABLE users (id SERIAL PRIMARY KEY);",
"CREATE POLICY user_select ON users USING (auth.uid() = id);",
}
result, err := plugins.DetectPlugins(ctx, migrations)
if err != nil {
log.Fatal(err)
}
for _, plugin := range result.Detected {
fmt.Printf("Detected: %s (priority %d)\n", plugin.Name, plugin.Priority)
}
Compatibility Checking ¶
Check compatibility between detected plugins. Conflicts are resolved by priority exactly as during squashing (e.g. Clerk 95 excludes Supabase 90):
matrix, err := plugins.CheckCompatibility([]string{"supabase", "clerk"})
if err != nil {
log.Fatal(err)
}
for _, warning := range matrix.Warnings {
log.Printf("Warning: %s\n", warning)
}
Plugin Information ¶
Get information about available plugins:
for _, plugin := range plugins.GetAvailablePlugins() {
fmt.Printf("%s (priority %d)\n", plugin.Name, plugin.Priority)
}
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func RegisterDefault ¶
func RegisterDefault() error
RegisterDefault registers all built-in pgsquash plugins with the global plugin registry:
- Clerk (JWT v2 auth)
- Supabase (RLS policies, storage, auth)
- Prisma (ORM migrations)
- Drizzle (ORM migrations)
This should be called during application initialization, typically in init().
Example:
if err := plugins.RegisterDefault(); err != nil {
log.Printf("Warning: Some plugins failed to register: %v", err)
}
Types ¶
type CompatibilityMatrix ¶
type CompatibilityMatrix struct {
Compatible []string `json:"compatible"`
Incompatible []string `json:"incompatible"`
Warnings []string `json:"warnings"`
Details map[string]string `json:"details"` // Plugin name -> compatibility note
}
CompatibilityMatrix describes plugin compatibility after priority-based conflict resolution, matching the resolution the squashing engine applies.
func CheckCompatibility ¶
func CheckCompatibility(pluginNames []string) (*CompatibilityMatrix, error)
CheckCompatibility checks compatibility between plugins using the same priority-based conflict resolution the plugin registry applies during squashing: each plugin's GetConflictingPlugins() is honored and, on conflict, the higher-priority plugin wins (e.g. Clerk 95 excludes Supabase 90).
type DetectionResult ¶
type DetectionResult struct {
Detected []PluginInfo `json:"detected"`
Count int `json:"count"`
Details map[string][]string `json:"details"` // Plugin name -> detected patterns
}
DetectionResult contains the results of plugin detection
func DetectPlugins ¶
func DetectPlugins(ctx context.Context, migrations []string) (*DetectionResult, error)
DetectPlugins analyzes SQL migrations and detects which plugins are applicable.
Migrations are parsed with the same parser the squashing engine uses, and each built-in plugin's own Detect implementation runs over the parsed statements — so detection results here always agree with the plugins activated during an actual squash.
type PluginInfo ¶
type PluginInfo struct {
Name string `json:"name"`
Priority int `json:"priority"`
ConflictsWith []string `json:"conflicts_with"`
RequiredExtensions []string `json:"required_extensions"`
Detected bool `json:"detected"`
}
PluginInfo describes a plugin as reported by the plugin implementation itself.
func GetAvailablePlugins ¶
func GetAvailablePlugins() []PluginInfo
GetAvailablePlugins returns information about all built-in plugins, derived from the plugin implementations themselves.