@burdenoff/be-sdk 2026.516.5 → 2026.518.1
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.
- package/dist/{chunk-TKBD2ONF.js → chunk-5CESUKWC.js} +2 -2
- package/dist/{chunk-TKBD2ONF.js.map → chunk-5CESUKWC.js.map} +1 -1
- package/dist/{chunk-MM3BD756.js → chunk-EZOXXSD4.js} +2 -2
- package/dist/chunk-EZOXXSD4.js.map +1 -0
- package/dist/{chunk-ZPJ6VYE4.js → chunk-QLEZPUAV.js} +12 -10
- package/dist/chunk-QLEZPUAV.js.map +1 -0
- package/dist/{chunk-IFES3AQS.js → chunk-S5S6OBS6.js} +3 -3
- package/dist/{chunk-IFES3AQS.js.map → chunk-S5S6OBS6.js.map} +1 -1
- package/dist/{chunk-CPO7ZXUQ.js → chunk-UFQQSQG6.js} +2 -2
- package/dist/{chunk-CPO7ZXUQ.js.map → chunk-UFQQSQG6.js.map} +1 -1
- package/dist/database/index.js +1 -1
- package/dist/graph/index.js +2 -2
- package/dist/index.js +8 -8
- package/dist/init/index.js +1 -1
- package/dist/prisma/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-MM3BD756.js.map +0 -1
- package/dist/chunk-ZPJ6VYE4.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/prisma/index.ts","../src/prisma/client.ts","../src/prisma/factory.ts","../src/prisma/manager.ts","../src/prisma/health.ts","../src/prisma/fields.ts","../src/prisma/context.ts"],"names":["createConnectionPool","config","Pool","connectionString","databaseUrl","max","maxConnections","idleTimeoutMillis","connectionTimeoutMillis","createPrismaAdapter","pool","PrismaPg","configurePrismaLogging","client","isDevelopment","process","env","slowQueryThreshold","enableQueryLogging","$on","e","duration","logger","warn","query","substring","length","params","debug","error","message","target","PrismaClientWrapper","connectionState","isConnected","attempts","isDisconnecting","getClient","getPool","getConnectionState","connect","retries","delay","info","attempt","$connect","lastConnectedAt","Date","lastError","undefined","errorMessage","Error","String","waitTime","Math","pow","Promise","resolve","setTimeout","disconnect","$disconnect","end","includes","registerShutdownHandlers","shutdownHandler","signal","exit","on","createPrismaClient","PrismaClientConstructor","adapter","logLevels","emit","level","log","createDatabaseClient","productName","enableGraphExtension","graphEventEmitter","enableWorkspaceExtension","workspaceExtensionConfig","prismaConfig","wrapper","baseClient","extendedClient","eventEmitter","getGraphEventEmitter","graphConfig","enabled","addGraphExtension","addWorkspaceExtension","db","createDatabaseClientFromEnv","overrides","parseInt","state","initialized","initializeDatabase","initializeDatabaseWithConfig","getDb","getDatabaseManager","isDatabaseInitialized","getDatabaseProductName","resetDatabaseManager","checkDatabaseHealth","start","now","$queryRaw","latency","healthy","testConnection","getDatabaseVersion","result","version","getDatabaseStats","health","all","timestamp","requireFn","createRequire","url","loadGeneratedFields","generatedFieldsPath","generated","default","path","extractFieldsFromModel","modelName","modelFieldsMap","options","modelFields","Object","keys","join","excludeFields","includeRelations","customFilter","fields","relations","excluded","filter","field","push","fieldName","isRelation","shouldInclude","name","type","metadata","totalFields","excludedCount","excludedFields","relationFields","getModelFields","hasModel","getAllModelNames","buildContextWhereClause","contextFilter","conditions","workspaceId","equals","userId","projectId","appId","productId","organizationId","buildContextWhereConditions","context","toContextJson","contextInput","custom","filterNullValues","obj","filtered","key","value","entries","mergeContextField","merged","fieldValue","mergeContext","existingContext","newContext","Array","isArray","parseContext","contextJson","ctx","contextMatches","createContextFromSDK","sdkContext"],"mappings":"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","file":"chunk-IFES3AQS.js","sourcesContent":["/**\n * Prisma Module for Burdenoff Backend SDK\n *\n * Provides Prisma 7 utilities including:\n * - Singleton database manager for microservices\n * - Unified database client factory with graph extension\n * - Prisma client configuration with PostgreSQL adapter\n * - Connection pooling and management\n * - Health checks and monitoring\n * - Graceful shutdown handling\n * - Field extraction utilities for graph sync\n * - Context filtering utilities for multi-tenant queries\n * - Workspace extension for automatic workspaceId injection\n *\n * @module prisma\n * @category Database\n */\n\nexport * from './manager.js';\nexport * from './factory.js';\nexport * from './client.js';\nexport type * from './types.js';\nexport * from './health.js';\nexport * from './fields.js';\nexport * from './context.js';\nexport * from './workspace-extension.js';\n","/**\n * Prisma 7 Client Factory with PostgreSQL Adapter\n *\n * This module provides a generic factory for creating Prisma clients\n * configured with the PostgreSQL driver adapter as required by Prisma 7.\n *\n * Breaking Changes in Prisma 7:\n * - Must use database driver adapter (@prisma/adapter-pg for PostgreSQL)\n * - Datasource URL moved from schema.prisma to prisma.config.ts\n * - DMMF no longer available at runtime (use generator for build-time access)\n *\n * @module prisma/client\n */\n\nimport { PrismaPg } from '@prisma/adapter-pg';\nimport { Pool } from 'pg';\nimport { logger } from '../logger/index.js';\nimport type { PrismaClientConfig, ConnectionState } from './types.js';\n\n/**\n * Prisma event object types\n */\nexport interface PrismaQueryEvent {\n query: string;\n params: string;\n duration: number;\n target?: string;\n}\n\nexport interface PrismaLogEvent {\n message: string;\n target?: string;\n}\n\nexport type PrismaEvent = PrismaQueryEvent | PrismaLogEvent;\n\n/**\n * Transaction options for Prisma $transaction method\n */\nexport interface PrismaTransactionOptions {\n maxWait?: number;\n timeout?: number;\n isolationLevel?: string;\n}\n\n/**\n * Base Prisma client interface with required methods\n *\n * This interface defines the MINIMUM contract required for server bootstrapping.\n * It only includes methods actually used by the SDK's server module.\n *\n * Note: Service-specific model properties (e.g., universalTag, user, workspace, etc.)\n * and full method signatures should be accessed by casting to the service's\n * generated Prisma client type.\n *\n * @example\n * ```typescript\n * // In your service's context type:\n * import type { PrismaClient } from './generated/prisma/client.js';\n * import type { GraphQLContext } from '@burdenoff/be-sdk';\n *\n * export interface Context extends GraphQLContext {\n * db: PrismaClient;\n * }\n * ```\n */\nexport interface PrismaClientBase {\n /** Connect to the database */\n $connect(): Promise<void>;\n /** Disconnect from the database */\n $disconnect(): Promise<void>;\n /** Register event handlers for logging */\n $on(event: string, callback: (e: PrismaEvent) => void): void;\n /** Execute a raw SQL query */\n $queryRaw<T = unknown>(query: TemplateStringsArray, ...values: unknown[]): Promise<T>;\n}\n\n/**\n * Database client return type for getDb()\n *\n * Returns the service's PrismaClient type (T) with a `client` property\n * for backwards compatibility. All model access and typing comes from\n * the service's own generated Prisma types.\n *\n * @example\n * ```typescript\n * // In your service - import YOUR generated PrismaClient\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { getDb } from '@burdenoff/be-sdk/prisma';\n *\n * // Pass your PrismaClient type for full type safety\n * const db = getDb<PrismaClient>();\n * const tags = await db.client.universalTag.findMany(); // Fully typed!\n * ```\n */\nexport type DatabaseReturnType<T extends PrismaClientBase = PrismaClientBase> = T & {\n /**\n * Client property for explicit model access.\n * This is the same as the db object itself, provided for API consistency.\n */\n client: T;\n};\n\n/**\n * Create a PostgreSQL connection pool\n */\nexport function createConnectionPool(config: PrismaClientConfig): Pool {\n return new Pool({\n connectionString: config.databaseUrl,\n max: config.maxConnections ?? 20,\n idleTimeoutMillis: config.idleTimeoutMillis ?? 30000,\n connectionTimeoutMillis: config.connectionTimeoutMillis ?? 10000,\n });\n}\n\n/**\n * Create a Prisma PostgreSQL adapter\n */\nexport function createPrismaAdapter(pool: Pool): PrismaPg {\n return new PrismaPg(pool);\n}\n\n/**\n * Configure Prisma client logging\n */\nexport function configurePrismaLogging<T extends PrismaClientBase>(client: T, config: PrismaClientConfig): T {\n const isDevelopment = process.env['NODE_ENV'] === 'development';\n const slowQueryThreshold = config.slowQueryThreshold ?? (isDevelopment ? 100 : 500);\n\n // Query logging\n if (config.enableQueryLogging ?? isDevelopment) {\n client.$on('query', (e: PrismaEvent) => {\n if ('query' in e && 'duration' in e) {\n if (e.duration > slowQueryThreshold) {\n logger.warn('[Prisma] Slow query detected', {\n query: e.query.substring(0, 200) + (e.query.length > 200 ? '...' : ''),\n params: e.params,\n duration: `${e.duration}ms`,\n });\n } else {\n logger.debug('[Prisma] Query', {\n query: e.query.substring(0, 100) + (e.query.length > 100 ? '...' : ''),\n duration: `${e.duration}ms`,\n });\n }\n }\n });\n }\n\n // Error logging\n client.$on('error', (e: PrismaEvent) => {\n if ('message' in e) {\n logger.error('[Prisma] Database error', {\n message: e.message,\n target: e.target,\n });\n }\n });\n\n // Warning logging\n client.$on('warn', (e: PrismaEvent) => {\n if ('message' in e) {\n logger.warn('[Prisma] Database warning', {\n message: e.message,\n target: e.target,\n });\n }\n });\n\n return client;\n}\n\n/**\n * Prisma Client Wrapper with connection management\n */\nexport class PrismaClientWrapper<T extends PrismaClientBase> {\n private client: T;\n private pool: Pool;\n private connectionState: ConnectionState = {\n isConnected: false,\n attempts: 0,\n };\n private isDisconnecting = false;\n\n constructor(client: T, pool: Pool, config: PrismaClientConfig) {\n this.client = client;\n this.pool = pool;\n\n // Configure logging\n configurePrismaLogging(this.client, config);\n }\n\n /**\n * Get the Prisma client instance\n */\n public getClient(): T {\n return this.client;\n }\n\n /**\n * Get the connection pool\n */\n public getPool(): Pool {\n return this.pool;\n }\n\n /**\n * Get connection state\n */\n public getConnectionState(): ConnectionState {\n return { ...this.connectionState };\n }\n\n /**\n * Connect to database with retry logic\n */\n public async connect(retries = 5, delay = 1000): Promise<void> {\n if (this.connectionState.isConnected) {\n logger.info('[Prisma] Already connected to database');\n return;\n }\n\n for (let attempt = 1; attempt <= retries; attempt++) {\n this.connectionState.attempts = attempt;\n\n try {\n await this.client.$connect();\n this.connectionState.isConnected = true;\n this.connectionState.lastConnectedAt = new Date();\n this.connectionState.lastError = undefined;\n\n logger.info('[Prisma] Successfully connected to database');\n return;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.connectionState.lastError = errorMessage;\n\n logger.error(`[Prisma] Connection attempt ${attempt}/${retries} failed`, {\n error: errorMessage,\n });\n\n if (attempt === retries) {\n logger.error('[Prisma] Max connection retries reached');\n throw error;\n }\n\n // Exponential backoff\n const waitTime = delay * Math.pow(2, attempt - 1);\n logger.info(`[Prisma] Retrying in ${waitTime}ms...`);\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n }\n }\n }\n\n /**\n * Gracefully disconnect from database\n */\n public async disconnect(): Promise<void> {\n // Guard against multiple disconnect calls\n if (this.isDisconnecting) {\n logger.debug('[Prisma] Disconnect already in progress, skipping');\n return;\n }\n\n if (!this.connectionState.isConnected) {\n logger.info('[Prisma] Database already disconnected');\n return;\n }\n\n // Mark as disconnecting to prevent concurrent disconnect calls\n this.isDisconnecting = true;\n\n try {\n await this.client.$disconnect();\n await this.pool.end();\n this.connectionState.isConnected = false;\n\n logger.info('[Prisma] Successfully disconnected from database');\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Ignore \"Called end on pool more than once\" errors\n if (errorMessage.includes('Called end on pool more than once')) {\n logger.debug('[Prisma] Pool already ended, ignoring duplicate end call');\n this.connectionState.isConnected = false;\n return;\n }\n\n logger.error('[Prisma] Error disconnecting from database', {\n error: errorMessage,\n });\n throw error;\n } finally {\n this.isDisconnecting = false;\n }\n }\n\n /**\n * Register graceful shutdown handlers\n */\n public registerShutdownHandlers(): void {\n const shutdownHandler = async (signal: string): Promise<void> => {\n logger.info(`[Prisma] Received ${signal}, starting graceful shutdown...`);\n\n try {\n await this.disconnect();\n process.exit(0);\n } catch (error) {\n logger.error('[Prisma] Error during graceful shutdown', {\n error: error instanceof Error ? error.message : String(error),\n });\n process.exit(1);\n }\n };\n\n // Register shutdown handlers\n process.on('SIGINT', () => void shutdownHandler('SIGINT'));\n process.on('SIGTERM', () => void shutdownHandler('SIGTERM'));\n process.on('beforeExit', () => void this.disconnect());\n }\n}\n\n/**\n * Create a configured Prisma client wrapper\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { createPrismaClient } from '@burdenoff/be-sdk';\n *\n * const wrapper = createPrismaClient(PrismaClient, {\n * databaseUrl: process.env.DATABASE_URL!,\n * });\n *\n * await wrapper.connect();\n * const prisma = wrapper.getClient();\n *\n * // Use prisma client\n * const users = await prisma.user.findMany();\n * ```\n */\n/**\n * Prisma log level options\n */\nexport type PrismaLogLevel = 'info' | 'query' | 'warn' | 'error';\n\n/**\n * Prisma log definition\n */\nexport interface PrismaLogDefinition {\n level: PrismaLogLevel;\n emit: 'stdout' | 'event';\n}\n\n/**\n * Prisma client constructor options\n */\nexport interface PrismaClientConstructorOptions {\n adapter: PrismaPg;\n log?: (PrismaLogLevel | PrismaLogDefinition)[];\n}\n\nexport function createPrismaClient<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n config: PrismaClientConfig\n): PrismaClientWrapper<T> {\n const isDevelopment = process.env['NODE_ENV'] === 'development';\n\n // Create connection pool\n const pool = createConnectionPool(config);\n\n // Create adapter\n const adapter = createPrismaAdapter(pool);\n\n // Determine log levels\n const logLevels: PrismaLogDefinition[] =\n (config.logLevels as PrismaLogDefinition[] | undefined) ??\n (isDevelopment\n ? [\n { emit: 'event', level: 'query' },\n { emit: 'event', level: 'info' },\n { emit: 'event', level: 'warn' },\n { emit: 'event', level: 'error' },\n ]\n : [\n { emit: 'event', level: 'warn' },\n { emit: 'event', level: 'error' },\n ]);\n\n // Create Prisma client\n const client = new PrismaClientConstructor({\n adapter,\n log: logLevels,\n });\n\n // Create and return wrapper\n return new PrismaClientWrapper(client, pool, config);\n}\n","/**\n * Database Client Factory\n *\n * Provides a unified factory for creating fully-configured database clients\n * with Prisma 7, PostgreSQL adapter, graph extension, and graceful shutdown.\n *\n * This module consolidates all database setup into a single call, reducing\n * boilerplate across all backend services.\n *\n * @module prisma/factory\n * @category Database\n */\n\nimport { logger } from '../logger/index.js';\nimport {\n createPrismaClient,\n type PrismaClientBase,\n type PrismaClientWrapper,\n type PrismaClientConstructorOptions,\n} from './client.js';\nimport type { PrismaClientConfig } from './types.js';\nimport { addGraphExtension, type GraphMiddlewareConfig, type GraphEventEmitter } from '../graph/middleware/index.js';\nimport { getGraphEventEmitter } from '../event-queue/graph-emitter.js';\nimport { addWorkspaceExtension, type WorkspaceExtensionConfig } from './workspace-extension.js';\n\n/**\n * Configuration for creating a database client\n */\nexport interface DatabaseClientConfig extends PrismaClientConfig {\n /**\n * Product name for graph events (e.g., 'module-tags', 'workspaces')\n */\n productName: string;\n\n /**\n * Enable graph extension for entity sync\n * @default true (reads from GRAPH_MIDDLEWARE_ENABLED env var)\n */\n enableGraphExtension?: boolean;\n\n /**\n * Custom graph event emitter (defaults to NATS-based emitter)\n */\n graphEventEmitter?: GraphEventEmitter;\n\n /**\n * Enable workspace extension for automatic workspaceId injection\n * @default true (reads from WORKSPACE_EXTENSION_ENABLED env var)\n */\n enableWorkspaceExtension?: boolean;\n\n /**\n * Configuration for the workspace extension\n */\n workspaceExtensionConfig?: WorkspaceExtensionConfig;\n\n /**\n * Register process shutdown handlers for graceful shutdown\n * @default true\n */\n registerShutdownHandlers?: boolean;\n}\n\n/**\n * Result of creating a database client\n */\nexport interface DatabaseClient<T extends PrismaClientBase> {\n /**\n * The extended Prisma client for database operations\n * Use this for all queries: db.model.operation()\n */\n db: T & { client: T };\n\n /**\n * The Prisma client wrapper with connection management utilities\n */\n wrapper: PrismaClientWrapper<T>;\n\n /**\n * Connect to the database with retry logic\n */\n connect: (retries?: number, delay?: number) => Promise<void>;\n\n /**\n * Disconnect from the database\n */\n disconnect: () => Promise<void>;\n}\n\n/**\n * Create a fully-configured database client with graph extension\n *\n * This is the recommended way to create a database connection in all backend services.\n * It handles:\n * - Prisma client creation with PostgreSQL adapter\n * - Connection pooling configuration\n * - Query logging (in development)\n * - Graph extension for entity sync (via NATS or in-memory)\n * - Graceful shutdown handlers\n *\n * @example\n * ```typescript\n * // In your service's db.ts\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { createDatabaseClient } from '@burdenoff/be-sdk/prisma';\n *\n * const { db, wrapper, connect, disconnect } = createDatabaseClient(PrismaClient, {\n * productName: 'my-service',\n * databaseUrl: process.env.DATABASE_URL!,\n * });\n *\n * export { db, wrapper, connect, disconnect };\n * export type ExtendedPrismaClient = typeof db;\n * ```\n *\n * @example\n * ```typescript\n * // With custom configuration\n * const { db } = createDatabaseClient(PrismaClient, {\n * productName: 'workspaces',\n * databaseUrl: process.env.DATABASE_URL!,\n * maxConnections: 50,\n * enableQueryLogging: true,\n * slowQueryThreshold: 200,\n * enableGraphExtension: true,\n * registerShutdownHandlers: true,\n * });\n * ```\n */\nexport function createDatabaseClient<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n config: DatabaseClientConfig\n): DatabaseClient<T> {\n const {\n productName,\n enableGraphExtension = process.env['GRAPH_MIDDLEWARE_ENABLED'] !== 'false',\n graphEventEmitter,\n enableWorkspaceExtension = process.env['WORKSPACE_EXTENSION_ENABLED'] !== 'false',\n workspaceExtensionConfig,\n registerShutdownHandlers = true,\n ...prismaConfig\n } = config;\n\n // Create Prisma client wrapper\n const wrapper = createPrismaClient(PrismaClientConstructor, prismaConfig);\n\n // Get the base client\n const baseClient = wrapper.getClient();\n\n // Extension chaining order:\n // 1. Graph extension (event emission on CRUD) - runs first\n // 2. Workspace extension (auto-inject workspaceId) - runs second\n //\n // The workspace extension should run BEFORE graph extension in the\n // interception chain so that graph events include the injected workspaceId.\n // In Prisma $extends, the LAST extension added runs FIRST (outermost wrapper).\n // So we add graph first, then workspace on top.\n\n let extendedClient: T;\n\n // Step 1: Add graph extension\n if (enableGraphExtension) {\n const eventEmitter = graphEventEmitter ?? getGraphEventEmitter();\n\n const graphConfig: GraphMiddlewareConfig = {\n enabled: true,\n productName,\n eventEmitter,\n };\n\n extendedClient = addGraphExtension(baseClient, graphConfig);\n\n logger.info('[Database] Graph extension enabled', { productName });\n } else {\n extendedClient = baseClient;\n logger.info('[Database] Graph extension disabled');\n }\n\n // Step 2: Add workspace extension (wraps on top of graph)\n if (enableWorkspaceExtension) {\n extendedClient = addWorkspaceExtension(extendedClient, workspaceExtensionConfig);\n\n logger.info('[Database] Workspace extension enabled', { productName });\n } else {\n logger.info('[Database] Workspace extension disabled');\n }\n\n // Add backwards compatibility alias\n const db = extendedClient as T & { client: T };\n (db as unknown as Record<string, unknown>)['client'] = db;\n\n // Register shutdown handlers if requested\n if (registerShutdownHandlers) {\n wrapper.registerShutdownHandlers();\n logger.debug('[Database] Shutdown handlers registered');\n }\n\n return {\n db,\n wrapper,\n connect: (retries?: number, delay?: number) => wrapper.connect(retries, delay),\n disconnect: () => wrapper.disconnect(),\n };\n}\n\n/**\n * Create a database client from environment variables\n *\n * Convenience function that reads configuration from standard environment variables:\n * - DATABASE_URL: Connection string (required)\n * - DATABASE_MAX_CONNECTIONS: Max pool connections (default: 20)\n * - NODE_ENV: Environment for logging settings\n * - GRAPH_MIDDLEWARE_ENABLED: Enable graph sync (default: true)\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { createDatabaseClientFromEnv } from '@burdenoff/be-sdk/prisma';\n *\n * const { db } = createDatabaseClientFromEnv(PrismaClient, 'module-tags');\n * export { db };\n * ```\n */\nexport function createDatabaseClientFromEnv<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n productName: string,\n overrides?: Partial<DatabaseClientConfig>\n): DatabaseClient<T> {\n const databaseUrl = process.env['DATABASE_URL'];\n if (!databaseUrl) {\n throw new Error('DATABASE_URL environment variable is required');\n }\n\n const isDevelopment = process.env['NODE_ENV'] === 'development';\n\n const config: DatabaseClientConfig = {\n productName,\n databaseUrl,\n maxConnections: parseInt(process.env['DATABASE_MAX_CONNECTIONS'] || '20', 10),\n idleTimeoutMillis: parseInt(process.env['DATABASE_IDLE_TIMEOUT'] || '30000', 10),\n connectionTimeoutMillis: parseInt(process.env['DATABASE_CONNECTION_TIMEOUT'] || '10000', 10),\n enableQueryLogging: isDevelopment,\n slowQueryThreshold: isDevelopment ? 100 : 500,\n ...overrides,\n };\n\n return createDatabaseClient(PrismaClientConstructor, config);\n}\n","/**\n * Database Singleton Manager\n *\n * Provides a singleton pattern for database connections across microservices.\n * Services initialize once at startup and access the db instance globally.\n *\n * This eliminates the need for individual db.ts files in each microservice.\n *\n * @module prisma/manager\n * @category Database\n *\n * @example\n * ```typescript\n * // In your service's index.ts (startup)\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { initializeDatabase } from '@burdenoff/be-sdk/prisma';\n *\n * // Initialize once at startup\n * const { db, connect } = initializeDatabase(PrismaClient, 'module-tags');\n * await connect();\n *\n * // In any other file\n * import { getDb } from '@burdenoff/be-sdk/prisma';\n * const db = getDb();\n * await db.client.user.findMany();\n * ```\n */\n\nimport { logger } from '../logger/index.js';\nimport {\n createDatabaseClient,\n createDatabaseClientFromEnv,\n type DatabaseClient,\n type DatabaseClientConfig,\n} from './factory.js';\nimport type { PrismaClientBase, PrismaClientConstructorOptions, DatabaseReturnType } from './client.js';\n\n/**\n * Global database manager state\n */\ninterface DatabaseManagerState {\n initialized: boolean;\n productName: string | null;\n client: DatabaseClient<PrismaClientBase> | null;\n}\n\n/**\n * Singleton state for the database manager\n */\nconst state: DatabaseManagerState = {\n initialized: false,\n productName: null,\n client: null,\n};\n\n/**\n * Initialize the database singleton\n *\n * Call this once at application startup with your service's PrismaClient.\n * After initialization, use `getDb()` to access the database anywhere.\n *\n * @param PrismaClientConstructor - The generated PrismaClient class from your service\n * @param productName - Product name for graph events (e.g., 'module-tags', 'workspaces')\n * @param config - Optional configuration overrides\n * @returns The database client with db, wrapper, connect, disconnect\n *\n * @throws Error if already initialized with a different product\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { initializeDatabase } from '@burdenoff/be-sdk/prisma';\n *\n * const { db, connect, disconnect } = initializeDatabase(PrismaClient, 'module-tags');\n * await connect();\n * ```\n */\nexport function initializeDatabase<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n productName: string,\n config?: Partial<DatabaseClientConfig>\n): DatabaseClient<T> {\n // Check if already initialized\n if (state.initialized) {\n if (state.productName !== productName) {\n throw new Error(\n `Database already initialized for product \"${state.productName}\". ` +\n `Cannot reinitialize for \"${productName}\".`\n );\n }\n logger.debug('[DatabaseManager] Already initialized, returning existing client', { productName });\n return state.client as DatabaseClient<T>;\n }\n\n // Create the database client using env-based factory\n const client = createDatabaseClientFromEnv(PrismaClientConstructor, productName, config);\n\n // Store in singleton state\n state.initialized = true;\n state.productName = productName;\n state.client = client;\n\n logger.info('[DatabaseManager] Database initialized', { productName });\n\n return client;\n}\n\n/**\n * Initialize the database with explicit configuration\n *\n * Use this when you need full control over database configuration\n * rather than reading from environment variables.\n *\n * @param PrismaClientConstructor - The generated PrismaClient class\n * @param config - Full database configuration\n * @returns The database client\n *\n * @example\n * ```typescript\n * const { db } = initializeDatabaseWithConfig(PrismaClient, {\n * productName: 'module-tags',\n * databaseUrl: 'postgresql://...',\n * maxConnections: 50,\n * enableGraphExtension: false,\n * });\n * ```\n */\nexport function initializeDatabaseWithConfig<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n config: DatabaseClientConfig\n): DatabaseClient<T> {\n const { productName } = config;\n\n // Check if already initialized\n if (state.initialized) {\n if (state.productName !== productName) {\n throw new Error(\n `Database already initialized for product \"${state.productName}\". ` +\n `Cannot reinitialize for \"${productName}\".`\n );\n }\n logger.debug('[DatabaseManager] Already initialized, returning existing client', { productName });\n return state.client as DatabaseClient<T>;\n }\n\n // Create the database client\n const client = createDatabaseClient(PrismaClientConstructor, config);\n\n // Store in singleton state\n state.initialized = true;\n state.productName = productName;\n state.client = client;\n\n logger.info('[DatabaseManager] Database initialized with custom config', { productName });\n\n return client;\n}\n\n/**\n * Get the initialized database client\n *\n * Use this anywhere in your application to access the database.\n * Must call `initializeDatabase()` first at application startup.\n *\n * The returned client provides dynamic model access - you can access any\n * model property (e.g., `db.client.user`, `db.client.universalTag`) and\n * TypeScript will allow common Prisma operations (findMany, create, etc.).\n *\n * @returns The extended Prisma client (db) with dynamic model access\n * @throws Error if database not initialized\n *\n * @example\n * ```typescript\n * import { getDb } from '@burdenoff/be-sdk/prisma';\n *\n * const db = getDb();\n * // Dynamic model access works without importing service-specific types\n * const tags = await db.client.universalTag.findMany();\n * const users = await db.client.user.findMany({ where: { active: true } });\n * ```\n */\nexport function getDb<T extends PrismaClientBase = PrismaClientBase>(): DatabaseReturnType<T> {\n if (!state.initialized || !state.client) {\n throw new Error('Database not initialized. Call initializeDatabase() at application startup before using getDb().');\n }\n return state.client.db as unknown as DatabaseReturnType<T>;\n}\n\n/**\n * Get the full database manager\n *\n * Returns the complete database client including wrapper, connect, and disconnect functions.\n * Useful when you need access to connection management utilities.\n *\n * @returns The full database client\n * @throws Error if database not initialized\n *\n * @example\n * ```typescript\n * import { getDatabaseManager } from '@burdenoff/be-sdk/prisma';\n *\n * const { db, wrapper, connect, disconnect } = getDatabaseManager();\n * await connect();\n * ```\n */\nexport function getDatabaseManager<T extends PrismaClientBase = PrismaClientBase>(): DatabaseClient<T> {\n if (!state.initialized || !state.client) {\n throw new Error(\n 'Database not initialized. Call initializeDatabase() at application startup before using getDatabaseManager().'\n );\n }\n return state.client as DatabaseClient<T>;\n}\n\n/**\n * Check if database is initialized\n *\n * @returns True if database has been initialized\n *\n * @example\n * ```typescript\n * if (!isDatabaseInitialized()) {\n * await initializeDatabase(PrismaClient, 'my-service');\n * }\n * ```\n */\nexport function isDatabaseInitialized(): boolean {\n return state.initialized;\n}\n\n/**\n * Get the product name of the initialized database\n *\n * @returns The product name or null if not initialized\n */\nexport function getDatabaseProductName(): string | null {\n return state.productName;\n}\n\n/**\n * Reset the database manager (for testing purposes only)\n *\n * WARNING: This disconnects and resets the database manager.\n * Only use this in test environments for cleanup between tests.\n *\n * @internal\n */\nexport async function resetDatabaseManager(): Promise<void> {\n if (state.client) {\n try {\n await state.client.disconnect();\n } catch (error) {\n logger.warn('[DatabaseManager] Error during disconnect on reset', { error });\n }\n }\n\n state.initialized = false;\n state.productName = null;\n state.client = null;\n\n logger.debug('[DatabaseManager] Database manager reset');\n}\n","/**\n * Prisma Health Check Utilities\n */\n\nimport { logger } from '../logger/index.js';\nimport type { DatabaseHealth } from './types.js';\nimport type { PrismaClientBase } from './client.js';\n\n/**\n * Check database health\n */\nexport async function checkDatabaseHealth<T extends PrismaClientBase>(client: T): Promise<DatabaseHealth> {\n try {\n const start = Date.now();\n await client.$queryRaw`SELECT 1`;\n const latency = Date.now() - start;\n\n return { healthy: true, latency };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error('[Prisma] Health check failed', { error: errorMessage });\n\n return {\n healthy: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * Test database connection\n */\nexport async function testConnection<T extends PrismaClientBase>(client: T): Promise<boolean> {\n try {\n await client.$queryRaw`SELECT 1`;\n return true;\n } catch (error) {\n logger.error('[Prisma] Connection test failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n}\n\n/**\n * Get database version\n */\nexport async function getDatabaseVersion<T extends PrismaClientBase>(client: T): Promise<string | null> {\n try {\n const result = await client.$queryRaw<Array<{ version?: string }>>`SELECT version()`;\n return result[0]?.version ?? null;\n } catch (error) {\n logger.error('[Prisma] Failed to get database version', {\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n}\n\n/**\n * Get database stats\n */\nexport async function getDatabaseStats<T extends PrismaClientBase>(\n client: T\n): Promise<{\n health: DatabaseHealth;\n version: string | null;\n timestamp: Date;\n}> {\n const [health, version] = await Promise.all([checkDatabaseHealth(client), getDatabaseVersion(client)]);\n\n return {\n health,\n version,\n timestamp: new Date(),\n };\n}\n","/**\n * Prisma Field Extraction Utilities\n *\n * Provides utilities for extracting model fields from Prisma schema.\n * In Prisma 7, DMMF is not available at runtime, so this module provides\n * build-time field extraction through a generator.\n *\n * @module prisma/fields\n */\n\nimport { createRequire } from 'node:module';\nimport { logger } from '../logger/index.js';\n\nconst requireFn = createRequire(import.meta.url);\n\n/**\n * Field extraction options\n */\nexport interface FieldExtractionOptions {\n /** Fields to exclude from extraction */\n excludeFields?: string[];\n /** Whether to include relation fields */\n includeRelations?: boolean;\n /** Custom filter function */\n customFilter?: (field: { name: string; type: string; isRelation: boolean }) => boolean;\n}\n\n/**\n * Field extraction result\n */\nexport interface FieldExtractionResult {\n /** Extracted field names */\n fields: string[];\n /** Metadata about the extraction */\n metadata: {\n /** Total number of fields found */\n totalFields: number;\n /** Number of fields excluded */\n excludedCount: number;\n /** Names of excluded fields */\n excludedFields: string[];\n /** Number of relation fields */\n relationFields: number;\n };\n}\n\n/**\n * Model fields mapping\n * This will be generated at build time by the Prisma generator\n */\nexport type ModelFieldsMap = Record<\n string,\n {\n fields: string[];\n relations: string[];\n }\n>;\n\n/**\n * Import generated fields from the consuming package\n * This function should be used by backends to load their generated fields\n */\nexport function loadGeneratedFields(generatedFieldsPath: string): ModelFieldsMap {\n try {\n // Dynamic import of generated fields using createRequire\n const generated = requireFn(generatedFieldsPath) as { default: ModelFieldsMap };\n return generated.default || generated;\n } catch (error) {\n logger.error('[Prisma] Failed to load generated fields', {\n error: error instanceof Error ? error.message : String(error),\n path: generatedFieldsPath,\n });\n throw new Error(`Failed to load generated fields from ${generatedFieldsPath}`);\n }\n}\n\n/**\n * Extract fields from generated model fields with options\n */\nexport function extractFieldsFromModel(\n modelName: string,\n modelFieldsMap: ModelFieldsMap,\n options: FieldExtractionOptions = {}\n): FieldExtractionResult {\n const modelFields = modelFieldsMap[modelName];\n\n if (!modelFields) {\n throw new Error(\n `Model \"${modelName}\" not found in generated fields. ` +\n `Available models: ${Object.keys(modelFieldsMap).join(', ')}`\n );\n }\n\n const { excludeFields = [], includeRelations = false, customFilter } = options;\n\n // Start with scalar fields\n let fields = [...modelFields.fields];\n\n // Add relations if requested\n if (includeRelations) {\n fields = [...fields, ...modelFields.relations];\n }\n\n // Track excluded fields\n const excluded: string[] = [];\n\n // Apply exclusions\n if (excludeFields.length > 0) {\n fields = fields.filter((field) => {\n if (excludeFields.includes(field)) {\n excluded.push(field);\n return false;\n }\n return true;\n });\n }\n\n // Apply custom filter\n if (customFilter) {\n fields = fields.filter((fieldName) => {\n const isRelation = modelFields.relations.includes(fieldName);\n const shouldInclude = customFilter({\n name: fieldName,\n type: 'unknown', // Type information not available without full DMMF\n isRelation,\n });\n\n if (!shouldInclude) {\n excluded.push(fieldName);\n }\n\n return shouldInclude;\n });\n }\n\n return {\n fields,\n metadata: {\n totalFields: modelFields.fields.length + modelFields.relations.length,\n excludedCount: excluded.length,\n excludedFields: excluded,\n relationFields: modelFields.relations.length,\n },\n };\n}\n\n/**\n * Get all field names for a model (without options)\n */\nexport function getModelFields(modelName: string, modelFieldsMap: ModelFieldsMap, includeRelations = false): string[] {\n const result = extractFieldsFromModel(modelName, modelFieldsMap, { includeRelations });\n return result.fields;\n}\n\n/**\n * Check if a model exists in the generated fields\n */\nexport function hasModel(modelName: string, modelFieldsMap: ModelFieldsMap): boolean {\n return modelName in modelFieldsMap;\n}\n\n/**\n * Get all available model names\n */\nexport function getAllModelNames(modelFieldsMap: ModelFieldsMap): string[] {\n return Object.keys(modelFieldsMap);\n}\n","/**\n * Prisma Context Filtering Utilities\n *\n * Utilities for handling operation context in queries, mutations, and filtering.\n * Context JSON enables multi-dimensional data isolation across workspaces, users, projects, etc.\n *\n * @module prisma/context\n * @category Database\n */\n\n/**\n * Context filter input for querying entities by context\n */\nexport interface ContextFilterInput {\n workspaceId?: string | null;\n userId?: string | null;\n projectId?: string | null;\n appId?: string | null;\n /** Product identifier (e.g. \"vibecontrols\", \"workspaces\"). Stamped on cross-product\n * records so admin filters can scope by originating product. */\n productId?: string | null;\n /** Organization identifier within the tenant. */\n organizationId?: string | null;\n}\n\n/**\n * Operation context for create/update operations\n */\nexport interface OperationContext extends ContextFilterInput {\n custom?: Record<string, unknown> | null;\n}\n\n/**\n * Prisma JSON filter type (simplified for context filtering)\n * This type is designed to be compatible with Prisma's JsonNullableFilter\n * Uses Record<string, unknown> for maximum compatibility with various Prisma versions\n */\nexport type PrismaJsonFilter = Record<string, unknown>;\n\n/**\n * JSON value type for Prisma (includes null for reading from DB)\n */\nexport type JsonValue = string | number | boolean | null | { [key: string]: JsonValue } | JsonValue[];\n\n/**\n * Input JSON value type for Prisma (excludes null for writing to DB)\n * Compatible with Prisma's InputJsonValue type\n */\nexport type InputJsonValue = string | number | boolean | { [key: string]: InputJsonValue } | InputJsonValue[];\n\n/**\n * Build Prisma where condition for context filtering.\n * Uses PostgreSQL JSONB containment operators for efficient queries.\n *\n * @param contextFilter - The context filter input\n * @returns Prisma where clause for context field, or undefined if no filter provided\n *\n * @example\n * ```typescript\n * const contextWhere = buildContextWhereClause({\n * workspaceId: '123',\n * projectId: '456'\n * });\n * // Returns: { path: ['workspaceId'], equals: '123' }\n * ```\n */\nexport function buildContextWhereClause(\n contextFilter: ContextFilterInput | null | undefined\n): PrismaJsonFilter | undefined {\n if (!contextFilter) {\n return undefined;\n }\n\n // Build array of path conditions for each non-null field\n const conditions: PrismaJsonFilter[] = [];\n\n if (contextFilter.workspaceId != null) {\n conditions.push({\n path: ['workspaceId'],\n equals: contextFilter.workspaceId,\n });\n }\n\n if (contextFilter.userId != null) {\n conditions.push({\n path: ['userId'],\n equals: contextFilter.userId,\n });\n }\n\n if (contextFilter.projectId != null) {\n conditions.push({\n path: ['projectId'],\n equals: contextFilter.projectId,\n });\n }\n\n if (contextFilter.appId != null) {\n conditions.push({\n path: ['appId'],\n equals: contextFilter.appId,\n });\n }\n\n if (contextFilter.productId != null) {\n conditions.push({\n path: ['productId'],\n equals: contextFilter.productId,\n });\n }\n\n if (contextFilter.organizationId != null) {\n conditions.push({\n path: ['organizationId'],\n equals: contextFilter.organizationId,\n });\n }\n\n // If no conditions, return undefined\n if (conditions.length === 0) {\n return undefined;\n }\n\n // If single condition, return it directly\n if (conditions.length === 1) {\n return conditions[0];\n }\n\n // For multiple conditions, return the first one\n // Caller should use buildContextWhereConditions for multiple AND conditions\n return conditions[0];\n}\n\n/**\n * Build context where conditions as an array for use in AND clause.\n * This is useful when you need to filter by multiple context fields.\n *\n * @param contextFilter - The context filter input\n * @returns Array of Prisma where conditions, each targeting the context field\n *\n * @example\n * ```typescript\n * const conditions = buildContextWhereConditions({\n * workspaceId: '123',\n * projectId: '456'\n * });\n * // Use in Prisma query:\n * prisma.entity.findMany({\n * where: { AND: conditions }\n * });\n * ```\n */\nexport function buildContextWhereConditions(\n contextFilter: ContextFilterInput | null | undefined\n): Array<{ context: PrismaJsonFilter }> {\n if (!contextFilter) {\n return [];\n }\n\n const conditions: Array<{ context: PrismaJsonFilter }> = [];\n\n if (contextFilter.workspaceId != null) {\n conditions.push({\n context: {\n path: ['workspaceId'],\n equals: contextFilter.workspaceId,\n },\n });\n }\n\n if (contextFilter.userId != null) {\n conditions.push({\n context: {\n path: ['userId'],\n equals: contextFilter.userId,\n },\n });\n }\n\n if (contextFilter.projectId != null) {\n conditions.push({\n context: {\n path: ['projectId'],\n equals: contextFilter.projectId,\n },\n });\n }\n\n if (contextFilter.appId != null) {\n conditions.push({\n context: {\n path: ['appId'],\n equals: contextFilter.appId,\n },\n });\n }\n\n if (contextFilter.productId != null) {\n conditions.push({\n context: {\n path: ['productId'],\n equals: contextFilter.productId,\n },\n });\n }\n\n if (contextFilter.organizationId != null) {\n conditions.push({\n context: {\n path: ['organizationId'],\n equals: contextFilter.organizationId,\n },\n });\n }\n\n return conditions;\n}\n\n/**\n * Convert context input to Prisma JSON format for create/update operations.\n *\n * @param contextInput - The context input\n * @returns JSON value for the context field, or undefined if empty\n *\n * @example\n * ```typescript\n * const contextJson = toContextJson({\n * workspaceId: '123',\n * userId: '456'\n * });\n * // Use in Prisma create:\n * prisma.entity.create({\n * data: { context: contextJson }\n * });\n * ```\n */\nexport function toContextJson(contextInput: OperationContext | null | undefined): InputJsonValue | undefined {\n if (!contextInput) {\n return undefined;\n }\n\n // Remove null values and build clean context object\n const context: Record<string, InputJsonValue> = {};\n\n if (contextInput.workspaceId != null) {\n context['workspaceId'] = contextInput.workspaceId;\n }\n if (contextInput.userId != null) {\n context['userId'] = contextInput.userId;\n }\n if (contextInput.projectId != null) {\n context['projectId'] = contextInput.projectId;\n }\n if (contextInput.appId != null) {\n context['appId'] = contextInput.appId;\n }\n if (contextInput.productId != null) {\n context['productId'] = contextInput.productId;\n }\n if (contextInput.organizationId != null) {\n context['organizationId'] = contextInput.organizationId;\n }\n if (contextInput.custom != null) {\n context['custom'] = contextInput.custom as InputJsonValue;\n }\n\n // Return undefined if no fields set\n if (Object.keys(context).length === 0) {\n return undefined;\n }\n\n return context;\n}\n\n/**\n * Filter out null values from an object for Prisma compatibility\n */\nfunction filterNullValues(obj: Record<string, unknown>): Record<string, InputJsonValue> {\n const filtered: Record<string, InputJsonValue> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== null) {\n filtered[key] = value as InputJsonValue;\n }\n }\n return filtered;\n}\n\n/**\n * Merge a single field into the merged context object\n */\nfunction mergeContextField(\n merged: Record<string, InputJsonValue>,\n fieldName: string,\n fieldValue: string | Record<string, unknown> | null | undefined\n): void {\n if (fieldValue === undefined) {\n return; // Don't touch this field\n }\n\n if (fieldValue === null) {\n delete merged[fieldName]; // Explicitly remove\n } else {\n merged[fieldName] = fieldValue as InputJsonValue; // Set new value\n }\n}\n\n/**\n * Merge existing context with new context input.\n * New values override existing ones, but undefined values are preserved from existing.\n *\n * @param existingContext - The existing context JSON from database\n * @param newContext - The new context input\n * @returns Merged context as InputJsonValue (suitable for Prisma writes)\n *\n * @example\n * ```typescript\n * const merged = mergeContext(\n * { workspaceId: '123', userId: 'old' },\n * { userId: 'new', projectId: '456' }\n * );\n * // Result: { workspaceId: '123', userId: 'new', projectId: '456' }\n * ```\n */\nexport function mergeContext(\n existingContext: JsonValue | null | undefined,\n newContext: OperationContext | null | undefined\n): InputJsonValue | undefined {\n // If no new context, return existing (excluding null values)\n if (!newContext) {\n if (!existingContext) {\n return undefined;\n }\n // Filter out null values from existing context for Prisma compatibility\n if (typeof existingContext === 'object' && !Array.isArray(existingContext)) {\n const filtered = filterNullValues(existingContext);\n return Object.keys(filtered).length > 0 ? filtered : undefined;\n }\n return existingContext as InputJsonValue;\n }\n\n // If no existing context, convert new to JSON\n if (!existingContext || typeof existingContext !== 'object' || Array.isArray(existingContext)) {\n return toContextJson(newContext);\n }\n\n // Merge existing with new\n const merged = filterNullValues(existingContext as Record<string, unknown>);\n\n // Merge each field from new context\n mergeContextField(merged, 'workspaceId', newContext.workspaceId);\n mergeContextField(merged, 'userId', newContext.userId);\n mergeContextField(merged, 'projectId', newContext.projectId);\n mergeContextField(merged, 'appId', newContext.appId);\n mergeContextField(merged, 'productId', newContext.productId);\n mergeContextField(merged, 'organizationId', newContext.organizationId);\n mergeContextField(merged, 'custom', newContext.custom);\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\n/**\n * Parse context JSON from database to OperationContext interface.\n *\n * @param contextJson - The context JSON from database\n * @returns Parsed OperationContext or null\n *\n * @example\n * ```typescript\n * const context = parseContext(entity.context);\n * if (context?.workspaceId) {\n * // Use workspace-specific logic\n * }\n * ```\n */\nexport function parseContext(contextJson: JsonValue | null | undefined): OperationContext | null {\n if (!contextJson || typeof contextJson !== 'object' || Array.isArray(contextJson)) {\n return null;\n }\n\n const ctx = contextJson as Record<string, unknown>;\n\n return {\n workspaceId: typeof ctx['workspaceId'] === 'string' ? ctx['workspaceId'] : null,\n userId: typeof ctx['userId'] === 'string' ? ctx['userId'] : null,\n projectId: typeof ctx['projectId'] === 'string' ? ctx['projectId'] : null,\n appId: typeof ctx['appId'] === 'string' ? ctx['appId'] : null,\n productId: typeof ctx['productId'] === 'string' ? ctx['productId'] : null,\n organizationId: typeof ctx['organizationId'] === 'string' ? ctx['organizationId'] : null,\n custom: typeof ctx['custom'] === 'object' ? (ctx['custom'] as Record<string, unknown>) : null,\n };\n}\n\n/**\n * Check if context matches filter criteria\n *\n * @param context - The context to check\n * @param filter - The filter criteria\n * @returns True if context matches all filter criteria\n */\nexport function contextMatches(context: OperationContext | null | undefined, filter: ContextFilterInput): boolean {\n if (!context) {\n return false;\n }\n\n if (filter.workspaceId != null && context.workspaceId !== filter.workspaceId) {\n return false;\n }\n if (filter.userId != null && context.userId !== filter.userId) {\n return false;\n }\n if (filter.projectId != null && context.projectId !== filter.projectId) {\n return false;\n }\n if (filter.appId != null && context.appId !== filter.appId) {\n return false;\n }\n if (filter.productId != null && context.productId !== filter.productId) {\n return false;\n }\n if (filter.organizationId != null && context.organizationId !== filter.organizationId) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Create a default context from SDK context\n *\n * @param sdkContext - The SDK context (from AsyncLocalStorage)\n * @returns Operation context with workspace and user info\n */\nexport function createContextFromSDK(sdkContext: {\n workspaceId?: string;\n userId?: string;\n projectId?: string;\n appId?: string;\n productId?: string;\n organizationId?: string;\n}): OperationContext {\n return {\n workspaceId: sdkContext.workspaceId ?? null,\n userId: sdkContext.userId ?? null,\n projectId: sdkContext.projectId ?? null,\n appId: sdkContext.appId ?? null,\n productId: sdkContext.productId ?? null,\n organizationId: sdkContext.organizationId ?? null,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/prisma/index.ts","../src/prisma/client.ts","../src/prisma/factory.ts","../src/prisma/manager.ts","../src/prisma/health.ts","../src/prisma/fields.ts","../src/prisma/context.ts"],"names":["createConnectionPool","config","Pool","connectionString","databaseUrl","max","maxConnections","idleTimeoutMillis","connectionTimeoutMillis","createPrismaAdapter","pool","PrismaPg","configurePrismaLogging","client","isDevelopment","process","env","slowQueryThreshold","enableQueryLogging","$on","e","duration","logger","warn","query","substring","length","params","debug","error","message","target","PrismaClientWrapper","connectionState","isConnected","attempts","isDisconnecting","getClient","getPool","getConnectionState","connect","retries","delay","info","attempt","$connect","lastConnectedAt","Date","lastError","undefined","errorMessage","Error","String","waitTime","Math","pow","Promise","resolve","setTimeout","disconnect","$disconnect","end","includes","registerShutdownHandlers","shutdownHandler","signal","exit","on","createPrismaClient","PrismaClientConstructor","adapter","logLevels","emit","level","log","createDatabaseClient","productName","enableGraphExtension","graphEventEmitter","enableWorkspaceExtension","workspaceExtensionConfig","prismaConfig","wrapper","baseClient","extendedClient","eventEmitter","getGraphEventEmitter","graphConfig","enabled","addGraphExtension","addWorkspaceExtension","db","createDatabaseClientFromEnv","overrides","parseInt","state","initialized","initializeDatabase","initializeDatabaseWithConfig","getDb","getDatabaseManager","isDatabaseInitialized","getDatabaseProductName","resetDatabaseManager","checkDatabaseHealth","start","now","$queryRaw","latency","healthy","testConnection","getDatabaseVersion","result","version","getDatabaseStats","health","all","timestamp","requireFn","createRequire","url","loadGeneratedFields","generatedFieldsPath","generated","default","path","extractFieldsFromModel","modelName","modelFieldsMap","options","modelFields","Object","keys","join","excludeFields","includeRelations","customFilter","fields","relations","excluded","filter","field","push","fieldName","isRelation","shouldInclude","name","type","metadata","totalFields","excludedCount","excludedFields","relationFields","getModelFields","hasModel","getAllModelNames","buildContextWhereClause","contextFilter","conditions","workspaceId","equals","userId","projectId","appId","productId","organizationId","buildContextWhereConditions","context","toContextJson","contextInput","custom","filterNullValues","obj","filtered","key","value","entries","mergeContextField","merged","fieldValue","mergeContext","existingContext","newContext","Array","isArray","parseContext","contextJson","ctx","contextMatches","createContextFromSDK","sdkContext"],"mappings":"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","file":"chunk-S5S6OBS6.js","sourcesContent":["/**\n * Prisma Module for Burdenoff Backend SDK\n *\n * Provides Prisma 7 utilities including:\n * - Singleton database manager for microservices\n * - Unified database client factory with graph extension\n * - Prisma client configuration with PostgreSQL adapter\n * - Connection pooling and management\n * - Health checks and monitoring\n * - Graceful shutdown handling\n * - Field extraction utilities for graph sync\n * - Context filtering utilities for multi-tenant queries\n * - Workspace extension for automatic workspaceId injection\n *\n * @module prisma\n * @category Database\n */\n\nexport * from './manager.js';\nexport * from './factory.js';\nexport * from './client.js';\nexport type * from './types.js';\nexport * from './health.js';\nexport * from './fields.js';\nexport * from './context.js';\nexport * from './workspace-extension.js';\n","/**\n * Prisma 7 Client Factory with PostgreSQL Adapter\n *\n * This module provides a generic factory for creating Prisma clients\n * configured with the PostgreSQL driver adapter as required by Prisma 7.\n *\n * Breaking Changes in Prisma 7:\n * - Must use database driver adapter (@prisma/adapter-pg for PostgreSQL)\n * - Datasource URL moved from schema.prisma to prisma.config.ts\n * - DMMF no longer available at runtime (use generator for build-time access)\n *\n * @module prisma/client\n */\n\nimport { PrismaPg } from '@prisma/adapter-pg';\nimport { Pool } from 'pg';\nimport { logger } from '../logger/index.js';\nimport type { PrismaClientConfig, ConnectionState } from './types.js';\n\n/**\n * Prisma event object types\n */\nexport interface PrismaQueryEvent {\n query: string;\n params: string;\n duration: number;\n target?: string;\n}\n\nexport interface PrismaLogEvent {\n message: string;\n target?: string;\n}\n\nexport type PrismaEvent = PrismaQueryEvent | PrismaLogEvent;\n\n/**\n * Transaction options for Prisma $transaction method\n */\nexport interface PrismaTransactionOptions {\n maxWait?: number;\n timeout?: number;\n isolationLevel?: string;\n}\n\n/**\n * Base Prisma client interface with required methods\n *\n * This interface defines the MINIMUM contract required for server bootstrapping.\n * It only includes methods actually used by the SDK's server module.\n *\n * Note: Service-specific model properties (e.g., universalTag, user, workspace, etc.)\n * and full method signatures should be accessed by casting to the service's\n * generated Prisma client type.\n *\n * @example\n * ```typescript\n * // In your service's context type:\n * import type { PrismaClient } from './generated/prisma/client.js';\n * import type { GraphQLContext } from '@burdenoff/be-sdk';\n *\n * export interface Context extends GraphQLContext {\n * db: PrismaClient;\n * }\n * ```\n */\nexport interface PrismaClientBase {\n /** Connect to the database */\n $connect(): Promise<void>;\n /** Disconnect from the database */\n $disconnect(): Promise<void>;\n /** Register event handlers for logging */\n $on(event: string, callback: (e: PrismaEvent) => void): void;\n /** Execute a raw SQL query */\n $queryRaw<T = unknown>(query: TemplateStringsArray, ...values: unknown[]): Promise<T>;\n}\n\n/**\n * Database client return type for getDb()\n *\n * Returns the service's PrismaClient type (T) with a `client` property\n * for backwards compatibility. All model access and typing comes from\n * the service's own generated Prisma types.\n *\n * @example\n * ```typescript\n * // In your service - import YOUR generated PrismaClient\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { getDb } from '@burdenoff/be-sdk/prisma';\n *\n * // Pass your PrismaClient type for full type safety\n * const db = getDb<PrismaClient>();\n * const tags = await db.client.universalTag.findMany(); // Fully typed!\n * ```\n */\nexport type DatabaseReturnType<T extends PrismaClientBase = PrismaClientBase> = T & {\n /**\n * Client property for explicit model access.\n * This is the same as the db object itself, provided for API consistency.\n */\n client: T;\n};\n\n/**\n * Create a PostgreSQL connection pool\n */\nexport function createConnectionPool(config: PrismaClientConfig): Pool {\n return new Pool({\n connectionString: config.databaseUrl,\n max: config.maxConnections ?? 20,\n idleTimeoutMillis: config.idleTimeoutMillis ?? 30000,\n connectionTimeoutMillis: config.connectionTimeoutMillis ?? 10000,\n });\n}\n\n/**\n * Create a Prisma PostgreSQL adapter\n */\nexport function createPrismaAdapter(pool: Pool): PrismaPg {\n return new PrismaPg(pool);\n}\n\n/**\n * Configure Prisma client logging\n */\nexport function configurePrismaLogging<T extends PrismaClientBase>(client: T, config: PrismaClientConfig): T {\n const isDevelopment = process.env['NODE_ENV'] === 'development';\n const slowQueryThreshold = config.slowQueryThreshold ?? (isDevelopment ? 100 : 500);\n\n // Query logging\n if (config.enableQueryLogging ?? isDevelopment) {\n client.$on('query', (e: PrismaEvent) => {\n if ('query' in e && 'duration' in e) {\n if (e.duration > slowQueryThreshold) {\n logger.warn('[Prisma] Slow query detected', {\n query: e.query.substring(0, 200) + (e.query.length > 200 ? '...' : ''),\n params: e.params,\n duration: `${e.duration}ms`,\n });\n } else {\n logger.debug('[Prisma] Query', {\n query: e.query.substring(0, 100) + (e.query.length > 100 ? '...' : ''),\n duration: `${e.duration}ms`,\n });\n }\n }\n });\n }\n\n // Error logging\n client.$on('error', (e: PrismaEvent) => {\n if ('message' in e) {\n logger.error('[Prisma] Database error', {\n message: e.message,\n target: e.target,\n });\n }\n });\n\n // Warning logging\n client.$on('warn', (e: PrismaEvent) => {\n if ('message' in e) {\n logger.warn('[Prisma] Database warning', {\n message: e.message,\n target: e.target,\n });\n }\n });\n\n return client;\n}\n\n/**\n * Prisma Client Wrapper with connection management\n */\nexport class PrismaClientWrapper<T extends PrismaClientBase> {\n private client: T;\n private pool: Pool;\n private connectionState: ConnectionState = {\n isConnected: false,\n attempts: 0,\n };\n private isDisconnecting = false;\n\n constructor(client: T, pool: Pool, config: PrismaClientConfig) {\n this.client = client;\n this.pool = pool;\n\n // Configure logging\n configurePrismaLogging(this.client, config);\n }\n\n /**\n * Get the Prisma client instance\n */\n public getClient(): T {\n return this.client;\n }\n\n /**\n * Get the connection pool\n */\n public getPool(): Pool {\n return this.pool;\n }\n\n /**\n * Get connection state\n */\n public getConnectionState(): ConnectionState {\n return { ...this.connectionState };\n }\n\n /**\n * Connect to database with retry logic\n */\n public async connect(retries = 5, delay = 1000): Promise<void> {\n if (this.connectionState.isConnected) {\n logger.info('[Prisma] Already connected to database');\n return;\n }\n\n for (let attempt = 1; attempt <= retries; attempt++) {\n this.connectionState.attempts = attempt;\n\n try {\n await this.client.$connect();\n this.connectionState.isConnected = true;\n this.connectionState.lastConnectedAt = new Date();\n this.connectionState.lastError = undefined;\n\n logger.info('[Prisma] Successfully connected to database');\n return;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.connectionState.lastError = errorMessage;\n\n logger.error(`[Prisma] Connection attempt ${attempt}/${retries} failed`, {\n error: errorMessage,\n });\n\n if (attempt === retries) {\n logger.error('[Prisma] Max connection retries reached');\n throw error;\n }\n\n // Exponential backoff\n const waitTime = delay * Math.pow(2, attempt - 1);\n logger.info(`[Prisma] Retrying in ${waitTime}ms...`);\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n }\n }\n }\n\n /**\n * Gracefully disconnect from database\n */\n public async disconnect(): Promise<void> {\n // Guard against multiple disconnect calls\n if (this.isDisconnecting) {\n logger.debug('[Prisma] Disconnect already in progress, skipping');\n return;\n }\n\n if (!this.connectionState.isConnected) {\n logger.info('[Prisma] Database already disconnected');\n return;\n }\n\n // Mark as disconnecting to prevent concurrent disconnect calls\n this.isDisconnecting = true;\n\n try {\n await this.client.$disconnect();\n await this.pool.end();\n this.connectionState.isConnected = false;\n\n logger.info('[Prisma] Successfully disconnected from database');\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Ignore \"Called end on pool more than once\" errors\n if (errorMessage.includes('Called end on pool more than once')) {\n logger.debug('[Prisma] Pool already ended, ignoring duplicate end call');\n this.connectionState.isConnected = false;\n return;\n }\n\n logger.error('[Prisma] Error disconnecting from database', {\n error: errorMessage,\n });\n throw error;\n } finally {\n this.isDisconnecting = false;\n }\n }\n\n /**\n * Register graceful shutdown handlers\n */\n public registerShutdownHandlers(): void {\n const shutdownHandler = async (signal: string): Promise<void> => {\n logger.info(`[Prisma] Received ${signal}, starting graceful shutdown...`);\n\n try {\n await this.disconnect();\n process.exit(0);\n } catch (error) {\n logger.error('[Prisma] Error during graceful shutdown', {\n error: error instanceof Error ? error.message : String(error),\n });\n process.exit(1);\n }\n };\n\n // Register shutdown handlers\n process.on('SIGINT', () => void shutdownHandler('SIGINT'));\n process.on('SIGTERM', () => void shutdownHandler('SIGTERM'));\n process.on('beforeExit', () => void this.disconnect());\n }\n}\n\n/**\n * Create a configured Prisma client wrapper\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { createPrismaClient } from '@burdenoff/be-sdk';\n *\n * const wrapper = createPrismaClient(PrismaClient, {\n * databaseUrl: process.env.DATABASE_URL!,\n * });\n *\n * await wrapper.connect();\n * const prisma = wrapper.getClient();\n *\n * // Use prisma client\n * const users = await prisma.user.findMany();\n * ```\n */\n/**\n * Prisma log level options\n */\nexport type PrismaLogLevel = 'info' | 'query' | 'warn' | 'error';\n\n/**\n * Prisma log definition\n */\nexport interface PrismaLogDefinition {\n level: PrismaLogLevel;\n emit: 'stdout' | 'event';\n}\n\n/**\n * Prisma client constructor options\n */\nexport interface PrismaClientConstructorOptions {\n adapter: PrismaPg;\n log?: (PrismaLogLevel | PrismaLogDefinition)[];\n}\n\nexport function createPrismaClient<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n config: PrismaClientConfig\n): PrismaClientWrapper<T> {\n const isDevelopment = process.env['NODE_ENV'] === 'development';\n\n // Create connection pool\n const pool = createConnectionPool(config);\n\n // Create adapter\n const adapter = createPrismaAdapter(pool);\n\n // Determine log levels\n const logLevels: PrismaLogDefinition[] =\n (config.logLevels as PrismaLogDefinition[] | undefined) ??\n (isDevelopment\n ? [\n { emit: 'event', level: 'query' },\n { emit: 'event', level: 'info' },\n { emit: 'event', level: 'warn' },\n { emit: 'event', level: 'error' },\n ]\n : [\n { emit: 'event', level: 'warn' },\n { emit: 'event', level: 'error' },\n ]);\n\n // Create Prisma client\n const client = new PrismaClientConstructor({\n adapter,\n log: logLevels,\n });\n\n // Create and return wrapper\n return new PrismaClientWrapper(client, pool, config);\n}\n","/**\n * Database Client Factory\n *\n * Provides a unified factory for creating fully-configured database clients\n * with Prisma 7, PostgreSQL adapter, graph extension, and graceful shutdown.\n *\n * This module consolidates all database setup into a single call, reducing\n * boilerplate across all backend services.\n *\n * @module prisma/factory\n * @category Database\n */\n\nimport { logger } from '../logger/index.js';\nimport {\n createPrismaClient,\n type PrismaClientBase,\n type PrismaClientWrapper,\n type PrismaClientConstructorOptions,\n} from './client.js';\nimport type { PrismaClientConfig } from './types.js';\nimport { addGraphExtension, type GraphMiddlewareConfig, type GraphEventEmitter } from '../graph/middleware/index.js';\nimport { getGraphEventEmitter } from '../event-queue/graph-emitter.js';\nimport { addWorkspaceExtension, type WorkspaceExtensionConfig } from './workspace-extension.js';\n\n/**\n * Configuration for creating a database client\n */\nexport interface DatabaseClientConfig extends PrismaClientConfig {\n /**\n * Product name for graph events (e.g., 'module-tags', 'workspaces')\n */\n productName: string;\n\n /**\n * Enable graph extension for entity sync\n * @default true (reads from GRAPH_MIDDLEWARE_ENABLED env var)\n */\n enableGraphExtension?: boolean;\n\n /**\n * Custom graph event emitter (defaults to NATS-based emitter)\n */\n graphEventEmitter?: GraphEventEmitter;\n\n /**\n * Enable workspace extension for automatic workspaceId injection\n * @default true (reads from WORKSPACE_EXTENSION_ENABLED env var)\n */\n enableWorkspaceExtension?: boolean;\n\n /**\n * Configuration for the workspace extension\n */\n workspaceExtensionConfig?: WorkspaceExtensionConfig;\n\n /**\n * Register process shutdown handlers for graceful shutdown\n * @default true\n */\n registerShutdownHandlers?: boolean;\n}\n\n/**\n * Result of creating a database client\n */\nexport interface DatabaseClient<T extends PrismaClientBase> {\n /**\n * The extended Prisma client for database operations\n * Use this for all queries: db.model.operation()\n */\n db: T & { client: T };\n\n /**\n * The Prisma client wrapper with connection management utilities\n */\n wrapper: PrismaClientWrapper<T>;\n\n /**\n * Connect to the database with retry logic\n */\n connect: (retries?: number, delay?: number) => Promise<void>;\n\n /**\n * Disconnect from the database\n */\n disconnect: () => Promise<void>;\n}\n\n/**\n * Create a fully-configured database client with graph extension\n *\n * This is the recommended way to create a database connection in all backend services.\n * It handles:\n * - Prisma client creation with PostgreSQL adapter\n * - Connection pooling configuration\n * - Query logging (in development)\n * - Graph extension for entity sync (via NATS or in-memory)\n * - Graceful shutdown handlers\n *\n * @example\n * ```typescript\n * // In your service's db.ts\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { createDatabaseClient } from '@burdenoff/be-sdk/prisma';\n *\n * const { db, wrapper, connect, disconnect } = createDatabaseClient(PrismaClient, {\n * productName: 'my-service',\n * databaseUrl: process.env.DATABASE_URL!,\n * });\n *\n * export { db, wrapper, connect, disconnect };\n * export type ExtendedPrismaClient = typeof db;\n * ```\n *\n * @example\n * ```typescript\n * // With custom configuration\n * const { db } = createDatabaseClient(PrismaClient, {\n * productName: 'workspaces',\n * databaseUrl: process.env.DATABASE_URL!,\n * maxConnections: 50,\n * enableQueryLogging: true,\n * slowQueryThreshold: 200,\n * enableGraphExtension: true,\n * registerShutdownHandlers: true,\n * });\n * ```\n */\nexport function createDatabaseClient<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n config: DatabaseClientConfig\n): DatabaseClient<T> {\n const {\n productName,\n enableGraphExtension = process.env['GRAPH_MIDDLEWARE_ENABLED'] !== 'false',\n graphEventEmitter,\n enableWorkspaceExtension = process.env['WORKSPACE_EXTENSION_ENABLED'] !== 'false',\n workspaceExtensionConfig,\n registerShutdownHandlers = true,\n ...prismaConfig\n } = config;\n\n // Create Prisma client wrapper\n const wrapper = createPrismaClient(PrismaClientConstructor, prismaConfig);\n\n // Get the base client\n const baseClient = wrapper.getClient();\n\n // Extension chaining order:\n // 1. Graph extension (event emission on CRUD) - runs first\n // 2. Workspace extension (auto-inject workspaceId) - runs second\n //\n // The workspace extension should run BEFORE graph extension in the\n // interception chain so that graph events include the injected workspaceId.\n // In Prisma $extends, the LAST extension added runs FIRST (outermost wrapper).\n // So we add graph first, then workspace on top.\n\n let extendedClient: T;\n\n // Step 1: Add graph extension\n if (enableGraphExtension) {\n const eventEmitter = graphEventEmitter ?? getGraphEventEmitter();\n\n const graphConfig: GraphMiddlewareConfig = {\n enabled: true,\n productName,\n eventEmitter,\n };\n\n extendedClient = addGraphExtension(baseClient, graphConfig);\n\n logger.info('[Database] Graph extension enabled', { productName });\n } else {\n extendedClient = baseClient;\n logger.info('[Database] Graph extension disabled');\n }\n\n // Step 2: Add workspace extension (wraps on top of graph)\n if (enableWorkspaceExtension) {\n extendedClient = addWorkspaceExtension(extendedClient, workspaceExtensionConfig);\n\n logger.info('[Database] Workspace extension enabled', { productName });\n } else {\n logger.info('[Database] Workspace extension disabled');\n }\n\n // Add backwards compatibility alias\n const db = extendedClient as T & { client: T };\n (db as unknown as Record<string, unknown>)['client'] = db;\n\n // Register shutdown handlers if requested\n if (registerShutdownHandlers) {\n wrapper.registerShutdownHandlers();\n logger.debug('[Database] Shutdown handlers registered');\n }\n\n return {\n db,\n wrapper,\n connect: (retries?: number, delay?: number) => wrapper.connect(retries, delay),\n disconnect: () => wrapper.disconnect(),\n };\n}\n\n/**\n * Create a database client from environment variables\n *\n * Convenience function that reads configuration from standard environment variables:\n * - DATABASE_URL: Connection string (required)\n * - DATABASE_MAX_CONNECTIONS: Max pool connections (default: 20)\n * - NODE_ENV: Environment for logging settings\n * - GRAPH_MIDDLEWARE_ENABLED: Enable graph sync (default: true)\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { createDatabaseClientFromEnv } from '@burdenoff/be-sdk/prisma';\n *\n * const { db } = createDatabaseClientFromEnv(PrismaClient, 'module-tags');\n * export { db };\n * ```\n */\nexport function createDatabaseClientFromEnv<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n productName: string,\n overrides?: Partial<DatabaseClientConfig>\n): DatabaseClient<T> {\n const databaseUrl = process.env['DATABASE_URL'];\n if (!databaseUrl) {\n throw new Error('DATABASE_URL environment variable is required');\n }\n\n const isDevelopment = process.env['NODE_ENV'] === 'development';\n\n const config: DatabaseClientConfig = {\n productName,\n databaseUrl,\n maxConnections: parseInt(process.env['DATABASE_MAX_CONNECTIONS'] || '20', 10),\n idleTimeoutMillis: parseInt(process.env['DATABASE_IDLE_TIMEOUT'] || '30000', 10),\n connectionTimeoutMillis: parseInt(process.env['DATABASE_CONNECTION_TIMEOUT'] || '10000', 10),\n enableQueryLogging: isDevelopment,\n slowQueryThreshold: isDevelopment ? 100 : 500,\n ...overrides,\n };\n\n return createDatabaseClient(PrismaClientConstructor, config);\n}\n","/**\n * Database Singleton Manager\n *\n * Provides a singleton pattern for database connections across microservices.\n * Services initialize once at startup and access the db instance globally.\n *\n * This eliminates the need for individual db.ts files in each microservice.\n *\n * @module prisma/manager\n * @category Database\n *\n * @example\n * ```typescript\n * // In your service's index.ts (startup)\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { initializeDatabase } from '@burdenoff/be-sdk/prisma';\n *\n * // Initialize once at startup\n * const { db, connect } = initializeDatabase(PrismaClient, 'module-tags');\n * await connect();\n *\n * // In any other file\n * import { getDb } from '@burdenoff/be-sdk/prisma';\n * const db = getDb();\n * await db.client.user.findMany();\n * ```\n */\n\nimport { logger } from '../logger/index.js';\nimport {\n createDatabaseClient,\n createDatabaseClientFromEnv,\n type DatabaseClient,\n type DatabaseClientConfig,\n} from './factory.js';\nimport type { PrismaClientBase, PrismaClientConstructorOptions, DatabaseReturnType } from './client.js';\n\n/**\n * Global database manager state\n */\ninterface DatabaseManagerState {\n initialized: boolean;\n productName: string | null;\n client: DatabaseClient<PrismaClientBase> | null;\n}\n\n/**\n * Singleton state for the database manager\n */\nconst state: DatabaseManagerState = {\n initialized: false,\n productName: null,\n client: null,\n};\n\n/**\n * Initialize the database singleton\n *\n * Call this once at application startup with your service's PrismaClient.\n * After initialization, use `getDb()` to access the database anywhere.\n *\n * @param PrismaClientConstructor - The generated PrismaClient class from your service\n * @param productName - Product name for graph events (e.g., 'module-tags', 'workspaces')\n * @param config - Optional configuration overrides\n * @returns The database client with db, wrapper, connect, disconnect\n *\n * @throws Error if already initialized with a different product\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { initializeDatabase } from '@burdenoff/be-sdk/prisma';\n *\n * const { db, connect, disconnect } = initializeDatabase(PrismaClient, 'module-tags');\n * await connect();\n * ```\n */\nexport function initializeDatabase<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n productName: string,\n config?: Partial<DatabaseClientConfig>\n): DatabaseClient<T> {\n // Check if already initialized\n if (state.initialized) {\n if (state.productName !== productName) {\n throw new Error(\n `Database already initialized for product \"${state.productName}\". ` +\n `Cannot reinitialize for \"${productName}\".`\n );\n }\n logger.debug('[DatabaseManager] Already initialized, returning existing client', { productName });\n return state.client as DatabaseClient<T>;\n }\n\n // Create the database client using env-based factory\n const client = createDatabaseClientFromEnv(PrismaClientConstructor, productName, config);\n\n // Store in singleton state\n state.initialized = true;\n state.productName = productName;\n state.client = client;\n\n logger.info('[DatabaseManager] Database initialized', { productName });\n\n return client;\n}\n\n/**\n * Initialize the database with explicit configuration\n *\n * Use this when you need full control over database configuration\n * rather than reading from environment variables.\n *\n * @param PrismaClientConstructor - The generated PrismaClient class\n * @param config - Full database configuration\n * @returns The database client\n *\n * @example\n * ```typescript\n * const { db } = initializeDatabaseWithConfig(PrismaClient, {\n * productName: 'module-tags',\n * databaseUrl: 'postgresql://...',\n * maxConnections: 50,\n * enableGraphExtension: false,\n * });\n * ```\n */\nexport function initializeDatabaseWithConfig<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n config: DatabaseClientConfig\n): DatabaseClient<T> {\n const { productName } = config;\n\n // Check if already initialized\n if (state.initialized) {\n if (state.productName !== productName) {\n throw new Error(\n `Database already initialized for product \"${state.productName}\". ` +\n `Cannot reinitialize for \"${productName}\".`\n );\n }\n logger.debug('[DatabaseManager] Already initialized, returning existing client', { productName });\n return state.client as DatabaseClient<T>;\n }\n\n // Create the database client\n const client = createDatabaseClient(PrismaClientConstructor, config);\n\n // Store in singleton state\n state.initialized = true;\n state.productName = productName;\n state.client = client;\n\n logger.info('[DatabaseManager] Database initialized with custom config', { productName });\n\n return client;\n}\n\n/**\n * Get the initialized database client\n *\n * Use this anywhere in your application to access the database.\n * Must call `initializeDatabase()` first at application startup.\n *\n * The returned client provides dynamic model access - you can access any\n * model property (e.g., `db.client.user`, `db.client.universalTag`) and\n * TypeScript will allow common Prisma operations (findMany, create, etc.).\n *\n * @returns The extended Prisma client (db) with dynamic model access\n * @throws Error if database not initialized\n *\n * @example\n * ```typescript\n * import { getDb } from '@burdenoff/be-sdk/prisma';\n *\n * const db = getDb();\n * // Dynamic model access works without importing service-specific types\n * const tags = await db.client.universalTag.findMany();\n * const users = await db.client.user.findMany({ where: { active: true } });\n * ```\n */\nexport function getDb<T extends PrismaClientBase = PrismaClientBase>(): DatabaseReturnType<T> {\n if (!state.initialized || !state.client) {\n throw new Error('Database not initialized. Call initializeDatabase() at application startup before using getDb().');\n }\n return state.client.db as unknown as DatabaseReturnType<T>;\n}\n\n/**\n * Get the full database manager\n *\n * Returns the complete database client including wrapper, connect, and disconnect functions.\n * Useful when you need access to connection management utilities.\n *\n * @returns The full database client\n * @throws Error if database not initialized\n *\n * @example\n * ```typescript\n * import { getDatabaseManager } from '@burdenoff/be-sdk/prisma';\n *\n * const { db, wrapper, connect, disconnect } = getDatabaseManager();\n * await connect();\n * ```\n */\nexport function getDatabaseManager<T extends PrismaClientBase = PrismaClientBase>(): DatabaseClient<T> {\n if (!state.initialized || !state.client) {\n throw new Error(\n 'Database not initialized. Call initializeDatabase() at application startup before using getDatabaseManager().'\n );\n }\n return state.client as DatabaseClient<T>;\n}\n\n/**\n * Check if database is initialized\n *\n * @returns True if database has been initialized\n *\n * @example\n * ```typescript\n * if (!isDatabaseInitialized()) {\n * await initializeDatabase(PrismaClient, 'my-service');\n * }\n * ```\n */\nexport function isDatabaseInitialized(): boolean {\n return state.initialized;\n}\n\n/**\n * Get the product name of the initialized database\n *\n * @returns The product name or null if not initialized\n */\nexport function getDatabaseProductName(): string | null {\n return state.productName;\n}\n\n/**\n * Reset the database manager (for testing purposes only)\n *\n * WARNING: This disconnects and resets the database manager.\n * Only use this in test environments for cleanup between tests.\n *\n * @internal\n */\nexport async function resetDatabaseManager(): Promise<void> {\n if (state.client) {\n try {\n await state.client.disconnect();\n } catch (error) {\n logger.warn('[DatabaseManager] Error during disconnect on reset', { error });\n }\n }\n\n state.initialized = false;\n state.productName = null;\n state.client = null;\n\n logger.debug('[DatabaseManager] Database manager reset');\n}\n","/**\n * Prisma Health Check Utilities\n */\n\nimport { logger } from '../logger/index.js';\nimport type { DatabaseHealth } from './types.js';\nimport type { PrismaClientBase } from './client.js';\n\n/**\n * Check database health\n */\nexport async function checkDatabaseHealth<T extends PrismaClientBase>(client: T): Promise<DatabaseHealth> {\n try {\n const start = Date.now();\n await client.$queryRaw`SELECT 1`;\n const latency = Date.now() - start;\n\n return { healthy: true, latency };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error('[Prisma] Health check failed', { error: errorMessage });\n\n return {\n healthy: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * Test database connection\n */\nexport async function testConnection<T extends PrismaClientBase>(client: T): Promise<boolean> {\n try {\n await client.$queryRaw`SELECT 1`;\n return true;\n } catch (error) {\n logger.error('[Prisma] Connection test failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n}\n\n/**\n * Get database version\n */\nexport async function getDatabaseVersion<T extends PrismaClientBase>(client: T): Promise<string | null> {\n try {\n const result = await client.$queryRaw<Array<{ version?: string }>>`SELECT version()`;\n return result[0]?.version ?? null;\n } catch (error) {\n logger.error('[Prisma] Failed to get database version', {\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n}\n\n/**\n * Get database stats\n */\nexport async function getDatabaseStats<T extends PrismaClientBase>(\n client: T\n): Promise<{\n health: DatabaseHealth;\n version: string | null;\n timestamp: Date;\n}> {\n const [health, version] = await Promise.all([checkDatabaseHealth(client), getDatabaseVersion(client)]);\n\n return {\n health,\n version,\n timestamp: new Date(),\n };\n}\n","/**\n * Prisma Field Extraction Utilities\n *\n * Provides utilities for extracting model fields from Prisma schema.\n * In Prisma 7, DMMF is not available at runtime, so this module provides\n * build-time field extraction through a generator.\n *\n * @module prisma/fields\n */\n\nimport { createRequire } from 'node:module';\nimport { logger } from '../logger/index.js';\n\nconst requireFn = createRequire(import.meta.url);\n\n/**\n * Field extraction options\n */\nexport interface FieldExtractionOptions {\n /** Fields to exclude from extraction */\n excludeFields?: string[];\n /** Whether to include relation fields */\n includeRelations?: boolean;\n /** Custom filter function */\n customFilter?: (field: { name: string; type: string; isRelation: boolean }) => boolean;\n}\n\n/**\n * Field extraction result\n */\nexport interface FieldExtractionResult {\n /** Extracted field names */\n fields: string[];\n /** Metadata about the extraction */\n metadata: {\n /** Total number of fields found */\n totalFields: number;\n /** Number of fields excluded */\n excludedCount: number;\n /** Names of excluded fields */\n excludedFields: string[];\n /** Number of relation fields */\n relationFields: number;\n };\n}\n\n/**\n * Model fields mapping\n * This will be generated at build time by the Prisma generator\n */\nexport type ModelFieldsMap = Record<\n string,\n {\n fields: string[];\n relations: string[];\n }\n>;\n\n/**\n * Import generated fields from the consuming package\n * This function should be used by backends to load their generated fields\n */\nexport function loadGeneratedFields(generatedFieldsPath: string): ModelFieldsMap {\n try {\n // Dynamic import of generated fields using createRequire\n const generated = requireFn(generatedFieldsPath) as { default: ModelFieldsMap };\n return generated.default || generated;\n } catch (error) {\n logger.error('[Prisma] Failed to load generated fields', {\n error: error instanceof Error ? error.message : String(error),\n path: generatedFieldsPath,\n });\n throw new Error(`Failed to load generated fields from ${generatedFieldsPath}`);\n }\n}\n\n/**\n * Extract fields from generated model fields with options\n */\nexport function extractFieldsFromModel(\n modelName: string,\n modelFieldsMap: ModelFieldsMap,\n options: FieldExtractionOptions = {}\n): FieldExtractionResult {\n const modelFields = modelFieldsMap[modelName];\n\n if (!modelFields) {\n throw new Error(\n `Model \"${modelName}\" not found in generated fields. ` +\n `Available models: ${Object.keys(modelFieldsMap).join(', ')}`\n );\n }\n\n const { excludeFields = [], includeRelations = false, customFilter } = options;\n\n // Start with scalar fields\n let fields = [...modelFields.fields];\n\n // Add relations if requested\n if (includeRelations) {\n fields = [...fields, ...modelFields.relations];\n }\n\n // Track excluded fields\n const excluded: string[] = [];\n\n // Apply exclusions\n if (excludeFields.length > 0) {\n fields = fields.filter((field) => {\n if (excludeFields.includes(field)) {\n excluded.push(field);\n return false;\n }\n return true;\n });\n }\n\n // Apply custom filter\n if (customFilter) {\n fields = fields.filter((fieldName) => {\n const isRelation = modelFields.relations.includes(fieldName);\n const shouldInclude = customFilter({\n name: fieldName,\n type: 'unknown', // Type information not available without full DMMF\n isRelation,\n });\n\n if (!shouldInclude) {\n excluded.push(fieldName);\n }\n\n return shouldInclude;\n });\n }\n\n return {\n fields,\n metadata: {\n totalFields: modelFields.fields.length + modelFields.relations.length,\n excludedCount: excluded.length,\n excludedFields: excluded,\n relationFields: modelFields.relations.length,\n },\n };\n}\n\n/**\n * Get all field names for a model (without options)\n */\nexport function getModelFields(modelName: string, modelFieldsMap: ModelFieldsMap, includeRelations = false): string[] {\n const result = extractFieldsFromModel(modelName, modelFieldsMap, { includeRelations });\n return result.fields;\n}\n\n/**\n * Check if a model exists in the generated fields\n */\nexport function hasModel(modelName: string, modelFieldsMap: ModelFieldsMap): boolean {\n return modelName in modelFieldsMap;\n}\n\n/**\n * Get all available model names\n */\nexport function getAllModelNames(modelFieldsMap: ModelFieldsMap): string[] {\n return Object.keys(modelFieldsMap);\n}\n","/**\n * Prisma Context Filtering Utilities\n *\n * Utilities for handling operation context in queries, mutations, and filtering.\n * Context JSON enables multi-dimensional data isolation across workspaces, users, projects, etc.\n *\n * @module prisma/context\n * @category Database\n */\n\n/**\n * Context filter input for querying entities by context\n */\nexport interface ContextFilterInput {\n workspaceId?: string | null;\n userId?: string | null;\n projectId?: string | null;\n appId?: string | null;\n /** Product identifier (e.g. \"vibecontrols\", \"workspaces\"). Stamped on cross-product\n * records so admin filters can scope by originating product. */\n productId?: string | null;\n /** Organization identifier within the tenant. */\n organizationId?: string | null;\n}\n\n/**\n * Operation context for create/update operations\n */\nexport interface OperationContext extends ContextFilterInput {\n custom?: Record<string, unknown> | null;\n}\n\n/**\n * Prisma JSON filter type (simplified for context filtering)\n * This type is designed to be compatible with Prisma's JsonNullableFilter\n * Uses Record<string, unknown> for maximum compatibility with various Prisma versions\n */\nexport type PrismaJsonFilter = Record<string, unknown>;\n\n/**\n * JSON value type for Prisma (includes null for reading from DB)\n */\nexport type JsonValue = string | number | boolean | null | { [key: string]: JsonValue } | JsonValue[];\n\n/**\n * Input JSON value type for Prisma (excludes null for writing to DB)\n * Compatible with Prisma's InputJsonValue type\n */\nexport type InputJsonValue = string | number | boolean | { [key: string]: InputJsonValue } | InputJsonValue[];\n\n/**\n * Build Prisma where condition for context filtering.\n * Uses PostgreSQL JSONB containment operators for efficient queries.\n *\n * @param contextFilter - The context filter input\n * @returns Prisma where clause for context field, or undefined if no filter provided\n *\n * @example\n * ```typescript\n * const contextWhere = buildContextWhereClause({\n * workspaceId: '123',\n * projectId: '456'\n * });\n * // Returns: { path: ['workspaceId'], equals: '123' }\n * ```\n */\nexport function buildContextWhereClause(\n contextFilter: ContextFilterInput | null | undefined\n): PrismaJsonFilter | undefined {\n if (!contextFilter) {\n return undefined;\n }\n\n // Build array of path conditions for each non-null field\n const conditions: PrismaJsonFilter[] = [];\n\n if (contextFilter.workspaceId != null) {\n conditions.push({\n path: ['workspaceId'],\n equals: contextFilter.workspaceId,\n });\n }\n\n if (contextFilter.userId != null) {\n conditions.push({\n path: ['userId'],\n equals: contextFilter.userId,\n });\n }\n\n if (contextFilter.projectId != null) {\n conditions.push({\n path: ['projectId'],\n equals: contextFilter.projectId,\n });\n }\n\n if (contextFilter.appId != null) {\n conditions.push({\n path: ['appId'],\n equals: contextFilter.appId,\n });\n }\n\n if (contextFilter.productId != null) {\n conditions.push({\n path: ['productId'],\n equals: contextFilter.productId,\n });\n }\n\n if (contextFilter.organizationId != null) {\n conditions.push({\n path: ['organizationId'],\n equals: contextFilter.organizationId,\n });\n }\n\n // If no conditions, return undefined\n if (conditions.length === 0) {\n return undefined;\n }\n\n // If single condition, return it directly\n if (conditions.length === 1) {\n return conditions[0];\n }\n\n // For multiple conditions, return the first one\n // Caller should use buildContextWhereConditions for multiple AND conditions\n return conditions[0];\n}\n\n/**\n * Build context where conditions as an array for use in AND clause.\n * This is useful when you need to filter by multiple context fields.\n *\n * @param contextFilter - The context filter input\n * @returns Array of Prisma where conditions, each targeting the context field\n *\n * @example\n * ```typescript\n * const conditions = buildContextWhereConditions({\n * workspaceId: '123',\n * projectId: '456'\n * });\n * // Use in Prisma query:\n * prisma.entity.findMany({\n * where: { AND: conditions }\n * });\n * ```\n */\nexport function buildContextWhereConditions(\n contextFilter: ContextFilterInput | null | undefined\n): Array<{ context: PrismaJsonFilter }> {\n if (!contextFilter) {\n return [];\n }\n\n const conditions: Array<{ context: PrismaJsonFilter }> = [];\n\n if (contextFilter.workspaceId != null) {\n conditions.push({\n context: {\n path: ['workspaceId'],\n equals: contextFilter.workspaceId,\n },\n });\n }\n\n if (contextFilter.userId != null) {\n conditions.push({\n context: {\n path: ['userId'],\n equals: contextFilter.userId,\n },\n });\n }\n\n if (contextFilter.projectId != null) {\n conditions.push({\n context: {\n path: ['projectId'],\n equals: contextFilter.projectId,\n },\n });\n }\n\n if (contextFilter.appId != null) {\n conditions.push({\n context: {\n path: ['appId'],\n equals: contextFilter.appId,\n },\n });\n }\n\n if (contextFilter.productId != null) {\n conditions.push({\n context: {\n path: ['productId'],\n equals: contextFilter.productId,\n },\n });\n }\n\n if (contextFilter.organizationId != null) {\n conditions.push({\n context: {\n path: ['organizationId'],\n equals: contextFilter.organizationId,\n },\n });\n }\n\n return conditions;\n}\n\n/**\n * Convert context input to Prisma JSON format for create/update operations.\n *\n * @param contextInput - The context input\n * @returns JSON value for the context field, or undefined if empty\n *\n * @example\n * ```typescript\n * const contextJson = toContextJson({\n * workspaceId: '123',\n * userId: '456'\n * });\n * // Use in Prisma create:\n * prisma.entity.create({\n * data: { context: contextJson }\n * });\n * ```\n */\nexport function toContextJson(contextInput: OperationContext | null | undefined): InputJsonValue | undefined {\n if (!contextInput) {\n return undefined;\n }\n\n // Remove null values and build clean context object\n const context: Record<string, InputJsonValue> = {};\n\n if (contextInput.workspaceId != null) {\n context['workspaceId'] = contextInput.workspaceId;\n }\n if (contextInput.userId != null) {\n context['userId'] = contextInput.userId;\n }\n if (contextInput.projectId != null) {\n context['projectId'] = contextInput.projectId;\n }\n if (contextInput.appId != null) {\n context['appId'] = contextInput.appId;\n }\n if (contextInput.productId != null) {\n context['productId'] = contextInput.productId;\n }\n if (contextInput.organizationId != null) {\n context['organizationId'] = contextInput.organizationId;\n }\n if (contextInput.custom != null) {\n context['custom'] = contextInput.custom as InputJsonValue;\n }\n\n // Return undefined if no fields set\n if (Object.keys(context).length === 0) {\n return undefined;\n }\n\n return context;\n}\n\n/**\n * Filter out null values from an object for Prisma compatibility\n */\nfunction filterNullValues(obj: Record<string, unknown>): Record<string, InputJsonValue> {\n const filtered: Record<string, InputJsonValue> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== null) {\n filtered[key] = value as InputJsonValue;\n }\n }\n return filtered;\n}\n\n/**\n * Merge a single field into the merged context object\n */\nfunction mergeContextField(\n merged: Record<string, InputJsonValue>,\n fieldName: string,\n fieldValue: string | Record<string, unknown> | null | undefined\n): void {\n if (fieldValue === undefined) {\n return; // Don't touch this field\n }\n\n if (fieldValue === null) {\n delete merged[fieldName]; // Explicitly remove\n } else {\n merged[fieldName] = fieldValue as InputJsonValue; // Set new value\n }\n}\n\n/**\n * Merge existing context with new context input.\n * New values override existing ones, but undefined values are preserved from existing.\n *\n * @param existingContext - The existing context JSON from database\n * @param newContext - The new context input\n * @returns Merged context as InputJsonValue (suitable for Prisma writes)\n *\n * @example\n * ```typescript\n * const merged = mergeContext(\n * { workspaceId: '123', userId: 'old' },\n * { userId: 'new', projectId: '456' }\n * );\n * // Result: { workspaceId: '123', userId: 'new', projectId: '456' }\n * ```\n */\nexport function mergeContext(\n existingContext: JsonValue | null | undefined,\n newContext: OperationContext | null | undefined\n): InputJsonValue | undefined {\n // If no new context, return existing (excluding null values)\n if (!newContext) {\n if (!existingContext) {\n return undefined;\n }\n // Filter out null values from existing context for Prisma compatibility\n if (typeof existingContext === 'object' && !Array.isArray(existingContext)) {\n const filtered = filterNullValues(existingContext);\n return Object.keys(filtered).length > 0 ? filtered : undefined;\n }\n return existingContext as InputJsonValue;\n }\n\n // If no existing context, convert new to JSON\n if (!existingContext || typeof existingContext !== 'object' || Array.isArray(existingContext)) {\n return toContextJson(newContext);\n }\n\n // Merge existing with new\n const merged = filterNullValues(existingContext as Record<string, unknown>);\n\n // Merge each field from new context\n mergeContextField(merged, 'workspaceId', newContext.workspaceId);\n mergeContextField(merged, 'userId', newContext.userId);\n mergeContextField(merged, 'projectId', newContext.projectId);\n mergeContextField(merged, 'appId', newContext.appId);\n mergeContextField(merged, 'productId', newContext.productId);\n mergeContextField(merged, 'organizationId', newContext.organizationId);\n mergeContextField(merged, 'custom', newContext.custom);\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\n/**\n * Parse context JSON from database to OperationContext interface.\n *\n * @param contextJson - The context JSON from database\n * @returns Parsed OperationContext or null\n *\n * @example\n * ```typescript\n * const context = parseContext(entity.context);\n * if (context?.workspaceId) {\n * // Use workspace-specific logic\n * }\n * ```\n */\nexport function parseContext(contextJson: JsonValue | null | undefined): OperationContext | null {\n if (!contextJson || typeof contextJson !== 'object' || Array.isArray(contextJson)) {\n return null;\n }\n\n const ctx = contextJson as Record<string, unknown>;\n\n return {\n workspaceId: typeof ctx['workspaceId'] === 'string' ? ctx['workspaceId'] : null,\n userId: typeof ctx['userId'] === 'string' ? ctx['userId'] : null,\n projectId: typeof ctx['projectId'] === 'string' ? ctx['projectId'] : null,\n appId: typeof ctx['appId'] === 'string' ? ctx['appId'] : null,\n productId: typeof ctx['productId'] === 'string' ? ctx['productId'] : null,\n organizationId: typeof ctx['organizationId'] === 'string' ? ctx['organizationId'] : null,\n custom: typeof ctx['custom'] === 'object' ? (ctx['custom'] as Record<string, unknown>) : null,\n };\n}\n\n/**\n * Check if context matches filter criteria\n *\n * @param context - The context to check\n * @param filter - The filter criteria\n * @returns True if context matches all filter criteria\n */\nexport function contextMatches(context: OperationContext | null | undefined, filter: ContextFilterInput): boolean {\n if (!context) {\n return false;\n }\n\n if (filter.workspaceId != null && context.workspaceId !== filter.workspaceId) {\n return false;\n }\n if (filter.userId != null && context.userId !== filter.userId) {\n return false;\n }\n if (filter.projectId != null && context.projectId !== filter.projectId) {\n return false;\n }\n if (filter.appId != null && context.appId !== filter.appId) {\n return false;\n }\n if (filter.productId != null && context.productId !== filter.productId) {\n return false;\n }\n if (filter.organizationId != null && context.organizationId !== filter.organizationId) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Create a default context from SDK context\n *\n * @param sdkContext - The SDK context (from AsyncLocalStorage)\n * @returns Operation context with workspace and user info\n */\nexport function createContextFromSDK(sdkContext: {\n workspaceId?: string;\n userId?: string;\n projectId?: string;\n appId?: string;\n productId?: string;\n organizationId?: string;\n}): OperationContext {\n return {\n workspaceId: sdkContext.workspaceId ?? null,\n userId: sdkContext.userId ?? null,\n projectId: sdkContext.projectId ?? null,\n appId: sdkContext.appId ?? null,\n productId: sdkContext.productId ?? null,\n organizationId: sdkContext.organizationId ?? null,\n };\n}\n"]}
|
|
@@ -505,5 +505,5 @@ var DatabaseModule = class {
|
|
|
505
505
|
};
|
|
506
506
|
|
|
507
507
|
export { DatabaseModule, closeClickHouseConnection, createTable, executeQuery, getClickHouseClient, getClickHouseStats, insertData, testClickHouseConnection };
|
|
508
|
-
//# sourceMappingURL=chunk-
|
|
509
|
-
//# sourceMappingURL=chunk-
|
|
508
|
+
//# sourceMappingURL=chunk-UFQQSQG6.js.map
|
|
509
|
+
//# sourceMappingURL=chunk-UFQQSQG6.js.map
|
|
@@ -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-CPO7ZXUQ.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-UFQQSQG6.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 Apache AGE — 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"]}
|
package/dist/database/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { DatabaseModule, closeClickHouseConnection, createTable, executeQuery, getClickHouseClient, getClickHouseStats, insertData, testClickHouseConnection } from '../chunk-
|
|
1
|
+
export { DatabaseModule, closeClickHouseConnection, createTable, executeQuery, getClickHouseClient, getClickHouseStats, insertData, testClickHouseConnection } from '../chunk-UFQQSQG6.js';
|
|
2
2
|
import '../chunk-O6RHB2YP.js';
|
|
3
3
|
import '../chunk-HP6JTFNR.js';
|
|
4
4
|
import '../chunk-CBZNP6RF.js';
|