@burdenoff/be-sdk 2026.710.1 → 2026.710.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cache/index.ts","../src/cache/implementations/memory/MemoryCacheProvider.ts","../src/cache/implementations/valkey/ValkeyGlideProvider.ts","../src/cache/factory/CacheFactory.ts","../src/cache/types/config.ts"],"names":["MemoryCacheProvider","cache","Map","namespace","defaultTTL","maxSize","enableLogging","connected","stats","hits","misses","sets","deletes","evictions","config","startCleanupInterval","connect","Promise","resolve","logger","info","disconnect","clear","isConnected","healthCheck","status","timestamp","Date","toISOString","latencyMs","details","provider","cacheSize","size","getStatistics","totalOperations","hitRate","memoryUsed","keyCount","buildKey","key","isExpired","expiresAt","now","evictIfNeeded","firstKey","keys","next","value","delete","cleanup","cleaned","entries","debug","setInterval","get","_options","cacheKey","cached","set","entry","data","options","ttlSeconds","ttl","metadata","deleted","has","remaining","Math","floor","expire","mget","result","mset","mdel","matchPattern","pattern","includes","parts","split","position","i","length","part","index","indexOf","lastPart","endsWith","clearPattern","searchPattern","matchedKeys","prefix","push","replace","limitedKeys","limit","slice","nextCursor","totalCount","cleared","Array","from","startsWith","increment","amount","current","newValue","decrement","getOrSet","fetcher","invalidateTags","tags","totalDeleted","tag","CONNECT_RETRY_COOLDOWN_MS","CONNECT_ATTEMPT_TIMEOUT_MS","ValkeyGlideProvider","client","clusterScanCursor","clientIsCluster","connectPromise","lastConnectFailureAt","errors","process","env","serverReportsCluster","test","scanClusterKeys","clusterClient","cursor","batch","scan","match","count","isFinished","getKeys","ensureConnected","Error","sinceFailureMs","finally","withConnectBudget","pending","timer","timeout","_","reject","setTimeout","String","race","error","then","close","catch","undefined","clearTimeout","glideModule","GlideClient","default","GlideClusterClient","ClusterScanCursor","host","port","password","username","useTLSFromUrl","databaseFromUrl","url","rawUrl","URL","hostname","parseInt","decodeURIComponent","dbMatch","exec","pathname","isAzureManagedRedis","warn","addresses","clusterNodes","baseClientConfig","useTLS","credentials","clientName","name","databaseId","db","connectionTimeout","connectionBackoff","numberOfRetries","maxReconnectAttempts","factor","reconnectTimeWait","exponentBase","readFrom","cluster","createClient","periodicChecks","duration_in_sec","advancedConfiguration","refreshTopologyFromInitialNodes","standaloneClient","startTime","ping","message","memoryRegex","memoryMatch","dbsize","JSON","parse","stringify","expiry","type","del","exists","cacheKeys","map","values","requested","found","keyValuePairs","Object","cleanKeys","incrBy","decrBy","CacheFactory","instances","parseBoolean","normalized","trim","toLowerCase","parseClusterNodes","nodes","node","filter","Boolean","rawPort","Number","isFinite","resolvePort","layerPort","genericPort","defaultPort","createCache","keyPrefix","tls","enabled","createCacheFromEnv","envType","getInstance","instanceKey","closeInstance","closeAll","promises","all","createCacheForLayer","layer","serviceName","envPrefix","toUpperCase","defaults","DEFAULT_LAYER_RESOURCES","valkeyUrl","resolvedPort","getInstanceForLayer","CacheProviderType","getCache","getValkeyClient","valkeyConfig","VALKEY","closeAllCaches"],"mappings":"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","file":"chunk-CAI5GJJ6.js","sourcesContent":["/**\n * Cache - Public API\n *\n * This module provides a complete abstraction over caching systems (Valkey, Memory, etc.)\n * allowing the application to cache data without direct dependency on any specific caching implementation.\n *\n * Usage:\n *\n * // Create cache from environment variables (workspaces-backend)\n * import { createCache } from '@burdenoff/be-sdk/cache';\n *\n * const cache = createCache('my-module');\n * await cache.connect();\n *\n * // Set value\n * await cache.set('user:123', { name: 'John', email: 'john@example.com' }, { ttl: 3600 });\n *\n * // Get value\n * const user = await cache.get<User>('user:123');\n *\n * // Delete value\n * await cache.delete('user:123');\n *\n * // Disconnect when done\n * await cache.disconnect();\n */\n// Import factory for use in convenience functions\nimport { CacheFactory } from './factory/CacheFactory.js';\nimport type { ICacheProvider } from './interfaces/ICacheProvider.js';\n// Re-export for convenience\nimport type { CacheConfig, ValkeyCacheConfig } from './types/config.js';\nimport { CacheProviderType } from './types/config.js';\n\n// Export interfaces\nexport type { ICache } from './interfaces/ICache.js';\nexport type { ICacheProvider } from './interfaces/ICacheProvider.js';\n\n// Export types\nexport type { CacheEntry, CacheOptions, BatchCacheOptions, PatternOptions, PatternResult } from './types/cache.js';\n\nexport type {\n BaseCacheConfig,\n ValkeyCacheConfig,\n MemoryCacheConfig,\n MemcachedCacheConfig,\n CacheConfig,\n CacheHealthCheckResult,\n CacheStatistics,\n CacheProviderTypeLiteral,\n} from './types/config.js';\n\nexport { CacheProviderType } from './types/config.js';\n\n// Export factory\nexport { CacheFactory } from './factory/CacheFactory.js';\n\n// Export implementations (in case direct access is needed)\nexport { ValkeyGlideProvider } from './implementations/valkey/ValkeyGlideProvider.js';\nexport type { ValkeyGlideConfig } from './implementations/valkey/ValkeyGlideProvider.js';\nexport { MemoryCacheProvider } from './implementations/memory/MemoryCacheProvider.js';\n\n/**\n * Create a cache instance from environment configuration\n * Convenience function for creating a cache without manual config\n *\n * @param namespace - Cache namespace (e.g., 'analytics', 'files', 'users')\n * @returns Cache provider instance\n */\nexport function createCache(namespace: string = 'default'): ICacheProvider {\n return CacheFactory.createCacheFromEnv(namespace);\n}\n\n/**\n * Get or create a singleton cache instance\n * Convenience function for getting/creating a singleton cache\n *\n * @param namespace - Cache namespace\n * @param config - Optional cache configuration\n * @returns Singleton cache provider instance\n */\nexport function getCache(namespace: string = 'default', config?: CacheConfig): ICacheProvider {\n return CacheFactory.getInstance(namespace, config);\n}\n\n/**\n * Valkey Glide client interface for raw Valkey operations\n */\nexport interface ValkeyGlideClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string, options?: { EX?: number }): Promise<string | null>;\n del(keys: string[]): Promise<number>;\n exists(keys: string[]): Promise<number>;\n ttl(key: string): Promise<number>;\n expire(key: string, seconds: number): Promise<boolean>;\n mget(keys: string[]): Promise<(string | null)[]>;\n mset(keyValuePairs: Record<string, string>): Promise<string | null>;\n keys(pattern: string): Promise<string[]>;\n incrBy(key: string, amount: number): Promise<number>;\n decrBy(key: string, amount: number): Promise<number>;\n ping(): Promise<string>;\n info(section?: string): Promise<string>;\n dbsize(): Promise<number>;\n close(): Promise<void>;\n // Additional list operations\n lpush(key: string, ...values: string[]): Promise<number>;\n rpush(key: string, ...values: string[]): Promise<number>;\n lpop(key: string): Promise<string | null>;\n rpop(key: string): Promise<string | null>;\n lrange(key: string, start: number, stop: number): Promise<string[]>;\n llen(key: string): Promise<number>;\n // Additional set operations\n sadd(key: string, ...members: string[]): Promise<number>;\n srem(key: string, ...members: string[]): Promise<number>;\n smembers(key: string): Promise<string[]>;\n sismember(key: string, member: string): Promise<boolean>;\n // Additional hash operations\n hset(key: string, field: string, value: string): Promise<number>;\n hget(key: string, field: string): Promise<string | null>;\n hdel(key: string, ...fields: string[]): Promise<number>;\n hgetall(key: string): Promise<Record<string, string>>;\n // Pub/Sub operations\n publish(channel: string, message: string): Promise<number>;\n}\n\n/**\n * Get direct access to Valkey client via @valkey/valkey-glide\n * Useful for cases where you need raw Valkey operations beyond caching\n *\n * @param config - Optional Valkey configuration. If not provided, uses environment variables\n * @returns ValkeyGlideClient instance from @valkey/valkey-glide\n *\n * @example\n * ```typescript\n * import { getValkeyClient } from '@burdenoff/be-sdk';\n *\n * const valkey = await getValkeyClient();\n * await valkey.lpush('mylist', 'value');\n * ```\n */\nexport async function getValkeyClient(config?: ValkeyCacheConfig): Promise<ValkeyGlideClient> {\n const glideModule = await import('@valkey/valkey-glide');\n const GlideClient = glideModule.GlideClient || glideModule.default;\n\n const valkeyConfig: ValkeyCacheConfig = config || {\n type: CacheProviderType.VALKEY,\n // Fall back to REDIS_URL when VALKEY_URL is unset/empty (see CacheFactory).\n url: process.env['VALKEY_URL'] || process.env['REDIS_URL'],\n host: process.env['VALKEY_HOST'] || 'localhost',\n port: process.env['VALKEY_PORT'] ? parseInt(process.env['VALKEY_PORT'], 10) : 6379,\n password: process.env['VALKEY_PASSWORD'],\n db: process.env['VALKEY_DB'] ? parseInt(process.env['VALKEY_DB'], 10) : 0,\n username: process.env['VALKEY_USERNAME'],\n };\n\n // Parse URL if provided\n let host = valkeyConfig.host || 'localhost';\n let port = valkeyConfig.port || 6379;\n\n if (valkeyConfig.url) {\n const url = new URL(valkeyConfig.url.replace('valkey://', 'redis://'));\n host = url.hostname;\n port = parseInt(url.port || '6379', 10);\n }\n\n // Create Glide client\n const createClient = GlideClient as {\n createClient: (config: {\n addresses: Array<{ host: string; port: number }>;\n useTLS?: boolean;\n credentials?: { password?: string; username?: string };\n clientName?: string;\n readFrom?: string;\n }) => Promise<ValkeyGlideClient>;\n };\n\n return createClient.createClient({\n addresses: [{ host, port }],\n useTLS: valkeyConfig.useTLS,\n credentials: valkeyConfig.password\n ? {\n password: valkeyConfig.password,\n username: valkeyConfig.username,\n }\n : undefined,\n clientName: valkeyConfig.name || 'valkey-glide-client',\n readFrom: 'primary',\n });\n}\n\n/**\n * Close all cache connections\n * Call this during application shutdown\n */\nexport async function closeAllCaches(): Promise<void> {\n await CacheFactory.closeAll();\n}\n","/**\n * Memory Cache Provider\n * In-memory cache implementation (for testing and fallback)\n */\nimport { logger } from '../../../logger/index.js';\n\nimport type { ICacheProvider } from '../../interfaces/ICacheProvider.js';\nimport type {\n BatchCacheOptions,\n CacheEntry,\n CacheOptions,\n CacheStatistics,\n CacheHealthCheckResult,\n MemoryCacheConfig,\n PatternOptions,\n PatternResult,\n} from '../../types/index.js';\n\n/**\n * Memory cache provider implementation (LRU-based)\n */\nexport class MemoryCacheProvider implements ICacheProvider {\n private cache: Map<string, { entry: CacheEntry<unknown>; expiresAt: number }> = new Map();\n private readonly namespace: string;\n private readonly defaultTTL: number;\n private readonly maxSize: number;\n private readonly enableLogging: boolean;\n private connected: boolean = false;\n\n // Statistics\n private stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n evictions: 0,\n };\n\n constructor(config: MemoryCacheConfig, namespace: string = 'default') {\n this.namespace = namespace;\n this.defaultTTL = config.defaultTTL || 300; // 5 minutes default\n this.maxSize = config.maxSize || 1000; // Max 1000 entries by default\n this.enableLogging = config.enableLogging ?? false;\n\n // Start cleanup interval for expired entries\n this.startCleanupInterval();\n }\n\n /**\n * Connect (no-op for memory cache)\n */\n async connect(): Promise<void> {\n await Promise.resolve();\n this.connected = true;\n if (this.enableLogging) {\n logger.info(`[MemoryCacheProvider:${this.namespace}] Connected (in-memory)`);\n }\n }\n\n /**\n * Disconnect (cleanup)\n */\n async disconnect(): Promise<void> {\n await Promise.resolve();\n this.connected = false;\n this.cache.clear();\n if (this.enableLogging) {\n logger.info(`[MemoryCacheProvider:${this.namespace}] Disconnected`);\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<CacheHealthCheckResult> {\n await Promise.resolve();\n return {\n status: 'healthy',\n timestamp: new Date().toISOString(),\n connected: this.connected,\n latencyMs: 0,\n details: {\n provider: 'memory',\n cacheSize: this.cache.size,\n maxSize: this.maxSize,\n },\n };\n }\n\n /**\n * Get statistics\n */\n async getStatistics(): Promise<CacheStatistics> {\n await Promise.resolve();\n const totalOperations = this.stats.hits + this.stats.misses;\n const hitRate = totalOperations > 0 ? this.stats.hits / totalOperations : 0;\n\n // Calculate approximate memory usage (rough estimate)\n const memoryUsed = this.cache.size * 500; // Assume ~500 bytes per entry\n\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n keyCount: this.cache.size,\n memoryUsed,\n totalOperations,\n details: {\n sets: this.stats.sets,\n deletes: this.stats.deletes,\n evictions: this.stats.evictions,\n maxSize: this.maxSize,\n },\n };\n }\n\n /**\n * Build cache key with namespace\n */\n private buildKey(key: string): string {\n return `${this.namespace}:${key}`;\n }\n\n /**\n * Check if entry is expired\n */\n private isExpired(expiresAt: number): boolean {\n return Date.now() > expiresAt;\n }\n\n /**\n * Evict LRU entry if cache is full\n */\n private evictIfNeeded(): void {\n if (this.cache.size >= this.maxSize) {\n // Evict the first (oldest) entry (simple LRU)\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n this.stats.evictions++;\n }\n }\n }\n\n /**\n * Cleanup expired entries\n */\n private cleanup(): void {\n let cleaned = 0;\n\n for (const [key, value] of this.cache.entries()) {\n if (this.isExpired(value.expiresAt)) {\n this.cache.delete(key);\n cleaned++;\n }\n }\n\n if (cleaned > 0 && this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cleaned up ${cleaned} expired entries`);\n }\n }\n\n /**\n * Start cleanup interval\n */\n private startCleanupInterval(): void {\n setInterval(() => this.cleanup(), 60000); // Cleanup every minute\n }\n\n /**\n * Get value from cache\n */\n async get<T>(key: string, _options?: CacheOptions): Promise<T | null> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const cached = this.cache.get(cacheKey);\n\n if (!cached) {\n this.stats.misses++;\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cache miss`, { key });\n }\n return null;\n }\n\n // Check if expired\n if (this.isExpired(cached.expiresAt)) {\n this.cache.delete(cacheKey);\n this.stats.misses++;\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cache miss (expired)`, { key });\n }\n return null;\n }\n\n this.stats.hits++;\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cache hit`, { key });\n }\n\n // Move to end (LRU)\n this.cache.delete(cacheKey);\n this.cache.set(cacheKey, cached);\n\n return cached.entry.data as T;\n }\n\n /**\n * Set value in cache\n */\n async set<T>(key: string, value: T, options?: CacheOptions): Promise<boolean> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const ttlSeconds = options?.ttl || this.defaultTTL;\n\n this.evictIfNeeded();\n\n const entry: CacheEntry<T> = {\n data: value,\n timestamp: Date.now(),\n ttl: ttlSeconds,\n metadata: options?.metadata,\n };\n\n this.cache.set(cacheKey, {\n entry: entry,\n expiresAt: Date.now() + ttlSeconds * 1000,\n });\n\n this.stats.sets++;\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cache set`, {\n key,\n ttl: ttlSeconds,\n });\n }\n\n return true;\n }\n\n /**\n * Delete value from cache\n */\n async delete(key: string): Promise<boolean> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const deleted = this.cache.delete(cacheKey);\n\n if (deleted) {\n this.stats.deletes++;\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cache delete`, { key });\n }\n }\n\n return deleted;\n }\n\n /**\n * Check if key exists\n */\n async has(key: string): Promise<boolean> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const cached = this.cache.get(cacheKey);\n\n if (!cached) {\n return false;\n }\n\n // Check if expired\n if (this.isExpired(cached.expiresAt)) {\n this.cache.delete(cacheKey);\n return false;\n }\n\n return true;\n }\n\n /**\n * Get TTL for key\n */\n async ttl(key: string): Promise<number> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const cached = this.cache.get(cacheKey);\n\n if (!cached) {\n return -2; // Key doesn't exist\n }\n\n const remaining = Math.floor((cached.expiresAt - Date.now()) / 1000);\n\n if (remaining <= 0) {\n this.cache.delete(cacheKey);\n return -2;\n }\n\n return remaining;\n }\n\n /**\n * Update TTL for key\n */\n async expire(key: string, ttl: number): Promise<boolean> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const cached = this.cache.get(cacheKey);\n\n if (!cached) {\n return false;\n }\n\n cached.expiresAt = Date.now() + ttl * 1000;\n cached.entry.ttl = ttl;\n\n return true;\n }\n\n /**\n * Get multiple values (batch operation)\n */\n async mget<T>(keys: string[], _options?: BatchCacheOptions): Promise<Map<string, T>> {\n const result = new Map<string, T>();\n\n for (const key of keys) {\n const value = await this.get<T>(key);\n if (value !== null) {\n result.set(key, value);\n }\n }\n\n return result;\n }\n\n /**\n * Set multiple values (batch operation)\n */\n async mset<T>(entries: Map<string, T>, options?: BatchCacheOptions): Promise<boolean> {\n for (const [key, value] of entries) {\n await this.set(key, value, options);\n }\n\n return true;\n }\n\n /**\n * Delete multiple keys (batch operation)\n */\n async mdel(keys: string[]): Promise<number> {\n let deleted = 0;\n\n for (const key of keys) {\n const result = await this.delete(key);\n if (result) {\n deleted++;\n }\n }\n\n return deleted;\n }\n\n /**\n * Match key against pattern (supports * wildcard)\n */\n private matchPattern(key: string, pattern: string): boolean {\n // Simple wildcard matching without regex\n if (!pattern.includes('*')) {\n return key === pattern;\n }\n\n const parts = pattern.split('*');\n let position = 0;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (!part || part === '') continue;\n\n const index = key.indexOf(part, position);\n if (index === -1) return false;\n if (i === 0 && index !== 0) return false;\n position = index + part.length;\n }\n\n const lastPart = parts[parts.length - 1];\n return !lastPart || lastPart === '' || key.endsWith(lastPart);\n }\n\n /**\n * Clear keys by pattern\n */\n async clearPattern(pattern: string): Promise<number> {\n await Promise.resolve();\n const searchPattern = this.buildKey(pattern);\n let deleted = 0;\n\n for (const key of this.cache.keys()) {\n if (this.matchPattern(key, searchPattern)) {\n this.cache.delete(key);\n deleted++;\n }\n }\n\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Pattern cleared`, {\n pattern,\n deleted,\n });\n }\n\n return deleted;\n }\n\n /**\n * Get keys by pattern\n */\n async keys(options: PatternOptions): Promise<PatternResult> {\n await Promise.resolve();\n const searchPattern = this.buildKey(options.pattern);\n const matchedKeys: string[] = [];\n const prefix = `${this.namespace}:`;\n\n for (const key of this.cache.keys()) {\n if (this.matchPattern(key, searchPattern)) {\n matchedKeys.push(key.replace(prefix, ''));\n }\n }\n\n // Apply limit if specified\n const limitedKeys = options.limit ? matchedKeys.slice(0, options.limit) : matchedKeys;\n\n return {\n keys: limitedKeys,\n nextCursor: null,\n totalCount: matchedKeys.length,\n };\n }\n\n /**\n * Clear all keys in namespace\n */\n async clear(): Promise<boolean> {\n await Promise.resolve();\n const prefix = `${this.namespace}:`;\n let cleared = 0;\n\n for (const key of Array.from(this.cache.keys())) {\n if (key.startsWith(prefix)) {\n this.cache.delete(key);\n cleared++;\n }\n }\n\n if (this.enableLogging) {\n logger.info(`[MemoryCacheProvider:${this.namespace}] Cleared ${cleared} keys`);\n }\n\n return true;\n }\n\n /**\n * Increment numeric value\n */\n async increment(key: string, amount: number = 1): Promise<number> {\n const current = await this.get<number>(key);\n const newValue = (current || 0) + amount;\n await this.set(key, newValue);\n return newValue;\n }\n\n /**\n * Decrement numeric value\n */\n async decrement(key: string, amount: number = 1): Promise<number> {\n const current = await this.get<number>(key);\n const newValue = (current || 0) - amount;\n await this.set(key, newValue);\n return newValue;\n }\n\n /**\n * Get or set value\n */\n async getOrSet<T>(key: string, fetcher: () => Promise<T>, options?: CacheOptions): Promise<T> {\n const cached = await this.get<T>(key, options);\n if (cached !== null) {\n return cached;\n }\n\n const value = await fetcher();\n await this.set(key, value, options);\n\n return value;\n }\n\n /**\n * Invalidate by tags\n */\n async invalidateTags(tags: string[]): Promise<number> {\n let totalDeleted = 0;\n\n for (const tag of tags) {\n const pattern = `*:tag:${tag}:*`;\n const deleted = await this.clearPattern(pattern);\n totalDeleted += deleted;\n }\n\n return totalDeleted;\n }\n}\n","/**\n * Valkey Glide Cache Provider\n *\n * Implements ICacheProvider using @valkey/valkey-glide client.\n * Provides a modern, high-performance Valkey/Redis client implementation.\n *\n * @module cache/implementations/valkey/ValkeyGlideProvider\n * @category Cache\n *\n * @example\n * ```typescript\n * import { ValkeyGlideProvider } from '@burdenoff/be-sdk/cache';\n *\n * const cache = new ValkeyGlideProvider({\n * type: 'valkey-glide',\n * url: 'valkey://localhost:6379',\n * defaultTTL: 300,\n * }, 'my-namespace');\n *\n * await cache.connect();\n * await cache.set('key', 'value', { ttl: 60 });\n * const value = await cache.get('key');\n * ```\n */\n\nimport { logger } from '../../../logger/index.js';\nimport type { ICacheProvider } from '../../interfaces/ICacheProvider.js';\nimport type {\n BatchCacheOptions,\n CacheEntry,\n CacheOptions,\n CacheStatistics,\n CacheHealthCheckResult,\n PatternOptions,\n PatternResult,\n} from '../../types/index.js';\n\n/**\n * Valkey Glide configuration\n */\nexport interface ValkeyGlideConfig {\n /**\n * Cache provider type\n */\n type: 'valkey-glide';\n\n /**\n * Valkey server URL\n * @example 'valkey://localhost:6379' or 'redis://localhost:6379'\n */\n url?: string;\n\n /**\n * Valkey host\n * @default 'localhost'\n */\n host?: string;\n\n /**\n * Valkey port\n * @default 6379\n */\n port?: number;\n\n /**\n * Password for authentication\n */\n password?: string;\n\n /**\n * Username for authentication\n */\n username?: string;\n\n /**\n * Database number\n * @default 0\n */\n db?: number;\n\n /**\n * Key prefix for all keys\n * @default 'cache'\n */\n keyPrefix?: string;\n\n /**\n * Default TTL in seconds\n * @default 300 (5 minutes)\n */\n defaultTTL?: number;\n\n /**\n * Enable logging\n * @default NODE_ENV === 'development'\n */\n enableLogging?: boolean;\n\n /**\n * Connection timeout in milliseconds\n * @default 10000\n */\n connectionTimeout?: number;\n\n /**\n * Max reconnect attempts\n * @default -1 (infinite)\n */\n maxReconnectAttempts?: number;\n\n /**\n * Reconnect time wait in milliseconds\n * @default 2000\n */\n reconnectTimeWait?: number;\n\n /**\n * Client name for identification\n */\n name?: string;\n\n /**\n * Use TLS for connection\n * @default false\n */\n useTLS?: boolean;\n\n /**\n * Force Valkey Cluster mode. If unset, the provider auto-detects cluster mode.\n */\n cluster?: boolean;\n\n /**\n * Seed nodes for Valkey Cluster topology discovery.\n */\n clusterNodes?: Array<{ host: string; port: number }>;\n}\n\n/**\n * Valkey Glide TimeUnit enum (mirror of @valkey/valkey-glide's TimeUnit).\n * We re-declare locally so this file has zero compile-time dependency on the\n * peer-dep types — the enum values are ABI-stable Redis expiry tokens\n * (\"EX\", \"PX\", \"EXAT\", \"PXAT\", \"KEEPTTL\") so the runtime client accepts them\n * regardless of whether the peer package is installed.\n */\nconst enum GlideTimeUnit {\n Seconds = 'EX',\n Milliseconds = 'PX',\n UnixSeconds = 'EXAT',\n UnixMilliseconds = 'PXAT',\n KeepExisting = 'KEEPTTL',\n}\n\n/**\n * Valkey Glide set()-options shape. The real client takes\n * `{ expiry: { type: TimeUnit, count: number } }` and silently ignores the\n * legacy `{ EX: number }` shape — that silent drop caused rate-limit\n * counters to persist forever (no TTL on the key). See\n * node_modules/@valkey/valkey-glide/build-ts/BaseClient.d.ts `set(...)`.\n */\ninterface GlideSetOptions {\n expiry?: 'persist' | { type: GlideTimeUnit; count: number; duration?: number };\n conditionalSet?: 'onlyIfExists' | 'onlyIfDoesNotExist' | 'onlyIfEqual';\n returnOldValue?: boolean;\n}\n\ninterface GlideAddress {\n host: string;\n port: number;\n}\n\ninterface GlideCreateClientConfig {\n addresses: GlideAddress[];\n useTLS?: boolean;\n credentials?: { password?: string; username?: string };\n clientName?: string;\n readFrom?: string;\n databaseId?: number;\n connectionTimeout?: number;\n // Reconnection backoff for an established client that drops its connection.\n // GLIDE waits `factor * (exponentBase ^ N)` between attempt N, then keeps\n // using the last (capped) delay. Without this GLIDE uses its built-in\n // default; wiring it lets a transient drop recover smoothly instead of\n // churning. See @valkey/valkey-glide BaseClientConfiguration.connectionBackoff.\n connectionBackoff?: { numberOfRetries: number; factor: number; exponentBase: number };\n periodicChecks?: { duration_in_sec?: number };\n advancedConfiguration?: { refreshTopologyFromInitialNodes?: boolean };\n}\n\n/**\n * After a failed connect, fail subsequent ops fast (treated as a cache miss by\n * callers) for this cooldown instead of issuing a fresh `createClient` on every\n * operation. Per-operation connect hammering is what turned a brief Redis\n * hiccup into thousands of \"Failed to connect\" log lines/min and a\n * self-amplifying reconnect storm across the platform.\n */\nconst CONNECT_RETRY_COOLDOWN_MS = 8000;\n\n/**\n * Hard wall-clock budget for a single request-path connect attempt. GLIDE's\n * `connectionBackoff` (exponential, seeded by `reconnectTimeWait`) means a\n * `createClient` against an unreachable/misconfigured endpoint can stay pending\n * for tens of seconds. Because cache ops run inline in resolvers — often while a\n * Postgres connection is checked out — a connect that hangs that long starves\n * the event loop and saturates the pg pool, surfacing as 10s \"connect timeout\"\n * 500s. Bounding the attempt turns any connect stall into a fast cache-miss +\n * an armed circuit-breaker instead of a request-blocking hang. A healthy TLS\n * connect to Azure Managed Redis completes in well under this budget.\n */\nconst CONNECT_ATTEMPT_TIMEOUT_MS = 2500;\n\ninterface GlideClientFactory {\n createClient(config: GlideCreateClientConfig): Promise<ValkeyGlideClient>;\n}\n\ninterface ClusterScanCursorLike {\n getCursor(): string;\n isFinished(): boolean;\n}\n\ntype ClusterScanCursorConstructor = new (newCursor?: string | undefined | null) => ClusterScanCursorLike;\n\ninterface ValkeyGlideModule {\n GlideClient?: GlideClientFactory;\n GlideClusterClient?: GlideClientFactory;\n ClusterScanCursor?: ClusterScanCursorConstructor;\n default?: GlideClientFactory;\n}\n\n/**\n * Valkey Glide client interface (minimal type definition)\n * This is a simplified interface - full types come from @valkey/valkey-glide\n */\ninterface ValkeyGlideClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string, options?: GlideSetOptions): Promise<string | null>;\n del(keys: string[]): Promise<number>;\n exists(keys: string[]): Promise<number>;\n ttl(key: string): Promise<number>;\n expire(key: string, seconds: number): Promise<boolean>;\n mget(keys: string[]): Promise<(string | null)[]>;\n mset(keyValuePairs: Record<string, string>): Promise<string | null>;\n keys?(pattern: string): Promise<string[]>;\n incrBy(key: string, amount: number): Promise<number>;\n decrBy(key: string, amount: number): Promise<number>;\n ping(): Promise<string>;\n info(section?: string): Promise<string>;\n dbsize(): Promise<number>;\n close(): Promise<void>;\n}\n\ninterface ValkeyGlideClusterClient extends ValkeyGlideClient {\n scan(\n cursor: ClusterScanCursorLike,\n options?: { match?: string; count?: number }\n ): Promise<[ClusterScanCursorLike, string[]]>;\n}\n\n/**\n * Valkey Glide cache provider implementation\n */\nexport class ValkeyGlideProvider implements ICacheProvider {\n private client: ValkeyGlideClient | null = null;\n private clusterScanCursor: ClusterScanCursorConstructor | null = null;\n private clientIsCluster = false;\n private connected = false;\n // Single in-flight connect promise so concurrent first-time `get/set` calls\n // share one connect attempt instead of racing into N parallel `createClient`\n // invocations. Reset to `null` after connect resolves/rejects so the next\n // call after an explicit disconnect() (or a connect failure) can retry.\n private connectPromise: Promise<void> | null = null;\n // Timestamp (ms) of the last failed connect attempt; 0 when the last attempt\n // succeeded. Drives the connect circuit-breaker in ensureConnected().\n private lastConnectFailureAt = 0;\n private readonly config: ValkeyGlideConfig;\n // Mutable: when a URL like `…/4` lands on Azure Managed Redis we fold the\n // DB index into the namespace at connect time to preserve per-service\n // isolation on the forced-DB-0 connection. Not const, but only ever\n // appended to once during connect().\n private namespace: string;\n private readonly defaultTTL: number;\n private readonly enableLogging: boolean;\n\n // Statistics\n private stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n errors: 0,\n };\n\n constructor(config: ValkeyGlideConfig, namespace: string = 'default') {\n this.config = config;\n this.namespace = namespace;\n this.defaultTTL = config.defaultTTL || 300;\n this.enableLogging = config.enableLogging ?? process.env['NODE_ENV'] === 'development';\n }\n\n private async serverReportsCluster(client: ValkeyGlideClient): Promise<boolean> {\n try {\n const info = await client.info('cluster');\n return /(?:^|\\n)cluster_enabled:1(?:\\r?\\n|$)/.test(info);\n } catch {\n return false;\n }\n }\n\n private async scanClusterKeys(pattern: string): Promise<string[]> {\n if (!this.client || !this.clientIsCluster || !this.clusterScanCursor) {\n return [];\n }\n\n const clusterClient = this.client as ValkeyGlideClusterClient;\n let cursor: ClusterScanCursorLike = new this.clusterScanCursor();\n const keys: string[] = [];\n\n do {\n const [nextCursor, batch] = await clusterClient.scan(cursor, { match: pattern, count: 1000 });\n keys.push(...batch);\n cursor = nextCursor;\n } while (!cursor.isFinished());\n\n return keys;\n }\n\n private async getKeys(pattern: string): Promise<string[]> {\n const client = await this.ensureConnected();\n\n if (this.clientIsCluster) {\n return this.scanClusterKeys(pattern);\n }\n\n if (!client.keys) {\n throw new Error('KEYS command is not available on this Valkey client');\n }\n\n return client.keys(pattern);\n }\n\n /**\n * Connect to Valkey server using @valkey/valkey-glide\n */\n /**\n * Lazy-connect helper used by every public operation so callers can just do\n * `const cache = createCache('x'); await cache.set(...)` without an explicit\n * `await cache.connect()`. Multiple concurrent ops share the same in-flight\n * connect promise.\n */\n private async ensureConnected(): Promise<ValkeyGlideClient> {\n if (!(this.connected && this.client)) {\n // Circuit-breaker: if a recent connect attempt failed and none is\n // currently in flight, fail fast (the caller treats the rejection as a\n // cache miss and falls through to its source) instead of starting yet\n // another createClient. This caps connect attempts at ~1 per cooldown\n // per instance during an outage rather than one per cache operation.\n if (!this.connectPromise && this.lastConnectFailureAt > 0) {\n const sinceFailureMs = Date.now() - this.lastConnectFailureAt;\n if (sinceFailureMs < CONNECT_RETRY_COOLDOWN_MS) {\n throw new Error('Valkey connect in cooldown after a recent failure');\n }\n }\n if (!this.connectPromise) {\n this.connectPromise = this.connect().finally(() => {\n this.connectPromise = null;\n });\n }\n await this.connectPromise;\n }\n if (!this.client) {\n throw new Error('Valkey client connect failed');\n }\n return this.client;\n }\n\n /**\n * Race a GLIDE `createClient` promise against {@link CONNECT_ATTEMPT_TIMEOUT_MS}\n * so a stalled connect can never block the calling resolver (and the pg\n * connection it may be holding) longer than the budget. On timeout the\n * underlying connect is abandoned but not left dangling: if it later resolves\n * we close the orphaned client to avoid leaking a socket. The thrown error\n * propagates to `connect()`'s catch, which arms the circuit-breaker so\n * subsequent ops fast-fail (cache miss) during the cooldown.\n */\n private async withConnectBudget<C extends { close: () => Promise<void> }>(pending: Promise<C>): Promise<C> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Valkey connect exceeded ${String(CONNECT_ATTEMPT_TIMEOUT_MS)}ms budget`)),\n CONNECT_ATTEMPT_TIMEOUT_MS\n );\n });\n try {\n return await Promise.race([pending, timeout]);\n } catch (error) {\n // Abandon the slow connect, but reclaim it if it eventually succeeds so a\n // late-arriving socket does not leak.\n void pending.then(\n (client) => {\n void client.close().catch(() => undefined);\n },\n () => undefined\n );\n throw error;\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n }\n\n async connect(): Promise<void> {\n if (this.connected && this.client) {\n return;\n }\n\n try {\n // Dynamically import @valkey/valkey-glide\n const glideModule = (await import('@valkey/valkey-glide')) as ValkeyGlideModule;\n const GlideClient = glideModule.GlideClient || glideModule.default;\n const GlideClusterClient = glideModule.GlideClusterClient;\n this.clusterScanCursor = glideModule.ClusterScanCursor ?? null;\n\n if (!GlideClient) {\n throw new Error('Valkey GLIDE standalone client is unavailable');\n }\n\n // Parse URL if provided\n let host = this.config.host || 'localhost';\n let port = this.config.port || 6379;\n let password = this.config.password;\n let username = this.config.username;\n // Auto-detect TLS from URL scheme. `rediss://` (Redis-over-TLS) and\n // `valkeys://` are the canonical \"TLS-required\" schemes — Azure Managed\n // Redis on port 10000 only accepts TLS, so missing this flag manifests as\n // a connect timeout (plaintext handshake on a TLS-only socket).\n let useTLSFromUrl: boolean | undefined;\n let databaseFromUrl: number | undefined;\n\n if (this.config.url) {\n const rawUrl = this.config.url;\n useTLSFromUrl = /^(rediss|valkeys):\\/\\//i.test(rawUrl);\n const url = new URL(rawUrl.replace(/^valkey:\\/\\//i, 'redis://').replace(/^valkeys:\\/\\//i, 'rediss://'));\n host = url.hostname;\n port = parseInt(url.port || '6379', 10);\n if (!password && url.password) {\n try {\n password = decodeURIComponent(url.password);\n } catch {\n password = url.password;\n }\n }\n if (!username && url.username) {\n try {\n username = decodeURIComponent(url.username);\n } catch {\n username = url.username;\n }\n }\n // Pull DB number from path (e.g. `/0`, `/1`).\n //\n // Azure Managed Redis Balanced/B0 only exposes DB 0. If the URL pins\n // a non-zero DB index, glide's CLIENT SETINFO + SELECT chain fails\n // on every connect with `ERR DB index is out of range`. Detect the\n // Azure hostname and force DB 0 — also fold the original DB # into\n // the per-instance namespace so two services pointed at the same\n // managed-redis with different `/N` paths stay isolated by key.\n const dbMatch = /^\\/(\\d+)$/.exec(url.pathname);\n if (dbMatch && dbMatch[1]) {\n databaseFromUrl = parseInt(dbMatch[1], 10);\n const isAzureManagedRedis = /\\.redis\\.azure\\.net$/i.test(host);\n if (isAzureManagedRedis && databaseFromUrl > 0) {\n logger.warn(\n `[ValkeyGlideProvider] Azure Managed Redis only supports DB 0; ` +\n `ignoring /${String(databaseFromUrl)} in URL and folding it into namespace.`\n );\n // Suffix the namespace with `:db{N}` so two services that used to\n // rely on the URL's DB index for isolation keep getting disjoint\n // keysets on the shared DB 0.\n this.namespace = `${this.namespace}:db${String(databaseFromUrl)}`;\n databaseFromUrl = 0;\n }\n }\n }\n\n const addresses = this.config.clusterNodes?.length ? this.config.clusterNodes : [{ host, port }];\n const baseClientConfig: GlideCreateClientConfig = {\n addresses,\n useTLS: this.config.useTLS ?? useTLSFromUrl,\n credentials:\n password || username\n ? {\n password,\n username,\n }\n : undefined,\n clientName: this.config.name || `valkey-glide-${this.namespace}`,\n databaseId: this.config.db ?? databaseFromUrl,\n connectionTimeout: this.config.connectionTimeout,\n // Honour the configured reconnect tuning. Previously\n // maxReconnectAttempts/reconnectTimeWait were read into config but never\n // handed to GLIDE, so the client used its built-in default backoff. A\n // dropped connection now recovers on an exponential schedule seeded by\n // reconnectTimeWait, capped after numberOfRetries attempts.\n connectionBackoff: {\n numberOfRetries:\n this.config.maxReconnectAttempts && this.config.maxReconnectAttempts > 0\n ? this.config.maxReconnectAttempts\n : 5,\n factor: this.config.reconnectTimeWait ?? 1000,\n exponentBase: 2,\n },\n readFrom: 'primary',\n };\n\n if (this.config.cluster === true) {\n if (!GlideClusterClient) {\n throw new Error('Valkey GLIDE cluster client is unavailable');\n }\n this.client = await this.withConnectBudget(\n GlideClusterClient.createClient({\n ...baseClientConfig,\n periodicChecks: { duration_in_sec: 30 },\n advancedConfiguration: { refreshTopologyFromInitialNodes: true },\n })\n );\n this.clientIsCluster = true;\n } else {\n const standaloneClient = await this.withConnectBudget(GlideClient.createClient(baseClientConfig));\n if (this.config.cluster !== false && (await this.serverReportsCluster(standaloneClient))) {\n if (!GlideClusterClient) {\n throw new Error('Valkey server is clustered but GLIDE cluster client is unavailable');\n }\n await standaloneClient.close();\n this.client = await this.withConnectBudget(\n GlideClusterClient.createClient({\n ...baseClientConfig,\n periodicChecks: { duration_in_sec: 30 },\n advancedConfiguration: { refreshTopologyFromInitialNodes: true },\n })\n );\n this.clientIsCluster = true;\n } else {\n this.client = standaloneClient;\n this.clientIsCluster = false;\n }\n }\n\n this.connected = true;\n // Clear the circuit-breaker — a healthy connect re-opens the gate.\n this.lastConnectFailureAt = 0;\n\n if (this.enableLogging) {\n logger.info(`[ValkeyGlideProvider:${this.namespace}] Connected to Valkey`, {\n host,\n port,\n cluster: this.clientIsCluster,\n });\n }\n } catch (error) {\n this.stats.errors++;\n // Arm the circuit-breaker so the next ops fail fast instead of each\n // re-attempting connect (which produced the platform-wide connect storm).\n this.lastConnectFailureAt = Date.now();\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Failed to connect:`, error);\n throw error;\n }\n }\n\n /**\n * Disconnect from Valkey server\n */\n async disconnect(): Promise<void> {\n if (this.client) {\n await this.client.close();\n this.client = null;\n this.clientIsCluster = false;\n this.connected = false;\n // Clear the circuit-breaker so an explicit disconnect→connect cycle\n // (e.g. a deliberate reconnect) is never blocked by a stale cooldown.\n this.lastConnectFailureAt = 0;\n\n if (this.enableLogging) {\n logger.info(`[ValkeyGlideProvider:${this.namespace}] Disconnected`);\n }\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected && this.client !== null;\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<CacheHealthCheckResult> {\n const startTime = Date.now();\n\n try {\n if (!this.client) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n error: 'Not connected',\n };\n }\n\n const result = await this.client.ping();\n const latencyMs = Date.now() - startTime;\n\n if (result === 'PONG') {\n return {\n status: 'healthy',\n timestamp: new Date().toISOString(),\n connected: true,\n latencyMs,\n };\n }\n\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n error: 'Unexpected ping response',\n };\n } catch (error) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n latencyMs: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Get statistics\n */\n async getStatistics(): Promise<CacheStatistics> {\n const totalOperations = this.stats.hits + this.stats.misses;\n const hitRate = totalOperations > 0 ? this.stats.hits / totalOperations : 0;\n\n try {\n const client = await this.ensureConnected();\n\n const info = await client.info('memory');\n const memoryRegex = /used_memory:(\\d+)/;\n const memoryMatch = memoryRegex.exec(info);\n const memoryUsed = memoryMatch && memoryMatch[1] ? parseInt(memoryMatch[1], 10) : undefined;\n\n const keyCount = await client.dbsize();\n\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n keyCount,\n memoryUsed,\n totalOperations,\n details: {\n sets: this.stats.sets,\n deletes: this.stats.deletes,\n errors: this.stats.errors,\n },\n };\n } catch (error) {\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Failed to get statistics:`, error);\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n totalOperations,\n details: {\n sets: this.stats.sets,\n deletes: this.stats.deletes,\n errors: this.stats.errors,\n },\n };\n }\n }\n\n /**\n * Build cache key with namespace\n */\n private buildKey(key: string): string {\n return `${this.namespace}:${key}`;\n }\n\n /**\n * Get value from cache\n */\n async get<T>(key: string, _options?: CacheOptions): Promise<T | null> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n const value = await client.get(cacheKey);\n\n if (value === null) {\n this.stats.misses++;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Cache miss`, { key });\n }\n return null;\n }\n\n this.stats.hits++;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Cache hit`, { key });\n }\n\n const entry: CacheEntry<T> = JSON.parse(value);\n return entry.data;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error getting cache key:`, error);\n return null;\n }\n }\n\n /**\n * Set value in cache\n */\n async set<T>(key: string, value: T, options?: CacheOptions): Promise<boolean> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n const ttlSeconds = options?.ttl || this.defaultTTL;\n\n const entry: CacheEntry<T> = {\n data: value,\n timestamp: Date.now(),\n ttl: ttlSeconds,\n metadata: options?.metadata,\n };\n\n // Valkey Glide expects `{ expiry: { type: TimeUnit.Seconds, count } }`\n // and silently ignores the legacy `{ EX }` shape — passing EX meant\n // keys were written with no TTL, which wedged rate-limit counters\n // (e.g. APP_TOKEN_GENERATION bucket filling up permanently).\n await client.set(cacheKey, JSON.stringify(entry), {\n expiry: { type: GlideTimeUnit.Seconds, count: ttlSeconds },\n });\n\n this.stats.sets++;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Cache set`, {\n key,\n ttl: ttlSeconds,\n });\n }\n\n return true;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error setting cache key:`, error);\n return false;\n }\n }\n\n /**\n * Delete value from cache\n */\n async delete(key: string): Promise<boolean> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n const result = await client.del([cacheKey]);\n\n this.stats.deletes++;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Cache delete`, {\n key,\n deleted: result > 0,\n });\n }\n\n return result > 0;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error deleting cache key:`, error);\n return false;\n }\n }\n\n /**\n * Check if key exists\n */\n async has(key: string): Promise<boolean> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n const exists = await client.exists([cacheKey]);\n return exists === 1;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error checking cache key:`, error);\n return false;\n }\n }\n\n /**\n * Get TTL for key\n */\n async ttl(key: string): Promise<number> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n return await client.ttl(cacheKey);\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error getting TTL:`, error);\n return -2;\n }\n }\n\n /**\n * Update TTL for key\n */\n async expire(key: string, ttl: number): Promise<boolean> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n return await client.expire(cacheKey, ttl);\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error setting expiration:`, error);\n return false;\n }\n }\n\n /**\n * Get multiple values (batch operation)\n */\n async mget<T>(keys: string[], _options?: BatchCacheOptions): Promise<Map<string, T>> {\n const result = new Map<string, T>();\n\n if (keys.length === 0) {\n return result;\n }\n\n try {\n const client = await this.ensureConnected();\n\n const cacheKeys = keys.map((key) => this.buildKey(key));\n const values = await client.mget(cacheKeys);\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (!key) continue;\n\n if (values[i] !== null) {\n const entry: CacheEntry<T> = JSON.parse(values[i]!);\n result.set(key, entry.data);\n this.stats.hits++;\n } else {\n this.stats.misses++;\n }\n }\n\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Batch get`, {\n requested: keys.length,\n found: result.size,\n });\n }\n\n return result;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error in batch get:`, error);\n return result;\n }\n }\n\n /**\n * Set multiple values (batch operation)\n */\n async mset<T>(entries: Map<string, T>, options?: BatchCacheOptions): Promise<boolean> {\n if (entries.size === 0) {\n return true;\n }\n\n try {\n const client = await this.ensureConnected();\n\n const ttlSeconds = options?.ttl || this.defaultTTL;\n const keyValuePairs: Record<string, string> = {};\n\n for (const [key, value] of entries) {\n const cacheKey = this.buildKey(key);\n const entry: CacheEntry<T> = {\n data: value,\n timestamp: Date.now(),\n ttl: ttlSeconds,\n metadata: options?.metadata,\n };\n keyValuePairs[cacheKey] = JSON.stringify(entry);\n }\n\n await client.mset(keyValuePairs);\n\n // Set TTL for each key (mset doesn't support TTL directly)\n for (const cacheKey of Object.keys(keyValuePairs)) {\n await client.expire(cacheKey, ttlSeconds);\n }\n\n this.stats.sets += entries.size;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Batch set`, {\n count: entries.size,\n ttl: ttlSeconds,\n });\n }\n\n return true;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error in batch set:`, error);\n return false;\n }\n }\n\n /**\n * Delete multiple keys (batch operation)\n */\n async mdel(keys: string[]): Promise<number> {\n if (keys.length === 0) {\n return 0;\n }\n\n try {\n const client = await this.ensureConnected();\n\n const cacheKeys = keys.map((key) => this.buildKey(key));\n const result = await client.del(cacheKeys);\n\n this.stats.deletes += result;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Batch delete`, {\n requested: keys.length,\n deleted: result,\n });\n }\n\n return result;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error in batch delete:`, error);\n return 0;\n }\n }\n\n /**\n * Clear keys by pattern\n */\n async clearPattern(pattern: string): Promise<number> {\n try {\n const client = await this.ensureConnected();\n\n const searchPattern = this.buildKey(pattern);\n const keys = await this.getKeys(searchPattern);\n\n if (keys.length === 0) {\n return 0;\n }\n\n const result = await client.del(keys);\n\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Pattern cleared`, {\n pattern,\n deleted: result,\n });\n }\n\n return result;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error clearing pattern:`, error);\n return 0;\n }\n }\n\n /**\n * Get keys by pattern\n */\n async keys(options: PatternOptions): Promise<PatternResult> {\n try {\n await this.ensureConnected();\n\n const searchPattern = this.buildKey(options.pattern);\n const keys = await this.getKeys(searchPattern);\n\n const prefix = `${this.namespace}:`;\n const cleanKeys = keys.map((key) => key.replace(prefix, ''));\n\n const limitedKeys = options.limit ? cleanKeys.slice(0, options.limit) : cleanKeys;\n\n return {\n keys: limitedKeys,\n nextCursor: null,\n totalCount: cleanKeys.length,\n };\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error getting keys:`, error);\n return {\n keys: [],\n nextCursor: null,\n totalCount: 0,\n };\n }\n }\n\n /**\n * Clear all keys in namespace\n */\n async clear(): Promise<boolean> {\n try {\n const client = await this.ensureConnected();\n\n const pattern = this.buildKey('*');\n const keys = await this.getKeys(pattern);\n\n if (keys.length > 0) {\n await client.del(keys);\n if (this.enableLogging) {\n logger.info(`[ValkeyGlideProvider:${this.namespace}] Cleared ${keys.length} keys`);\n }\n }\n\n return true;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error clearing cache:`, error);\n return false;\n }\n }\n\n /**\n * Increment numeric value\n */\n async increment(key: string, amount: number = 1): Promise<number> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n return await client.incrBy(cacheKey, amount);\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error incrementing:`, error);\n throw error;\n }\n }\n\n /**\n * Decrement numeric value\n */\n async decrement(key: string, amount: number = 1): Promise<number> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n return await client.decrBy(cacheKey, amount);\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error decrementing:`, error);\n throw error;\n }\n }\n\n /**\n * Get or set value\n */\n async getOrSet<T>(key: string, fetcher: () => Promise<T>, options?: CacheOptions): Promise<T> {\n const cached = await this.get<T>(key, options);\n if (cached !== null) {\n return cached;\n }\n\n const value = await fetcher();\n await this.set(key, value, options);\n\n return value;\n }\n\n /**\n * Invalidate by tags\n */\n async invalidateTags(tags: string[]): Promise<number> {\n try {\n let totalDeleted = 0;\n\n for (const tag of tags) {\n const pattern = `*:tag:${tag}:*`;\n const deleted = await this.clearPattern(pattern);\n totalDeleted += deleted;\n }\n\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Tags invalidated`, {\n tags,\n deleted: totalDeleted,\n });\n }\n\n return totalDeleted;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error invalidating tags:`, error);\n return 0;\n }\n }\n}\n","/**\n * Cache Factory\n * Creates appropriate cache provider instances based on configuration\n */\nimport { logger } from '../../logger/index.js';\nimport type { ServiceLayer } from '../../types/layer.js';\nimport { DEFAULT_LAYER_RESOURCES } from '../../types/layer.js';\n\nimport { MemoryCacheProvider } from '../implementations/memory/MemoryCacheProvider.js';\nimport { ValkeyGlideProvider } from '../implementations/valkey/ValkeyGlideProvider.js';\nimport type { ICacheProvider } from '../interfaces/ICacheProvider.js';\nimport type { CacheConfig, CacheProviderTypeLiteral } from '../types/config.js';\n\n/**\n * Factory for creating cache instances\n */\nexport class CacheFactory {\n private static instances: Map<string, ICacheProvider> = new Map();\n\n private static parseBoolean(value: string | undefined): boolean | undefined {\n if (value === undefined) return undefined;\n const normalized = value.trim().toLowerCase();\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true;\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false;\n return undefined;\n }\n\n private static parseClusterNodes(value: string | undefined): Array<{ host: string; port: number }> | undefined {\n if (!value) return undefined;\n\n const nodes = value\n .split(',')\n .map((node) => node.trim())\n .filter(Boolean)\n .map((node) => {\n const [host, rawPort] = node\n .replace(/^redis:\\/\\//, '')\n .replace(/^valkey:\\/\\//, '')\n .split(':');\n if (!host) return null;\n return { host, port: rawPort ? parseInt(rawPort, 10) : 6379 };\n })\n .filter((node): node is { host: string; port: number } => node !== null && Number.isFinite(node.port));\n\n return nodes.length > 0 ? nodes : undefined;\n }\n\n /**\n * Resolve port from multiple environment variable sources\n * @param layerPort - Layer-specific port environment variable value\n * @param genericPort - Generic port environment variable value\n * @param defaultPort - Default port if none provided\n * @returns Resolved port number\n */\n private static resolvePort(\n layerPort: string | undefined,\n genericPort: string | undefined,\n defaultPort: number = 6379\n ): number {\n if (layerPort) {\n return parseInt(layerPort, 10);\n }\n if (genericPort) {\n return parseInt(genericPort, 10);\n }\n return defaultPort;\n }\n\n /**\n * Create a cache provider based on configuration\n */\n static createCache(config: CacheConfig, namespace: string = 'default'): ICacheProvider {\n logger.info('[CacheFactory] Creating cache provider', {\n type: config.type,\n namespace,\n });\n\n switch (config.type) {\n case 'valkey':\n case 'redis': // Backwards compatibility - redis maps to valkey\n return new ValkeyGlideProvider(\n {\n type: 'valkey-glide',\n url: config.url,\n host: config.host,\n port: config.port,\n password: config.password,\n username: config.username,\n db: config.db,\n keyPrefix: config.keyPrefix,\n defaultTTL: config.defaultTTL,\n enableLogging: config.enableLogging,\n maxReconnectAttempts: config.maxReconnectAttempts,\n reconnectTimeWait: config.reconnectTimeWait,\n connectionTimeout: config.connectionTimeout,\n name: config.name,\n useTLS: config.tls?.enabled,\n cluster: config.cluster,\n clusterNodes: config.clusterNodes,\n },\n namespace\n );\n\n case 'memory':\n return new MemoryCacheProvider(config, namespace);\n\n // Future implementations can be added here\n // case 'memcached':\n // return new MemcachedCacheProvider(config as MemcachedCacheConfig, namespace);\n\n default:\n throw new Error(`Unsupported cache provider type: ${config.type}`);\n }\n }\n\n /**\n * Create a cache from environment variables\n */\n static createCacheFromEnv(namespace: string = 'default'): ICacheProvider {\n const envType = process.env['CACHE_PROVIDER_TYPE'] as CacheProviderTypeLiteral | undefined;\n // Default to valkey, but treat 'redis' as 'valkey' for backwards compatibility\n const type = envType === 'memory' ? 'memory' : 'valkey';\n\n const config: CacheConfig =\n type === 'valkey'\n ? {\n type: 'valkey',\n // Fall back to REDIS_URL when VALKEY_URL is unset/empty. Prod KV\n // provisioning populates the canonical REDIS_URL (a `rediss://…`\n // Azure Managed Redis string) for every service but has, for some\n // services, left VALKEY_URL blank. Without this fallback the cache\n // silently connected to localhost:6379 — a connect that hangs on\n // GLIDE's reconnect backoff long enough to starve the event loop and\n // saturate the pg pool (10s \"connect timeout\" 500s). This mirrors the\n // precedence already used by gateway/security/valkey.ts.\n url: process.env['VALKEY_URL'] || process.env['REDIS_URL'],\n host: process.env['VALKEY_HOST'] || 'localhost',\n port: process.env['VALKEY_PORT'] ? parseInt(process.env['VALKEY_PORT'], 10) : 6379,\n password: process.env['VALKEY_PASSWORD'],\n db: process.env['VALKEY_DB'] ? parseInt(process.env['VALKEY_DB'], 10) : 0,\n username: process.env['VALKEY_USERNAME'],\n keyPrefix: process.env['CACHE_KEY_PREFIX'] || 'cache',\n defaultTTL: process.env['CACHE_DEFAULT_TTL'] ? parseInt(process.env['CACHE_DEFAULT_TTL'], 10) : 300,\n enableLogging: process.env['CACHE_ENABLE_LOGGING'] === 'true',\n maxReconnectAttempts: process.env['VALKEY_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['VALKEY_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['VALKEY_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['VALKEY_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n connectionTimeout: process.env['VALKEY_CONNECTION_TIMEOUT']\n ? parseInt(process.env['VALKEY_CONNECTION_TIMEOUT'], 10)\n : 10000,\n name: process.env['CACHE_CLIENT_NAME'] || `cache-${namespace}`,\n cluster: CacheFactory.parseBoolean(process.env['VALKEY_CLUSTER'] || process.env['CACHE_CLUSTER']),\n clusterNodes: CacheFactory.parseClusterNodes(\n process.env['VALKEY_CLUSTER_NODES'] || process.env['CACHE_CLUSTER_NODES']\n ),\n }\n : {\n type: 'memory',\n maxSize: process.env['CACHE_MAX_SIZE'] ? parseInt(process.env['CACHE_MAX_SIZE'], 10) : 1000,\n defaultTTL: process.env['CACHE_DEFAULT_TTL'] ? parseInt(process.env['CACHE_DEFAULT_TTL'], 10) : 300,\n enableLogging: process.env['CACHE_ENABLE_LOGGING'] === 'true',\n keyPrefix: process.env['CACHE_KEY_PREFIX'] || 'cache',\n };\n\n return CacheFactory.createCache(config, namespace);\n }\n\n /**\n * Get or create a singleton cache instance for a namespace\n */\n static getInstance(namespace: string = 'default', config?: CacheConfig): ICacheProvider {\n const instanceKey = `${config?.type || 'default'}:${namespace}`;\n\n if (!CacheFactory.instances.has(instanceKey)) {\n const cache = config ? CacheFactory.createCache(config, namespace) : CacheFactory.createCacheFromEnv(namespace);\n CacheFactory.instances.set(instanceKey, cache);\n }\n\n return CacheFactory.instances.get(instanceKey)!;\n }\n\n /**\n * Close a specific cache instance\n */\n static async closeInstance(namespace: string): Promise<void> {\n for (const [key, cache] of CacheFactory.instances.entries()) {\n if (key.endsWith(`:${namespace}`)) {\n await cache.disconnect();\n CacheFactory.instances.delete(key);\n logger.info('[CacheFactory] Closed cache instance', { namespace });\n }\n }\n }\n\n /**\n * Close all cache instances\n * Call this during application shutdown\n */\n static async closeAll(): Promise<void> {\n const promises = Array.from(CacheFactory.instances.values()).map(async (cache) => cache.disconnect());\n await Promise.all(promises);\n CacheFactory.instances.clear();\n logger.info('[CacheFactory] All cache instances closed');\n }\n\n // ========================================================================\n // Layer-Aware Factory Methods\n // ========================================================================\n\n /**\n * Create a cache provider for a specific layer\n *\n * @param layer - Service layer ('wspace' or 'global')\n * @param serviceName - Service name for identification\n * @param namespace - Cache namespace (default: 'default')\n * @returns Cache provider configured for the layer\n *\n * @example\n * ```typescript\n * const cache = CacheFactory.createCacheForLayer('wspace', 'wspace-tags-svc');\n * await cache.connect();\n * await cache.set('key', { data: 'value' });\n * ```\n */\n static createCacheForLayer(layer: ServiceLayer, serviceName: string, namespace: string = 'default'): ICacheProvider {\n const envPrefix = layer.toUpperCase();\n const defaults = DEFAULT_LAYER_RESOURCES[layer];\n\n // Build Valkey URL from layer-specific or generic env vars. REDIS_URL is the\n // canonical platform-wide cache/event URL (see gateway/security/valkey.ts);\n // fall back to it before the per-layer default so a service with REDIS_URL\n // set but VALKEY_URL blank still reaches the real Azure Managed Redis.\n const url =\n process.env[`${envPrefix}_VALKEY_URL`] ||\n process.env['VALKEY_URL'] ||\n process.env['REDIS_URL'] ||\n defaults.valkeyUrl;\n\n // Resolve port with fallback chain\n const resolvedPort = CacheFactory.resolvePort(process.env[`${envPrefix}_VALKEY_PORT`], process.env['VALKEY_PORT']);\n\n const config: CacheConfig = {\n type: 'valkey',\n url,\n host: process.env[`${envPrefix}_VALKEY_HOST`] || process.env['VALKEY_HOST'] || 'localhost',\n port: resolvedPort,\n password: process.env['VALKEY_PASSWORD'],\n db: process.env['VALKEY_DB'] ? parseInt(process.env['VALKEY_DB'], 10) : 0,\n username: process.env['VALKEY_USERNAME'],\n keyPrefix: process.env['CACHE_KEY_PREFIX'] || `${layer}-cache`,\n defaultTTL: process.env['CACHE_DEFAULT_TTL'] ? parseInt(process.env['CACHE_DEFAULT_TTL'], 10) : 300,\n enableLogging: process.env['CACHE_ENABLE_LOGGING'] === 'true',\n maxReconnectAttempts: process.env['VALKEY_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['VALKEY_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['VALKEY_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['VALKEY_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n connectionTimeout: process.env['VALKEY_CONNECTION_TIMEOUT']\n ? parseInt(process.env['VALKEY_CONNECTION_TIMEOUT'], 10)\n : 10000,\n name: serviceName,\n cluster: CacheFactory.parseBoolean(\n process.env[`${envPrefix}_VALKEY_CLUSTER`] || process.env['VALKEY_CLUSTER'] || process.env['CACHE_CLUSTER']\n ),\n clusterNodes: CacheFactory.parseClusterNodes(\n process.env[`${envPrefix}_VALKEY_CLUSTER_NODES`] ||\n process.env['VALKEY_CLUSTER_NODES'] ||\n process.env['CACHE_CLUSTER_NODES']\n ),\n };\n\n logger.info('[CacheFactory] Creating layer cache', {\n layer,\n serviceName,\n namespace,\n url: config.url,\n });\n\n return CacheFactory.createCache(config, namespace);\n }\n\n /**\n * Get or create a singleton cache instance for a layer\n *\n * @param layer - Service layer ('wspace' or 'global')\n * @param serviceName - Service name for identification\n * @param namespace - Cache namespace (default: 'default')\n * @returns Singleton cache provider for the layer\n */\n static getInstanceForLayer(layer: ServiceLayer, serviceName: string, namespace: string = 'default'): ICacheProvider {\n const instanceKey = `${layer}:${serviceName}:${namespace}`;\n\n if (!CacheFactory.instances.has(instanceKey)) {\n const cache = CacheFactory.createCacheForLayer(layer, serviceName, namespace);\n CacheFactory.instances.set(instanceKey, cache);\n }\n\n return CacheFactory.instances.get(instanceKey)!;\n }\n}\n","/**\n * Cache Configuration Types\n */\n\n/**\n * Cache provider type enum\n */\nexport enum CacheProviderType {\n VALKEY = 'valkey',\n MEMORY = 'memory',\n MEMCACHED = 'memcached',\n}\n\n/**\n * Cache provider type string literal\n */\nexport type CacheProviderTypeLiteral = 'valkey' | 'redis' | 'memory' | 'memcached';\n\n/**\n * Base configuration for cache\n */\nexport interface BaseCacheConfig {\n /** Cache provider type */\n type: CacheProviderType | CacheProviderTypeLiteral;\n /** Connection URL or host */\n url?: string;\n /** Cache key prefix */\n keyPrefix?: string;\n /** Default TTL in seconds */\n defaultTTL?: number;\n /** Enable debug logging */\n enableLogging?: boolean;\n /** Maximum reconnection attempts (-1 for infinite) */\n maxReconnectAttempts?: number;\n /** Time to wait between reconnection attempts (ms) */\n reconnectTimeWait?: number;\n /** Connection timeout (ms) */\n connectionTimeout?: number;\n /** Client name/identifier */\n name?: string;\n}\n\n/**\n * Valkey-specific configuration\n * Compatible with Redis protocol (Valkey is a Redis fork)\n */\nexport interface ValkeyCacheConfig extends BaseCacheConfig {\n type: CacheProviderType.VALKEY | 'valkey' | 'redis';\n /** Valkey host */\n host?: string;\n /** Valkey port */\n port?: number;\n /** Valkey password */\n password?: string;\n /** Valkey database number */\n db?: number;\n /** Valkey username */\n username?: string;\n /** Use TLS for connection (simple boolean flag) */\n useTLS?: boolean;\n /** TLS configuration (detailed) */\n tls?: {\n enabled: boolean;\n cert?: string;\n key?: string;\n ca?: string;\n };\n /** Enable cluster mode */\n cluster?: boolean;\n /** Cluster nodes (if cluster mode enabled) */\n clusterNodes?: Array<{ host: string; port: number }>;\n /** Sentinel configuration */\n sentinel?: {\n enabled: boolean;\n sentinels: Array<{ host: string; port: number }>;\n name: string;\n };\n}\n\n/**\n * Memory cache-specific configuration\n */\nexport interface MemoryCacheConfig extends BaseCacheConfig {\n type: CacheProviderType.MEMORY | 'memory';\n /** Maximum number of items in cache */\n maxSize?: number;\n /** Eviction strategy */\n evictionStrategy?: 'lru' | 'lfu' | 'fifo';\n}\n\n/**\n * Memcached-specific configuration\n */\nexport interface MemcachedCacheConfig extends BaseCacheConfig {\n type: CacheProviderType.MEMCACHED | 'memcached';\n /** Memcached servers */\n servers?: string[];\n}\n\n/**\n * Union type for all cache configurations\n */\nexport type CacheConfig = ValkeyCacheConfig | MemoryCacheConfig | MemcachedCacheConfig;\n\n/**\n * Health check result\n */\nexport interface CacheHealthCheckResult {\n /** Overall health status */\n status: 'healthy' | 'unhealthy' | 'degraded';\n /** Timestamp of health check */\n timestamp: string;\n /** Connection status */\n connected?: boolean;\n /** Latency in milliseconds */\n latencyMs?: number;\n /** Additional details */\n details?: Record<string, unknown>;\n /** Error message if unhealthy */\n error?: string;\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStatistics {\n /** Total cache hits */\n hits?: number;\n /** Total cache misses */\n misses?: number;\n /** Hit rate (0-1) */\n hitRate?: number;\n /** Total number of keys */\n keyCount?: number;\n /** Total memory used (bytes) */\n memoryUsed?: number;\n /** Total cache operations */\n totalOperations?: number;\n /** Average operation time (ms) */\n avgOperationTimeMs?: number;\n /** Last activity timestamp */\n lastActivity?: string | null;\n /** Custom metrics */\n details?: Record<string, unknown>;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { GatewayClient } from './chunk-IDKU7OGF.js';
1
+ import { GatewayClient } from './chunk-GVZ5BDER.js';
2
2
  import { __export, __name } from './chunk-XE4OXN2W.js';
3
3
 
4
4
  // src/export/index.ts
@@ -624,5 +624,5 @@ async function triggerExportJob(params) {
624
624
  __name(triggerExportJob, "triggerExportJob");
625
625
 
626
626
  export { BaseModuleExporter, PaginationService, convertToCSV, csvToJSON, estimateCSVSize, export_exports, getCSVHeaders, parseCSV, triggerExportJob };
627
- //# sourceMappingURL=chunk-5BCCI2FV.js.map
628
- //# sourceMappingURL=chunk-5BCCI2FV.js.map
627
+ //# sourceMappingURL=chunk-GCY2FTHD.js.map
628
+ //# sourceMappingURL=chunk-GCY2FTHD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/export/index.ts","../src/export/base-exporter.ts","../src/export/pagination.ts","../src/export/csv.ts","../src/export/gateway-client.ts"],"names":["BaseModuleExporter","moduleKey","displayName","description","defaultExcludeFields","supportedProducts","modelName","filterFields","entity","excludeFields","fieldsToExclude","length","filtered","record","key","value","Object","entries","includes","filterFieldsMany","entities","map","paginate","queryFn","page","pageSize","skip","take","items","total","data","hasMore","nextCursor","String","undefined","fetchAll","fetchBatch","batchSize","allItems","cursor","batch","push","lastItem","id","transformForExport","validateOptions","options","validFormats","format","Error","join","getSupportedFormats","getMetadata","supportedFormats","PaginationService","params","start","end","paginatedItems","slice","totalCount","pageInfo","hasNextPage","hasPreviousPage","startCursor","endCursor","Math","min","calculatePagination","totalPages","ceil","startIndex","endIndex","currentPage","paginatedQuery","fetchFn","limit","initialCursor","totalYielded","item","collectPaginatedQuery","createPrismaFetchFn","_batchSize","calculateOffset","max","parseCursor","decoded","Buffer","from","toString","JSON","parse","createCursor","stringify","FORMULA_PREFIX_RE","sanitizeCSVCell","test","convertToCSV","delimiter","includeHeaders","flattenFields","maxFlattenDepth","flattenObject","obj","prefix","depth","result","newKey","Date","toISOString","Array","isArray","assign","flattenedRecords","allKeys","Set","keys","add","headers","sort","a","b","localeCompare","escapeCSV","sanitizedValue","replace","lines","row","header","parseCSV","csv","hasHeaders","split","filter","line","trim","parseLine","values","current","inQuotes","i","char","nextChar","dataLines","firstLine","firstRow","_","forEach","csvToJSON","pretty","parseOptions","getCSVHeaders","collectKeys","fullKey","estimateCSVSize","sampleSize","sample","sampleCSV","averageRowSize","headerSize","CREATE_EXPORT_JOB_MUTATION","triggerExportJob","serviceName","layer","actorId","actorType","workspaceId","name","entityTypes","includeMetadata","dateRangeStart","dateRangeEnd","client","GatewayClient","input","response","internalQuery","query","variables","job","createExportJob"],"mappings":";;;;AAAA,IAAA,cAAA,GAAA;;;;;;;;;;;;;ACoCO,IAAeA,qBAAf,MAAeA;EApCtB;;;;AAsCEC,EAAAA,SAAAA;;AAGAC,EAAAA,WAAAA;;AAGAC,EAAAA,WAAAA;;AAGAC,EAAAA,oBAAAA;;AAGAC,EAAAA,iBAAAA;;AAGUC,EAAAA,SAAAA;;;;;;;;;;;;;;;;;AA6BAC,EAAAA,YAAAA,CAAaC,QAAqCC,aAAAA,EAAmD;AAC7G,IAAA,MAAMC,eAAAA,GAAkBD,aAAAA,IAAiB,IAAA,CAAKL,oBAAAA,IAAwB,EAAA;AAEtE,IAAA,IAAIM,eAAAA,CAAgBC,WAAW,CAAA,EAAG;AAChC,MAAA,OAAOH,MAAAA;AACT,IAAA;AAEA,IAAA,MAAMI,WAAoC,EAAC;AAC3C,IAAA,MAAMC,MAAAA,GAASL,MAAAA;AAEf,IAAA,KAAA,MAAW,CAACM,GAAAA,EAAKC,KAAAA,KAAUC,MAAAA,CAAOC,OAAAA,CAAQJ,MAAAA,CAAAA,EAAS;AACjD,MAAA,IAAI,CAACH,eAAAA,CAAgBQ,QAAAA,CAASJ,GAAAA,CAAAA,EAAM;AAClCF,QAAAA,QAAAA,CAASE,GAAAA,CAAAA,GAAOC,KAAAA;AAClB,MAAA;AACF,IAAA;AAEA,IAAA,OAAOH,QAAAA;AACT,EAAA;;;;;;;;AASUO,EAAAA,gBAAAA,CACRC,UACAX,aAAAA,EAC2B;AAC3B,IAAA,OAAOW,QAAAA,CAASC,IAAI,CAACb,MAAAA,KAAW,KAAKD,YAAAA,CAAaC,MAAAA,EAAQC,aAAAA,CAAAA,CAAAA;AAC5D,EAAA;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,EAAA,MAAgBa,QAAAA,CACdC,OAAAA,EACAC,IAAAA,GAAe,CAAA,EACfC,WAAmB,GAAA,EACS;AAC5B,IAAA,MAAMC,IAAAA,GAAAA,CAAQF,OAAO,CAAA,IAAKC,QAAAA;AAC1B,IAAA,MAAME,IAAAA,GAAOF,QAAAA;AAEb,IAAA,MAAM,EAAEG,KAAAA,EAAOC,KAAAA,EAAK,GAAK,MAAMN,OAAAA,CAAQ;AAAEG,MAAAA,IAAAA;AAAMC,MAAAA;KAAK,CAAA;AAEpD,IAAA,OAAO;MACLG,IAAAA,EAAMF,KAAAA;AACNC,MAAAA,KAAAA;MACAE,OAAAA,EAASL,IAAAA,GAAOE,MAAMjB,MAAAA,GAASkB,KAAAA;MAC/BG,UAAAA,EAAYJ,KAAAA,CAAMjB,MAAAA,GAAS,CAAA,IAAKe,IAAAA,GAAOE,KAAAA,CAAMjB,SAASkB,KAAAA,GAAQI,MAAAA,CAAOT,IAAAA,GAAO,CAAA,CAAA,GAAKU;AACnF,KAAA;AACF,EAAA;;;;;;;;;;;;;;;;;;;;;;EAuBA,MAAgBC,QAAAA,CACdC,UAAAA,EACAC,SAAAA,GAAoB,GAAA,EACN;AACd,IAAA,MAAMC,WAAgB,EAAA;AACtB,IAAA,IAAIC,MAAAA;AAEJ,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAMC,KAAAA,GAAQ,MAAMJ,UAAAA,CAAWG,MAAAA,CAAAA;AAE/B,MAAA,IAAIC,KAAAA,CAAM7B,WAAW,CAAA,EAAG;AACtB,QAAA;AACF,MAAA;AAEA2B,MAAAA,QAAAA,CAASG,IAAAA,CAAI,GAAID,KAAAA,CAAAA;AAGjB,MAAA,MAAME,QAAAA,GAAWF,KAAAA,CAAMA,KAAAA,CAAM7B,MAAAA,GAAS,CAAA,CAAA;AACtC,MAAA,IAAI+B,QAAAA,EAAU;AACZH,QAAAA,MAAAA,GAASG,QAAAA,CAASC,EAAAA;AACpB,MAAA;AAGA,MAAA,IAAIH,KAAAA,CAAM7B,SAAS0B,SAAAA,EAAW;AAC5B,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,OAAOC,QAAAA;AACT,EAAA;;;;;;;;;;;AAYUM,EAAAA,kBAAAA,CAAmBpC,QAAWC,aAAAA,EAAmD;AACzF,IAAA,OAAO,IAAA,CAAKF,YAAAA,CAAaC,MAAAA,EAAQC,aAAAA,CAAAA;AACnC,EAAA;;;;;;;;;AAUUoC,EAAAA,eAAAA,CAAgBC,OAAAA,EAA8B;AACtD,IAAA,MAAMC,YAAAA,GAAe;AAAC,MAAA,KAAA;AAAO,MAAA,MAAA;AAAQ,MAAA;;AACrC,IAAA,IAAI,CAACA,YAAAA,CAAa7B,QAAAA,CAAS4B,OAAAA,CAAQE,MAAM,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAIC,KAAAA,CAAM,CAAA,uBAAA,EAA0BH,OAAAA,CAAQE,MAAM,oBAAoBD,YAAAA,CAAaG,IAAAA,CAAK,IAAA,CAAA,CAAA,CAAO,CAAA;AACvG,IAAA;AACF,EAAA;;;;;;EAOAC,mBAAAA,GAAgC;AAC9B,IAAA,OAAO;AAAC,MAAA,KAAA;AAAO,MAAA,MAAA;AAAQ,MAAA;;AACzB,EAAA;;;;;;EAOAC,WAAAA,GAME;AACA,IAAA,OAAO;AACLnD,MAAAA,SAAAA,EAAW,IAAA,CAAKA,SAAAA;AAChBC,MAAAA,WAAAA,EAAa,IAAA,CAAKA,WAAAA;AAClBC,MAAAA,WAAAA,EAAa,IAAA,CAAKA,WAAAA;AAClBE,MAAAA,iBAAAA,EAAmB,IAAA,CAAKA,iBAAAA;AACxBgD,MAAAA,gBAAAA,EAAkB,KAAKF,mBAAAA;AACzB,KAAA;AACF,EAAA;AACF;;;AC/OO,IAAMG,iBAAAA,GAAN,MAAMA,kBAAAA,CAAAA;EA3Bb;;;;;;;;;;;;;;;;;;EA2CE,OAAOhC,QAAAA,CAAYM,OAAY2B,MAAAA,EAA8C;AAC3E,IAAA,MAAM/B,IAAAA,GAAO+B,OAAO/B,IAAAA,IAAQ,CAAA;AAC5B,IAAA,MAAMC,QAAAA,GAAW8B,OAAO9B,QAAAA,IAAY,EAAA;AACpC,IAAA,MAAM+B,KAAAA,GAAAA,CAAShC,OAAO,CAAA,IAAKC,QAAAA;AAC3B,IAAA,MAAMgC,MAAMD,KAAAA,GAAQ/B,QAAAA;AAEpB,IAAA,MAAMiC,cAAAA,GAAiB9B,KAAAA,CAAM+B,KAAAA,CAAMH,KAAAA,EAAOC,GAAAA,CAAAA;AAE1C,IAAA,OAAO;MACL7B,KAAAA,EAAO8B,cAAAA;AACPE,MAAAA,UAAAA,EAAYhC,KAAAA,CAAMjB,MAAAA;MAClBkD,QAAAA,EAAU;AACRC,QAAAA,WAAAA,EAAaL,MAAM7B,KAAAA,CAAMjB,MAAAA;AACzBoD,QAAAA,eAAAA,EAAiBvC,IAAAA,GAAO,CAAA;AACxBwC,QAAAA,WAAAA,EAAaN,cAAAA,CAAe/C,MAAAA,GAAS,CAAA,GAAIsB,MAAAA,CAAOuB,KAAAA,CAAAA,GAAStB,MAAAA;QACzD+B,SAAAA,EAAWP,cAAAA,CAAe/C,MAAAA,GAAS,CAAA,GAAIsB,MAAAA,CAAOiC,IAAAA,CAAKC,GAAAA,CAAIV,GAAAA,EAAK7B,KAAAA,CAAMjB,MAAM,CAAA,GAAI,CAAA,CAAA,GAAKuB;AACnF;AACF,KAAA;AACF,EAAA;;;;;;;;;;;;;;;;;EAkBA,OAAOkC,mBAAAA,CACLR,UAAAA,EACApC,IAAAA,EACAC,QAAAA,EASA;AACA,IAAA,MAAM4C,UAAAA,GAAaH,IAAAA,CAAKI,IAAAA,CAAKV,UAAAA,GAAanC,QAAAA,CAAAA;AAC1C,IAAA,MAAM8C,UAAAA,GAAAA,CAAc/C,OAAO,CAAA,IAAKC,QAAAA;AAChC,IAAA,MAAM+C,WAAWN,IAAAA,CAAKC,GAAAA,CAAII,aAAa9C,QAAAA,GAAW,CAAA,EAAGmC,aAAa,CAAA,CAAA;AAElE,IAAA,OAAO;AACLE,MAAAA,WAAAA,EAAatC,IAAAA,GAAO6C,UAAAA;AACpBN,MAAAA,eAAAA,EAAiBvC,IAAAA,GAAO,CAAA;AACxB6C,MAAAA,UAAAA;MACAI,WAAAA,EAAajD,IAAAA;AACbC,MAAAA,QAAAA;AACA8C,MAAAA,UAAAA;AACAC,MAAAA;AACF,KAAA;AACF,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,EAAA,cAAcE,cAAAA,CACZC,OAAAA,EACA7B,OAAAA,GAAiC,EAAC,EACA;AAClC,IAAA,MAAM,EAAE8B,KAAAA,EAAOC,aAAAA,EAAa,GAAK/B,OAAAA;AACjC,IAAA,IAAIP,MAAAA,GAASsC,aAAAA;AACb,IAAA,IAAI9C,OAAAA,GAAU,IAAA;AACd,IAAA,IAAI+C,YAAAA,GAAe,CAAA;AAEnB,IAAA,OAAO/C,OAAAA,EAAS;AACd,MAAA,MAAMH,KAAAA,GAAQ,MAAM+C,OAAAA,CAAQpC,MAAAA,CAAAA;AAE5B,MAAA,IAAIX,KAAAA,CAAMjB,WAAW,CAAA,EAAG;AACtB,QAAA;AACF,MAAA;AAEA,MAAA,KAAA,MAAWoE,QAAQnD,KAAAA,EAAO;AACxB,QAAA,MAAMmD,IAAAA;AACND,QAAAA,YAAAA,EAAAA;AAEA,QAAA,IAAIF,KAAAA,IAASE,gBAAgBF,KAAAA,EAAO;AAClC,UAAA;AACF,QAAA;AACF,MAAA;AAGA,MAAA,MAAMlC,QAAAA,GAAWd,KAAAA,CAAMA,KAAAA,CAAMjB,MAAAA,GAAS,CAAA,CAAA;AACtC,MAAA,IAAI+B,QAAAA,EAAU;AACZH,QAAAA,MAAAA,GAASG,QAAAA,CAASC,EAAAA;AACpB,MAAA;AAIAZ,MAAAA,OAAAA,GAAUH,MAAMjB,MAAAA,GAAS,CAAA;AAC3B,IAAA;AACF,EAAA;;;;;;;;;;;;;AAcA,EAAA,aAAaqE,qBAAAA,CACXL,OAAAA,EACA7B,OAAAA,GAAiC,EAAC,EACpB;AACd,IAAA,MAAMlB,QAAa,EAAA;AAEnB,IAAA,WAAA,MAAiBmD,IAAAA,IAAQzB,kBAAAA,CAAkBoB,cAAAA,CAAeC,OAAAA,EAAS7B,OAAAA,CAAAA,EAAU;AAC3ElB,MAAAA,KAAAA,CAAMa,KAAKsC,IAAAA,CAAAA;AACb,IAAA;AAEA,IAAA,OAAOnD,KAAAA;AACT,EAAA;;;;;;;;;;;;;;;;;;;;;;;;EAyBA,OAAOqD,mBAAAA,CACL1D,OAAAA,EACA2D,UAAAA,GAAqB,GAAA,EACc;AACnC,IAAA,OAAO3D,OAAAA;AACT,EAAA;;;;;;;;EASA,OAAO4D,eAAAA,CAAgB3D,MAAcC,QAAAA,EAA0B;AAC7D,IAAA,OAAA,CAAQyC,IAAAA,CAAKkB,GAAAA,CAAI,CAAA,EAAG5D,IAAAA,IAAQ,CAAA,IAAKC,QAAAA;AACnC,EAAA;;;;;;;AAQA,EAAA,OAAO4D,YAAyC9C,MAAAA,EAA0B;AACxE,IAAA,IAAI;AACF,MAAA,MAAM+C,UAAUC,MAAAA,CAAOC,IAAAA,CAAKjD,QAAQ,QAAA,CAAA,CAAUkD,SAAS,OAAA,CAAA;AACvD,MAAA,OAAOC,IAAAA,CAAKC,MAAML,OAAAA,CAAAA;IACpB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AACT,IAAA;AACF,EAAA;;;;;;;AAQA,EAAA,OAAOM,aAAa9D,IAAAA,EAAuC;AACzD,IAAA,OAAOyD,MAAAA,CAAOC,KAAKE,IAAAA,CAAKG,SAAAA,CAAU/D,IAAAA,CAAAA,CAAAA,CAAO2D,SAAS,QAAA,CAAA;AACpD,EAAA;AACF;;;ACnPA,IAAMK,iBAAAA,GAAoB,UAAA;AAEnB,SAASC,gBAAgBhF,KAAAA,EAAa;AAC3C,EAAA,OAAO+E,kBAAkBE,IAAAA,CAAKjF,KAAAA,CAAAA,GAAS,CAAA,CAAA,EAAIA,KAAAA,CAAAA,CAAAA,GAAUA,KAAAA;AACvD;AAFgBgF,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AA6BT,SAASE,YAAAA,CAAanE,IAAAA,EAAiBgB,OAAAA,GAAgC,EAAC,EAAC;AAC9E,EAAA,MAAM,EAAEoD,YAAY,GAAA,EAAKC,cAAAA,GAAiB,MAAMC,aAAAA,GAAgB,IAAA,EAAMC,eAAAA,GAAkB,CAAA,EAAC,GAAKvD,OAAAA;AAE9F,EAAA,IAAIhB,IAAAA,CAAKnB,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,EAAA;AACT,EAAA;AAGA,EAAA,MAAM2F,gCAAgB,MAAA,CAAA,CAACC,GAAAA,EAAcC,MAAAA,GAAS,EAAA,EAAIC,QAAQ,CAAA,KAAC;AACzD,IAAA,MAAMC,SAAiC,EAAC;AAExC,IAAA,IAAIH,GAAAA,KAAQ,IAAA,IAAQA,GAAAA,KAAQrE,MAAAA,EAAW;AACrC,MAAA,OAAOwE,MAAAA;AACT,IAAA;AAEA,IAAA,IAAI,OAAOH,QAAQ,QAAA,EAAU;AAC3B,MAAA,OAAO;AAAE,QAAA,CAACC,MAAAA,IAAU,OAAA,GAAUvE,MAAAA,CAAOsE,GAAAA;AAAK,OAAA;AAC5C,IAAA;AAEA,IAAA,KAAA,MAAW,CAACzF,GAAAA,EAAKC,KAAAA,KAAUC,MAAAA,CAAOC,OAAAA,CAAQsF,GAAAA,CAAAA,EAAiC;AACzE,MAAA,MAAMI,SAASH,MAAAA,GAAS,CAAA,EAAGA,MAAAA,CAAAA,CAAAA,EAAU1F,GAAAA,CAAAA,CAAAA,GAAQA,GAAAA;AAE7C,MAAA,IAAIC,KAAAA,KAAU,IAAA,IAAQA,KAAAA,KAAUmB,MAAAA,EAAW;AACzCwE,QAAAA,MAAAA,CAAOC,MAAAA,CAAAA,GAAU,EAAA;AACnB,MAAA,CAAA,MAAA,IAAW5F,iBAAiB6F,IAAAA,EAAM;AAChCF,QAAAA,MAAAA,CAAOC,MAAAA,CAAAA,GAAU5F,KAAAA,CAAM8F,WAAAA,EAAW;MACpC,CAAA,MAAA,IAAWC,KAAAA,CAAMC,OAAAA,CAAQhG,KAAAA,CAAAA,EAAQ;AAC/B2F,QAAAA,MAAAA,CAAOC,MAAAA,CAAAA,GAAUjB,IAAAA,CAAKG,SAAAA,CAAU9E,KAAAA,CAAAA;AAClC,MAAA,CAAA,MAAA,IAAW,OAAOA,KAAAA,KAAU,QAAA,IAAYqF,aAAAA,IAAiBK,QAAQJ,eAAAA,EAAiB;AAChFrF,QAAAA,MAAAA,CAAOgG,OAAON,MAAAA,EAAQJ,aAAAA,CAAcvF,OAAO4F,MAAAA,EAAQF,KAAAA,GAAQ,CAAA,CAAA,CAAA;MAC7D,CAAA,MAAA,IAAW,OAAO1F,UAAU,QAAA,EAAU;AACpC2F,QAAAA,MAAAA,CAAOC,MAAAA,CAAAA,GAAUjB,IAAAA,CAAKG,SAAAA,CAAU9E,KAAAA,CAAAA;MAClC,CAAA,MAAO;AACL2F,QAAAA,MAAAA,CAAOC,MAAAA,CAAAA,GAAU1E,MAAAA,CAAOlB,KAAAA,CAAAA;AAC1B,MAAA;AACF,IAAA;AAEA,IAAA,OAAO2F,MAAAA;EACT,CAAA,EA9BsB,eAAA,CAAA;AAiCtB,EAAA,MAAMO,mBAAmBnF,IAAAA,CAAKT,GAAAA,CAAI,CAAC0D,IAAAA,KAASuB,aAAAA,CAAcvB,IAAAA,CAAAA,CAAAA;AAC1D,EAAA,MAAMmC,OAAAA,uBAAcC,GAAAA,EAAAA;AACpB,EAAA,KAAA,MAAWtG,UAAUoG,gBAAAA,EAAkB;AACrC,IAAA,KAAA,MAAWnG,GAAAA,IAAOE,MAAAA,CAAOoG,IAAAA,CAAKvG,MAAAA,CAAAA,EAAS;AACrCqG,MAAAA,OAAAA,CAAQG,IAAIvG,GAAAA,CAAAA;AACd,IAAA;AACF,EAAA;AAEA,EAAA,MAAMwG,OAAAA,GAAUR,KAAAA,CAAMtB,IAAAA,CAAK0B,OAAAA,CAAAA,CAASK,IAAAA,CAAK,CAACC,CAAAA,EAAGC,CAAAA,KAAMD,CAAAA,CAAEE,aAAAA,CAAcD,CAAAA,CAAAA,CAAAA;AAGnE,EAAA,MAAME,SAAAA,2BAAa5G,KAAAA,KAAAA;AACjB,IAAA,MAAM6G,cAAAA,GAAiB7B,gBAAgBhF,KAAAA,CAAAA;AAEvC,IAAA,IACE6G,cAAAA,CAAe1G,QAAAA,CAASgF,SAAAA,CAAAA,IACxB0B,eAAe1G,QAAAA,CAAS,GAAA,CAAA,IACxB0G,cAAAA,CAAe1G,SAAS,IAAA,CAAA,IACxB0G,cAAAA,CAAe1G,QAAAA,CAAS,IAAA,CAAA,EACxB;AACA,MAAA,OAAO,CAAA,CAAA,EAAI0G,cAAAA,CAAeC,OAAAA,CAAQ,IAAA,EAAM,IAAA,CAAA,CAAA,CAAA,CAAA;AAC1C,IAAA;AACA,IAAA,OAAOD,cAAAA;EACT,CAAA,EAZkB,WAAA,CAAA;AAelB,EAAA,MAAME,QAAkB,EAAA;AAExB,EAAA,IAAI3B,cAAAA,EAAgB;AAClB2B,IAAAA,KAAAA,CAAMrF,KAAK6E,OAAAA,CAAQjG,GAAAA,CAAIsG,SAAAA,CAAAA,CAAWzE,IAAAA,CAAKgD,SAAAA,CAAAA,CAAAA;AACzC,EAAA;AAEA,EAAA,KAAA,MAAWrF,UAAUoG,gBAAAA,EAAkB;AACrC,IAAA,MAAMc,GAAAA,GAAMT,OAAAA,CAAQjG,GAAAA,CAAI,CAAC2G,MAAAA,KAAWL,UAAU9G,MAAAA,CAAOmH,MAAAA,CAAAA,IAAW,EAAA,CAAA,CAAA;AAChEF,IAAAA,KAAAA,CAAMrF,IAAAA,CAAKsF,GAAAA,CAAI7E,IAAAA,CAAKgD,SAAAA,CAAAA,CAAAA;AACtB,EAAA;AAEA,EAAA,OAAO4B,KAAAA,CAAM5E,KAAK,IAAA,CAAA;AACpB;AA/EgB+C,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AA+FT,SAASgC,QAAAA,CACdC,GAAAA,EACApF,OAAAA,GAAwD,EAAC,EAAC;AAE1D,EAAA,MAAM,EAAEoD,SAAAA,GAAY,GAAA,EAAKiC,UAAAA,GAAa,MAAI,GAAKrF,OAAAA;AAE/C,EAAA,MAAMgF,KAAAA,GAAQI,GAAAA,CAAIE,KAAAA,CAAM,OAAA,CAAA,CAASC,OAAO,CAACC,IAAAA,KAASA,IAAAA,CAAKC,IAAAA,EAAI,CAAA;AAE3D,EAAA,IAAIT,KAAAA,CAAMnH,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,EAAA;AACT,EAAA;AAGA,EAAA,MAAM6H,SAAAA,2BAAaF,IAAAA,KAAAA;AACjB,IAAA,MAAMG,SAAmB,EAAA;AACzB,IAAA,IAAIC,OAAAA,GAAU,EAAA;AACd,IAAA,IAAIC,QAAAA,GAAW,KAAA;AAEf,IAAA,IAAIC,CAAAA,GAAI,CAAA;AACR,IAAA,OAAOA,CAAAA,GAAIN,KAAK3H,MAAAA,EAAQ;AACtB,MAAA,MAAMkI,IAAAA,GAAOP,KAAKM,CAAAA,CAAAA;AAClB,MAAA,MAAME,QAAAA,GAAWR,IAAAA,CAAKM,CAAAA,GAAI,CAAA,CAAA;AAE1B,MAAA,IAAIC,IAAAA,KAAS,GAAA,IAAOF,QAAAA,IAAYG,QAAAA,KAAa,GAAA,EAAK;AAChDJ,QAAAA,OAAAA,IAAW,GAAA;AACXE,QAAAA,CAAAA,IAAK,CAAA;AACP,MAAA,CAAA,MAAA,IAAWC,SAAS,GAAA,EAAK;AACvBF,QAAAA,QAAAA,GAAW,CAACA,QAAAA;AACZC,QAAAA,CAAAA,EAAAA;MACF,CAAA,MAAA,IAAWC,IAAAA,KAAS3C,SAAAA,IAAa,CAACyC,QAAAA,EAAU;AAC1CF,QAAAA,MAAAA,CAAOhG,KAAKiG,OAAAA,CAAAA;AACZA,QAAAA,OAAAA,GAAU,EAAA;AACVE,QAAAA,CAAAA,EAAAA;MACF,CAAA,MAAO;AACLF,QAAAA,OAAAA,IAAWG,IAAAA;AACXD,QAAAA,CAAAA,EAAAA;AACF,MAAA;AACF,IAAA;AAEAH,IAAAA,MAAAA,CAAOhG,KAAKiG,OAAAA,CAAAA;AACZ,IAAA,OAAOD,MAAAA;EACT,CAAA,EA5BkB,WAAA,CAAA;AA8BlB,EAAA,IAAInB,OAAAA;AACJ,EAAA,IAAIyB,SAAAA;AAGJ,EAAA,MAAMC,SAAAA,GAAYlB,MAAM,CAAA,CAAA;AAExB,EAAA,IAAIK,UAAAA,EAAY;AACdb,IAAAA,OAAAA,GAAUkB,UAAUQ,SAAAA,CAAAA;AACpBD,IAAAA,SAAAA,GAAYjB,KAAAA,CAAMnE,MAAM,CAAA,CAAA;EAC1B,CAAA,MAAO;AAEL,IAAA,MAAMsF,QAAAA,GAAWT,UAAUQ,SAAAA,CAAAA;AAC3B1B,IAAAA,OAAAA,GAAU2B,SAAS5H,GAAAA,CAAI,CAAC6H,GAAGN,CAAAA,KAAM,CAAA,GAAA,EAAMA,CAAAA,CAAAA,CAAG,CAAA;AAC1CG,IAAAA,SAAAA,GAAYjB,KAAAA;AACd,EAAA;AAEA,EAAA,OAAOiB,SAAAA,CAAU1H,GAAAA,CAAI,CAACiH,IAAAA,KAAAA;AACpB,IAAA,MAAMG,MAAAA,GAASD,UAAUF,IAAAA,CAAAA;AACzB,IAAA,MAAM/B,MAA8B,EAAC;AAErCe,IAAAA,OAAAA,CAAQ6B,OAAAA,CAAQ,CAACnB,MAAAA,EAAQY,CAAAA,KAAAA;AACvBrC,MAAAA,GAAAA,CAAIyB,MAAAA,CAAAA,GAAUS,MAAAA,CAAOG,CAAAA,CAAAA,IAAM,EAAA;IAC7B,CAAA,CAAA;AAEA,IAAA,OAAOrC,GAAAA;EACT,CAAA,CAAA;AACF;AArEgB0B,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;AA8ET,SAASmB,SAAAA,CACdlB,GAAAA,EACApF,OAAAA,GAA0E,EAAC,EAAC;AAE5E,EAAA,MAAM,EAAEuG,MAAAA,GAAS,KAAA,EAAO,GAAGC,cAAAA,GAAiBxG,OAAAA;AAC5C,EAAA,MAAMhB,IAAAA,GAAOmG,QAAAA,CAASC,GAAAA,EAAKoB,YAAAA,CAAAA;AAC3B,EAAA,OAAOD,MAAAA,GAAS3D,KAAKG,SAAAA,CAAU/D,IAAAA,EAAM,MAAM,CAAA,CAAA,GAAK4D,IAAAA,CAAKG,SAAAA,CAAU/D,IAAAA,CAAAA;AACjE;AAPgBsH,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;AAgBT,SAASG,aAAAA,CAAczH,IAAAA,EAAiBsE,aAAAA,GAAyB,IAAA,EAAI;AAC1E,EAAA,IAAItE,IAAAA,CAAKnB,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,EAAA;AACT,EAAA;AAEA,EAAA,MAAM6I,8BAAc,MAAA,CAAA,CAACjD,GAAAA,EAAcC,MAAAA,GAAS,EAAA,EAAIC,QAAQ,CAAA,KAAC;AACvD,IAAA,MAAMW,OAAiB,EAAA;AAEvB,IAAA,IAAIb,QAAQ,IAAA,IAAQA,GAAAA,KAAQrE,MAAAA,IAAa,OAAOqE,QAAQ,QAAA,EAAU;AAChE,MAAA,OAAOC,MAAAA,GAAS;AAACA,QAAAA;UAAU,EAAA;AAC7B,IAAA;AAEA,IAAA,KAAA,MAAW,CAAC1F,GAAAA,EAAKC,KAAAA,KAAUC,MAAAA,CAAOC,OAAAA,CAAQsF,GAAAA,CAAAA,EAAiC;AACzE,MAAA,MAAMkD,UAAUjD,MAAAA,GAAS,CAAA,EAAGA,MAAAA,CAAAA,CAAAA,EAAU1F,GAAAA,CAAAA,CAAAA,GAAQA,GAAAA;AAE9C,MAAA,IACEC,KAAAA,KAAU,IAAA,IACV,OAAOA,KAAAA,KAAU,YACjB,CAAC+F,KAAAA,CAAMC,OAAAA,CAAQhG,KAAAA,KACf,EAAEA,KAAAA,YAAiB6F,IAAAA,CAAAA,IACnBR,aAAAA,IACAK,QAAQ,CAAA,EACR;AACAW,QAAAA,IAAAA,CAAK3E,KAAI,GAAI+G,WAAAA,CAAYzI,OAAO0I,OAAAA,EAAShD,KAAAA,GAAQ,CAAA,CAAA,CAAA;MACnD,CAAA,MAAO;AACLW,QAAAA,IAAAA,CAAK3E,KAAKgH,OAAAA,CAAAA;AACZ,MAAA;AACF,IAAA;AAEA,IAAA,OAAOrC,IAAAA;EACT,CAAA,EAzBoB,aAAA,CAAA;AA2BpB,EAAA,MAAMF,OAAAA,uBAAcC,GAAAA,EAAAA;AACpB,EAAA,KAAA,MAAWpC,QAAQjD,IAAAA,EAAM;AACvB,IAAA,KAAA,MAAWhB,GAAAA,IAAO0I,WAAAA,CAAYzE,IAAAA,CAAAA,EAAO;AACnCmC,MAAAA,OAAAA,CAAQG,IAAIvG,GAAAA,CAAAA;AACd,IAAA;AACF,EAAA;AAEA,EAAA,OAAOgG,KAAAA,CAAMtB,IAAAA,CAAK0B,OAAAA,CAAAA,CAASK,IAAAA,CAAK,CAACC,CAAAA,EAAGC,CAAAA,KAAMD,CAAAA,CAAEE,aAAAA,CAAcD,CAAAA,CAAAA,CAAAA;AAC5D;AAxCgB8B,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAiDT,SAASG,eAAAA,CAAgB5H,IAAAA,EAAiB6H,UAAAA,GAAqB,GAAA,EAAG;AACvE,EAAA,IAAI7H,IAAAA,CAAKnB,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,CAAA;AACT,EAAA;AAGA,EAAA,MAAMiJ,MAAAA,GAAS9H,KAAK6B,KAAAA,CAAM,CAAA,EAAGO,KAAKC,GAAAA,CAAIwF,UAAAA,EAAY7H,IAAAA,CAAKnB,MAAM,CAAA,CAAA;AAC7D,EAAA,MAAMkJ,SAAAA,GAAY5D,aAAa2D,MAAAA,CAAAA;AAC/B,EAAA,MAAME,cAAAA,GAAiBD,SAAAA,CAAUlJ,MAAAA,GAASiJ,MAAAA,CAAOjJ,MAAAA;AAGjD,EAAA,MAAM2G,OAAAA,GAAUiC,cAAczH,IAAAA,CAAAA;AAC9B,EAAA,MAAMiI,UAAAA,GAAazC,OAAAA,CAAQpE,IAAAA,CAAK,GAAA,EAAKvC,MAAAA,GAAS,CAAA;AAE9C,EAAA,OAAOuD,IAAAA,CAAKI,IAAAA,CAAKyF,UAAAA,GAAaD,cAAAA,GAAiBhI,KAAKnB,MAAM,CAAA;AAC5D;AAfgB+I,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;;;AChQhB,IAAMM,0BAAAA,GAA6B,CAAA;;;;;;;;;;AAwDnC,eAAsBC,iBAAiB1G,MAAAA,EAA8B;AACnE,EAAA,MAAM,EACJ2G,WAAAA,EACAC,KAAAA,GAAQ,QAAA,EACRC,OAAAA,EACAC,SAAAA,EACAC,WAAAA,EACAC,IAAAA,EACAC,WAAAA,EACAxH,MAAAA,EACAyH,eAAAA,EACAC,cAAAA,EACAC,cAAY,GACVpH,MAAAA;AAEJ,EAAA,MAAMqH,MAAAA,GAAS,IAAIC,aAAAA,CAAc;AAAEV,IAAAA,KAAAA;AAAOD,IAAAA;GAAY,CAAA;AAEtD,EAAA,MAAMY,KAAAA,GAAQ;AACZR,IAAAA,WAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,WAAAA;AACAxH,IAAAA,MAAAA;AACA,IAAA,GAAIyH,oBAAoBvI,MAAAA,GAAY;AAAEuI,MAAAA;AAAgB,KAAA,GAAI,EAAC;AAC3D,IAAA,GAAIC,mBAAmBxI,MAAAA,GAAY;AAAEwI,MAAAA;AAAe,KAAA,GAAI,EAAC;AACzD,IAAA,GAAIC,iBAAiBzI,MAAAA,GAAY;AAAEyI,MAAAA;AAAa,KAAA,GAAI;AACtD,GAAA;AAEA,EAAA,MAAMI,QAAAA,GAAW,MAAMH,MAAAA,CAAOI,aAAAA,CAAuC;IACnEC,KAAAA,EAAOjB,0BAAAA;IACPkB,SAAAA,EAAW;AAAEJ,MAAAA;AAAM,KAAA;IACnBxD,OAAAA,EAAS;MACP,YAAA,EAAc8C,OAAAA;MACd,cAAA,EAAgBC,SAAAA;MAChB,gBAAA,EAAkBC;AACpB;GACF,CAAA;AAEA,EAAA,MAAMa,GAAAA,GAAMJ,SAASjJ,IAAAA,EAAMsJ,eAAAA;AAC3B,EAAA,IAAI,CAACD,GAAAA,EAAK;AACR,IAAA,MAAM,IAAIlI,MAAM,qCAAA,CAAA;AAClB,EAAA;AACA,EAAA,OAAOkI,GAAAA;AACT;AA1CsBlB,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA","file":"chunk-5BCCI2FV.js","sourcesContent":["/**\n * Export Module\n *\n * Provides common utilities for data export operations across all Burdenoff microservices.\n * Includes pagination services, base exporter classes, CSV utilities, and type definitions.\n *\n * @module export\n *\n * @example\n * ```typescript\n * // Import from the export module\n * import {\n * BaseModuleExporter,\n * PaginationService,\n * convertToCSV,\n * } from '@burdenoff/be-sdk/export';\n *\n * // Create a custom exporter\n * class UserExporter extends BaseModuleExporter<User> {\n * moduleKey = 'users';\n * displayName = 'Users';\n *\n * async export(options: ExportOptions): Promise<ExportResult> {\n * const data = await this.fetchAll(\n * (cursor) => db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : {},\n * take: 100,\n * })\n * );\n *\n * const csv = convertToCSV(data);\n * return { data, format: 'csv' };\n * }\n * }\n *\n * // Use pagination utilities\n * const result = PaginationService.paginate(items, { page: 1, pageSize: 20 });\n * ```\n */\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n // Export format types\n ExportFormat,\n ExportFormatEnum,\n\n // Configuration types\n ExportConfig,\n ExportOptions,\n\n // Job types\n ExportJobStatus,\n ExportJob,\n ExportProgress,\n ExportResult,\n\n // Fetch types\n ExportFetchOptions,\n ExportFetchResult,\n\n // Pagination types\n PaginationParams,\n PaginatedResult,\n PaginatedQueryOptions,\n PaginateResult,\n PaginateQueryFn,\n\n // Module interface\n ExportableModule,\n\n // CSV types\n CSVConversionOptions,\n} from './types.js';\n\n// ============================================================================\n// Class Exports\n// ============================================================================\n\nexport { BaseModuleExporter } from './base-exporter.js';\nexport { PaginationService } from './pagination.js';\n\n// ============================================================================\n// Function Exports\n// ============================================================================\n\nexport { convertToCSV, parseCSV, csvToJSON, getCSVHeaders, estimateCSVSize } from './csv.js';\n\n// ============================================================================\n// Gateway Helper Exports\n// ============================================================================\n\nexport { triggerExportJob } from './gateway-client.js';\nexport type { TriggerExportJobParams, ExportJobResult, ExportActorType, ExportFormatGql } from './gateway-client.js';\n","/**\n * Base Module Exporter\n *\n * Abstract base class for module exporters across all Burdenoff microservices.\n * Provides common functionality for exporting data from different modules.\n *\n * @module export/base-exporter\n *\n * @example\n * ```typescript\n * import { BaseModuleExporter } from '@burdenoff/be-sdk/export';\n *\n * class UserExporter extends BaseModuleExporter<User> {\n * moduleKey = 'users';\n * displayName = 'Users';\n * description = 'Export user data';\n *\n * async export(options: ExportOptions): Promise<ExportResult> {\n * // Implementation\n * }\n * }\n * ```\n */\n\nimport type { ExportOptions, ExportResult, PaginateQueryFn, PaginateResult } from './types.js';\n\n/**\n * Abstract base class for module exporters\n *\n * Provides common functionality that all module exporters can inherit:\n * - Field filtering\n * - Pagination helpers\n * - Module metadata\n *\n * @typeParam T - The type of entity this exporter handles\n */\nexport abstract class BaseModuleExporter<T = unknown> {\n /** Unique key identifying this module (e.g., 'users', 'tags', 'orders') */\n moduleKey?: string;\n\n /** Human-readable display name for the module */\n displayName?: string;\n\n /** Description of what this module exports */\n description?: string;\n\n /** Default fields to exclude from export (e.g., sensitive data) */\n defaultExcludeFields?: string[];\n\n /** List of product IDs this exporter supports */\n supportedProducts?: string[];\n\n /** Model name for database operations */\n protected modelName?: string;\n\n /**\n * Export data from this module\n *\n * Subclasses should implement this method to perform the actual export.\n * The method is optional to allow for gradual implementation.\n *\n * @param options - Export options including format, filters, and pagination\n * @returns Export result with data or download URL\n */\n export?(options: ExportOptions): Promise<ExportResult>;\n\n /**\n * Filter fields from an entity based on exclude list\n *\n * Use this to remove sensitive or unnecessary fields from exported data.\n *\n * @param entity - Entity to filter\n * @param excludeFields - Fields to exclude (uses defaultExcludeFields if not provided)\n * @returns Filtered entity as a plain object\n *\n * @example\n * ```typescript\n * const user = { id: '1', name: 'John', password: 'secret', ssn: '123' };\n * const filtered = this.filterFields(user, ['password', 'ssn']);\n * // Result: { id: '1', name: 'John' }\n * ```\n */\n protected filterFields(entity: T | Record<string, unknown>, excludeFields?: string[]): Record<string, unknown> {\n const fieldsToExclude = excludeFields || this.defaultExcludeFields || [];\n\n if (fieldsToExclude.length === 0) {\n return entity as Record<string, unknown>;\n }\n\n const filtered: Record<string, unknown> = {};\n const record = entity as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(record)) {\n if (!fieldsToExclude.includes(key)) {\n filtered[key] = value;\n }\n }\n\n return filtered;\n }\n\n /**\n * Filter multiple entities\n *\n * @param entities - Array of entities to filter\n * @param excludeFields - Fields to exclude\n * @returns Array of filtered entities\n */\n protected filterFieldsMany(\n entities: (T | Record<string, unknown>)[],\n excludeFields?: string[]\n ): Record<string, unknown>[] {\n return entities.map((entity) => this.filterFields(entity, excludeFields));\n }\n\n /**\n * Paginate helper for database queries\n *\n * Use this to implement paginated data fetching in your export method.\n *\n * @param queryFn - Function that executes the paginated query\n * @param page - Page number (1-indexed)\n * @param pageSize - Number of items per page\n * @returns Paginated result with data and metadata\n *\n * @example\n * ```typescript\n * const result = await this.paginate(\n * async ({ skip, take }) => {\n * const items = await db.user.findMany({ skip, take });\n * const total = await db.user.count();\n * return { items, total };\n * },\n * 1,\n * 100\n * );\n * ```\n */\n protected async paginate(\n queryFn: PaginateQueryFn<T>,\n page: number = 1,\n pageSize: number = 100\n ): Promise<PaginateResult<T>> {\n const skip = (page - 1) * pageSize;\n const take = pageSize;\n\n const { items, total } = await queryFn({ skip, take });\n\n return {\n data: items,\n total,\n hasMore: skip + items.length < total,\n nextCursor: items.length > 0 && skip + items.length < total ? String(page + 1) : undefined,\n };\n }\n\n /**\n * Fetch all data using cursor-based pagination\n *\n * Use this for exporting large datasets efficiently.\n *\n * @param fetchBatch - Function to fetch a batch of data\n * @param batchSize - Number of items per batch\n * @returns All fetched items\n *\n * @example\n * ```typescript\n * const allUsers = await this.fetchAll(\n * async (cursor) => db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : undefined,\n * orderBy: { id: 'asc' },\n * take: 100,\n * }),\n * 100\n * );\n * ```\n */\n protected async fetchAll(\n fetchBatch: (cursor?: string) => Promise<(T & { id: string })[]>,\n batchSize: number = 100\n ): Promise<T[]> {\n const allItems: T[] = [];\n let cursor: string | undefined;\n\n while (true) {\n const batch = await fetchBatch(cursor);\n\n if (batch.length === 0) {\n break;\n }\n\n allItems.push(...batch);\n\n // Get cursor from last item\n const lastItem = batch[batch.length - 1];\n if (lastItem) {\n cursor = lastItem.id;\n }\n\n // If we got fewer items than batch size, we're done\n if (batch.length < batchSize) {\n break;\n }\n }\n\n return allItems;\n }\n\n /**\n * Transform entity for export\n *\n * Override this method to customize how entities are transformed before export.\n * Default implementation returns the entity as-is after field filtering.\n *\n * @param entity - Entity to transform\n * @param excludeFields - Fields to exclude\n * @returns Transformed entity\n */\n protected transformForExport(entity: T, excludeFields?: string[]): Record<string, unknown> {\n return this.filterFields(entity, excludeFields);\n }\n\n /**\n * Validate export options\n *\n * Override this to add custom validation for export options.\n *\n * @param options - Export options to validate\n * @throws Error if options are invalid\n */\n protected validateOptions(options: ExportOptions): void {\n const validFormats = ['csv', 'json', 'xlsx'];\n if (!validFormats.includes(options.format)) {\n throw new Error(`Invalid export format: ${options.format}. Valid formats: ${validFormats.join(', ')}`);\n }\n }\n\n /**\n * Get supported export formats\n *\n * @returns Array of supported format strings\n */\n getSupportedFormats(): string[] {\n return ['csv', 'json', 'xlsx'];\n }\n\n /**\n * Get module metadata\n *\n * @returns Module metadata object\n */\n getMetadata(): {\n moduleKey?: string;\n displayName?: string;\n description?: string;\n supportedProducts?: string[];\n supportedFormats: string[];\n } {\n return {\n moduleKey: this.moduleKey,\n displayName: this.displayName,\n description: this.description,\n supportedProducts: this.supportedProducts,\n supportedFormats: this.getSupportedFormats(),\n };\n }\n}\n","/**\n * Pagination Service\n *\n * Provides pagination utilities for export operations across all Burdenoff microservices.\n * Supports both offset-based and cursor-based pagination strategies.\n *\n * @module export/pagination\n *\n * @example\n * ```typescript\n * import { PaginationService } from '@burdenoff/be-sdk/export';\n *\n * // Offset-based pagination\n * const result = PaginationService.paginate(items, { page: 2, pageSize: 20 });\n *\n * // Cursor-based pagination with async generator\n * for await (const item of PaginationService.paginatedQuery(fetchFn, { limit: 100 })) {\n * console.log(item);\n * }\n * ```\n */\n\nimport type { PaginatedQueryOptions, PaginatedResult, PaginationParams } from './types.js';\n\n/**\n * Service providing pagination utilities for export and data fetching operations\n */\nexport class PaginationService {\n /**\n * Paginate an array of items using offset-based pagination\n *\n * @param items - Array of items to paginate\n * @param params - Pagination parameters\n * @returns Paginated result with items and metadata\n *\n * @example\n * ```typescript\n * const allUsers = await db.user.findMany();\n * const page = PaginationService.paginate(allUsers, { page: 1, pageSize: 10 });\n * console.log(page.items); // First 10 users\n * console.log(page.pageInfo.hasNextPage); // true if more pages exist\n * ```\n */\n static paginate<T>(items: T[], params: PaginationParams): PaginatedResult<T> {\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 20;\n const start = (page - 1) * pageSize;\n const end = start + pageSize;\n\n const paginatedItems = items.slice(start, end);\n\n return {\n items: paginatedItems,\n totalCount: items.length,\n pageInfo: {\n hasNextPage: end < items.length,\n hasPreviousPage: page > 1,\n startCursor: paginatedItems.length > 0 ? String(start) : undefined,\n endCursor: paginatedItems.length > 0 ? String(Math.min(end, items.length) - 1) : undefined,\n },\n };\n }\n\n /**\n * Calculate pagination metadata without slicing data\n *\n * @param totalCount - Total number of items\n * @param page - Current page number (1-indexed)\n * @param pageSize - Items per page\n * @returns Pagination metadata\n *\n * @example\n * ```typescript\n * const meta = PaginationService.calculatePagination(150, 3, 20);\n * // meta.hasNextPage = true (page 4 exists)\n * // meta.hasPreviousPage = true (page 2 exists)\n * // meta.totalPages = 8\n * ```\n */\n static calculatePagination(\n totalCount: number,\n page: number,\n pageSize: number\n ): {\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n totalPages: number;\n currentPage: number;\n pageSize: number;\n startIndex: number;\n endIndex: number;\n } {\n const totalPages = Math.ceil(totalCount / pageSize);\n const startIndex = (page - 1) * pageSize;\n const endIndex = Math.min(startIndex + pageSize - 1, totalCount - 1);\n\n return {\n hasNextPage: page < totalPages,\n hasPreviousPage: page > 1,\n totalPages,\n currentPage: page,\n pageSize,\n startIndex,\n endIndex,\n };\n }\n\n /**\n * Async generator for paginated database queries using cursor-based pagination\n *\n * This is ideal for processing large datasets without loading everything into memory.\n * The generator yields items one at a time, fetching new batches as needed.\n *\n * @param fetchFn - Function to fetch data given a cursor\n * @param options - Pagination options\n * @returns Async generator of items\n *\n * @example\n * ```typescript\n * // Define fetch function that queries the database\n * const fetchUsers = async (cursor?: string) => {\n * return db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : undefined,\n * orderBy: { id: 'asc' },\n * take: 100,\n * });\n * };\n *\n * // Process all users without loading all into memory\n * for await (const user of PaginationService.paginatedQuery(fetchUsers)) {\n * await processUser(user);\n * }\n * ```\n */\n static async *paginatedQuery<T extends { id: string }>(\n fetchFn: (cursor?: string) => Promise<T[]>,\n options: PaginatedQueryOptions = {}\n ): AsyncGenerator<T, void, unknown> {\n const { limit, initialCursor } = options;\n let cursor = initialCursor;\n let hasMore = true;\n let totalYielded = 0;\n\n while (hasMore) {\n const items = await fetchFn(cursor);\n\n if (items.length === 0) {\n break;\n }\n\n for (const item of items) {\n yield item;\n totalYielded++;\n\n if (limit && totalYielded >= limit) {\n return;\n }\n }\n\n // Get next cursor from last item\n const lastItem = items[items.length - 1];\n if (lastItem) {\n cursor = lastItem.id;\n }\n\n // If we got fewer items than expected batch size, we're done\n // Note: This assumes fetchFn respects a consistent batch size internally\n hasMore = items.length > 0;\n }\n }\n\n /**\n * Collect all items from a paginated query into an array\n *\n * @param fetchFn - Function to fetch data given a cursor\n * @param options - Pagination options\n * @returns Array of all items\n *\n * @example\n * ```typescript\n * const allUsers = await PaginationService.collectPaginatedQuery(fetchUsers, { limit: 1000 });\n * ```\n */\n static async collectPaginatedQuery<T extends { id: string }>(\n fetchFn: (cursor?: string) => Promise<T[]>,\n options: PaginatedQueryOptions = {}\n ): Promise<T[]> {\n const items: T[] = [];\n\n for await (const item of PaginationService.paginatedQuery(fetchFn, options)) {\n items.push(item);\n }\n\n return items;\n }\n\n /**\n * Create a cursor-based paginated fetch function from a Prisma-style query\n *\n * @param queryFn - Prisma-style query function\n * @param batchSize - Number of items to fetch per batch\n * @returns Fetch function compatible with paginatedQuery\n *\n * @example\n * ```typescript\n * const fetchFn = PaginationService.createPrismaFetchFn(\n * (cursor) => db.user.findMany({\n * where: { isActive: true, ...(cursor ? { id: { gt: cursor } } : {}) },\n * orderBy: { id: 'asc' },\n * take: 100,\n * }),\n * 100\n * );\n *\n * for await (const user of PaginationService.paginatedQuery(fetchFn)) {\n * console.log(user);\n * }\n * ```\n */\n static createPrismaFetchFn<T extends { id: string }>(\n queryFn: (cursor?: string) => Promise<T[]>,\n _batchSize: number = 100\n ): (cursor?: string) => Promise<T[]> {\n return queryFn;\n }\n\n /**\n * Calculate offset for skip-based pagination\n *\n * @param page - Page number (1-indexed)\n * @param pageSize - Items per page\n * @returns Offset value for skip\n */\n static calculateOffset(page: number, pageSize: number): number {\n return (Math.max(1, page) - 1) * pageSize;\n }\n\n /**\n * Parse cursor string to extract pagination state\n *\n * @param cursor - Base64-encoded cursor string\n * @returns Decoded cursor data or null if invalid\n */\n static parseCursor<T = Record<string, unknown>>(cursor: string): T | null {\n try {\n const decoded = Buffer.from(cursor, 'base64').toString('utf-8');\n return JSON.parse(decoded) as T;\n } catch {\n return null;\n }\n }\n\n /**\n * Create cursor string from pagination state\n *\n * @param data - Data to encode in cursor\n * @returns Base64-encoded cursor string\n */\n static createCursor(data: Record<string, unknown>): string {\n return Buffer.from(JSON.stringify(data)).toString('base64');\n }\n}\n","/**\n * CSV Utilities\n *\n * Utilities for converting data to CSV format for export operations.\n *\n * @module export/csv\n *\n * @example\n * ```typescript\n * import { convertToCSV, parseCSV } from '@burdenoff/be-sdk/export';\n *\n * const csv = convertToCSV(users, { includeHeaders: true });\n * console.log(csv);\n * ```\n */\n\nimport type { CSVConversionOptions } from './types.js';\n\nconst FORMULA_PREFIX_RE = /^[=+\\-@]/;\n\nexport function sanitizeCSVCell(value: string): string {\n return FORMULA_PREFIX_RE.test(value) ? `'${value}` : value;\n}\n\n/**\n * Convert an array of objects to CSV format\n *\n * Handles nested objects by flattening them with dot notation.\n * Arrays are JSON stringified.\n * Dates are converted to ISO strings.\n *\n * @param data - Array of objects to convert\n * @param options - CSV conversion options\n * @returns CSV string\n *\n * @example\n * ```typescript\n * const users = [\n * { id: 1, name: 'John', address: { city: 'NYC' } },\n * { id: 2, name: 'Jane', address: { city: 'LA' } },\n * ];\n *\n * const csv = convertToCSV(users);\n * // Output:\n * // id,name,address.city\n * // 1,John,NYC\n * // 2,Jane,LA\n * ```\n */\nexport function convertToCSV(data: unknown[], options: CSVConversionOptions = {}): string {\n const { delimiter = ',', includeHeaders = true, flattenFields = true, maxFlattenDepth = 3 } = options;\n\n if (data.length === 0) {\n return '';\n }\n\n // Flatten objects and get all keys\n const flattenObject = (obj: unknown, prefix = '', depth = 0): Record<string, string> => {\n const result: Record<string, string> = {};\n\n if (obj === null || obj === undefined) {\n return result;\n }\n\n if (typeof obj !== 'object') {\n return { [prefix || 'value']: String(obj) };\n }\n\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (value === null || value === undefined) {\n result[newKey] = '';\n } else if (value instanceof Date) {\n result[newKey] = value.toISOString();\n } else if (Array.isArray(value)) {\n result[newKey] = JSON.stringify(value);\n } else if (typeof value === 'object' && flattenFields && depth < maxFlattenDepth) {\n Object.assign(result, flattenObject(value, newKey, depth + 1));\n } else if (typeof value === 'object') {\n result[newKey] = JSON.stringify(value);\n } else {\n result[newKey] = String(value);\n }\n }\n\n return result;\n };\n\n // Flatten all records and collect all keys\n const flattenedRecords = data.map((item) => flattenObject(item));\n const allKeys = new Set<string>();\n for (const record of flattenedRecords) {\n for (const key of Object.keys(record)) {\n allKeys.add(key);\n }\n }\n\n const headers = Array.from(allKeys).sort((a, b) => a.localeCompare(b));\n\n // Escape CSV values\n const escapeCSV = (value: string): string => {\n const sanitizedValue = sanitizeCSVCell(value);\n\n if (\n sanitizedValue.includes(delimiter) ||\n sanitizedValue.includes('\"') ||\n sanitizedValue.includes('\\n') ||\n sanitizedValue.includes('\\r')\n ) {\n return `\"${sanitizedValue.replace(/\"/g, '\"\"')}\"`;\n }\n return sanitizedValue;\n };\n\n // Build CSV\n const lines: string[] = [];\n\n if (includeHeaders) {\n lines.push(headers.map(escapeCSV).join(delimiter));\n }\n\n for (const record of flattenedRecords) {\n const row = headers.map((header) => escapeCSV(record[header] || ''));\n lines.push(row.join(delimiter));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Parse a CSV string into an array of objects\n *\n * @param csv - CSV string to parse\n * @param options - Parse options\n * @returns Array of parsed objects\n *\n * @example\n * ```typescript\n * const csv = 'id,name\\n1,John\\n2,Jane';\n * const data = parseCSV(csv);\n * // [{ id: '1', name: 'John' }, { id: '2', name: 'Jane' }]\n * ```\n */\nexport function parseCSV(\n csv: string,\n options: { delimiter?: string; hasHeaders?: boolean } = {}\n): Record<string, string>[] {\n const { delimiter = ',', hasHeaders = true } = options;\n\n const lines = csv.split(/\\r?\\n/).filter((line) => line.trim());\n\n if (lines.length === 0) {\n return [];\n }\n\n // Parse a single CSV line, handling quoted values\n const parseLine = (line: string): string[] => {\n const values: string[] = [];\n let current = '';\n let inQuotes = false;\n\n let i = 0;\n while (i < line.length) {\n const char = line[i];\n const nextChar = line[i + 1];\n\n if (char === '\"' && inQuotes && nextChar === '\"') {\n current += '\"';\n i += 2; // Skip next quote\n } else if (char === '\"') {\n inQuotes = !inQuotes;\n i++;\n } else if (char === delimiter && !inQuotes) {\n values.push(current);\n current = '';\n i++;\n } else {\n current += char;\n i++;\n }\n }\n\n values.push(current);\n return values;\n };\n\n let headers: string[];\n let dataLines: string[];\n\n // We've already checked that lines.length > 0, so lines[0] is guaranteed to exist\n const firstLine = lines[0] as string;\n\n if (hasHeaders) {\n headers = parseLine(firstLine);\n dataLines = lines.slice(1);\n } else {\n // Generate numeric headers if no header row\n const firstRow = parseLine(firstLine);\n headers = firstRow.map((_, i) => `col${i}`);\n dataLines = lines;\n }\n\n return dataLines.map((line) => {\n const values = parseLine(line);\n const obj: Record<string, string> = {};\n\n headers.forEach((header, i) => {\n obj[header] = values[i] || '';\n });\n\n return obj;\n });\n}\n\n/**\n * Convert CSV to JSON string\n *\n * @param csv - CSV string\n * @param options - Parse options\n * @returns JSON string\n */\nexport function csvToJSON(\n csv: string,\n options: { delimiter?: string; hasHeaders?: boolean; pretty?: boolean } = {}\n): string {\n const { pretty = false, ...parseOptions } = options;\n const data = parseCSV(csv, parseOptions);\n return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n}\n\n/**\n * Get CSV headers from data\n *\n * @param data - Array of objects\n * @param flattenFields - Whether to flatten nested objects\n * @returns Array of header strings\n */\nexport function getCSVHeaders(data: unknown[], flattenFields: boolean = true): string[] {\n if (data.length === 0) {\n return [];\n }\n\n const collectKeys = (obj: unknown, prefix = '', depth = 0): string[] => {\n const keys: string[] = [];\n\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return prefix ? [prefix] : [];\n }\n\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n flattenFields &&\n depth < 3\n ) {\n keys.push(...collectKeys(value, fullKey, depth + 1));\n } else {\n keys.push(fullKey);\n }\n }\n\n return keys;\n };\n\n const allKeys = new Set<string>();\n for (const item of data) {\n for (const key of collectKeys(item)) {\n allKeys.add(key);\n }\n }\n\n return Array.from(allKeys).sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Estimate CSV file size for a dataset\n *\n * @param data - Array of objects\n * @param sampleSize - Number of records to sample for estimation\n * @returns Estimated size in bytes\n */\nexport function estimateCSVSize(data: unknown[], sampleSize: number = 100): number {\n if (data.length === 0) {\n return 0;\n }\n\n // Take a sample to estimate average row size\n const sample = data.slice(0, Math.min(sampleSize, data.length));\n const sampleCSV = convertToCSV(sample);\n const averageRowSize = sampleCSV.length / sample.length;\n\n // Estimate total size (headers + data rows)\n const headers = getCSVHeaders(data);\n const headerSize = headers.join(',').length + 1; // +1 for newline\n\n return Math.ceil(headerSize + averageRowSize * data.length);\n}\n","/**\n * Export Gateway Helper\n *\n * Centralised wrapper around the workspace internal gateway's\n * `createExportJob` mutation, used by per-svc convenience resolvers\n * (e.g. `createTagsExportJob`, `createGroupsExportJob`).\n *\n * Replaces the duplicated `src/clients/export-gateway.ts` files that\n * existed in 19+ workspace svcs.\n *\n * @module export/gateway-client\n *\n * @example\n * ```typescript\n * import { triggerExportJob } from '@burdenoff/be-sdk/export';\n *\n * const result = await triggerExportJob({\n * serviceName: 'wspace-tags-svc',\n * workspaceId: ctx.workspaceId,\n * name: input.name,\n * entityTypes: ['tags', 'vocabularies'],\n * format: input.format,\n * actorId: ctx.actorId,\n * actorType: ctx.actorType,\n * });\n * ```\n */\n\nimport { GatewayClient } from '../gateway/index.js';\nimport type { ServiceLayer } from '../types/layer.js';\n\nconst CREATE_EXPORT_JOB_MUTATION = `mutation CreateExportJob($input: CreateExportJobInput!) {\n createExportJob(input: $input) {\n id\n status\n workspaceId\n entityTypes\n format\n createdAt\n }\n}`;\n\nexport type ExportActorType = 'user' | 'app' | 'service' | 'super_admin';\nexport type ExportFormatGql = 'JSON' | 'CSV';\n\nexport interface TriggerExportJobParams {\n /** Caller service name, used by gateway client telemetry/auth */\n serviceName: string;\n /** Layer for the gateway. Defaults to `wspace`. */\n layer?: ServiceLayer;\n /** Workspace context (required for wspace exports). */\n workspaceId: string;\n /** Human-readable name for the export job. */\n name: string;\n /** Entity types registered in `wspace-export-svc` to include. */\n entityTypes: string[];\n /** Output format. */\n format: ExportFormatGql;\n /** Actor making the request (forwarded to RBAC). */\n actorId: string;\n actorType: ExportActorType;\n /** Whether to include extended metadata in the export ZIP. */\n includeMetadata?: boolean;\n /** Optional ISO date-range bounds. */\n dateRangeStart?: string;\n dateRangeEnd?: string;\n}\n\nexport interface ExportJobResult {\n id: string;\n status: string;\n workspaceId: string;\n entityTypes: string[];\n format: string;\n createdAt: string;\n}\n\ninterface CreateExportJobResponse {\n createExportJob?: ExportJobResult;\n}\n\n/**\n * Submit a `createExportJob` mutation to the workspace internal gateway.\n *\n * The caller is expected to map the returned `ExportJobResult` to its\n * own GraphQL output type (the per-svc `ExportJobResponse`).\n */\nexport async function triggerExportJob(params: TriggerExportJobParams): Promise<ExportJobResult> {\n const {\n serviceName,\n layer = 'wspace',\n actorId,\n actorType,\n workspaceId,\n name,\n entityTypes,\n format,\n includeMetadata,\n dateRangeStart,\n dateRangeEnd,\n } = params;\n\n const client = new GatewayClient({ layer, serviceName });\n\n const input = {\n workspaceId,\n name,\n entityTypes,\n format,\n ...(includeMetadata !== undefined ? { includeMetadata } : {}),\n ...(dateRangeStart !== undefined ? { dateRangeStart } : {}),\n ...(dateRangeEnd !== undefined ? { dateRangeEnd } : {}),\n };\n\n const response = await client.internalQuery<CreateExportJobResponse>({\n query: CREATE_EXPORT_JOB_MUTATION,\n variables: { input },\n headers: {\n 'x-actor-id': actorId,\n 'x-actor-type': actorType,\n 'x-workspace-id': workspaceId,\n },\n });\n\n const job = response.data?.createExportJob;\n if (!job) {\n throw new Error('Export service did not return a job');\n }\n return job;\n}\n"]}
1
+ {"version":3,"sources":["../src/export/index.ts","../src/export/base-exporter.ts","../src/export/pagination.ts","../src/export/csv.ts","../src/export/gateway-client.ts"],"names":["BaseModuleExporter","moduleKey","displayName","description","defaultExcludeFields","supportedProducts","modelName","filterFields","entity","excludeFields","fieldsToExclude","length","filtered","record","key","value","Object","entries","includes","filterFieldsMany","entities","map","paginate","queryFn","page","pageSize","skip","take","items","total","data","hasMore","nextCursor","String","undefined","fetchAll","fetchBatch","batchSize","allItems","cursor","batch","push","lastItem","id","transformForExport","validateOptions","options","validFormats","format","Error","join","getSupportedFormats","getMetadata","supportedFormats","PaginationService","params","start","end","paginatedItems","slice","totalCount","pageInfo","hasNextPage","hasPreviousPage","startCursor","endCursor","Math","min","calculatePagination","totalPages","ceil","startIndex","endIndex","currentPage","paginatedQuery","fetchFn","limit","initialCursor","totalYielded","item","collectPaginatedQuery","createPrismaFetchFn","_batchSize","calculateOffset","max","parseCursor","decoded","Buffer","from","toString","JSON","parse","createCursor","stringify","FORMULA_PREFIX_RE","sanitizeCSVCell","test","convertToCSV","delimiter","includeHeaders","flattenFields","maxFlattenDepth","flattenObject","obj","prefix","depth","result","newKey","Date","toISOString","Array","isArray","assign","flattenedRecords","allKeys","Set","keys","add","headers","sort","a","b","localeCompare","escapeCSV","sanitizedValue","replace","lines","row","header","parseCSV","csv","hasHeaders","split","filter","line","trim","parseLine","values","current","inQuotes","i","char","nextChar","dataLines","firstLine","firstRow","_","forEach","csvToJSON","pretty","parseOptions","getCSVHeaders","collectKeys","fullKey","estimateCSVSize","sampleSize","sample","sampleCSV","averageRowSize","headerSize","CREATE_EXPORT_JOB_MUTATION","triggerExportJob","serviceName","layer","actorId","actorType","workspaceId","name","entityTypes","includeMetadata","dateRangeStart","dateRangeEnd","client","GatewayClient","input","response","internalQuery","query","variables","job","createExportJob"],"mappings":"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","file":"chunk-GCY2FTHD.js","sourcesContent":["/**\n * Export Module\n *\n * Provides common utilities for data export operations across all Burdenoff microservices.\n * Includes pagination services, base exporter classes, CSV utilities, and type definitions.\n *\n * @module export\n *\n * @example\n * ```typescript\n * // Import from the export module\n * import {\n * BaseModuleExporter,\n * PaginationService,\n * convertToCSV,\n * } from '@burdenoff/be-sdk/export';\n *\n * // Create a custom exporter\n * class UserExporter extends BaseModuleExporter<User> {\n * moduleKey = 'users';\n * displayName = 'Users';\n *\n * async export(options: ExportOptions): Promise<ExportResult> {\n * const data = await this.fetchAll(\n * (cursor) => db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : {},\n * take: 100,\n * })\n * );\n *\n * const csv = convertToCSV(data);\n * return { data, format: 'csv' };\n * }\n * }\n *\n * // Use pagination utilities\n * const result = PaginationService.paginate(items, { page: 1, pageSize: 20 });\n * ```\n */\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n // Export format types\n ExportFormat,\n ExportFormatEnum,\n\n // Configuration types\n ExportConfig,\n ExportOptions,\n\n // Job types\n ExportJobStatus,\n ExportJob,\n ExportProgress,\n ExportResult,\n\n // Fetch types\n ExportFetchOptions,\n ExportFetchResult,\n\n // Pagination types\n PaginationParams,\n PaginatedResult,\n PaginatedQueryOptions,\n PaginateResult,\n PaginateQueryFn,\n\n // Module interface\n ExportableModule,\n\n // CSV types\n CSVConversionOptions,\n} from './types.js';\n\n// ============================================================================\n// Class Exports\n// ============================================================================\n\nexport { BaseModuleExporter } from './base-exporter.js';\nexport { PaginationService } from './pagination.js';\n\n// ============================================================================\n// Function Exports\n// ============================================================================\n\nexport { convertToCSV, parseCSV, csvToJSON, getCSVHeaders, estimateCSVSize } from './csv.js';\n\n// ============================================================================\n// Gateway Helper Exports\n// ============================================================================\n\nexport { triggerExportJob } from './gateway-client.js';\nexport type { TriggerExportJobParams, ExportJobResult, ExportActorType, ExportFormatGql } from './gateway-client.js';\n","/**\n * Base Module Exporter\n *\n * Abstract base class for module exporters across all Burdenoff microservices.\n * Provides common functionality for exporting data from different modules.\n *\n * @module export/base-exporter\n *\n * @example\n * ```typescript\n * import { BaseModuleExporter } from '@burdenoff/be-sdk/export';\n *\n * class UserExporter extends BaseModuleExporter<User> {\n * moduleKey = 'users';\n * displayName = 'Users';\n * description = 'Export user data';\n *\n * async export(options: ExportOptions): Promise<ExportResult> {\n * // Implementation\n * }\n * }\n * ```\n */\n\nimport type { ExportOptions, ExportResult, PaginateQueryFn, PaginateResult } from './types.js';\n\n/**\n * Abstract base class for module exporters\n *\n * Provides common functionality that all module exporters can inherit:\n * - Field filtering\n * - Pagination helpers\n * - Module metadata\n *\n * @typeParam T - The type of entity this exporter handles\n */\nexport abstract class BaseModuleExporter<T = unknown> {\n /** Unique key identifying this module (e.g., 'users', 'tags', 'orders') */\n moduleKey?: string;\n\n /** Human-readable display name for the module */\n displayName?: string;\n\n /** Description of what this module exports */\n description?: string;\n\n /** Default fields to exclude from export (e.g., sensitive data) */\n defaultExcludeFields?: string[];\n\n /** List of product IDs this exporter supports */\n supportedProducts?: string[];\n\n /** Model name for database operations */\n protected modelName?: string;\n\n /**\n * Export data from this module\n *\n * Subclasses should implement this method to perform the actual export.\n * The method is optional to allow for gradual implementation.\n *\n * @param options - Export options including format, filters, and pagination\n * @returns Export result with data or download URL\n */\n export?(options: ExportOptions): Promise<ExportResult>;\n\n /**\n * Filter fields from an entity based on exclude list\n *\n * Use this to remove sensitive or unnecessary fields from exported data.\n *\n * @param entity - Entity to filter\n * @param excludeFields - Fields to exclude (uses defaultExcludeFields if not provided)\n * @returns Filtered entity as a plain object\n *\n * @example\n * ```typescript\n * const user = { id: '1', name: 'John', password: 'secret', ssn: '123' };\n * const filtered = this.filterFields(user, ['password', 'ssn']);\n * // Result: { id: '1', name: 'John' }\n * ```\n */\n protected filterFields(entity: T | Record<string, unknown>, excludeFields?: string[]): Record<string, unknown> {\n const fieldsToExclude = excludeFields || this.defaultExcludeFields || [];\n\n if (fieldsToExclude.length === 0) {\n return entity as Record<string, unknown>;\n }\n\n const filtered: Record<string, unknown> = {};\n const record = entity as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(record)) {\n if (!fieldsToExclude.includes(key)) {\n filtered[key] = value;\n }\n }\n\n return filtered;\n }\n\n /**\n * Filter multiple entities\n *\n * @param entities - Array of entities to filter\n * @param excludeFields - Fields to exclude\n * @returns Array of filtered entities\n */\n protected filterFieldsMany(\n entities: (T | Record<string, unknown>)[],\n excludeFields?: string[]\n ): Record<string, unknown>[] {\n return entities.map((entity) => this.filterFields(entity, excludeFields));\n }\n\n /**\n * Paginate helper for database queries\n *\n * Use this to implement paginated data fetching in your export method.\n *\n * @param queryFn - Function that executes the paginated query\n * @param page - Page number (1-indexed)\n * @param pageSize - Number of items per page\n * @returns Paginated result with data and metadata\n *\n * @example\n * ```typescript\n * const result = await this.paginate(\n * async ({ skip, take }) => {\n * const items = await db.user.findMany({ skip, take });\n * const total = await db.user.count();\n * return { items, total };\n * },\n * 1,\n * 100\n * );\n * ```\n */\n protected async paginate(\n queryFn: PaginateQueryFn<T>,\n page: number = 1,\n pageSize: number = 100\n ): Promise<PaginateResult<T>> {\n const skip = (page - 1) * pageSize;\n const take = pageSize;\n\n const { items, total } = await queryFn({ skip, take });\n\n return {\n data: items,\n total,\n hasMore: skip + items.length < total,\n nextCursor: items.length > 0 && skip + items.length < total ? String(page + 1) : undefined,\n };\n }\n\n /**\n * Fetch all data using cursor-based pagination\n *\n * Use this for exporting large datasets efficiently.\n *\n * @param fetchBatch - Function to fetch a batch of data\n * @param batchSize - Number of items per batch\n * @returns All fetched items\n *\n * @example\n * ```typescript\n * const allUsers = await this.fetchAll(\n * async (cursor) => db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : undefined,\n * orderBy: { id: 'asc' },\n * take: 100,\n * }),\n * 100\n * );\n * ```\n */\n protected async fetchAll(\n fetchBatch: (cursor?: string) => Promise<(T & { id: string })[]>,\n batchSize: number = 100\n ): Promise<T[]> {\n const allItems: T[] = [];\n let cursor: string | undefined;\n\n while (true) {\n const batch = await fetchBatch(cursor);\n\n if (batch.length === 0) {\n break;\n }\n\n allItems.push(...batch);\n\n // Get cursor from last item\n const lastItem = batch[batch.length - 1];\n if (lastItem) {\n cursor = lastItem.id;\n }\n\n // If we got fewer items than batch size, we're done\n if (batch.length < batchSize) {\n break;\n }\n }\n\n return allItems;\n }\n\n /**\n * Transform entity for export\n *\n * Override this method to customize how entities are transformed before export.\n * Default implementation returns the entity as-is after field filtering.\n *\n * @param entity - Entity to transform\n * @param excludeFields - Fields to exclude\n * @returns Transformed entity\n */\n protected transformForExport(entity: T, excludeFields?: string[]): Record<string, unknown> {\n return this.filterFields(entity, excludeFields);\n }\n\n /**\n * Validate export options\n *\n * Override this to add custom validation for export options.\n *\n * @param options - Export options to validate\n * @throws Error if options are invalid\n */\n protected validateOptions(options: ExportOptions): void {\n const validFormats = ['csv', 'json', 'xlsx'];\n if (!validFormats.includes(options.format)) {\n throw new Error(`Invalid export format: ${options.format}. Valid formats: ${validFormats.join(', ')}`);\n }\n }\n\n /**\n * Get supported export formats\n *\n * @returns Array of supported format strings\n */\n getSupportedFormats(): string[] {\n return ['csv', 'json', 'xlsx'];\n }\n\n /**\n * Get module metadata\n *\n * @returns Module metadata object\n */\n getMetadata(): {\n moduleKey?: string;\n displayName?: string;\n description?: string;\n supportedProducts?: string[];\n supportedFormats: string[];\n } {\n return {\n moduleKey: this.moduleKey,\n displayName: this.displayName,\n description: this.description,\n supportedProducts: this.supportedProducts,\n supportedFormats: this.getSupportedFormats(),\n };\n }\n}\n","/**\n * Pagination Service\n *\n * Provides pagination utilities for export operations across all Burdenoff microservices.\n * Supports both offset-based and cursor-based pagination strategies.\n *\n * @module export/pagination\n *\n * @example\n * ```typescript\n * import { PaginationService } from '@burdenoff/be-sdk/export';\n *\n * // Offset-based pagination\n * const result = PaginationService.paginate(items, { page: 2, pageSize: 20 });\n *\n * // Cursor-based pagination with async generator\n * for await (const item of PaginationService.paginatedQuery(fetchFn, { limit: 100 })) {\n * console.log(item);\n * }\n * ```\n */\n\nimport type { PaginatedQueryOptions, PaginatedResult, PaginationParams } from './types.js';\n\n/**\n * Service providing pagination utilities for export and data fetching operations\n */\nexport class PaginationService {\n /**\n * Paginate an array of items using offset-based pagination\n *\n * @param items - Array of items to paginate\n * @param params - Pagination parameters\n * @returns Paginated result with items and metadata\n *\n * @example\n * ```typescript\n * const allUsers = await db.user.findMany();\n * const page = PaginationService.paginate(allUsers, { page: 1, pageSize: 10 });\n * console.log(page.items); // First 10 users\n * console.log(page.pageInfo.hasNextPage); // true if more pages exist\n * ```\n */\n static paginate<T>(items: T[], params: PaginationParams): PaginatedResult<T> {\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 20;\n const start = (page - 1) * pageSize;\n const end = start + pageSize;\n\n const paginatedItems = items.slice(start, end);\n\n return {\n items: paginatedItems,\n totalCount: items.length,\n pageInfo: {\n hasNextPage: end < items.length,\n hasPreviousPage: page > 1,\n startCursor: paginatedItems.length > 0 ? String(start) : undefined,\n endCursor: paginatedItems.length > 0 ? String(Math.min(end, items.length) - 1) : undefined,\n },\n };\n }\n\n /**\n * Calculate pagination metadata without slicing data\n *\n * @param totalCount - Total number of items\n * @param page - Current page number (1-indexed)\n * @param pageSize - Items per page\n * @returns Pagination metadata\n *\n * @example\n * ```typescript\n * const meta = PaginationService.calculatePagination(150, 3, 20);\n * // meta.hasNextPage = true (page 4 exists)\n * // meta.hasPreviousPage = true (page 2 exists)\n * // meta.totalPages = 8\n * ```\n */\n static calculatePagination(\n totalCount: number,\n page: number,\n pageSize: number\n ): {\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n totalPages: number;\n currentPage: number;\n pageSize: number;\n startIndex: number;\n endIndex: number;\n } {\n const totalPages = Math.ceil(totalCount / pageSize);\n const startIndex = (page - 1) * pageSize;\n const endIndex = Math.min(startIndex + pageSize - 1, totalCount - 1);\n\n return {\n hasNextPage: page < totalPages,\n hasPreviousPage: page > 1,\n totalPages,\n currentPage: page,\n pageSize,\n startIndex,\n endIndex,\n };\n }\n\n /**\n * Async generator for paginated database queries using cursor-based pagination\n *\n * This is ideal for processing large datasets without loading everything into memory.\n * The generator yields items one at a time, fetching new batches as needed.\n *\n * @param fetchFn - Function to fetch data given a cursor\n * @param options - Pagination options\n * @returns Async generator of items\n *\n * @example\n * ```typescript\n * // Define fetch function that queries the database\n * const fetchUsers = async (cursor?: string) => {\n * return db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : undefined,\n * orderBy: { id: 'asc' },\n * take: 100,\n * });\n * };\n *\n * // Process all users without loading all into memory\n * for await (const user of PaginationService.paginatedQuery(fetchUsers)) {\n * await processUser(user);\n * }\n * ```\n */\n static async *paginatedQuery<T extends { id: string }>(\n fetchFn: (cursor?: string) => Promise<T[]>,\n options: PaginatedQueryOptions = {}\n ): AsyncGenerator<T, void, unknown> {\n const { limit, initialCursor } = options;\n let cursor = initialCursor;\n let hasMore = true;\n let totalYielded = 0;\n\n while (hasMore) {\n const items = await fetchFn(cursor);\n\n if (items.length === 0) {\n break;\n }\n\n for (const item of items) {\n yield item;\n totalYielded++;\n\n if (limit && totalYielded >= limit) {\n return;\n }\n }\n\n // Get next cursor from last item\n const lastItem = items[items.length - 1];\n if (lastItem) {\n cursor = lastItem.id;\n }\n\n // If we got fewer items than expected batch size, we're done\n // Note: This assumes fetchFn respects a consistent batch size internally\n hasMore = items.length > 0;\n }\n }\n\n /**\n * Collect all items from a paginated query into an array\n *\n * @param fetchFn - Function to fetch data given a cursor\n * @param options - Pagination options\n * @returns Array of all items\n *\n * @example\n * ```typescript\n * const allUsers = await PaginationService.collectPaginatedQuery(fetchUsers, { limit: 1000 });\n * ```\n */\n static async collectPaginatedQuery<T extends { id: string }>(\n fetchFn: (cursor?: string) => Promise<T[]>,\n options: PaginatedQueryOptions = {}\n ): Promise<T[]> {\n const items: T[] = [];\n\n for await (const item of PaginationService.paginatedQuery(fetchFn, options)) {\n items.push(item);\n }\n\n return items;\n }\n\n /**\n * Create a cursor-based paginated fetch function from a Prisma-style query\n *\n * @param queryFn - Prisma-style query function\n * @param batchSize - Number of items to fetch per batch\n * @returns Fetch function compatible with paginatedQuery\n *\n * @example\n * ```typescript\n * const fetchFn = PaginationService.createPrismaFetchFn(\n * (cursor) => db.user.findMany({\n * where: { isActive: true, ...(cursor ? { id: { gt: cursor } } : {}) },\n * orderBy: { id: 'asc' },\n * take: 100,\n * }),\n * 100\n * );\n *\n * for await (const user of PaginationService.paginatedQuery(fetchFn)) {\n * console.log(user);\n * }\n * ```\n */\n static createPrismaFetchFn<T extends { id: string }>(\n queryFn: (cursor?: string) => Promise<T[]>,\n _batchSize: number = 100\n ): (cursor?: string) => Promise<T[]> {\n return queryFn;\n }\n\n /**\n * Calculate offset for skip-based pagination\n *\n * @param page - Page number (1-indexed)\n * @param pageSize - Items per page\n * @returns Offset value for skip\n */\n static calculateOffset(page: number, pageSize: number): number {\n return (Math.max(1, page) - 1) * pageSize;\n }\n\n /**\n * Parse cursor string to extract pagination state\n *\n * @param cursor - Base64-encoded cursor string\n * @returns Decoded cursor data or null if invalid\n */\n static parseCursor<T = Record<string, unknown>>(cursor: string): T | null {\n try {\n const decoded = Buffer.from(cursor, 'base64').toString('utf-8');\n return JSON.parse(decoded) as T;\n } catch {\n return null;\n }\n }\n\n /**\n * Create cursor string from pagination state\n *\n * @param data - Data to encode in cursor\n * @returns Base64-encoded cursor string\n */\n static createCursor(data: Record<string, unknown>): string {\n return Buffer.from(JSON.stringify(data)).toString('base64');\n }\n}\n","/**\n * CSV Utilities\n *\n * Utilities for converting data to CSV format for export operations.\n *\n * @module export/csv\n *\n * @example\n * ```typescript\n * import { convertToCSV, parseCSV } from '@burdenoff/be-sdk/export';\n *\n * const csv = convertToCSV(users, { includeHeaders: true });\n * console.log(csv);\n * ```\n */\n\nimport type { CSVConversionOptions } from './types.js';\n\nconst FORMULA_PREFIX_RE = /^[=+\\-@]/;\n\nexport function sanitizeCSVCell(value: string): string {\n return FORMULA_PREFIX_RE.test(value) ? `'${value}` : value;\n}\n\n/**\n * Convert an array of objects to CSV format\n *\n * Handles nested objects by flattening them with dot notation.\n * Arrays are JSON stringified.\n * Dates are converted to ISO strings.\n *\n * @param data - Array of objects to convert\n * @param options - CSV conversion options\n * @returns CSV string\n *\n * @example\n * ```typescript\n * const users = [\n * { id: 1, name: 'John', address: { city: 'NYC' } },\n * { id: 2, name: 'Jane', address: { city: 'LA' } },\n * ];\n *\n * const csv = convertToCSV(users);\n * // Output:\n * // id,name,address.city\n * // 1,John,NYC\n * // 2,Jane,LA\n * ```\n */\nexport function convertToCSV(data: unknown[], options: CSVConversionOptions = {}): string {\n const { delimiter = ',', includeHeaders = true, flattenFields = true, maxFlattenDepth = 3 } = options;\n\n if (data.length === 0) {\n return '';\n }\n\n // Flatten objects and get all keys\n const flattenObject = (obj: unknown, prefix = '', depth = 0): Record<string, string> => {\n const result: Record<string, string> = {};\n\n if (obj === null || obj === undefined) {\n return result;\n }\n\n if (typeof obj !== 'object') {\n return { [prefix || 'value']: String(obj) };\n }\n\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (value === null || value === undefined) {\n result[newKey] = '';\n } else if (value instanceof Date) {\n result[newKey] = value.toISOString();\n } else if (Array.isArray(value)) {\n result[newKey] = JSON.stringify(value);\n } else if (typeof value === 'object' && flattenFields && depth < maxFlattenDepth) {\n Object.assign(result, flattenObject(value, newKey, depth + 1));\n } else if (typeof value === 'object') {\n result[newKey] = JSON.stringify(value);\n } else {\n result[newKey] = String(value);\n }\n }\n\n return result;\n };\n\n // Flatten all records and collect all keys\n const flattenedRecords = data.map((item) => flattenObject(item));\n const allKeys = new Set<string>();\n for (const record of flattenedRecords) {\n for (const key of Object.keys(record)) {\n allKeys.add(key);\n }\n }\n\n const headers = Array.from(allKeys).sort((a, b) => a.localeCompare(b));\n\n // Escape CSV values\n const escapeCSV = (value: string): string => {\n const sanitizedValue = sanitizeCSVCell(value);\n\n if (\n sanitizedValue.includes(delimiter) ||\n sanitizedValue.includes('\"') ||\n sanitizedValue.includes('\\n') ||\n sanitizedValue.includes('\\r')\n ) {\n return `\"${sanitizedValue.replace(/\"/g, '\"\"')}\"`;\n }\n return sanitizedValue;\n };\n\n // Build CSV\n const lines: string[] = [];\n\n if (includeHeaders) {\n lines.push(headers.map(escapeCSV).join(delimiter));\n }\n\n for (const record of flattenedRecords) {\n const row = headers.map((header) => escapeCSV(record[header] || ''));\n lines.push(row.join(delimiter));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Parse a CSV string into an array of objects\n *\n * @param csv - CSV string to parse\n * @param options - Parse options\n * @returns Array of parsed objects\n *\n * @example\n * ```typescript\n * const csv = 'id,name\\n1,John\\n2,Jane';\n * const data = parseCSV(csv);\n * // [{ id: '1', name: 'John' }, { id: '2', name: 'Jane' }]\n * ```\n */\nexport function parseCSV(\n csv: string,\n options: { delimiter?: string; hasHeaders?: boolean } = {}\n): Record<string, string>[] {\n const { delimiter = ',', hasHeaders = true } = options;\n\n const lines = csv.split(/\\r?\\n/).filter((line) => line.trim());\n\n if (lines.length === 0) {\n return [];\n }\n\n // Parse a single CSV line, handling quoted values\n const parseLine = (line: string): string[] => {\n const values: string[] = [];\n let current = '';\n let inQuotes = false;\n\n let i = 0;\n while (i < line.length) {\n const char = line[i];\n const nextChar = line[i + 1];\n\n if (char === '\"' && inQuotes && nextChar === '\"') {\n current += '\"';\n i += 2; // Skip next quote\n } else if (char === '\"') {\n inQuotes = !inQuotes;\n i++;\n } else if (char === delimiter && !inQuotes) {\n values.push(current);\n current = '';\n i++;\n } else {\n current += char;\n i++;\n }\n }\n\n values.push(current);\n return values;\n };\n\n let headers: string[];\n let dataLines: string[];\n\n // We've already checked that lines.length > 0, so lines[0] is guaranteed to exist\n const firstLine = lines[0] as string;\n\n if (hasHeaders) {\n headers = parseLine(firstLine);\n dataLines = lines.slice(1);\n } else {\n // Generate numeric headers if no header row\n const firstRow = parseLine(firstLine);\n headers = firstRow.map((_, i) => `col${i}`);\n dataLines = lines;\n }\n\n return dataLines.map((line) => {\n const values = parseLine(line);\n const obj: Record<string, string> = {};\n\n headers.forEach((header, i) => {\n obj[header] = values[i] || '';\n });\n\n return obj;\n });\n}\n\n/**\n * Convert CSV to JSON string\n *\n * @param csv - CSV string\n * @param options - Parse options\n * @returns JSON string\n */\nexport function csvToJSON(\n csv: string,\n options: { delimiter?: string; hasHeaders?: boolean; pretty?: boolean } = {}\n): string {\n const { pretty = false, ...parseOptions } = options;\n const data = parseCSV(csv, parseOptions);\n return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n}\n\n/**\n * Get CSV headers from data\n *\n * @param data - Array of objects\n * @param flattenFields - Whether to flatten nested objects\n * @returns Array of header strings\n */\nexport function getCSVHeaders(data: unknown[], flattenFields: boolean = true): string[] {\n if (data.length === 0) {\n return [];\n }\n\n const collectKeys = (obj: unknown, prefix = '', depth = 0): string[] => {\n const keys: string[] = [];\n\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return prefix ? [prefix] : [];\n }\n\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n flattenFields &&\n depth < 3\n ) {\n keys.push(...collectKeys(value, fullKey, depth + 1));\n } else {\n keys.push(fullKey);\n }\n }\n\n return keys;\n };\n\n const allKeys = new Set<string>();\n for (const item of data) {\n for (const key of collectKeys(item)) {\n allKeys.add(key);\n }\n }\n\n return Array.from(allKeys).sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Estimate CSV file size for a dataset\n *\n * @param data - Array of objects\n * @param sampleSize - Number of records to sample for estimation\n * @returns Estimated size in bytes\n */\nexport function estimateCSVSize(data: unknown[], sampleSize: number = 100): number {\n if (data.length === 0) {\n return 0;\n }\n\n // Take a sample to estimate average row size\n const sample = data.slice(0, Math.min(sampleSize, data.length));\n const sampleCSV = convertToCSV(sample);\n const averageRowSize = sampleCSV.length / sample.length;\n\n // Estimate total size (headers + data rows)\n const headers = getCSVHeaders(data);\n const headerSize = headers.join(',').length + 1; // +1 for newline\n\n return Math.ceil(headerSize + averageRowSize * data.length);\n}\n","/**\n * Export Gateway Helper\n *\n * Centralised wrapper around the workspace internal gateway's\n * `createExportJob` mutation, used by per-svc convenience resolvers\n * (e.g. `createTagsExportJob`, `createGroupsExportJob`).\n *\n * Replaces the duplicated `src/clients/export-gateway.ts` files that\n * existed in 19+ workspace svcs.\n *\n * @module export/gateway-client\n *\n * @example\n * ```typescript\n * import { triggerExportJob } from '@burdenoff/be-sdk/export';\n *\n * const result = await triggerExportJob({\n * serviceName: 'wspace-tags-svc',\n * workspaceId: ctx.workspaceId,\n * name: input.name,\n * entityTypes: ['tags', 'vocabularies'],\n * format: input.format,\n * actorId: ctx.actorId,\n * actorType: ctx.actorType,\n * });\n * ```\n */\n\nimport { GatewayClient } from '../gateway/index.js';\nimport type { ServiceLayer } from '../types/layer.js';\n\nconst CREATE_EXPORT_JOB_MUTATION = `mutation CreateExportJob($input: CreateExportJobInput!) {\n createExportJob(input: $input) {\n id\n status\n workspaceId\n entityTypes\n format\n createdAt\n }\n}`;\n\nexport type ExportActorType = 'user' | 'app' | 'service' | 'super_admin';\nexport type ExportFormatGql = 'JSON' | 'CSV';\n\nexport interface TriggerExportJobParams {\n /** Caller service name, used by gateway client telemetry/auth */\n serviceName: string;\n /** Layer for the gateway. Defaults to `wspace`. */\n layer?: ServiceLayer;\n /** Workspace context (required for wspace exports). */\n workspaceId: string;\n /** Human-readable name for the export job. */\n name: string;\n /** Entity types registered in `wspace-export-svc` to include. */\n entityTypes: string[];\n /** Output format. */\n format: ExportFormatGql;\n /** Actor making the request (forwarded to RBAC). */\n actorId: string;\n actorType: ExportActorType;\n /** Whether to include extended metadata in the export ZIP. */\n includeMetadata?: boolean;\n /** Optional ISO date-range bounds. */\n dateRangeStart?: string;\n dateRangeEnd?: string;\n}\n\nexport interface ExportJobResult {\n id: string;\n status: string;\n workspaceId: string;\n entityTypes: string[];\n format: string;\n createdAt: string;\n}\n\ninterface CreateExportJobResponse {\n createExportJob?: ExportJobResult;\n}\n\n/**\n * Submit a `createExportJob` mutation to the workspace internal gateway.\n *\n * The caller is expected to map the returned `ExportJobResult` to its\n * own GraphQL output type (the per-svc `ExportJobResponse`).\n */\nexport async function triggerExportJob(params: TriggerExportJobParams): Promise<ExportJobResult> {\n const {\n serviceName,\n layer = 'wspace',\n actorId,\n actorType,\n workspaceId,\n name,\n entityTypes,\n format,\n includeMetadata,\n dateRangeStart,\n dateRangeEnd,\n } = params;\n\n const client = new GatewayClient({ layer, serviceName });\n\n const input = {\n workspaceId,\n name,\n entityTypes,\n format,\n ...(includeMetadata !== undefined ? { includeMetadata } : {}),\n ...(dateRangeStart !== undefined ? { dateRangeStart } : {}),\n ...(dateRangeEnd !== undefined ? { dateRangeEnd } : {}),\n };\n\n const response = await client.internalQuery<CreateExportJobResponse>({\n query: CREATE_EXPORT_JOB_MUTATION,\n variables: { input },\n headers: {\n 'x-actor-id': actorId,\n 'x-actor-type': actorType,\n 'x-workspace-id': workspaceId,\n },\n });\n\n const job = response.data?.createExportJob;\n if (!job) {\n throw new Error('Export service did not return a job');\n }\n return job;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { security_exports } from './chunk-WHSIZCJX.js';
2
- import { LayerManager } from './chunk-UIMPJNWC.js';
1
+ import { security_exports } from './chunk-LHLOJS52.js';
2
+ import { LayerManager } from './chunk-7UJXIX4I.js';
3
3
  import { signServiceJwt } from './chunk-VFCMR5GX.js';
4
4
  import { ContextManager } from './chunk-RZOFS2BQ.js';
5
5
  import { DEFAULT_CIRCUIT_BREAKER_CONFIG, DEFAULT_GATEWAY_RETRY_CONFIG } from './chunk-YFOHAHZE.js';
@@ -522,5 +522,5 @@ function createGatewayClientFromEnv() {
522
522
  __name(createGatewayClientFromEnv, "createGatewayClientFromEnv");
523
523
 
524
524
  export { CircuitState, GatewayClient, GatewayError, GatewayErrorType, createGatewayClient, createGatewayClientFromEnv, gateway_exports };
525
- //# sourceMappingURL=chunk-IDKU7OGF.js.map
526
- //# sourceMappingURL=chunk-IDKU7OGF.js.map
525
+ //# sourceMappingURL=chunk-GVZ5BDER.js.map
526
+ //# sourceMappingURL=chunk-GVZ5BDER.js.map