supa-seed
Version:
A constraint-aware, framework-agnostic database seeding framework with deep PostgreSQL business logic discovery and MakerKit integration support
169 lines • 4.47 kB
TypeScript
/**
* Constraint-Aware Validation System
* Validates operations against actual database constraints before execution
* Prevents the constraint violations identified in beta testing
*/
import type { createClient } from '@supabase/supabase-js';
import { SchemaIntrospectionResult } from '../../schema/schema-introspector';
type SupabaseClient = ReturnType<typeof createClient>;
export interface ValidationRule {
id: string;
name: string;
description: string;
table: string;
column?: string;
type: 'not_null' | 'unique' | 'foreign_key' | 'check' | 'custom' | 'business_logic';
severity: 'error' | 'warning' | 'info';
sqlCheck: string;
parameters: string[];
errorMessage: string;
autoFix?: {
possible: boolean;
strategy: 'provide_default' | 'skip_field' | 'modify_value' | 'create_dependency';
fixValue?: any;
};
}
export interface ValidationContext {
operation: 'insert' | 'update' | 'delete';
table: string;
data: Record<string, any>;
userId?: string;
existingData?: Record<string, any>;
schemaInfo: SchemaIntrospectionResult;
}
export interface ValidationResult {
valid: boolean;
errors: ValidationError[];
warnings: ValidationWarning[];
autoFixes: AutoFix[];
constraintsChecked: number;
executionTime: number;
}
export interface ValidationError {
rule: string;
field?: string;
message: string;
severity: 'error' | 'warning';
constraint: string;
suggestedFix?: string;
blockExecution: boolean;
}
export interface ValidationWarning {
rule: string;
field?: string;
message: string;
impact: 'low' | 'medium' | 'high';
recommendation: string;
}
export interface AutoFix {
rule: string;
field: string;
originalValue: any;
fixedValue: any;
strategy: string;
applied: boolean;
}
export declare class ConstraintValidator {
private client;
private validationRules;
private schemaInfo;
constructor(client: SupabaseClient);
/**
* Initialize validator with schema information and build validation rules
*/
initialize(schemaInfo: SchemaIntrospectionResult): Promise<void>;
/**
* Validate data against all applicable constraints before operation
*/
validateOperation(context: ValidationContext): Promise<ValidationResult>;
/**
* Apply auto-fixes to data before operation
*/
applyAutoFixes(data: Record<string, any>, autoFixes: AutoFix[]): Promise<{
data: Record<string, any>;
appliedFixes: AutoFix[];
}>;
/**
* Build validation rules from schema constraints
*/
private buildValidationRules;
/**
* Build validation rules from database constraints
*/
private buildConstraintRules;
/**
* Build NOT NULL constraint rules
*/
private buildNotNullRules;
/**
* Build UNIQUE constraint rules
*/
private buildUniqueRules;
/**
* Build FOREIGN KEY constraint rules
*/
private buildForeignKeyRules;
/**
* Build CHECK constraint rules
*/
private buildCheckConstraintRules;
/**
* Build business logic constraint rules
*/
private buildBusinessLogicRules;
/**
* Build pattern-based validation rules
*/
private buildPatternRules;
/**
* Build user table specific rules
*/
private buildUserTableRules;
/**
* Execute a single validation rule
*/
private executeValidationRule;
/**
* Validate NOT NULL constraint
*/
private validateNotNull;
/**
* Validate UNIQUE constraint
*/
private validateUnique;
/**
* Validate FOREIGN KEY constraint
*/
private validateForeignKey;
/**
* Validate CHECK constraint
*/
private validateCheckConstraint;
/**
* Validate business logic constraint
*/
private validateBusinessLogic;
/**
* Validate custom rule
*/
private validateCustomRule;
/**
* Utility methods
*/
private getDefaultValueForColumn;
private getTotalRuleCount;
/**
* Get validation rules for a specific table
*/
getTableRules(tableName: string): ValidationRule[];
/**
* Get all validation rules
*/
getAllRules(): Map<string, ValidationRule[]>;
/**
* Clear validation cache
*/
clearCache(): void;
}
export {};
//# sourceMappingURL=constraint-validator.d.ts.map