import { EngagementThresholds, StatsConfig, AggregationConfig, StreakConfig, CheckInRules, AnalyticsConfig, NotificationConfig, TargetModelConfig, DeepPartial, EngagementLevel } from './types.js'; import 'mongoose'; /** * ClockIn Configuration * * Centralized configuration with sensible defaults. * All config is instance-scoped - no global state. * * @module @classytic/clockin/config */ /** * Engagement thresholds * Define visit counts for each engagement level */ declare const ENGAGEMENT_THRESHOLDS: EngagementThresholds; /** * Stats calculation configuration */ declare const STATS_CONFIG: StatsConfig; /** * Monthly aggregation configuration */ declare const AGGREGATION_CONFIG: AggregationConfig; /** * Streak calculation configuration */ declare const STREAK_CONFIG: StreakConfig; /** * Check-in validation rules */ declare const CHECK_IN_RULES: CheckInRules; /** * Analytics configuration */ declare const ANALYTICS_CONFIG: AnalyticsConfig; /** * Notification configuration */ declare const NOTIFICATION_CONFIG: NotificationConfig; /** * Default check-in method */ declare const DEFAULT_CHECK_IN_METHOD: "manual"; /** * Default record TTL in days */ declare const DEFAULT_RECORD_TTL_DAYS = 730; /** * Container interface for type-safe access */ interface ConfigContainer { has(key: string): boolean; get(key: string): T; } /** * Generate smart default config based on entity type. * * Built-in models (Employee, Membership, etc.) get optimized defaults. * Custom models get sensible time-based defaults. */ declare function generateDefaultConfig(targetModel: string): TargetModelConfig; /** * Get configuration for a target model. * * Looks up config from the container's registry, falling back to smart defaults. * All config is instance-scoped - no global state. * * @param targetModel - Entity type (Membership, Employee, etc.) * @param container - Container with instance-specific config * @returns Configuration object */ declare function getConfig(targetModel: string, container?: ConfigContainer): TargetModelConfig; /** * Deep merge two objects with circular reference protection. * * - Plain objects are recursively merged * - Arrays, Dates, Maps, Sets are replaced (not merged) * - Circular references are detected and cause an error * - Undefined values in source are ignored (preserves target value) * * @param target - The target object (provides defaults) * @param source - The source object (provides overrides) * @param seen - Internal WeakSet for circular reference detection * @throws Error if circular reference is detected */ declare function deepMerge(target: T, source: DeepPartial, seen?: WeakSet): T; /** * Get engagement level from visit count */ declare function getEngagementLevelFromVisits(visitsThisMonth: number): EngagementLevel; declare const _default: { ENGAGEMENT_THRESHOLDS: EngagementThresholds; STATS_CONFIG: StatsConfig; AGGREGATION_CONFIG: AggregationConfig; STREAK_CONFIG: StreakConfig; CHECK_IN_RULES: CheckInRules; ANALYTICS_CONFIG: AnalyticsConfig; NOTIFICATION_CONFIG: NotificationConfig; DEFAULT_CHECK_IN_METHOD: "manual"; DEFAULT_RECORD_TTL_DAYS: number; getConfig: typeof getConfig; generateDefaultConfig: typeof generateDefaultConfig; deepMerge: typeof deepMerge; getEngagementLevelFromVisits: typeof getEngagementLevelFromVisits; }; export { AGGREGATION_CONFIG, ANALYTICS_CONFIG, CHECK_IN_RULES, DEFAULT_CHECK_IN_METHOD, DEFAULT_RECORD_TTL_DAYS, ENGAGEMENT_THRESHOLDS, NOTIFICATION_CONFIG, STATS_CONFIG, STREAK_CONFIG, TargetModelConfig, deepMerge, _default as default, generateDefaultConfig, getConfig, getEngagementLevelFromVisits };