@burdenoff/be-sdk 2026.511.2 → 2026.512.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/EventQueueFactory-YGCOETTR.js +8 -0
  2. package/dist/{EventQueueFactory-6NMSGECR.js.map → EventQueueFactory-YGCOETTR.js.map} +1 -1
  3. package/dist/auth/index.d.ts +2 -2
  4. package/dist/auth/index.js +2 -2
  5. package/dist/{chunk-2SD5L2F2.js → chunk-342WTZ4B.js} +3 -3
  6. package/dist/{chunk-2SD5L2F2.js.map → chunk-342WTZ4B.js.map} +1 -1
  7. package/dist/{chunk-JG2FTZPI.js → chunk-5CAA3JST.js} +3 -3
  8. package/dist/{chunk-JG2FTZPI.js.map → chunk-5CAA3JST.js.map} +1 -1
  9. package/dist/{chunk-J26YGR2U.js → chunk-ER77ZA7C.js} +3 -3
  10. package/dist/{chunk-J26YGR2U.js.map → chunk-ER77ZA7C.js.map} +1 -1
  11. package/dist/{chunk-XC2YD6CF.js → chunk-I43B35CP.js} +3 -3
  12. package/dist/{chunk-XC2YD6CF.js.map → chunk-I43B35CP.js.map} +1 -1
  13. package/dist/{chunk-MNCGUYLJ.js → chunk-KFPP47FP.js} +6 -3
  14. package/dist/chunk-KFPP47FP.js.map +1 -0
  15. package/dist/{chunk-M5IMU3US.js → chunk-QTSPQQWA.js} +5 -5
  16. package/dist/{chunk-M5IMU3US.js.map → chunk-QTSPQQWA.js.map} +1 -1
  17. package/dist/{chunk-SAG6ZYWQ.js → chunk-RTQIRGVB.js} +2 -2
  18. package/dist/{chunk-SAG6ZYWQ.js.map → chunk-RTQIRGVB.js.map} +1 -1
  19. package/dist/{chunk-ELLX3K54.js → chunk-RUGNI7CR.js} +3 -3
  20. package/dist/{chunk-ELLX3K54.js.map → chunk-RUGNI7CR.js.map} +1 -1
  21. package/dist/{chunk-F5XEAGHQ.js → chunk-THTLTTA6.js} +4 -4
  22. package/dist/{chunk-F5XEAGHQ.js.map → chunk-THTLTTA6.js.map} +1 -1
  23. package/dist/{chunk-YN6NTFJK.js → chunk-VGMFFO6N.js} +5 -5
  24. package/dist/{chunk-YN6NTFJK.js.map → chunk-VGMFFO6N.js.map} +1 -1
  25. package/dist/{chunk-L7ZMN2FJ.js → chunk-VOFKF27Q.js} +2 -2
  26. package/dist/chunk-VOFKF27Q.js.map +1 -0
  27. package/dist/{chunk-OVSYMNCI.js → chunk-VX35BOJP.js} +35 -12
  28. package/dist/chunk-VX35BOJP.js.map +1 -0
  29. package/dist/{chunk-SAK2JCA7.js → chunk-WBWM7UY7.js} +3 -3
  30. package/dist/{chunk-SAK2JCA7.js.map → chunk-WBWM7UY7.js.map} +1 -1
  31. package/dist/{chunk-3O2RQOPV.js → chunk-YOLJ6ONY.js} +12 -4
  32. package/dist/chunk-YOLJ6ONY.js.map +1 -0
  33. package/dist/{chunk-AI7L22ZJ.js → chunk-ZTSNNKI3.js} +11 -5
  34. package/dist/chunk-ZTSNNKI3.js.map +1 -0
  35. package/dist/config-7U7J3QXQ.js +4 -0
  36. package/dist/{config-UKE2E3BW.js.map → config-7U7J3QXQ.js.map} +1 -1
  37. package/dist/database/index.js +2 -2
  38. package/dist/event-queue/index.d.ts +3 -3
  39. package/dist/event-queue/index.js +5 -5
  40. package/dist/graph/index.d.ts +3 -3
  41. package/dist/graph/index.js +7 -7
  42. package/dist/graphql/index.d.ts +1 -1
  43. package/dist/graphql/index.js +2 -2
  44. package/dist/{graphql-BAVrUgBF.d.ts → graphql-0_hoaeUf.d.ts} +1 -1
  45. package/dist/{index-Cq_xNjcv.d.ts → index-BF2uh_h9.d.ts} +4 -2
  46. package/dist/{index-CHbVw5M7.d.ts → index-CSPbpywb.d.ts} +2 -0
  47. package/dist/{index-KVWGHMbS.d.ts → index-DJq060D-.d.ts} +3 -3
  48. package/dist/{index-CrQgidpx.d.ts → index-DYEts1R8.d.ts} +1 -1
  49. package/dist/{index-BS2idbnr.d.ts → index-DZO2nvC9.d.ts} +2 -2
  50. package/dist/{index-B18rrFru.d.ts → index-HkD7NBED.d.ts} +2 -0
  51. package/dist/{index-DoK0bjhH.d.ts → index-TKcu5LDR.d.ts} +1 -1
  52. package/dist/{index-DOcBnmMe.d.ts → index-XY9x2I6b.d.ts} +2 -0
  53. package/dist/{index-CyVEg86m.d.ts → index-zzKCairW.d.ts} +2 -2
  54. package/dist/index.d.ts +15 -15
  55. package/dist/index.js +24 -22
  56. package/dist/index.js.map +1 -1
  57. package/dist/init/index.d.ts +1 -1
  58. package/dist/init/index.js +4 -4
  59. package/dist/instrumentation/index.d.ts +3 -3
  60. package/dist/logger/index.d.ts +2 -2
  61. package/dist/notifications/index.d.ts +3 -3
  62. package/dist/notifications/index.js +2 -2
  63. package/dist/prisma/index.js +5 -5
  64. package/dist/rbac/index.d.ts +2 -2
  65. package/dist/rbac/index.js +2 -2
  66. package/dist/telemetry/index.d.ts +4 -4
  67. package/dist/tracker/index.d.ts +4 -4
  68. package/dist/tracker/index.js +4 -4
  69. package/package.json +1 -1
  70. package/dist/EventQueueFactory-6NMSGECR.js +0 -8
  71. package/dist/chunk-3O2RQOPV.js.map +0 -1
  72. package/dist/chunk-AI7L22ZJ.js.map +0 -1
  73. package/dist/chunk-L7ZMN2FJ.js.map +0 -1
  74. package/dist/chunk-MNCGUYLJ.js.map +0 -1
  75. package/dist/chunk-OVSYMNCI.js.map +0 -1
  76. package/dist/config-UKE2E3BW.js +0 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/database/connections/clickhouse.ts","../src/database/index.ts"],"names":["clickhouseModule","loadClickHouseModule","Error","client","getClickHouseClient","config","chModule","url","process","env","username","password","database","requestTimeout","asyncInsert","undefined","createClient","clickhouse_settings","async_insert","wait_for_async_insert","request_timeout","logger","info","testClickHouseConnection","clickhouse","result","query","format","data","json","version","error","message","closeClickHouseConnection","close","executeQuery","params","query_params","insertData","table","insert","values","debug","rows","length","createTable","command","getClickHouseStats","isConnected","db","DatabaseModule","createPrismaConfig","prismaConfig","datasources","log","errorFormat","connectionTimeout","queryTimeout","buildPagination","options","page","pageSize","offset","limit","Math","floor","skip","take","createPaginatedResult","total","totalPages","ceil","hasNext","hasPrevious","buildWhereClause","filters","where","filter","field","operator","value","not","gt","gte","lt","lte","in","notIn","contains","mode","buildOrderByClause","sorts","map","sort","direction","parseDatabaseUrl","urlObj","URL","searchParams","forEach","key","protocol","replace","host","hostname","port","parseInt","pathname","substring","Object","keys","ValidationError","buildDatabaseUrl","URLSearchParams","toString","sanitizeDatabaseUrl","validateDatabaseUrl","parsed","createPoolConfig","min","max","poolSize","acquireTimeoutMillis","idleTimeoutMillis","generateMigrationName","description","timestamp","Date","toISOString","split","slug","toLowerCase","startsWith","slice","endsWith","buildSelectClause","fields","select","buildIncludeClause","relations","include","relation","retry","operation","maxAttempts","initialDelay","delay","backoff","lastError","attempt","warn","Promise","resolve","setTimeout","transaction","prisma","operations","promises","op","results","$transaction","healthCheck","$queryRaw","formatPrismaError","err","code","meta","target","join"],"mappings":"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","file":"chunk-JG2FTZPI.js","sourcesContent":["/**\n * ClickHouse Connection Module\n *\n * Provides connection pooling and management for ClickHouse analytics database.\n * This is a generalizable module for all Burdenoff products.\n *\n * Features:\n * - Singleton connection management\n * - Environment-based configuration\n * - Health check support\n * - Query helpers for common operations\n * - Async insert optimization\n * - Lazy loading: @clickhouse/client is only imported when ClickHouse features are used\n *\n * @example\n * ```typescript\n * import { getClickHouseClient, executeQuery, insertData } from '@burdenoff/be-sdk';\n *\n * const client = await getClickHouseClient();\n * const results = await executeQuery('SELECT * FROM events LIMIT 10');\n * await insertData('events', [{ id: 1, name: 'test' }]);\n * ```\n */\n\n// Type-only import is erased at runtime, so it won't cause a missing-module error\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { logger } from '../../logger/index.js';\n\n/**\n * Lazily-loaded ClickHouse module reference\n */\nlet clickhouseModule: typeof import('@clickhouse/client') | null = null;\n\n/**\n * Lazily load the @clickhouse/client module\n * @throws Error if @clickhouse/client is not installed\n */\nasync function loadClickHouseModule(): Promise<typeof import('@clickhouse/client')> {\n if (!clickhouseModule) {\n try {\n clickhouseModule = await import('@clickhouse/client');\n } catch {\n throw new Error(\n '@clickhouse/client is required for ClickHouse features. Install it with: bun add @clickhouse/client'\n );\n }\n }\n return clickhouseModule;\n}\n\nlet client: ClickHouseClient | null = null;\n\n/**\n * ClickHouse configuration options\n */\nexport interface ClickHouseConfig {\n /** ClickHouse server URL */\n url?: string;\n /** Username for authentication */\n username?: string;\n /** Password for authentication */\n password?: string;\n /** Database name */\n database?: string;\n /** Request timeout in milliseconds */\n requestTimeout?: number;\n /** Enable async inserts */\n asyncInsert?: boolean;\n}\n\n/**\n * Get ClickHouse client instance (singleton)\n *\n * Creates a new connection if one doesn't exist, otherwise returns the existing connection.\n * Connection parameters are read from environment variables or can be provided via config.\n *\n * Environment variables:\n * - CLICKHOUSE_URL: ClickHouse server URL (default: http://localhost:8123)\n * - CLICKHOUSE_USER: Username (default: default)\n * - CLICKHOUSE_PASSWORD: Password (default: empty)\n * - CLICKHOUSE_DB: Database name (default: default)\n *\n * @param config - Optional configuration to override environment variables\n * @returns Promise resolving to ClickHouseClient instance\n */\nexport async function getClickHouseClient(config?: ClickHouseConfig): Promise<ClickHouseClient> {\n if (!client) {\n const chModule = await loadClickHouseModule();\n\n const url = config?.url || process.env['CLICKHOUSE_URL'] || 'http://localhost:8123';\n const username = config?.username || process.env['CLICKHOUSE_USER'] || 'default';\n const password = config?.password || process.env['CLICKHOUSE_PASSWORD'] || '';\n const database = config?.database || process.env['CLICKHOUSE_DB'] || 'default';\n const requestTimeout = config?.requestTimeout || 30000;\n const asyncInsert = config?.asyncInsert !== undefined ? config.asyncInsert : true;\n\n client = chModule.createClient({\n url,\n username,\n password,\n database,\n clickhouse_settings: {\n // Enable async_insert for better performance with frequent small inserts\n async_insert: asyncInsert ? 1 : 0,\n wait_for_async_insert: 0,\n },\n // Request timeout in ms\n request_timeout: requestTimeout,\n });\n\n logger.info('[ClickHouse] Connected to ClickHouse', {\n url,\n database,\n });\n }\n\n return client;\n}\n\n/**\n * Test ClickHouse connection\n *\n * Attempts to query the database version to verify connectivity.\n *\n * @returns Promise resolving to true if connected, false otherwise\n */\nexport async function testClickHouseConnection(): Promise<boolean> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT version() as version',\n format: 'JSONEachRow',\n });\n\n const data = await result.json<{ version: string }>();\n logger.info('[ClickHouse] Connected successfully', {\n version: data[0]?.version,\n });\n return true;\n } catch (error: unknown) {\n logger.error('[ClickHouse] Failed to connect', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return false;\n }\n}\n\n/**\n * Close ClickHouse connection\n *\n * Closes the client connection and cleans up resources.\n * Should be called on application shutdown.\n */\nexport async function closeClickHouseConnection(): Promise<void> {\n if (client) {\n await client.close();\n client = null;\n logger.info('[ClickHouse] Connection closed');\n }\n}\n\n/**\n * Execute a ClickHouse query\n *\n * @param query - SQL query to execute\n * @param params - Optional query parameters\n * @returns Promise resolving to query results\n */\nexport async function executeQuery<T = unknown>(query: string, params?: Record<string, unknown>): Promise<T[]> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n });\n\n return await result.json<T>();\n } catch (error: unknown) {\n logger.error('[ClickHouse] Query error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n query,\n });\n throw error;\n }\n}\n\n/**\n * Insert data into a ClickHouse table\n *\n * @param table - Table name\n * @param data - Array of data objects to insert\n */\nexport async function insertData<T extends Record<string, unknown>>(table: string, data: T[]): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.insert({\n table,\n values: data,\n format: 'JSONEachRow',\n });\n\n logger.debug('[ClickHouse] Data inserted', {\n table,\n rows: data.length,\n });\n } catch (error: unknown) {\n logger.error('[ClickHouse] Insert error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n table,\n });\n throw error;\n }\n}\n\n/**\n * Create a table in ClickHouse\n *\n * @param query - CREATE TABLE query\n */\nexport async function createTable(query: string): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.command({\n query,\n });\n\n logger.debug('[ClickHouse] Table created successfully');\n } catch (error: unknown) {\n logger.error('[ClickHouse] Table creation error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n}\n\n/**\n * Get ClickHouse client statistics\n *\n * @returns Promise resolving to client statistics\n */\nexport async function getClickHouseStats(): Promise<{\n isConnected: boolean;\n database: string | null;\n}> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT currentDatabase() as db',\n format: 'JSONEachRow',\n });\n const data = await result.json<{ db: string }>();\n return {\n isConnected: true,\n database: data[0]?.db || null,\n };\n } catch {\n return {\n isConnected: false,\n database: null,\n };\n }\n}\n","/**\n * Database Module\n * Helpers for database client, Prisma configuration, and common database operations.\n * Includes connection management for ClickHouse. The legacy ArangoDB connection\n * was removed as part of the migration to NebulaGraph — consuming services now\n * talk to wspace-graph-svc via the federated GraphQL gateway and never open a\n * direct graph DB connection.\n */\n\nimport { logger } from '../logger/index.js';\nimport { ValidationError } from '../types/index.js';\n\n// Export connection modules\nexport * from './connections/clickhouse.js';\n\nexport interface DatabaseConfig {\n /** Database URL */\n url: string;\n /** Connection pool size */\n poolSize?: number;\n /** Connection timeout in milliseconds */\n connectionTimeout?: number;\n /** Query timeout in milliseconds */\n queryTimeout?: number;\n /** Enable query logging */\n logQueries?: boolean;\n /** SSL configuration */\n ssl?: {\n rejectUnauthorized?: boolean;\n ca?: string;\n cert?: string;\n key?: string;\n };\n}\n\nexport interface PrismaConfig extends DatabaseConfig {\n /** Prisma log levels */\n log?: Array<'query' | 'info' | 'warn' | 'error'>;\n /** Error format */\n errorFormat?: 'pretty' | 'colorless' | 'minimal';\n}\n\nexport interface QueryOptions {\n /** Query timeout in milliseconds */\n timeout?: number;\n /** Transaction isolation level */\n isolationLevel?: 'ReadUncommitted' | 'ReadCommitted' | 'RepeatableRead' | 'Serializable';\n}\n\nexport interface PaginationOptions {\n /** Page number (1-based) */\n page?: number;\n /** Number of items per page */\n pageSize?: number;\n /** Offset (alternative to page) */\n offset?: number;\n /** Limit (alternative to pageSize) */\n limit?: number;\n}\n\nexport interface PaginatedResult<T> {\n /** Data items */\n data: T[];\n /** Total count of items */\n total: number;\n /** Current page */\n page: number;\n /** Page size */\n pageSize: number;\n /** Total pages */\n totalPages: number;\n /** Has next page */\n hasNext: boolean;\n /** Has previous page */\n hasPrevious: boolean;\n}\n\nexport interface SortOptions {\n /** Field to sort by */\n field: string;\n /** Sort direction */\n direction: 'asc' | 'desc';\n}\n\nexport interface FilterOptions {\n /** Field to filter */\n field: string;\n /** Operator */\n operator: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin' | 'like' | 'ilike';\n /** Value to compare */\n value: unknown;\n}\n\n/**\n * Database Module\n */\nexport class DatabaseModule {\n /**\n * Create Prisma client configuration\n */\n public static createPrismaConfig(config: PrismaConfig): Record<string, unknown> {\n logger.debug('[Database] Creating Prisma config');\n\n const prismaConfig: Record<string, unknown> = {\n datasources: {\n db: {\n url: config.url,\n },\n },\n log: config.log || ['error', 'warn'],\n errorFormat: config.errorFormat || 'colorless',\n };\n\n if (config.connectionTimeout) {\n prismaConfig['connectionTimeout'] = config.connectionTimeout;\n }\n\n if (config.queryTimeout) {\n prismaConfig['queryTimeout'] = config.queryTimeout;\n }\n\n logger.info('[Database] Prisma config created');\n\n return prismaConfig;\n }\n\n /**\n * Build pagination parameters\n */\n public static buildPagination(options: PaginationOptions): {\n skip: number;\n take: number;\n page: number;\n pageSize: number;\n } {\n let page = options.page || 1;\n let pageSize = options.pageSize || 20;\n\n // Handle offset/limit if provided instead of page/pageSize\n if (options.offset !== undefined || options.limit !== undefined) {\n const offset = options.offset || 0;\n const limit = options.limit || 20;\n pageSize = limit;\n page = Math.floor(offset / limit) + 1;\n }\n\n // Validate\n if (page < 1) {\n page = 1;\n }\n\n if (pageSize < 1) {\n pageSize = 20;\n }\n\n if (pageSize > 100) {\n pageSize = 100; // Max page size\n }\n\n const skip = (page - 1) * pageSize;\n const take = pageSize;\n\n return { skip, take, page, pageSize };\n }\n\n /**\n * Create paginated result\n */\n public static createPaginatedResult<T>(data: T[], total: number, page: number, pageSize: number): PaginatedResult<T> {\n const totalPages = Math.ceil(total / pageSize);\n\n return {\n data,\n total,\n page,\n pageSize,\n totalPages,\n hasNext: page < totalPages,\n hasPrevious: page > 1,\n };\n }\n\n /**\n * Build Prisma where clause from filters\n */\n public static buildWhereClause(filters: FilterOptions[]): Record<string, unknown> {\n const where: Record<string, unknown> = {};\n\n for (const filter of filters) {\n const { field, operator, value } = filter;\n\n switch (operator) {\n case 'eq':\n where[field] = value;\n break;\n case 'ne':\n where[field] = { not: value };\n break;\n case 'gt':\n where[field] = { gt: value };\n break;\n case 'gte':\n where[field] = { gte: value };\n break;\n case 'lt':\n where[field] = { lt: value };\n break;\n case 'lte':\n where[field] = { lte: value };\n break;\n case 'in':\n where[field] = { in: value };\n break;\n case 'nin':\n where[field] = { notIn: value };\n break;\n case 'like':\n where[field] = { contains: value };\n break;\n case 'ilike':\n where[field] = { contains: value, mode: 'insensitive' };\n break;\n }\n }\n\n return where;\n }\n\n /**\n * Build Prisma orderBy clause from sort options\n */\n public static buildOrderByClause(sorts: SortOptions[]): Record<string, string>[] {\n return sorts.map((sort) => ({\n [sort.field]: sort.direction,\n }));\n }\n\n /**\n * Parse database URL\n */\n public static parseDatabaseUrl(url: string): {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n } {\n try {\n const urlObj = new URL(url);\n\n const params: Record<string, string> = {};\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return {\n protocol: urlObj.protocol.replace(':', ''),\n host: urlObj.hostname,\n port: urlObj.port ? parseInt(urlObj.port, 10) : undefined,\n database: urlObj.pathname.substring(1),\n username: urlObj.username || undefined,\n password: urlObj.password || undefined,\n params: Object.keys(params).length > 0 ? params : undefined,\n };\n } catch (error) {\n throw new ValidationError('Invalid database URL', {\n url,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Build database URL\n */\n public static buildDatabaseUrl(options: {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n }): string {\n let url = `${options.protocol}://`;\n\n if (options.username) {\n url += options.username;\n if (options.password) {\n url += `:${options.password}`;\n }\n url += '@';\n }\n\n url += options.host;\n\n if (options.port) {\n url += `:${options.port}`;\n }\n\n url += `/${options.database}`;\n\n if (options.params && Object.keys(options.params).length > 0) {\n const params = new URLSearchParams(options.params);\n url += `?${params.toString()}`;\n }\n\n return url;\n }\n\n /**\n * Sanitize database URL for logging (remove password)\n */\n public static sanitizeDatabaseUrl(url: string): string {\n try {\n const urlObj = new URL(url);\n if (urlObj.password) {\n // eslint-disable-next-line sonarjs/no-hardcoded-passwords -- Redacting password for logging, not hardcoding\n urlObj.password = '***';\n }\n return urlObj.toString();\n } catch {\n return url;\n }\n }\n\n /**\n * Validate database connection URL\n */\n public static validateDatabaseUrl(url: string): boolean {\n try {\n const parsed = this.parseDatabaseUrl(url);\n return !!(parsed.protocol && parsed.host && parsed.database);\n } catch {\n return false;\n }\n }\n\n /**\n * Create connection pool config\n */\n public static createPoolConfig(config: DatabaseConfig): {\n min: number;\n max: number;\n acquireTimeoutMillis: number;\n idleTimeoutMillis: number;\n } {\n return {\n min: 2,\n max: config.poolSize || 10,\n acquireTimeoutMillis: config.connectionTimeout || 30000,\n idleTimeoutMillis: 30000,\n };\n }\n\n /**\n * Generate migration name\n */\n public static generateMigrationName(description: string): string {\n const timestamp = new Date().toISOString().replace(/[-:]/g, '').split('.')[0];\n\n // Convert to slug format\n let slug = description.toLowerCase().replace(/[^a-z0-9]+/g, '_');\n\n // Manually trim underscores to avoid slow-regex warning\n while (slug.startsWith('_')) {\n slug = slug.slice(1);\n }\n while (slug.endsWith('_')) {\n slug = slug.slice(0, -1);\n }\n\n return `${timestamp}_${slug}`;\n }\n\n /**\n * Build select clause for specific fields\n */\n public static buildSelectClause(fields: string[]): Record<string, boolean> {\n const select: Record<string, boolean> = {};\n for (const field of fields) {\n select[field] = true;\n }\n return select;\n }\n\n /**\n * Build include clause for relations\n */\n public static buildIncludeClause(relations: string[]): Record<string, boolean> {\n const include: Record<string, boolean> = {};\n for (const relation of relations) {\n include[relation] = true;\n }\n return include;\n }\n\n /**\n * Retry database operation\n */\n public static async retry<T>(\n operation: () => Promise<T>,\n options: {\n maxAttempts?: number;\n delay?: number;\n backoff?: number;\n } = {}\n ): Promise<T> {\n const maxAttempts = options.maxAttempts || 3;\n const initialDelay = options.delay || 1000;\n const backoff = options.backoff || 2;\n\n let lastError: Error | undefined;\n let delay = initialDelay;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n logger.warn(`[Database] Operation failed (attempt ${attempt}/${maxAttempts})`, { error });\n\n if (attempt < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay *= backoff;\n }\n }\n }\n\n throw lastError || new Error('Database operation failed after retries');\n }\n\n /**\n * Execute in transaction\n */\n public static async transaction<T>(\n prisma: unknown,\n operations: Array<(tx: unknown) => Promise<unknown>>\n ): Promise<T[]> {\n logger.debug('[Database] Starting transaction');\n\n if (!prisma || typeof prisma !== 'object' || !('$transaction' in prisma)) {\n throw new ValidationError('Invalid Prisma client provided');\n }\n\n const client = prisma as { $transaction: (ops: Array<Promise<unknown>>) => Promise<unknown[]> };\n\n try {\n const promises = operations.map((op) => op(prisma));\n const results = await client.$transaction(promises);\n\n logger.info('[Database] Transaction completed successfully');\n\n return results as T[];\n } catch (error) {\n logger.error('[Database] Transaction failed', { error });\n throw error;\n }\n }\n\n /**\n * Check database health\n */\n public static async healthCheck(prisma: unknown): Promise<boolean> {\n try {\n if (!prisma || typeof prisma !== 'object' || !('$queryRaw' in prisma)) {\n return false;\n }\n\n const client = prisma as { $queryRaw: (query: unknown) => Promise<unknown> };\n\n // Simple query to check connection\n await client.$queryRaw`SELECT 1`;\n\n return true;\n } catch (error) {\n logger.error('[Database] Health check failed', { error });\n return false;\n }\n }\n\n /**\n * Format Prisma error for user-friendly message\n */\n public static formatPrismaError(error: unknown): string {\n if (!error || typeof error !== 'object') {\n return 'Database error occurred';\n }\n\n const err = error as { code?: string; meta?: { target?: string[] } };\n\n switch (err.code) {\n case 'P2002':\n return `A record with this ${err.meta?.target?.join(', ') || 'value'} already exists`;\n case 'P2025':\n return 'Record not found';\n case 'P2003':\n return 'Foreign key constraint failed';\n case 'P2016':\n return 'Query interpretation error';\n case 'P2021':\n return 'Table does not exist in the database';\n case 'P2022':\n return 'Column does not exist in the database';\n default:\n return 'Database operation failed';\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/database/connections/clickhouse.ts","../src/database/index.ts"],"names":["clickhouseModule","loadClickHouseModule","Error","client","getClickHouseClient","config","chModule","url","process","env","username","password","database","requestTimeout","asyncInsert","undefined","createClient","clickhouse_settings","async_insert","wait_for_async_insert","request_timeout","logger","info","testClickHouseConnection","clickhouse","result","query","format","data","json","version","error","message","closeClickHouseConnection","close","executeQuery","params","query_params","insertData","table","insert","values","debug","rows","length","createTable","command","getClickHouseStats","isConnected","db","DatabaseModule","createPrismaConfig","prismaConfig","datasources","log","errorFormat","connectionTimeout","queryTimeout","buildPagination","options","page","pageSize","offset","limit","Math","floor","skip","take","createPaginatedResult","total","totalPages","ceil","hasNext","hasPrevious","buildWhereClause","filters","where","filter","field","operator","value","not","gt","gte","lt","lte","in","notIn","contains","mode","buildOrderByClause","sorts","map","sort","direction","parseDatabaseUrl","urlObj","URL","searchParams","forEach","key","protocol","replace","host","hostname","port","parseInt","pathname","substring","Object","keys","ValidationError","buildDatabaseUrl","URLSearchParams","toString","sanitizeDatabaseUrl","validateDatabaseUrl","parsed","createPoolConfig","min","max","poolSize","acquireTimeoutMillis","idleTimeoutMillis","generateMigrationName","description","timestamp","Date","toISOString","split","slug","toLowerCase","startsWith","slice","endsWith","buildSelectClause","fields","select","buildIncludeClause","relations","include","relation","retry","operation","maxAttempts","initialDelay","delay","backoff","lastError","attempt","warn","Promise","resolve","setTimeout","transaction","prisma","operations","promises","op","results","$transaction","healthCheck","$queryRaw","formatPrismaError","err","code","meta","target","join"],"mappings":"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","file":"chunk-5CAA3JST.js","sourcesContent":["/**\n * ClickHouse Connection Module\n *\n * Provides connection pooling and management for ClickHouse analytics database.\n * This is a generalizable module for all Burdenoff products.\n *\n * Features:\n * - Singleton connection management\n * - Environment-based configuration\n * - Health check support\n * - Query helpers for common operations\n * - Async insert optimization\n * - Lazy loading: @clickhouse/client is only imported when ClickHouse features are used\n *\n * @example\n * ```typescript\n * import { getClickHouseClient, executeQuery, insertData } from '@burdenoff/be-sdk';\n *\n * const client = await getClickHouseClient();\n * const results = await executeQuery('SELECT * FROM events LIMIT 10');\n * await insertData('events', [{ id: 1, name: 'test' }]);\n * ```\n */\n\n// Type-only import is erased at runtime, so it won't cause a missing-module error\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { logger } from '../../logger/index.js';\n\n/**\n * Lazily-loaded ClickHouse module reference\n */\nlet clickhouseModule: typeof import('@clickhouse/client') | null = null;\n\n/**\n * Lazily load the @clickhouse/client module\n * @throws Error if @clickhouse/client is not installed\n */\nasync function loadClickHouseModule(): Promise<typeof import('@clickhouse/client')> {\n if (!clickhouseModule) {\n try {\n clickhouseModule = await import('@clickhouse/client');\n } catch {\n throw new Error(\n '@clickhouse/client is required for ClickHouse features. Install it with: bun add @clickhouse/client'\n );\n }\n }\n return clickhouseModule;\n}\n\nlet client: ClickHouseClient | null = null;\n\n/**\n * ClickHouse configuration options\n */\nexport interface ClickHouseConfig {\n /** ClickHouse server URL */\n url?: string;\n /** Username for authentication */\n username?: string;\n /** Password for authentication */\n password?: string;\n /** Database name */\n database?: string;\n /** Request timeout in milliseconds */\n requestTimeout?: number;\n /** Enable async inserts */\n asyncInsert?: boolean;\n}\n\n/**\n * Get ClickHouse client instance (singleton)\n *\n * Creates a new connection if one doesn't exist, otherwise returns the existing connection.\n * Connection parameters are read from environment variables or can be provided via config.\n *\n * Environment variables:\n * - CLICKHOUSE_URL: ClickHouse server URL (default: http://localhost:8123)\n * - CLICKHOUSE_USER: Username (default: default)\n * - CLICKHOUSE_PASSWORD: Password (default: empty)\n * - CLICKHOUSE_DB: Database name (default: default)\n *\n * @param config - Optional configuration to override environment variables\n * @returns Promise resolving to ClickHouseClient instance\n */\nexport async function getClickHouseClient(config?: ClickHouseConfig): Promise<ClickHouseClient> {\n if (!client) {\n const chModule = await loadClickHouseModule();\n\n const url = config?.url || process.env['CLICKHOUSE_URL'] || 'http://localhost:8123';\n const username = config?.username || process.env['CLICKHOUSE_USER'] || 'default';\n const password = config?.password || process.env['CLICKHOUSE_PASSWORD'] || '';\n const database = config?.database || process.env['CLICKHOUSE_DB'] || 'default';\n const requestTimeout = config?.requestTimeout || 30000;\n const asyncInsert = config?.asyncInsert !== undefined ? config.asyncInsert : true;\n\n client = chModule.createClient({\n url,\n username,\n password,\n database,\n clickhouse_settings: {\n // Enable async_insert for better performance with frequent small inserts\n async_insert: asyncInsert ? 1 : 0,\n wait_for_async_insert: 0,\n },\n // Request timeout in ms\n request_timeout: requestTimeout,\n });\n\n logger.info('[ClickHouse] Connected to ClickHouse', {\n url,\n database,\n });\n }\n\n return client;\n}\n\n/**\n * Test ClickHouse connection\n *\n * Attempts to query the database version to verify connectivity.\n *\n * @returns Promise resolving to true if connected, false otherwise\n */\nexport async function testClickHouseConnection(): Promise<boolean> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT version() as version',\n format: 'JSONEachRow',\n });\n\n const data = await result.json<{ version: string }>();\n logger.info('[ClickHouse] Connected successfully', {\n version: data[0]?.version,\n });\n return true;\n } catch (error: unknown) {\n logger.error('[ClickHouse] Failed to connect', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return false;\n }\n}\n\n/**\n * Close ClickHouse connection\n *\n * Closes the client connection and cleans up resources.\n * Should be called on application shutdown.\n */\nexport async function closeClickHouseConnection(): Promise<void> {\n if (client) {\n await client.close();\n client = null;\n logger.info('[ClickHouse] Connection closed');\n }\n}\n\n/**\n * Execute a ClickHouse query\n *\n * @param query - SQL query to execute\n * @param params - Optional query parameters\n * @returns Promise resolving to query results\n */\nexport async function executeQuery<T = unknown>(query: string, params?: Record<string, unknown>): Promise<T[]> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n });\n\n return await result.json<T>();\n } catch (error: unknown) {\n logger.error('[ClickHouse] Query error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n query,\n });\n throw error;\n }\n}\n\n/**\n * Insert data into a ClickHouse table\n *\n * @param table - Table name\n * @param data - Array of data objects to insert\n */\nexport async function insertData<T extends Record<string, unknown>>(table: string, data: T[]): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.insert({\n table,\n values: data,\n format: 'JSONEachRow',\n });\n\n logger.debug('[ClickHouse] Data inserted', {\n table,\n rows: data.length,\n });\n } catch (error: unknown) {\n logger.error('[ClickHouse] Insert error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n table,\n });\n throw error;\n }\n}\n\n/**\n * Create a table in ClickHouse\n *\n * @param query - CREATE TABLE query\n */\nexport async function createTable(query: string): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.command({\n query,\n });\n\n logger.debug('[ClickHouse] Table created successfully');\n } catch (error: unknown) {\n logger.error('[ClickHouse] Table creation error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n}\n\n/**\n * Get ClickHouse client statistics\n *\n * @returns Promise resolving to client statistics\n */\nexport async function getClickHouseStats(): Promise<{\n isConnected: boolean;\n database: string | null;\n}> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT currentDatabase() as db',\n format: 'JSONEachRow',\n });\n const data = await result.json<{ db: string }>();\n return {\n isConnected: true,\n database: data[0]?.db || null,\n };\n } catch {\n return {\n isConnected: false,\n database: null,\n };\n }\n}\n","/**\n * Database Module\n * Helpers for database client, Prisma configuration, and common database operations.\n * Includes connection management for ClickHouse. The legacy ArangoDB connection\n * was removed as part of the migration to NebulaGraph — consuming services now\n * talk to wspace-graph-svc via the federated GraphQL gateway and never open a\n * direct graph DB connection.\n */\n\nimport { logger } from '../logger/index.js';\nimport { ValidationError } from '../types/index.js';\n\n// Export connection modules\nexport * from './connections/clickhouse.js';\n\nexport interface DatabaseConfig {\n /** Database URL */\n url: string;\n /** Connection pool size */\n poolSize?: number;\n /** Connection timeout in milliseconds */\n connectionTimeout?: number;\n /** Query timeout in milliseconds */\n queryTimeout?: number;\n /** Enable query logging */\n logQueries?: boolean;\n /** SSL configuration */\n ssl?: {\n rejectUnauthorized?: boolean;\n ca?: string;\n cert?: string;\n key?: string;\n };\n}\n\nexport interface PrismaConfig extends DatabaseConfig {\n /** Prisma log levels */\n log?: Array<'query' | 'info' | 'warn' | 'error'>;\n /** Error format */\n errorFormat?: 'pretty' | 'colorless' | 'minimal';\n}\n\nexport interface QueryOptions {\n /** Query timeout in milliseconds */\n timeout?: number;\n /** Transaction isolation level */\n isolationLevel?: 'ReadUncommitted' | 'ReadCommitted' | 'RepeatableRead' | 'Serializable';\n}\n\nexport interface PaginationOptions {\n /** Page number (1-based) */\n page?: number;\n /** Number of items per page */\n pageSize?: number;\n /** Offset (alternative to page) */\n offset?: number;\n /** Limit (alternative to pageSize) */\n limit?: number;\n}\n\nexport interface PaginatedResult<T> {\n /** Data items */\n data: T[];\n /** Total count of items */\n total: number;\n /** Current page */\n page: number;\n /** Page size */\n pageSize: number;\n /** Total pages */\n totalPages: number;\n /** Has next page */\n hasNext: boolean;\n /** Has previous page */\n hasPrevious: boolean;\n}\n\nexport interface SortOptions {\n /** Field to sort by */\n field: string;\n /** Sort direction */\n direction: 'asc' | 'desc';\n}\n\nexport interface FilterOptions {\n /** Field to filter */\n field: string;\n /** Operator */\n operator: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin' | 'like' | 'ilike';\n /** Value to compare */\n value: unknown;\n}\n\n/**\n * Database Module\n */\nexport class DatabaseModule {\n /**\n * Create Prisma client configuration\n */\n public static createPrismaConfig(config: PrismaConfig): Record<string, unknown> {\n logger.debug('[Database] Creating Prisma config');\n\n const prismaConfig: Record<string, unknown> = {\n datasources: {\n db: {\n url: config.url,\n },\n },\n log: config.log || ['error', 'warn'],\n errorFormat: config.errorFormat || 'colorless',\n };\n\n if (config.connectionTimeout) {\n prismaConfig['connectionTimeout'] = config.connectionTimeout;\n }\n\n if (config.queryTimeout) {\n prismaConfig['queryTimeout'] = config.queryTimeout;\n }\n\n logger.info('[Database] Prisma config created');\n\n return prismaConfig;\n }\n\n /**\n * Build pagination parameters\n */\n public static buildPagination(options: PaginationOptions): {\n skip: number;\n take: number;\n page: number;\n pageSize: number;\n } {\n let page = options.page || 1;\n let pageSize = options.pageSize || 20;\n\n // Handle offset/limit if provided instead of page/pageSize\n if (options.offset !== undefined || options.limit !== undefined) {\n const offset = options.offset || 0;\n const limit = options.limit || 20;\n pageSize = limit;\n page = Math.floor(offset / limit) + 1;\n }\n\n // Validate\n if (page < 1) {\n page = 1;\n }\n\n if (pageSize < 1) {\n pageSize = 20;\n }\n\n if (pageSize > 100) {\n pageSize = 100; // Max page size\n }\n\n const skip = (page - 1) * pageSize;\n const take = pageSize;\n\n return { skip, take, page, pageSize };\n }\n\n /**\n * Create paginated result\n */\n public static createPaginatedResult<T>(data: T[], total: number, page: number, pageSize: number): PaginatedResult<T> {\n const totalPages = Math.ceil(total / pageSize);\n\n return {\n data,\n total,\n page,\n pageSize,\n totalPages,\n hasNext: page < totalPages,\n hasPrevious: page > 1,\n };\n }\n\n /**\n * Build Prisma where clause from filters\n */\n public static buildWhereClause(filters: FilterOptions[]): Record<string, unknown> {\n const where: Record<string, unknown> = {};\n\n for (const filter of filters) {\n const { field, operator, value } = filter;\n\n switch (operator) {\n case 'eq':\n where[field] = value;\n break;\n case 'ne':\n where[field] = { not: value };\n break;\n case 'gt':\n where[field] = { gt: value };\n break;\n case 'gte':\n where[field] = { gte: value };\n break;\n case 'lt':\n where[field] = { lt: value };\n break;\n case 'lte':\n where[field] = { lte: value };\n break;\n case 'in':\n where[field] = { in: value };\n break;\n case 'nin':\n where[field] = { notIn: value };\n break;\n case 'like':\n where[field] = { contains: value };\n break;\n case 'ilike':\n where[field] = { contains: value, mode: 'insensitive' };\n break;\n }\n }\n\n return where;\n }\n\n /**\n * Build Prisma orderBy clause from sort options\n */\n public static buildOrderByClause(sorts: SortOptions[]): Record<string, string>[] {\n return sorts.map((sort) => ({\n [sort.field]: sort.direction,\n }));\n }\n\n /**\n * Parse database URL\n */\n public static parseDatabaseUrl(url: string): {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n } {\n try {\n const urlObj = new URL(url);\n\n const params: Record<string, string> = {};\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return {\n protocol: urlObj.protocol.replace(':', ''),\n host: urlObj.hostname,\n port: urlObj.port ? parseInt(urlObj.port, 10) : undefined,\n database: urlObj.pathname.substring(1),\n username: urlObj.username || undefined,\n password: urlObj.password || undefined,\n params: Object.keys(params).length > 0 ? params : undefined,\n };\n } catch (error) {\n throw new ValidationError('Invalid database URL', {\n url,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Build database URL\n */\n public static buildDatabaseUrl(options: {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n }): string {\n let url = `${options.protocol}://`;\n\n if (options.username) {\n url += options.username;\n if (options.password) {\n url += `:${options.password}`;\n }\n url += '@';\n }\n\n url += options.host;\n\n if (options.port) {\n url += `:${options.port}`;\n }\n\n url += `/${options.database}`;\n\n if (options.params && Object.keys(options.params).length > 0) {\n const params = new URLSearchParams(options.params);\n url += `?${params.toString()}`;\n }\n\n return url;\n }\n\n /**\n * Sanitize database URL for logging (remove password)\n */\n public static sanitizeDatabaseUrl(url: string): string {\n try {\n const urlObj = new URL(url);\n if (urlObj.password) {\n // eslint-disable-next-line sonarjs/no-hardcoded-passwords -- Redacting password for logging, not hardcoding\n urlObj.password = '***';\n }\n return urlObj.toString();\n } catch {\n return url;\n }\n }\n\n /**\n * Validate database connection URL\n */\n public static validateDatabaseUrl(url: string): boolean {\n try {\n const parsed = this.parseDatabaseUrl(url);\n return !!(parsed.protocol && parsed.host && parsed.database);\n } catch {\n return false;\n }\n }\n\n /**\n * Create connection pool config\n */\n public static createPoolConfig(config: DatabaseConfig): {\n min: number;\n max: number;\n acquireTimeoutMillis: number;\n idleTimeoutMillis: number;\n } {\n return {\n min: 2,\n max: config.poolSize || 10,\n acquireTimeoutMillis: config.connectionTimeout || 30000,\n idleTimeoutMillis: 30000,\n };\n }\n\n /**\n * Generate migration name\n */\n public static generateMigrationName(description: string): string {\n const timestamp = new Date().toISOString().replace(/[-:]/g, '').split('.')[0];\n\n // Convert to slug format\n let slug = description.toLowerCase().replace(/[^a-z0-9]+/g, '_');\n\n // Manually trim underscores to avoid slow-regex warning\n while (slug.startsWith('_')) {\n slug = slug.slice(1);\n }\n while (slug.endsWith('_')) {\n slug = slug.slice(0, -1);\n }\n\n return `${timestamp}_${slug}`;\n }\n\n /**\n * Build select clause for specific fields\n */\n public static buildSelectClause(fields: string[]): Record<string, boolean> {\n const select: Record<string, boolean> = {};\n for (const field of fields) {\n select[field] = true;\n }\n return select;\n }\n\n /**\n * Build include clause for relations\n */\n public static buildIncludeClause(relations: string[]): Record<string, boolean> {\n const include: Record<string, boolean> = {};\n for (const relation of relations) {\n include[relation] = true;\n }\n return include;\n }\n\n /**\n * Retry database operation\n */\n public static async retry<T>(\n operation: () => Promise<T>,\n options: {\n maxAttempts?: number;\n delay?: number;\n backoff?: number;\n } = {}\n ): Promise<T> {\n const maxAttempts = options.maxAttempts || 3;\n const initialDelay = options.delay || 1000;\n const backoff = options.backoff || 2;\n\n let lastError: Error | undefined;\n let delay = initialDelay;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n logger.warn(`[Database] Operation failed (attempt ${attempt}/${maxAttempts})`, { error });\n\n if (attempt < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay *= backoff;\n }\n }\n }\n\n throw lastError || new Error('Database operation failed after retries');\n }\n\n /**\n * Execute in transaction\n */\n public static async transaction<T>(\n prisma: unknown,\n operations: Array<(tx: unknown) => Promise<unknown>>\n ): Promise<T[]> {\n logger.debug('[Database] Starting transaction');\n\n if (!prisma || typeof prisma !== 'object' || !('$transaction' in prisma)) {\n throw new ValidationError('Invalid Prisma client provided');\n }\n\n const client = prisma as { $transaction: (ops: Array<Promise<unknown>>) => Promise<unknown[]> };\n\n try {\n const promises = operations.map((op) => op(prisma));\n const results = await client.$transaction(promises);\n\n logger.info('[Database] Transaction completed successfully');\n\n return results as T[];\n } catch (error) {\n logger.error('[Database] Transaction failed', { error });\n throw error;\n }\n }\n\n /**\n * Check database health\n */\n public static async healthCheck(prisma: unknown): Promise<boolean> {\n try {\n if (!prisma || typeof prisma !== 'object' || !('$queryRaw' in prisma)) {\n return false;\n }\n\n const client = prisma as { $queryRaw: (query: unknown) => Promise<unknown> };\n\n // Simple query to check connection\n await client.$queryRaw`SELECT 1`;\n\n return true;\n } catch (error) {\n logger.error('[Database] Health check failed', { error });\n return false;\n }\n }\n\n /**\n * Format Prisma error for user-friendly message\n */\n public static formatPrismaError(error: unknown): string {\n if (!error || typeof error !== 'object') {\n return 'Database error occurred';\n }\n\n const err = error as { code?: string; meta?: { target?: string[] } };\n\n switch (err.code) {\n case 'P2002':\n return `A record with this ${err.meta?.target?.join(', ') || 'value'} already exists`;\n case 'P2025':\n return 'Record not found';\n case 'P2003':\n return 'Foreign key constraint failed';\n case 'P2016':\n return 'Query interpretation error';\n case 'P2021':\n return 'Table does not exist in the database';\n case 'P2022':\n return 'Column does not exist in the database';\n default:\n return 'Database operation failed';\n }\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { ValidationError, PermissionDeniedError } from './chunk-SAG6ZYWQ.js';
1
+ import { ValidationError, PermissionDeniedError } from './chunk-RTQIRGVB.js';
2
2
  import { DEFAULT_GATEWAY_ROUTING } from './chunk-NGMEI42S.js';
3
3
  import { logger } from './chunk-CBZNP6RF.js';
4
4
  import { __name } from './chunk-XE4OXN2W.js';
@@ -1480,5 +1480,5 @@ var RBACModule = class {
1480
1480
  };
1481
1481
 
1482
1482
  export { RBACClient, RBACModule, createRBACDirective, createRBACDirectiveForLayer, createRBACDirectiveFromEnv };
1483
- //# sourceMappingURL=chunk-J26YGR2U.js.map
1484
- //# sourceMappingURL=chunk-J26YGR2U.js.map
1483
+ //# sourceMappingURL=chunk-ER77ZA7C.js.map
1484
+ //# sourceMappingURL=chunk-ER77ZA7C.js.map