UNPKG

supa-seed

Version:

A constraint-aware, framework-agnostic database seeding framework with deep PostgreSQL business logic discovery and MakerKit integration support

249 lines 8.74 kB
/** * Framework Strategy Interface * Defines the contract for framework-specific seeding strategies */ import type { createClient } from '@supabase/supabase-js'; import type { ConstraintHandler, ConstraintHandlingResult, ConstraintFix, TableConstraints } from '../../features/analysis/constraint-types'; import type { BusinessLogicAnalysisResult, RLSComplianceOptions, RLSComplianceResult, UserContext } from '../../features/analysis/business-logic-types'; import type { RelationshipAnalysisResult } from '../../features/analysis/relationship-analyzer'; import type { JunctionTableDetectionResult, JunctionSeedingOptions, JunctionSeedingResult } from '../../schema/junction-table-handler'; import type { DependencyGraph } from '../../schema/dependency-graph'; import type { TenantDiscoveryResult, TenantSeedingResult, TenantIsolationReport, TenantDataGenerationOptions, TenantInfo, TenantScopeInfo } from '../../schema/tenant-types'; import type { StorageIntegrationResult, StorageConfig, StoragePermissionCheck, StorageQuotaInfo, MediaAttachment } from '../generation/storage/storage-types'; type SupabaseClient = ReturnType<typeof createClient>; export interface DatabaseSchema { tables: TableInfo[]; functions: FunctionInfo[]; triggers: TriggerInfo[]; constraints: ConstraintInfo[]; } export interface TableInfo { name: string; columns: ColumnInfo[]; relationships: RelationshipInfo[]; } export interface ColumnInfo { name: string; type: string; nullable: boolean; defaultValue?: any; } export interface RelationshipInfo { type: 'foreign_key' | 'one_to_many' | 'many_to_many'; targetTable: string; targetColumn: string; sourceColumn: string; } export interface FunctionInfo { name: string; schema: string; arguments: string[]; returnType: string; } export interface TriggerInfo { name: string; table: string; event: 'INSERT' | 'UPDATE' | 'DELETE'; function: string; } export interface ConstraintInfo { name: string; table: string; type: 'check' | 'foreign_key' | 'unique' | 'primary_key'; definition: string; } export interface FrameworkDetectionResult { framework: string; version?: string; confidence: number; detectedFeatures: string[]; recommendations: string[]; } export interface UserData { email: string; name: string; username?: string; avatar?: string; bio?: string; password?: string; metadata?: Record<string, any>; } export interface User { id: string; email: string; name: string; username?: string; avatar?: string; created_at: string; metadata?: Record<string, any>; } export type { ConstraintHandler, ConstraintHandlingResult, ConstraintFix, TableConstraints, ConstraintDiscoveryResult } from '../../features/analysis/constraint-types'; export interface StrategyConstraintResult { success: boolean; tables: TableConstraints[]; totalConstraints: number; confidence: number; errors: string[]; warnings: string[]; recommendations: string[]; businessRules?: BusinessRule[]; } export interface BusinessRule { id: string; name: string; type: 'validation' | 'transformation' | 'dependency' | 'business_logic'; table: string; condition: string; action: 'allow' | 'deny' | 'modify' | 'require'; errorMessage?: string; autoFix?: { type: 'set_field' | 'create_dependency' | 'skip_operation' | 'modify_workflow' | 'sql' | 'config' | 'data_modification'; description: string; sql?: string; confidence: number; impact?: 'low' | 'medium' | 'high'; }; confidence: number; sqlPattern: string; dependencies: string[]; } export interface SeedingStrategy { /** * Unique name for this strategy */ name: string; /** * Detect if this strategy applies to the given database schema */ detect(schema: DatabaseSchema): Promise<FrameworkDetectionResult>; /** * Create a user using the framework's intended flow */ createUser(data: UserData): Promise<User>; /** * Handle constraints for a specific table and data */ handleConstraints(table: string, data: any): Promise<ConstraintHandlingResult>; /** * Discover and analyze constraints for this strategy */ discoverConstraints?(tableNames?: string[]): Promise<StrategyConstraintResult>; /** * Get framework-specific constraint handlers */ getConstraintHandlers?(): ConstraintHandler[]; /** * Apply constraint-aware data transformation */ applyConstraintFixes?(table: string, data: any, constraints: TableConstraints): Promise<ConstraintHandlingResult>; /** * Analyze business logic patterns for this strategy */ analyzeBusinessLogic?(): Promise<BusinessLogicAnalysisResult>; /** * Seed data with RLS compliance */ seedWithRLSCompliance?(table: string, data: any[], userContext?: UserContext): Promise<RLSComplianceResult>; /** * Get RLS compliance options for this strategy */ getRLSComplianceOptions?(): RLSComplianceOptions; /** * Analyze database relationships for dependency-aware seeding */ analyzeRelationships?(): Promise<RelationshipAnalysisResult>; /** * Get dependency graph for seeding order optimization */ getDependencyGraph?(): Promise<DependencyGraph>; /** * Detect and handle junction tables for many-to-many relationships */ detectJunctionTables?(): Promise<JunctionTableDetectionResult>; /** * Seed junction tables with proper relationship data */ seedJunctionTable?(tableName: string, options?: Partial<JunctionSeedingOptions>): Promise<JunctionSeedingResult>; /** * Get optimal seeding order based on dependencies */ getSeedingOrder?(): Promise<string[]>; /** * Discover tenant-scoped tables and relationships */ discoverTenantScopes?(): Promise<TenantDiscoveryResult>; /** * Create tenant-aware data with proper tenant isolation */ createTenantScopedData?(tenantId: string, tableName: string, data: any[], options?: Partial<TenantDataGenerationOptions>): Promise<any[]>; /** * Generate tenant accounts (personal and team) */ generateTenantAccounts?(count: number, options?: Partial<TenantDataGenerationOptions>): Promise<TenantInfo[]>; /** * Validate tenant boundary isolation */ validateTenantIsolation?(tenantId: string): Promise<TenantIsolationReport>; /** * Seed data across multiple tenants with proper isolation */ seedMultiTenantData?(tenants: TenantInfo[], options?: Partial<TenantDataGenerationOptions>): Promise<TenantSeedingResult>; /** * Get tenant scope information for a table */ getTenantScopeInfo?(tableName: string): Promise<TenantScopeInfo | null>; /** * Integrate with Supabase Storage for file uploads and media management */ integrateWithStorage?(setupId: string, accountId?: string, config?: Partial<StorageConfig>): Promise<StorageIntegrationResult>; /** * Check storage permissions and RLS compliance */ checkStoragePermissions?(bucketName: string): Promise<StoragePermissionCheck>; /** * Get storage quota and usage information */ getStorageQuota?(bucketName: string): Promise<StorageQuotaInfo>; /** * Generate and upload media attachments for a specific entity */ generateMediaAttachments?(entityId: string, entityType: string, count?: number, config?: Partial<StorageConfig>): Promise<MediaAttachment[]>; /** * Get framework-specific storage configuration */ getStorageConfig?(): Partial<StorageConfig>; /** * Get recommendations for using this strategy */ getRecommendations(): string[]; /** * Check if this strategy supports a specific feature */ supportsFeature(feature: string): boolean; /** * Initialize the strategy with a Supabase client */ initialize(client: SupabaseClient): Promise<void>; /** * Get the priority of this strategy (higher = more specific) */ getPriority(): number; } export interface SeedingOptions { enableConstraintHandling?: boolean; enableBusinessLogicRespect?: boolean; enableRLSCompliance?: boolean; enableMultiTenant?: boolean; customMappings?: Record<string, Record<string, string>>; debug?: boolean; } export interface SeedingResult { success: boolean; data?: any; errors: string[]; warnings: string[]; appliedFixes: ConstraintFix[]; strategy: string; executionTime: number; } //# sourceMappingURL=strategy-interface.d.ts.map