@growthub/primitives
Version:
Stateless utility functions and primitives for the Growthub Marketing OS
1 lines • 23.3 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/validation.ts","../src/brand.ts","../src/agent.ts","../src/utils.ts"],"sourcesContent":["/**\n * @growthub/primitives - Growthub Marketing OS Primitives\n * \n * Stateless utility functions and primitives for the Growthub Marketing OS.\n * These utilities contain no business logic and are perfect for open-source distribution.\n * \n * @license MIT\n * @version 1.0.0\n */\n\n// Re-export all utilities\nexport * from './validation';\nexport * from './brand';\nexport * from './agent';\nexport * from './utils';\n\n// Version info\nexport const PRIMITIVES_VERSION = '1.0.0';\n\n// Package metadata\nexport const packageInfo = {\n name: '@growthub/primitives',\n version: PRIMITIVES_VERSION,\n description: 'Stateless utility functions and primitives for the Growthub Marketing OS',\n license: 'MIT'\n} as const; ","/**\n * Validation utilities for the Growthub Marketing OS\n */\n\nimport { z } from 'zod';\nimport type { \n BrandKitSchema, \n AgentTaskSchema, \n CompilerContextSchema \n} from '@growthub/schemas';\n\n// Generic validation result type\nexport interface ValidationResult<T> {\n success: boolean;\n data?: T;\n errors?: string[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Generic validation function that works with any Zod schema\n */\nexport function validateWithSchema<T extends z.ZodSchema>(\n schema: T,\n data: unknown\n): ValidationResult<z.infer<T>> {\n try {\n const result = schema.safeParse(data);\n \n if (result.success) {\n return {\n success: true,\n data: result.data\n };\n } else {\n return {\n success: false,\n errors: result.error.errors.map(err => `${err.path.join('.')}: ${err.message}`)\n };\n }\n } catch (error) {\n return {\n success: false,\n errors: [error instanceof Error ? error.message : 'Unknown validation error']\n };\n }\n}\n\n/**\n * Sanitize user input for safe processing\n */\nexport function sanitizeUserInput(input: string): string {\n return input\n .trim()\n .replace(/[<>]/g, '') // Remove basic HTML tags\n .replace(/javascript:/gi, '') // Remove javascript: protocols\n .substring(0, 5000); // Limit length\n}\n\n/**\n * Validate email format\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n/**\n * Validate URL format\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate hex color format\n */\nexport function isValidHexColor(color: string): boolean {\n const hexRegex = /^#[0-9A-F]{6}$/i;\n return hexRegex.test(color);\n}\n\n/**\n * Validate UUID format\n */\nexport function isValidUuid(uuid: string): boolean {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidRegex.test(uuid);\n} ","/**\n * Brand utilities for the Growthub Marketing OS\n */\n\n/**\n * Extract colors from a hex color string\n */\nexport function parseHexColor(hex: string): { r: number; g: number; b: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : null;\n}\n\n/**\n * Convert RGB to HSL\n */\nexport function rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n\n return { h: h * 360, s: s * 100, l: l * 100 };\n}\n\n/**\n * Generate a color palette from a base color\n */\nexport function generateColorPalette(baseColor: string, count = 5): string[] {\n const rgb = parseHexColor(baseColor);\n if (!rgb) return [baseColor];\n\n const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n const palette: string[] = [];\n\n for (let i = 0; i < count; i++) {\n const lightness = Math.max(10, Math.min(90, hsl.l + (i - Math.floor(count / 2)) * 20));\n const newHsl = { ...hsl, l: lightness };\n palette.push(hslToHex(newHsl.h, newHsl.s, newHsl.l));\n }\n\n return palette;\n}\n\n/**\n * Convert HSL to hex\n */\nfunction hslToHex(h: number, s: number, l: number): string {\n h /= 360;\n s /= 100;\n l /= 100;\n\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1/6) return p + (q - p) * 6 * t;\n if (t < 1/2) return q;\n if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n const r = Math.round(hue2rgb(p, q, h + 1/3) * 255);\n const g = Math.round(hue2rgb(p, q, h) * 255);\n const b = Math.round(hue2rgb(p, q, h - 1/3) * 255);\n\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\n/**\n * Brand voice tone analyzer\n */\nexport function analyzeBrandVoice(text: string): {\n tone: 'professional' | 'casual' | 'friendly' | 'authoritative' | 'playful' | 'luxurious';\n confidence: number;\n} {\n const patterns = {\n professional: /\\b(solution|expertise|quality|professional|business|enterprise)\\b/gi,\n casual: /\\b(hey|cool|awesome|great|nice|fun)\\b/gi,\n friendly: /\\b(welcome|hello|thanks|please|happy|enjoy)\\b/gi,\n authoritative: /\\b(proven|leader|best|expert|trusted|reliable)\\b/gi,\n playful: /\\b(amazing|fantastic|exciting|fun|creative|innovative)\\b/gi,\n luxurious: /\\b(premium|exclusive|elegant|sophisticated|luxury|finest)\\b/gi,\n };\n\n let maxScore = 0;\n let dominantTone: keyof typeof patterns = 'professional';\n\n Object.entries(patterns).forEach(([tone, pattern]) => {\n const matches = text.match(pattern);\n const score = matches ? matches.length : 0;\n \n if (score > maxScore) {\n maxScore = score;\n dominantTone = tone as keyof typeof patterns;\n }\n });\n\n const totalWords = text.split(/\\s+/).length;\n const confidence = Math.min(1, maxScore / Math.max(1, totalWords * 0.1));\n\n return {\n tone: dominantTone,\n confidence\n };\n} ","/**\n * Agent utilities for the Growthub Marketing OS\n */\n\n/**\n * Agent task status utilities\n */\nexport type AgentTaskStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n\n/**\n * Check if an agent task status indicates completion\n */\nexport function isTaskCompleted(status: AgentTaskStatus): boolean {\n return ['completed', 'failed', 'cancelled'].includes(status);\n}\n\n/**\n * Check if an agent task is currently active\n */\nexport function isTaskActive(status: AgentTaskStatus): boolean {\n return ['pending', 'running'].includes(status);\n}\n\n/**\n * Calculate task progress based on status\n */\nexport function getTaskProgress(status: AgentTaskStatus): number {\n const progressMap: Record<AgentTaskStatus, number> = {\n pending: 0,\n running: 50,\n completed: 100,\n failed: 100,\n cancelled: 0\n };\n \n return progressMap[status] ?? 0;\n}\n\n/**\n * Generate a unique run ID for agent tasks\n */\nexport function generateRunId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substr(2, 5);\n return `run_${timestamp}_${random}`;\n}\n\n/**\n * Generate a unique thread ID\n */\nexport function generateThreadId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substr(2, 8);\n return `thread_${timestamp}_${random}`;\n}\n\n/**\n * Parse agent context from a string\n */\nexport function parseAgentContext(contextStr: string): Record<string, unknown> {\n try {\n return JSON.parse(contextStr);\n } catch {\n return {};\n }\n}\n\n/**\n * Serialize agent context to string\n */\nexport function serializeAgentContext(context: Record<string, unknown>): string {\n try {\n return JSON.stringify(context, null, 2);\n } catch {\n return '{}';\n }\n}\n\n/**\n * Extract agent type from a run ID or context\n */\nexport function extractAgentType(input: string): string | null {\n // Try to extract from run ID pattern\n const runIdMatch = input.match(/agent_([A-Z_]+)/);\n if (runIdMatch) {\n return runIdMatch[1];\n }\n \n // Try to parse as JSON and extract agentType\n try {\n const parsed = JSON.parse(input);\n return parsed.agentType || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Calculate estimated completion time based on task complexity\n */\nexport function estimateTaskDuration(taskType: string, complexity: 'low' | 'medium' | 'high'): number {\n const baseTimes: Record<string, number> = {\n 'CONTENT_GENERATION_AGENT': 30000, // 30 seconds\n 'IMAGE_GENERATION_AGENT': 60000, // 60 seconds\n 'EMAIL_MARKETING_AGENT': 45000, // 45 seconds\n 'SOCIAL_MEDIA_AGENT': 20000, // 20 seconds\n 'BRAND_ANALYSIS_AGENT': 90000, // 90 seconds\n 'SEO_OPTIMIZATION_AGENT': 120000, // 2 minutes\n };\n\n const multipliers = {\n low: 0.7,\n medium: 1.0,\n high: 1.5\n };\n\n const baseTime = baseTimes[taskType] || 60000;\n const multiplier = multipliers[complexity];\n \n return Math.round(baseTime * multiplier);\n}\n\n/**\n * Format agent execution metadata for display\n */\nexport function formatExecutionMetadata(metadata: Record<string, unknown>): string {\n const entries = Object.entries(metadata)\n .filter(([key]) => !key.startsWith('_'))\n .map(([key, value]) => {\n const formattedKey = key.replace(/([A-Z])/g, ' $1').toLowerCase().trim();\n const formattedValue = typeof value === 'object' ? JSON.stringify(value) : String(value);\n return `${formattedKey}: ${formattedValue}`;\n });\n \n return entries.join('\\n');\n} ","/**\n * General utilities for the Growthub Marketing OS\n */\n\n/**\n * Sleep for a specified number of milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n maxRetries = 3,\n baseDelay = 1000\n): Promise<T> {\n let lastError: Error | null = null;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n \n if (attempt === maxRetries) {\n throw lastError;\n }\n \n const delay = baseDelay * Math.pow(2, attempt);\n await sleep(delay);\n }\n }\n \n throw lastError;\n}\n\n/**\n * Debounce a function\n */\nexport function debounce<T extends (...args: Parameters<T>) => ReturnType<T>>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout | null = null;\n \n return (...args: Parameters<T>) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n \n timeout = setTimeout(() => {\n func(...args);\n }, wait);\n };\n}\n\n/**\n * Throttle a function\n */\nexport function throttle<T extends (...args: Parameters<T>) => ReturnType<T>>(\n func: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let inThrottle = false;\n \n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n func(...args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n \n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T;\n }\n \n if (obj instanceof Array) {\n return obj.map(item => deepClone(item)) as unknown as T;\n }\n \n if (typeof obj === 'object') {\n const cloned = {} as Record<string, unknown>;\n Object.keys(obj).forEach(key => {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n });\n return cloned as T;\n }\n \n return obj;\n}\n\n/**\n * Check if two objects are deeply equal\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n \n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n \n if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) {\n return a === b;\n }\n \n if (a === null || a === undefined || b === null || b === undefined) {\n return false;\n }\n \n if (a.constructor !== b.constructor) return false;\n \n const keysA = Object.keys(a as Record<string, unknown>);\n const keysB = Object.keys(b as Record<string, unknown>);\n \n if (keysA.length !== keysB.length) {\n return false;\n }\n \n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n \n if (!deepEqual(\n (a as Record<string, unknown>)[key], \n (b as Record<string, unknown>)[key]\n )) {\n return false;\n }\n }\n \n return true;\n}\n\n/**\n * Convert camelCase to snake_case\n */\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Convert snake_case to camelCase\n */\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Format bytes to human readable string\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 Bytes';\n \n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n \n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n}\n\n/**\n * Generate a random string of specified length\n */\nexport function randomString(length = 10): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n \n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n \n return result;\n}\n\n/**\n * Truncate text to specified length with ellipsis\n */\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) {\n return text;\n }\n \n return text.slice(0, maxLength - 3) + '...';\n}\n\n/**\n * Check if code is running in browser environment\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * Check if code is running in Node.js environment\n */\nexport function isNode(): boolean {\n return typeof process !== 'undefined' && process.versions?.node !== undefined;\n} "],"mappings":"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","names":["p","q"]}