@vocoweb/kernel 1.0.0

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/shared/errors.ts","../src/config/env.ts","../src/auth/config.ts","../src/auth/client.ts","../src/privacy/compliance-map.ts","../src/privacy/obliterate.ts","../src/index.ts","../src/shared/utils.ts","../src/auth/index.ts","../src/auth/server.ts","../src/auth/components/VocoAuth.tsx","../src/billing/vat.ts","../src/billing/checkout.ts","../src/billing/webhook.ts","../src/billing/invoices.ts","../src/billing/index.ts","../src/legal/components/PrivacyPolicy.tsx","../src/legal/components/TermsOfService.tsx","../src/legal/components/CookieConsent.tsx","../src/legal/export.ts","../src/legal/index.ts","../src/privacy/index.ts","../src/accessibility/validators.ts","../src/accessibility/components/VocoButton.tsx","../src/accessibility/components/VocoInput.tsx","../src/accessibility/components/VocoForm.tsx","../src/accessibility/index.ts","../src/residency/detector.ts","../src/residency/whitelist.ts","../src/residency/middleware.ts","../src/residency/index.ts","../src/audit/recorder.ts","../src/audit/components/VocoAuditLog.tsx","../src/audit/index.ts"],"names":["VocoError","VocoAuthError","VocoBillingError","VocoConfigError","VocoComplianceError","VocoAccessibilityError","VocoValidationError","VocoNetworkError","config","z","createClient","ClientType","clientAuth","obliterate","Stripe","twMerge","clsx","jwtDecode","useState","useCallback","jsx","jsxs","loginWithGoogle","signInWithPassword","signUp","logout","getSession","getUser","onAuthStateChange","customer","getStripe","formatDate","useEffect","categories","Fragment","checkDeletionStatus","el","forwardRef","middleware","detectUrlRegion","DEFAULT_CONFIG"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Custom error classes for @vocoweb/kernel\n */\n\n/**\n * Base VocoWeb error\n */\nexport class VocoError extends Error {\n constructor(\n message: string,\n public code: string,\n public statusCode: number = 500,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'VocoError';\n Error.captureStackTrace(this, this.constructor);\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n details: this.details,\n };\n }\n}\n\n/**\n * Authentication errors\n */\nexport class VocoAuthError extends VocoError {\n constructor(message: string, code: string = 'AUTH_ERROR', details?: Record<string, unknown>) {\n super(message, code, 401, details);\n this.name = 'VocoAuthError';\n }\n\n static invalidCredentials(): VocoAuthError {\n return new VocoAuthError('Invalid email or password', 'INVALID_CREDENTIALS');\n }\n\n static sessionExpired(): VocoAuthError {\n return new VocoAuthError('Session has expired', 'SESSION_EXPIRED');\n }\n\n static unauthorized(message = 'Unauthorized access'): VocoAuthError {\n return new VocoAuthError(message, 'UNAUTHORIZED');\n }\n\n static forbidden(message = 'Access forbidden'): VocoAuthError {\n const error = new VocoAuthError(message, 'FORBIDDEN');\n error.statusCode = 403;\n return error;\n }\n}\n\n/**\n * Payment errors\n */\nexport class VocoBillingError extends VocoError {\n constructor(message: string, code: string = 'BILLING_ERROR', details?: Record<string, unknown>) {\n super(message, code, 400, details);\n this.name = 'VocoBillingError';\n }\n\n static invalidVatNumber(vatNumber: string): VocoBillingError {\n return new VocoBillingError(\n `Invalid VAT number: ${vatNumber}`,\n 'INVALID_VAT_NUMBER',\n { vatNumber }\n );\n }\n\n static vatValidationFailed(vatNumber: string, reason: string): VocoBillingError {\n return new VocoBillingError(\n `VAT validation failed for ${vatNumber}: ${reason}`,\n 'VAT_VALIDATION_FAILED',\n { vatNumber, reason }\n );\n }\n\n static paymentRequired(message = 'Payment required'): VocoBillingError {\n const error = new VocoBillingError(message, 'PAYMENT_REQUIRED');\n error.statusCode = 402;\n return error;\n }\n\n static checkoutFailed(reason: string): VocoBillingError {\n return new VocoBillingError(\n `Checkout failed: ${reason}`,\n 'CHECKOUT_FAILED',\n { reason }\n );\n }\n\n static subscriptionNotFound(): VocoBillingError {\n return new VocoBillingError('Subscription not found', 'SUBSCRIPTION_NOT_FOUND');\n }\n\n static invoiceNotFound(invoiceId: string): VocoBillingError {\n return new VocoBillingError(\n `Invoice not found: ${invoiceId}`,\n 'INVOICE_NOT_FOUND',\n { invoiceId }\n );\n }\n}\n\n/**\n * Configuration errors\n */\nexport class VocoConfigError extends VocoError {\n constructor(message: string, code: string = 'CONFIG_ERROR', details?: Record<string, unknown>) {\n super(message, code, 500, details);\n this.name = 'VocoConfigError';\n }\n\n static missingEnvVar(varName: string): VocoConfigError {\n return new VocoConfigError(\n `Missing required environment variable: ${varName}`,\n 'MISSING_ENV_VAR',\n { varName }\n );\n }\n\n static invalidConfig(message: string): VocoConfigError {\n return new VocoConfigError(`Invalid configuration: ${message}`, 'INVALID_CONFIG');\n }\n}\n\n/**\n * Compliance errors\n */\nexport class VocoComplianceError extends VocoError {\n constructor(message: string, code: string = 'COMPLIANCE_ERROR', details?: Record<string, unknown>) {\n super(message, code, 400, details);\n this.name = 'VocoComplianceError';\n }\n\n static deletionFailed(userId: string, reason: string): VocoComplianceError {\n return new VocoComplianceError(\n `GDPR deletion failed for user ${userId}: ${reason}`,\n 'DELETION_FAILED',\n { userId, reason }\n );\n }\n\n static deletionInProgress(userId: string): VocoComplianceError {\n return new VocoComplianceError(\n `Deletion already in progress for user ${userId}`,\n 'DELETION_IN_PROGRESS',\n { userId }\n );\n }\n\n static invalidEntityType(entityType: string): VocoComplianceError {\n return new VocoComplianceError(\n `Invalid entity type: ${entityType}`,\n 'INVALID_ENTITY_TYPE',\n { entityType }\n );\n }\n\n static anonymizationFailed(table: string, reason: string): VocoComplianceError {\n return new VocoComplianceError(\n `Anonymization failed for table ${table}: ${reason}`,\n 'ANONYMIZATION_FAILED',\n { table, reason }\n );\n }\n\n static externalApiFailed(service: string, reason: string): VocoComplianceError {\n return new VocoComplianceError(\n `External API call failed for ${service}: ${reason}`,\n 'EXTERNAL_API_FAILED',\n { service, reason }\n );\n }\n\n static dataExportFailed(userId: string, reason: string): VocoComplianceError {\n return new VocoComplianceError(\n `Data export failed for user ${userId}: ${reason}`,\n 'EXPORT_FAILED',\n { userId, reason }\n );\n }\n\n static egressBlocked(destination: string, reason: string): VocoComplianceError {\n const error = new VocoComplianceError(\n `Request to ${destination} blocked: ${reason}`,\n 'EGRESS_BLOCKED',\n { destination, reason }\n );\n error.statusCode = 403;\n return error;\n }\n}\n\n/**\n * Accessibility errors\n */\nexport class VocoAccessibilityError extends VocoError {\n constructor(message: string, code: string = 'A11Y_ERROR', details?: Record<string, unknown>) {\n super(message, code, 400, details);\n this.name = 'VocoAccessibilityError';\n }\n\n static missingAriaLabel(component: string, prop: string): VocoAccessibilityError {\n return new VocoAccessibilityError(\n `Missing required accessibility attribute: ${component} requires ${prop}`,\n 'MISSING_ARIA_LABEL',\n { component, prop }\n );\n }\n\n static contrastRatioFailed(fg: string, bg: string, ratio: number): VocoAccessibilityError {\n return new VocoAccessibilityError(\n `Color contrast ratio ${ratio.toFixed(2)} for ${fg} on ${bg} fails WCAG AA standards`,\n 'CONTRAST_RATIO_FAILED',\n { foreground: fg, background: bg, ratio }\n );\n }\n\n static keyboardNavigationMissing(component: string): VocoAccessibilityError {\n return new VocoAccessibilityError(\n `Component ${component} is not keyboard accessible`,\n 'KEYBOARD_NAVIGATION_MISSING',\n { component }\n );\n }\n}\n\n/**\n * Validation errors using Zod\n */\nexport class VocoValidationError extends VocoError {\n constructor(\n message: string,\n public field: string,\n details?: Record<string, unknown>\n ) {\n super(message, 'VALIDATION_ERROR', 400, details);\n this.name = 'VocoValidationError';\n }\n\n static fromZod(error: { fieldErrors: Record<string, string[]> }): VocoValidationError {\n const fields = Object.keys(error.fieldErrors);\n const messages = Object.values(error.fieldErrors).flat();\n return new VocoValidationError(\n messages[0] || 'Validation failed',\n fields[0] || 'unknown',\n { fieldErrors: error.fieldErrors }\n );\n }\n}\n\n/**\n * Network errors\n */\nexport class VocoNetworkError extends VocoError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'NETWORK_ERROR', 503, details);\n this.name = 'VocoNetworkError';\n }\n\n static fetchFailed(url: string, status?: number): VocoNetworkError {\n return new VocoNetworkError(\n `Failed to fetch: ${url}`,\n { url, status }\n );\n }\n\n static timeout(operation: string, timeoutMs: number): VocoNetworkError {\n return new VocoNetworkError(\n `Operation ${operation} timed out after ${timeoutMs}ms`,\n { operation, timeout: timeoutMs }\n );\n }\n}\n\n/**\n * Type guard for VocoWeb errors\n */\nexport function isVocoError(error: unknown): error is VocoError {\n return error instanceof VocoError;\n}\n\n/**\n * Get a user-friendly error message\n */\nexport function getErrorMessage(error: unknown): string {\n if (isVocoError(error)) {\n return error.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An unexpected error occurred';\n}\n\n/**\n * Format error for API responses\n */\nexport function formatApiError(error: unknown) {\n if (isVocoError(error)) {\n return error.toJSON();\n }\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n code: 'UNKNOWN_ERROR',\n statusCode: 500,\n };\n }\n return {\n name: 'UnknownError',\n message: 'An unexpected error occurred',\n code: 'UNKNOWN_ERROR',\n statusCode: 500,\n };\n}\n","/**\n * Environment configuration for @vocoweb/kernel\n * Validates all required environment variables at startup\n */\n\nimport { z } from 'zod';\nimport { VocoConfigError } from '../shared/errors';\n\n/**\n * Supabase configuration schema\n */\nconst SupabaseConfigSchema = z.object({\n url: z.string().url('SUPABASE_URL must be a valid URL'),\n anonKey: z.string().min(1, 'SUPABASE_ANON_KEY is required'),\n serviceRoleKey: z.string().min(1, 'SUPABASE_SERVICE_ROLE_KEY is required'),\n});\n\n/**\n * Stripe configuration schema\n */\nconst StripeConfigSchema = z.object({\n secretKey: z.string().startsWith('sk_', 'STRIPE_SECRET_KEY must start with sk_'),\n publishableKey: z.string().startsWith('pk_', 'STRIPE_PUBLISHABLE_KEY must start with pk_'),\n webhookSecret: z.string().optional(),\n});\n\n/**\n * App configuration schema\n */\nconst AppConfigSchema = z.object({\n url: z.string().url('NEXT_PUBLIC_APP_URL must be a valid URL').optional().default('http://localhost:3000'),\n name: z.string().optional().default('VocoWeb App'),\n supportEmail: z.string().email('SUPPORT_EMAIL must be valid').optional().default('support@vocoweb.in'),\n legalEmail: z.string().email('LEGAL_EMAIL must be valid').optional().default('legal@vocoweb.in'),\n});\n\n/**\n * Data residency configuration schema\n */\nconst ResidencyConfigSchema = z.object({\n enabled: z.boolean().optional().default(false),\n region: z.enum(['eu', 'us', 'apac', 'global']).optional().default('global'),\n strictMode: z.boolean().optional().default(false),\n});\n\n/**\n * Accessibility configuration schema\n */\nconst AccessibilityConfigSchema = z.object({\n enforceContrast: z.boolean().optional().default(true),\n enforceAriaLabels: z.boolean().optional().default(true),\n enforceKeyboardNav: z.boolean().optional().default(true),\n contrastRatio: z.number().min(1).max(21).optional().default(4.5),\n});\n\n/**\n * Complete kernel configuration schema\n */\nconst KernelConfigSchema = z.object({\n supabase: SupabaseConfigSchema,\n stripe: StripeConfigSchema,\n app: AppConfigSchema,\n residency: ResidencyConfigSchema,\n accessibility: AccessibilityConfigSchema,\n});\n\n/**\n * Parsed configuration types\n */\nexport type SupabaseConfig = z.infer<typeof SupabaseConfigSchema>;\nexport type StripeConfig = z.infer<typeof StripeConfigSchema>;\nexport type AppConfig = z.infer<typeof AppConfigSchema>;\nexport type ResidencyConfig = z.infer<typeof ResidencyConfigSchema>;\nexport type AccessibilityConfig = z.infer<typeof AccessibilityConfigSchema>;\nexport type KernelConfig = z.infer<typeof KernelConfigSchema>;\n\n/**\n * Get environment variable (works in both browser and Node.js)\n */\nfunction getEnvVar(key: string): string {\n // Browser: use import.meta.env or window.env\n if (typeof window !== 'undefined') {\n return (window as unknown as { env?: Record<string, string> })?.env?.[key]\n || (import.meta as unknown as { env?: Record<string, string> })?.env?.[key]\n || '';\n }\n // Node.js\n return process.env[key] || '';\n}\n\n/**\n * Validate and parse kernel configuration\n */\nexport function validateConfig(config: Record<string, unknown>): KernelConfig {\n try {\n return KernelConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errors = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');\n throw new VocoConfigError(`Configuration validation failed: ${errors}`, 'CONFIG_VALIDATION_FAILED', {\n errors: error.errors,\n });\n }\n throw error;\n }\n}\n\n/**\n * Load configuration from environment variables\n */\nexport function loadConfigFromEnv(): KernelConfig {\n const rawConfig = {\n supabase: {\n url: getEnvVar('NEXT_PUBLIC_SUPABASE_URL') || getEnvVar('SUPABASE_URL'),\n anonKey: getEnvVar('NEXT_PUBLIC_SUPABASE_ANON_KEY') || getEnvVar('SUPABASE_ANON_KEY'),\n serviceRoleKey: getEnvVar('SUPABASE_SERVICE_ROLE_KEY'),\n },\n stripe: {\n secretKey: getEnvVar('STRIPE_SECRET_KEY'),\n publishableKey: getEnvVar('NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY') || getEnvVar('STRIPE_PUBLISHABLE_KEY'),\n webhookSecret: getEnvVar('STRIPE_WEBHOOK_SECRET') || undefined,\n },\n app: {\n url: getEnvVar('NEXT_PUBLIC_APP_URL') || undefined,\n name: getEnvVar('NEXT_PUBLIC_APP_NAME') || undefined,\n supportEmail: getEnvVar('SUPPORT_EMAIL') || undefined,\n legalEmail: getEnvVar('LEGAL_EMAIL') || undefined,\n },\n residency: {\n enabled: getEnvVar('VOCO_DATA_RESIDENCY_ENABLED') === 'true',\n region: (getEnvVar('VOCO_DATA_REGION') as 'eu' | 'us' | 'apac' | 'global') || undefined,\n strictMode: getEnvVar('VOCO_RESIDENCY_STRICT_MODE') === 'true',\n },\n accessibility: {\n enforceContrast: getEnvVar('VOCO_ENFORCE_CONTRAST') !== 'false',\n enforceAriaLabels: getEnvVar('VOCO_ENFORCE_ARIA') !== 'false',\n enforceKeyboardNav: getEnvVar('VOCO_ENFORCE_KEYBOARD') !== 'false',\n contrastRatio: getEnvVar('VOCO_CONTRAST_RATIO')\n ? parseFloat(getEnvVar('VOCO_CONTRAST_RATIO'))\n : undefined,\n },\n };\n\n return validateConfig(rawConfig);\n}\n\n/**\n * Cached configuration instance\n */\nlet cachedConfig: KernelConfig | null = null;\n\n/**\n * Get the kernel configuration (cached)\n */\nexport function getConfig(): KernelConfig {\n if (!cachedConfig) {\n cachedConfig = loadConfigFromEnv();\n }\n return cachedConfig;\n}\n\n/**\n * Reset cached configuration (useful for testing)\n */\nexport function resetConfig(): void {\n cachedConfig = null;\n}\n\n/**\n * Set configuration manually (useful for testing or custom initialization)\n */\nexport function setConfig(config: KernelConfig): void {\n cachedConfig = validateConfig(config);\n}\n\n/**\n * Get Supabase configuration\n */\nexport function getSupabaseConfig(): SupabaseConfig {\n return getConfig().supabase;\n}\n\n/**\n * Get Stripe configuration\n */\nexport function getStripeConfig(): StripeConfig {\n return getConfig().stripe;\n}\n\n/**\n * Get App configuration\n */\nexport function getAppConfig(): AppConfig {\n return getConfig().app;\n}\n\n/**\n * Get Data Residency configuration\n */\nexport function getResidencyConfig(): ResidencyConfig {\n return getConfig().residency;\n}\n\n/**\n * Get Accessibility configuration\n */\nexport function getAccessibilityConfig(): AccessibilityConfig {\n return getConfig().accessibility;\n}\n\n/**\n * Check if all required environment variables are set\n */\nexport function checkRequiredEnvVars(): boolean {\n const requiredVars: Array<{ key: string; required: boolean }> = [\n { key: 'NEXT_PUBLIC_SUPABASE_URL', required: true },\n { key: 'NEXT_PUBLIC_SUPABASE_ANON_KEY', required: true },\n { key: 'SUPABASE_SERVICE_ROLE_KEY', required: true },\n { key: 'STRIPE_SECRET_KEY', required: true },\n { key: 'NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY', required: true },\n ];\n\n const missing: string[] = [];\n\n for (const { key, required } of requiredVars) {\n if (required && !getEnvVar(key)) {\n missing.push(key);\n }\n }\n\n if (missing.length > 0) {\n throw new VocoConfigError(\n `Missing required environment variables: ${missing.join(', ')}`,\n 'MISSING_ENV_VARS',\n { missing }\n );\n }\n\n return true;\n}\n\n/**\n * Environment-aware check: runs validation only in development or when explicitly enabled\n */\nexport function validateEnvironment(skipProduction: boolean = true): boolean {\n const isDev = getEnvVar('NODE_ENV') === 'development';\n const shouldValidate = isDev || !skipProduction;\n\n if (shouldValidate) {\n return checkRequiredEnvVars();\n }\n return true;\n}\n\n/**\n * Export a singleton instance for convenience\n */\nexport const config = {\n get: getConfig,\n supabase: getSupabaseConfig,\n stripe: getStripeConfig,\n app: getAppConfig,\n residency: getResidencyConfig,\n accessibility: getAccessibilityConfig,\n validate: validateEnvironment,\n check: checkRequiredEnvVars,\n};\n","/**\n * Supabase client configuration\n * Singleton pattern to prevent multiple instances\n */\n\nimport { createClient, SupabaseClient } from '@supabase/supabase-js';\nimport { getSupabaseConfig } from '../config/env';\nimport { VocoConfigError } from '../shared/errors';\n\n/**\n * Client type enum\n */\nenum ClientType {\n Browser = 'browser',\n Server = 'server',\n ServiceRole = 'service_role',\n}\n\n/**\n * Singleton client instances\n */\nlet browserClient: SupabaseClient | null = null;\nlet serverClient: SupabaseClient | null = null;\nlet serviceRoleClient: SupabaseClient | null = null;\n\n/**\n * Get the browser Supabase client (uses anon key)\n * Only works in browser environment\n */\nexport function getBrowserClient(): SupabaseClient {\n if (browserClient) {\n return browserClient;\n }\n\n if (typeof window === 'undefined') {\n throw new VocoConfigError(\n 'Browser client can only be used in browser environment',\n 'INVALID_CLIENT_TYPE'\n );\n }\n\n const config = getSupabaseConfig();\n\n browserClient = createClient(config.url, config.anonKey, {\n auth: {\n persistSession: true,\n autoRefreshToken: true,\n detectSessionInUrl: true,\n storage: typeof window !== 'undefined' ? window.localStorage : undefined,\n storageKey: 'vocoweb-auth-token',\n flowType: 'pkce',\n },\n });\n\n return browserClient;\n}\n\n/**\n * Get the server Supabase client (uses anon key)\n * For server-side operations with user context\n */\nexport function getServerClient(): SupabaseClient {\n if (serverClient) {\n return serverClient;\n }\n\n const config = getSupabaseConfig();\n\n serverClient = createClient(config.url, config.anonKey, {\n auth: {\n persistSession: false,\n autoRefreshToken: false,\n detectSessionInUrl: false,\n },\n });\n\n return serverClient;\n}\n\n/**\n * Get the service role client (uses service role key)\n * For admin operations - use with caution!\n * Should only be used server-side for privileged operations.\n */\nexport function getServiceRoleClient(): SupabaseClient {\n if (serviceRoleClient) {\n return serviceRoleClient;\n }\n\n if (typeof window !== 'undefined') {\n throw new VocoConfigError(\n 'Service role client can only be used server-side',\n 'INVALID_CLIENT_TYPE'\n );\n }\n\n const config = getSupabaseConfig();\n\n serviceRoleClient = createClient(config.url, config.serviceRoleKey, {\n auth: {\n persistSession: false,\n autoRefreshToken: false,\n detectSessionInUrl: false,\n },\n });\n\n return serviceRoleClient;\n}\n\n/**\n * Get a Supabase client based on type\n */\nexport function getClient(type: ClientType = ClientType.Browser): SupabaseClient {\n switch (type) {\n case ClientType.Browser:\n return getBrowserClient();\n case ClientType.Server:\n return getServerClient();\n case ClientType.ServiceRole:\n return getServiceRoleClient();\n default:\n return getBrowserClient();\n }\n}\n\n/**\n * Reset all clients (useful for testing)\n */\nexport function resetClients(): void {\n browserClient = null;\n serverClient = null;\n serviceRoleClient = null;\n}\n\n/**\n * Check if a specific client type is initialized\n */\nexport function isClientInitialized(type: ClientType): boolean {\n switch (type) {\n case ClientType.Browser:\n return browserClient !== null;\n case ClientType.Server:\n return serverClient !== null;\n case ClientType.ServiceRole:\n return serviceRoleClient !== null;\n default:\n return false;\n }\n}\n\nexport { ClientType };\n","/**\n * Client-side authentication functions\n * These functions are meant to be used in the browser\n */\n\nimport type {\n OAuthOptions,\n SignInWithPasswordOptions,\n SignUpOptions,\n ResetPasswordOptions,\n UpdateUserOptions,\n AuthStateChangeCallback,\n AuthSubscription,\n} from './types';\nimport { getBrowserClient } from './config';\nimport { VocoAuthError } from '../shared/errors';\nimport type { Session, User, AuthError as SupabaseAuthError } from '@supabase/supabase-js';\n\n/**\n * Convert Supabase auth error to VocoAuthError\n */\nfunction handleAuthError(error: SupabaseAuthError | null): never {\n if (!error) {\n throw new VocoAuthError('Unknown authentication error', 'UNKNOWN_ERROR');\n }\n\n const errorMap: Record<string, string> = {\n InvalidCredentials: 'INVALID_CREDENTIALS',\n EmailNotConfirmed: 'EMAIL_NOT_CONFIRMED',\n UserNotFound: 'USER_NOT_FOUND',\n InvalidEmail: 'INVALID_EMAIL',\n WeakPassword: 'WEAK_PASSWORD',\n EmailAlreadyExists: 'EMAIL_ALREADY_EXISTS',\n SessionExpired: 'SESSION_EXPIRED',\n };\n\n const code = errorMap[error.name] || 'AUTH_ERROR';\n\n throw new VocoAuthError(error.message || 'Authentication failed', code, {\n originalError: error.name,\n });\n}\n\n/**\n * Sign in with OAuth provider (e.g., Google, GitHub)\n *\n * @example\n * await auth.loginWithGoogle({ redirectTo: '/dashboard' });\n */\nexport async function loginWithOAuth(options: OAuthOptions = {}): Promise<void> {\n const {\n provider = 'google',\n redirectTo,\n scopes,\n queryParams,\n skipBrowserRedirect = false,\n } = options;\n\n const supabase = getBrowserClient();\n\n // Build redirect URL\n let redirectUrl = redirectTo;\n if (!redirectUrl && typeof window !== 'undefined') {\n redirectUrl = `${window.location.origin}/auth/callback`;\n }\n\n const { error } = await supabase.auth.signInWithOAuth({\n provider,\n options: {\n redirectTo: redirectUrl,\n scopes,\n queryParams,\n skipBrowserRedirect,\n },\n });\n\n if (error) {\n handleAuthError(error);\n }\n}\n\n/**\n * Sign in with Google OAuth (convenience function)\n *\n * @example\n * await auth.loginWithGoogle();\n */\nexport async function loginWithGoogle(redirectTo?: string): Promise<void> {\n await loginWithOAuth({ provider: 'google', redirectTo });\n}\n\n/**\n * Sign in with GitHub OAuth\n *\n * @example\n * await auth.loginWithGitHub();\n */\nexport async function loginWithGitHub(redirectTo?: string): Promise<void> {\n await loginWithOAuth({ provider: 'github', redirectTo });\n}\n\n/**\n * Sign in with email and password\n *\n * @example\n * await auth.signInWithPassword({ email: 'user@example.com', password: 'password123' });\n */\nexport async function signInWithPassword(\n options: SignInWithPasswordOptions\n): Promise<{ data: { session: Session | null; user: User | null } }> {\n const supabase = getBrowserClient();\n\n const { data, error } = await supabase.auth.signInWithPassword({\n email: options.email,\n password: options.password,\n });\n\n if (error) {\n handleAuthError(error);\n }\n\n return { data };\n}\n\n/**\n * Sign up a new user\n *\n * @example\n * await auth.signUp({\n * email: 'user@example.com',\n * password: 'password123',\n * metadata: { name: 'John Doe' }\n * });\n */\nexport async function signUp(options: SignUpOptions): Promise<{\n data: { session: Session | null; user: User | null };\n}> {\n const supabase = getBrowserClient();\n\n const { data, error } = await supabase.auth.signUp({\n email: options.email,\n password: options.password,\n options: {\n data: options.metadata,\n },\n });\n\n if (error) {\n handleAuthError(error);\n }\n\n return { data };\n}\n\n/**\n * Sign out the current user\n *\n * @example\n * await auth.logout();\n */\nexport async function logout(): Promise<void> {\n const supabase = getBrowserClient();\n\n const { error } = await supabase.auth.signOut();\n\n if (error) {\n handleAuthError(error);\n }\n}\n\n/**\n * Get the current session\n *\n * @example\n * const session = await auth.getSession();\n * if (session) {\n * console.log('User is logged in:', session.user);\n * }\n */\nexport async function getSession(): Promise<Session | null> {\n const supabase = getBrowserClient();\n\n const { data, error } = await supabase.auth.getSession();\n\n if (error) {\n handleAuthError(error);\n }\n\n return data.session;\n}\n\n/**\n * Get the current user\n *\n * @example\n * const user = await auth.getUser();\n * if (user) {\n * console.log('User email:', user.email);\n * }\n */\nexport async function getUser(): Promise<User | null> {\n const session = await getSession();\n return session?.user ?? null;\n}\n\n/**\n * Refresh the current session\n *\n * @example\n * await auth.refreshSession();\n */\nexport async function refreshSession(): Promise<Session | null> {\n const supabase = getBrowserClient();\n\n const { data, error } = await supabase.auth.refreshSession();\n\n if (error) {\n handleAuthError(error);\n }\n\n return data.session;\n}\n\n/**\n * Update the current user\n *\n * @example\n * await auth.updateUser({ metadata: { name: 'Jane Doe' } });\n */\nexport async function updateUser(options: UpdateUserOptions): Promise<User> {\n const supabase = getBrowserClient();\n\n const { data, error } = await supabase.auth.updateUser({\n email: options.email,\n password: options.password,\n data: options.metadata,\n });\n\n if (error) {\n handleAuthError(error);\n }\n\n if (!data.user) {\n throw new VocoAuthError('Failed to update user', 'UPDATE_FAILED');\n }\n\n return data.user;\n}\n\n/**\n * Send a password reset email\n *\n * @example\n * await auth.resetPassword({ email: 'user@example.com' });\n */\nexport async function resetPassword(options: ResetPasswordOptions): Promise<void> {\n const supabase = getBrowserClient();\n\n let redirectTo = options.redirectTo;\n if (!redirectTo && typeof window !== 'undefined') {\n redirectTo = `${window.location.origin}/auth/reset-password`;\n }\n\n const { error } = await supabase.auth.resetPasswordForEmail(options.email, {\n redirectTo,\n });\n\n if (error) {\n handleAuthError(error);\n }\n}\n\n/**\n * Subscribe to auth state changes\n *\n * @example\n * const subscription = auth.onAuthStateChange((event, session) => {\n * console.log('Auth event:', event, 'Session:', session);\n * });\n *\n * // Later: unsubscribe\n * subscription.unsubscribe();\n */\nexport function onAuthStateChange(\n callback: AuthStateChangeCallback\n): AuthSubscription {\n const supabase = getBrowserClient();\n\n const { data } = supabase.auth.onAuthStateChange((event, session) => {\n callback(event as Parameters<AuthStateChangeCallback>[0], session);\n });\n\n return {\n unsubscribe: () => {\n data.subscription.unsubscribe();\n },\n };\n}\n\n/**\n * Get the access token for API requests\n *\n * @example\n * const token = await auth.getAccessToken();\n * const response = await fetch('/api/protected', {\n * headers: { Authorization: `Bearer ${token}` }\n * });\n */\nexport async function getAccessToken(): Promise<string | null> {\n const session = await getSession();\n return session?.access_token ?? null;\n}\n\n/**\n * Check if a user is currently authenticated\n *\n * @example\n * if (await auth.isAuthenticated()) {\n * console.log('User is logged in');\n * }\n */\nexport async function isAuthenticated(): Promise<boolean> {\n const session = await getSession();\n return session !== null;\n}\n\n/**\n * Client authentication API\n */\nexport const clientAuth = {\n loginWithOAuth,\n loginWithGoogle,\n loginWithGitHub,\n signInWithPassword,\n signUp,\n logout,\n getSession,\n getUser,\n refreshSession,\n updateUser,\n resetPassword,\n onAuthStateChange,\n getAccessToken,\n isAuthenticated,\n};\n\n/**\n * Convenience exports\n */\nexport { loginWithOAuth as signInWithOAuth };\n","/**\n * GDPR Compliance Map\n * Defines cascading deletion rules for GDPR Article 17 (Right to be Forgotten)\n */\n\nimport type { ComplianceMap } from './types';\n\nexport const complianceMap: ComplianceMap = {\n user: {\n table: 'users',\n primary_key: 'id',\n dependencies: [\n {\n table: 'projects',\n foreign_key: 'user_id',\n action: 'delete',\n cascade: true,\n },\n {\n table: 'websites',\n foreign_key: 'user_id',\n action: 'delete',\n cascade: true,\n },\n {\n table: 'usage_logs',\n foreign_key: 'user_id',\n action: 'delete',\n cascade: true,\n },\n {\n table: 'subscriptions',\n foreign_key: 'user_id',\n action: 'delete',\n cascade: true,\n },\n {\n table: 'invoices',\n foreign_key: 'user_id',\n action: 'anonymize',\n cascade: false,\n keep_fields: ['id', 'created_at', 'amount', 'currency', 'status'],\n },\n {\n table: 'audit_logs',\n foreign_key: 'user_id',\n action: 'retain',\n cascade: false,\n },\n {\n table: 'leads',\n foreign_key: 'user_id',\n action: 'delete',\n cascade: true,\n },\n ],\n external_apis: [\n {\n service: 'supabase',\n action: 'delete_user',\n endpoint: '/auth/v1/admin/users/{userId}',\n method: 'DELETE',\n required: true,\n },\n {\n service: 'stripe',\n action: 'delete_customer',\n endpoint: '/v1/customers/{customerId}',\n method: 'DELETE',\n lookup_key: 'stripe_customer_id',\n lookup_table: 'subscriptions',\n },\n {\n service: 'sendgrid',\n action: 'delete_contact',\n endpoint: '/marketing/contacts/{contactId}',\n method: 'DELETE',\n lookup_key: 'email',\n lookup_table: 'users',\n },\n ],\n },\n project: {\n table: 'projects',\n primary_key: 'id',\n dependencies: [\n {\n table: 'websites',\n foreign_key: 'project_id',\n action: 'delete',\n cascade: true,\n },\n {\n table: 'project_versions',\n foreign_key: 'project_id',\n action: 'delete',\n cascade: true,\n },\n {\n table: 'deployments',\n foreign_key: 'project_id',\n action: 'delete',\n cascade: true,\n },\n ],\n },\n website: {\n table: 'websites',\n primary_key: 'id',\n dependencies: [\n {\n table: 'website_versions',\n foreign_key: 'website_id',\n action: 'delete',\n cascade: true,\n },\n {\n table: 'website_analytics',\n foreign_key: 'website_id',\n action: 'delete',\n cascade: true,\n },\n {\n table: 'deployments',\n foreign_key: 'website_id',\n action: 'delete',\n cascade: true,\n },\n ],\n },\n};\n","/**\n * GDPR Erasure Engine (Article 17 - Right to be Forgotten)\n * Cascading deletion with external API cleanup\n */\n\nimport { getServiceRoleClient } from '../auth/config';\nimport type { DeletionResult, DependencyAction, ExternalApiCall, DeletionTracker } from './types';\nimport { complianceMap } from './compliance-map';\nimport { VocoComplianceError } from '../shared/errors';\n\nconst activeDeletions = new Map<string, DeletionTracker>();\n\n/**\n * Perform cascading deletion based on compliance map\n *\n * This function:\n * 1. Reads the compliance-map.json configuration\n * 2. Executes cascading deletions in dependency order\n * 3. Calls external APIs for cleanup (Supabase, Stripe, SendGrid)\n * 4. Creates an audit trail of all actions\n *\n * @example\n * const result = await obliterateUserData('user-123');\n * // Returns: { deletedTables: [...], anonymizedTables: [...], ... }\n */\nexport async function obliterateUserData(userId: string, entityType: 'user' | 'project' | 'website' = 'user'): Promise<DeletionResult> {\n const supabase = getServiceRoleClient();\n\n // Check if deletion is already in progress\n const existing = activeDeletions.get(userId);\n if (existing && (existing.status === 'pending' || existing.status === 'processing')) {\n throw VocoComplianceError.deletionInProgress(userId);\n }\n\n // Initialize tracker\n const tracker: DeletionTracker = {\n userId,\n startedAt: new Date(),\n status: 'processing',\n deletedTables: [],\n anonymizedTables: [],\n retainedTables: [],\n externalApiCalls: [],\n errors: [],\n };\n activeDeletions.set(userId, tracker);\n\n try {\n const config = complianceMap[entityType];\n if (!config) {\n throw VocoComplianceError.invalidEntityType(entityType);\n }\n\n // Process dependencies in order\n for (const dep of config.dependencies) {\n try {\n await processDependency(supabase, userId, dep, tracker);\n } catch (error) {\n tracker.errors.push({\n table: dep.table,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n // Continue with next dependency unless it's required\n if (dep.cascade === false && dep.action !== 'retain') {\n // For anonymize actions, we might want to continue\n }\n }\n }\n\n // Delete the main record\n const { error: mainError } = await supabase\n .from(config.table)\n .delete()\n .eq(config.primary_key, userId);\n\n if (mainError) {\n throw VocoComplianceError.deletionFailed(userId, mainError.message);\n }\n\n tracker.deletedTables.push(config.table);\n\n // Process external API cleanup\n if (config.external_apis) {\n for (const api of config.external_apis) {\n try {\n const result = await processExternalApi(supabase, userId, api);\n tracker.externalApiCalls.push(result);\n } catch (error) {\n if (api.required) {\n throw VocoComplianceError.externalApiFailed(\n api.service,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n tracker.externalApiCalls.push({\n service: api.service,\n action: api.action,\n status: 'failed',\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: new Date(),\n });\n }\n }\n }\n\n // Create audit log entry\n await createDeletionAuditLog(supabase, tracker);\n\n tracker.status = 'completed';\n activeDeletions.set(userId, tracker);\n\n return {\n success: true,\n userId,\n deletedTables: tracker.deletedTables,\n anonymizedTables: tracker.anonymizedTables,\n retainedTables: tracker.retainedTables,\n externalApiCalls: tracker.externalApiCalls,\n errors: tracker.errors,\n completedAt: new Date(),\n };\n } catch (error) {\n tracker.status = 'failed';\n activeDeletions.set(userId, tracker);\n\n // Log failure\n await createDeletionAuditLog(supabase, tracker);\n\n throw error;\n }\n}\n\n/**\n * Process a single dependency based on its action type\n */\nasync function processDependency(\n supabase: any,\n userId: string,\n dep: DependencyAction,\n tracker: DeletionTracker\n): Promise<void> {\n switch (dep.action) {\n case 'delete':\n await deleteDependency(supabase, userId, dep);\n tracker.deletedTables.push(dep.table);\n break;\n\n case 'anonymize':\n await anonymizeDependency(supabase, userId, dep);\n tracker.anonymizedTables.push(dep.table);\n break;\n\n case 'retain':\n tracker.retainedTables.push(dep.table);\n break;\n\n default:\n throw new Error(`Unknown action: ${dep.action}`);\n }\n}\n\n/**\n * Delete a dependency table with optional cascade\n */\nasync function deleteDependency(supabase: any, userId: string, dep: DependencyAction): Promise<void> {\n if (dep.cascade) {\n // For cascading deletes, delete all related records\n const { error } = await supabase\n .from(dep.table)\n .delete()\n .eq(dep.foreign_key, userId);\n\n if (error) {\n throw VocoComplianceError.deletionFailed(dep.table, error.message);\n }\n } else {\n // Non-cascading delete - only direct records\n const { error } = await supabase\n .from(dep.table)\n .delete()\n .eq(dep.foreign_key, userId);\n\n if (error) {\n throw VocoComplianceError.deletionFailed(dep.table, error.message);\n }\n }\n}\n\n/**\n * Anonymize a dependency table (keep only specified fields)\n */\nasync function anonymizeDependency(supabase: any, userId: string, dep: DependencyAction): Promise<void> {\n const keepFields = dep.keep_fields || ['id', 'created_at'];\n\n // First, get the current data\n const { data: records, error: fetchError } = await supabase\n .from(dep.table)\n .select('*')\n .eq(dep.foreign_key, userId);\n\n if (fetchError) {\n throw VocoComplianceError.anonymizationFailed(dep.table, fetchError.message);\n }\n\n // Update each record to anonymize\n for (const record of records || []) {\n const anonymizedData: Record<string, any> = {\n ...Object.fromEntries(keepFields.map((field) => [field, record[field]])),\n // Mark as anonymized\n anonymized: true,\n anonymized_at: new Date().toISOString(),\n };\n\n const { error: updateError } = await supabase\n .from(dep.table)\n .update(anonymizedData)\n .eq('id', record.id);\n\n if (updateError) {\n throw VocoComplianceError.anonymizationFailed(dep.table, updateError.message);\n }\n }\n}\n\n/**\n * Process external API cleanup\n */\nasync function processExternalApi(\n supabase: any,\n userId: string,\n api: any\n): Promise<ExternalApiCall> {\n const result: ExternalApiCall = {\n service: api.service,\n action: api.action,\n status: 'pending',\n timestamp: new Date(),\n };\n\n try {\n switch (api.service) {\n case 'supabase':\n await handleSupabaseDeletion(api, userId);\n result.status = 'completed';\n break;\n\n case 'stripe':\n await handleStripeDeletion(supabase, api, userId);\n result.status = 'completed';\n break;\n\n case 'sendgrid':\n await handleSendGridDeletion(supabase, api, userId);\n result.status = 'completed';\n break;\n\n default:\n throw new Error(`Unknown external service: ${api.service}`);\n }\n } catch (error) {\n result.status = 'failed';\n result.error = error instanceof Error ? error.message : 'Unknown error';\n throw error;\n }\n\n return result;\n}\n\n/**\n * Handle Supabase user deletion\n */\nasync function handleSupabaseDeletion(_api: any, userId: string): Promise<void> {\n const supabase = getServiceRoleClient();\n\n const { error } = await supabase.auth.admin.deleteUser(userId);\n\n if (error) {\n throw VocoComplianceError.externalApiFailed('Supabase', error.message);\n }\n}\n\n/**\n * Handle Stripe customer deletion\n */\nasync function handleStripeDeletion(supabase: any, api: any, userId: string): Promise<void> {\n // Look up the customer ID from the specified table\n const { data: record, error } = await supabase\n .from(api.lookup_table)\n .select(api.lookup_key)\n .eq('user_id', userId)\n .single();\n\n if (error || !record) {\n // Customer not found - skip\n return;\n }\n\n const customerId = record[api.lookup_key];\n if (!customerId) {\n return;\n }\n\n // Import Stripe dynamically\n const stripe = await import('stripe').then((m) => {\n const Stripe = m.default;\n const apiKey = process.env.STRIPE_SECRET_KEY;\n if (!apiKey) {\n throw new Error('STRIPE_SECRET_KEY not set');\n }\n return new Stripe(apiKey);\n });\n\n await stripe.customers.del(customerId);\n}\n\n/**\n * Handle SendGrid contact deletion\n */\nasync function handleSendGridDeletion(supabase: any, api: any, userId: string): Promise<void> {\n // Look up the contact identifier\n const { data: record, error } = await supabase\n .from(api.lookup_table)\n .select(api.lookup_key)\n .eq('id', userId)\n .single();\n\n if (error || !record) {\n return;\n }\n\n const identifier = record[api.lookup_key];\n if (!identifier) {\n return;\n }\n\n const apiKey = process.env.SENDGRID_API_KEY;\n if (!apiKey) {\n throw new Error('SENDGRID_API_KEY not set');\n }\n\n // Delete contact from SendGrid\n const response = await fetch(\n `https://api.sendgrid.com/v3/marketing/contacts?emails=${encodeURIComponent(identifier)}`,\n {\n method: 'DELETE',\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`SendGrid deletion failed: ${response.statusText}`);\n }\n}\n\n/**\n * Create audit log entry for deletion\n */\nasync function createDeletionAuditLog(supabase: any, tracker: DeletionTracker): Promise<void> {\n const { error } = await supabase\n .from('audit_logs')\n .insert({\n user_id: tracker.userId,\n action: 'gdpr_deletion',\n details: {\n status: tracker.status,\n deletedTables: tracker.deletedTables,\n anonymizedTables: tracker.anonymizedTables,\n retainedTables: tracker.retainedTables,\n externalApiCalls: tracker.externalApiCalls,\n errors: tracker.errors,\n startedAt: tracker.startedAt,\n },\n timestamp: new Date(),\n });\n\n if (error) {\n console.error('Failed to create deletion audit log:', error);\n }\n}\n\n/**\n * Check deletion status for a user\n */\nexport async function checkDeletionStatus(userId: string): Promise<{\n status: 'pending' | 'processing' | 'completed' | 'failed' | 'not_found';\n tracker?: DeletionTracker;\n}> {\n const tracker = activeDeletions.get(userId);\n\n if (!tracker) {\n return { status: 'not_found' };\n }\n\n return { status: tracker.status, tracker };\n}\n\n/**\n * Schedule delayed deletion (30-day grace period)\n *\n * This creates a pending deletion that can be cancelled within 30 days\n *\n * @example\n * const deletionId = await scheduleDeletion('user-123');\n * // User can cancel within 30 days\n */\nexport async function scheduleDeletion(\n userId: string,\n entityType: 'user' | 'project' | 'website' = 'user',\n delayDays: number = 30\n): Promise<string> {\n const supabase = getServiceRoleClient();\n\n const scheduledDate = new Date();\n scheduledDate.setDate(scheduledDate.getDate() + delayDays);\n\n const { data, error } = await supabase\n .from('scheduled_deletions')\n .insert({\n user_id: userId,\n entity_type: entityType,\n scheduled_for: scheduledDate.toISOString(),\n status: 'pending',\n created_at: new Date().toISOString(),\n })\n .select('id')\n .single();\n\n if (error || !data) {\n throw VocoComplianceError.deletionFailed(userId, error?.message || 'Failed to schedule deletion');\n }\n\n return data.id;\n}\n\n/**\n * Cancel scheduled deletion\n *\n * @example\n * await cancelScheduledDeletion('deletion-id-123');\n */\nexport async function cancelScheduledDeletion(deletionId: string): Promise<void> {\n const supabase = getServiceRoleClient();\n\n const { error } = await supabase\n .from('scheduled_deletions')\n .update({ status: 'cancelled', cancelled_at: new Date().toISOString() })\n .eq('id', deletionId);\n\n if (error) {\n throw VocoComplianceError.deletionFailed(deletionId, error.message);\n }\n}\n\n/**\n * Process scheduled deletions (should be called by cron job)\n *\n * @example\n * const processed = await processScheduledDeletions();\n */\nexport async function processScheduledDeletions(limit: number = 10): Promise<number> {\n const supabase = getServiceRoleClient();\n\n const { data: scheduled, error } = await supabase\n .from('scheduled_deletions')\n .select('*')\n .eq('status', 'pending')\n .lte('scheduled_for', new Date().toISOString())\n .limit(limit);\n\n if (error || !scheduled) {\n return 0;\n }\n\n let processed = 0;\n\n for (const deletion of scheduled) {\n try {\n // Update to processing\n await supabase\n .from('scheduled_deletions')\n .update({ status: 'processing' })\n .eq('id', deletion.id);\n\n // Execute deletion\n await obliterateUserData(deletion.user_id, deletion.entity_type);\n\n // Mark as completed\n await supabase\n .from('scheduled_deletions')\n .update({ status: 'completed', completed_at: new Date().toISOString() })\n .eq('id', deletion.id);\n\n processed++;\n } catch (err) {\n // Mark as failed\n await supabase\n .from('scheduled_deletions')\n .update({\n status: 'failed',\n error: err instanceof Error ? err.message : 'Unknown error',\n })\n .eq('id', deletion.id);\n }\n }\n\n return processed;\n}\n\n/**\n * Export the obliterate module\n */\nexport const obliterate = {\n userData: obliterateUserData,\n checkStatus: checkDeletionStatus,\n schedule: scheduleDeletion,\n cancel: cancelScheduledDeletion,\n processScheduled: processScheduledDeletions,\n};\n","/**\n * @vocoweb/kernel\n *\n * Production-ready authentication, payments, and compliance kernel for B2B SaaS.\n *\n * @example\n * ```ts\n * import { auth, billing, legal, privacy } from '@vocoweb/kernel';\n * ```\n */\n\n// Shared types and utilities\nexport * from './shared/types';\nexport * from './shared/errors';\nexport * from './shared/utils';\n\n// Configuration\nexport * from './config/env';\n\n// Module A: Vault (Identity & Auth)\nexport * from './auth';\n\n// Module B: Register (Payments & VAT)\nexport * from './billing';\n\n// Module C: Shield (Legal Compliance)\nexport {\n // Types\n type PrivacyPolicyProps,\n type TermsOfServiceProps,\n type CookieConsentProps,\n // Components\n PrivacyPolicy,\n TermsOfService,\n CookieConsent,\n // Functions\n exportUserData as legalExportUserData,\n exportUserDataAsJson,\n createExportFilename,\n hasPendingExports,\n requestDataExport,\n processPendingExports,\n getUserExport,\n // Module\n legal,\n dataExport,\n} from './legal';\n\n// Module 1: Erasure Engine (GDPR)\nexport * from './privacy';\n\n// Module 2: EAA Enforcer (Accessibility)\nexport * from './accessibility';\n\n// Module 3: Sovereignty Shield (Data Residency)\nexport * from './residency';\n\n// Module 4: Audit Log (Enterprise)\nexport * from './audit';\n\n// React components export\nexport * from './react';\n\n// Version\nexport const VERSION = '1.0.0';\n","/**\n * Shared utility functions for @vocoweb/kernel\n */\n\nimport { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merge Tailwind CSS classes with proper precedence\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * Format currency for display\n */\nexport function formatCurrency(\n amount: number,\n currency: string = 'USD',\n locale: string = 'en-US'\n): string {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount / 100); // Stripe amounts are in cents\n}\n\n/**\n * Format date for display\n */\nexport function formatDate(\n date: Date | string,\n locale: string = 'en-US',\n options?: Intl.DateTimeFormatOptions\n): string {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n ...options,\n }).format(dateObj);\n}\n\n/**\n * Format relative time (e.g., \"2 hours ago\")\n */\nexport function formatRelativeTime(\n date: Date | string,\n locale: string = 'en-US'\n): string {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n const now = new Date();\n const diffMs = now.getTime() - dateObj.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });\n\n if (diffDays > 30) {\n return formatDate(dateObj, locale);\n } else if (diffDays > 0) {\n return rtf.format(-diffDays, 'day');\n } else if (diffHours > 0) {\n return rtf.format(-diffHours, 'hour');\n } else if (diffMins > 0) {\n return rtf.format(-diffMins, 'minute');\n } else {\n return rtf.format(-diffSecs, 'second');\n }\n}\n\n/**\n * Generate a random ID\n */\nexport function generateId(prefix?: string): string {\n const id = Math.random().toString(36).substring(2, 15);\n return prefix ? `${prefix}_${id}` : id;\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 if (obj instanceof Date) {\n return new Date(obj.getTime()) as T;\n }\n if (obj instanceof Array) {\n return obj.map(item => deepClone(item)) as T;\n }\n if (obj instanceof Object) {\n const clonedObj = {} as T;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n (clonedObj as T)[key] = deepClone(obj[key]);\n }\n }\n return clonedObj;\n }\n return obj;\n}\n\n/**\n * Safe JSON parse with fallback\n */\nexport function safeJsonParse<T>(str: string, fallback: T): T {\n try {\n return JSON.parse(str) as T;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Debounce a function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n return function executedFunction(...args: Parameters<T>) {\n const later = () => {\n timeout = null;\n func(...args);\n };\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(later, wait);\n };\n}\n\n/**\n * Throttle a function\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n func: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let inThrottle: boolean;\n return function executedFunction(...args: Parameters<T>) {\n if (!inThrottle) {\n func(...args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), limit);\n }\n };\n}\n\n/**\n * Sleep for a specified duration\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 retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n initialDelay?: number;\n maxDelay?: number;\n backoffMultiplier?: number;\n retryIf?: (error: unknown) => boolean;\n } = {}\n): Promise<T> {\n const {\n maxAttempts = 3,\n initialDelay = 1000,\n maxDelay = 10000,\n backoffMultiplier = 2,\n retryIf = () => true,\n } = options;\n\n let lastError: unknown;\n let delay = initialDelay;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n if (!retryIf(error) || attempt === maxAttempts - 1) {\n throw error;\n }\n await sleep(delay);\n delay = Math.min(delay * backoffMultiplier, maxDelay);\n }\n }\n\n throw lastError;\n}\n\n/**\n * Check if running in browser\n */\nexport const isBrowser = typeof window !== 'undefined';\n\n/**\n * Check if running in server environment\n */\nexport const isServer = !isBrowser;\n\n/**\n * Get environment variable (server-side)\n */\nexport function getEnv(key: string, fallback?: string): string {\n if (isServer) {\n return process.env[key] ?? fallback ?? '';\n }\n return fallback ?? '';\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 * Truncate text with ellipsis\n */\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + '...';\n}\n\n/**\n * Capitalize first letter\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Convert camelCase to kebab-case\n */\nexport function camelToKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n}\n\n/**\n * Convert kebab-case to camelCase\n */\nexport function kebabToCamel(str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Get initials from name\n */\nexport function getInitials(name: string, maxLength: number = 2): string {\n return name\n .split(' ')\n .map(word => word.charAt(0).toUpperCase())\n .slice(0, maxLength)\n .join('');\n}\n\n/**\n * Pluralize a word\n */\nexport function pluralize(count: number, singular: string, plural?: string): string {\n return count === 1 ? singular : plural ?? singular + 's';\n}\n\n/**\n * Format a list of items\n */\nexport function formatList(items: string[], locale: string = 'en-US'): string {\n const formatter = new Intl.ListFormat(locale, { style: 'long', type: 'conjunction' });\n return formatter.format(items);\n}\n\n/**\n * Clamp a number between min and max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Round to a specified number of decimal places\n */\nexport function roundTo(value: number, decimals: number): number {\n const factor = Math.pow(10, decimals);\n return Math.round(value * factor) / factor;\n}\n\n/**\n * Check if a value is defined (not null or undefined)\n */\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\n/**\n * Filter out null and undefined values from an array\n */\nexport function filterDefined<T>(array: Array<T | null | undefined>): T[] {\n return array.filter(isDefined);\n}\n\n/**\n * Create a promise that resolves after a timeout or rejects if the timeout is exceeded\n */\nexport function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n timeoutError: Error = new Error('Operation timed out')\n): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(timeoutError), timeoutMs)\n ),\n ]);\n}\n\n/**\n * Batch array items into chunks of specified size\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Group array items by a key function\n */\nexport function groupBy<T, K extends string | number>(\n array: T[],\n keyFn: (item: T) => K\n): Record<K, T[]> {\n return array.reduce((groups, item) => {\n const key = keyFn(item);\n (groups[key] ??= []).push(item);\n return groups;\n }, {} as Record<K, T[]>);\n}\n\n/**\n * Create a promise that can be resolved externally\n */\nexport function createDeferred<T>() {\n let resolve: ((value: T | PromiseLike<T>) => void) | null = null;\n let reject: ((reason?: unknown) => void) | null = null;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return {\n promise,\n resolve: resolve!,\n reject: reject!,\n };\n}\n","/**\n * Module A: Vault (Identity & Auth)\n * Supabase authentication wrapper with pre-built components\n */\n\n// Types\nexport * from './types';\n\n// Configuration\nexport * from './config';\n\n// Client-side auth\nexport * from './client';\n\n// Server-side auth\nexport * from './server';\n\n// React components\nexport { VocoAuth } from './components/VocoAuth';\n\n// Import auth modules\nimport * as clientAuth from './client';\nimport * as serverAuth from './server';\n\n// Import types for use in the auth object\nimport type {\n OAuthOptions,\n SignInWithPasswordOptions,\n SignUpOptions,\n ResetPasswordOptions,\n UpdateUserOptions,\n AuthStateChangeCallback,\n AuthSubscription,\n OAuthProvider,\n UserRole,\n UserWithRole,\n AuthRequest,\n VerifiedUser,\n} from './types';\n\n/**\n * Main authentication API\n *\n * @example\n * import { auth } from '@vocoweb/kernel';\n *\n * // Client-side\n * await auth.loginWithGoogle();\n * await auth.logout();\n *\n * // Server-side\n * const user = await auth.requireUser(request);\n */\nexport const auth = {\n // Client methods\n loginWithOAuth: clientAuth.loginWithOAuth,\n loginWithGoogle: clientAuth.loginWithGoogle,\n loginWithGitHub: clientAuth.loginWithGitHub,\n signInWithPassword: clientAuth.signInWithPassword,\n signUp: clientAuth.signUp,\n logout: clientAuth.logout,\n getSession: clientAuth.getSession,\n getUser: clientAuth.getUser,\n refreshSession: clientAuth.refreshSession,\n updateUser: clientAuth.updateUser,\n resetPassword: clientAuth.resetPassword,\n onAuthStateChange: clientAuth.onAuthStateChange,\n getAccessToken: clientAuth.getAccessToken,\n isAuthenticated: clientAuth.isAuthenticated,\n\n // Server methods\n verifyToken: serverAuth.verifyToken,\n verifySession: serverAuth.verifySession,\n requireUser: serverAuth.requireUser,\n requireRole: serverAuth.requireRole,\n hasRole: serverAuth.hasRole,\n getUserById: serverAuth.getUserById,\n updateUserRole: serverAuth.updateUserRole,\n deleteUser: serverAuth.deleteUser,\n createMiddleware: serverAuth.createMiddleware,\n};\n\n// Re-export types for convenience\nexport type {\n OAuthOptions,\n SignInWithPasswordOptions,\n SignUpOptions,\n ResetPasswordOptions,\n UpdateUserOptions,\n AuthStateChangeCallback,\n AuthSubscription,\n OAuthProvider,\n UserRole,\n UserWithRole,\n AuthRequest,\n VerifiedUser,\n};\n\n/**\n * VocoAuthClient class for OOP usage\n *\n * @example\n * const client = new VocoAuthClient();\n * await client.loginWithGoogle();\n */\nexport class VocoAuthClient {\n /**\n * Sign in with Google OAuth\n */\n async loginWithGoogle(redirectTo?: string): Promise<void> {\n const { loginWithGoogle } = await import('./client');\n return loginWithGoogle(redirectTo);\n }\n\n /**\n * Sign in with email and password\n */\n async signInWithPassword(options: SignInWithPasswordOptions) {\n const { signInWithPassword } = await import('./client');\n return signInWithPassword(options);\n }\n\n /**\n * Sign up a new user\n */\n async signUp(options: SignUpOptions) {\n const { signUp } = await import('./client');\n return signUp(options);\n }\n\n /**\n * Sign out the current user\n */\n async logout(): Promise<void> {\n const { logout } = await import('./client');\n return logout();\n }\n\n /**\n * Get the current session\n */\n async getSession() {\n const { getSession } = await import('./client');\n return getSession();\n }\n\n /**\n * Get the current user\n */\n async getUser() {\n const { getUser } = await import('./client');\n return getUser();\n }\n\n /**\n * Subscribe to auth state changes\n */\n onAuthStateChange(callback: AuthStateChangeCallback): AuthSubscription {\n const { onAuthStateChange } = require('./client');\n return onAuthStateChange(callback);\n }\n}\n","/**\n * Server-side authentication functions\n * These functions are meant to be used in API routes, middleware, and server components\n */\n\nimport type { AuthRequest, VerifiedUser, UserRole } from './types';\nimport { getServerClient, getServiceRoleClient } from './config';\nimport { VocoAuthError } from '../shared/errors';\nimport type { User, Session } from '@supabase/supabase-js';\nimport { jwtDecode } from 'jwt-decode';\n\n/**\n * JWT token payload\n */\ninterface JWTPayload {\n sub: string;\n email: string;\n role?: UserRole;\n exp: number;\n iat: number;\n aud: string;\n}\n\n/**\n * Extract the bearer token from a request\n */\nfunction extractToken(request: AuthRequest): string | null {\n // Try Authorization header first\n const authHeader = request.headers.get('authorization');\n if (authHeader?.startsWith('Bearer ')) {\n return authHeader.substring(7);\n }\n\n // Try X-Authorization header (common alternative)\n const xAuthHeader = request.headers.get('x-authorization');\n if (xAuthHeader?.startsWith('Bearer ')) {\n return xAuthHeader.substring(7);\n }\n\n // Try cookies\n const sbToken = request.cookies?.get('sb-vocoweb-auth-token')?.value;\n if (sbToken) {\n try {\n // The cookie contains a JSON string with access_token\n const parsed = JSON.parse(sbToken);\n return parsed.access_token || null;\n } catch {\n // If parsing fails, return the raw value\n return sbToken;\n }\n }\n\n return null;\n}\n\n/**\n * Decode and verify a JWT token\n *\n * @example\n * const payload = await auth.decodeToken('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...');\n */\nexport function decodeToken(token: string): JWTPayload {\n try {\n return jwtDecode<JWTPayload>(token);\n } catch (error) {\n throw new VocoAuthError('Invalid token format', 'INVALID_TOKEN');\n }\n}\n\n/**\n * Verify a JWT token and return the user\n *\n * @example\n * const user = await auth.verifyToken(request);\n */\nexport async function verifyToken(request: AuthRequest): Promise<VerifiedUser> {\n const token = extractToken(request);\n\n if (!token) {\n throw VocoAuthError.unauthorized('No authorization token found');\n }\n\n const payload = decodeToken(token);\n\n // Check token expiration\n if (payload.exp < Date.now() / 1000) {\n throw VocoAuthError.sessionExpired();\n }\n\n // Verify the session is still valid in Supabase\n const supabase = getServerClient();\n const { data, error } = await supabase.auth.getUser(token);\n\n if (error || !data.user) {\n throw VocoAuthError.unauthorized('Invalid session');\n }\n\n return {\n id: data.user.id,\n email: data.user.email || '',\n role: (data.user.user_metadata?.role as UserRole) || 'user',\n };\n}\n\n/**\n * Verify a JWT token and return the session\n *\n * @example\n * const session = await auth.verifySession(request);\n */\nexport async function verifySession(request: AuthRequest): Promise<Session> {\n const token = extractToken(request);\n\n if (!token) {\n throw VocoAuthError.unauthorized('No authorization token found');\n }\n\n const payload = decodeToken(token);\n\n // Check token expiration\n if (payload.exp < Date.now() / 1000) {\n throw VocoAuthError.sessionExpired();\n }\n\n // Verify the session is still valid in Supabase\n const supabase = getServerClient();\n const { data, error } = await supabase.auth.getSession();\n\n if (error || !data.session) {\n throw VocoAuthError.unauthorized('Invalid session');\n }\n\n return data.session;\n}\n\n/**\n * Require an authenticated user for a protected route\n * Throws 401 if user is not authenticated\n *\n * @example\n * export async function GET(request: Request) {\n * const user = await auth.requireUser(request);\n * return Response.json({ user });\n * }\n */\nexport async function requireUser(request: AuthRequest): Promise<VerifiedUser> {\n return verifyToken(request);\n}\n\n/**\n * Require a specific role for a protected route\n * Throws 403 if user doesn't have the required role\n *\n * @example\n * export async function DELETE(request: Request) {\n * const user = await auth.requireRole(request, 'admin');\n * return Response.json({ user });\n * }\n */\nexport async function requireRole(\n request: AuthRequest,\n allowedRoles: UserRole[]\n): Promise<VerifiedUser> {\n const user = await verifyToken(request);\n\n if (!user.role || !allowedRoles.includes(user.role)) {\n throw VocoAuthError.forbidden(\n `This action requires one of the following roles: ${allowedRoles.join(', ')}`\n );\n }\n\n return user;\n}\n\n/**\n * Check if a user has a specific role\n *\n * @example\n * if (await auth.hasRole(request, 'admin')) {\n * // Show admin features\n * }\n */\nexport async function hasRole(request: AuthRequest, role: UserRole): Promise<boolean> {\n try {\n const user = await verifyToken(request);\n return user.role === role;\n } catch {\n return false;\n }\n}\n\n/**\n * Get a user by ID (admin function)\n *\n * @example\n * const user = await auth.getUserById('user-id-here');\n */\nexport async function getUserById(userId: string): Promise<User | null> {\n const supabase = getServiceRoleClient();\n\n const { data, error } = await supabase.auth.admin.getUserById(userId);\n\n if (error) {\n throw new VocoAuthError(error.message, 'USER_FETCH_FAILED');\n }\n\n return data.user;\n}\n\n/**\n * Update a user's role (admin function)\n *\n * @example\n * await auth.updateUserRole('user-id-here', 'admin');\n */\nexport async function updateUserRole(\n userId: string,\n role: UserRole\n): Promise<void> {\n const supabase = getServiceRoleClient();\n\n // First get the current user\n const { data: currentData, error: fetchError } = await supabase.auth.admin.getUserById(userId);\n\n if (fetchError || !currentData.user) {\n throw new VocoAuthError('User not found', 'USER_NOT_FOUND');\n }\n\n // Update with new role\n const { error } = await supabase.auth.admin.updateUserById(userId, {\n user_metadata: {\n ...currentData.user.user_metadata,\n role,\n },\n });\n\n if (error) {\n throw new VocoAuthError(error.message, 'ROLE_UPDATE_FAILED');\n }\n}\n\n/**\n * Delete a user (admin function)\n *\n * @example\n * await auth.deleteUser('user-id-here');\n */\nexport async function deleteUser(userId: string): Promise<void> {\n const supabase = getServiceRoleClient();\n\n const { error } = await supabase.auth.admin.deleteUser(userId);\n\n if (error) {\n throw new VocoAuthError(error.message, 'USER_DELETE_FAILED');\n }\n}\n\n/**\n * Create a middleware-compatible auth function\n *\n * @example\n * // In Next.js middleware\n * import { createMiddleware } from '@vocoweb/kernel/auth';\n *\n * export const middleware = createMiddleware({\n * publicRoutes: ['/api/public', '/login'],\n * });\n */\nexport function createMiddleware(options?: {\n publicRoutes?: string[];\n apiPrefix?: string;\n}) {\n const publicRoutes = options?.publicRoutes ?? [];\n\n return async (request: Request): Promise<Request | Response> => {\n const url = new URL(request.url);\n\n // Check if route is public\n const isPublic = publicRoutes.some(route => url.pathname.startsWith(route));\n\n if (isPublic) {\n return request;\n }\n\n // Verify auth for protected routes\n try {\n const authRequest: AuthRequest = {\n headers: {\n get: (name: string) => request.headers.get(name),\n },\n };\n\n const user = await verifyToken(authRequest);\n\n // Add user to request headers for downstream use\n const newRequest = new Request(request);\n newRequest.headers.set('x-user-id', user.id);\n newRequest.headers.set('x-user-email', user.email);\n if (user.role) {\n newRequest.headers.set('x-user-role', user.role);\n }\n\n return newRequest;\n } catch (error) {\n // Return 401 for protected routes\n return new Response(\n JSON.stringify({ error: 'Unauthorized' }),\n { status: 401, headers: { 'Content-Type': 'application/json' } }\n );\n }\n };\n}\n\n/**\n * Server authentication API\n */\nexport const serverAuth = {\n verifyToken,\n verifySession,\n requireUser,\n requireRole,\n hasRole,\n getUserById,\n updateUserRole,\n deleteUser,\n createMiddleware,\n};\n","/**\n * VocoAuth Component\n *\n * A pre-styled, high-converting authentication component.\n * Handles Google OAuth login with loading states and error handling.\n *\n * @example\n * <VocoAuth redirectUrl=\"/dashboard\" />\n */\n\nimport { useState, useCallback } from 'react';\nimport { loginWithGoogle, loginWithGitHub, signInWithPassword, signUp } from '../client';\n\nexport interface VocoAuthProps {\n /**\n * URL to redirect to after successful authentication\n */\n redirectUrl?: string;\n\n /**\n * Custom CSS class name\n */\n className?: string;\n\n /**\n * Authentication mode\n */\n mode?: 'oauth' | 'password' | 'both';\n\n /**\n * OAuth providers to show\n */\n providers?: Array<'google' | 'github'>;\n\n /**\n * Show sign up form\n */\n showSignUp?: boolean;\n\n /**\n * Custom success callback\n */\n onSuccess?: (user: { id: string; email: string }) => void;\n\n /**\n * Custom error callback\n */\n onError?: (error: { message: string; code: string }) => void;\n}\n\nexport function VocoAuth({\n redirectUrl,\n className,\n mode = 'both',\n providers = ['google'],\n showSignUp = false,\n onSuccess,\n onError,\n}: VocoAuthProps) {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [authMode, setAuthMode] = useState<'signIn' | 'signUp'>('signIn');\n\n const handleOAuthLogin = useCallback(\n async (provider: 'google' | 'github') => {\n setIsLoading(true);\n setError(null);\n\n try {\n if (provider === 'google') {\n await loginWithGoogle(redirectUrl);\n } else {\n await loginWithGitHub(redirectUrl);\n }\n // Note: OAuth redirect will navigate away, so we may not reach here\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Authentication failed';\n setError(errorMessage);\n setIsLoading(false);\n onError?.({ message: errorMessage, code: 'OAUTH_ERROR' });\n }\n },\n [redirectUrl, onError]\n );\n\n const handlePasswordAuth = useCallback(\n async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n setIsLoading(true);\n setError(null);\n\n const formData = new FormData(e.currentTarget);\n const email = formData.get('email') as string;\n const password = formData.get('password') as string;\n\n try {\n let result;\n if (authMode === 'signIn') {\n result = await signInWithPassword({ email, password });\n } else {\n result = await signUp({\n email,\n password,\n });\n }\n\n if (result.data.user) {\n onSuccess?.({\n id: result.data.user.id,\n email: result.data.user.email || '',\n });\n }\n\n // Redirect if specified\n if (redirectUrl && typeof window !== 'undefined') {\n window.location.href = redirectUrl;\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Authentication failed';\n setError(errorMessage);\n setIsLoading(false);\n onError?.({ message: errorMessage, code: 'AUTH_ERROR' });\n }\n },\n [authMode, redirectUrl, onSuccess, onError]\n );\n\n const toggleAuthMode = () => {\n setAuthMode(prev => (prev === 'signIn' ? 'signUp' : 'signIn'));\n setError(null);\n };\n\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '400px',\n padding: '2rem',\n }}\n >\n <div\n style={{\n width: '100%',\n maxWidth: '400px',\n backgroundColor: 'white',\n borderRadius: '12px',\n padding: '2rem',\n boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n }}\n >\n {/* Header */}\n <div style={{ textAlign: 'center', marginBottom: '2rem' }}>\n <h1\n style={{\n fontSize: '1.5rem',\n fontWeight: '700',\n color: '#111827',\n marginBottom: '0.5rem',\n }}\n >\n {authMode === 'signIn' ? 'Sign in to your account' : 'Create your account'}\n </h1>\n <p style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n {authMode === 'signIn' ? 'Welcome back!' : 'Get started for free'}\n </p>\n </div>\n\n {/* Error Message */}\n {error && (\n <div\n role=\"alert\"\n style={{\n padding: '0.75rem',\n marginBottom: '1rem',\n backgroundColor: '#fef2f2',\n border: '1px solid #fecaca',\n borderRadius: '0.5rem',\n color: '#991b1b',\n fontSize: '0.875rem',\n }}\n >\n {error}\n </div>\n )}\n\n {/* OAuth Buttons */}\n {(mode === 'oauth' || mode === 'both') && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginBottom: '1.5rem' }}>\n {providers.includes('google') && (\n <button\n type=\"button\"\n onClick={() => handleOAuthLogin('google')}\n disabled={isLoading}\n aria-label=\"Sign in with Google\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.75rem',\n width: '100%',\n padding: '0.75rem 1rem',\n backgroundColor: 'white',\n border: '1px solid #d1d5db',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: '#374151',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n opacity: isLoading ? 0.5 : 1,\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={e => {\n if (!isLoading) {\n e.currentTarget.style.backgroundColor = '#f9fafb';\n }\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = 'white';\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M19.6 10.23c0-.82-.1-1.42-.25-2.05H10v3.72h5.5c-.15.96-.74 2.31-2.04 3.22v2.45h3.16c1.89-1.73 2.98-4.3 2.98-7.34z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M10 20c2.7 0 4.96-.89 6.62-2.42l-3.16-2.45c-.86.58-1.97.92-3.46.92-2.65 0-4.92-1.8-5.73-4.22H2.98v2.52C4.56 17.64 7.06 20 10 20z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M4.27 11.83c-.2-.58-.32-1.19-.32-1.83 0-.64.12-1.25.32-1.83V4.9H2.98C1.08 7.28 1.08 10.72 2.98 13.1l1.29-1.27z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M10 3.98c1.52 0 2.87.52 3.94 1.54l2.9-2.9C15.06 1.19 12.7 0 10 0 7.06 0 4.56 2.36 3.38 5.9l1.29 1.27C5.38 4.98 7.65 3.98 10 3.98z\"\n fill=\"#EA4335\"\n />\n </svg>\n Continue with Google\n </button>\n )}\n\n {providers.includes('github') && (\n <button\n type=\"button\"\n onClick={() => handleOAuthLogin('github')}\n disabled={isLoading}\n aria-label=\"Sign in with GitHub\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.75rem',\n width: '100%',\n padding: '0.75rem 1rem',\n backgroundColor: 'white',\n border: '1px solid #d1d5db',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: '#374151',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n opacity: isLoading ? 0.5 : 1,\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={e => {\n if (!isLoading) {\n e.currentTarget.style.backgroundColor = '#f9fafb';\n }\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = 'white';\n }}\n >\n <svg width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 0C4.477 0 0 4.484 0 10.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0110 4.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0020 10.017C20 4.484 15.522 0 10 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n Continue with GitHub\n </button>\n )}\n </div>\n )}\n\n {/* Divider */}\n {(mode === 'both' || (mode === 'password' && showSignUp)) && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '1rem',\n marginBottom: '1.5rem',\n }}\n >\n <div style={{ flex: 1, height: '1px', backgroundColor: '#e5e7eb' }} />\n <span style={{ fontSize: '0.875rem', color: '#6b7280' }}>or continue with email</span>\n <div style={{ flex: 1, height: '1px', backgroundColor: '#e5e7eb' }} />\n </div>\n )}\n\n {/* Password Form */}\n {(mode === 'password' || mode === 'both') && (\n <form onSubmit={handlePasswordAuth} style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n <div>\n <label\n htmlFor=\"email\"\n style={{\n display: 'block',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: '#374151',\n marginBottom: '0.5rem',\n }}\n >\n Email address\n </label>\n <input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n required\n disabled={isLoading}\n style={{\n width: '100%',\n padding: '0.75rem 1rem',\n border: '1px solid #d1d5db',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n outline: 'none',\n cursor: isLoading ? 'not-allowed' : 'text',\n }}\n onFocus={e => {\n e.currentTarget.style.borderColor = '#3b82f6';\n e.currentTarget.style.boxShadow = '0 0 0 3px rgba(59, 130, 246, 0.1)';\n }}\n onBlur={e => {\n e.currentTarget.style.borderColor = '#d1d5db';\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n </div>\n\n <div>\n <label\n htmlFor=\"password\"\n style={{\n display: 'block',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: '#374151',\n marginBottom: '0.5rem',\n }}\n >\n Password\n </label>\n <input\n id=\"password\"\n name=\"password\"\n type=\"password\"\n autoComplete={authMode === 'signIn' ? 'current-password' : 'new-password'}\n required\n disabled={isLoading}\n minLength={6}\n style={{\n width: '100%',\n padding: '0.75rem 1rem',\n border: '1px solid #d1d5db',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n outline: 'none',\n cursor: isLoading ? 'not-allowed' : 'text',\n }}\n onFocus={e => {\n e.currentTarget.style.borderColor = '#3b82f6';\n e.currentTarget.style.boxShadow = '0 0 0 3px rgba(59, 130, 246, 0.1)';\n }}\n onBlur={e => {\n e.currentTarget.style.borderColor = '#d1d5db';\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={isLoading}\n style={{\n width: '100%',\n padding: '0.75rem 1rem',\n backgroundColor: '#3b82f6',\n border: 'none',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: 'white',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n opacity: isLoading ? 0.5 : 1,\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={e => {\n if (!isLoading) {\n e.currentTarget.style.backgroundColor = '#2563eb';\n }\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = '#3b82f6';\n }}\n >\n {isLoading ? 'Loading...' : authMode === 'signIn' ? 'Sign in' : 'Create account'}\n </button>\n </form>\n )}\n\n {/* Toggle Sign In/Sign Up */}\n {showSignUp && mode !== 'oauth' && (\n <div style={{ marginTop: '1.5rem', textAlign: 'center' }}>\n <p style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n {authMode === 'signIn' ? \"Don't have an account? \" : 'Already have an account? '}\n <button\n type=\"button\"\n onClick={toggleAuthMode}\n disabled={isLoading}\n style={{\n background: 'none',\n border: 'none',\n color: '#3b82f6',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n textDecoration: 'underline',\n }}\n >\n {authMode === 'signIn' ? 'Sign up' : 'Sign in'}\n </button>\n </p>\n </div>\n )}\n\n {/* Terms */}\n <p style={{ marginTop: '1.5rem', fontSize: '0.75rem', color: '#9ca3af', textAlign: 'center' }}>\n By continuing, you agree to our Terms of Service and Privacy Policy.\n </p>\n </div>\n </div>\n );\n}\n","/**\n * VAT (Value Added Tax) validation and utilities\n * Uses the EU VIES (VAT Information Exchange System) API\n */\n\nimport { VocoBillingError } from '../shared/errors';\nimport type { VatInfo } from './types';\n\n/**\n * EU country codes with VAT\n */\nexport const EU_COUNTRY_CODES = [\n 'AT', // Austria\n 'BE', // Belgium\n 'BG', // Bulgaria\n 'CY', // Cyprus\n 'CZ', // Czech Republic\n 'DE', // Germany\n 'DK', // Denmark\n 'EE', // Estonia\n 'EL', // Greece\n 'ES', // Spain\n 'FI', // Finland\n 'FR', // France\n 'HR', // Croatia\n 'HU', // Hungary\n 'IE', // Ireland\n 'IT', // Italy\n 'LT', // Lithuania\n 'LU', // Luxembourg\n 'LV', // Latvia\n 'MT', // Malta\n 'NL', // Netherlands\n 'PL', // Poland\n 'PT', // Portugal\n 'RO', // Romania\n 'SE', // Sweden\n 'SI', // Slovenia\n 'SK', // Slovakia\n] as const;\n\n/**\n * VAT validation cache entry\n */\ninterface VatCacheEntry {\n valid: boolean;\n companyName?: string;\n address?: string;\n timestamp: number;\n}\n\n/**\n * In-memory cache for VAT validations\n * Cache entries expire after 24 hours\n */\nconst vatCache = new Map<string, VatCacheEntry>();\n\n/**\n * Cache expiration time in milliseconds (24 hours)\n */\nconst CACHE_EXPIRY = 24 * 60 * 60 * 1000;\n\n/**\n * VAT number regex pattern\n * Validates format: 2 letter country code + VAT number\n */\nconst VAT_NUMBER_REGEX = /^([A-Z]{2})([0-9A-Za-z]{2,13})$/;\n\n/**\n * Extract country code and VAT number from a VAT number string\n */\nexport function parseVatNumber(vatNumber: string): { countryCode: string; vatNumber: string } | null {\n const clean = vatNumber.replace(/\\s/g, '').toUpperCase();\n const match = clean.match(VAT_NUMBER_REGEX);\n\n if (!match || !match[1] || !match[2]) {\n return null;\n }\n\n return {\n countryCode: match[1],\n vatNumber: match[2],\n };\n}\n\n/**\n * Check if a country is in the EU\n */\nexport function isEuCountry(countryCode: string): boolean {\n return EU_COUNTRY_CODES.includes(countryCode as (typeof EU_COUNTRY_CODES)[number]);\n}\n\n/**\n * Validate VAT number format\n */\nexport function isValidVatFormat(vatNumber: string): boolean {\n return parseVatNumber(vatNumber) !== null;\n}\n\n/**\n * Get cached VAT validation result\n */\nfunction getCachedValidation(vatNumber: string): VatCacheEntry | null {\n const entry = vatCache.get(vatNumber);\n\n if (!entry) {\n return null;\n }\n\n // Check if cache entry has expired\n if (Date.now() - entry.timestamp > CACHE_EXPIRY) {\n vatCache.delete(vatNumber);\n return null;\n }\n\n return entry;\n}\n\n/**\n * Cache VAT validation result\n */\nfunction cacheValidation(vatNumber: string, result: Omit<VatCacheEntry, 'timestamp'>): void {\n vatCache.set(vatNumber, {\n ...result,\n timestamp: Date.now(),\n });\n}\n\n/**\n * Validate VAT number using VIES API\n *\n * @example\n * const result = await validateVat('DE123456789');\n * if (result.valid) {\n * console.log('Company:', result.companyName);\n * }\n */\nexport async function validateVat(vatNumber: string): Promise<VatInfo> {\n // Check cache first\n const cached = getCachedValidation(vatNumber);\n if (cached) {\n return {\n country: vatNumber.substring(0, 2),\n vatNumber,\n valid: cached.valid,\n companyName: cached.companyName,\n address: cached.address,\n };\n }\n\n // Parse VAT number\n const parsed = parseVatNumber(vatNumber);\n if (!parsed) {\n throw VocoBillingError.invalidVatNumber(vatNumber);\n }\n\n const { countryCode, vatNumber: number } = parsed;\n\n // Check if country is in EU\n if (!isEuCountry(countryCode)) {\n throw VocoBillingError.vatValidationFailed(vatNumber, 'Country is not in the EU');\n }\n\n try {\n // Call VIES validation API\n const response = await fetch('https://ec.europa.eu/taxation_customs/vies/rest/api/check-vat-number', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n vatNumber: number,\n countryCode,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`VIES API error: ${response.status}`);\n }\n\n const data = await response.json();\n\n // VIES response format\n const valid = data.valid === true || data.isValid === true;\n\n const result: VatInfo = {\n country: countryCode,\n vatNumber,\n valid,\n companyName: data.name || data.traderName,\n address: data.address || data.traderAddress,\n };\n\n // Cache the result\n cacheValidation(vatNumber, {\n valid: result.valid,\n companyName: result.companyName,\n address: result.address,\n });\n\n return result;\n } catch (error) {\n // If VIES is unavailable, we should fail gracefully for B2B scenarios\n // but for strict validation, we throw an error\n if (error instanceof Error) {\n throw VocoBillingError.vatValidationFailed(vatNumber, error.message);\n }\n throw VocoBillingError.vatValidationFailed(vatNumber, 'Unknown error');\n }\n}\n\n/**\n * Quick VAT format check (does not call VIES API)\n *\n * @example\n * if (isValidVatFormat('DE123456789')) {\n * // Format is valid, but not yet verified\n * }\n */\nexport function quickVatCheck(vatNumber: string): boolean {\n return isValidVatFormat(vatNumber);\n}\n\n/**\n * Check if reverse charge applies (B2B transaction within EU)\n */\nexport function shouldApplyReverseCharge(\n buyerCountry: string,\n sellerCountry: string,\n buyerVatNumber: string\n): boolean {\n // Both countries must be in EU\n if (!isEuCountry(buyerCountry) || !isEuCountry(sellerCountry)) {\n return false;\n }\n\n // Buyer must have a valid VAT number\n if (!isValidVatFormat(buyerVatNumber)) {\n return false;\n }\n\n // Different countries (domestic transactions don't use reverse charge)\n if (buyerCountry === sellerCountry) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Calculate tax amount with reverse charge consideration\n *\n * @example\n * const tax = calculateTax({\n * amount: 10000, // $100.00 in cents\n * taxRate: 0.20, // 20% VAT\n * reverseCharge: true, // B2B with valid VAT\n * });\n * // tax.taxAmount = 0 (reverse charge)\n */\nexport function calculateTax(options: {\n amount: number;\n taxRate: number;\n reverseCharge: boolean;\n}): { amount: number; taxAmount: number; taxRate: number; reverseCharge: boolean } {\n const { amount, taxRate, reverseCharge } = options;\n\n const taxAmount = reverseCharge ? 0 : Math.round(amount * taxRate);\n\n return {\n amount,\n taxAmount,\n taxRate: reverseCharge ? 0 : taxRate,\n reverseCharge,\n };\n}\n\n/**\n * Get standard VAT rate for a country\n * Note: These are standard rates and may not reflect reduced rates for specific goods\n */\nexport function getStandardVatRate(countryCode: string): number {\n const rates: Record<string, number> = {\n // Standard VAT rates (as of 2025)\n AT: 0.20, // Austria\n BE: 0.21, // Belgium\n BG: 0.20, // Bulgaria\n CY: 0.19, // Cyprus\n CZ: 0.21, // Czech Republic\n DE: 0.19, // Germany\n DK: 0.25, // Denmark\n EE: 0.20, // Estonia\n EL: 0.24, // Greece\n ES: 0.21, // Spain\n FI: 0.25, // Finland\n FR: 0.20, // France\n HR: 0.25, // Croatia\n HU: 0.27, // Hungary\n IE: 0.23, // Ireland\n IT: 0.22, // Italy\n LT: 0.21, // Lithuania\n LU: 0.17, // Luxembourg\n LV: 0.21, // Latvia\n MT: 0.18, // Malta\n NL: 0.21, // Netherlands\n PL: 0.23, // Poland\n PT: 0.23, // Portugal\n RO: 0.19, // Romania\n SE: 0.25, // Sweden\n SI: 0.22, // Slovenia\n SK: 0.20, // Slovakia\n };\n\n return rates[countryCode] ?? 0;\n}\n\n/**\n * Clear VAT validation cache (useful for testing)\n */\nexport function clearVatCache(): void {\n vatCache.clear();\n}\n\n/**\n * VAT validation API\n */\nexport const vat = {\n validate: validateVat,\n quickCheck: quickVatCheck,\n parse: parseVatNumber,\n isEuCountry,\n shouldApplyReverseCharge,\n calculateTax,\n getStandardRate: getStandardVatRate,\n clearCache: clearVatCache,\n};\n","/**\n * Stripe checkout session creation with VAT validation\n */\n\nimport Stripe from 'stripe';\nimport { getStripeConfig, getAppConfig } from '../config/env';\nimport { VocoBillingError } from '../shared/errors';\nimport type { CheckoutOptions, CheckoutResult, Customer } from './types';\nimport { validateVat } from './vat';\n\n/**\n * Get Stripe client instance (singleton)\n */\nlet stripeClient: Stripe | null = null;\n\nfunction getStripe(): Stripe {\n if (stripeClient) {\n return stripeClient;\n }\n\n const config = getStripeConfig();\n\n stripeClient = new Stripe(config.secretKey, {\n apiVersion: '2025-02-24.acacia',\n typescript: true,\n });\n\n return stripeClient;\n}\n\n/**\n * Find or create a customer\n */\nasync function findOrCreateCustomer(options: {\n userId: string;\n email?: string;\n name?: string;\n metadata?: Record<string, string>;\n}): Promise<Customer> {\n const stripe = getStripe();\n\n // Try to find existing customer by user_id metadata\n const existingCustomers = await stripe.customers.search({\n query: `metadata['user_id']:'${options.userId}'`,\n limit: 1,\n });\n\n if (existingCustomers.data.length > 0) {\n const customer = existingCustomers.data[0];\n if (!customer) return {\n id: '',\n email: undefined,\n name: undefined,\n metadata: undefined,\n };\n return {\n id: customer.id,\n email: customer.email ?? undefined,\n name: customer.name ?? undefined,\n metadata: customer.metadata ?? undefined,\n };\n }\n\n // Create new customer\n const customer = await stripe.customers.create({\n email: options.email,\n name: options.name,\n metadata: {\n user_id: options.userId,\n ...options.metadata,\n },\n });\n\n return {\n id: customer.id,\n email: customer.email ?? undefined,\n name: customer.name ?? undefined,\n metadata: customer.metadata,\n };\n}\n\n/**\n * Validate price ID exists and is active\n */\nasync function validatePriceId(priceId: string): Promise<Stripe.Price> {\n const stripe = getStripe();\n\n try {\n const price = await stripe.prices.retrieve(priceId);\n\n if (!price.active) {\n throw VocoBillingError.checkoutFailed('Price is not active');\n }\n\n return price;\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n throw VocoBillingError.checkoutFailed(`Invalid price ID: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Build success/cancel URLs\n */\nfunction buildUrls(options: {\n successUrl?: string;\n cancelUrl?: string;\n}): { successUrl: string; cancelUrl: string } {\n const appConfig = getAppConfig();\n\n let successUrl = options.successUrl;\n let cancelUrl = options.cancelUrl;\n\n if (!successUrl) {\n successUrl = `${appConfig.url}/checkout/success?session_id={CHECKOUT_SESSION_ID}`;\n }\n\n if (!cancelUrl) {\n cancelUrl = `${appConfig.url}/checkout/cancel`;\n }\n\n return { successUrl, cancelUrl };\n}\n\n/**\n * Create Stripe checkout session with VAT validation\n *\n * @example\n * const result = await createCheckoutSession({\n * priceId: 'price_...',\n * userId: 'user-123',\n * vatNumber: 'DE123456789',\n * email: 'customer@example.com',\n * });\n */\nexport async function createCheckoutSession(options: CheckoutOptions): Promise<CheckoutResult> {\n const stripe = getStripe();\n const { successUrl, cancelUrl } = buildUrls({\n successUrl: options.successUrl,\n cancelUrl: options.cancelUrl,\n });\n\n // Validate price\n const price = await validatePriceId(options.priceId);\n\n // Find or create customer\n const customer = await findOrCreateCustomer({\n userId: options.userId,\n email: options.email,\n name: options.name,\n metadata: options.metadata,\n });\n\n // Build checkout session params\n const sessionParams: Stripe.Checkout.SessionCreateParams = {\n customer: customer.id,\n mode: price.recurring ? 'subscription' : 'payment',\n success_url: successUrl,\n cancel_url: cancelUrl,\n metadata: {\n user_id: options.userId,\n ...options.metadata,\n },\n };\n\n // Set line items\n if (price.recurring) {\n // Subscription\n sessionParams.line_items = [\n {\n price: price.id,\n quantity: options.quantity ?? 1,\n },\n ];\n\n // Trial period\n if (options.trialPeriodDays) {\n sessionParams.subscription_data = {\n trial_period_days: options.trialPeriodDays,\n metadata: sessionParams.metadata,\n };\n }\n } else {\n // One-time payment\n sessionParams.line_items = [\n {\n price: price.id,\n quantity: options.quantity ?? 1,\n },\n ];\n }\n\n // Handle VAT validation for reverse charge\n if (options.vatNumber) {\n const vatValidation = await validateVat(options.vatNumber);\n\n if (vatValidation.valid) {\n // VAT is valid - apply reverse charge\n const parsedVat = options.vatNumber.substring(0, 2);\n\n // Add VAT number to customer metadata\n await stripe.customers.update(customer.id, {\n metadata: {\n vat_number: options.vatNumber,\n vat_valid: 'true',\n reverse_charge: 'true',\n company_name: vatValidation.companyName || '',\n },\n });\n\n // Set automatic tax to compute based on customer location\n sessionParams.automatic_tax = {\n enabled: true,\n };\n\n // Add tax exemption metadata\n sessionParams.metadata = {\n ...sessionParams.metadata,\n vat_number: options.vatNumber,\n vat_valid: 'true',\n reverse_charge: 'true',\n vat_country: parsedVat,\n };\n } else {\n // VAT is invalid - throw error\n throw VocoBillingError.vatValidationFailed(options.vatNumber, 'VAT number is invalid');\n }\n } else {\n // No VAT number - use automatic tax\n sessionParams.automatic_tax = {\n enabled: true,\n };\n }\n\n // Create session\n try {\n const session = await stripe.checkout.sessions.create(sessionParams);\n\n if (!session.url) {\n throw VocoBillingError.checkoutFailed('Failed to create checkout session');\n }\n\n return {\n url: session.url,\n sessionId: session.id,\n };\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n throw VocoBillingError.checkoutFailed(`Stripe error: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Create a customer portal session\n *\n * @example\n * const result = await createPortalSession({\n * customerId: 'cus_...',\n * returnUrl: 'https://app.example.com/settings',\n * });\n */\nexport async function createPortalSession(options: {\n customerId: string;\n returnUrl: string;\n}): Promise<{ url: string }> {\n const stripe = getStripe();\n\n try {\n const session = await stripe.billingPortal.sessions.create({\n customer: options.customerId,\n return_url: options.returnUrl,\n });\n\n return { url: session.url };\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n throw VocoBillingError.checkoutFailed(`Stripe error: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Get checkout session by ID\n *\n * @example\n * const session = await getCheckoutSession('cs_test_...');\n */\nexport async function getCheckoutSession(sessionId: string): Promise<Stripe.Checkout.Session> {\n const stripe = getStripe();\n\n try {\n return await stripe.checkout.sessions.retrieve(sessionId);\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n throw VocoBillingError.checkoutFailed(`Session not found: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * List products with prices\n *\n * @example\n * const products = await listProducts({ active: true });\n */\nexport async function listProducts(options?: {\n active?: boolean;\n limit?: number;\n}): Promise<Array<{ product: Stripe.Product; prices: Stripe.Price[] }>> {\n const stripe = getStripe();\n\n const productsParams: Stripe.ProductListParams = {\n limit: options?.limit ?? 100,\n active: options?.active,\n };\n\n const products = await stripe.products.list(productsParams);\n\n const result = await Promise.all(\n products.data.map(async product => {\n const prices = await stripe.prices.list({\n product: product.id,\n active: true,\n });\n\n return {\n product,\n prices: prices.data,\n };\n })\n );\n\n return result;\n}\n\n/**\n * Get product by ID with prices\n *\n * @example\n * const product = await getProduct('prod_...');\n */\nexport async function getProduct(productId: string): Promise<{\n product: Stripe.Product;\n prices: Stripe.Price[];\n}> {\n const stripe = getStripe();\n\n const product = await stripe.products.retrieve(productId);\n const prices = await stripe.prices.list({\n product: productId,\n active: true,\n });\n\n return {\n product,\n prices: prices.data,\n };\n}\n\n/**\n * Checkout API\n */\nexport const checkout = {\n createSession: createCheckoutSession,\n getSession: getCheckoutSession,\n createPortal: createPortalSession,\n listProducts,\n getProduct,\n};\n","/**\n * Stripe webhook handler\n * Verifies webhook signatures and processes events\n */\n\nimport type Stripe from 'stripe';\nimport { getStripeConfig } from '../config/env';\nimport { VocoBillingError } from '../shared/errors';\n\n/**\n * Webhook event handler type\n */\nexport type WebhookEventHandler = (event: Stripe.Event) => void | Promise<void>;\n\n/**\n * Webhook handler registry\n */\ninterface WebhookHandlerRegistry {\n [eventType: string]: WebhookEventHandler[];\n}\n\nconst handlers: WebhookHandlerRegistry = {};\n\n/**\n * Parse and verify Stripe webhook\n *\n * @example\n * import { verifyWebhook } from '@vocoweb/kernel/billing';\n *\n * export async function POST(request: Request) {\n * const body = await request.text();\n * const signature = request.headers.get('stripe-signature') || '';\n *\n * try {\n * const event = verifyWebhook(body, signature);\n * // Process event...\n * } catch (error) {\n * return Response.json({ error: 'Invalid webhook' }, { status: 400 });\n * }\n * }\n */\nexport function verifyWebhook(\n payload: string | Buffer,\n signature: string,\n secret?: string\n): Stripe.Event {\n const config = getStripeConfig();\n const webhookSecret = secret || config.webhookSecret;\n\n if (!webhookSecret) {\n throw new VocoBillingError(\n 'Stripe webhook secret is not configured',\n 'WEBHOOK_SECRET_MISSING'\n );\n }\n\n // Import Stripe here to avoid initialization issues\n const Stripe = require('stripe');\n const stripe = new Stripe(config.secretKey, {\n apiVersion: '2025-01-27.acacia',\n typescript: true,\n });\n\n try {\n return stripe.webhooks.constructEvent(payload, signature, webhookSecret);\n } catch (error) {\n if (error instanceof Error) {\n throw new VocoBillingError(\n `Webhook signature verification failed: ${error.message}`,\n 'WEBHOOK_SIGNATURE_INVALID'\n );\n }\n throw error;\n }\n}\n\n/**\n * Register a handler for a specific webhook event type\n *\n * @example\n * onWebhookEvent('checkout.session.completed', async (event) => {\n * const session = event.data.object as Stripe.Checkout.Session;\n * console.log('Checkout completed:', session.id);\n * });\n */\nexport function onWebhookEvent(eventType: string, handler: WebhookEventHandler): void {\n if (!handlers[eventType]) {\n handlers[eventType] = [];\n }\n handlers[eventType].push(handler);\n}\n\n/**\n * Unregister all handlers for an event type\n */\nexport function offWebhookEvent(eventType: string): void {\n delete handlers[eventType];\n}\n\n/**\n * Process a webhook event by calling registered handlers\n *\n * @example\n * const event = verifyWebhook(body, signature);\n * await handleWebhook(event);\n */\nexport async function handleWebhook(event: Stripe.Event): Promise<void> {\n const eventType = event.type;\n const eventHandlers = handlers[eventType];\n\n if (!eventHandlers || eventHandlers.length === 0) {\n // No handlers registered for this event type\n return;\n }\n\n // Call all handlers for this event type\n for (const handler of eventHandlers) {\n await handler(event);\n }\n}\n\n/**\n * Create a standardized webhook handler for Next.js API routes\n *\n * @example\n * export const POST = handleWebhookRequest({\n * onCheckoutCompleted: async (session) => {\n * // Handle successful checkout\n * },\n * onInvoicePaid: async (invoice) => {\n * // Handle paid invoice\n * },\n * });\n */\nexport function handleWebhookRequest(config?: {\n onCheckoutCompleted?: (session: Stripe.Checkout.Session) => void | Promise<void>;\n onInvoicePaid?: (invoice: Stripe.Invoice) => void | Promise<void>;\n onInvoiceFailed?: (invoice: Stripe.Invoice) => void | Promise<void>;\n onSubscriptionCreated?: (subscription: Stripe.Subscription) => void | Promise<void>;\n onSubscriptionUpdated?: (subscription: Stripe.Subscription) => void | Promise<void>;\n onSubscriptionDeleted?: (subscription: Stripe.Subscription) => void | Promise<void>;\n onCustomerCreated?: (customer: Stripe.Customer) => void | Promise<void>;\n onEvent?: (event: Stripe.Event) => void | Promise<void>;\n}) {\n return async (request: Request): Promise<Response> => {\n const body = await request.text();\n const signature = request.headers.get('stripe-signature');\n\n if (!signature) {\n return Response.json(\n { error: 'Missing stripe-signature header' },\n { status: 400 }\n );\n }\n\n let event: Stripe.Event;\n\n try {\n event = verifyWebhook(body, signature);\n } catch (error) {\n return Response.json(\n { error: 'Invalid webhook signature' },\n { status: 401 }\n );\n }\n\n try {\n // Call custom event handler if provided\n if (config?.onEvent) {\n await config.onEvent(event);\n }\n\n // Handle specific event types\n switch (event.type) {\n case 'checkout.session.completed': {\n const session = event.data.object as Stripe.Checkout.Session;\n await config?.onCheckoutCompleted?.(session);\n break;\n }\n\n case 'invoice.paid': {\n const invoice = event.data.object as Stripe.Invoice;\n await config?.onInvoicePaid?.(invoice);\n break;\n }\n\n case 'invoice.payment_failed': {\n const invoice = event.data.object as Stripe.Invoice;\n await config?.onInvoiceFailed?.(invoice);\n break;\n }\n\n case 'customer.subscription.created': {\n const subscription = event.data.object as Stripe.Subscription;\n await config?.onSubscriptionCreated?.(subscription);\n break;\n }\n\n case 'customer.subscription.updated': {\n const subscription = event.data.object as Stripe.Subscription;\n await config?.onSubscriptionUpdated?.(subscription);\n break;\n }\n\n case 'customer.subscription.deleted': {\n const subscription = event.data.object as Stripe.Subscription;\n await config?.onSubscriptionDeleted?.(subscription);\n break;\n }\n\n case 'customer.created': {\n const customer = event.data.object as Stripe.Customer;\n await config?.onCustomerCreated?.(customer);\n break;\n }\n }\n\n return Response.json({ received: true });\n } catch (error) {\n console.error('Webhook handler error:', error);\n return Response.json(\n { error: 'Webhook handler failed' },\n { status: 500 }\n );\n }\n };\n}\n\n/**\n * Middleware-style webhook handler for Express\n *\n * @example\n * app.post('/webhook', expressWebhookHandler({\n * onCheckoutCompleted: async (session) => {\n * // Handle checkout\n * },\n * }));\n */\nexport function expressWebhookHandler(config?: {\n onCheckoutCompleted?: (session: Stripe.Checkout.Session) => void | Promise<void>;\n onInvoicePaid?: (invoice: Stripe.Invoice) => void | Promise<void>;\n onInvoiceFailed?: (invoice: Stripe.Invoice) => void | Promise<void>;\n onSubscriptionCreated?: (subscription: Stripe.Subscription) => void | Promise<void>;\n onSubscriptionUpdated?: (subscription: Stripe.Subscription) => void | Promise<void>;\n onSubscriptionDeleted?: (subscription: Stripe.Subscription) => void | Promise<void>;\n onCustomerCreated?: (customer: Stripe.Customer) => void | Promise<void>;\n onEvent?: (event: Stripe.Event) => void | Promise<void>;\n}) {\n return async (req: {\n body?: string;\n headers: { 'stripe-signature'?: string };\n }, res: {\n status(code: number): { json(data: unknown): void };\n json(data: unknown): void;\n }): Promise<void> => {\n const body = req.body ?? '';\n const signature = req.headers['stripe-signature'];\n\n if (!signature) {\n res.status(400).json({ error: 'Missing stripe-signature header' });\n return;\n }\n\n let event: Stripe.Event;\n\n try {\n event = verifyWebhook(body, signature);\n } catch (error) {\n res.status(401).json({ error: 'Invalid webhook signature' });\n return;\n }\n\n try {\n if (config?.onEvent) {\n await config.onEvent(event);\n }\n\n switch (event.type) {\n case 'checkout.session.completed': {\n const session = event.data.object as Stripe.Checkout.Session;\n await config?.onCheckoutCompleted?.(session);\n break;\n }\n\n case 'invoice.paid': {\n const invoice = event.data.object as Stripe.Invoice;\n await config?.onInvoicePaid?.(invoice);\n break;\n }\n\n case 'invoice.payment_failed': {\n const invoice = event.data.object as Stripe.Invoice;\n await config?.onInvoiceFailed?.(invoice);\n break;\n }\n\n case 'customer.subscription.created': {\n const subscription = event.data.object as Stripe.Subscription;\n await config?.onSubscriptionCreated?.(subscription);\n break;\n }\n\n case 'customer.subscription.updated': {\n const subscription = event.data.object as Stripe.Subscription;\n await config?.onSubscriptionUpdated?.(subscription);\n break;\n }\n\n case 'customer.subscription.deleted': {\n const subscription = event.data.object as Stripe.Subscription;\n await config?.onSubscriptionDeleted?.(subscription);\n break;\n }\n\n case 'customer.created': {\n const customer = event.data.object as Stripe.Customer;\n await config?.onCustomerCreated?.(customer);\n break;\n }\n }\n\n res.json({ received: true });\n } catch (error) {\n console.error('Webhook handler error:', error);\n res.status(500).json({ error: 'Webhook handler failed' });\n }\n };\n}\n\n/**\n * Webhook API\n */\nexport const webhook = {\n verify: verifyWebhook,\n handle: handleWebhook,\n on: onWebhookEvent,\n off: offWebhookEvent,\n createHandler: handleWebhookRequest,\n expressHandler: expressWebhookHandler,\n};\n\n/**\n * Common Stripe webhook event types\n */\nexport const WebhookEvents = {\n // Checkout\n CHECKOUT_COMPLETED: 'checkout.session.completed',\n CHECKOUT_EXPIRED: 'checkout.session.expired',\n\n // Invoice\n INVOICE_CREATED: 'invoice.created',\n INVOICE_PAID: 'invoice.paid',\n INVOICE_PAYMENT_FAILED: 'invoice.payment_failed',\n INVOICE_SENT: 'invoice.sent',\n INVOICE_UPCOMING: 'invoice.upcoming',\n INVOICE_VOIDED: 'invoice.voided',\n INVOICE_MARKED_UNCOLLECTIBLE: 'invoice.marked_uncollectible',\n\n // Subscription\n SUBSCRIPTION_CREATED: 'customer.subscription.created',\n SUBSCRIPTION_UPDATED: 'customer.subscription.updated',\n SUBSCRIPTION_DELETED: 'customer.subscription.deleted',\n SUBSCRIPTION_TRIAL_WILL_END: 'customer.subscription.trial_will_end',\n\n // Customer\n CUSTOMER_CREATED: 'customer.created',\n CUSTOMER_UPDATED: 'customer.updated',\n CUSTOMER_DELETED: 'customer.deleted',\n} as const;\n","/**\n * Invoice management\n */\n\nimport Stripe from 'stripe';\nimport { getStripeConfig } from '../config/env';\nimport { VocoBillingError } from '../shared/errors';\nimport type { Invoice } from './types';\n\n/**\n * Get Stripe client instance\n */\nfunction getStripe(): Stripe {\n const config = getStripeConfig();\n return new Stripe(config.secretKey, {\n apiVersion: '2025-02-24.acacia',\n typescript: true,\n });\n}\n\n/**\n * Convert Stripe invoice to our Invoice type\n */\nfunction toInvoice(invoice: Stripe.Invoice): Invoice {\n return {\n id: invoice.id,\n number: invoice.number || invoice.id,\n amount: invoice.amount_paid || invoice.total || 0,\n currency: invoice.currency.toUpperCase(),\n status: invoice.status as Invoice['status'],\n createdAt: new Date(invoice.created * 1000),\n dueDate: invoice.due_date ? new Date(invoice.due_date * 1000) : undefined,\n paidAt: invoice.status_transitions.paid_at\n ? new Date(invoice.status_transitions.paid_at * 1000)\n : undefined,\n pdfUrl: invoice.invoice_pdf || undefined,\n metadata: (invoice.metadata ?? undefined) as Record<string, string> | undefined,\n };\n}\n\n/**\n * Get invoice by ID\n *\n * @example\n * const invoice = await getInvoice('in_...');\n */\nexport async function getInvoice(invoiceId: string): Promise<Invoice> {\n const stripe = getStripe();\n\n try {\n const invoice = await stripe.invoices.retrieve(invoiceId);\n return toInvoice(invoice);\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n throw VocoBillingError.invoiceNotFound(invoiceId);\n }\n throw error;\n }\n}\n\n/**\n * List invoices for a customer\n *\n * @example\n * const invoices = await getInvoices('cus_...');\n */\nexport async function getInvoices(customerId: string, options?: {\n limit?: number;\n status?: Invoice['status'];\n}): Promise<{ invoices: Invoice[]; hasMore: boolean }> {\n const stripe = getStripe();\n\n const params: Stripe.InvoiceListParams = {\n customer: customerId,\n limit: options?.limit ?? 50,\n };\n\n if (options?.status) {\n params.status = options.status;\n }\n\n try {\n const result = await stripe.invoices.list(params);\n\n return {\n invoices: result.data.map(toInvoice),\n hasMore: result.has_more,\n };\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n throw new VocoBillingError(\n `Failed to fetch invoices: ${error.message}`,\n 'INVOICE_FETCH_FAILED'\n );\n }\n throw error;\n }\n}\n\n/**\n * List invoices for a user (by user_id metadata)\n *\n * @example\n * const invoices = await getUserInvoices('user-123');\n */\nexport async function getUserInvoices(userId: string, options?: {\n limit?: number;\n status?: Invoice['status'];\n}): Promise<{ invoices: Invoice[]; hasMore: boolean }> {\n const stripe = getStripe();\n\n // First, find the customer by user_id metadata\n const customers = await stripe.customers.search({\n query: `metadata['user_id']:'${userId}'`,\n limit: 1,\n });\n\n if (customers.data.length === 0) {\n return { invoices: [], hasMore: false };\n }\n\n const customer = customers.data[0];\n if (!customer) {\n return { invoices: [], hasMore: false };\n }\n\n return getInvoices(customer.id, options);\n}\n\n/**\n * Get upcoming invoice for a subscription\n *\n * @example\n * const invoice = await getUpcomingInvoice('sub_...');\n */\nexport async function getUpcomingInvoice(subscriptionId: string): Promise<Invoice | null> {\n const stripe = getStripe();\n\n try {\n const result = await stripe.invoices.retrieveUpcoming({\n subscription: subscriptionId,\n });\n\n // Upcoming invoice has different structure, use the result data\n const invoice = result as unknown as Stripe.Invoice;\n\n // Generate a temporary ID for the upcoming invoice\n const tempId = `upcoming_${subscriptionId}_${Date.now()}`;\n\n return {\n id: tempId,\n number: invoice.number || tempId,\n amount: invoice.total || 0,\n currency: invoice.currency.toUpperCase(),\n status: invoice.status as Invoice['status'],\n createdAt: new Date(invoice.created * 1000),\n dueDate: invoice.due_date ? new Date(invoice.due_date * 1000) : undefined,\n paidAt: invoice.status_transitions.paid_at\n ? new Date(invoice.status_transitions.paid_at * 1000)\n : undefined,\n pdfUrl: invoice.invoice_pdf || undefined,\n metadata: (invoice.metadata ?? undefined) as Record<string, string> | undefined,\n };\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n if (error.code === 'resource_missing') {\n return null;\n }\n throw new VocoBillingError(\n `Failed to fetch upcoming invoice: ${error.message}`,\n 'UPCOMING_INVOICE_FAILED'\n );\n }\n throw error;\n }\n}\n\n/**\n * Create an invoice for a subscription immediately\n *\n * @example\n * const invoice = await createInvoice('sub_...');\n */\nexport async function createInvoice(subscriptionId: string): Promise<Invoice> {\n const stripe = getStripe();\n\n try {\n const invoice = await stripe.invoices.create({\n subscription: subscriptionId,\n });\n\n // Finalize the invoice\n const finalized = await stripe.invoices.finalizeInvoice(invoice.id);\n\n return toInvoice(finalized);\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n throw new VocoBillingError(\n `Failed to create invoice: ${error.message}`,\n 'INVOICE_CREATE_FAILED'\n );\n }\n throw error;\n }\n}\n\n/**\n * Pay an invoice (for automatic collection invoices)\n *\n * @example\n * const invoice = await payInvoice('in_...');\n */\nexport async function payInvoice(invoiceId: string): Promise<Invoice> {\n const stripe = getStripe();\n\n try {\n const invoice = await stripe.invoices.pay(invoiceId);\n return toInvoice(invoice);\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n throw new VocoBillingError(\n `Failed to pay invoice: ${error.message}`,\n 'INVOICE_PAYMENT_FAILED'\n );\n }\n throw error;\n }\n}\n\n/**\n * Void an invoice\n *\n * @example\n * const invoice = await voidInvoice('in_...');\n */\nexport async function voidInvoice(invoiceId: string): Promise<Invoice> {\n const stripe = getStripe();\n\n try {\n const invoice = await stripe.invoices.voidInvoice(invoiceId);\n return toInvoice(invoice);\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n throw new VocoBillingError(\n `Failed to void invoice: ${error.message}`,\n 'INVOICE_VOID_FAILED'\n );\n }\n throw error;\n }\n}\n\n/**\n * Send an invoice to the customer\n *\n * @example\n * await sendInvoice('in_...');\n */\nexport async function sendInvoice(invoiceId: string): Promise<void> {\n const stripe = getStripe();\n\n try {\n await stripe.invoices.sendInvoice(invoiceId);\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n throw new VocoBillingError(\n `Failed to send invoice: ${error.message}`,\n 'INVOICE_SEND_FAILED'\n );\n }\n throw error;\n }\n}\n\n/**\n * Get invoice line items\n *\n * @example\n * const lines = await getInvoiceLines('in_...');\n */\nexport async function getInvoiceLines(\n invoiceId: string\n): Promise<Stripe.InvoiceLineItem[]> {\n const stripe = getStripe();\n\n try {\n const invoice = await stripe.invoices.retrieve(invoiceId, {\n expand: ['lines'],\n });\n\n return (invoice.lines?.data ?? []) as Stripe.InvoiceLineItem[];\n } catch (error) {\n if (error instanceof Stripe.errors.StripeError) {\n throw new VocoBillingError(\n `Failed to fetch invoice lines: ${error.message}`,\n 'INVOICE_LINES_FAILED'\n );\n }\n throw error;\n }\n}\n\n/**\n * Invoices API\n */\nexport const invoices = {\n get: getInvoice,\n list: getInvoices,\n getUser: getUserInvoices,\n getUpcoming: getUpcomingInvoice,\n create: createInvoice,\n pay: payInvoice,\n void: voidInvoice,\n send: sendInvoice,\n getLines: getInvoiceLines,\n};\n","/**\n * Module B: Register (Payments & VAT)\n * Stripe wrapper with VAT validation (VIES)\n */\n\n// Types\nexport * from './types';\n\n// VAT validation\nexport * from './vat';\n\n// Checkout\nexport * from './checkout';\n\n// Webhook handler\nexport * from './webhook';\n\n// Invoices\nexport * from './invoices';\n\n// Import sub-modules\nimport * as vatModule from './vat';\nimport * as checkoutModule from './checkout';\nimport * as webhookModule from './webhook';\nimport * as invoicesModule from './invoices';\n\n// Import functions directly for use in billing object\nimport {\n validateVat,\n quickVatCheck,\n parseVatNumber,\n isEuCountry,\n shouldApplyReverseCharge,\n calculateTax,\n getStandardVatRate,\n} from './vat';\n\nimport {\n createCheckoutSession,\n getCheckoutSession,\n createPortalSession,\n listProducts,\n getProduct,\n} from './checkout';\n\nimport {\n verifyWebhook,\n handleWebhook,\n onWebhookEvent,\n offWebhookEvent,\n handleWebhookRequest,\n expressWebhookHandler,\n} from './webhook';\n\nimport {\n getInvoice,\n getInvoices,\n getUserInvoices,\n getUpcomingInvoice,\n createInvoice,\n payInvoice,\n voidInvoice,\n sendInvoice,\n getInvoiceLines,\n} from './invoices';\n\n/**\n * Main billing API\n *\n * @example\n * import { billing } from '@vocoweb/kernel';\n *\n * // Create checkout with VAT validation\n * const session = await billing.createCheckoutSession({\n * priceId: 'price_...',\n * userId: 'user-123',\n * vatNumber: 'DE123456789',\n * });\n *\n * // Validate VAT number\n * const vat = await billing.validateVat('DE123456789');\n *\n * // Get user invoices\n * const { invoices } = await billing.getInvoices('user-123');\n */\nexport const billing = {\n // VAT validation\n validateVat,\n quickVatCheck,\n parseVatNumber,\n isEuCountry,\n shouldApplyReverseCharge,\n calculateTax,\n getStandardVatRate,\n\n // Checkout\n createCheckoutSession,\n getCheckoutSession,\n createPortalSession,\n listProducts,\n getProduct,\n\n // Webhook\n verifyWebhook,\n handleWebhook,\n onWebhookEvent,\n offWebhookEvent,\n handleWebhookRequest,\n expressWebhookHandler,\n\n // Invoices\n getInvoice,\n getInvoices,\n getUserInvoices,\n getUpcomingInvoice,\n createInvoice,\n payInvoice,\n voidInvoice,\n sendInvoice,\n getInvoiceLines,\n};\n\n// Re-export sub-modules as named exports\nexport { vatModule as vat };\nexport { checkoutModule as checkout };\nexport { webhookModule as webhook };\nexport { invoicesModule as invoices };\n\n// Re-export commonly used functions\nexport { validateVat, createCheckoutSession, verifyWebhook, getInvoices, getUserInvoices };\n\n// Re-export WebhookEvents\nexport { WebhookEvents } from './webhook';\nexport { EU_COUNTRY_CODES } from './vat';\n\n/**\n * BillingClient class for OOP usage\n */\nexport class BillingClient {\n /**\n * Create a checkout session\n */\n async createCheckoutSession(options: import('./types').CheckoutOptions) {\n return createCheckoutSession(options);\n }\n\n /**\n * Validate VAT number\n */\n async validateVat(vatNumber: string) {\n return validateVat(vatNumber);\n }\n\n /**\n * Get invoices for a user\n */\n async getInvoices(userId: string) {\n return getUserInvoices(userId);\n }\n\n /**\n * Verify webhook signature\n */\n verifyWebhook(payload: string | Buffer, signature: string, secret?: string) {\n return verifyWebhook(payload, signature, secret);\n }\n\n /**\n * Create customer portal session\n */\n async createPortalSession(options: import('./types').PortalOptions) {\n return createPortalSession(options);\n }\n}\n","/**\n * PrivacyPolicy Component\n *\n * GDPR-compliant privacy policy component.\n *\n * @example\n * <PrivacyPolicy\n * companyName=\"Acme Inc\"\n * email=\"privacy@acme.com\"\n * updatedAt=\"2025-01-01\"\n * />\n */\n\nimport type { PrivacyPolicyProps } from '../types';\n\nconst DEFAULT_SECTIONS = {\n dataCollection: {\n title: '1. Information We Collect',\n content: `We collect information you provide directly to us, including:\n- Name, email address, and other contact information\n- Account credentials (encrypted)\n- Profile information and preferences\n- Usage data and analytics\n- Payment information (processed securely through third-party providers)`,\n },\n dataUsage: {\n title: '2. How We Use Your Information',\n content: `We use the information we collect to:\n- Provide, maintain, and improve our services\n- Process transactions and send related information\n- Send technical notices and support messages\n- Respond to comments and questions\n- Monitor and analyze trends, usage, and activities\n- Detect, prevent, and address technical issues and security threats`,\n },\n dataSharing: {\n title: '3. Information Sharing',\n content: `We do not sell your personal data. We may share your information with:\n- Service providers who perform services on our behalf\n- Payment processors (for transaction processing)\n- Analytics providers (to understand service usage)\n- Legal authorities when required by law\n- Third parties with your explicit consent`,\n },\n dataRetention: {\n title: '4. Data Retention',\n content: `We retain your personal data for as long as necessary to provide our services and fulfill the transactions you request. You may request deletion of your data at any time, subject to certain legal obligations.`,\n },\n userRights: {\n title: '5. Your Rights (GDPR)',\n content: `Under GDPR, you have the right to:\n- Access your personal data\n- Correct inaccurate data\n- Request deletion of your data (\"right to be forgotten\")\n- Object to processing of your data\n- Data portability\n- Restrict processing\n- Withdraw consent at any time`,\n },\n cookies: {\n title: '6. Cookies and Tracking',\n content: `We use cookies and similar technologies to:\n- Remember your preferences\n- Understand how you use our services\n- Provide analytics and improve performance\n- Deliver personalized content`,\n },\n security: {\n title: '7. Security',\n content: `We implement appropriate technical and organizational measures to protect your personal data against unauthorized access, alteration, disclosure, or destruction. However, no method of transmission over the internet is 100% secure.`,\n },\n contact: {\n title: '8. Contact Us',\n content: `For questions about this privacy policy or your personal data, please contact us.`,\n },\n};\n\nexport function PrivacyPolicy({\n companyName,\n email,\n updatedAt,\n websiteUrl,\n supportEmail,\n retentionDays = 365,\n dataCategories = ['personal information', 'usage data', 'payment information'],\n sections = {},\n className,\n}: PrivacyPolicyProps) {\n const formatDate = (date: string | Date): string => {\n if (typeof date === 'string') {\n return date;\n }\n const parts = date.toISOString().split('T');\n // ISO date string always has a T, so [0] will always exist\n return parts[0]!;\n };\n\n const allSections = { ...DEFAULT_SECTIONS, ...sections };\n\n const lastUpdated = updatedAt ? formatDate(updatedAt) : new Date().toISOString().split('T')[0]!;\n\n return (\n <div className={className} style={{ fontFamily: 'system-ui, -apple-system, sans-serif' }}>\n <div style={{ maxWidth: '800px', margin: '0 auto', padding: '2rem 1rem' }}>\n <h1 style={{ fontSize: '2rem', fontWeight: '700', marginBottom: '0.5rem' }}>\n Privacy Policy\n </h1>\n <p style={{ color: '#6b7280', marginBottom: '2rem' }}>\n Last Updated: {lastUpdated}\n </p>\n\n {/* Introduction */}\n <section style={{ marginBottom: '2rem' }}>\n <p style={{ lineHeight: '1.6' }}>\n At <strong>{companyName}</strong> (\"we\", \"our\", or \"us\"), we are committed to protecting\n your privacy and personal data. This privacy policy explains how we collect, use, share,\n and protect your information when you use our services.\n </p>\n </section>\n\n {/* Sections */}\n {(Object.entries(allSections) as Array<[string, { title: string; content: string }]>).map(([key, section]) => (\n <section key={key} style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {section.title}\n </h2>\n <div style={{ lineHeight: '1.7', whiteSpace: 'pre-line', color: '#374151' }}>\n {section.content}\n </div>\n </section>\n ))}\n\n {/* Custom Data Categories */}\n {dataCategories && dataCategories.length > 0 && (\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n Categories of Personal Data\n </h2>\n <ul style={{ paddingLeft: '1.5rem', color: '#374151', lineHeight: '1.7' }}>\n {dataCategories.map((category: string, index: number) => (\n <li key={index}>{category}</li>\n ))}\n </ul>\n </section>\n )}\n\n {/* Retention Period */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n Data Retention Period\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n We retain your personal data for a period of <strong>{retentionDays} days</strong> after\n account closure, unless longer retention is required by law.\n </p>\n </section>\n\n {/* Contact */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n Contact Information\n </h2>\n <div style={{ lineHeight: '1.7', color: '#374151' }}>\n <p>\n If you have any questions about this Privacy Policy, please contact us at:{' '}\n <a href={`mailto:${email}`} style={{ color: '#3b82f6' }}>\n {email}\n </a>\n </p>\n {supportEmail && supportEmail !== email && (\n <p style={{ marginTop: '0.5rem' }}>\n For support inquiries:{' '}\n <a href={`mailto:${supportEmail}`} style={{ color: '#3b82f6' }}>\n {supportEmail}\n </a>\n </p>\n )}\n {websiteUrl && (\n <p style={{ marginTop: '0.5rem' }}>\n Website: {' '}\n <a href={websiteUrl} style={{ color: '#3b82f6' }}>\n {websiteUrl}\n </a>\n </p>\n )}\n </div>\n </section>\n\n {/* Footer */}\n <footer style={{ marginTop: '3rem', paddingTop: '2rem', borderTop: '1px solid #e5e7eb' }}>\n <p style={{ fontSize: '0.875rem', color: '#6b7280', textAlign: 'center' }}>\n © {new Date().getFullYear()} {companyName}. All rights reserved.\n </p>\n </footer>\n </div>\n </div>\n );\n}\n","/**\n * TermsOfService Component\n *\n * Terms of service component.\n *\n * @example\n * <TermsOfService\n * companyName=\"Acme Inc\"\n * email=\"legal@acme.com\"\n * jurisdiction=\"Delaware, USA\"\n * />\n */\n\nimport type { TermsOfServiceProps } from '../types';\n\nexport function TermsOfService({\n companyName,\n email,\n updatedAt,\n websiteUrl,\n jurisdiction = 'The laws of the jurisdiction where the company is registered',\n governingLaw,\n limitationOfLiability = true,\n intellectualProperty = true,\n terminationClause = true,\n className,\n}: TermsOfServiceProps) {\n const formatDate = (date: string | Date): string => {\n if (typeof date === 'string') {\n return date;\n }\n const parts = date.toISOString().split('T');\n // ISO date string always has a T, so [0] will always exist\n return parts[0]!;\n };\n\n const lastUpdated = updatedAt ? formatDate(updatedAt) : new Date().toISOString().split('T')[0]!;\n\n return (\n <div className={className} style={{ fontFamily: 'system-ui, -apple-system, sans-serif' }}>\n <div style={{ maxWidth: '800px', margin: '0 auto', padding: '2rem 1rem' }}>\n <h1 style={{ fontSize: '2rem', fontWeight: '700', marginBottom: '0.5rem' }}>\n Terms of Service\n </h1>\n <p style={{ color: '#6b7280', marginBottom: '2rem' }}>\n Last Updated: {lastUpdated}\n </p>\n\n {/* Introduction */}\n <section style={{ marginBottom: '2rem' }}>\n <p style={{ lineHeight: '1.6' }}>\n Welcome to <strong>{companyName}</strong>. By using our services, you agree to these terms.\n Please read them carefully.\n </p>\n </section>\n\n {/* 1. Acceptance of Terms */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n 1. Acceptance of Terms\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n By accessing or using {companyName}'s services, you agree to be bound by these Terms of Service.\n If you do not agree to these terms, please do not use our services.\n </p>\n </section>\n\n {/* 2. Description of Service */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n 2. Description of Service\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n {companyName} provides software services and related features as described in our documentation.\n We reserve the right to modify, suspend, or discontinue any aspect of our services at any time.\n </p>\n </section>\n\n {/* 3. User Responsibilities */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n 3. User Responsibilities\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n As a user of our services, you agree to:\n </p>\n <ul style={{ paddingLeft: '1.5rem', color: '#374151', lineHeight: '1.7' }}>\n <li>Provide accurate and complete information</li>\n <li>Maintain the security of your account credentials</li>\n <li>Comply with all applicable laws and regulations</li>\n <li>Not use our services for any unlawful purpose</li>\n <li>Not interfere with or disrupt our services</li>\n <li>Not attempt to gain unauthorized access to our systems</li>\n </ul>\n </section>\n\n {/* 4. Intellectual Property */}\n {intellectualProperty && (\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n 4. Intellectual Property\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n All content, features, and functionality of our services are owned by {companyName} and\n are protected by copyright, trademark, and other intellectual property laws. You may not:\n </p>\n <ul style={{ paddingLeft: '1.5rem', color: '#374151', lineHeight: '1.7' }}>\n <li>Reproduce, distribute, or create derivative works</li>\n <li>Use our services for commercial purposes without authorization</li>\n <li>Remove any proprietary notices from our services</li>\n </ul>\n </section>\n )}\n\n {/* 5. User Content */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {intellectualProperty ? '5' : '4'}. User Content\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n You retain ownership of any content you submit to our services. By submitting content, you grant\n {companyName} a license to use, modify, and display your content for the purpose of providing\n our services. You represent that you have all necessary rights to grant such license.\n </p>\n </section>\n\n {/* 6. Termination */}\n {terminationClause && (\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {intellectualProperty ? '6' : '5'}. Termination\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n We may terminate or suspend your account and access to our services at any time, with or\n without cause, with or without notice. Upon termination, your right to use our services\n will immediately cease.\n </p>\n </section>\n )}\n\n {/* 7. Limitation of Liability */}\n {limitationOfLiability && (\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {terminationClause ? '7' : intellectualProperty ? '6' : '5'}. Limitation of Liability\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n To the fullest extent permitted by law, {companyName} shall not be liable for any\n indirect, incidental, special, consequential, or punitive damages, including without\n limitation, loss of profits, data, use, goodwill, or other intangible losses.\n </p>\n </section>\n )}\n\n {/* 8. Governing Law */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {limitationOfLiability\n ? '8'\n : terminationClause\n ? '7'\n : intellectualProperty\n ? '6'\n : '5'}\n . Governing Law\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n These terms shall be governed by and construed in accordance with {governingLaw || jurisdiction}.\n </p>\n </section>\n\n {/* 9. Changes to Terms */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {limitationOfLiability\n ? '9'\n : terminationClause\n ? '8'\n : intellectualProperty\n ? '7'\n : '6'}\n . Changes to Terms\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n We reserve the right to modify these terms at any time. We will notify users of any material\n changes via email or through our services. Your continued use of our services after such\n modifications constitutes your acceptance of the updated terms.\n </p>\n </section>\n\n {/* 10. Contact Information */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {limitationOfLiability\n ? '10'\n : terminationClause\n ? '9'\n : intellectualProperty\n ? '8'\n : '7'}\n . Contact Us\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n If you have any questions about these Terms of Service, please contact us at:{' '}\n <a href={`mailto:${email}`} style={{ color: '#3b82f6' }}>\n {email}\n </a>\n </p>\n {websiteUrl && (\n <p style={{ marginTop: '0.5rem', lineHeight: '1.7', color: '#374151' }}>\n Website: {' '}\n <a href={websiteUrl} style={{ color: '#3b82f6' }}>\n {websiteUrl}\n </a>\n </p>\n )}\n </section>\n\n {/* Footer */}\n <footer style={{ marginTop: '3rem', paddingTop: '2rem', borderTop: '1px solid #e5e7eb' }}>\n <p style={{ fontSize: '0.875rem', color: '#6b7280', textAlign: 'center' }}>\n © {new Date().getFullYear()} {companyName}. All rights reserved.\n </p>\n </footer>\n </div>\n </div>\n );\n}\n","/**\n * CookieConsent Component\n *\n * GDPR-compliant cookie consent banner with category management.\n *\n * @example\n * <CookieConsent\n * onAccept={() => console.log('Accepted')}\n * onReject={() => console.log('Rejected')}\n * position=\"bottom\"\n * style=\"banner\"\n * />\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { CookieConsentProps, CookieCategory } from '../types';\n\nconst STORAGE_KEY = 'vocoweb-cookie-consent';\nconst CONSENT_EXPIRY_DAYS = 365;\n\nconst DEFAULT_CATEGORIES: CookieCategory[] = [\n {\n id: 'necessary',\n name: 'Strictly Necessary',\n description: 'These cookies are essential for the site to function properly.',\n required: true,\n },\n {\n id: 'analytics',\n name: 'Analytics',\n description: 'Help us improve our website by collecting anonymous usage data.',\n required: false,\n scripts: ['https://www.googletagmanager.com/gtag/js'],\n },\n {\n id: 'marketing',\n name: 'Marketing',\n description: 'Used to deliver advertisements that are relevant to you and your interests.',\n required: false,\n },\n {\n id: 'preferences',\n name: 'Preferences',\n description: 'Allows the site to remember your choices and preferences.',\n required: false,\n },\n];\n\nexport function CookieConsent({\n onAccept,\n onReject,\n onCustomize,\n position = 'bottom',\n style = 'banner',\n categories = DEFAULT_CATEGORIES,\n privacyPolicyUrl,\n acceptAllText = 'Accept All',\n rejectAllText = 'Reject All',\n customizeText = 'Customize',\n className,\n}: CookieConsentProps) {\n const [isVisible, setIsVisible] = useState(false);\n const [showCustomize, setShowCustomize] = useState(false);\n const [selectedCategories, setSelectedCategories] = useState<Record<string, boolean>>({});\n\n // Check if user has already made a choice\n useEffect(() => {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const { timestamp, consent } = JSON.parse(stored);\n const daysSince = (Date.now() - timestamp) / (1000 * 60 * 60 * 24);\n\n // Re-show consent after expiry period\n if (daysSince > CONSENT_EXPIRY_DAYS) {\n setIsVisible(true);\n } else if (consent === 'pending') {\n // User was customizing but didn't finish\n setIsVisible(true);\n }\n } else {\n setIsVisible(true);\n }\n } catch {\n setIsVisible(true);\n }\n }, []);\n\n // Initialize selected categories with required ones\n useEffect(() => {\n const required: Record<string, boolean> = {};\n categories.forEach((cat: CookieCategory) => {\n if (cat.required) {\n required[cat.id] = true;\n }\n });\n setSelectedCategories(required);\n }, [categories]);\n\n // Save consent to localStorage\n const saveConsent = useCallback((consent: 'accept' | 'reject' | 'partial', categories?: Record<string, boolean>) => {\n const data = {\n timestamp: Date.now(),\n consent,\n categories,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n }, []);\n\n // Handle accept all\n const handleAccept = useCallback(() => {\n const allAccepted: Record<string, boolean> = {};\n categories.forEach((cat: CookieCategory) => {\n allAccepted[cat.id] = true;\n });\n\n setSelectedCategories(allAccepted);\n saveConsent('accept', allAccepted);\n setIsVisible(false);\n\n onAccept?.();\n }, [categories, onAccept, saveConsent]);\n\n // Handle reject all (except required)\n const handleReject = useCallback(() => {\n const requiredOnly: Record<string, boolean> = {};\n categories.forEach((cat: CookieCategory) => {\n if (cat.required) {\n requiredOnly[cat.id] = true;\n }\n });\n\n setSelectedCategories(requiredOnly);\n saveConsent('reject', requiredOnly);\n setIsVisible(false);\n\n onReject?.();\n }, [categories, onReject, saveConsent]);\n\n // Handle customize - show modal\n const handleCustomize = useCallback(() => {\n setShowCustomize(true);\n }, []);\n\n // Save custom selection\n const handleSaveCustom = useCallback(() => {\n saveConsent('partial', selectedCategories);\n setIsVisible(false);\n setShowCustomize(false);\n\n onCustomize?.(selectedCategories);\n }, [selectedCategories, saveConsent, onCustomize]);\n\n // Toggle category selection\n const toggleCategory = useCallback((categoryId: string) => {\n const category = categories.find(c => c.id === categoryId);\n if (category?.required) {\n return; // Can't toggle required categories\n }\n\n setSelectedCategories(prev => ({\n ...prev,\n [categoryId]: !prev[categoryId],\n }));\n }, [categories]);\n\n // Close modal without saving\n const handleCloseModal = useCallback(() => {\n setShowCustomize(false);\n }, []);\n\n // Block scripts for non-accepted categories\n useEffect(() => {\n if (Object.keys(selectedCategories).length === 0) {\n return; // Not yet selected\n }\n\n categories.forEach((category: CookieCategory) => {\n if (category.scripts && category.scripts.length > 0) {\n const shouldBlock = !selectedCategories[category.id];\n\n category.scripts.forEach((scriptSrc: string) => {\n // Find and block/re-enable scripts\n const scripts = document.querySelectorAll(`script[src=\"${scriptSrc}\"]`);\n scripts.forEach((script: Element) => {\n if (shouldBlock) {\n script.remove();\n }\n });\n });\n }\n });\n }, [selectedCategories, categories]);\n\n if (!isVisible) {\n return null;\n }\n\n // Banner style\n if (style === 'banner' && !showCustomize) {\n const isBottom = position === 'bottom';\n\n return (\n <div\n className={className}\n role=\"dialog\"\n aria-labelledby=\"cookie-consent-title\"\n aria-describedby=\"cookie-consent-description\"\n style={{\n position: 'fixed',\n left: 0,\n right: 0,\n [isBottom ? 'bottom' : 'top']: 0,\n backgroundColor: 'rgba(17, 24, 39, 0.95)',\n backdropFilter: 'blur(8px)',\n padding: '1rem',\n zIndex: 9999,\n boxShadow: isBottom ? '0 -4px 6px -1px rgb(0 0 0 / 0.1)' : '0 4px 6px -1px rgb(0 0 0 / 0.1)',\n }}\n >\n <div\n style={{\n maxWidth: '1200px',\n margin: '0 auto',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '1rem',\n flexWrap: 'wrap',\n }}\n >\n <div style={{ flex: 1, minWidth: '200px' }}>\n <h2 id=\"cookie-consent-title\" style={{ fontSize: '1rem', fontWeight: '600', color: 'white', marginBottom: '0.25rem' }}>\n We use cookies\n </h2>\n <p id=\"cookie-consent-description\" style={{ fontSize: '0.875rem', color: '#d1d5db', margin: 0 }}>\n We use cookies to improve your experience and analyze usage. By continuing, you agree to our{' '}\n {privacyPolicyUrl && (\n <a\n href={privacyPolicyUrl}\n style={{ color: '#60a5fa', textDecoration: 'underline' }}\n >\n Privacy Policy\n </a>\n )}\n </p>\n </div>\n\n <div style={{ display: 'flex', gap: '0.5rem', flexWrap: 'wrap' }}>\n <button\n onClick={handleReject}\n style={{\n padding: '0.5rem 1rem',\n backgroundColor: 'transparent',\n border: '1px solid #4b5563',\n borderRadius: '0.375rem',\n color: '#d1d5db',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#374151';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {rejectAllText}\n </button>\n\n <button\n onClick={handleCustomize}\n style={{\n padding: '0.5rem 1rem',\n backgroundColor: 'transparent',\n border: '1px solid #4b5563',\n borderRadius: '0.375rem',\n color: '#d1d5db',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#374151';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {customizeText}\n </button>\n\n <button\n onClick={handleAccept}\n style={{\n padding: '0.5rem 1rem',\n backgroundColor: '#3b82f6',\n border: 'none',\n borderRadius: '0.375rem',\n color: 'white',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#2563eb';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#3b82f6';\n }}\n >\n {acceptAllText}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Modal/Bar style for customization\n return (\n <>\n {/* Backdrop */}\n {showCustomize && (\n <div\n onClick={handleCloseModal}\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n zIndex: 9998,\n }}\n />\n )}\n\n {/* Modal */}\n <div\n className={className}\n role=\"dialog\"\n aria-labelledby=\"cookie-consent-title\"\n aria-modal=\"true\"\n style={{\n position: 'fixed',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n backgroundColor: 'white',\n borderRadius: '0.75rem',\n padding: '1.5rem',\n zIndex: 9999,\n maxWidth: '500px',\n width: '90%',\n maxHeight: '80vh',\n overflowY: 'auto',\n boxShadow: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n }}\n >\n <h2\n id=\"cookie-consent-title\"\n style={{ fontSize: '1.25rem', fontWeight: '700', color: '#111827', marginBottom: '0.5rem' }}\n >\n Customize Cookie Preferences\n </h2>\n <p style={{ fontSize: '0.875rem', color: '#6b7280', marginBottom: '1.5rem' }}>\n We use different types of cookies to provide you with the best experience. You can choose which\n cookies to accept.\n </p>\n\n {/* Cookie categories */}\n <div style={{ marginBottom: '1.5rem' }}>\n {categories.map(category => (\n <div\n key={category.id}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n padding: '0.75rem 0',\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <div style={{ flex: 1 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <h3 style={{ fontSize: '0.875rem', fontWeight: '600', color: '#111827', margin: 0 }}>\n {category.name}\n </h3>\n {category.required && (\n <span\n style={{\n fontSize: '0.75rem',\n backgroundColor: '#dbeafe',\n color: '#1e40af',\n padding: '0.125rem 0.375rem',\n borderRadius: '0.25rem',\n fontWeight: '500',\n }}\n >\n Required\n </span>\n )}\n </div>\n <p style={{ fontSize: '0.875rem', color: '#6b7280', margin: '0.25rem 0 0', marginTop: '0.25rem' }}>\n {category.description}\n </p>\n </div>\n\n {!category.required && (\n <button\n onClick={() => toggleCategory(category.id)}\n style={{\n position: 'relative',\n width: '44px',\n height: '24px',\n backgroundColor: selectedCategories[category.id] ? '#3b82f6' : '#d1d5db',\n borderRadius: '12px',\n border: 'none',\n cursor: 'pointer',\n transition: 'background-color 0.15s ease',\n }}\n aria-pressed={selectedCategories[category.id]}\n >\n <span\n style={{\n position: 'absolute',\n top: '2px',\n left: selectedCategories[category.id] ? '22px' : '2px',\n width: '20px',\n height: '20px',\n backgroundColor: 'white',\n borderRadius: '50%',\n transition: 'left 0.15s ease',\n }}\n />\n </button>\n )}\n </div>\n ))}\n </div>\n\n {/* Privacy policy link */}\n {privacyPolicyUrl && (\n <p style={{ fontSize: '0.875rem', color: '#6b7280', marginBottom: '1rem' }}>\n Read more in our{' '}\n <a href={privacyPolicyUrl} style={{ color: '#3b82f6', textDecoration: 'underline' }}>\n Privacy Policy\n </a>\n </p>\n )}\n\n {/* Actions */}\n <div style={{ display: 'flex', gap: '0.75rem', justifyContent: 'flex-end' }}>\n <button\n onClick={handleCloseModal}\n style={{\n padding: '0.5rem 1rem',\n backgroundColor: 'white',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n color: '#374151',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#f9fafb';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'white';\n }}\n >\n Cancel\n </button>\n\n <button\n onClick={handleSaveCustom}\n style={{\n padding: '0.5rem 1rem',\n backgroundColor: '#3b82f6',\n border: 'none',\n borderRadius: '0.375rem',\n color: 'white',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#2563eb';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#3b82f6';\n }}\n >\n Save Preferences\n </button>\n </div>\n </div>\n </>\n );\n}\n","/**\n * GDPR Data Export functionality\n * Allows users to request all their data as required by GDPR\n */\n\nimport { getServiceRoleClient } from '../auth/config';\nimport type { UserDataExport } from './types';\nimport { VocoComplianceError } from '../shared/errors';\n\n/**\n * Export all user data for GDPR compliance\n *\n * This function fetches all data associated with a user from:\n * - User profile\n * - Projects\n * - Websites\n * - Usage logs\n * - Subscriptions\n * - Invoices\n * - Audit logs\n *\n * @example\n * const exportData = await exportUserData('user-123');\n * // Returns all user data in structured format\n */\nexport async function exportUserData(userId: string): Promise<UserDataExport> {\n const supabase = getServiceRoleClient();\n\n try {\n const exportedData: UserDataExport = {\n userId,\n exportedAt: new Date(),\n data: {},\n format: 'json',\n encrypted: false,\n };\n\n // 1. User profile data\n const { data: userData, error: userError } = await supabase\n .from('users')\n .select('*')\n .eq('id', userId)\n .single();\n\n if (!userError && userData) {\n exportedData.data.profile = userData;\n }\n\n // 2. Projects\n const { data: projectsData, error: projectsError } = await supabase\n .from('projects')\n .select('*')\n .eq('user_id', userId);\n\n if (!projectsError && projectsData) {\n exportedData.data.projects = projectsData;\n }\n\n // 3. Websites\n const { data: websitesData, error: websitesError } = await supabase\n .from('websites')\n .select('*')\n .eq('user_id', userId);\n\n if (!websitesError && websitesData) {\n exportedData.data.websites = websitesData;\n }\n\n // 4. Usage logs\n const { data: logsData, error: logsError } = await supabase\n .from('usage_logs')\n .select('*')\n .eq('user_id', userId)\n .limit(1000)\n .order('created_at', { ascending: false });\n\n if (!logsError && logsData) {\n exportedData.data.usageLogs = logsData;\n }\n\n // 5. Subscriptions\n const { data: subscriptionsData, error: subscriptionsError } = await supabase\n .from('subscriptions')\n .select('*')\n .eq('user_id', userId);\n\n if (!subscriptionsError && subscriptionsData) {\n exportedData.data.subscriptions = subscriptionsData;\n }\n\n // 6. Invoices (if applicable)\n const { data: invoicesData, error: invoicesError } = await supabase\n .from('invoices')\n .select('*')\n .eq('user_id', userId)\n .order('created_at', { ascending: false });\n\n if (!invoicesError && invoicesData) {\n exportedData.data.invoices = invoicesData;\n }\n\n // 7. Audit logs (if applicable)\n const { data: auditData, error: auditError } = await supabase\n .from('audit_logs')\n .select('*')\n .eq('user_id', userId)\n .limit(500)\n .order('timestamp', { ascending: false });\n\n if (!auditError && auditData) {\n exportedData.data.auditLogs = auditData;\n }\n\n return exportedData;\n } catch (error) {\n throw VocoComplianceError.dataExportFailed(\n userId,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n}\n\n/**\n * Export user data as downloadable JSON string\n *\n * @example\n * const json = await exportUserDataAsJson('user-123');\n * // Send to user via email or download\n */\nexport async function exportUserDataAsJson(userId: string): Promise<string> {\n const data = await exportUserData(userId);\n return JSON.stringify(data, null, 2);\n}\n\n/**\n * Create a data export file name\n *\n * @example\n * const filename = createExportFilename('user-123');\n * // Returns: \"user-data-export-user-123-20250208.json\"\n */\nexport function createExportFilename(userId: string): string {\n const date = new Date();\n const iso = date.toISOString().split('T');\n const dateStr = (iso[0] || '').replace(/-/g, '');\n return `user-data-export-${userId}-${dateStr}.json`;\n}\n\n/**\n * Check if user has pending export requests\n *\n * @example\n * const hasPending = await hasPendingExports('user-123');\n */\nexport async function hasPendingExports(userId: string): Promise<boolean> {\n const supabase = getServiceRoleClient();\n\n const { data, error } = await supabase\n .from('data_exports')\n .select('id, status')\n .eq('user_id', userId)\n .in('status', ['pending', 'processing'])\n .limit(1);\n\n if (error || !data) {\n return false;\n }\n\n return data.length > 0;\n}\n\n/**\n * Request a data export (creates a pending export record)\n *\n * @example\n * const exportId = await requestDataExport('user-123');\n */\nexport async function requestDataExport(userId: string): Promise<string> {\n const supabase = getServiceRoleClient();\n\n const { data, error } = await supabase\n .from('data_exports')\n .insert({\n user_id: userId,\n status: 'pending',\n requested_at: new Date().toISOString(),\n })\n .select('id')\n .single();\n\n if (error || !data) {\n throw VocoComplianceError.dataExportFailed(\n userId,\n error?.message || 'Failed to create export request'\n );\n }\n\n return data.id;\n}\n\n/**\n * Process pending data exports\n * This should be called by a background job or cron\n *\n * @example\n * await processPendingExports();\n */\nexport async function processPendingExports(limit: number = 10): Promise<number> {\n const supabase = getServiceRoleClient();\n\n // Get pending exports\n const { data: pendingExports, error } = await supabase\n .from('data_exports')\n .select('id, user_id')\n .eq('status', 'pending')\n .limit(limit);\n\n if (error || !pendingExports) {\n return 0;\n }\n\n let processed = 0;\n\n for (const exportRecord of pendingExports) {\n try {\n // Update to processing\n await supabase\n .from('data_exports')\n .update({ status: 'processing' })\n .eq('id', exportRecord.id);\n\n // Generate export\n const jsonData = await exportUserDataAsJson(exportRecord.user_id);\n\n // Store result (in a real implementation, this would be stored as a file)\n await supabase\n .from('data_exports')\n .update({\n status: 'completed',\n completed_at: new Date().toISOString(),\n data: jsonData,\n })\n .eq('id', exportRecord.id);\n\n processed++;\n } catch (err) {\n // Mark as failed\n await supabase\n .from('data_exports')\n .update({\n status: 'failed',\n error: err instanceof Error ? err.message : 'Unknown error',\n })\n .eq('id', exportRecord.id);\n }\n }\n\n return processed;\n}\n\n/**\n * Get completed export for a user\n *\n * @example\n * const export = await getUserExport('user-123');\n */\nexport async function getUserExport(userId: string): Promise<UserDataExport | null> {\n const supabase = getServiceRoleClient();\n\n const { data, error } = await supabase\n .from('data_exports')\n .select('*')\n .eq('user_id', userId)\n .eq('status', 'completed')\n .order('completed_at', { ascending: false })\n .limit(1)\n .single();\n\n if (error || !data) {\n return null;\n }\n\n return data.data as UserDataExport;\n}\n\n/**\n * Data export API\n */\nexport const dataExport = {\n export: exportUserData,\n exportAsJson: exportUserDataAsJson,\n createFilename: createExportFilename,\n hasPending: hasPendingExports,\n request: requestDataExport,\n processPending: processPendingExports,\n getUser: getUserExport,\n};\n","/**\n * Module C: Shield (Legal Compliance)\n * GDPR-compliant legal components and data export\n */\n\n// Types\nexport * from './types';\n\n// Components\nexport * from './components';\n\n// Data export\nexport * from './export';\n\n// Import functions directly\nimport {\n exportUserData,\n exportUserDataAsJson,\n createExportFilename,\n hasPendingExports,\n requestDataExport,\n processPendingExports,\n getUserExport,\n} from './export';\n\n/**\n * Main legal compliance API\n *\n * @example\n * import { legal } from '@vocoweb/kernel';\n *\n * // Export user data for GDPR\n * const exportData = await legal.exportUserData('user-123');\n *\n * // Check for pending exports\n * const hasPending = await legal.hasPendingExports('user-123');\n */\nexport const legal = {\n // Data export\n exportUserData,\n exportUserDataAsJson,\n createExportFilename,\n hasPendingExports,\n requestDataExport,\n processPendingExports,\n getUserExport,\n};\n\n// Re-export data export module\nexport { dataExport } from './export';\n\n// Named re-exports for commonly used functions\nexport {\n exportUserData,\n exportUserDataAsJson,\n hasPendingExports,\n requestDataExport,\n getUserExport,\n};\n","/**\n * Module 1: Erasure Engine (GDPR Article 17)\n * Cascading deletion with external API cleanup\n */\n\n// Types\nexport * from './types';\n\n// Erasure engine\nexport * from './obliterate';\n\n// GDPR export\nexport * from './export';\n\n// Import functions\nimport { obliterateUserData } from './obliterate';\nimport { exportUserData as exportUser } from './export';\n\n/**\n * Main privacy/GDPR API\n *\n * @example\n * import { privacy } from '@vocoweb/kernel';\n *\n * // GDPR deletion (right to be forgotten)\n * const result = await privacy.obliterate('user-123');\n *\n * // GDPR data export\n * const exportData = await privacy.exportUserData('user-123');\n */\nexport const privacy = {\n // GDPR deletion\n obliterate: obliterateUserData,\n\n // GDPR export\n exportUserData: exportUser,\n\n // Check deletion status\n checkDeletionStatus: async (userId: string) => {\n const { checkDeletionStatus } = await import('./obliterate');\n return checkDeletionStatus(userId);\n },\n};\n\n// Re-export modules\nexport { obliterate } from './obliterate';\nexport { dataExport } from './export';\n\n// Named re-exports\nexport { obliterateUserData } from './obliterate';\nexport { exportUserData as exportUser } from './export';\n","/**\n * Accessibility validators for WCAG 2.1 AA compliance\n */\n\nimport type { ContrastResult, AriaValidationResult, KeyboardNavigationResult, AccessibilityViolation, ComplianceLevel } from './types';\nimport { VocoAccessibilityError } from '../shared/errors';\n\n/**\n * Convert hex color to RGB\n */\nfunction hexToRgb(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 ? {\n r: parseInt(result[1]!, 16),\n g: parseInt(result[2]!, 16),\n b: parseInt(result[3]!, 16),\n }\n : null;\n}\n\n/**\n * Calculate relative luminance of a color\n * Based on WCAG 2.1 specification\n */\nfunction calculateLuminance(r: number, g: number, b: number): number {\n const values = [r, g, b].map((value) => {\n const sRGB = value / 255;\n return sRGB <= 0.03928 ? sRGB / 12.92 : Math.pow((sRGB + 0.055) / 1.055, 2.4);\n });\n\n const rs = values[0]!;\n const gs = values[1]!;\n const bs = values[2]!;\n\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\n}\n\n/**\n * Calculate contrast ratio between two colors\n */\nfunction calculateContrastRatio(luminance1: number, luminance2: number): number {\n const lighter = Math.max(luminance1, luminance2);\n const darker = Math.min(luminance1, luminance2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Check color contrast ratio against WCAG standards\n *\n * @param foreground - Foreground color (hex)\n * @param background - Background color (hex)\n * @returns Contrast result with WCAG AA/AAA compliance\n *\n * @example\n * const result = checkColorContrast('#ffffff', '#000000');\n * // Returns: { ratio: 21, aa: true, aaa: true, ... }\n */\nexport function checkColorContrast(foreground: string, background: string): ContrastResult {\n const fg = hexToRgb(foreground);\n const bg = hexToRgb(background);\n\n if (!fg || !bg) {\n throw new Error('Invalid color format. Use hex format like #ffffff');\n }\n\n const fgLuminance = calculateLuminance(fg.r, fg.g, fg.b);\n const bgLuminance = calculateLuminance(bg.r, bg.g, bg.b);\n\n const ratio = calculateContrastRatio(fgLuminance, bgLuminance);\n\n // WCAG AA: 4.5:1 for normal text, 3:1 for large text\n // WCAG AAA: 7:1 for normal text, 4.5:1 for large text\n const passesNormalText = ratio >= 4.5;\n const passesLargeText = ratio >= 3.0;\n const aa = passesNormalText;\n const aaa = ratio >= 7.0;\n\n return {\n ratio: Math.round(ratio * 100) / 100,\n aa,\n aaa,\n passesLargeText,\n passesNormalText,\n foreground,\n background,\n };\n}\n\n/**\n * Validate ARIA attributes on an element\n *\n * @param ariaLabel - ARIA label value\n * @param ariaLabelledby - ARIA labelledby value\n * @param elementType - Type of element (button, input, etc.)\n * @returns Validation result with any issues found\n *\n * @example\n * const result = validateAriaLabel(undefined, undefined, 'button');\n * // Returns: { valid: false, issues: [{ severity: 'error', message: '...' }] }\n */\nexport function validateAriaLabel(\n ariaLabel?: string,\n ariaLabelledby?: string,\n elementType: string = 'button'\n): AriaValidationResult {\n const issues: Array<{ severity: 'error' | 'warning'; message: string; attribute?: string }> = [];\n\n // Elements that require accessible names\n const elementsRequiringLabel = ['button', 'a', 'input', 'textarea', 'select'];\n\n if (elementsRequiringLabel.includes(elementType)) {\n if (!ariaLabel && !ariaLabelledby) {\n issues.push({\n severity: 'error',\n message: `${elementType} must have an accessible name via aria-label or aria-labelledby`,\n attribute: 'aria-label',\n });\n }\n }\n\n // Check for empty aria-label\n if (ariaLabel === '') {\n issues.push({\n severity: 'error',\n message: 'aria-label cannot be empty',\n attribute: 'aria-label',\n });\n }\n\n // Check for aria-label with aria-labelledby (should use one or the other)\n if (ariaLabel && ariaLabelledby) {\n issues.push({\n severity: 'warning',\n message: 'Use either aria-label or aria-labelledby, not both',\n attribute: 'aria-label',\n });\n }\n\n return {\n valid: issues.filter((i) => i.severity === 'error').length === 0,\n element: elementType,\n issues,\n };\n}\n\n/**\n * Test keyboard navigation for a component\n *\n * @param element - DOM element to test\n * @returns Keyboard navigation result\n *\n * @example\n * const button = document.querySelector('button');\n * const result = testKeyboardNavigation(button);\n */\nexport function testKeyboardNavigation(element: unknown): KeyboardNavigationResult {\n const issues: string[] = [];\n let navigable = false;\n let focusable = false;\n\n if (typeof window === 'undefined' || !element) {\n return {\n navigable: false,\n focusable: false,\n tabOrder: [],\n issues: ['Element not available for testing'],\n };\n }\n\n try {\n const el = element as HTMLElement;\n const tabIndex = parseInt(el.getAttribute('tabindex') || '0', 10);\n const focusableElements = ['button', 'a', 'input', 'textarea', 'select'];\n\n // Check if element is focusable\n const disabled = (el as Partial<HTMLInputElement>).disabled === true;\n focusable =\n !disabled &&\n (tabIndex >= 0 ||\n focusableElements.includes(el.tagName.toLowerCase()) ||\n el.contentEditable === 'true');\n\n // Check if element is in tab order\n navigable = tabIndex >= 0;\n\n // Get tab order for all focusable elements\n const allFocusable = Array.from(\n document.querySelectorAll<HTMLElement>(\n 'button, a[href], input, textarea, select, [tabindex]:not([tabindex=\"-1\"])'\n )\n );\n\n const tabOrder = allFocusable\n .filter((el) => {\n const t = parseInt(el.getAttribute('tabindex') || '0', 10);\n return t >= 0;\n })\n .map((el) => parseInt(el.getAttribute('tabindex') || '0', 10))\n .sort((a, b) => a - b);\n\n // Check for keyboard traps\n if (el.getAttribute('aria-hidden') === 'true' && focusable) {\n issues.push('Element is aria-hidden but still focusable - keyboard trap');\n }\n\n // Check for missing keyboard handlers\n if (el.tagName === 'BUTTON' && el.getAttribute('role') === 'button' && !el.onclick) {\n issues.push('Interactive element has no click handler');\n }\n\n return {\n navigable,\n focusable,\n tabOrder,\n issues,\n };\n } catch (error) {\n return {\n navigable: false,\n focusable: false,\n tabOrder: [],\n issues: [error instanceof Error ? error.message : 'Unknown error'],\n };\n }\n}\n\n/**\n * Run comprehensive accessibility audit on a color scheme\n *\n * @param colors - Object with foreground and background colors\n * @param level - WCAG compliance level to test against\n * @returns Array of accessibility violations\n *\n * @example\n * const violations = auditColorScheme({\n * primary: '#ffffff',\n * background: '#000000'\n * }, 'AA');\n */\nexport function auditColorScheme(\n colors: Record<string, { foreground?: string; background?: string }>,\n level: ComplianceLevel = 'AA'\n): AccessibilityViolation[] {\n const violations: AccessibilityViolation[] = [];\n\n for (const [name, colorSet] of Object.entries(colors)) {\n if (colorSet.foreground && colorSet.background) {\n const result = checkColorContrast(colorSet.foreground, colorSet.background);\n\n const requiredRatio = level === 'AAA' ? 7.0 : 4.5;\n if (result.ratio < requiredRatio) {\n violations.push({\n rule: 'WCAG 2.1 Contrast',\n description: `Color contrast ratio ${result.ratio}:1 is below ${level} requirement of ${requiredRatio}:1`,\n impact: result.ratio < 3.0 ? 'critical' : 'serious',\n element: name,\n help: `Increase contrast to at least ${requiredRatio}:1`,\n helpUrl: 'https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html',\n wcagLevel: level,\n wcagCriteria: '1.4.3',\n });\n }\n }\n }\n\n return violations;\n}\n\n/**\n * Validate that all interactive elements have accessible names\n *\n * @param elements - Array of element descriptors\n * @returns Array of accessibility violations\n */\nexport function validateInteractiveElements(\n elements: Array<{ type: string; hasLabel?: boolean; hasAriaLabel?: string; id?: string }>\n): AccessibilityViolation[] {\n const violations: AccessibilityViolation[] = [];\n\n for (const element of elements) {\n if (!element.hasLabel && !element.hasAriaLabel) {\n violations.push({\n rule: 'WCAG 2.1 Accessible Name',\n description: `Interactive element of type ${element.type} lacks an accessible name`,\n impact: 'serious',\n element: element.id || element.type,\n help: 'Add aria-label or ensure element has visible text content',\n helpUrl: 'https://www.w3.org/WAI/WCAG21/Understanding/name-role-value.html',\n wcagLevel: 'A',\n wcagCriteria: '2.4.6',\n });\n }\n }\n\n return violations;\n}\n\n/**\n * Check if a focus indicator meets WCAG requirements\n *\n * @param element - CSS selector or element to check\n * @returns Whether the focus indicator is sufficient\n */\nexport function validateFocusIndicator(element: unknown): boolean {\n // This would typically use a library like axe-core\n // For now, return a basic check\n try {\n if (typeof window === 'undefined') return true;\n\n const el = element as HTMLElement;\n if (!el) return true;\n\n // Check if element has outline or other focus indicator\n const style = window.getComputedStyle(el);\n const hasOutline = style.outline !== 'none' && style.outlineWidth !== '0px';\n\n // Many elements use custom focus indicators via :focus-visible or other means\n // This is a basic check\n return hasOutline;\n } catch {\n return true;\n }\n}\n\n/**\n * Get suggested color pairings for improved contrast\n *\n * @param color - Color to find pairings for\n * @param targetRatio - Target contrast ratio (default 4.5 for AA)\n * @returns Array of suggested colors with their contrast ratios\n */\nexport function getSuggestedColorPairings(\n color: string,\n targetRatio: number = 4.5\n): Array<{ color: string; ratio: number }> {\n const rgb = hexToRgb(color);\n if (!rgb) return [];\n\n const luminance = calculateLuminance(rgb.r, rgb.g, rgb.b);\n\n // Common WCAG-compliant colors\n const commonColors = [\n { name: 'white', hex: '#ffffff' },\n { name: 'black', hex: '#000000' },\n { name: 'gray-100', hex: '#f3f4f6' },\n { name: 'gray-900', hex: '#111827' },\n { name: 'blue-500', hex: '#3b82f6' },\n { name: 'blue-600', hex: '#2563eb' },\n { name: 'red-500', hex: '#ef4444' },\n { name: 'green-500', hex: '#22c55e' },\n ];\n\n return commonColors\n .map((c) => {\n const cRgb = hexToRgb(c.hex)!;\n const cLuminance = calculateLuminance(cRgb.r, cRgb.g, cRgb.b);\n const ratio = calculateContrastRatio(luminance, cLuminance);\n return { color: c.hex, ratio: Math.round(ratio * 100) / 100 };\n })\n .filter((c) => c.ratio >= targetRatio)\n .sort((a, b) => b.ratio - a.ratio);\n}\n\n/**\n * Accessibility validators API\n */\nexport const validators = {\n checkColorContrast,\n validateAriaLabel,\n testKeyboardNavigation,\n auditColorScheme,\n validateInteractiveElements,\n validateFocusIndicator,\n getSuggestedColorPairings,\n};\n\n/**\n * Create a contrast error with suggestions\n */\nexport function throwContrastError(fg: string, bg: string, ratio: number): never {\n throw VocoAccessibilityError.contrastRatioFailed(fg, bg, ratio);\n}\n","/**\n * VocoButton Component\n *\n * WCAG 2.1 AA compliant button component.\n * Ensures keyboard navigation, ARIA labels, and focus indicators.\n *\n * @example\n * <VocoButton aria-label=\"Save changes\" onClick={handleSave}>\n * Save\n * </VocoButton>\n */\n\nimport { forwardRef } from 'react';\nimport { validateAriaLabel } from '../validators';\nimport type { ButtonProps } from '../types';\n\nconst variantStyles: Record<NonNullable<ButtonProps['variant']>, string> = {\n default: 'bg-blue-600 text-white hover:bg-blue-700',\n destructive: 'bg-red-600 text-white hover:bg-red-700',\n outline: 'border-2 border-gray-300 text-gray-700 hover:bg-gray-50',\n secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300',\n ghost: 'text-gray-700 hover:bg-gray-100',\n link: 'text-blue-600 underline hover:text-blue-700',\n};\n\nconst sizeStyles: Record<NonNullable<ButtonProps['size']>, string> = {\n default: 'px-4 py-2 text-sm',\n sm: 'px-3 py-1 text-xs',\n lg: 'px-6 py-3 text-base',\n icon: 'p-2',\n};\n\nexport const VocoButton = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n variant = 'default',\n size = 'default',\n disabled = false,\n type = 'button',\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n role,\n className = '',\n ...props\n },\n ref\n ) => {\n // Validate ARIA attributes in development\n if (process.env.NODE_ENV === 'development') {\n const validation = validateAriaLabel(ariaLabel, ariaLabelledby, 'button');\n if (!validation.valid && !children) {\n console.warn('VocoButton accessibility warning:', validation.issues);\n }\n }\n\n const baseStyles = 'inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed';\n\n // If button has children, we don't require aria-label\n const hasAccessibleName = children || ariaLabel || ariaLabelledby;\n\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n role={role}\n className={`${baseStyles} ${variantStyles[variant]} ${sizeStyles[size]} ${className}`.trim()}\n {...(hasAccessibleName ? {} : { 'aria-label': 'Button' })}\n {...props}\n >\n {children}\n </button>\n );\n }\n);\n\nVocoButton.displayName = 'VocoButton';\n","/**\n * VocoInput Component\n *\n * WCAG 2.1 AA compliant input component.\n * Ensures label association, error message linkage, and keyboard navigation.\n *\n * @example\n * <VocoInput\n * id=\"email\"\n * label=\"Email address\"\n * type=\"email\"\n * required\n * error={errors.email}\n * hint=\"We'll never share your email\"\n * />\n */\n\nimport { forwardRef } from 'react';\nimport type { InputProps } from '../types';\n\nexport const VocoInput = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n id,\n label,\n error,\n hint,\n required = false,\n type = 'text',\n disabled = false,\n placeholder,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n role,\n className = '',\n ...props\n },\n ref\n ) => {\n const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;\n const errorId = error ? `${inputId}-error` : undefined;\n const hintId = hint ? `${inputId}-hint` : undefined;\n\n // Build aria-describedby with error and hint\n const describedByParts = [\n ariaDescribedby,\n error ? errorId : undefined,\n hint ? hintId : undefined,\n ].filter(Boolean).join(' ');\n\n return (\n <div className=\"flex flex-col gap-1\">\n {label && (\n <label\n htmlFor={inputId}\n className=\"text-sm font-medium text-gray-700\"\n id={ariaLabelledby}\n >\n {label}\n {required && <span className=\"text-red-500 ml-1\" aria-label=\"required\">*</span>}\n </label>\n )}\n\n <input\n ref={ref}\n id={inputId}\n type={type}\n disabled={disabled}\n placeholder={placeholder}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={describedByParts || undefined}\n aria-invalid={!!error}\n aria-required={required}\n required={required}\n role={role}\n className={`\n px-3 py-2 rounded-md border transition-colors\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\n disabled:opacity-50 disabled:cursor-not-allowed\n ${error\n ? 'border-red-500 focus:border-red-500 focus:ring-red-500'\n : 'border-gray-300 focus:border-blue-500'\n }\n ${className}\n `.trim().replace(/\\s+/g, ' ')}\n {...props}\n />\n\n {hint && !error && (\n <span id={hintId} className=\"text-xs text-gray-500\">\n {hint}\n </span>\n )}\n\n {error && (\n <span\n id={errorId}\n className=\"text-xs text-red-500\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {error}\n </span>\n )}\n </div>\n );\n }\n);\n\nVocoInput.displayName = 'VocoInput';\n","/**\n * VocoForm Component\n *\n * WCAG 2.1 AA compliant form component.\n * Ensures proper form validation, error announcements, and keyboard navigation.\n *\n * @example\n * <VocoForm onSubmit={handleSubmit} aria-live=\"polite\">\n * <VocoInput label=\"Name\" required />\n * <VocoButton type=\"submit\">Submit</VocoButton>\n * </VocoForm>\n */\n\nimport { forwardRef, useState, useCallback } from 'react';\nimport type { FormProps } from '../types';\n\nexport const VocoForm = forwardRef<HTMLFormElement, FormProps>(\n (\n {\n children,\n onSubmit,\n 'aria-live': ariaLive = 'polite',\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n role,\n className = '',\n ...props\n },\n ref\n ) => {\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleSubmit = useCallback(\n async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setIsSubmitting(true);\n\n // Validate form (basic required field validation)\n const newErrors: Record<string, string> = {};\n const requiredElements = event.currentTarget.querySelectorAll('[required]');\n\n requiredElements.forEach((element) => {\n const input = element as HTMLInputElement;\n if (!input.value.trim()) {\n const fieldName = input.getAttribute('aria-label') ||\n input.getAttribute('name') ||\n 'Field';\n newErrors[input.name || input.id || Math.random().toString()] = `${fieldName} is required`;\n }\n });\n\n setErrors(newErrors);\n\n if (Object.keys(newErrors).length > 0) {\n setIsSubmitting(false);\n // Focus first error\n const firstErrorInput = event.currentTarget.querySelector('[aria-invalid=\"true\"]') as HTMLInputElement;\n firstErrorInput?.focus();\n return;\n }\n\n try {\n await onSubmit?.(event);\n } finally {\n setIsSubmitting(false);\n }\n },\n [onSubmit]\n );\n\n const formStatusId = `form-status-${Math.random().toString(36).substring(2, 9)}`;\n const hasErrors = Object.keys(errors).length > 0;\n\n return (\n <form\n ref={ref}\n onSubmit={handleSubmit}\n aria-live={ariaLive}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n role={role}\n aria-busy={isSubmitting}\n noValidate\n className={className}\n {...props}\n >\n {children}\n\n {/* Screen reader announcements for form status */}\n <div\n id={formStatusId}\n role=\"status\"\n aria-live=\"polite\"\n className=\"sr-only\"\n aria-atomic=\"true\"\n >\n {isSubmitting && 'Submitting form...'}\n {hasErrors && 'Form has errors. Please correct them and try again.'}\n </div>\n </form>\n );\n }\n);\n\nVocoForm.displayName = 'VocoForm';\n","/**\n * Module 2: EAA Enforcer (Accessibility)\n * WCAG 2.1 AA compliant components and validators\n */\n\n// Types\nexport * from './types';\n\n// Validators\nexport * from './validators';\n\n// Components\nexport * from './components';\n\n// Import functions for the accessibility API\nimport {\n checkColorContrast,\n validateAriaLabel,\n testKeyboardNavigation,\n auditColorScheme,\n validateFocusIndicator,\n getSuggestedColorPairings,\n validateInteractiveElements,\n} from './validators';\n\n/**\n * Main accessibility API\n *\n * @example\n * import { accessibility } from '@vocoweb/kernel';\n *\n * // Check color contrast\n * const result = accessibility.checkColorContrast('#ffffff', '#000000');\n *\n * // Validate ARIA labels\n * const validation = accessibility.validateAriaLabel(undefined, undefined, 'button');\n */\nexport const accessibility = {\n // Color contrast checking\n checkColorContrast,\n validateAriaLabel,\n testKeyboardNavigation,\n auditColorScheme,\n validateFocusIndicator,\n getSuggestedColorPairings,\n validateInteractiveElements,\n};\n","/**\n * Region detection and IP geolocation\n */\n\nimport type { IpGeolocation, DataRegion } from './types';\nimport { EU_COUNTRY_CODES, isEuCountry } from '../billing/vat';\n\n// Re-export for convenience\nexport { EU_COUNTRY_CODES, isEuCountry };\n\n/**\n * Supabase EU regions\n */\nexport const SUPABASE_EU_REGIONS = [\n 'eu-west-1',\n 'eu-west-2',\n 'eu-west-3',\n 'eu-central-1',\n 'europe-west1',\n 'europe-west2',\n 'europe-west3',\n 'europe-west4',\n 'europe-west6',\n];\n\n/**\n * Detect region from IP address\n * Uses a free IP geolocation API or falls back to headers\n *\n * @param ip - IP address to detect\n * @param headers - Optional headers for region detection\n * @returns Detected region\n */\nexport async function detectRegion(\n ip: string,\n headers?: Record<string, string | undefined>\n): Promise<DataRegion> {\n // Try to get region from headers first (Cloudflare, Vercel, etc.)\n const headerRegion = detectRegionFromHeaders(headers);\n if (headerRegion && headerRegion !== 'global') {\n return headerRegion;\n }\n\n // If no headers, try IP geolocation\n try {\n const geo = await getIpGeolocation(ip);\n if (geo.isEu) {\n return 'eu';\n }\n\n // Map country to region\n const country = geo.country.toUpperCase();\n\n // Americas\n if (['US', 'CA', 'MX', 'BR', 'AR'].includes(country)) {\n return 'us';\n }\n\n // Asia-Pacific\n if (['AU', 'NZ', 'JP', 'SG', 'IN', 'KR', 'HK', 'MY', 'TH', 'PH', 'ID', 'VN'].includes(country)) {\n return 'apac';\n }\n\n // Default to EU for European countries\n if (isEuCountry(country)) {\n return 'eu';\n }\n } catch (error) {\n console.warn('IP geolocation failed:', error);\n }\n\n // Default to global if we can't determine\n return 'global';\n}\n\n/**\n * Detect region from request headers\n */\nexport function detectRegionFromHeaders(\n headers?: Record<string, string | undefined>\n): DataRegion | null {\n if (!headers) return null;\n\n // Cloudflare headers\n const cfIpCountry = headers['cf-ipcountry'];\n if (cfIpCountry) {\n return isEuCountry(cfIpCountry) ? 'eu' : 'us';\n }\n\n // Vercel headers\n const vercelIpCountry = headers['x-vercel-ip-country'];\n if (vercelIpCountry) {\n return isEuCountry(vercelIpCountry) ? 'eu' : 'us';\n }\n\n // AWS CloudFront headers\n const cloudFrontViewerCountry = headers['cloudfront-viewer-country'];\n if (cloudFrontViewerCountry) {\n return isEuCountry(cloudFrontViewerCountry) ? 'eu' : 'us';\n }\n\n return null;\n}\n\n/**\n * Get IP geolocation information\n *\n * @param ip - IP address to lookup\n * @returns Geolocation information\n */\nexport async function getIpGeolocation(ip: string): Promise<IpGeolocation> {\n // Skip for localhost/private IPs\n if (isPrivateIp(ip)) {\n return {\n ip,\n country: 'UNKNOWN',\n isEu: false,\n };\n }\n\n try {\n // Use a free IP geolocation API\n const response = await fetch(`https://ipapi.co/${ip}/json/`);\n if (!response.ok) {\n throw new Error(`Geolocation API failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n return {\n ip: data.ip || ip,\n country: data.country_code || 'UNKNOWN',\n region: data.region,\n city: data.city,\n isEu: isEuCountry(data.country_code || ''),\n latitude: data.latitude,\n longitude: data.longitude,\n };\n } catch (error) {\n console.warn('Failed to get IP geolocation:', error);\n\n // Fallback: return unknown location\n return {\n ip,\n country: 'UNKNOWN',\n isEu: false,\n };\n }\n}\n\n/**\n * Check if an IP is private/local\n */\nexport function isPrivateIp(ip: string): boolean {\n // IPv4 private ranges\n const privateRanges = [\n /^127\\./, // Loopback\n /^10\\./, // 10.0.0.0/8\n /^172\\.(1[6-9]|2\\d|3[01])\\./, // 172.16.0.0/12\n /^192\\.168\\./, // 192.168.0.0/16\n /^::1$/, // IPv6 loopback\n /^fe80:/i, // IPv6 link-local\n /^fc00:/i, // IPv6 unique local\n ];\n\n return privateRanges.some((range) => range.test(ip));\n}\n\n/**\n * Parse IP from headers (handles X-Forwarded-For, etc.)\n */\nexport function parseIpFromHeaders(\n headers: Record<string, string | undefined>\n): string {\n // Check various headers for the real IP\n const ipHeaders = [\n 'cf-connecting-ip', // Cloudflare\n 'x-forwarded-for', // Standard proxy header\n 'x-real-ip', // Nginx\n 'x-vercel-forwarded-for', // Vercel\n 'x-client-ip', // Some proxies\n ];\n\n for (const header of ipHeaders) {\n const value = headers[header];\n if (value) {\n // X-Forwarded-For can contain multiple IPs, take the first one\n const ips = value.split(',').map((ip) => ip.trim());\n const firstIp = ips[0];\n if (firstIp && !isPrivateIp(firstIp)) {\n return firstIp;\n }\n }\n }\n\n // Fallback\n return 'unknown';\n}\n\n/**\n * Detect if a URL points to an EU-hosted service\n */\nexport function detectUrlRegion(url: string): DataRegion {\n const parsed = new URL(url);\n const hostname = parsed.hostname.toLowerCase();\n\n // Known EU hosting/services\n const euHostings = [\n '.eu.', // EU TLD\n '.fr.', // France\n '.de.', // Germany\n '.nl.', // Netherlands\n '.it.', // Italy\n '.es.', // Spain\n '.co.uk.', // United Kingdom\n 'eu-west-',\n 'europe-',\n ' frankfurt.',\n ' ireland.',\n ' paris.',\n ];\n\n const usHostings = [\n '.us.',\n '-us-',\n 'amazonaws.com', // AWS (check region)\n 'compute.amazonaws.com', // AWS\n ];\n\n if (euHostings.some((pattern) => hostname.includes(pattern))) {\n return 'eu';\n }\n\n if (usHostings.some((pattern) => hostname.includes(pattern))) {\n return 'us';\n }\n\n return 'global';\n}\n\n/**\n * Region detection API\n */\nexport const detector = {\n detectRegion,\n detectRegionFromHeaders,\n getIpGeolocation,\n isPrivateIp,\n parseIpFromHeaders,\n detectUrlRegion,\n isEuCountry,\n};\n","/**\n * Destination whitelist management\n * Controls which external services and endpoints can be called\n */\n\nimport type { DestinationRule } from './types';\n\n/**\n * Default allowed destinations for EU data residency\n */\nexport const DEFAULT_ALLOWED_DESTINATIONS: DestinationRule[] = [\n // Supabase EU regions\n {\n pattern: /\\.supabase\\.(co|com)/,\n allowedRegions: ['eu'],\n description: 'Supabase services (check region)',\n },\n // Supabase Storage EU\n {\n pattern: /supabase\\.co\\/storage\\/v1\\/object/,\n allowedRegions: ['eu'],\n description: 'Supabase Storage EU',\n },\n // Stripe (payment processor, allows EU customers)\n {\n pattern: /api\\.stripe\\.com/,\n allowedRegions: ['eu', 'us', 'apac', 'global'],\n description: 'Stripe payment processing',\n },\n // VIES API (VAT validation)\n {\n pattern: /ec\\.europa\\.eu\\/taxation_customs\\/vies/,\n allowedRegions: ['eu', 'global'],\n description: 'EU VIES VAT validation',\n },\n // EU-based APIs\n {\n pattern: /\\.eu\\.(com|org|net|io)/,\n allowedRegions: ['eu'],\n description: 'EU-hosted services',\n },\n];\n\n/**\n * Default blocked destinations (high-risk)\n */\nexport const DEFAULT_BLOCKED_DESTINATIONS = [\n // Known non-EU data processors\n 'analytics.google.com',\n 'firebaseio.com',\n 'firebase.googleapis.com',\n 'us-central1-firebasestorage',\n // Add more as needed\n];\n\n/**\n * Check if a destination is allowed based on rules\n *\n * @param url - Destination URL\n * @param rules - Destination rules to check\n * @param currentRegion - Current data region\n * @returns Whether the destination is allowed\n */\nexport function checkDestinationAgainstRules(\n url: string,\n rules: DestinationRule[],\n currentRegion: string = 'eu'\n): { allowed: boolean; matchedRule?: DestinationRule; reason?: string } {\n // Check each rule\n for (const rule of rules) {\n const matches = matchDestinationRule(url, rule);\n if (matches) {\n const allowed = rule.allowedRegions.includes(currentRegion as any);\n return {\n allowed,\n matchedRule: rule,\n reason: allowed\n ? undefined\n : `Destination not allowed in ${currentRegion} region`,\n };\n }\n }\n\n // If no rule matches, deny by default\n return {\n allowed: false,\n reason: 'No matching allow rule found',\n };\n}\n\n/**\n * Match a URL against a destination rule\n */\nfunction matchDestinationRule(url: string, rule: DestinationRule): boolean {\n const pattern = rule.pattern instanceof RegExp ? rule.pattern : new RegExp(rule.pattern);\n return pattern.test(url);\n}\n\n/**\n * Create a custom whitelist configuration\n */\nexport function createWhitelist(\n customRules: Partial<DestinationRule>[]\n): DestinationRule[] {\n return [\n ...DEFAULT_ALLOWED_DESTINATIONS,\n ...customRules.map((rule) => ({\n pattern: rule.pattern || '',\n allowedRegions: rule.allowedRegions || ['eu'],\n description: rule.description,\n })) as DestinationRule[],\n ];\n}\n\n/**\n * Validate whitelist configuration\n */\nexport function validateWhitelist(rules: DestinationRule[]): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i]!;\n\n // Check pattern\n if (typeof rule.pattern !== 'string' && !(rule.pattern instanceof RegExp)) {\n errors.push(`Rule ${i}: Pattern must be a string or RegExp`);\n }\n\n // Check allowedRegions\n if (!Array.isArray(rule.allowedRegions) || rule.allowedRegions.length === 0) {\n errors.push(`Rule ${i}: allowedRegions must be a non-empty array`);\n }\n\n // Check for invalid regions\n const validRegions = ['eu', 'us', 'apac', 'global'];\n const invalidRegions = rule.allowedRegions.filter(\n (r) => !validRegions.includes(r)\n );\n if (invalidRegions.length > 0) {\n errors.push(`Rule ${i}: Invalid regions: ${invalidRegions.join(', ')}`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Add a destination to the whitelist\n */\nexport function addToWhitelist(\n rules: DestinationRule[],\n newRule: DestinationRule\n): DestinationRule[] {\n return [...rules, newRule];\n}\n\n/**\n * Remove a destination from the whitelist\n */\nexport function removeFromWhitelist(\n rules: DestinationRule[],\n pattern: string | RegExp\n): DestinationRule[] {\n return rules.filter((rule) => {\n // Compare patterns by converting both to string\n const rulePatternStr = rule.pattern instanceof RegExp\n ? rule.pattern.toString()\n : rule.pattern;\n const patternStr = pattern instanceof RegExp\n ? pattern.toString()\n : pattern;\n return rulePatternStr !== patternStr;\n });\n}\n\n/**\n * Get whitelist statistics\n */\nexport function getWhitelistStats(rules: DestinationRule[]): {\n total: number;\n byRegion: Record<string, number>;\n} {\n const stats = {\n total: rules.length,\n byRegion: {} as Record<string, number>,\n };\n\n for (const rule of rules) {\n for (const region of rule.allowedRegions) {\n stats.byRegion[region] = (stats.byRegion[region] || 0) + 1;\n }\n }\n\n return stats;\n}\n\n/**\n * Whitelist management API\n */\nexport const whitelist = {\n DEFAULT_ALLOWED_DESTINATIONS,\n DEFAULT_BLOCKED_DESTINATIONS,\n checkDestinationAgainstRules,\n createWhitelist,\n validateWhitelist,\n addToWhitelist,\n removeFromWhitelist,\n getWhitelistStats,\n};\n","/**\n * Next.js middleware for data residency enforcement\n * Blocks outgoing requests to non-EU destinations\n */\n\nimport type { MiddlewareOptions, EgressBlockEvent, RequestAnalysis } from './types';\nimport type { DataRegion } from '../shared/types';\nimport { detectRegion, parseIpFromHeaders } from './detector';\nimport { whitelist } from './whitelist';\nimport { VocoComplianceError } from '../shared/errors';\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: {\n defaultRegion: DataRegion;\n allowedRegions: DataRegion[];\n blockedDestinations: string[];\n destinationRules: typeof whitelist.DEFAULT_ALLOWED_DESTINATIONS;\n blockNonEuEgress: boolean;\n supabaseRegion: string;\n regionHeaders: string[];\n} = {\n defaultRegion: 'eu' as DataRegion,\n allowedRegions: ['eu'] as DataRegion[],\n blockedDestinations: [] as string[],\n destinationRules: whitelist.DEFAULT_ALLOWED_DESTINATIONS,\n blockNonEuEgress: true,\n supabaseRegion: 'eu-west-1',\n regionHeaders: ['cf-ipcountry', 'x-vercel-ip-country', 'cloudfront-viewer-country'],\n};\n\n/**\n * Create a Next.js middleware for data residency\n *\n * @example\n * // middleware.ts\n * import { createDataResidencyMiddleware } from '@vocoweb/kernel/residency';\n *\n * export default createDataResidencyMiddleware({\n * blockNonEuEgress: true,\n * onBlocked: async (event) => {\n * console.log('Blocked egress:', event);\n * }\n * });\n */\nexport function createDataResidencyMiddleware(options: MiddlewareOptions = {}) {\n const config = { ...DEFAULT_CONFIG, ...options.config };\n\n return async function middleware(request: Request): Promise<Response | undefined> {\n const url = new URL(request.url);\n\n // Check if path is excluded\n if (options.excludePaths?.some((path) => url.pathname.startsWith(path))) {\n return undefined;\n }\n\n // Get client IP from headers\n const headers = Object.fromEntries(request.headers.entries());\n const ip = parseIpFromHeaders(headers);\n\n // Detect client region\n const clientRegion = await detectRegion(ip, headers);\n\n // Check if request is to an external destination\n if (isExternalRequest(url)) {\n const analysis = analyzeRequest(request, clientRegion, config as any);\n\n if (!analysis.allowed) {\n const blockEvent: EgressBlockEvent = {\n timestamp: new Date(),\n ip,\n url: url.href,\n method: request.method,\n region: analysis.region,\n reason: analysis.reason || 'Request blocked by data residency policy',\n };\n\n // Call the blocked handler\n await options.onBlocked?.(blockEvent);\n\n // Return 403 Forbidden\n return new Response(\n JSON.stringify({\n error: 'Request blocked',\n message: 'This request is not allowed due to data residency restrictions',\n reason: analysis.reason,\n }),\n {\n status: 403,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n }\n }\n\n // Log allowed requests if enabled\n if (options.logAllowed && isExternalRequest(url)) {\n console.log('Allowed request:', {\n url: url.href,\n method: request.method,\n region: clientRegion,\n });\n }\n\n return undefined;\n };\n}\n\n/**\n * Analyze a request to determine if it's allowed\n */\nexport function analyzeRequest(\n request: Request,\n currentRegion: DataRegion,\n config: typeof DEFAULT_CONFIG\n): RequestAnalysis {\n const url = new URL(request.url);\n const destination = url.href;\n const method = request.method;\n\n // Check if destination is blocked\n if (config.blockedDestinations.some((pattern) => destination.includes(pattern))) {\n return {\n url: destination,\n method,\n destination: url.hostname,\n region: currentRegion,\n allowed: false,\n reason: 'Destination is explicitly blocked',\n };\n }\n\n // Check against whitelist rules\n const whitelistResult = whitelist.checkDestinationAgainstRules(\n destination,\n config.destinationRules,\n currentRegion\n );\n\n if (!whitelistResult.allowed) {\n return {\n url: destination,\n method,\n destination: url.hostname,\n region: currentRegion,\n allowed: false,\n reason: whitelistResult.reason || 'Not in whitelist',\n matchedRule: whitelistResult.matchedRule,\n };\n }\n\n // Check non-EU egress blocking\n if (config.blockNonEuEgress) {\n const destinationRegion = detectUrlRegion(destination);\n\n if (destinationRegion !== 'eu' && destinationRegion !== 'global') {\n return {\n url: destination,\n method,\n destination: url.hostname,\n region: currentRegion,\n allowed: false,\n reason: `Non-EU destination (region: ${destinationRegion})`,\n };\n }\n }\n\n return {\n url: destination,\n method,\n destination: url.hostname,\n region: currentRegion,\n allowed: true,\n };\n}\n\n/**\n * Check if a request is external (not to the same origin)\n */\nfunction isExternalRequest(url: URL): boolean {\n // In a real implementation, this would check against the app's origin\n // For now, we consider requests to localhost/private IPs as internal\n const hostname = url.hostname;\n\n // Localhost and private IPs\n const internalPatterns = [\n /^localhost$/,\n /^127\\./,\n /^10\\./,\n /^172\\.(1[6-9]|2\\d|3[01])\\./,\n /^192\\.168\\./,\n /^\\[::1\\]$/,\n ];\n\n if (internalPatterns.some((pattern) => pattern.test(hostname))) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Detect URL region from hostname\n */\nfunction detectUrlRegion(url: string): DataRegion {\n const hostname = new URL(url).hostname.toLowerCase();\n\n // EU indicators (string patterns)\n const euStringPatterns = [\n '.eu.',\n '.fr.',\n '.de.',\n '.nl.',\n '.it.',\n '.es.',\n '.co.uk',\n 'eu-west-',\n 'europe-',\n ];\n\n // EU indicators (RegExp patterns)\n const euRegexpPatterns = [\n /\\.eu\\./,\n /\\.fr\\./,\n /\\.de\\./,\n /\\.nl\\./,\n /\\.it\\./,\n /\\.es\\./,\n /\\.co\\.uk/,\n ];\n\n // US indicators (string patterns)\n const usStringPatterns = [\n '-us-',\n 'amazonaws.com',\n 'compute.amazonaws.com',\n ];\n\n // US indicators (RegExp patterns)\n const usRegexpPatterns = [\n /\\.us\\./,\n ];\n\n // Check string patterns first\n if (euStringPatterns.some((pattern) => hostname.includes(pattern))) {\n return 'eu';\n }\n\n if (usStringPatterns.some((pattern) => hostname.includes(pattern))) {\n return 'us';\n }\n\n // Check RegExp patterns\n if (euRegexpPatterns.some((pattern) => pattern.test(hostname))) {\n return 'eu';\n }\n\n if (usRegexpPatterns.some((pattern) => pattern.test(hostname))) {\n return 'us';\n }\n\n return 'global';\n}\n\n/**\n * Validate a destination against the residency policy\n *\n * @example\n * const result = isDestinationAllowed('https://api.example.com', 'eu');\n * // Returns: { allowed: false, reason: '...' }\n */\nexport async function isDestinationAllowed(\n url: string,\n clientRegion: DataRegion = 'eu',\n config: Partial<typeof DEFAULT_CONFIG> = {}\n): Promise<{ allowed: boolean; reason?: string }> {\n const fullConfig = { ...DEFAULT_CONFIG, ...config };\n\n // Create a mock request\n const mockRequest = new Request(url, { method: 'GET' });\n const analysis = analyzeRequest(mockRequest, clientRegion, fullConfig);\n\n return {\n allowed: analysis.allowed,\n reason: analysis.reason,\n };\n}\n\n/**\n * Create a fetch wrapper that enforces data residency\n *\n * @example\n * const safeFetch = createSafeFetch({ blockNonEuEgress: true });\n * await safeFetch('https://api.example.com/data');\n */\nexport function createSafeFetch(options: MiddlewareOptions = {}) {\n const config = { ...DEFAULT_CONFIG, ...options.config };\n\n return async function safeFetch(url: string | URL, init?: RequestInit): Promise<Response> {\n const urlString = typeof url === 'string' ? url : url.href;\n\n // Analyze the request\n const analysis = await isDestinationAllowed(urlString, 'eu', config);\n\n if (!analysis.allowed) {\n throw VocoComplianceError.egressBlocked(urlString, analysis.reason || 'Data residency restriction');\n }\n\n // Request is allowed, proceed with fetch\n return fetch(url, init);\n };\n}\n\n/**\n * Middleware and utilities API\n */\nexport const middleware = {\n create: createDataResidencyMiddleware,\n analyzeRequest,\n isDestinationAllowed,\n createSafeFetch,\n};\n","/**\n * Module 3: Sovereignty Shield (Data Residency)\n * Egress blocking for GDPR compliance\n */\n\n// Types\nexport * from './types';\n\n// Detector\nexport * from './detector';\n\n// Whitelist\nexport * from './whitelist';\n\n// Middleware\nexport * from './middleware';\n\n// Import functions for the residency API\nimport { detectRegion, parseIpFromHeaders, detectUrlRegion } from './detector';\nimport {\n isDestinationAllowed,\n createSafeFetch,\n createDataResidencyMiddleware,\n} from './middleware';\n\n/**\n * Main data residency API\n *\n * @example\n * import { residency } from '@vocoweb/kernel';\n *\n * // Check if a destination is allowed\n * const result = await residency.isDestinationAllowed('https://api.example.com', 'eu');\n *\n * // Create a middleware\n * const middleware = residency.createMiddleware({ blockNonEuEgress: true });\n *\n * // Create a safe fetch wrapper\n * const safeFetch = residency.createSafeFetch();\n */\nexport const residency = {\n // Region detection\n detectRegion,\n detectUrlRegion,\n parseIpFromHeaders,\n\n // Destination validation\n isDestinationAllowed,\n\n // Middleware creation\n createMiddleware: createDataResidencyMiddleware,\n createSafeFetch,\n};\n","/**\n * Audit Log Recorder\n * Shadow recording for database mutations\n */\n\nimport { getServiceRoleClient } from '../auth/config';\nimport type { AuditRecord, AuditAction, AuditRecorderConfig, AuditQueryFilters } from './types';\n\n/**\n * Default audit configuration\n */\nconst DEFAULT_CONFIG: AuditRecorderConfig = {\n enabled: true,\n batchSize: 100,\n flushInterval: 5000, // 5 seconds\n excludeTables: ['audit_logs', 'session_storage', 'cache'],\n excludeFields: {\n // Fields to exclude from audit (sensitive data)\n users: ['password', 'password_hash', 'reset_token'],\n subscriptions: ['api_key', 'webhook_secret'],\n },\n};\n\nlet auditConfig: AuditRecorderConfig = { ...DEFAULT_CONFIG };\n\n/**\n * Pending audit records batch\n */\nlet pendingRecords: AuditRecord[] = [];\n\n/**\n * Flush timer\n */\nlet flushTimer: NodeJS.Timeout | null = null;\n\n/**\n * Configure audit recorder\n *\n * @example\n * configureRecorder({\n * excludeTables: ['temp_tables'],\n * batchSize: 200\n * });\n */\nexport function configureRecorder(config: Partial<AuditRecorderConfig>): void {\n auditConfig = { ...auditConfig, ...config };\n}\n\n/**\n * Record a database mutation\n *\n * @param tableName - Table being modified\n * @param action - Type of action\n * @param recordId - ID of the record\n * @param oldValue - Old value (for UPDATE/DELETE)\n * @param newValue - New value (for INSERT/UPDATE)\n * @param userId - User making the change\n * @param metadata - Additional metadata\n *\n * @example\n * await recordMutation(\n * 'users',\n * 'UPDATE',\n * 'user-123',\n * { name: 'Old Name' },\n * { name: 'New Name' },\n * 'user-456'\n * );\n */\nexport async function recordMutation(\n tableName: string,\n action: AuditAction,\n recordId: string,\n oldValue: Record<string, unknown> | null,\n newValue: Record<string, unknown> | null,\n userId: string,\n metadata?: Record<string, unknown>\n): Promise<void> {\n if (!auditConfig.enabled) {\n return;\n }\n\n // Check if table is excluded\n if (auditConfig.excludeTables?.includes(tableName)) {\n return;\n }\n\n // Calculate changes\n const changes = calculateChanges(tableName, oldValue, newValue);\n\n // Create audit record\n const record: AuditRecord = {\n id: crypto.randomUUID(),\n userId,\n action,\n tableName,\n recordId,\n changes,\n timestamp: new Date(),\n metadata,\n };\n\n // Add to pending records\n pendingRecords.push(record);\n\n // Flush if batch size reached\n if (pendingRecords.length >= (auditConfig.batchSize || 100)) {\n await flushRecords();\n } else if (!flushTimer) {\n // Schedule flush\n flushTimer = setTimeout(() => {\n flushRecords().catch(console.error);\n }, auditConfig.flushInterval);\n }\n}\n\n/**\n * Calculate changes between old and new values\n */\nfunction calculateChanges(\n tableName: string,\n oldValue: Record<string, unknown> | null,\n newValue: Record<string, unknown> | null\n): Array<{ field: string; oldValue: unknown; newValue: unknown }> {\n const changes: Array<{ field: string; oldValue: unknown; newValue: unknown }> = [];\n\n if (!oldValue || !newValue) {\n // For INSERT or DELETE, record all fields\n const value = oldValue || newValue;\n if (value) {\n const excludedFields = auditConfig.excludeFields?.[tableName] || [];\n for (const [field] of Object.entries(value)) {\n if (!excludedFields.includes(field)) {\n changes.push({\n field,\n oldValue: oldValue?.[field],\n newValue: newValue?.[field],\n });\n }\n }\n }\n } else {\n // For UPDATE, only record changed fields\n const excludedFields = auditConfig.excludeFields?.[tableName] || [];\n for (const key of Object.keys(newValue)) {\n if (!excludedFields.includes(key) && oldValue[key] !== newValue[key]) {\n changes.push({\n field: key,\n oldValue: oldValue[key],\n newValue: newValue[key],\n });\n }\n }\n }\n\n return changes;\n}\n\n/**\n * Flush pending records to database\n */\nexport async function flushRecords(): Promise<void> {\n if (pendingRecords.length === 0) {\n return;\n }\n\n const records = [...pendingRecords];\n pendingRecords = [];\n\n const supabase = getServiceRoleClient();\n\n try {\n const { error } = await supabase\n .from('audit_logs')\n .insert(\n records.map((record) => ({\n id: record.id,\n user_id: record.userId,\n action: record.action,\n table_name: record.tableName,\n record_id: record.recordId,\n changes: record.changes,\n timestamp: record.timestamp.toISOString(),\n ip: record.metadata?.ip as string,\n user_agent: record.metadata?.userAgent as string,\n metadata: record.metadata,\n }))\n );\n\n if (error) {\n console.error('Failed to insert audit logs:', error);\n // Re-add records to pending for retry\n pendingRecords.unshift(...records);\n }\n } catch (error) {\n console.error('Failed to flush audit records:', error);\n // Re-add records to pending for retry\n pendingRecords.unshift(...records);\n } finally {\n if (flushTimer) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n }\n}\n\n/**\n * Query audit logs\n *\n * @param filters - Query filters\n * @returns Query result\n *\n * @example\n * const result = await queryLogs({\n * userId: 'user-123',\n * action: 'UPDATE',\n * limit: 50\n * });\n */\nexport async function queryLogs(filters: AuditQueryFilters = {}): Promise<{\n logs: Array<{\n id: string;\n tableName: string;\n recordId: string;\n action: AuditAction;\n oldValue: Record<string, unknown> | null;\n newValue: Record<string, unknown> | null;\n userId: string;\n timestamp: Date;\n }>;\n total: number;\n hasMore: boolean;\n}> {\n const supabase = getServiceRoleClient();\n\n let query = supabase\n .from('audit_logs')\n .select('*')\n .order('timestamp', { ascending: false });\n\n // Apply filters\n if (filters.userId) {\n query = query.eq('user_id', filters.userId);\n }\n\n if (filters.action) {\n query = query.eq('action', filters.action);\n }\n\n if (filters.tableName) {\n query = query.eq('table_name', filters.tableName);\n }\n\n if (filters.recordId) {\n query = query.eq('record_id', filters.recordId);\n }\n\n if (filters.startDate) {\n query = query.gte('timestamp', filters.startDate.toISOString());\n }\n\n if (filters.endDate) {\n query = query.lte('timestamp', filters.endDate.toISOString());\n }\n\n // Pagination\n const limit = filters.limit || 100;\n const offset = filters.offset || 0;\n query = query.range(offset, offset + limit - 1);\n\n const { data, error, count } = await query;\n\n if (error) {\n throw new Error(`Failed to query audit logs: ${error.message}`);\n }\n\n return {\n logs: (data || []).map((log) => ({\n id: log.id,\n tableName: log.table_name,\n recordId: log.record_id,\n action: log.action,\n oldValue: log.old_value as Record<string, unknown> | null,\n newValue: log.new_value as Record<string, unknown> | null,\n userId: log.user_id,\n timestamp: new Date(log.timestamp),\n })),\n total: count || 0,\n hasMore: (count || 0) > offset + limit,\n };\n}\n\n/**\n * Export audit logs as CSV\n *\n * @param filters - Query filters\n * @returns CSV string\n *\n * @example\n * const csv = await exportAuditLogs({ userId: 'user-123' });\n */\nexport async function exportAuditLogs(filters: AuditQueryFilters = {}): Promise<string> {\n const { logs } = await queryLogs({ ...filters, limit: 10000 });\n\n // CSV header\n const headers = ['ID', 'Timestamp', 'User ID', 'Table', 'Record ID', 'Action', 'Changes'];\n\n // CSV rows\n const rows = logs.map((log) => {\n // Calculate changes from old and new values\n const allKeys = new Set([\n ...Object.keys(log.oldValue || {}),\n ...Object.keys(log.newValue || {}),\n ]);\n\n const changesStr = Array.from(allKeys)\n .map((key) => {\n const oldVal = JSON.stringify(log.oldValue?.[key]);\n const newVal = JSON.stringify(log.newValue?.[key]);\n return `${key}: ${oldVal} -> ${newVal}`;\n })\n .join('; ');\n\n return [\n log.id,\n log.timestamp.toISOString(),\n log.userId,\n log.tableName,\n log.recordId,\n log.action,\n changesStr,\n ].map((v) => `\"${v}\"`).join(',');\n });\n\n return [headers.join(','), ...rows].join('\\n');\n}\n\n/**\n * Get audit statistics for a user\n *\n * @param userId - User ID\n * @returns Statistics\n */\nexport async function getAuditStats(userId: string): Promise<{\n total: number;\n byAction: Record<string, number>;\n byTable: Record<string, number>;\n lastActivity: Date | null;\n}> {\n const supabase = getServiceRoleClient();\n\n // Get total count\n const { count: total } = await supabase\n .from('audit_logs')\n .select('*', { count: 'exact', head: true })\n .eq('user_id', userId);\n\n // Get by action\n const { data: byActionData } = await supabase\n .from('audit_logs')\n .select('action')\n .eq('user_id', userId);\n\n const byAction: Record<string, number> = {};\n for (const row of byActionData || []) {\n byAction[row.action!] = (byAction[row.action!] || 0) + 1;\n }\n\n // Get by table\n const { data: byTableData } = await supabase\n .from('audit_logs')\n .select('table_name')\n .eq('user_id', userId);\n\n const byTable: Record<string, number> = {};\n for (const row of byTableData || []) {\n byTable[row.table_name!] = (byTable[row.table_name!] || 0) + 1;\n }\n\n // Get last activity\n const { data: lastActivityData } = await supabase\n .from('audit_logs')\n .select('timestamp')\n .eq('user_id', userId)\n .order('timestamp', { ascending: false })\n .limit(1)\n .single();\n\n return {\n total: total || 0,\n byAction,\n byTable,\n lastActivity: lastActivityData ? new Date(lastActivityData.timestamp) : null,\n };\n}\n\n/**\n * Create database trigger for audit logging\n *\n * This generates the SQL for creating a PostgreSQL trigger\n *\n * @example\n * const sql = createTriggerSQL('users', ['id', 'email', 'name']);\n */\nexport function createTriggerSQL(\n tableName: string,\n _trackFields?: string[]\n): string {\n return `\n-- Audit trigger for ${tableName}\nCREATE OR REPLACE FUNCTION audit_${tableName}_trigger()\nRETURNS TRIGGER AS $$\nBEGIN\n INSERT INTO audit_logs (\n user_id,\n action,\n table_name,\n record_id,\n old_value,\n new_value,\n timestamp\n )\n VALUES (\n COALESCE(NEW.user_id, OLD.user_id),\n TG_OP,\n '${tableName}',\n COALESCE(NEW.id, OLD.id),\n row_to_json(OLD),\n row_to_json(NEW),\n NOW()\n );\n RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;\n\n-- Create trigger\nDROP TRIGGER IF EXISTS audit_${tableName}_trigger ON ${tableName};\nCREATE TRIGGER audit_${tableName}_trigger\nAFTER INSERT OR UPDATE OR DELETE ON ${tableName}\nFOR EACH ROW\nEXECUTE FUNCTION audit_${tableName}_trigger();\n `.trim();\n}\n\n/**\n * Create audit triggers for multiple tables\n *\n * @param tables - Tables to create triggers for\n * @returns SQL for all triggers\n */\nexport function createTriggersForTables(tables: string[]): string {\n return tables.map((table) => createTriggerSQL(table)).join('\\n\\n');\n}\n\n/**\n * Audit recorder API\n */\nexport const recorder = {\n configure: configureRecorder,\n recordMutation,\n flushRecords,\n queryLogs,\n exportAuditLogs,\n getAuditStats,\n createTriggerSQL,\n createTriggersForTables,\n};\n","/**\n * VocoAuditLog Component\n *\n * Enterprise audit log viewer component with filtering and pagination.\n *\n * @example\n * <VocoAuditLog\n * userId=\"user-123\"\n * filters={{ action: 'UPDATE' }}\n * onExport={handleExport}\n * />\n */\n\nimport { useState, useEffect } from 'react';\nimport type { AuditQueryResult, AuditAction } from '../types';\n\nexport interface VocoAuditLogProps {\n userId: string;\n filters?: {\n action?: AuditAction;\n table?: string;\n recordId?: string;\n startDate?: Date;\n endDate?: Date;\n };\n limit?: number;\n className?: string;\n onExport?: (format: 'csv' | 'json') => void;\n onLogClick?: (logId: string) => void;\n showFilters?: boolean;\n showExport?: boolean;\n}\n\nexport function VocoAuditLog({\n userId: _userId,\n filters = {},\n limit = 50,\n className = '',\n onExport,\n onLogClick,\n showFilters = true,\n showExport = true,\n}: VocoAuditLogProps) {\n const [logs, setLogs] = useState<AuditQueryResult['logs']>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(false);\n const [hasMore, setHasMore] = useState(false);\n const [offset, setOffset] = useState(0);\n const [currentFilters, setCurrentFilters] = useState(filters);\n\n // Fetch logs when filters or offset changes\n useEffect(() => {\n fetchLogs();\n }, [currentFilters, offset]);\n\n async function fetchLogs() {\n setLoading(true);\n try {\n // This would call the actual API\n // For now, it's a placeholder\n // const result = await queryLogs({\n // userId,\n // ...currentFilters,\n // limit,\n // offset\n // });\n\n // Mock data for now\n const result = {\n logs: [],\n total: 0,\n hasMore: false,\n };\n\n setLogs(result.logs);\n setTotal(result.total);\n setHasMore(result.hasMore);\n } catch (error) {\n console.error('Failed to fetch audit logs:', error);\n } finally {\n setLoading(false);\n }\n }\n\n function handleFilterChange(key: string, value: unknown) {\n setCurrentFilters({ ...currentFilters, [key]: value });\n setOffset(0);\n }\n\n function handleLoadMore() {\n setOffset(offset + limit);\n }\n\n function handleExportClick(format: 'csv' | 'json') {\n onExport?.(format);\n }\n\n function getActionColor(action: AuditAction): string {\n switch (action) {\n case 'INSERT':\n return 'text-green-600 bg-green-50';\n case 'UPDATE':\n return 'text-blue-600 bg-blue-50';\n case 'DELETE':\n return 'text-red-600 bg-red-50';\n default:\n return 'text-gray-600 bg-gray-50';\n }\n }\n\n return (\n <div className={className}>\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-2xl font-bold text-gray-900\">Audit Log</h2>\n {showExport && (\n <div className=\"flex gap-2\">\n <button\n onClick={() => handleExportClick('csv')}\n className=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700\"\n >\n Export CSV\n </button>\n <button\n onClick={() => handleExportClick('json')}\n className=\"px-4 py-2 bg-gray-600 text-white rounded-md hover:bg-gray-700\"\n >\n Export JSON\n </button>\n </div>\n )}\n </div>\n\n {/* Filters */}\n {showFilters && (\n <div className=\"p-4 bg-gray-50 rounded-md space-y-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Action\n </label>\n <select\n value={currentFilters.action || ''}\n onChange={(e) => handleFilterChange('action', e.target.value)}\n className=\"w-full px-3 py-2 border rounded-md\"\n >\n <option value=\"\">All Actions</option>\n <option value=\"INSERT\">Insert</option>\n <option value=\"UPDATE\">Update</option>\n <option value=\"DELETE\">Delete</option>\n <option value=\"LOGIN\">Login</option>\n <option value=\"LOGOUT\">Logout</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Table\n </label>\n <input\n type=\"text\"\n value={currentFilters.table || ''}\n onChange={(e) => handleFilterChange('table', e.target.value)}\n placeholder=\"e.g. users\"\n className=\"w-full px-3 py-2 border rounded-md\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Start Date\n </label>\n <input\n type=\"date\"\n value={currentFilters.startDate ? currentFilters.startDate.toISOString().split('T')[0] : ''}\n onChange={(e) =>\n handleFilterChange('startDate', e.target.value ? new Date(e.target.value) : undefined)\n }\n className=\"w-full px-3 py-2 border rounded-md\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n End Date\n </label>\n <input\n type=\"date\"\n value={currentFilters.endDate ? currentFilters.endDate.toISOString().split('T')[0] : ''}\n onChange={(e) =>\n handleFilterChange('endDate', e.target.value ? new Date(e.target.value) : undefined)\n }\n className=\"w-full px-3 py-2 border rounded-md\"\n />\n </div>\n </div>\n </div>\n )}\n\n {/* Summary */}\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"p-4 bg-white rounded-md border\">\n <div className=\"text-sm text-gray-500\">Total Entries</div>\n <div className=\"text-2xl font-bold\">{total}</div>\n </div>\n <div className=\"p-4 bg-white rounded-md border\">\n <div className=\"text-sm text-gray-500\">Showing</div>\n <div className=\"text-2xl font-bold\">{logs.length}</div>\n </div>\n <div className=\"p-4 bg-white rounded-md border\">\n <div className=\"text-sm text-gray-500\">Offset</div>\n <div className=\"text-2xl font-bold\">{offset}</div>\n </div>\n </div>\n\n {/* Log Table */}\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-gray-200\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n Timestamp\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n Action\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n Table\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n Record ID\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n Changes\n </th>\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-gray-200\">\n {loading ? (\n <tr>\n <td colSpan={5} className=\"px-6 py-4 text-center text-gray-500\">\n Loading...\n </td>\n </tr>\n ) : logs.length === 0 ? (\n <tr>\n <td colSpan={5} className=\"px-6 py-4 text-center text-gray-500\">\n No audit logs found\n </td>\n </tr>\n ) : (\n logs.map((log) => (\n <tr\n key={log.id}\n onClick={() => onLogClick?.(log.id)}\n className={onLogClick ? 'cursor-pointer hover:bg-gray-50' : ''}\n >\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n {log.timestamp.toLocaleString()}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <span\n className={`px-2 py-1 text-xs font-medium rounded-full ${getActionColor(log.action)}`}\n >\n {log.action}\n </span>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n {log.tableName}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n {log.recordId}\n </td>\n <td className=\"px-6 py-4 text-sm text-gray-500\">\n <details>\n <summary className=\"cursor-pointer\">\n {Object.keys(log.oldValue || log.newValue || {}).length} fields\n </summary>\n <pre className=\"mt-2 text-xs\">\n {JSON.stringify({ old: log.oldValue, new: log.newValue }, null, 2)}\n </pre>\n </details>\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {hasMore && (\n <div className=\"flex justify-center mt-4\">\n <button\n onClick={handleLoadMore}\n disabled={loading}\n className=\"px-6 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50\"\n >\n Load More\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Module 4: Audit Log (Enterprise)\n * Shadow recording for database mutations\n */\n\n// Types\nexport * from './types';\n\n// Recorder\nexport * from './recorder';\n\n// Components\nexport * from './components';\n\n// Import functions for the audit API\nimport {\n configureRecorder,\n recordMutation,\n flushRecords,\n queryLogs,\n exportAuditLogs,\n getAuditStats,\n createTriggerSQL,\n createTriggersForTables,\n} from './recorder';\n\n/**\n * Main audit API\n *\n * @example\n * import { audit } from '@vocoweb/kernel';\n *\n * // Record a mutation\n * await audit.recordMutation(\n * 'users',\n * 'UPDATE',\n * 'user-123',\n * { name: 'Old Name' },\n * { name: 'New Name' },\n * 'user-456'\n * );\n *\n * // Query logs\n * const result = await audit.queryLogs({ userId: 'user-123' });\n *\n * // Export logs\n * const csv = await audit.exportAuditLogs({ userId: 'user-123' });\n */\nexport const audit = {\n // Recording\n configure: configureRecorder,\n recordMutation,\n flushRecords,\n\n // Querying\n queryLogs,\n getAuditStats,\n\n // Export\n exportAuditLogs,\n\n // Database triggers\n createTriggerSQL,\n createTriggersForTables,\n};\n"]}