@burdenoff/be-sdk 2026.602.2 → 2026.618.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/auth/index.d.ts +2 -2
- package/dist/auth/index.js +3 -3
- package/dist/cache/index.d.ts +2 -2
- package/dist/cache/index.js +2 -2
- package/dist/{chunk-RDGQEBNS.js → chunk-5FEOFBQ4.js} +4 -4
- package/dist/{chunk-RDGQEBNS.js.map → chunk-5FEOFBQ4.js.map} +1 -1
- package/dist/chunk-DXX6C6X6.js +210 -0
- package/dist/chunk-DXX6C6X6.js.map +1 -0
- package/dist/{chunk-KKCC3Z4I.js → chunk-FKSMQLIV.js} +3 -3
- package/dist/{chunk-KKCC3Z4I.js.map → chunk-FKSMQLIV.js.map} +1 -1
- package/dist/{chunk-BNJFEOGH.js → chunk-FTDQ6NY5.js} +4 -4
- package/dist/{chunk-BNJFEOGH.js.map → chunk-FTDQ6NY5.js.map} +1 -1
- package/dist/{chunk-VWCN5PMD.js → chunk-HRCWJLCZ.js} +8 -3
- package/dist/chunk-HRCWJLCZ.js.map +1 -0
- package/dist/{chunk-5SD7DU3L.js → chunk-IC7YDBGE.js} +3 -3
- package/dist/{chunk-5SD7DU3L.js.map → chunk-IC7YDBGE.js.map} +1 -1
- package/dist/{chunk-4NFZOFRS.js → chunk-L2P4CJUR.js} +2 -2
- package/dist/{chunk-4NFZOFRS.js.map → chunk-L2P4CJUR.js.map} +1 -1
- package/dist/{chunk-OJWJVZY5.js → chunk-N7UJFZQH.js} +24 -25
- package/dist/chunk-N7UJFZQH.js.map +1 -0
- package/dist/{chunk-VWNL2O3G.js → chunk-OQLDXOZ3.js} +5 -4
- package/dist/chunk-OQLDXOZ3.js.map +1 -0
- package/dist/{chunk-O6RHB2YP.js → chunk-SMGTXYFR.js} +2 -2
- package/dist/chunk-SMGTXYFR.js.map +1 -0
- package/dist/{chunk-GSEPF2B6.js → chunk-UIMPJNWC.js} +3 -3
- package/dist/{chunk-GSEPF2B6.js.map → chunk-UIMPJNWC.js.map} +1 -1
- package/dist/{chunk-7NYCLQFJ.js → chunk-UYE4IEPT.js} +3 -3
- package/dist/{chunk-7NYCLQFJ.js.map → chunk-UYE4IEPT.js.map} +1 -1
- package/dist/{chunk-5HL47UH2.js → chunk-X7QMT2P6.js} +3 -3
- package/dist/{chunk-5HL47UH2.js.map → chunk-X7QMT2P6.js.map} +1 -1
- package/dist/{chunk-UFQQSQG6.js → chunk-XNQUN3AE.js} +3 -3
- package/dist/{chunk-UFQQSQG6.js.map → chunk-XNQUN3AE.js.map} +1 -1
- package/dist/{chunk-TIINMQSD.js → chunk-XR3KUHJ5.js} +3 -3
- package/dist/{chunk-TIINMQSD.js.map → chunk-XR3KUHJ5.js.map} +1 -1
- package/dist/{chunk-HP6JTFNR.js → chunk-YFOHAHZE.js} +2 -2
- package/dist/{chunk-HP6JTFNR.js.map → chunk-YFOHAHZE.js.map} +1 -1
- package/dist/{chunk-RMDKB5O7.js → chunk-ZHQUXD6S.js} +3 -3
- package/dist/{chunk-RMDKB5O7.js.map → chunk-ZHQUXD6S.js.map} +1 -1
- package/dist/{chunk-PPIDJP2W.js → chunk-ZPEDC5V3.js} +5 -5
- package/dist/{chunk-PPIDJP2W.js.map → chunk-ZPEDC5V3.js.map} +1 -1
- package/dist/database/index.js +3 -3
- package/dist/event-queue/index.d.ts +4 -4
- package/dist/export/index.d.ts +2 -2
- package/dist/export/index.js +6 -5
- package/dist/feature-flags/index.js +2 -1
- package/dist/gateway/index.d.ts +2 -2
- package/dist/gateway/index.js +5 -4
- package/dist/gateway/security/index.js +1 -1
- package/dist/graph/index.d.ts +3 -3
- package/dist/graph/index.js +3 -3
- package/dist/{graphql-DH3L5Hj7.d.ts → graphql-CNhiZ89U.d.ts} +1 -1
- package/dist/{index-DLyc5o_K.d.ts → index-B-w7NWpD.d.ts} +1 -1
- package/dist/{index-BqSh1K8I.d.ts → index-B0ebYV9W.d.ts} +1 -1
- package/dist/{index-Dg4kH1VJ.d.ts → index-B4ciT3OZ.d.ts} +1 -1
- package/dist/{index-BVjR9llq.d.ts → index-BCUkR8sC.d.ts} +1 -1
- package/dist/{index-KA3gg4es.d.ts → index-BKjt3X8L.d.ts} +1 -1
- package/dist/{index-fhOvuvlv.d.ts → index-CVFEyBvK.d.ts} +1 -1
- package/dist/{index-C7T0Xx19.d.ts → index-D7BJuXP3.d.ts} +3 -3
- package/dist/{index-Caqvetqq.d.ts → index-D9RN6jp1.d.ts} +2 -0
- package/dist/{index-Cz9_vPi7.d.ts → index-DYQF_AIz.d.ts} +2 -2
- package/dist/{index-DBF8VqIf.d.ts → index-DkObbJD_.d.ts} +1 -1
- package/dist/{index-BZPEyVOl.d.ts → index-DohlGQGw.d.ts} +3 -3
- package/dist/{index-DohaJRZP.d.ts → index-DraeealK.d.ts} +2 -2
- package/dist/index.d.ts +23 -19
- package/dist/index.js +35 -161
- package/dist/index.js.map +1 -1
- package/dist/init/index.d.ts +2 -2
- package/dist/init/index.js +6 -5
- package/dist/instrumentation/index.d.ts +3 -3
- package/dist/layer/index.d.ts +2 -2
- package/dist/layer/index.js +2 -2
- package/dist/{layer-CUu_cZ7d.d.ts → layer-GNAVXBMf.d.ts} +2 -0
- package/dist/logger/index.d.ts +2 -2
- package/dist/notifications/index.d.ts +3 -3
- package/dist/notifications/index.js +3 -3
- package/dist/rbac/index.d.ts +3 -3
- package/dist/rbac/index.js +3 -3
- package/dist/resource-caps/index.d.ts +2 -2
- package/dist/server/index.js +5 -3
- package/dist/server/index.js.map +1 -1
- package/dist/telemetry/index.d.ts +4 -4
- package/dist/temporal/index.d.ts +1 -1
- package/dist/temporal/index.js +2 -2
- package/dist/tracker/index.d.ts +4 -4
- package/dist/tracker/index.js +5 -5
- package/dist/workspace-guard-4BUG4ZP2.js +5 -0
- package/dist/{workspace-guard-3JLBFAMH.js.map → workspace-guard-4BUG4ZP2.js.map} +1 -1
- package/package.json +3 -7
- package/dist/chunk-O6RHB2YP.js.map +0 -1
- package/dist/chunk-OJWJVZY5.js.map +0 -1
- package/dist/chunk-VWCN5PMD.js.map +0 -1
- package/dist/chunk-VWNL2O3G.js.map +0 -1
- package/dist/workspace-guard-3JLBFAMH.js +0 -5
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GatewayClient } from './chunk-
|
|
1
|
+
import { GatewayClient } from './chunk-N7UJFZQH.js';
|
|
2
2
|
import { __export, __name } from './chunk-XE4OXN2W.js';
|
|
3
3
|
|
|
4
4
|
// src/export/index.ts
|
|
@@ -624,5 +624,5 @@ async function triggerExportJob(params) {
|
|
|
624
624
|
__name(triggerExportJob, "triggerExportJob");
|
|
625
625
|
|
|
626
626
|
export { BaseModuleExporter, PaginationService, convertToCSV, csvToJSON, estimateCSVSize, export_exports, getCSVHeaders, parseCSV, triggerExportJob };
|
|
627
|
-
//# sourceMappingURL=chunk-
|
|
628
|
-
//# sourceMappingURL=chunk-
|
|
627
|
+
//# sourceMappingURL=chunk-X7QMT2P6.js.map
|
|
628
|
+
//# sourceMappingURL=chunk-X7QMT2P6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/export/index.ts","../src/export/base-exporter.ts","../src/export/pagination.ts","../src/export/csv.ts","../src/export/gateway-client.ts"],"names":["BaseModuleExporter","moduleKey","displayName","description","defaultExcludeFields","supportedProducts","modelName","filterFields","entity","excludeFields","fieldsToExclude","length","filtered","record","key","value","Object","entries","includes","filterFieldsMany","entities","map","paginate","queryFn","page","pageSize","skip","take","items","total","data","hasMore","nextCursor","String","undefined","fetchAll","fetchBatch","batchSize","allItems","cursor","batch","push","lastItem","id","transformForExport","validateOptions","options","validFormats","format","Error","join","getSupportedFormats","getMetadata","supportedFormats","PaginationService","params","start","end","paginatedItems","slice","totalCount","pageInfo","hasNextPage","hasPreviousPage","startCursor","endCursor","Math","min","calculatePagination","totalPages","ceil","startIndex","endIndex","currentPage","paginatedQuery","fetchFn","limit","initialCursor","totalYielded","item","collectPaginatedQuery","createPrismaFetchFn","_batchSize","calculateOffset","max","parseCursor","decoded","Buffer","from","toString","JSON","parse","createCursor","stringify","FORMULA_PREFIX_RE","sanitizeCSVCell","test","convertToCSV","delimiter","includeHeaders","flattenFields","maxFlattenDepth","flattenObject","obj","prefix","depth","result","newKey","Date","toISOString","Array","isArray","assign","flattenedRecords","allKeys","Set","keys","add","headers","sort","a","b","localeCompare","escapeCSV","sanitizedValue","replace","lines","row","header","parseCSV","csv","hasHeaders","split","filter","line","trim","parseLine","values","current","inQuotes","i","char","nextChar","dataLines","firstLine","firstRow","_","forEach","csvToJSON","pretty","parseOptions","getCSVHeaders","collectKeys","fullKey","estimateCSVSize","sampleSize","sample","sampleCSV","averageRowSize","headerSize","CREATE_EXPORT_JOB_MUTATION","triggerExportJob","serviceName","layer","actorId","actorType","workspaceId","name","entityTypes","includeMetadata","dateRangeStart","dateRangeEnd","client","GatewayClient","input","response","internalQuery","query","variables","job","createExportJob"],"mappings":"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","file":"chunk-5HL47UH2.js","sourcesContent":["/**\n * Export Module\n *\n * Provides common utilities for data export operations across all Burdenoff microservices.\n * Includes pagination services, base exporter classes, CSV utilities, and type definitions.\n *\n * @module export\n *\n * @example\n * ```typescript\n * // Import from the export module\n * import {\n * BaseModuleExporter,\n * PaginationService,\n * convertToCSV,\n * } from '@burdenoff/be-sdk/export';\n *\n * // Create a custom exporter\n * class UserExporter extends BaseModuleExporter<User> {\n * moduleKey = 'users';\n * displayName = 'Users';\n *\n * async export(options: ExportOptions): Promise<ExportResult> {\n * const data = await this.fetchAll(\n * (cursor) => db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : {},\n * take: 100,\n * })\n * );\n *\n * const csv = convertToCSV(data);\n * return { data, format: 'csv' };\n * }\n * }\n *\n * // Use pagination utilities\n * const result = PaginationService.paginate(items, { page: 1, pageSize: 20 });\n * ```\n */\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n // Export format types\n ExportFormat,\n ExportFormatEnum,\n\n // Configuration types\n ExportConfig,\n ExportOptions,\n\n // Job types\n ExportJobStatus,\n ExportJob,\n ExportProgress,\n ExportResult,\n\n // Fetch types\n ExportFetchOptions,\n ExportFetchResult,\n\n // Pagination types\n PaginationParams,\n PaginatedResult,\n PaginatedQueryOptions,\n PaginateResult,\n PaginateQueryFn,\n\n // Module interface\n ExportableModule,\n\n // CSV types\n CSVConversionOptions,\n} from './types.js';\n\n// ============================================================================\n// Class Exports\n// ============================================================================\n\nexport { BaseModuleExporter } from './base-exporter.js';\nexport { PaginationService } from './pagination.js';\n\n// ============================================================================\n// Function Exports\n// ============================================================================\n\nexport { convertToCSV, parseCSV, csvToJSON, getCSVHeaders, estimateCSVSize } from './csv.js';\n\n// ============================================================================\n// Gateway Helper Exports\n// ============================================================================\n\nexport { triggerExportJob } from './gateway-client.js';\nexport type { TriggerExportJobParams, ExportJobResult, ExportActorType, ExportFormatGql } from './gateway-client.js';\n","/**\n * Base Module Exporter\n *\n * Abstract base class for module exporters across all Burdenoff microservices.\n * Provides common functionality for exporting data from different modules.\n *\n * @module export/base-exporter\n *\n * @example\n * ```typescript\n * import { BaseModuleExporter } from '@burdenoff/be-sdk/export';\n *\n * class UserExporter extends BaseModuleExporter<User> {\n * moduleKey = 'users';\n * displayName = 'Users';\n * description = 'Export user data';\n *\n * async export(options: ExportOptions): Promise<ExportResult> {\n * // Implementation\n * }\n * }\n * ```\n */\n\nimport type { ExportOptions, ExportResult, PaginateQueryFn, PaginateResult } from './types.js';\n\n/**\n * Abstract base class for module exporters\n *\n * Provides common functionality that all module exporters can inherit:\n * - Field filtering\n * - Pagination helpers\n * - Module metadata\n *\n * @typeParam T - The type of entity this exporter handles\n */\nexport abstract class BaseModuleExporter<T = unknown> {\n /** Unique key identifying this module (e.g., 'users', 'tags', 'orders') */\n moduleKey?: string;\n\n /** Human-readable display name for the module */\n displayName?: string;\n\n /** Description of what this module exports */\n description?: string;\n\n /** Default fields to exclude from export (e.g., sensitive data) */\n defaultExcludeFields?: string[];\n\n /** List of product IDs this exporter supports */\n supportedProducts?: string[];\n\n /** Model name for database operations */\n protected modelName?: string;\n\n /**\n * Export data from this module\n *\n * Subclasses should implement this method to perform the actual export.\n * The method is optional to allow for gradual implementation.\n *\n * @param options - Export options including format, filters, and pagination\n * @returns Export result with data or download URL\n */\n export?(options: ExportOptions): Promise<ExportResult>;\n\n /**\n * Filter fields from an entity based on exclude list\n *\n * Use this to remove sensitive or unnecessary fields from exported data.\n *\n * @param entity - Entity to filter\n * @param excludeFields - Fields to exclude (uses defaultExcludeFields if not provided)\n * @returns Filtered entity as a plain object\n *\n * @example\n * ```typescript\n * const user = { id: '1', name: 'John', password: 'secret', ssn: '123' };\n * const filtered = this.filterFields(user, ['password', 'ssn']);\n * // Result: { id: '1', name: 'John' }\n * ```\n */\n protected filterFields(entity: T | Record<string, unknown>, excludeFields?: string[]): Record<string, unknown> {\n const fieldsToExclude = excludeFields || this.defaultExcludeFields || [];\n\n if (fieldsToExclude.length === 0) {\n return entity as Record<string, unknown>;\n }\n\n const filtered: Record<string, unknown> = {};\n const record = entity as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(record)) {\n if (!fieldsToExclude.includes(key)) {\n filtered[key] = value;\n }\n }\n\n return filtered;\n }\n\n /**\n * Filter multiple entities\n *\n * @param entities - Array of entities to filter\n * @param excludeFields - Fields to exclude\n * @returns Array of filtered entities\n */\n protected filterFieldsMany(\n entities: (T | Record<string, unknown>)[],\n excludeFields?: string[]\n ): Record<string, unknown>[] {\n return entities.map((entity) => this.filterFields(entity, excludeFields));\n }\n\n /**\n * Paginate helper for database queries\n *\n * Use this to implement paginated data fetching in your export method.\n *\n * @param queryFn - Function that executes the paginated query\n * @param page - Page number (1-indexed)\n * @param pageSize - Number of items per page\n * @returns Paginated result with data and metadata\n *\n * @example\n * ```typescript\n * const result = await this.paginate(\n * async ({ skip, take }) => {\n * const items = await db.user.findMany({ skip, take });\n * const total = await db.user.count();\n * return { items, total };\n * },\n * 1,\n * 100\n * );\n * ```\n */\n protected async paginate(\n queryFn: PaginateQueryFn<T>,\n page: number = 1,\n pageSize: number = 100\n ): Promise<PaginateResult<T>> {\n const skip = (page - 1) * pageSize;\n const take = pageSize;\n\n const { items, total } = await queryFn({ skip, take });\n\n return {\n data: items,\n total,\n hasMore: skip + items.length < total,\n nextCursor: items.length > 0 && skip + items.length < total ? String(page + 1) : undefined,\n };\n }\n\n /**\n * Fetch all data using cursor-based pagination\n *\n * Use this for exporting large datasets efficiently.\n *\n * @param fetchBatch - Function to fetch a batch of data\n * @param batchSize - Number of items per batch\n * @returns All fetched items\n *\n * @example\n * ```typescript\n * const allUsers = await this.fetchAll(\n * async (cursor) => db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : undefined,\n * orderBy: { id: 'asc' },\n * take: 100,\n * }),\n * 100\n * );\n * ```\n */\n protected async fetchAll(\n fetchBatch: (cursor?: string) => Promise<(T & { id: string })[]>,\n batchSize: number = 100\n ): Promise<T[]> {\n const allItems: T[] = [];\n let cursor: string | undefined;\n\n while (true) {\n const batch = await fetchBatch(cursor);\n\n if (batch.length === 0) {\n break;\n }\n\n allItems.push(...batch);\n\n // Get cursor from last item\n const lastItem = batch[batch.length - 1];\n if (lastItem) {\n cursor = lastItem.id;\n }\n\n // If we got fewer items than batch size, we're done\n if (batch.length < batchSize) {\n break;\n }\n }\n\n return allItems;\n }\n\n /**\n * Transform entity for export\n *\n * Override this method to customize how entities are transformed before export.\n * Default implementation returns the entity as-is after field filtering.\n *\n * @param entity - Entity to transform\n * @param excludeFields - Fields to exclude\n * @returns Transformed entity\n */\n protected transformForExport(entity: T, excludeFields?: string[]): Record<string, unknown> {\n return this.filterFields(entity, excludeFields);\n }\n\n /**\n * Validate export options\n *\n * Override this to add custom validation for export options.\n *\n * @param options - Export options to validate\n * @throws Error if options are invalid\n */\n protected validateOptions(options: ExportOptions): void {\n const validFormats = ['csv', 'json', 'xlsx'];\n if (!validFormats.includes(options.format)) {\n throw new Error(`Invalid export format: ${options.format}. Valid formats: ${validFormats.join(', ')}`);\n }\n }\n\n /**\n * Get supported export formats\n *\n * @returns Array of supported format strings\n */\n getSupportedFormats(): string[] {\n return ['csv', 'json', 'xlsx'];\n }\n\n /**\n * Get module metadata\n *\n * @returns Module metadata object\n */\n getMetadata(): {\n moduleKey?: string;\n displayName?: string;\n description?: string;\n supportedProducts?: string[];\n supportedFormats: string[];\n } {\n return {\n moduleKey: this.moduleKey,\n displayName: this.displayName,\n description: this.description,\n supportedProducts: this.supportedProducts,\n supportedFormats: this.getSupportedFormats(),\n };\n }\n}\n","/**\n * Pagination Service\n *\n * Provides pagination utilities for export operations across all Burdenoff microservices.\n * Supports both offset-based and cursor-based pagination strategies.\n *\n * @module export/pagination\n *\n * @example\n * ```typescript\n * import { PaginationService } from '@burdenoff/be-sdk/export';\n *\n * // Offset-based pagination\n * const result = PaginationService.paginate(items, { page: 2, pageSize: 20 });\n *\n * // Cursor-based pagination with async generator\n * for await (const item of PaginationService.paginatedQuery(fetchFn, { limit: 100 })) {\n * console.log(item);\n * }\n * ```\n */\n\nimport type { PaginatedQueryOptions, PaginatedResult, PaginationParams } from './types.js';\n\n/**\n * Service providing pagination utilities for export and data fetching operations\n */\nexport class PaginationService {\n /**\n * Paginate an array of items using offset-based pagination\n *\n * @param items - Array of items to paginate\n * @param params - Pagination parameters\n * @returns Paginated result with items and metadata\n *\n * @example\n * ```typescript\n * const allUsers = await db.user.findMany();\n * const page = PaginationService.paginate(allUsers, { page: 1, pageSize: 10 });\n * console.log(page.items); // First 10 users\n * console.log(page.pageInfo.hasNextPage); // true if more pages exist\n * ```\n */\n static paginate<T>(items: T[], params: PaginationParams): PaginatedResult<T> {\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 20;\n const start = (page - 1) * pageSize;\n const end = start + pageSize;\n\n const paginatedItems = items.slice(start, end);\n\n return {\n items: paginatedItems,\n totalCount: items.length,\n pageInfo: {\n hasNextPage: end < items.length,\n hasPreviousPage: page > 1,\n startCursor: paginatedItems.length > 0 ? String(start) : undefined,\n endCursor: paginatedItems.length > 0 ? String(Math.min(end, items.length) - 1) : undefined,\n },\n };\n }\n\n /**\n * Calculate pagination metadata without slicing data\n *\n * @param totalCount - Total number of items\n * @param page - Current page number (1-indexed)\n * @param pageSize - Items per page\n * @returns Pagination metadata\n *\n * @example\n * ```typescript\n * const meta = PaginationService.calculatePagination(150, 3, 20);\n * // meta.hasNextPage = true (page 4 exists)\n * // meta.hasPreviousPage = true (page 2 exists)\n * // meta.totalPages = 8\n * ```\n */\n static calculatePagination(\n totalCount: number,\n page: number,\n pageSize: number\n ): {\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n totalPages: number;\n currentPage: number;\n pageSize: number;\n startIndex: number;\n endIndex: number;\n } {\n const totalPages = Math.ceil(totalCount / pageSize);\n const startIndex = (page - 1) * pageSize;\n const endIndex = Math.min(startIndex + pageSize - 1, totalCount - 1);\n\n return {\n hasNextPage: page < totalPages,\n hasPreviousPage: page > 1,\n totalPages,\n currentPage: page,\n pageSize,\n startIndex,\n endIndex,\n };\n }\n\n /**\n * Async generator for paginated database queries using cursor-based pagination\n *\n * This is ideal for processing large datasets without loading everything into memory.\n * The generator yields items one at a time, fetching new batches as needed.\n *\n * @param fetchFn - Function to fetch data given a cursor\n * @param options - Pagination options\n * @returns Async generator of items\n *\n * @example\n * ```typescript\n * // Define fetch function that queries the database\n * const fetchUsers = async (cursor?: string) => {\n * return db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : undefined,\n * orderBy: { id: 'asc' },\n * take: 100,\n * });\n * };\n *\n * // Process all users without loading all into memory\n * for await (const user of PaginationService.paginatedQuery(fetchUsers)) {\n * await processUser(user);\n * }\n * ```\n */\n static async *paginatedQuery<T extends { id: string }>(\n fetchFn: (cursor?: string) => Promise<T[]>,\n options: PaginatedQueryOptions = {}\n ): AsyncGenerator<T, void, unknown> {\n const { limit, initialCursor } = options;\n let cursor = initialCursor;\n let hasMore = true;\n let totalYielded = 0;\n\n while (hasMore) {\n const items = await fetchFn(cursor);\n\n if (items.length === 0) {\n break;\n }\n\n for (const item of items) {\n yield item;\n totalYielded++;\n\n if (limit && totalYielded >= limit) {\n return;\n }\n }\n\n // Get next cursor from last item\n const lastItem = items[items.length - 1];\n if (lastItem) {\n cursor = lastItem.id;\n }\n\n // If we got fewer items than expected batch size, we're done\n // Note: This assumes fetchFn respects a consistent batch size internally\n hasMore = items.length > 0;\n }\n }\n\n /**\n * Collect all items from a paginated query into an array\n *\n * @param fetchFn - Function to fetch data given a cursor\n * @param options - Pagination options\n * @returns Array of all items\n *\n * @example\n * ```typescript\n * const allUsers = await PaginationService.collectPaginatedQuery(fetchUsers, { limit: 1000 });\n * ```\n */\n static async collectPaginatedQuery<T extends { id: string }>(\n fetchFn: (cursor?: string) => Promise<T[]>,\n options: PaginatedQueryOptions = {}\n ): Promise<T[]> {\n const items: T[] = [];\n\n for await (const item of PaginationService.paginatedQuery(fetchFn, options)) {\n items.push(item);\n }\n\n return items;\n }\n\n /**\n * Create a cursor-based paginated fetch function from a Prisma-style query\n *\n * @param queryFn - Prisma-style query function\n * @param batchSize - Number of items to fetch per batch\n * @returns Fetch function compatible with paginatedQuery\n *\n * @example\n * ```typescript\n * const fetchFn = PaginationService.createPrismaFetchFn(\n * (cursor) => db.user.findMany({\n * where: { isActive: true, ...(cursor ? { id: { gt: cursor } } : {}) },\n * orderBy: { id: 'asc' },\n * take: 100,\n * }),\n * 100\n * );\n *\n * for await (const user of PaginationService.paginatedQuery(fetchFn)) {\n * console.log(user);\n * }\n * ```\n */\n static createPrismaFetchFn<T extends { id: string }>(\n queryFn: (cursor?: string) => Promise<T[]>,\n _batchSize: number = 100\n ): (cursor?: string) => Promise<T[]> {\n return queryFn;\n }\n\n /**\n * Calculate offset for skip-based pagination\n *\n * @param page - Page number (1-indexed)\n * @param pageSize - Items per page\n * @returns Offset value for skip\n */\n static calculateOffset(page: number, pageSize: number): number {\n return (Math.max(1, page) - 1) * pageSize;\n }\n\n /**\n * Parse cursor string to extract pagination state\n *\n * @param cursor - Base64-encoded cursor string\n * @returns Decoded cursor data or null if invalid\n */\n static parseCursor<T = Record<string, unknown>>(cursor: string): T | null {\n try {\n const decoded = Buffer.from(cursor, 'base64').toString('utf-8');\n return JSON.parse(decoded) as T;\n } catch {\n return null;\n }\n }\n\n /**\n * Create cursor string from pagination state\n *\n * @param data - Data to encode in cursor\n * @returns Base64-encoded cursor string\n */\n static createCursor(data: Record<string, unknown>): string {\n return Buffer.from(JSON.stringify(data)).toString('base64');\n }\n}\n","/**\n * CSV Utilities\n *\n * Utilities for converting data to CSV format for export operations.\n *\n * @module export/csv\n *\n * @example\n * ```typescript\n * import { convertToCSV, parseCSV } from '@burdenoff/be-sdk/export';\n *\n * const csv = convertToCSV(users, { includeHeaders: true });\n * console.log(csv);\n * ```\n */\n\nimport type { CSVConversionOptions } from './types.js';\n\nconst FORMULA_PREFIX_RE = /^[=+\\-@]/;\n\nexport function sanitizeCSVCell(value: string): string {\n return FORMULA_PREFIX_RE.test(value) ? `'${value}` : value;\n}\n\n/**\n * Convert an array of objects to CSV format\n *\n * Handles nested objects by flattening them with dot notation.\n * Arrays are JSON stringified.\n * Dates are converted to ISO strings.\n *\n * @param data - Array of objects to convert\n * @param options - CSV conversion options\n * @returns CSV string\n *\n * @example\n * ```typescript\n * const users = [\n * { id: 1, name: 'John', address: { city: 'NYC' } },\n * { id: 2, name: 'Jane', address: { city: 'LA' } },\n * ];\n *\n * const csv = convertToCSV(users);\n * // Output:\n * // id,name,address.city\n * // 1,John,NYC\n * // 2,Jane,LA\n * ```\n */\nexport function convertToCSV(data: unknown[], options: CSVConversionOptions = {}): string {\n const { delimiter = ',', includeHeaders = true, flattenFields = true, maxFlattenDepth = 3 } = options;\n\n if (data.length === 0) {\n return '';\n }\n\n // Flatten objects and get all keys\n const flattenObject = (obj: unknown, prefix = '', depth = 0): Record<string, string> => {\n const result: Record<string, string> = {};\n\n if (obj === null || obj === undefined) {\n return result;\n }\n\n if (typeof obj !== 'object') {\n return { [prefix || 'value']: String(obj) };\n }\n\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (value === null || value === undefined) {\n result[newKey] = '';\n } else if (value instanceof Date) {\n result[newKey] = value.toISOString();\n } else if (Array.isArray(value)) {\n result[newKey] = JSON.stringify(value);\n } else if (typeof value === 'object' && flattenFields && depth < maxFlattenDepth) {\n Object.assign(result, flattenObject(value, newKey, depth + 1));\n } else if (typeof value === 'object') {\n result[newKey] = JSON.stringify(value);\n } else {\n result[newKey] = String(value);\n }\n }\n\n return result;\n };\n\n // Flatten all records and collect all keys\n const flattenedRecords = data.map((item) => flattenObject(item));\n const allKeys = new Set<string>();\n for (const record of flattenedRecords) {\n for (const key of Object.keys(record)) {\n allKeys.add(key);\n }\n }\n\n const headers = Array.from(allKeys).sort((a, b) => a.localeCompare(b));\n\n // Escape CSV values\n const escapeCSV = (value: string): string => {\n const sanitizedValue = sanitizeCSVCell(value);\n\n if (\n sanitizedValue.includes(delimiter) ||\n sanitizedValue.includes('\"') ||\n sanitizedValue.includes('\\n') ||\n sanitizedValue.includes('\\r')\n ) {\n return `\"${sanitizedValue.replace(/\"/g, '\"\"')}\"`;\n }\n return sanitizedValue;\n };\n\n // Build CSV\n const lines: string[] = [];\n\n if (includeHeaders) {\n lines.push(headers.map(escapeCSV).join(delimiter));\n }\n\n for (const record of flattenedRecords) {\n const row = headers.map((header) => escapeCSV(record[header] || ''));\n lines.push(row.join(delimiter));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Parse a CSV string into an array of objects\n *\n * @param csv - CSV string to parse\n * @param options - Parse options\n * @returns Array of parsed objects\n *\n * @example\n * ```typescript\n * const csv = 'id,name\\n1,John\\n2,Jane';\n * const data = parseCSV(csv);\n * // [{ id: '1', name: 'John' }, { id: '2', name: 'Jane' }]\n * ```\n */\nexport function parseCSV(\n csv: string,\n options: { delimiter?: string; hasHeaders?: boolean } = {}\n): Record<string, string>[] {\n const { delimiter = ',', hasHeaders = true } = options;\n\n const lines = csv.split(/\\r?\\n/).filter((line) => line.trim());\n\n if (lines.length === 0) {\n return [];\n }\n\n // Parse a single CSV line, handling quoted values\n const parseLine = (line: string): string[] => {\n const values: string[] = [];\n let current = '';\n let inQuotes = false;\n\n let i = 0;\n while (i < line.length) {\n const char = line[i];\n const nextChar = line[i + 1];\n\n if (char === '\"' && inQuotes && nextChar === '\"') {\n current += '\"';\n i += 2; // Skip next quote\n } else if (char === '\"') {\n inQuotes = !inQuotes;\n i++;\n } else if (char === delimiter && !inQuotes) {\n values.push(current);\n current = '';\n i++;\n } else {\n current += char;\n i++;\n }\n }\n\n values.push(current);\n return values;\n };\n\n let headers: string[];\n let dataLines: string[];\n\n // We've already checked that lines.length > 0, so lines[0] is guaranteed to exist\n const firstLine = lines[0] as string;\n\n if (hasHeaders) {\n headers = parseLine(firstLine);\n dataLines = lines.slice(1);\n } else {\n // Generate numeric headers if no header row\n const firstRow = parseLine(firstLine);\n headers = firstRow.map((_, i) => `col${i}`);\n dataLines = lines;\n }\n\n return dataLines.map((line) => {\n const values = parseLine(line);\n const obj: Record<string, string> = {};\n\n headers.forEach((header, i) => {\n obj[header] = values[i] || '';\n });\n\n return obj;\n });\n}\n\n/**\n * Convert CSV to JSON string\n *\n * @param csv - CSV string\n * @param options - Parse options\n * @returns JSON string\n */\nexport function csvToJSON(\n csv: string,\n options: { delimiter?: string; hasHeaders?: boolean; pretty?: boolean } = {}\n): string {\n const { pretty = false, ...parseOptions } = options;\n const data = parseCSV(csv, parseOptions);\n return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n}\n\n/**\n * Get CSV headers from data\n *\n * @param data - Array of objects\n * @param flattenFields - Whether to flatten nested objects\n * @returns Array of header strings\n */\nexport function getCSVHeaders(data: unknown[], flattenFields: boolean = true): string[] {\n if (data.length === 0) {\n return [];\n }\n\n const collectKeys = (obj: unknown, prefix = '', depth = 0): string[] => {\n const keys: string[] = [];\n\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return prefix ? [prefix] : [];\n }\n\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n flattenFields &&\n depth < 3\n ) {\n keys.push(...collectKeys(value, fullKey, depth + 1));\n } else {\n keys.push(fullKey);\n }\n }\n\n return keys;\n };\n\n const allKeys = new Set<string>();\n for (const item of data) {\n for (const key of collectKeys(item)) {\n allKeys.add(key);\n }\n }\n\n return Array.from(allKeys).sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Estimate CSV file size for a dataset\n *\n * @param data - Array of objects\n * @param sampleSize - Number of records to sample for estimation\n * @returns Estimated size in bytes\n */\nexport function estimateCSVSize(data: unknown[], sampleSize: number = 100): number {\n if (data.length === 0) {\n return 0;\n }\n\n // Take a sample to estimate average row size\n const sample = data.slice(0, Math.min(sampleSize, data.length));\n const sampleCSV = convertToCSV(sample);\n const averageRowSize = sampleCSV.length / sample.length;\n\n // Estimate total size (headers + data rows)\n const headers = getCSVHeaders(data);\n const headerSize = headers.join(',').length + 1; // +1 for newline\n\n return Math.ceil(headerSize + averageRowSize * data.length);\n}\n","/**\n * Export Gateway Helper\n *\n * Centralised wrapper around the workspace internal gateway's\n * `createExportJob` mutation, used by per-svc convenience resolvers\n * (e.g. `createTagsExportJob`, `createGroupsExportJob`).\n *\n * Replaces the duplicated `src/clients/export-gateway.ts` files that\n * existed in 19+ workspace svcs.\n *\n * @module export/gateway-client\n *\n * @example\n * ```typescript\n * import { triggerExportJob } from '@burdenoff/be-sdk/export';\n *\n * const result = await triggerExportJob({\n * serviceName: 'wspace-tags-svc',\n * workspaceId: ctx.workspaceId,\n * name: input.name,\n * entityTypes: ['tags', 'vocabularies'],\n * format: input.format,\n * actorId: ctx.actorId,\n * actorType: ctx.actorType,\n * });\n * ```\n */\n\nimport { GatewayClient } from '../gateway/index.js';\nimport type { ServiceLayer } from '../types/layer.js';\n\nconst CREATE_EXPORT_JOB_MUTATION = `mutation CreateExportJob($input: CreateExportJobInput!) {\n createExportJob(input: $input) {\n id\n status\n workspaceId\n entityTypes\n format\n createdAt\n }\n}`;\n\nexport type ExportActorType = 'user' | 'app' | 'service' | 'super_admin';\nexport type ExportFormatGql = 'JSON' | 'CSV';\n\nexport interface TriggerExportJobParams {\n /** Caller service name, used by gateway client telemetry/auth */\n serviceName: string;\n /** Layer for the gateway. Defaults to `wspace`. */\n layer?: ServiceLayer;\n /** Workspace context (required for wspace exports). */\n workspaceId: string;\n /** Human-readable name for the export job. */\n name: string;\n /** Entity types registered in `wspace-export-svc` to include. */\n entityTypes: string[];\n /** Output format. */\n format: ExportFormatGql;\n /** Actor making the request (forwarded to RBAC). */\n actorId: string;\n actorType: ExportActorType;\n /** Whether to include extended metadata in the export ZIP. */\n includeMetadata?: boolean;\n /** Optional ISO date-range bounds. */\n dateRangeStart?: string;\n dateRangeEnd?: string;\n}\n\nexport interface ExportJobResult {\n id: string;\n status: string;\n workspaceId: string;\n entityTypes: string[];\n format: string;\n createdAt: string;\n}\n\ninterface CreateExportJobResponse {\n createExportJob?: ExportJobResult;\n}\n\n/**\n * Submit a `createExportJob` mutation to the workspace internal gateway.\n *\n * The caller is expected to map the returned `ExportJobResult` to its\n * own GraphQL output type (the per-svc `ExportJobResponse`).\n */\nexport async function triggerExportJob(params: TriggerExportJobParams): Promise<ExportJobResult> {\n const {\n serviceName,\n layer = 'wspace',\n actorId,\n actorType,\n workspaceId,\n name,\n entityTypes,\n format,\n includeMetadata,\n dateRangeStart,\n dateRangeEnd,\n } = params;\n\n const client = new GatewayClient({ layer, serviceName });\n\n const input = {\n workspaceId,\n name,\n entityTypes,\n format,\n ...(includeMetadata !== undefined ? { includeMetadata } : {}),\n ...(dateRangeStart !== undefined ? { dateRangeStart } : {}),\n ...(dateRangeEnd !== undefined ? { dateRangeEnd } : {}),\n };\n\n const response = await client.internalQuery<CreateExportJobResponse>({\n query: CREATE_EXPORT_JOB_MUTATION,\n variables: { input },\n headers: {\n 'x-actor-id': actorId,\n 'x-actor-type': actorType,\n 'x-workspace-id': workspaceId,\n },\n });\n\n const job = response.data?.createExportJob;\n if (!job) {\n throw new Error('Export service did not return a job');\n }\n return job;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/export/index.ts","../src/export/base-exporter.ts","../src/export/pagination.ts","../src/export/csv.ts","../src/export/gateway-client.ts"],"names":["BaseModuleExporter","moduleKey","displayName","description","defaultExcludeFields","supportedProducts","modelName","filterFields","entity","excludeFields","fieldsToExclude","length","filtered","record","key","value","Object","entries","includes","filterFieldsMany","entities","map","paginate","queryFn","page","pageSize","skip","take","items","total","data","hasMore","nextCursor","String","undefined","fetchAll","fetchBatch","batchSize","allItems","cursor","batch","push","lastItem","id","transformForExport","validateOptions","options","validFormats","format","Error","join","getSupportedFormats","getMetadata","supportedFormats","PaginationService","params","start","end","paginatedItems","slice","totalCount","pageInfo","hasNextPage","hasPreviousPage","startCursor","endCursor","Math","min","calculatePagination","totalPages","ceil","startIndex","endIndex","currentPage","paginatedQuery","fetchFn","limit","initialCursor","totalYielded","item","collectPaginatedQuery","createPrismaFetchFn","_batchSize","calculateOffset","max","parseCursor","decoded","Buffer","from","toString","JSON","parse","createCursor","stringify","FORMULA_PREFIX_RE","sanitizeCSVCell","test","convertToCSV","delimiter","includeHeaders","flattenFields","maxFlattenDepth","flattenObject","obj","prefix","depth","result","newKey","Date","toISOString","Array","isArray","assign","flattenedRecords","allKeys","Set","keys","add","headers","sort","a","b","localeCompare","escapeCSV","sanitizedValue","replace","lines","row","header","parseCSV","csv","hasHeaders","split","filter","line","trim","parseLine","values","current","inQuotes","i","char","nextChar","dataLines","firstLine","firstRow","_","forEach","csvToJSON","pretty","parseOptions","getCSVHeaders","collectKeys","fullKey","estimateCSVSize","sampleSize","sample","sampleCSV","averageRowSize","headerSize","CREATE_EXPORT_JOB_MUTATION","triggerExportJob","serviceName","layer","actorId","actorType","workspaceId","name","entityTypes","includeMetadata","dateRangeStart","dateRangeEnd","client","GatewayClient","input","response","internalQuery","query","variables","job","createExportJob"],"mappings":"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","file":"chunk-X7QMT2P6.js","sourcesContent":["/**\n * Export Module\n *\n * Provides common utilities for data export operations across all Burdenoff microservices.\n * Includes pagination services, base exporter classes, CSV utilities, and type definitions.\n *\n * @module export\n *\n * @example\n * ```typescript\n * // Import from the export module\n * import {\n * BaseModuleExporter,\n * PaginationService,\n * convertToCSV,\n * } from '@burdenoff/be-sdk/export';\n *\n * // Create a custom exporter\n * class UserExporter extends BaseModuleExporter<User> {\n * moduleKey = 'users';\n * displayName = 'Users';\n *\n * async export(options: ExportOptions): Promise<ExportResult> {\n * const data = await this.fetchAll(\n * (cursor) => db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : {},\n * take: 100,\n * })\n * );\n *\n * const csv = convertToCSV(data);\n * return { data, format: 'csv' };\n * }\n * }\n *\n * // Use pagination utilities\n * const result = PaginationService.paginate(items, { page: 1, pageSize: 20 });\n * ```\n */\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n // Export format types\n ExportFormat,\n ExportFormatEnum,\n\n // Configuration types\n ExportConfig,\n ExportOptions,\n\n // Job types\n ExportJobStatus,\n ExportJob,\n ExportProgress,\n ExportResult,\n\n // Fetch types\n ExportFetchOptions,\n ExportFetchResult,\n\n // Pagination types\n PaginationParams,\n PaginatedResult,\n PaginatedQueryOptions,\n PaginateResult,\n PaginateQueryFn,\n\n // Module interface\n ExportableModule,\n\n // CSV types\n CSVConversionOptions,\n} from './types.js';\n\n// ============================================================================\n// Class Exports\n// ============================================================================\n\nexport { BaseModuleExporter } from './base-exporter.js';\nexport { PaginationService } from './pagination.js';\n\n// ============================================================================\n// Function Exports\n// ============================================================================\n\nexport { convertToCSV, parseCSV, csvToJSON, getCSVHeaders, estimateCSVSize } from './csv.js';\n\n// ============================================================================\n// Gateway Helper Exports\n// ============================================================================\n\nexport { triggerExportJob } from './gateway-client.js';\nexport type { TriggerExportJobParams, ExportJobResult, ExportActorType, ExportFormatGql } from './gateway-client.js';\n","/**\n * Base Module Exporter\n *\n * Abstract base class for module exporters across all Burdenoff microservices.\n * Provides common functionality for exporting data from different modules.\n *\n * @module export/base-exporter\n *\n * @example\n * ```typescript\n * import { BaseModuleExporter } from '@burdenoff/be-sdk/export';\n *\n * class UserExporter extends BaseModuleExporter<User> {\n * moduleKey = 'users';\n * displayName = 'Users';\n * description = 'Export user data';\n *\n * async export(options: ExportOptions): Promise<ExportResult> {\n * // Implementation\n * }\n * }\n * ```\n */\n\nimport type { ExportOptions, ExportResult, PaginateQueryFn, PaginateResult } from './types.js';\n\n/**\n * Abstract base class for module exporters\n *\n * Provides common functionality that all module exporters can inherit:\n * - Field filtering\n * - Pagination helpers\n * - Module metadata\n *\n * @typeParam T - The type of entity this exporter handles\n */\nexport abstract class BaseModuleExporter<T = unknown> {\n /** Unique key identifying this module (e.g., 'users', 'tags', 'orders') */\n moduleKey?: string;\n\n /** Human-readable display name for the module */\n displayName?: string;\n\n /** Description of what this module exports */\n description?: string;\n\n /** Default fields to exclude from export (e.g., sensitive data) */\n defaultExcludeFields?: string[];\n\n /** List of product IDs this exporter supports */\n supportedProducts?: string[];\n\n /** Model name for database operations */\n protected modelName?: string;\n\n /**\n * Export data from this module\n *\n * Subclasses should implement this method to perform the actual export.\n * The method is optional to allow for gradual implementation.\n *\n * @param options - Export options including format, filters, and pagination\n * @returns Export result with data or download URL\n */\n export?(options: ExportOptions): Promise<ExportResult>;\n\n /**\n * Filter fields from an entity based on exclude list\n *\n * Use this to remove sensitive or unnecessary fields from exported data.\n *\n * @param entity - Entity to filter\n * @param excludeFields - Fields to exclude (uses defaultExcludeFields if not provided)\n * @returns Filtered entity as a plain object\n *\n * @example\n * ```typescript\n * const user = { id: '1', name: 'John', password: 'secret', ssn: '123' };\n * const filtered = this.filterFields(user, ['password', 'ssn']);\n * // Result: { id: '1', name: 'John' }\n * ```\n */\n protected filterFields(entity: T | Record<string, unknown>, excludeFields?: string[]): Record<string, unknown> {\n const fieldsToExclude = excludeFields || this.defaultExcludeFields || [];\n\n if (fieldsToExclude.length === 0) {\n return entity as Record<string, unknown>;\n }\n\n const filtered: Record<string, unknown> = {};\n const record = entity as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(record)) {\n if (!fieldsToExclude.includes(key)) {\n filtered[key] = value;\n }\n }\n\n return filtered;\n }\n\n /**\n * Filter multiple entities\n *\n * @param entities - Array of entities to filter\n * @param excludeFields - Fields to exclude\n * @returns Array of filtered entities\n */\n protected filterFieldsMany(\n entities: (T | Record<string, unknown>)[],\n excludeFields?: string[]\n ): Record<string, unknown>[] {\n return entities.map((entity) => this.filterFields(entity, excludeFields));\n }\n\n /**\n * Paginate helper for database queries\n *\n * Use this to implement paginated data fetching in your export method.\n *\n * @param queryFn - Function that executes the paginated query\n * @param page - Page number (1-indexed)\n * @param pageSize - Number of items per page\n * @returns Paginated result with data and metadata\n *\n * @example\n * ```typescript\n * const result = await this.paginate(\n * async ({ skip, take }) => {\n * const items = await db.user.findMany({ skip, take });\n * const total = await db.user.count();\n * return { items, total };\n * },\n * 1,\n * 100\n * );\n * ```\n */\n protected async paginate(\n queryFn: PaginateQueryFn<T>,\n page: number = 1,\n pageSize: number = 100\n ): Promise<PaginateResult<T>> {\n const skip = (page - 1) * pageSize;\n const take = pageSize;\n\n const { items, total } = await queryFn({ skip, take });\n\n return {\n data: items,\n total,\n hasMore: skip + items.length < total,\n nextCursor: items.length > 0 && skip + items.length < total ? String(page + 1) : undefined,\n };\n }\n\n /**\n * Fetch all data using cursor-based pagination\n *\n * Use this for exporting large datasets efficiently.\n *\n * @param fetchBatch - Function to fetch a batch of data\n * @param batchSize - Number of items per batch\n * @returns All fetched items\n *\n * @example\n * ```typescript\n * const allUsers = await this.fetchAll(\n * async (cursor) => db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : undefined,\n * orderBy: { id: 'asc' },\n * take: 100,\n * }),\n * 100\n * );\n * ```\n */\n protected async fetchAll(\n fetchBatch: (cursor?: string) => Promise<(T & { id: string })[]>,\n batchSize: number = 100\n ): Promise<T[]> {\n const allItems: T[] = [];\n let cursor: string | undefined;\n\n while (true) {\n const batch = await fetchBatch(cursor);\n\n if (batch.length === 0) {\n break;\n }\n\n allItems.push(...batch);\n\n // Get cursor from last item\n const lastItem = batch[batch.length - 1];\n if (lastItem) {\n cursor = lastItem.id;\n }\n\n // If we got fewer items than batch size, we're done\n if (batch.length < batchSize) {\n break;\n }\n }\n\n return allItems;\n }\n\n /**\n * Transform entity for export\n *\n * Override this method to customize how entities are transformed before export.\n * Default implementation returns the entity as-is after field filtering.\n *\n * @param entity - Entity to transform\n * @param excludeFields - Fields to exclude\n * @returns Transformed entity\n */\n protected transformForExport(entity: T, excludeFields?: string[]): Record<string, unknown> {\n return this.filterFields(entity, excludeFields);\n }\n\n /**\n * Validate export options\n *\n * Override this to add custom validation for export options.\n *\n * @param options - Export options to validate\n * @throws Error if options are invalid\n */\n protected validateOptions(options: ExportOptions): void {\n const validFormats = ['csv', 'json', 'xlsx'];\n if (!validFormats.includes(options.format)) {\n throw new Error(`Invalid export format: ${options.format}. Valid formats: ${validFormats.join(', ')}`);\n }\n }\n\n /**\n * Get supported export formats\n *\n * @returns Array of supported format strings\n */\n getSupportedFormats(): string[] {\n return ['csv', 'json', 'xlsx'];\n }\n\n /**\n * Get module metadata\n *\n * @returns Module metadata object\n */\n getMetadata(): {\n moduleKey?: string;\n displayName?: string;\n description?: string;\n supportedProducts?: string[];\n supportedFormats: string[];\n } {\n return {\n moduleKey: this.moduleKey,\n displayName: this.displayName,\n description: this.description,\n supportedProducts: this.supportedProducts,\n supportedFormats: this.getSupportedFormats(),\n };\n }\n}\n","/**\n * Pagination Service\n *\n * Provides pagination utilities for export operations across all Burdenoff microservices.\n * Supports both offset-based and cursor-based pagination strategies.\n *\n * @module export/pagination\n *\n * @example\n * ```typescript\n * import { PaginationService } from '@burdenoff/be-sdk/export';\n *\n * // Offset-based pagination\n * const result = PaginationService.paginate(items, { page: 2, pageSize: 20 });\n *\n * // Cursor-based pagination with async generator\n * for await (const item of PaginationService.paginatedQuery(fetchFn, { limit: 100 })) {\n * console.log(item);\n * }\n * ```\n */\n\nimport type { PaginatedQueryOptions, PaginatedResult, PaginationParams } from './types.js';\n\n/**\n * Service providing pagination utilities for export and data fetching operations\n */\nexport class PaginationService {\n /**\n * Paginate an array of items using offset-based pagination\n *\n * @param items - Array of items to paginate\n * @param params - Pagination parameters\n * @returns Paginated result with items and metadata\n *\n * @example\n * ```typescript\n * const allUsers = await db.user.findMany();\n * const page = PaginationService.paginate(allUsers, { page: 1, pageSize: 10 });\n * console.log(page.items); // First 10 users\n * console.log(page.pageInfo.hasNextPage); // true if more pages exist\n * ```\n */\n static paginate<T>(items: T[], params: PaginationParams): PaginatedResult<T> {\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 20;\n const start = (page - 1) * pageSize;\n const end = start + pageSize;\n\n const paginatedItems = items.slice(start, end);\n\n return {\n items: paginatedItems,\n totalCount: items.length,\n pageInfo: {\n hasNextPage: end < items.length,\n hasPreviousPage: page > 1,\n startCursor: paginatedItems.length > 0 ? String(start) : undefined,\n endCursor: paginatedItems.length > 0 ? String(Math.min(end, items.length) - 1) : undefined,\n },\n };\n }\n\n /**\n * Calculate pagination metadata without slicing data\n *\n * @param totalCount - Total number of items\n * @param page - Current page number (1-indexed)\n * @param pageSize - Items per page\n * @returns Pagination metadata\n *\n * @example\n * ```typescript\n * const meta = PaginationService.calculatePagination(150, 3, 20);\n * // meta.hasNextPage = true (page 4 exists)\n * // meta.hasPreviousPage = true (page 2 exists)\n * // meta.totalPages = 8\n * ```\n */\n static calculatePagination(\n totalCount: number,\n page: number,\n pageSize: number\n ): {\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n totalPages: number;\n currentPage: number;\n pageSize: number;\n startIndex: number;\n endIndex: number;\n } {\n const totalPages = Math.ceil(totalCount / pageSize);\n const startIndex = (page - 1) * pageSize;\n const endIndex = Math.min(startIndex + pageSize - 1, totalCount - 1);\n\n return {\n hasNextPage: page < totalPages,\n hasPreviousPage: page > 1,\n totalPages,\n currentPage: page,\n pageSize,\n startIndex,\n endIndex,\n };\n }\n\n /**\n * Async generator for paginated database queries using cursor-based pagination\n *\n * This is ideal for processing large datasets without loading everything into memory.\n * The generator yields items one at a time, fetching new batches as needed.\n *\n * @param fetchFn - Function to fetch data given a cursor\n * @param options - Pagination options\n * @returns Async generator of items\n *\n * @example\n * ```typescript\n * // Define fetch function that queries the database\n * const fetchUsers = async (cursor?: string) => {\n * return db.user.findMany({\n * where: cursor ? { id: { gt: cursor } } : undefined,\n * orderBy: { id: 'asc' },\n * take: 100,\n * });\n * };\n *\n * // Process all users without loading all into memory\n * for await (const user of PaginationService.paginatedQuery(fetchUsers)) {\n * await processUser(user);\n * }\n * ```\n */\n static async *paginatedQuery<T extends { id: string }>(\n fetchFn: (cursor?: string) => Promise<T[]>,\n options: PaginatedQueryOptions = {}\n ): AsyncGenerator<T, void, unknown> {\n const { limit, initialCursor } = options;\n let cursor = initialCursor;\n let hasMore = true;\n let totalYielded = 0;\n\n while (hasMore) {\n const items = await fetchFn(cursor);\n\n if (items.length === 0) {\n break;\n }\n\n for (const item of items) {\n yield item;\n totalYielded++;\n\n if (limit && totalYielded >= limit) {\n return;\n }\n }\n\n // Get next cursor from last item\n const lastItem = items[items.length - 1];\n if (lastItem) {\n cursor = lastItem.id;\n }\n\n // If we got fewer items than expected batch size, we're done\n // Note: This assumes fetchFn respects a consistent batch size internally\n hasMore = items.length > 0;\n }\n }\n\n /**\n * Collect all items from a paginated query into an array\n *\n * @param fetchFn - Function to fetch data given a cursor\n * @param options - Pagination options\n * @returns Array of all items\n *\n * @example\n * ```typescript\n * const allUsers = await PaginationService.collectPaginatedQuery(fetchUsers, { limit: 1000 });\n * ```\n */\n static async collectPaginatedQuery<T extends { id: string }>(\n fetchFn: (cursor?: string) => Promise<T[]>,\n options: PaginatedQueryOptions = {}\n ): Promise<T[]> {\n const items: T[] = [];\n\n for await (const item of PaginationService.paginatedQuery(fetchFn, options)) {\n items.push(item);\n }\n\n return items;\n }\n\n /**\n * Create a cursor-based paginated fetch function from a Prisma-style query\n *\n * @param queryFn - Prisma-style query function\n * @param batchSize - Number of items to fetch per batch\n * @returns Fetch function compatible with paginatedQuery\n *\n * @example\n * ```typescript\n * const fetchFn = PaginationService.createPrismaFetchFn(\n * (cursor) => db.user.findMany({\n * where: { isActive: true, ...(cursor ? { id: { gt: cursor } } : {}) },\n * orderBy: { id: 'asc' },\n * take: 100,\n * }),\n * 100\n * );\n *\n * for await (const user of PaginationService.paginatedQuery(fetchFn)) {\n * console.log(user);\n * }\n * ```\n */\n static createPrismaFetchFn<T extends { id: string }>(\n queryFn: (cursor?: string) => Promise<T[]>,\n _batchSize: number = 100\n ): (cursor?: string) => Promise<T[]> {\n return queryFn;\n }\n\n /**\n * Calculate offset for skip-based pagination\n *\n * @param page - Page number (1-indexed)\n * @param pageSize - Items per page\n * @returns Offset value for skip\n */\n static calculateOffset(page: number, pageSize: number): number {\n return (Math.max(1, page) - 1) * pageSize;\n }\n\n /**\n * Parse cursor string to extract pagination state\n *\n * @param cursor - Base64-encoded cursor string\n * @returns Decoded cursor data or null if invalid\n */\n static parseCursor<T = Record<string, unknown>>(cursor: string): T | null {\n try {\n const decoded = Buffer.from(cursor, 'base64').toString('utf-8');\n return JSON.parse(decoded) as T;\n } catch {\n return null;\n }\n }\n\n /**\n * Create cursor string from pagination state\n *\n * @param data - Data to encode in cursor\n * @returns Base64-encoded cursor string\n */\n static createCursor(data: Record<string, unknown>): string {\n return Buffer.from(JSON.stringify(data)).toString('base64');\n }\n}\n","/**\n * CSV Utilities\n *\n * Utilities for converting data to CSV format for export operations.\n *\n * @module export/csv\n *\n * @example\n * ```typescript\n * import { convertToCSV, parseCSV } from '@burdenoff/be-sdk/export';\n *\n * const csv = convertToCSV(users, { includeHeaders: true });\n * console.log(csv);\n * ```\n */\n\nimport type { CSVConversionOptions } from './types.js';\n\nconst FORMULA_PREFIX_RE = /^[=+\\-@]/;\n\nexport function sanitizeCSVCell(value: string): string {\n return FORMULA_PREFIX_RE.test(value) ? `'${value}` : value;\n}\n\n/**\n * Convert an array of objects to CSV format\n *\n * Handles nested objects by flattening them with dot notation.\n * Arrays are JSON stringified.\n * Dates are converted to ISO strings.\n *\n * @param data - Array of objects to convert\n * @param options - CSV conversion options\n * @returns CSV string\n *\n * @example\n * ```typescript\n * const users = [\n * { id: 1, name: 'John', address: { city: 'NYC' } },\n * { id: 2, name: 'Jane', address: { city: 'LA' } },\n * ];\n *\n * const csv = convertToCSV(users);\n * // Output:\n * // id,name,address.city\n * // 1,John,NYC\n * // 2,Jane,LA\n * ```\n */\nexport function convertToCSV(data: unknown[], options: CSVConversionOptions = {}): string {\n const { delimiter = ',', includeHeaders = true, flattenFields = true, maxFlattenDepth = 3 } = options;\n\n if (data.length === 0) {\n return '';\n }\n\n // Flatten objects and get all keys\n const flattenObject = (obj: unknown, prefix = '', depth = 0): Record<string, string> => {\n const result: Record<string, string> = {};\n\n if (obj === null || obj === undefined) {\n return result;\n }\n\n if (typeof obj !== 'object') {\n return { [prefix || 'value']: String(obj) };\n }\n\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (value === null || value === undefined) {\n result[newKey] = '';\n } else if (value instanceof Date) {\n result[newKey] = value.toISOString();\n } else if (Array.isArray(value)) {\n result[newKey] = JSON.stringify(value);\n } else if (typeof value === 'object' && flattenFields && depth < maxFlattenDepth) {\n Object.assign(result, flattenObject(value, newKey, depth + 1));\n } else if (typeof value === 'object') {\n result[newKey] = JSON.stringify(value);\n } else {\n result[newKey] = String(value);\n }\n }\n\n return result;\n };\n\n // Flatten all records and collect all keys\n const flattenedRecords = data.map((item) => flattenObject(item));\n const allKeys = new Set<string>();\n for (const record of flattenedRecords) {\n for (const key of Object.keys(record)) {\n allKeys.add(key);\n }\n }\n\n const headers = Array.from(allKeys).sort((a, b) => a.localeCompare(b));\n\n // Escape CSV values\n const escapeCSV = (value: string): string => {\n const sanitizedValue = sanitizeCSVCell(value);\n\n if (\n sanitizedValue.includes(delimiter) ||\n sanitizedValue.includes('\"') ||\n sanitizedValue.includes('\\n') ||\n sanitizedValue.includes('\\r')\n ) {\n return `\"${sanitizedValue.replace(/\"/g, '\"\"')}\"`;\n }\n return sanitizedValue;\n };\n\n // Build CSV\n const lines: string[] = [];\n\n if (includeHeaders) {\n lines.push(headers.map(escapeCSV).join(delimiter));\n }\n\n for (const record of flattenedRecords) {\n const row = headers.map((header) => escapeCSV(record[header] || ''));\n lines.push(row.join(delimiter));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Parse a CSV string into an array of objects\n *\n * @param csv - CSV string to parse\n * @param options - Parse options\n * @returns Array of parsed objects\n *\n * @example\n * ```typescript\n * const csv = 'id,name\\n1,John\\n2,Jane';\n * const data = parseCSV(csv);\n * // [{ id: '1', name: 'John' }, { id: '2', name: 'Jane' }]\n * ```\n */\nexport function parseCSV(\n csv: string,\n options: { delimiter?: string; hasHeaders?: boolean } = {}\n): Record<string, string>[] {\n const { delimiter = ',', hasHeaders = true } = options;\n\n const lines = csv.split(/\\r?\\n/).filter((line) => line.trim());\n\n if (lines.length === 0) {\n return [];\n }\n\n // Parse a single CSV line, handling quoted values\n const parseLine = (line: string): string[] => {\n const values: string[] = [];\n let current = '';\n let inQuotes = false;\n\n let i = 0;\n while (i < line.length) {\n const char = line[i];\n const nextChar = line[i + 1];\n\n if (char === '\"' && inQuotes && nextChar === '\"') {\n current += '\"';\n i += 2; // Skip next quote\n } else if (char === '\"') {\n inQuotes = !inQuotes;\n i++;\n } else if (char === delimiter && !inQuotes) {\n values.push(current);\n current = '';\n i++;\n } else {\n current += char;\n i++;\n }\n }\n\n values.push(current);\n return values;\n };\n\n let headers: string[];\n let dataLines: string[];\n\n // We've already checked that lines.length > 0, so lines[0] is guaranteed to exist\n const firstLine = lines[0] as string;\n\n if (hasHeaders) {\n headers = parseLine(firstLine);\n dataLines = lines.slice(1);\n } else {\n // Generate numeric headers if no header row\n const firstRow = parseLine(firstLine);\n headers = firstRow.map((_, i) => `col${i}`);\n dataLines = lines;\n }\n\n return dataLines.map((line) => {\n const values = parseLine(line);\n const obj: Record<string, string> = {};\n\n headers.forEach((header, i) => {\n obj[header] = values[i] || '';\n });\n\n return obj;\n });\n}\n\n/**\n * Convert CSV to JSON string\n *\n * @param csv - CSV string\n * @param options - Parse options\n * @returns JSON string\n */\nexport function csvToJSON(\n csv: string,\n options: { delimiter?: string; hasHeaders?: boolean; pretty?: boolean } = {}\n): string {\n const { pretty = false, ...parseOptions } = options;\n const data = parseCSV(csv, parseOptions);\n return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n}\n\n/**\n * Get CSV headers from data\n *\n * @param data - Array of objects\n * @param flattenFields - Whether to flatten nested objects\n * @returns Array of header strings\n */\nexport function getCSVHeaders(data: unknown[], flattenFields: boolean = true): string[] {\n if (data.length === 0) {\n return [];\n }\n\n const collectKeys = (obj: unknown, prefix = '', depth = 0): string[] => {\n const keys: string[] = [];\n\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return prefix ? [prefix] : [];\n }\n\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n flattenFields &&\n depth < 3\n ) {\n keys.push(...collectKeys(value, fullKey, depth + 1));\n } else {\n keys.push(fullKey);\n }\n }\n\n return keys;\n };\n\n const allKeys = new Set<string>();\n for (const item of data) {\n for (const key of collectKeys(item)) {\n allKeys.add(key);\n }\n }\n\n return Array.from(allKeys).sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Estimate CSV file size for a dataset\n *\n * @param data - Array of objects\n * @param sampleSize - Number of records to sample for estimation\n * @returns Estimated size in bytes\n */\nexport function estimateCSVSize(data: unknown[], sampleSize: number = 100): number {\n if (data.length === 0) {\n return 0;\n }\n\n // Take a sample to estimate average row size\n const sample = data.slice(0, Math.min(sampleSize, data.length));\n const sampleCSV = convertToCSV(sample);\n const averageRowSize = sampleCSV.length / sample.length;\n\n // Estimate total size (headers + data rows)\n const headers = getCSVHeaders(data);\n const headerSize = headers.join(',').length + 1; // +1 for newline\n\n return Math.ceil(headerSize + averageRowSize * data.length);\n}\n","/**\n * Export Gateway Helper\n *\n * Centralised wrapper around the workspace internal gateway's\n * `createExportJob` mutation, used by per-svc convenience resolvers\n * (e.g. `createTagsExportJob`, `createGroupsExportJob`).\n *\n * Replaces the duplicated `src/clients/export-gateway.ts` files that\n * existed in 19+ workspace svcs.\n *\n * @module export/gateway-client\n *\n * @example\n * ```typescript\n * import { triggerExportJob } from '@burdenoff/be-sdk/export';\n *\n * const result = await triggerExportJob({\n * serviceName: 'wspace-tags-svc',\n * workspaceId: ctx.workspaceId,\n * name: input.name,\n * entityTypes: ['tags', 'vocabularies'],\n * format: input.format,\n * actorId: ctx.actorId,\n * actorType: ctx.actorType,\n * });\n * ```\n */\n\nimport { GatewayClient } from '../gateway/index.js';\nimport type { ServiceLayer } from '../types/layer.js';\n\nconst CREATE_EXPORT_JOB_MUTATION = `mutation CreateExportJob($input: CreateExportJobInput!) {\n createExportJob(input: $input) {\n id\n status\n workspaceId\n entityTypes\n format\n createdAt\n }\n}`;\n\nexport type ExportActorType = 'user' | 'app' | 'service' | 'super_admin';\nexport type ExportFormatGql = 'JSON' | 'CSV';\n\nexport interface TriggerExportJobParams {\n /** Caller service name, used by gateway client telemetry/auth */\n serviceName: string;\n /** Layer for the gateway. Defaults to `wspace`. */\n layer?: ServiceLayer;\n /** Workspace context (required for wspace exports). */\n workspaceId: string;\n /** Human-readable name for the export job. */\n name: string;\n /** Entity types registered in `wspace-export-svc` to include. */\n entityTypes: string[];\n /** Output format. */\n format: ExportFormatGql;\n /** Actor making the request (forwarded to RBAC). */\n actorId: string;\n actorType: ExportActorType;\n /** Whether to include extended metadata in the export ZIP. */\n includeMetadata?: boolean;\n /** Optional ISO date-range bounds. */\n dateRangeStart?: string;\n dateRangeEnd?: string;\n}\n\nexport interface ExportJobResult {\n id: string;\n status: string;\n workspaceId: string;\n entityTypes: string[];\n format: string;\n createdAt: string;\n}\n\ninterface CreateExportJobResponse {\n createExportJob?: ExportJobResult;\n}\n\n/**\n * Submit a `createExportJob` mutation to the workspace internal gateway.\n *\n * The caller is expected to map the returned `ExportJobResult` to its\n * own GraphQL output type (the per-svc `ExportJobResponse`).\n */\nexport async function triggerExportJob(params: TriggerExportJobParams): Promise<ExportJobResult> {\n const {\n serviceName,\n layer = 'wspace',\n actorId,\n actorType,\n workspaceId,\n name,\n entityTypes,\n format,\n includeMetadata,\n dateRangeStart,\n dateRangeEnd,\n } = params;\n\n const client = new GatewayClient({ layer, serviceName });\n\n const input = {\n workspaceId,\n name,\n entityTypes,\n format,\n ...(includeMetadata !== undefined ? { includeMetadata } : {}),\n ...(dateRangeStart !== undefined ? { dateRangeStart } : {}),\n ...(dateRangeEnd !== undefined ? { dateRangeEnd } : {}),\n };\n\n const response = await client.internalQuery<CreateExportJobResponse>({\n query: CREATE_EXPORT_JOB_MUTATION,\n variables: { input },\n headers: {\n 'x-actor-id': actorId,\n 'x-actor-type': actorType,\n 'x-workspace-id': workspaceId,\n },\n });\n\n const job = response.data?.createExportJob;\n if (!job) {\n throw new Error('Export service did not return a job');\n }\n return job;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ValidationError } from './chunk-
|
|
1
|
+
import { ValidationError } from './chunk-SMGTXYFR.js';
|
|
2
2
|
import { logger } from './chunk-CBZNP6RF.js';
|
|
3
3
|
import { __name } from './chunk-XE4OXN2W.js';
|
|
4
4
|
|
|
@@ -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-XNQUN3AE.js.map
|
|
509
|
+
//# sourceMappingURL=chunk-XNQUN3AE.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-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"]}
|
|
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-XNQUN3AE.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"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { shouldSyncRelationship, shouldSyncEntity, parseRelationship, getCollectionForEntity, extractMinimalFields, extractEntityTitle, createRelationshipEvent, createEntityEvent, addGraphExtension, GraphRegistry } from './chunk-5CESUKWC.js';
|
|
2
2
|
import { getGraphEventEmitter, GraphEventEmitterImpl } from './chunk-OHEPNJ2X.js';
|
|
3
|
-
import { ValidationError } from './chunk-
|
|
3
|
+
import { ValidationError } from './chunk-SMGTXYFR.js';
|
|
4
4
|
import { logger } from './chunk-CBZNP6RF.js';
|
|
5
5
|
import { __export, __name } from './chunk-XE4OXN2W.js';
|
|
6
6
|
|
|
@@ -1873,5 +1873,5 @@ var GraphModule = class {
|
|
|
1873
1873
|
};
|
|
1874
1874
|
|
|
1875
1875
|
export { AUDIT_FIELDS, GraphEventsPublisher, GraphExportService, GraphModule, SOFT_DELETE_FIELDS, STANDARD_FIELDS, TENANT_FIELDS, createGraphEventsHelper, createGraphExportService, createPrismaGraphIntegration, createRelationshipFromEntity, defineEntity, defineGraphConfig, defineModuleGraph, defineRelationship, getGraphEventsPublisher, getGraphStats, graph_exports, initializeGraph, isGraphInitialized };
|
|
1876
|
-
//# sourceMappingURL=chunk-
|
|
1877
|
-
//# sourceMappingURL=chunk-
|
|
1876
|
+
//# sourceMappingURL=chunk-XR3KUHJ5.js.map
|
|
1877
|
+
//# sourceMappingURL=chunk-XR3KUHJ5.js.map
|