@burdenoff/be-sdk 2026.722.3 → 2026.725.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/cache/index.d.ts +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/{chunk-MXLCLLCI.js → chunk-EJPRCENB.js} +118 -83
- package/dist/chunk-EJPRCENB.js.map +1 -0
- package/dist/{chunk-PQJ6MN4U.js → chunk-ESLJ2732.js} +3 -3
- package/dist/{chunk-PQJ6MN4U.js.map → chunk-ESLJ2732.js.map} +1 -1
- package/dist/{chunk-WM5COTOD.js → chunk-F5SGJ6VS.js} +118 -4
- package/dist/chunk-F5SGJ6VS.js.map +1 -0
- package/dist/{chunk-I3ZYYDNN.js → chunk-IIYIO2GG.js} +83 -11
- package/dist/chunk-IIYIO2GG.js.map +1 -0
- package/dist/{chunk-KKJPFKO5.js → chunk-QMDYY6GJ.js} +2 -2
- package/dist/{chunk-KKJPFKO5.js.map → chunk-QMDYY6GJ.js.map} +1 -1
- package/dist/{chunk-YQ6FYE37.js → chunk-RIH3XRBX.js} +4 -3
- package/dist/chunk-RIH3XRBX.js.map +1 -0
- package/dist/{chunk-YCKM7FS7.js → chunk-WCJIZR5Q.js} +123 -10
- package/dist/chunk-WCJIZR5Q.js.map +1 -0
- package/dist/{chunk-JCBYU5BE.js → chunk-YH6PCW6L.js} +3 -3
- package/dist/{chunk-JCBYU5BE.js.map → chunk-YH6PCW6L.js.map} +1 -1
- package/dist/{chunk-U77L54IQ.js → chunk-ZVZ4RAIH.js} +3 -3
- package/dist/{chunk-U77L54IQ.js.map → chunk-ZVZ4RAIH.js.map} +1 -1
- package/dist/export/index.js +3 -3
- package/dist/feature-flags/index.d.ts +9 -1
- package/dist/feature-flags/index.js +2 -1
- package/dist/gateway/index.js +2 -2
- package/dist/gateway/security/index.js +1 -1
- package/dist/{index-D0tR4rjy.d.ts → index-ELt2ADCe.d.ts} +19 -2
- package/dist/{index-CgTMsars.d.ts → index-N8DMWKzw.d.ts} +4 -0
- package/dist/{index-lcW5eSTp.d.ts → index-PJZzGd8r.d.ts} +19 -2
- package/dist/{index-42_fqdmi.d.ts → index-m4sVVdZ6.d.ts} +3 -2
- package/dist/index.d.ts +6 -6
- package/dist/index.js +10 -10
- package/dist/init/index.js +3 -3
- package/dist/platform/index.d.ts +1 -1
- package/dist/platform/index.js +1 -1
- package/dist/prisma/index.d.ts +2 -2
- package/dist/prisma/index.js +2 -2
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.js +1 -1
- package/dist/{types-DVG_lcsL.d.ts → types-BeDCdzH9.d.ts} +2 -2
- package/dist/{workspace-extension-TquhDEKU.d.ts → workspace-extension-DxQw6N3b.d.ts} +9 -1
- package/package.json +1 -1
- package/dist/chunk-I3ZYYDNN.js.map +0 -1
- package/dist/chunk-MXLCLLCI.js.map +0 -1
- package/dist/chunk-WM5COTOD.js.map +0 -1
- package/dist/chunk-YCKM7FS7.js.map +0 -1
- package/dist/chunk-YQ6FYE37.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/prisma/workspace-extension.ts"],"names":["workspaceContextStore","AsyncLocalStorage","fallbackContext","setWorkspaceContext","context","enterWith","getWorkspaceContext","getStore","withWorkspaceContext","fn","run","withWorkspaceContextSync","defaultConfig","enabled","enableReadIsolation","enableDeleteIsolation","enableUpdateWhereIsolation","populateContextJson","populateCreatedBy","populateUpdatedBy","populateTenantId","excludeModels","excludeModelsFromReadIsolation","strictMode","allowedUnguardedOperations","debug","enableApplicationNameTagging","enableRlsGucTagging","hasField","data","field","injectCreateFields","wsCtx","config","injected","workspaceId","tenantId","actorId","onBehalfOf","contextJson","buildContextJsonFromWorkspaceContext","injectUpdateFields","injectWhereClause","where","organizationId","projectId","appId","Object","keys","length","undefined","injectWhereWorkspaceId","ctx","stripSkipFlag","args","cleaned","isExcludedFromReadIsolation","model","includes","enforceStrictMode","operation","opKey","Error","taggedContexts","WeakSet","maybeTagConnection","rawPrisma","has","add","safeSvc","process","env","replace","safeWs","tag","$executeRawUnsafe","delete","rlsTaggedContexts","maybeSetRlsGuc","modelToClientProperty","charAt","toLowerCase","slice","runOperationWithRlsGuc","rootClient","clientProperty","$transaction","tx","delegate","method","addWorkspaceExtension","baseClient","fullConfig","logger","info","rawPrismaForTransactions","prismaClient","$extends","query","$allModels","create","_skipWorkspaceInjection","injectedData","injectedKeys","filter","k","join","finalArgs","createMany","dataArray","Array","isArray","map","item","createManyAndReturn","update","injectedWhere","injectedDataKeys","whereChanged","updateMany","upsert","injectedCreate","injectedUpdate","findMany","findFirst","findFirstOrThrow","findUnique","findUniqueOrThrow","count","aggregate","groupBy","deleteMany"],"mappings":"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","file":"chunk-EJPRCENB.js","sourcesContent":["/**\n * Prisma Workspace Extension\n *\n * Automatically injects workspaceId into ALL Prisma operations using\n * request-scoped context from AsyncLocalStorage:\n *\n * **Write operations** (create, createMany, update, upsert):\n * - Auto-populates `workspaceId`, `tenantId`, `createdBy`, `updatedBy`, `context` JSON\n *\n * **Read operations** (findMany, findFirst, findUnique, count, aggregate, groupBy):\n * - Auto-injects `workspaceId` into the `where` clause for workspace isolation\n *\n * **Delete operations** (delete, deleteMany):\n * - Auto-injects `workspaceId` into the `where` clause to prevent cross-workspace deletion\n *\n * **Update where clause** (update, updateMany):\n * - Auto-injects `workspaceId` into the `where` clause to prevent cross-workspace updates\n *\n * **How it works:**\n * 1. The GraphQL server's buildContext extracts workspaceId from x-workspace-id header\n * 2. The workspace context store (AsyncLocalStorage) holds the current request's workspace info\n * 3. This Prisma extension intercepts ALL operations and auto-injects workspaceId\n *\n * **What gets auto-populated on writes:**\n * - `workspaceId` field (String or String?) - set from context if not explicitly provided\n * - `context` field (Json) - merged with workspace/actor info if not explicitly provided\n * - `tenantId` field (String or String?) - set from context if not explicitly provided\n * - `createdBy` / `updatedBy` fields - set from actor context if not explicitly provided\n *\n * **What gets auto-injected on reads/updates/deletes:**\n * - `workspaceId` in the `where` clause - ensures queries only access data within the workspace\n *\n * **Opt-out:**\n * - Explicitly providing `workspaceId` in the where/data will override auto-injection\n * - Pass `_skipWorkspaceInjection: true` in the query args to skip entirely\n * - Set `enableReadIsolation: false` in config to disable read-side injection only\n * - Add model names to `excludeModels` to skip specific models\n *\n * @module prisma/workspace-extension\n * @category Database\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { logger } from '../logger/index.js';\nimport type { InputJsonValue } from './context.js';\n\n// ============================================================================\n// Workspace Context Store (AsyncLocalStorage)\n// ============================================================================\n\n/**\n * Workspace context for the current request scope\n */\nexport interface WorkspaceContext {\n /** Workspace ID (from x-workspace-id header) */\n workspaceId?: string;\n /** Tenant ID (from x-tenant-id header or derived from workspace) */\n tenantId?: string;\n /** Actor ID (user/service/app performing the operation) */\n actorId?: string;\n /** Actor type (user, app, service, super_admin) */\n actorType?: string;\n /** Organization ID */\n organizationId?: string;\n /** Project ID */\n projectId?: string;\n /** App ID */\n appId?: string;\n /** On behalf of actor ID (for consent-based delegation) */\n onBehalfOf?: string;\n}\n\n/**\n * AsyncLocalStorage for workspace context\n * This is separate from the SDK's general ContextManager to allow\n * fine-grained control over workspace-specific context propagation.\n */\nconst workspaceContextStore = new AsyncLocalStorage<WorkspaceContext>();\n\n/**\n * Fallback context for environments where AsyncLocalStorage.enterWith()\n * doesn't propagate across async boundaries (e.g., Bun + GraphQL Yoga).\n *\n * IMPORTANT: This is NOT request-isolated — it's a module-level singleton.\n * It works for single-request-at-a-time scenarios but could race under\n * concurrent requests. The ALS is the primary mechanism; this is a fallback.\n */\nlet fallbackContext: WorkspaceContext | undefined;\n\n/**\n * Set workspace context for the current async scope.\n * Call this in your GraphQL context builder or middleware.\n *\n * Uses AsyncLocalStorage.enterWith() as the primary mechanism,\n * with a module-level fallback for runtimes where enterWith()\n * doesn't propagate through all async chains (e.g., Bun).\n *\n * @param context - The workspace context for this request\n *\n * @example\n * ```typescript\n * // In your server's buildContext:\n * import { setWorkspaceContext } from '@burdenoff/be-sdk/prisma';\n *\n * buildContext: async (defaultContext) => {\n * setWorkspaceContext({\n * workspaceId: defaultContext.workspace?.id,\n * tenantId: defaultContext.tenant?.id,\n * actorId: defaultContext.actor?.id,\n * actorType: defaultContext.actor?.type,\n * organizationId: defaultContext.organization?.id,\n * });\n * return defaultContext;\n * }\n * ```\n */\nexport function setWorkspaceContext(context: WorkspaceContext): void {\n workspaceContextStore.enterWith(context);\n fallbackContext = context;\n}\n\n/**\n * Get the current workspace context from AsyncLocalStorage.\n * Falls back to module-level context if ALS returns undefined\n * (can happen in Bun where enterWith() doesn't propagate through\n * some async chains like GraphQL Yoga's execution pipeline).\n *\n * @returns The current workspace context, or undefined if not set\n */\nexport function getWorkspaceContext(): WorkspaceContext | undefined {\n return workspaceContextStore.getStore() ?? fallbackContext;\n}\n\n/**\n * Run a function with a specific workspace context.\n * The context is isolated to this execution and its children.\n *\n * @param context - The workspace context\n * @param fn - The function to run\n * @returns The result of the function\n *\n * @example\n * ```typescript\n * const result = await withWorkspaceContext(\n * { workspaceId: 'ws-123', actorId: 'user-456' },\n * async () => {\n * // All Prisma operations in here will auto-inject workspaceId\n * return await prisma.tag.create({ data: { name: 'test' } });\n * }\n * );\n * ```\n */\nexport async function withWorkspaceContext<T>(context: WorkspaceContext, fn: () => Promise<T>): Promise<T> {\n return workspaceContextStore.run(context, fn);\n}\n\n/**\n * Run a synchronous function with a specific workspace context.\n */\nexport function withWorkspaceContextSync<T>(context: WorkspaceContext, fn: () => T): T {\n return workspaceContextStore.run(context, fn);\n}\n\n// ============================================================================\n// Extension Configuration\n// ============================================================================\n\n/**\n * Configuration for the workspace extension\n */\nexport interface WorkspaceExtensionConfig {\n /**\n * Enable automatic workspaceId injection on create/update\n * @default true\n */\n enabled?: boolean;\n\n /**\n * Enable automatic workspaceId injection on read operations\n * (findMany, findFirst, findUnique, findFirstOrThrow, findUniqueOrThrow,\n * count, aggregate, groupBy)\n *\n * When enabled, every read query automatically includes `workspaceId`\n * in the `where` clause, preventing cross-workspace data leakage.\n *\n * @default true\n */\n enableReadIsolation?: boolean;\n\n /**\n * Enable automatic workspaceId injection on delete operations\n * (delete, deleteMany)\n *\n * When enabled, every delete operation automatically includes `workspaceId`\n * in the `where` clause, preventing cross-workspace deletion.\n *\n * @default true\n */\n enableDeleteIsolation?: boolean;\n\n /**\n * Enable automatic workspaceId injection into update/updateMany `where` clauses.\n *\n * When enabled, update operations automatically include `workspaceId`\n * in the `where` clause in addition to the `data` injection,\n * preventing cross-workspace updates.\n *\n * @default true\n */\n enableUpdateWhereIsolation?: boolean;\n\n /**\n * Automatically populate the `context` JSON field with workspace/actor info\n * @default true\n */\n populateContextJson?: boolean;\n\n /**\n * Automatically populate `createdBy` field on create operations\n * @default true\n */\n populateCreatedBy?: boolean;\n\n /**\n * Automatically populate `updatedBy` field on update operations\n * @default true\n */\n populateUpdatedBy?: boolean;\n\n /**\n * Automatically populate `tenantId` field from context\n * @default false (tenantId is typically derived from workspaceId at the DB level)\n */\n populateTenantId?: boolean;\n\n /**\n * Models to exclude from auto-injection (both reads and writes).\n * Use this for models that intentionally don't have workspaceId.\n *\n * Common exclusions: system tables, infra tables, global reference data.\n *\n * @default []\n */\n excludeModels?: string[];\n\n /**\n * Models to exclude from read isolation only.\n * These models will still get write-side injection (workspaceId on create)\n * but reads will NOT have workspaceId auto-injected into `where`.\n *\n * Use this for child/join tables where workspace scoping is inherited\n * through parent relations, or for models queried by ID that don't\n * have a workspaceId column.\n *\n * @default []\n */\n excludeModelsFromReadIsolation?: string[];\n\n /**\n * When true, throws an error if workspaceId is missing from context\n * for any non-excluded model operation. This prevents silent\n * workspace-unscoped queries that could leak data across workspaces.\n *\n * When false, operations without workspace context proceed without\n * workspaceId injection (legacy behavior).\n *\n * @default true\n */\n strictMode?: boolean;\n\n /**\n * Operations that are allowed without workspace context even in strict mode.\n * Use `Model.operation` format (e.g., `['Workspace.create', 'RevokedToken.findMany']`).\n *\n * Valid operation names: create, createMany, createManyAndReturn, update, updateMany,\n * upsert, findMany, findFirst, findFirstOrThrow, findUnique, findUniqueOrThrow,\n * count, aggregate, groupBy, delete, deleteMany.\n *\n * @default []\n */\n allowedUnguardedOperations?: string[];\n\n /**\n * Log injection events (useful for debugging)\n * @default false\n */\n debug?: boolean;\n\n /**\n * Tag the PostgreSQL connection with workspace attribution for pg_stat_activity visibility.\n *\n * When enabled, the first DB operation per workspace context sets:\n * `application_name = 'svc=<SERVICE_NAME>;ws=<workspaceId>'`\n *\n * This makes workspace-level query attribution visible in pg_stat_activity,\n * pg_locks, auto_explain, and monitoring tools without any schema changes.\n * Subsequent operations in the same request are deduplicated via WeakSet,\n * costing ~0 overhead after the first round-trip per request context.\n *\n * NOTE: This is a session-level SET so attribution may drift across ops\n * that reuse the same pooled connection from different requests. Use for\n * aggregate observability, not per-query forensics.\n *\n * @default false\n */\n enableApplicationNameTagging?: boolean;\n\n /**\n * Set the `app.workspace_id` GUC for Row Level Security enforcement.\n *\n * When enabled, the first DB operation per workspace context executes:\n * `SET app.workspace_id = '<workspaceId>'`\n *\n * RLS policies using `current_setting('app.workspace_id', true)` then filter\n * rows by workspace, providing a defense-in-depth backstop to the application-\n * layer workspaceId injection in the WHERE clause.\n *\n * Pair with migrations that run per table:\n * `ALTER TABLE t ENABLE ROW LEVEL SECURITY;`\n * `CREATE POLICY ws_isolation ON t\n * USING (workspace_id = current_setting('app.workspace_id', true))\n * WITH CHECK (workspace_id = current_setting('app.workspace_id', true));`\n *\n * Fail-closed semantics: if the GUC is unset (NULL from missing_ok=true),\n * `workspace_id = NULL` is always false, so RLS returns no rows — leaking\n * nothing rather than everything.\n *\n * NOTE: Uses session-level SET (safe without a pooler or with session-mode\n * pooling). Upgrade to SET LOCAL inside `$transaction` when PgBouncer\n * transaction-mode pooling is enabled (Phase 3b).\n *\n * @default false\n */\n enableRlsGucTagging?: boolean;\n}\n\n/**\n * Default configuration\n */\nconst defaultConfig: Required<WorkspaceExtensionConfig> = {\n enabled: true,\n enableReadIsolation: true,\n enableDeleteIsolation: true,\n enableUpdateWhereIsolation: true,\n populateContextJson: true,\n populateCreatedBy: true,\n populateUpdatedBy: true,\n populateTenantId: false,\n excludeModels: [],\n excludeModelsFromReadIsolation: [],\n strictMode: true,\n allowedUnguardedOperations: [],\n debug: false,\n enableApplicationNameTagging: false,\n enableRlsGucTagging: false,\n};\n\n// ============================================================================\n// Data Injection Helpers\n// ============================================================================\n\n/**\n * Check if a field exists in the data object (including being set to null/undefined explicitly)\n */\nfunction hasField(data: Record<string, unknown>, field: string): boolean {\n return field in data;\n}\n\n/**\n * Inject workspace-related fields into create data\n */\nfunction injectCreateFields(\n data: Record<string, unknown>,\n wsCtx: WorkspaceContext,\n config: Required<WorkspaceExtensionConfig>\n): Record<string, unknown> {\n const injected = { ...data };\n\n // Inject workspaceId if not already provided\n if (wsCtx.workspaceId && !hasField(injected, 'workspaceId')) {\n injected['workspaceId'] = wsCtx.workspaceId;\n }\n\n // Inject tenantId if configured and not already provided\n if (config.populateTenantId && wsCtx.tenantId && !hasField(injected, 'tenantId')) {\n injected['tenantId'] = wsCtx.tenantId;\n }\n\n // Inject createdBy if configured and not already provided\n if (config.populateCreatedBy && wsCtx.actorId && !hasField(injected, 'createdBy')) {\n injected['createdBy'] = wsCtx.actorId;\n }\n\n // Inject updatedBy on create as well (initial value)\n if (config.populateUpdatedBy && wsCtx.actorId && !hasField(injected, 'updatedBy')) {\n injected['updatedBy'] = wsCtx.actorId;\n }\n\n // Inject onBehalfOf (for consent-based delegation tracking)\n // If onBehalfOf is in context (from consent), use it; otherwise defaults to actorId (self-action)\n if (wsCtx.onBehalfOf && !hasField(injected, 'onBehalfOf')) {\n injected['onBehalfOf'] = wsCtx.onBehalfOf;\n } else if (wsCtx.actorId && !hasField(injected, 'onBehalfOf')) {\n // Default to actorId if no delegation (self-action)\n injected['onBehalfOf'] = wsCtx.actorId;\n }\n\n // Populate context JSON field\n if (config.populateContextJson && !hasField(injected, 'context')) {\n const contextJson = buildContextJsonFromWorkspaceContext(wsCtx);\n if (contextJson) {\n injected['context'] = contextJson;\n }\n }\n\n return injected;\n}\n\n/**\n * Inject workspace-related fields into update data\n */\nfunction injectUpdateFields(\n data: Record<string, unknown>,\n wsCtx: WorkspaceContext,\n config: Required<WorkspaceExtensionConfig>\n): Record<string, unknown> {\n const injected = { ...data };\n\n // Inject updatedBy if configured and not already provided\n if (config.populateUpdatedBy && wsCtx.actorId && !hasField(injected, 'updatedBy')) {\n injected['updatedBy'] = wsCtx.actorId;\n }\n\n // Note: We intentionally do NOT auto-inject workspaceId on updates\n // because updates target existing records (workspaceId is immutable after creation)\n // and changing it would be a data integrity issue.\n\n return injected;\n}\n\n/**\n * Inject workspaceId into a where clause.\n * Only injects if workspaceId is available in context and not already present in where.\n *\n * For operations that may not have a where clause (e.g., findMany without filters),\n * creates a new where object with just workspaceId.\n */\nfunction injectWhereClause(\n where: Record<string, unknown> | undefined,\n wsCtx: WorkspaceContext\n): Record<string, unknown> | undefined {\n if (!wsCtx.workspaceId) return where;\n\n if (!where) {\n // No where clause exists, create one with just workspaceId\n return { workspaceId: wsCtx.workspaceId };\n }\n\n // Only inject if not already present\n if (!hasField(where, 'workspaceId')) {\n return { ...where, workspaceId: wsCtx.workspaceId };\n }\n\n return where;\n}\n\n/**\n * Build context JSON from workspace context\n */\nfunction buildContextJsonFromWorkspaceContext(wsCtx: WorkspaceContext): InputJsonValue | undefined {\n const context: Record<string, string> = {};\n\n if (wsCtx.workspaceId) context['workspaceId'] = wsCtx.workspaceId;\n if (wsCtx.actorId) context['userId'] = wsCtx.actorId;\n if (wsCtx.organizationId) context['organizationId'] = wsCtx.organizationId;\n if (wsCtx.projectId) context['projectId'] = wsCtx.projectId;\n if (wsCtx.appId) context['appId'] = wsCtx.appId;\n\n return Object.keys(context).length > 0 ? context : undefined;\n}\n\n/**\n * Inject workspaceId into where clause for read/update/delete operations.\n * This is a utility function exported for services that want to manually\n * add workspace scoping to their queries.\n *\n * @param where - The existing where clause\n * @param wsCtx - The workspace context (or auto-detected from AsyncLocalStorage)\n * @returns The where clause with workspaceId injected if not already present\n *\n * @example\n * ```typescript\n * import { injectWhereWorkspaceId, getWorkspaceContext } from '@burdenoff/be-sdk/prisma';\n *\n * const wsCtx = getWorkspaceContext();\n * const where = injectWhereWorkspaceId({ status: 'ACTIVE' }, wsCtx);\n * // Result: { status: 'ACTIVE', workspaceId: 'ws-123' }\n * ```\n */\nexport function injectWhereWorkspaceId(\n where: Record<string, unknown> | undefined,\n wsCtx?: WorkspaceContext\n): Record<string, unknown> | undefined {\n const ctx = wsCtx ?? getWorkspaceContext();\n if (!where || !ctx?.workspaceId) return where;\n\n // Only inject if not already present\n if (!hasField(where, 'workspaceId')) {\n return { ...where, workspaceId: ctx.workspaceId };\n }\n\n return where;\n}\n\n/**\n * Remove the _skipWorkspaceInjection flag from args before passing to Prisma.\n * Using a dedicated function avoids ESLint unused-variable warnings from destructuring.\n */\nfunction stripSkipFlag<T extends Record<string, unknown>>(args: T): Omit<T, '_skipWorkspaceInjection'> {\n const cleaned = { ...args };\n delete (cleaned as Record<string, unknown>)['_skipWorkspaceInjection'];\n return cleaned;\n}\n\n/**\n * Check if a model should be excluded from read isolation.\n * A model is excluded if it's in excludeModels OR excludeModelsFromReadIsolation.\n */\nfunction isExcludedFromReadIsolation(model: string, config: Required<WorkspaceExtensionConfig>): boolean {\n return config.excludeModels.includes(model) || config.excludeModelsFromReadIsolation.includes(model);\n}\n\n// ============================================================================\n// Strict Mode Enforcement\n// ============================================================================\n\n/**\n * Enforce strict mode: throw if workspace context is missing and the operation\n * is not explicitly allowed to run without it.\n *\n * @returns true if the operation should proceed without workspace injection (non-strict or allowed)\n * @throws Error if strict mode is enabled and the operation is not allowed\n */\nfunction enforceStrictMode(\n model: string,\n operation: string,\n wsCtx: WorkspaceContext | undefined,\n config: Required<WorkspaceExtensionConfig>\n): void {\n // If workspace context has a workspaceId, nothing to enforce\n if (wsCtx?.workspaceId) return;\n\n // If strict mode is off, allow silently\n if (!config.strictMode) return;\n\n // Check if this specific operation is allowed without workspace context\n const opKey = `${model}.${operation}`;\n if (config.allowedUnguardedOperations.includes(opKey)) return;\n\n // Strict mode violation — throw\n throw new Error(\n `[WorkspaceExtension] Workspace context required for ${model}.${operation}. ` +\n `No workspaceId found in request context. To bypass, either: ` +\n `(1) add \"${model}\" to excludeModels, ` +\n `(2) add \"${opKey}\" to allowedUnguardedOperations, or ` +\n `(3) pass _skipWorkspaceInjection: true in the query args.`\n );\n}\n\n// ============================================================================\n// Prisma Extension\n// ============================================================================\n\n/**\n * Standard args shape for operations with a `where` clause\n */\ninterface WhereArgs {\n where?: Record<string, unknown>;\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Standard handler params from Prisma $extends\n */\ninterface ExtensionHandlerParams<TArgs> {\n model: string;\n args: TArgs;\n query: (args: unknown) => Promise<unknown>;\n}\n\n/**\n * Add workspace extension to a Prisma client.\n *\n * This extension provides comprehensive workspace isolation by automatically\n * injecting workspaceId into ALL Prisma operations:\n *\n * **Writes**: Auto-populates workspaceId, tenantId, createdBy, updatedBy, context JSON\n * **Reads**: Auto-injects workspaceId into where clause (findMany, findFirst, etc.)\n * **Updates**: Auto-injects workspaceId into where clause + updatedBy into data\n * **Deletes**: Auto-injects workspaceId into where clause\n *\n * **Chain order matters**: Apply this extension AFTER the graph extension\n * (handled automatically by createDatabaseClient).\n *\n * @param baseClient - The Prisma client to extend\n * @param config - Extension configuration\n * @returns Extended Prisma client with workspace auto-injection\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { addWorkspaceExtension } from '@burdenoff/be-sdk/prisma';\n *\n * const baseClient = new PrismaClient({ adapter });\n * const client = addWorkspaceExtension(baseClient, {\n * populateContextJson: true,\n * populateCreatedBy: true,\n * enableReadIsolation: true,\n * debug: process.env.NODE_ENV === 'development',\n * excludeModels: ['CircuitBreakerState', 'SchedulerState'],\n * excludeModelsFromReadIsolation: ['Permission', 'RbacResourceType'],\n * });\n * ```\n */\n// ============================================================================\n// Connection Tagging (Phase 0.2)\n// ============================================================================\n\n/** Minimal Prisma raw-exec surface needed for SET application_name */\ntype RawPrismaForTagging = {\n $executeRawUnsafe: (query: string, ...values: unknown[]) => Promise<number>;\n};\n\n/**\n * WeakSet of contexts that have already had the connection tagged this request.\n * WorkspaceContext objects live only for the duration of a request, so entries\n * are automatically GC'd when the context goes out of scope — no manual cleanup.\n */\nconst taggedContexts = new WeakSet<WorkspaceContext>();\n\n/**\n * Tag the current Postgres connection with workspace attribution (once per context).\n * Sets `application_name = 'svc=<name>;ws=<workspaceId>'` at the session level.\n * Non-fatal: tagging failures are swallowed so the main operation still proceeds.\n *\n * @internal Exported for unit testing only — do not call from product code.\n */\nexport async function maybeTagConnection(rawPrisma: RawPrismaForTagging, wsCtx: WorkspaceContext): Promise<void> {\n if (taggedContexts.has(wsCtx)) return;\n taggedContexts.add(wsCtx);\n // Strip non-safe chars; workspace IDs are UUIDs/CUIDs, service names are kebab-case\n const safeSvc = (process.env['SERVICE_NAME'] ?? 'svc').replace(/[^a-zA-Z0-9\\-_]/g, '');\n const safeWs = (wsCtx.workspaceId ?? '').replace(/[^a-zA-Z0-9\\-_]/g, '');\n const tag = `svc=${safeSvc};ws=${safeWs}`;\n try {\n await rawPrisma.$executeRawUnsafe(`SET application_name = '${tag}'`);\n } catch {\n // Retry on the next operation if this one failed\n taggedContexts.delete(wsCtx);\n }\n}\n\n// ============================================================================\n// RLS GUC Tagging (Phase 3)\n// ============================================================================\n\n/**\n * WeakSet of contexts that have already had the RLS GUC set this request.\n */\nconst rlsTaggedContexts = new WeakSet<WorkspaceContext>();\n\n/**\n * Set `app.workspace_id` GUC for RLS enforcement (once per context, session-level).\n *\n * When set, RLS policies using `current_setting('app.workspace_id', true)` filter\n * rows to the current workspace. Non-fatal: failures are swallowed and retried on\n * the next operation via WeakSet entry removal.\n *\n * NOT used by the extension's operation handlers below (see\n * `runOperationWithRlsGuc`) — session-level `SET` is unsafe once traffic is routed\n * through PgBouncer in transaction-pooling mode (see that function's doc comment\n * for the full incident writeup, BOFF-5488). Kept as a standalone export, still\n * unit tested, for any caller that genuinely runs on an unpooled/session-pooled\n * connection where session-level `SET` is sufficient.\n *\n * @internal Exported for unit testing only — do not call from product code.\n */\nexport async function maybeSetRlsGuc(rawPrisma: RawPrismaForTagging, wsCtx: WorkspaceContext): Promise<void> {\n if (rlsTaggedContexts.has(wsCtx)) return;\n rlsTaggedContexts.add(wsCtx);\n // Allow alphanumeric, hyphens, underscores — CUID/UUID safe, prevents SQL injection\n const safeWs = (wsCtx.workspaceId ?? '').replace(/[^a-zA-Z0-9\\-_]/g, '');\n try {\n await rawPrisma.$executeRawUnsafe(`SET app.workspace_id = '${safeWs}'`);\n } catch {\n // Retry on the next operation if this one failed\n rlsTaggedContexts.delete(wsCtx);\n }\n}\n\n/**\n * A Prisma interactive-transaction client (`tx` inside `$transaction(async (tx) =>\n * …)`), typed with just enough surface for `runOperationWithRlsGuc`: raw SQL\n * execution, plus one delegate per model keyed by its Prisma Client property name\n * (e.g. `customer`, `driver`). The index signature is `unknown` (not a concrete\n * delegate shape) because this helper is generic across every model in the schema\n * — callers narrow and verify the specific delegate/method they need at runtime.\n */\ntype PrismaTxForRlsGuc = {\n $executeRawUnsafe: (query: string, ...values: unknown[]) => Promise<number>;\n [modelClientProperty: string]: unknown;\n};\n\n/** Minimal Prisma client surface needed to open an interactive transaction. */\ntype RawPrismaForRlsTransaction = {\n $transaction: <TResult>(fn: (tx: PrismaTxForRlsGuc) => Promise<TResult>) => Promise<TResult>;\n};\n\n/**\n * Prisma DMMF model name (e.g. `Customer`) -> Prisma Client delegate property\n * (e.g. `customer`). Matches Prisma's own client-generation rule: lower-case the\n * first character, leave the rest untouched.\n */\nfunction modelToClientProperty(model: string): string {\n return model.length > 0 ? model.charAt(0).toLowerCase() + model.slice(1) : model;\n}\n\n/**\n * Run a single Prisma operation with `app.workspace_id` set as a\n * **transaction-scoped** (`SET LOCAL`) GUC immediately ahead of it, so Postgres\n * RLS policies using `current_setting('app.workspace_id', true)` see the right\n * value for both the `USING` (read) and `WITH CHECK` (write) clauses.\n *\n * Session-level `SET` (`maybeSetRlsGuc` above, the original Phase 3\n * implementation) is NOT safe once traffic goes through PgBouncer in\n * **transaction pooling mode** — the mode configured on all four\n * `boff-pg-{global,wspace}-{alpha,prod}-cin` servers' built-in PgBouncer (see\n * infra-specs/current-architecture/02-database-postgres-age.md). PgBouncer hands\n * the physical backend connection back to the pool after every standalone\n * statement/implicit transaction, so a `SET` executed by one statement is not\n * guaranteed visible to the very next one, even over what looks like the same\n * logical client connection.\n *\n * This was exactly BOFF-5488: `wspace-movethewheels-svc`'s RLS Phase 3b (FORCE\n * ROW LEVEL SECURITY + a non-owner runtime role, `wspace_movethewheels_app`,\n * pointed at the pooled `:6432` connection) made the `ws_isolation` policy bind\n * for real, but the session-level `SET` from `maybeSetRlsGuc` was landing on a\n * different pooled backend connection than the write that followed it — so every\n * write failed `WITH CHECK` (`new row violates row-level security policy`) and\n * every read matched zero rows.\n *\n * A Prisma **interactive transaction** (`$transaction(async (tx) => …)`) pins one\n * physical connection for the callback's full duration — PgBouncer sees a single\n * unbroken `BEGIN … COMMIT` and cannot reassign the backend mid-transaction — so\n * `SET LOCAL` inside it is guaranteed visible to the operation issued right after\n * it in the same callback. Safe under transaction-mode pooling, session-mode\n * pooling, and with no pooler in front of Postgres at all. The extra round trip\n * (one interactive transaction instead of one direct call) only applies to\n * services that opt into `enableRlsGucTagging` — off by default.\n *\n * @internal Exported for unit testing only — do not call from product code.\n */\nexport async function runOperationWithRlsGuc<TResult>(\n rootClient: RawPrismaForRlsTransaction,\n wsCtx: WorkspaceContext,\n model: string,\n operation: string,\n args: unknown\n): Promise<TResult> {\n const safeWs = (wsCtx.workspaceId ?? '').replace(/[^a-zA-Z0-9\\-_]/g, '');\n const clientProperty = modelToClientProperty(model);\n return rootClient.$transaction(async (tx) => {\n await tx.$executeRawUnsafe(`SET LOCAL app.workspace_id = '${safeWs}'`);\n // `tx[clientProperty]` is typed `unknown` (see PrismaTxForRlsGuc) because this\n // helper is generic across every model; narrow to the minimal callable shape\n // needed and verify at runtime before invoking rather than trusting a cast.\n const delegate = tx[clientProperty] as Record<string, (opArgs: unknown) => Promise<TResult>> | undefined;\n const method = delegate?.[operation];\n if (typeof method !== 'function') {\n throw new Error(\n `[WorkspaceExtension] Unable to resolve ${model}.${operation} (client property \"${clientProperty}\") ` +\n 'on the interactive-transaction client for RLS GUC tagging.'\n );\n }\n return method(args);\n });\n}\n\nexport function addWorkspaceExtension<T>(baseClient: T, config?: WorkspaceExtensionConfig): T {\n const fullConfig: Required<WorkspaceExtensionConfig> = {\n ...defaultConfig,\n ...config,\n };\n\n if (!fullConfig.enabled) {\n logger.info('[WorkspaceExtension] Extension disabled by configuration');\n return baseClient;\n }\n\n // Capture the unwrapped client for connection tagging (pre-extension, avoids recursion)\n const rawPrisma = baseClient as unknown as RawPrismaForTagging;\n // Same unwrapped client, typed for the interactive-transaction RLS GUC path\n // (see runOperationWithRlsGuc) — separate cast so maybeTagConnection/\n // maybeSetRlsGuc's narrower RawPrismaForTagging type is untouched.\n const rawPrismaForTransactions = baseClient as unknown as RawPrismaForRlsTransaction;\n\n // Type assertion for Prisma client $extends\n const prismaClient = baseClient as { $extends: (args: unknown) => T };\n\n logger.info('[WorkspaceExtension] Workspace extension enabled', {\n populateContextJson: fullConfig.populateContextJson,\n populateCreatedBy: fullConfig.populateCreatedBy,\n populateUpdatedBy: fullConfig.populateUpdatedBy,\n populateTenantId: fullConfig.populateTenantId,\n enableReadIsolation: fullConfig.enableReadIsolation,\n enableDeleteIsolation: fullConfig.enableDeleteIsolation,\n enableUpdateWhereIsolation: fullConfig.enableUpdateWhereIsolation,\n strictMode: fullConfig.strictMode,\n excludeModels: fullConfig.excludeModels,\n excludeModelsFromReadIsolation: fullConfig.excludeModelsFromReadIsolation,\n allowedUnguardedOperations: fullConfig.allowedUnguardedOperations,\n enableApplicationNameTagging: fullConfig.enableApplicationNameTagging,\n enableRlsGucTagging: fullConfig.enableRlsGucTagging,\n });\n\n return prismaClient.$extends({\n query: {\n $allModels: {\n // ================================================================\n // WRITE OPERATIONS - inject workspaceId into data\n // ================================================================\n\n async create({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n data: Record<string, unknown>;\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n // Skip if model is excluded or injection is explicitly skipped\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'create', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n // Inject fields into data\n const injectedData = injectCreateFields(args.data, wsCtx, fullConfig);\n\n if (fullConfig.debug) {\n const injectedKeys = Object.keys(injectedData).filter((k) => !(k in args.data));\n if (injectedKeys.length > 0) {\n logger.debug(`[WorkspaceExtension] ${model}.create - injected: ${injectedKeys.join(', ')}`, {\n workspaceId: wsCtx.workspaceId,\n actorId: wsCtx.actorId,\n });\n }\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n data: injectedData,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'create', finalArgs);\n }\n return query(finalArgs);\n },\n\n async createMany({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n data: Record<string, unknown> | Record<string, unknown>[];\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'createMany', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n // Handle both single object and array\n const dataArray = Array.isArray(args.data) ? args.data : [args.data];\n const injectedData = dataArray.map((item) => injectCreateFields(item, wsCtx, fullConfig));\n\n const finalArgs = {\n ...stripSkipFlag(args),\n data: Array.isArray(args.data) ? injectedData : injectedData[0],\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'createMany', finalArgs);\n }\n return query(finalArgs);\n },\n\n async createManyAndReturn({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n data: Record<string, unknown> | Record<string, unknown>[];\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'createManyAndReturn', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const dataArray = Array.isArray(args.data) ? args.data : [args.data];\n const injectedData = dataArray.map((item) => injectCreateFields(item, wsCtx, fullConfig));\n\n const finalArgs = {\n ...stripSkipFlag(args),\n data: Array.isArray(args.data) ? injectedData : injectedData[0],\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'createManyAndReturn', finalArgs);\n }\n return query(finalArgs);\n },\n\n // ================================================================\n // UPDATE OPERATIONS - inject updatedBy into data + workspaceId into where\n // ================================================================\n\n async update({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n data: Record<string, unknown>;\n where?: Record<string, unknown>;\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'update', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedData = injectUpdateFields(args.data, wsCtx, fullConfig);\n\n // Inject workspaceId into where clause for update isolation\n let injectedWhere = args.where;\n if (fullConfig.enableUpdateWhereIsolation && !isExcludedFromReadIsolation(model, fullConfig)) {\n injectedWhere = injectWhereClause(args.where, wsCtx);\n }\n\n if (fullConfig.debug) {\n const injectedDataKeys = Object.keys(injectedData).filter((k) => !(k in args.data));\n const whereChanged = injectedWhere !== args.where;\n if (injectedDataKeys.length > 0 || whereChanged) {\n logger.debug(\n `[WorkspaceExtension] ${model}.update - injected data: ${injectedDataKeys.join(', ')}${whereChanged ? ', where: workspaceId' : ''}`\n );\n }\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n data: injectedData,\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'update', finalArgs);\n }\n return query(finalArgs);\n },\n\n async updateMany({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n data: Record<string, unknown>;\n where?: Record<string, unknown>;\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'updateMany', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedData = injectUpdateFields(args.data, wsCtx, fullConfig);\n\n // Inject workspaceId into where clause for update isolation\n let injectedWhere = args.where;\n if (fullConfig.enableUpdateWhereIsolation && !isExcludedFromReadIsolation(model, fullConfig)) {\n injectedWhere = injectWhereClause(args.where, wsCtx);\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n data: injectedData,\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'updateMany', finalArgs);\n }\n return query(finalArgs);\n },\n\n async upsert({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n create: Record<string, unknown>;\n update: Record<string, unknown>;\n where?: Record<string, unknown>;\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'upsert', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedCreate = injectCreateFields(args.create, wsCtx, fullConfig);\n const injectedUpdate = injectUpdateFields(args.update, wsCtx, fullConfig);\n\n // Inject workspaceId into where clause for upsert isolation\n let injectedWhere = args.where;\n if (fullConfig.enableUpdateWhereIsolation && !isExcludedFromReadIsolation(model, fullConfig)) {\n injectedWhere = injectWhereClause(args.where, wsCtx);\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n create: injectedCreate,\n update: injectedUpdate,\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'upsert', finalArgs);\n }\n return query(finalArgs);\n },\n\n // ================================================================\n // READ OPERATIONS - inject workspaceId into where clause\n // ================================================================\n\n async findMany({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'findMany', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.findMany - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'findMany', finalArgs);\n }\n return query(finalArgs);\n },\n\n async findFirst({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'findFirst', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.findFirst - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'findFirst', finalArgs);\n }\n return query(finalArgs);\n },\n\n async findFirstOrThrow({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'findFirstOrThrow', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.findFirstOrThrow - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'findFirstOrThrow', finalArgs);\n }\n return query(finalArgs);\n },\n\n async findUnique({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'findUnique', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n // For findUnique, the where clause uses unique fields.\n // We inject workspaceId only if the where clause is a plain object\n // (compound unique keys with workspaceId are common and already include it).\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.findUnique - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'findUnique', finalArgs);\n }\n return query(finalArgs);\n },\n\n async findUniqueOrThrow({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'findUniqueOrThrow', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.findUniqueOrThrow - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'findUniqueOrThrow', finalArgs);\n }\n return query(finalArgs);\n },\n\n async count({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'count', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.count - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'count', finalArgs);\n }\n return query(finalArgs);\n },\n\n async aggregate({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'aggregate', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.aggregate - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'aggregate', finalArgs);\n }\n return query(finalArgs);\n },\n\n async groupBy({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'groupBy', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.groupBy - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'groupBy', finalArgs);\n }\n return query(finalArgs);\n },\n\n // ================================================================\n // DELETE OPERATIONS - inject workspaceId into where clause\n // ================================================================\n\n async delete({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableDeleteIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'delete', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.delete - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'delete', finalArgs);\n }\n return query(finalArgs);\n },\n\n async deleteMany({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableDeleteIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'deleteMany', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.deleteMany - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, model, 'deleteMany', finalArgs);\n }\n return query(finalArgs);\n },\n },\n },\n });\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GatewayClient } from './chunk-
|
|
1
|
+
import { GatewayClient } from './chunk-ZVZ4RAIH.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-ESLJ2732.js.map
|
|
628
|
+
//# sourceMappingURL=chunk-ESLJ2732.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-PQJ6MN4U.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-ESLJ2732.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,11 +1,14 @@
|
|
|
1
1
|
import { signServiceJwt } from './chunk-VFCMR5GX.js';
|
|
2
2
|
import { ContextManager } from './chunk-RZOFS2BQ.js';
|
|
3
|
+
import { logger } from './chunk-CBZNP6RF.js';
|
|
3
4
|
import { __export, __name } from './chunk-XE4OXN2W.js';
|
|
5
|
+
import { GraphQLError, Kind } from 'graphql';
|
|
4
6
|
|
|
5
7
|
// src/feature-flags/index.ts
|
|
6
8
|
var feature_flags_exports = {};
|
|
7
9
|
__export(feature_flags_exports, {
|
|
8
|
-
FeatureFlagProvider: () => FeatureFlagProvider
|
|
10
|
+
FeatureFlagProvider: () => FeatureFlagProvider,
|
|
11
|
+
createOperationsFlagGatePlugin: () => createOperationsFlagGatePlugin
|
|
9
12
|
});
|
|
10
13
|
|
|
11
14
|
// src/feature-flags/provider.ts
|
|
@@ -299,7 +302,118 @@ var FeatureFlagProvider = class {
|
|
|
299
302
|
return `${ctx.workspaceId ?? "system"}:${ctx.actorId ?? "anonymous"}:${ctx.actorType ?? "user"}`;
|
|
300
303
|
}
|
|
301
304
|
};
|
|
305
|
+
var ACTOR_TYPES = [
|
|
306
|
+
"user",
|
|
307
|
+
"app",
|
|
308
|
+
"service",
|
|
309
|
+
"super_admin"
|
|
310
|
+
];
|
|
311
|
+
function isRecord(value) {
|
|
312
|
+
return typeof value === "object" && value !== null;
|
|
313
|
+
}
|
|
314
|
+
__name(isRecord, "isRecord");
|
|
315
|
+
function isDocumentNode(value) {
|
|
316
|
+
return isRecord(value) && Array.isArray(value.definitions);
|
|
317
|
+
}
|
|
318
|
+
__name(isDocumentNode, "isDocumentNode");
|
|
319
|
+
function findExecutedOperation(document, operationName) {
|
|
320
|
+
const operations = document.definitions.filter((definition) => definition.kind === Kind.OPERATION_DEFINITION);
|
|
321
|
+
if (operationName) {
|
|
322
|
+
return operations.find((operation) => operation.name?.value === operationName) ?? null;
|
|
323
|
+
}
|
|
324
|
+
return operations[0] ?? null;
|
|
325
|
+
}
|
|
326
|
+
__name(findExecutedOperation, "findExecutedOperation");
|
|
327
|
+
function coerceActorType(value) {
|
|
328
|
+
return value && ACTOR_TYPES.includes(value) ? value : void 0;
|
|
329
|
+
}
|
|
330
|
+
__name(coerceActorType, "coerceActorType");
|
|
331
|
+
function resolveEvaluationContext(contextValue) {
|
|
332
|
+
const ctx = isRecord(contextValue) ? contextValue : {};
|
|
333
|
+
const workspaceId = ctx.workspace?.id ?? ctx.workspaceId ?? void 0;
|
|
334
|
+
if (!workspaceId) {
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
const actorId = ctx.actor?.id ?? ctx.actorId ?? void 0;
|
|
338
|
+
const actorType = coerceActorType(ctx.actor?.type ?? ctx.actorType);
|
|
339
|
+
return {
|
|
340
|
+
workspaceId,
|
|
341
|
+
...actorId ? {
|
|
342
|
+
actorId
|
|
343
|
+
} : {},
|
|
344
|
+
...actorType ? {
|
|
345
|
+
actorType
|
|
346
|
+
} : {}
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
__name(resolveEvaluationContext, "resolveEvaluationContext");
|
|
350
|
+
function createOperationsFlagGatePlugin(options) {
|
|
351
|
+
const { flagKey, productId } = options;
|
|
352
|
+
const gatedOperations = new Set(options.gatedOperations ?? [
|
|
353
|
+
"mutation"
|
|
354
|
+
]);
|
|
355
|
+
const userMessage = options.userMessage ?? "This operation is currently unavailable.";
|
|
356
|
+
let provider = options.provider ?? null;
|
|
357
|
+
const getProvider = /* @__PURE__ */ __name(() => {
|
|
358
|
+
if (!provider) {
|
|
359
|
+
provider = new FeatureFlagProvider({
|
|
360
|
+
gatewayUrl: options.gatewayUrl ?? process.env["GLOBAL_PUBLIC_GATEWAY_URL"] ?? process.env["GLOBAL_INT_GATEWAY_URL"] ?? "",
|
|
361
|
+
cacheTtlSeconds: options.cacheTtlSeconds ?? 60,
|
|
362
|
+
defaultActorType: "service"
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
return provider;
|
|
366
|
+
}, "getProvider");
|
|
367
|
+
return {
|
|
368
|
+
async onExecute({ args }) {
|
|
369
|
+
if (!isDocumentNode(args.document)) {
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
const operation = findExecutedOperation(args.document, args.operationName);
|
|
373
|
+
if (!operation || !gatedOperations.has(operation.operation)) {
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
const evaluationContext = resolveEvaluationContext(args.contextValue);
|
|
377
|
+
if (!evaluationContext) {
|
|
378
|
+
logger.warn("[OperationsFlagGate] no workspace context \u2014 allowing operation", {
|
|
379
|
+
flagKey,
|
|
380
|
+
productId
|
|
381
|
+
});
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
let enabled = true;
|
|
385
|
+
try {
|
|
386
|
+
enabled = await getProvider().isEnabled(flagKey, evaluationContext);
|
|
387
|
+
} catch (error) {
|
|
388
|
+
logger.warn("[OperationsFlagGate] flag evaluation failed \u2014 allowing operation", {
|
|
389
|
+
flagKey,
|
|
390
|
+
productId,
|
|
391
|
+
error: error instanceof Error ? error.message : String(error)
|
|
392
|
+
});
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
if (!enabled) {
|
|
396
|
+
logger.warn("[OperationsFlagGate] flag disabled \u2014 blocking operation", {
|
|
397
|
+
flagKey,
|
|
398
|
+
productId,
|
|
399
|
+
workspaceId: evaluationContext.workspaceId
|
|
400
|
+
});
|
|
401
|
+
throw new GraphQLError(userMessage, {
|
|
402
|
+
extensions: {
|
|
403
|
+
code: "FEATURE_DISABLED",
|
|
404
|
+
flagKey,
|
|
405
|
+
productId,
|
|
406
|
+
http: {
|
|
407
|
+
status: 403
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
__name(createOperationsFlagGatePlugin, "createOperationsFlagGatePlugin");
|
|
302
416
|
|
|
303
|
-
export { FeatureFlagProvider, feature_flags_exports };
|
|
304
|
-
//# sourceMappingURL=chunk-
|
|
305
|
-
//# sourceMappingURL=chunk-
|
|
417
|
+
export { FeatureFlagProvider, createOperationsFlagGatePlugin, feature_flags_exports };
|
|
418
|
+
//# sourceMappingURL=chunk-F5SGJ6VS.js.map
|
|
419
|
+
//# sourceMappingURL=chunk-F5SGJ6VS.js.map
|