supa-seed
Version:
A constraint-aware, framework-agnostic database seeding framework with deep PostgreSQL business logic discovery and MakerKit integration support
459 lines • 15.4 kB
TypeScript
/**
* Extension Configuration System
* Implements Task 3.5: Comprehensive extension configuration system with type-safe schemas, validation, and management utilities
*/
import type { ContentDomainType, PlatformArchitectureType } from '../features/detection/detection-types';
import type { UserArchetype } from '../archetypes/archetype-types';
/**
* Base extension configuration interface
*/
export interface BaseExtensionConfig {
/** Extension identifier */
id: string;
/** Human-readable name */
name: string;
/** Extension description */
description: string;
/** Extension version */
version: string;
/** Whether the extension is enabled */
enabled: boolean;
/** Extension author/maintainer */
author?: string;
/** Extension configuration schema version */
schemaVersion: string;
/** Extension dependencies */
dependencies?: string[];
/** Extension compatibility */
compatibility: {
/** Minimum SupaSeed version required */
minSupaSeedVersion: string;
/** Platform architectures this extension supports */
platforms: PlatformArchitectureType[];
/** Content domains this extension supports */
domains: ContentDomainType[];
};
}
/**
* Domain-specific extension configurations
*/
export interface OutdoorExtensionConfig extends BaseExtensionConfig {
id: 'outdoor';
domain: 'outdoor';
/** Outdoor domain specific settings */
settings: {
/** Activity types to generate */
activityTypes: ('hiking' | 'camping' | 'climbing' | 'biking' | 'skiing' | 'fishing' | 'hunting')[];
/** Gear categories to include */
gearCategories: ('backpacks' | 'tents' | 'clothing' | 'footwear' | 'electronics' | 'safety' | 'cooking')[];
/** Location types for activities */
locationTypes: ('national_park' | 'state_park' | 'wilderness' | 'urban' | 'coastal' | 'mountain' | 'desert')[];
/** Weather conditions to simulate */
weatherConditions: ('sunny' | 'rainy' | 'snowy' | 'windy' | 'foggy' | 'storm')[];
/** Seasonal preferences */
seasons: ('spring' | 'summer' | 'fall' | 'winter')[];
/** Difficulty levels for activities */
difficultyLevels: ('beginner' | 'intermediate' | 'advanced' | 'expert')[];
/** User archetypes specific to outdoor domain */
archetypes: OutdoorArchetype[];
};
/** Business logic parameters */
businessLogic: {
/** Trip planning constraints */
tripPlanning: {
/** Maximum trip duration in days */
maxTripDuration: number;
/** Minimum group size */
minGroupSize: number;
/** Maximum group size */
maxGroupSize: number;
/** Budget constraints */
budgetRange: {
min: number;
max: number;
};
};
/** Gear recommendation engine */
gearRecommendations: {
/** Enable weather-based recommendations */
weatherBased: boolean;
/** Enable activity-based recommendations */
activityBased: boolean;
/** Enable experience-based recommendations */
experienceBased: boolean;
};
/** Safety protocols */
safetyProtocols: {
/** Require emergency contacts */
requireEmergencyContacts: boolean;
/** Generate safety checklists */
generateSafetyChecklists: boolean;
/** Include weather alerts */
includeWeatherAlerts: boolean;
};
};
}
export interface SaaSExtensionConfig extends BaseExtensionConfig {
id: 'saas';
domain: 'saas';
settings: {
/** SaaS business models */
businessModels: ('freemium' | 'subscription' | 'usage_based' | 'enterprise' | 'marketplace')[];
/** Product categories */
productCategories: ('productivity' | 'communication' | 'analytics' | 'marketing' | 'development' | 'finance')[];
/** User tiers */
userTiers: ('free' | 'basic' | 'pro' | 'enterprise')[];
/** Feature flags and rollout strategies */
featureFlags: {
enabled: boolean;
rolloutStrategies: ('percentage' | 'user_based' | 'geography' | 'plan_based')[];
};
/** Multi-tenancy settings */
multiTenancy: {
enabled: boolean;
isolationLevel: 'shared' | 'dedicated' | 'hybrid';
tenantTypes: ('individual' | 'team' | 'organization' | 'enterprise')[];
};
};
businessLogic: {
/** Subscription management */
subscriptions: {
/** Billing cycles */
billingCycles: ('monthly' | 'quarterly' | 'annual')[];
/** Trial periods */
trialPeriods: number[];
/** Usage limits per tier */
usageLimits: Record<string, {
api_calls?: number;
storage?: number;
users?: number;
}>;
};
/** User onboarding flows */
onboarding: {
/** Multi-step onboarding */
multiStep: boolean;
/** Progressive profiling */
progressiveProfiling: boolean;
/** Feature tours */
featureTours: boolean;
};
/** Analytics and tracking */
analytics: {
/** User behavior tracking */
userBehavior: boolean;
/** Feature usage analytics */
featureUsage: boolean;
/** Conversion tracking */
conversionTracking: boolean;
};
};
}
export interface ECommerceExtensionConfig extends BaseExtensionConfig {
id: 'ecommerce';
domain: 'ecommerce';
settings: {
/** Product categories */
productCategories: ('electronics' | 'clothing' | 'home' | 'books' | 'sports' | 'beauty' | 'automotive')[];
/** Payment methods */
paymentMethods: ('credit_card' | 'paypal' | 'stripe' | 'apple_pay' | 'google_pay' | 'crypto')[];
/** Shipping methods */
shippingMethods: ('standard' | 'express' | 'overnight' | 'pickup' | 'digital')[];
/** Currency support */
currencies: ('USD' | 'EUR' | 'GBP' | 'CAD' | 'AUD' | 'JPY')[];
/** Inventory management */
inventory: {
/** Track inventory levels */
trackLevels: boolean;
/** Enable backorders */
enableBackorders: boolean;
/** Low stock alerts */
lowStockAlerts: boolean;
};
};
businessLogic: {
/** Pricing strategies */
pricing: {
/** Dynamic pricing */
dynamicPricing: boolean;
/** Volume discounts */
volumeDiscounts: boolean;
/** Seasonal pricing */
seasonalPricing: boolean;
/** A/B testing */
abTesting: boolean;
};
/** Order management */
orders: {
/** Order statuses */
statuses: ('pending' | 'processing' | 'shipped' | 'delivered' | 'cancelled' | 'returned')[];
/** Auto-fulfillment */
autoFulfillment: boolean;
/** Return policies */
returnPolicies: {
/** Return window in days */
returnWindow: number;
/** Restocking fees */
restockingFees: boolean;
};
};
/** Customer management */
customers: {
/** Loyalty programs */
loyaltyPrograms: boolean;
/** Customer segments */
segments: ('new' | 'regular' | 'vip' | 'inactive')[];
/** Personalization */
personalization: boolean;
};
};
}
export interface SocialExtensionConfig extends BaseExtensionConfig {
id: 'social';
domain: 'social';
settings: {
/** Social platform types */
platformTypes: ('general' | 'professional' | 'creative' | 'niche' | 'messaging')[];
/** Content types */
contentTypes: ('text' | 'image' | 'video' | 'audio' | 'link' | 'poll' | 'event')[];
/** Privacy levels */
privacyLevels: ('public' | 'friends' | 'private' | 'custom')[];
/** Interaction types */
interactionTypes: ('like' | 'comment' | 'share' | 'follow' | 'mention' | 'react')[];
/** Community features */
communityFeatures: {
/** Groups/communities */
groups: boolean;
/** Events */
events: boolean;
/** Messaging */
messaging: boolean;
/** Live streaming */
liveStreaming: boolean;
};
};
businessLogic: {
/** Content moderation */
moderation: {
/** Auto-moderation */
autoModeration: boolean;
/** Community reporting */
communityReporting: boolean;
/** Content filtering */
contentFiltering: boolean;
};
/** Engagement algorithms */
engagement: {
/** Feed algorithms */
feedAlgorithms: boolean;
/** Trending detection */
trendingDetection: boolean;
/** Recommendation engine */
recommendationEngine: boolean;
};
/** Privacy and security */
privacy: {
/** Data retention policies */
dataRetention: number;
/** User blocking */
userBlocking: boolean;
/** Content encryption */
contentEncryption: boolean;
};
};
}
/**
* Outdoor-specific user archetype
*/
export interface OutdoorArchetype extends UserArchetype {
domain: 'outdoor';
outdoorProfile: {
/** Experience level */
experienceLevel: 'beginner' | 'intermediate' | 'advanced' | 'expert';
/** Preferred activities */
preferredActivities: string[];
/** Gear ownership level */
gearOwnership: 'minimal' | 'moderate' | 'extensive' | 'professional';
/** Location preferences */
locationPreferences: string[];
/** Seasonal activity preferences */
seasonalPreferences: Record<string, string[]>;
};
}
/**
* Extension validation configuration
*/
export interface ExtensionValidationConfig {
/** Enable validation */
enabled: boolean;
/** Validation rules */
rules: {
/** Require all mandatory fields */
requireMandatoryFields: boolean;
/** Validate compatibility versions */
validateCompatibility: boolean;
/** Check dependency resolution */
checkDependencies: boolean;
/** Validate business logic constraints */
validateBusinessLogic: boolean;
};
/** Custom validation functions */
customValidators?: Array<(config: any) => {
valid: boolean;
errors: string[];
}>;
}
/**
* Extension template configuration
*/
export interface ExtensionTemplate {
/** Template identifier */
id: string;
/** Template name */
name: string;
/** Template description */
description: string;
/** Domain this template applies to */
domain: ContentDomainType;
/** Template configuration */
template: Partial<BaseExtensionConfig>;
/** Template variables */
variables?: Record<string, {
type: 'string' | 'number' | 'boolean' | 'array' | 'object';
description: string;
default?: any;
required: boolean;
}>;
}
/**
* Main extensions configuration interface
*/
export interface ExtensionsConfig {
/** Configuration metadata */
metadata: {
/** Configuration version */
version: string;
/** Last updated timestamp */
lastUpdated: Date;
/** Configuration author */
author?: string;
};
/** Global extension settings */
global: {
/** Enable extension system */
enabled: boolean;
/** Maximum number of active extensions */
maxActiveExtensions: number;
/** Extension loading timeout in ms */
loadingTimeout: number;
/** Enable extension hot-reloading */
hotReload: boolean;
};
/** Validation configuration */
validation: ExtensionValidationConfig;
/** Available extension templates */
templates: ExtensionTemplate[];
/** Active extensions configuration */
extensions: {
/** Outdoor domain extension */
outdoor?: OutdoorExtensionConfig;
/** SaaS domain extension */
saas?: SaaSExtensionConfig;
/** E-commerce domain extension */
ecommerce?: ECommerceExtensionConfig;
/** Social domain extension */
social?: SocialExtensionConfig;
/** Custom extensions */
[key: string]: BaseExtensionConfig | undefined;
};
/** Extension loading order */
loadOrder: string[];
/** Extension conflict resolution */
conflictResolution: {
/** Strategy for resolving conflicts */
strategy: 'first_wins' | 'last_wins' | 'merge' | 'manual';
/** Manual resolution rules */
manualRules?: Record<string, any>;
};
}
/**
* Extension configuration manager result
*/
export interface ExtensionConfigResult {
/** Whether the operation was successful */
success: boolean;
/** Result data */
data?: any;
/** Error messages */
errors: string[];
/** Warning messages */
warnings: string[];
/** Applied configuration */
appliedConfig?: ExtensionsConfig;
}
/**
* Extension configuration manager
*/
export declare class ExtensionConfigManager {
private config;
constructor(config: ExtensionsConfig);
/**
* Validate extension configuration
*/
validate(): ExtensionConfigResult;
/**
* Get extension by ID
*/
getExtension(id: string): BaseExtensionConfig | undefined;
/**
* Enable extension
*/
enableExtension(id: string): ExtensionConfigResult;
/**
* Disable extension
*/
disableExtension(id: string): ExtensionConfigResult;
/**
* Get enabled extensions
*/
getEnabledExtensions(): BaseExtensionConfig[];
/**
* Get extensions by domain
*/
getExtensionsByDomain(domain: ContentDomainType): BaseExtensionConfig[];
/**
* Create extension from template
*/
createFromTemplate(templateId: string, variables?: Record<string, any>): ExtensionConfigResult;
/**
* Simple variable substitution helper
*/
private substituteVariable;
/**
* Export configuration
*/
exportConfig(): ExtensionsConfig;
}
/**
* Create default extensions configuration
*/
export declare function createDefaultExtensionsConfig(): ExtensionsConfig;
/**
* Extension configuration utilities
*/
export declare const ExtensionConfigUtils: {
/**
* Merge extension configurations
*/
mergeConfigs(base: ExtensionsConfig, override: Partial<ExtensionsConfig>): ExtensionsConfig;
/**
* Validate extension ID format
*/
validateExtensionId(id: string): boolean;
/**
* Check version compatibility
*/
isVersionCompatible(requiredVersion: string, currentVersion: string): boolean;
};
export default ExtensionConfigManager;
//# sourceMappingURL=extension-config.d.ts.map