@vritti/api-sdk 0.3.3 → 0.3.5
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.cjs +942 -0
- package/dist/auth.cjs.map +1 -0
- package/dist/auth.d.cts +95 -0
- package/dist/auth.d.ts +95 -0
- package/dist/auth.js +884 -0
- package/dist/auth.js.map +1 -0
- package/dist/cache.cjs +182 -14
- package/dist/cache.cjs.map +1 -1
- package/dist/cache.d.cts +48 -4
- package/dist/cache.d.ts +48 -4
- package/dist/cache.js +177 -12
- package/dist/cache.js.map +1 -1
- package/dist/catalog-resolver.cjs +226 -51
- package/dist/catalog-resolver.cjs.map +1 -1
- package/dist/catalog-resolver.d.cts +41 -19
- package/dist/catalog-resolver.d.ts +41 -19
- package/dist/catalog-resolver.js +212 -46
- package/dist/catalog-resolver.js.map +1 -1
- package/dist/code-pattern-BP4zkNtT.d.cts +12 -0
- package/dist/code-pattern-BP4zkNtT.d.ts +12 -0
- package/dist/context.cjs +93 -0
- package/dist/context.cjs.map +1 -0
- package/dist/context.d.cts +19 -0
- package/dist/context.d.ts +19 -0
- package/dist/context.js +64 -0
- package/dist/context.js.map +1 -0
- package/dist/countries.cjs +1559 -0
- package/dist/countries.cjs.map +1 -0
- package/dist/countries.d.cts +13 -0
- package/dist/countries.d.ts +13 -0
- package/dist/countries.js +1532 -0
- package/dist/countries.js.map +1 -0
- package/dist/data-table.cjs +1280 -0
- package/dist/data-table.cjs.map +1 -0
- package/dist/data-table.d.cts +123 -0
- package/dist/data-table.d.ts +123 -0
- package/dist/data-table.js +1260 -0
- package/dist/data-table.js.map +1 -0
- package/dist/database.cjs +1510 -0
- package/dist/database.cjs.map +1 -0
- package/dist/database.d.cts +287 -0
- package/dist/database.d.ts +287 -0
- package/dist/database.js +1469 -0
- package/dist/database.js.map +1 -0
- package/dist/decimal.d.cts +0 -1
- package/dist/decimal.d.ts +0 -1
- package/dist/decorators.cjs +1817 -0
- package/dist/decorators.cjs.map +1 -0
- package/dist/decorators.d.cts +24 -0
- package/dist/decorators.d.ts +24 -0
- package/dist/decorators.js +1780 -0
- package/dist/decorators.js.map +1 -0
- package/dist/drizzle-pg-core.cjs +25 -0
- package/dist/drizzle-pg-core.cjs.map +1 -1
- package/dist/drizzle-pg-core.d.cts +7 -0
- package/dist/drizzle-pg-core.d.ts +7 -0
- package/dist/drizzle-pg-core.js +22 -0
- package/dist/drizzle-pg-core.js.map +1 -1
- package/dist/exceptions.cjs +301 -0
- package/dist/exceptions.cjs.map +1 -0
- package/dist/exceptions.d.cts +90 -0
- package/dist/exceptions.d.ts +90 -0
- package/dist/exceptions.js +257 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/filter.types-PuARU9XD.d.cts +50 -0
- package/dist/filter.types-PuARU9XD.d.ts +50 -0
- package/dist/filters.cjs +407 -0
- package/dist/filters.cjs.map +1 -0
- package/dist/filters.d.cts +55 -0
- package/dist/filters.d.ts +55 -0
- package/dist/filters.js +377 -0
- package/dist/filters.js.map +1 -0
- package/dist/index.cjs +0 -5423
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +93 -854
- package/dist/index.d.ts +93 -854
- package/dist/index.js +0 -5301
- package/dist/index.js.map +1 -1
- package/dist/is-country.decorator-CcNwSSr5.d.cts +5 -0
- package/dist/is-country.decorator-CcNwSSr5.d.ts +5 -0
- package/dist/license.d.cts +1 -1
- package/dist/license.d.ts +1 -1
- package/dist/lodash.cjs.map +1 -1
- package/dist/lodash.js.map +1 -1
- package/dist/logger.cjs +862 -0
- package/dist/logger.cjs.map +1 -0
- package/dist/logger.d.cts +118 -0
- package/dist/logger.d.ts +118 -0
- package/dist/logger.js +816 -0
- package/dist/logger.js.map +1 -0
- package/dist/migrate.cjs +2 -2
- package/dist/migrate.cjs.map +1 -1
- package/dist/migrate.d.cts +2 -0
- package/dist/migrate.d.ts +2 -0
- package/dist/migrate.js +2 -2
- package/dist/migrate.js.map +1 -1
- package/dist/money.cjs +18 -3
- package/dist/money.cjs.map +1 -1
- package/dist/money.d.cts +13 -13
- package/dist/money.d.ts +13 -13
- package/dist/money.js +18 -3
- package/dist/money.js.map +1 -1
- package/dist/nats.cjs +34 -35
- package/dist/nats.cjs.map +1 -1
- package/dist/nats.d.cts +14 -14
- package/dist/nats.d.ts +14 -14
- package/dist/nats.js +32 -33
- package/dist/nats.js.map +1 -1
- package/dist/root.cjs +225 -0
- package/dist/root.cjs.map +1 -0
- package/dist/root.d.cts +4 -0
- package/dist/root.d.ts +4 -0
- package/dist/root.js +200 -0
- package/dist/root.js.map +1 -0
- package/dist/{types-DQRwj5rr.d.cts → types-C9jPdQqH.d.cts} +32 -6
- package/dist/{types-DQRwj5rr.d.ts → types-C9jPdQqH.d.ts} +32 -6
- package/dist/types.cjs +19 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +17 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.cjs +273 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +8 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.js +245 -0
- package/dist/utils.js.map +1 -0
- package/package.json +122 -1
- package/dist/cache.service-_SuJIcNA.d.cts +0 -20
- package/dist/cache.service-_SuJIcNA.d.ts +0 -20
- package/dist/fastify-augmentation-CQPBNS5a.d.cts +0 -105
- package/dist/fastify-augmentation-CQPBNS5a.d.ts +0 -105
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database/database.module.ts","../src/database/constants.ts","../src/database/services/primary-database.service.ts","../src/database/services/rls-aware-pool.ts","../src/database/dto/create-response.dto.ts","../src/database/dto/cursor-list-response.dto.ts","../src/database/dto/import-response.dto.ts","../src/database/dto/select-options-query.dto.ts","../src/database/dto/success-response.dto.ts","../src/database/dto/table-response.dto.ts","../src/database/filter/cursor.codec.ts","../src/exceptions/bad-gateway.exception.ts","../src/exceptions/base-field.exception.ts","../src/exceptions/bad-request.exception.ts","../src/exceptions/conflict.exception.ts","../src/exceptions/forbidden.exception.ts","../src/exceptions/gone.exception.ts","../src/exceptions/internal-server-error.exception.ts","../src/exceptions/invalid-cursor.exception.ts","../src/exceptions/method-not-allowed.exception.ts","../src/exceptions/not-acceptable.exception.ts","../src/exceptions/not-found.exception.ts","../src/exceptions/not-implemented.exception.ts","../src/exceptions/payload-too-large.exception.ts","../src/exceptions/request-timeout.exception.ts","../src/exceptions/service-unavailable.exception.ts","../src/exceptions/too-many-requests.exception.ts","../src/exceptions/unauthorized.exception.ts","../src/exceptions/unprocessable-entity.exception.ts","../src/exceptions/unsupported-media-type.exception.ts","../src/exceptions/validation.exception.ts","../src/database/filter/filter.processor.ts","../src/database/filter/filter.types.ts","../src/database/filter/keyset.processor.ts","../src/database/repositories/primary-base.repository.ts"],"sourcesContent":["import { type DynamicModule, Global, type InjectionToken, Module, type Provider } from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport { DATABASE_MODULE_OPTIONS } from './constants';\nimport type { DatabaseModuleOptions } from './interfaces';\nimport { PrimaryDatabaseService } from './services/primary-database.service';\n\n@Global()\n@Module({})\nexport class DatabaseModule {\n // Configures the database module with a single primary connection\n static forServer<T extends unknown[] = unknown[]>(options: {\n useFactory: (...args: [...T]) => Promise<DatabaseModuleOptions> | DatabaseModuleOptions;\n inject?: InjectionToken[];\n }): DynamicModule {\n const asyncProvider: Provider = {\n provide: DATABASE_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n\n return {\n module: DatabaseModule,\n providers: [{ provide: Reflector, useClass: Reflector }, asyncProvider, PrimaryDatabaseService],\n exports: [PrimaryDatabaseService, asyncProvider],\n };\n }\n}\n","export const DATABASE_MODULE_OPTIONS = Symbol('DATABASE_MODULE_OPTIONS');\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n Inject,\n Injectable,\n InternalServerErrorException,\n Logger,\n type OnModuleDestroy,\n type OnModuleInit,\n} from '@nestjs/common';\nimport { drizzle } from 'drizzle-orm/node-postgres';\nimport type { PoolClient } from 'pg';\nimport { DATABASE_MODULE_OPTIONS } from '../constants';\nimport type { DatabaseModuleOptions } from '../interfaces';\nimport type { TypedDrizzleClient } from '../schema.registry';\nimport { RlsAwarePool } from './rls-aware-pool';\n\n@Injectable()\nexport class PrimaryDatabaseService implements OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(PrimaryDatabaseService.name);\n\n private pool: RlsAwarePool | null = null;\n private db: TypedDrizzleClient | null = null;\n\n // Per-request RLS context read by RlsAwarePool per query and by runInTransaction at BEGIN.\n private readonly rlsAls = new AsyncLocalStorage<unknown>();\n\n // Active Drizzle transaction client so repository queries participate in the transaction.\n private readonly txAls = new AsyncLocalStorage<TypedDrizzleClient>();\n\n constructor(\n @Inject(DATABASE_MODULE_OPTIONS)\n private readonly options: DatabaseModuleOptions,\n ) {}\n\n async onModuleInit() {\n if (this.options.primaryDb) {\n await this.initializeDrizzleClient();\n }\n }\n\n // Initializes connection to primary database using Drizzle\n private async initializeDrizzleClient(): Promise<void> {\n try {\n const { host, port = 5432, username, password, database, schema, sslMode = 'require' } = this.options.primaryDb;\n\n this.pool = new RlsAwarePool({\n host,\n port,\n user: username,\n password,\n database,\n max: this.options.maxConnections || 10,\n ssl: sslMode === 'disable' ? false : { rejectUnauthorized: sslMode !== 'no-verify' },\n ...(schema && { options: `-csearch_path=${schema}` }),\n rlsAls: this.rlsAls,\n txAls: this.txAls,\n applyRlsContext: this.options.applyRlsContext,\n });\n\n this.logger.debug(\n `Relations keys passed to drizzle: [${Object.keys(this.options.drizzleRelations || {}).join(', ')}]`,\n );\n this.db = drizzle({\n client: this.pool,\n relations: this.options.drizzleRelations,\n }) as unknown as TypedDrizzleClient;\n\n // Health check runs before any ALS scope is set → bypasses auto-wrap naturally.\n await this.pool.query('SELECT 1');\n this.logger.log(`Connected to primary database (schema: ${schema ?? 'public'})`);\n } catch (error) {\n this.logger.error('Failed to connect to primary database', error);\n throw new InternalServerErrorException('Failed to initialize database connection');\n }\n }\n\n // Returns the active Drizzle client — the pinned tx inside runInTransaction, else the pool-backed one.\n get drizzleClient(): TypedDrizzleClient {\n const pinned = this.txAls.getStore();\n if (pinned) return pinned;\n if (!this.db) {\n throw new Error('Primary database client not initialized');\n }\n return this.db;\n }\n\n // Stashes per-request RLS context in AsyncLocalStorage for downstream queries to apply via SET LOCAL.\n runWithRlsContext<T>(rls: unknown, fn: () => Promise<T>): Promise<T> {\n return this.rlsAls.run(rls, fn);\n }\n\n // Opens a transaction pinning all queries in `fn` to one connection, applying RLS once at BEGIN.\n async runInTransaction<T>(fn: () => Promise<T>): Promise<T> {\n const pinned = this.txAls.getStore();\n if (pinned) {\n return pinned.transaction(async (sp) => this.txAls.run(sp as TypedDrizzleClient, fn));\n }\n\n if (!this.db) {\n throw new Error('Primary database client not initialized');\n }\n const rls = this.rlsAls.getStore();\n const applyRls = this.options.applyRlsContext;\n\n return this.db.transaction(async (tx) => {\n if (rls !== undefined && applyRls) {\n // Drizzle's NodePgSession exposes the checked-out PoolClient at session.client for SET LOCAL binding.\n // biome-ignore lint/suspicious/noExplicitAny: drizzle internal session shape, stable across recent versions\n const sessionClient = (tx as any)?.session?.client as PoolClient | undefined;\n if (sessionClient) {\n await applyRls(sessionClient, rls);\n }\n }\n return this.txAls.run(tx as TypedDrizzleClient, fn);\n });\n }\n\n // Deprecated: prefer runInTransaction. Retained so existing callers keep working until migrated.\n async runWithPinnedConnection<T>(fn: () => Promise<T>): Promise<T> {\n return this.runInTransaction(fn);\n }\n\n async onModuleDestroy() {\n if (this.pool) {\n await this.pool.end();\n this.logger.log('Disconnected from primary database');\n }\n }\n}\n","import type { AsyncLocalStorage } from 'node:async_hooks';\nimport { Pool, type PoolClient, type PoolConfig, type QueryResult, type QueryResultRow, type Submittable } from 'pg';\n\nexport type ApplyRlsContextFn = (client: PoolClient, ctx: unknown) => Promise<void>;\n\nexport interface RlsAwarePoolOptions extends PoolConfig {\n rlsAls: AsyncLocalStorage<unknown>;\n txAls: AsyncLocalStorage<unknown>;\n applyRlsContext?: ApplyRlsContextFn;\n}\n\nexport class RlsAwarePool extends Pool {\n private readonly rlsAls: AsyncLocalStorage<unknown>;\n private readonly txAls: AsyncLocalStorage<unknown>;\n private readonly applyRlsContext?: ApplyRlsContextFn;\n\n constructor(options: RlsAwarePoolOptions) {\n const { rlsAls, txAls, applyRlsContext, ...poolConfig } = options;\n super(poolConfig);\n this.rlsAls = rlsAls;\n this.txAls = txAls;\n this.applyRlsContext = applyRlsContext;\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: matches pg.Pool.query overload surface\n override query(textOrConfig: any, values?: any, cb?: any): any {\n // Bypass: legacy callback-only form (text is actually a callback)\n if (typeof textOrConfig === 'function') {\n return super.query(textOrConfig);\n }\n // Bypass: Submittable (pg-cursor, pg-query-stream) — must reuse one Client end-to-end\n if (textOrConfig && typeof (textOrConfig as Submittable).submit === 'function') {\n return super.query(textOrConfig, values, cb);\n }\n // Bypass: callback variants — preserve raw signature\n if (typeof values === 'function' || typeof cb === 'function') {\n return super.query(textOrConfig, values, cb);\n }\n\n const rls = this.rlsAls.getStore();\n // Bypass: no RLS context (init queries, health checks) OR already inside an explicit transaction\n if (rls === undefined || this.txAls.getStore() !== undefined || !this.applyRlsContext) {\n return super.query(textOrConfig, values);\n }\n\n return this.runWrapped(textOrConfig, values, rls);\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: dispatched from query() overload\n private async runWrapped(textOrConfig: any, values: any, rls: unknown): Promise<QueryResult<QueryResultRow>> {\n const client = await super.connect();\n try {\n await client.query('BEGIN');\n // applyRlsContext is non-null in this branch (checked in query())\n await (this.applyRlsContext as ApplyRlsContextFn)(client, rls);\n const result = await client.query(textOrConfig, values);\n await client.query('COMMIT');\n client.release();\n return result;\n } catch (err) {\n try {\n await client.query('ROLLBACK');\n } catch {\n // connection likely already dead — fall through to release with original error\n }\n // Passing an Error to release() tells pg-pool to evict the client instead of returning it to the pool.\n client.release(err as Error);\n throw err;\n }\n }\n}\n","import { ApiProperty } from '@nestjs/swagger';\n\n// Generic wrapper for create/assign responses — includes success metadata alongside entity data\nexport class CreateResponseDto<T> {\n @ApiProperty({ example: true })\n success: boolean;\n\n @ApiProperty({ example: 'Resource created successfully' })\n message: string;\n\n @ApiProperty()\n data: T;\n}\n","import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';\n\nexport class CursorListResponseDto<T> {\n @ApiProperty()\n items: T[];\n\n @ApiPropertyOptional({ nullable: true })\n nextCursor: string | null;\n\n @ApiProperty()\n hasMore: boolean;\n}\n","import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';\n\nexport class ValidatedRowDto {\n @ApiProperty({ example: 1 })\n index: number;\n\n @ApiProperty({ example: { code: 'products', name: 'Products' } })\n data: Record<string, string>;\n\n @ApiProperty({ example: true })\n valid: boolean;\n\n @ApiProperty({ example: ['Code already exists'] })\n errors: string[];\n}\n\nexport class ImportSummaryDto {\n @ApiProperty({ example: 10 })\n total: number;\n\n @ApiProperty({ example: 8 })\n valid: number;\n\n @ApiProperty({ example: 2 })\n invalid: number;\n}\n\nexport class ImportResponseDto {\n @ApiProperty({ example: true })\n success: boolean;\n\n @ApiProperty({ example: 'Import complete.' })\n message: string;\n\n @ApiPropertyOptional({ example: 3 })\n created?: number;\n\n @ApiPropertyOptional({ example: 2 })\n updated?: number;\n\n @ApiPropertyOptional({ example: 1 })\n skipped?: number;\n\n @ApiPropertyOptional({ type: [ValidatedRowDto] })\n rows?: ValidatedRowDto[];\n\n @ApiPropertyOptional({ type: ImportSummaryDto })\n summary?: ImportSummaryDto;\n}\n","import { ApiPropertyOptional } from '@nestjs/swagger';\nimport { Type } from 'class-transformer';\nimport { IsIn, IsInt, IsOptional, IsString, Min } from 'class-validator';\n\n// Standardized query params for select dropdown option endpoints\nexport class SelectOptionsQueryDto {\n @ApiPropertyOptional({ description: 'Search term to filter by label', example: 'united' })\n @IsOptional()\n @IsString()\n search?: string;\n\n @ApiPropertyOptional({ description: 'Maximum number of results', example: 20, default: 20 })\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @Min(1)\n limit?: number;\n\n @ApiPropertyOptional({ description: 'Number of results to skip', example: 0, default: 0 })\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @Min(0)\n offset?: number;\n\n @ApiPropertyOptional({ description: 'Comma-separated values to fetch specific options', example: '1,2,3' })\n @IsOptional()\n @IsString()\n values?: string;\n\n @ApiPropertyOptional({\n description: 'Comma-separated IDs to exclude from results (already selected)',\n example: '5,10',\n })\n @IsOptional()\n @IsString()\n excludeIds?: string;\n\n @ApiPropertyOptional({ description: 'Column name for option value', example: 'id', default: 'id' })\n @IsOptional()\n @IsString()\n valueKey?: string;\n\n @ApiPropertyOptional({ description: 'Column name for option label', example: 'name', default: 'name' })\n @IsOptional()\n @IsString()\n labelKey?: string;\n\n @ApiPropertyOptional({ description: 'Column name for option description', example: 'description' })\n @IsOptional()\n @IsString()\n descriptionKey?: string;\n\n @ApiPropertyOptional({\n description: 'Comma-separated column names to include in option.additionals',\n example: 'locationName,availableQuantity',\n })\n @IsOptional()\n @IsString()\n additionalKeys?: string;\n\n @ApiPropertyOptional({ description: 'Column name for group ID', example: 'regionId' })\n @IsOptional()\n @IsString()\n groupIdKey?: string;\n\n @ApiPropertyOptional({ description: 'Column name to sort options by', example: 'name', default: 'name' })\n @IsOptional()\n @IsString()\n orderByKey?: string;\n\n @ApiPropertyOptional({\n description: 'Sort direction for options',\n example: 'asc',\n default: 'asc',\n enum: ['asc', 'desc'],\n })\n @IsOptional()\n @IsString()\n @IsIn(['asc', 'desc'])\n orderDirection?: 'asc' | 'desc';\n}\n","import { ApiProperty } from '@nestjs/swagger';\nimport { IsBoolean, IsNotEmpty, IsString } from 'class-validator';\n\nexport class SuccessResponseDto {\n @ApiProperty({ example: true })\n @IsNotEmpty()\n @IsBoolean()\n success: boolean;\n\n @ApiProperty({ example: 'Operation completed successfully' })\n @IsNotEmpty()\n @IsString()\n message: string;\n}\n","import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';\nimport type { TableViewState } from '../filter/filter.types';\n\nexport class TableResponseDto<T> {\n @ApiProperty()\n result: T[];\n\n @ApiProperty()\n count: number;\n\n @ApiProperty()\n state: TableViewState;\n\n @ApiPropertyOptional({ nullable: true })\n activeViewId: string | null;\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\nimport { InvalidCursorException } from '../../exceptions';\n\ntype SerializedValue = { __t: 'date'; v: string } | string | number | boolean | null;\n\ninterface CursorEnvelope {\n s: string;\n v: SerializedValue[];\n}\n\nconst CURSOR_SECRET = process.env.KEYSET_CURSOR_SECRET ?? 'vritti-dev-insecure-keyset-secret';\n\nfunction sign(body: string): string {\n return createHmac('sha256', CURSOR_SECRET).update(body).digest('base64url');\n}\n\nexport class CursorCodec {\n // Encodes ORDER BY boundary values into a tamper-evident base64url token bound to the sort signature.\n static encode(values: unknown[], signature = ''): string {\n const serialized = values.map<SerializedValue>((v) => {\n if (v instanceof Date) return { __t: 'date', v: v.toISOString() };\n if (v === null || v === undefined) return null;\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') return v;\n return String(v);\n });\n const envelope: CursorEnvelope = { s: signature, v: serialized };\n const body = Buffer.from(JSON.stringify(envelope), 'utf8').toString('base64url');\n return `${body}.${sign(body)}`;\n }\n\n // Decodes a cursor back into ordered boundary values, throwing InvalidCursorException on any tamper or sort mismatch.\n static decode(cursor: string, expectedSignature = ''): unknown[] {\n const dot = cursor.lastIndexOf('.');\n if (dot <= 0) throw new InvalidCursorException('Malformed pagination cursor.');\n const body = cursor.slice(0, dot);\n const mac = cursor.slice(dot + 1);\n\n // Integrity: constant-time compare against the recomputed HMAC.\n const macBuf = Buffer.from(mac, 'base64url');\n const expBuf = Buffer.from(sign(body), 'base64url');\n if (macBuf.length !== expBuf.length || !timingSafeEqual(macBuf, expBuf)) {\n throw new InvalidCursorException('Pagination cursor failed its integrity check.');\n }\n\n let envelope: CursorEnvelope;\n try {\n envelope = JSON.parse(Buffer.from(body, 'base64url').toString('utf8')) as CursorEnvelope;\n } catch {\n throw new InvalidCursorException('Pagination cursor could not be parsed.');\n }\n if (!envelope || typeof envelope.s !== 'string' || !Array.isArray(envelope.v)) {\n throw new InvalidCursorException('Pagination cursor has an unexpected shape.');\n }\n if (envelope.s !== expectedSignature) {\n throw new InvalidCursorException('Pagination cursor does not match the current sort order.');\n }\n return envelope.v.map((v) => {\n if (v && typeof v === 'object' && '__t' in v && v.__t === 'date') return new Date(v.v);\n return v;\n });\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class BadGatewayException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Bad Gateway', HttpStatus.BAD_GATEWAY);\n }\n}\n","import { HttpException, HttpStatus } from '@nestjs/common';\nimport type { FieldError } from '../types/error-response.types';\n\n// Re-export FieldError for backwards compatibility\nexport type { FieldError } from '../types/error-response.types';\n\nexport interface ProblemOptions {\n type?: string;\n label?: string;\n detail?: string;\n errors?: FieldError[];\n}\n\nexport abstract class HttpProblemException extends HttpException {\n constructor(detailOrOptions: string | ProblemOptions, httpStatus: HttpStatus) {\n const options = typeof detailOrOptions === 'string' ? { detail: detailOrOptions } : detailOrOptions;\n\n super(\n {\n type: options.type ?? 'about:blank',\n label: options.label,\n detail: options.detail,\n errors: options.errors ?? [],\n },\n httpStatus,\n );\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class BadRequestException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Bad Request', HttpStatus.BAD_REQUEST);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class ConflictException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Conflict', HttpStatus.CONFLICT);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class ForbiddenException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Forbidden', HttpStatus.FORBIDDEN);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class GoneException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Gone', HttpStatus.GONE);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class InternalServerErrorException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Internal Server Error', HttpStatus.INTERNAL_SERVER_ERROR);\n }\n}\n","import type { ProblemOptions } from './base-field.exception';\nimport { BadRequestException } from './bad-request.exception';\n\nexport class InvalidCursorException extends BadRequestException {\n constructor(detail = 'The pagination cursor is invalid.') {\n super({ label: 'Invalid cursor', detail } satisfies ProblemOptions);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class MethodNotAllowedException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Method Not Allowed', HttpStatus.METHOD_NOT_ALLOWED);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class NotAcceptableException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Not Acceptable', HttpStatus.NOT_ACCEPTABLE);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class NotFoundException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Not Found', HttpStatus.NOT_FOUND);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class NotImplementedException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Not Implemented', HttpStatus.NOT_IMPLEMENTED);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class PayloadTooLargeException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Payload Too Large', HttpStatus.PAYLOAD_TOO_LARGE);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class RequestTimeoutException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Request Timeout', HttpStatus.REQUEST_TIMEOUT);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class ServiceUnavailableException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Service Unavailable', HttpStatus.SERVICE_UNAVAILABLE);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class TooManyRequestsException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Too Many Requests', HttpStatus.TOO_MANY_REQUESTS);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class UnauthorizedException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Unauthorized', HttpStatus.UNAUTHORIZED);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class UnprocessableEntityException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Unprocessable Entity', HttpStatus.UNPROCESSABLE_ENTITY);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class UnsupportedMediaTypeException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Unsupported Media Type', HttpStatus.UNSUPPORTED_MEDIA_TYPE);\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class ValidationException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Validation Failed', HttpStatus.UNPROCESSABLE_ENTITY);\n }\n}\n","import {\n and,\n asc,\n type Column,\n desc,\n eq,\n gt,\n gte,\n ilike,\n inArray,\n lt,\n lte,\n ne,\n notIlike,\n notInArray,\n or,\n type SQL,\n} from 'drizzle-orm';\nimport type { FilterCondition, FilterOperator, SearchState, SortCondition } from './filter.types';\n\nexport type FieldDefinition =\n | { column: Column; type: 'string' | 'number' | 'boolean'; nulls?: 'first' | 'last' }\n | { expression: (value: string | number, operator: FilterOperator) => SQL; type: 'string' | 'number' | 'boolean' };\nexport type FieldMap = Record<string, FieldDefinition>;\n\nexport class FilterProcessor {\n // Returns undefined if no conditions (Drizzle accepts undefined as \"no WHERE\")\n static buildWhere(filters: FilterCondition[] = [], fieldMap: FieldMap): SQL | undefined {\n const conditions = filters.flatMap((f) => {\n const def = fieldMap[f.field];\n if (!def) return []; // unknown field — skip (security whitelist)\n // Expression field — delegate SQL generation to the caller-supplied factory (operator passed for custom handling)\n if ('expression' in def) return Array.isArray(f.value) ? [] : [def.expression(f.value, f.operator)];\n const { column: col } = def;\n const val = f.value;\n switch (f.operator) {\n case 'equals':\n if (def.type === 'boolean') return [eq(col, val === 'true' || val === 1)];\n return [eq(col, val)];\n case 'notEquals':\n if (def.type === 'boolean') return [ne(col, val === 'true' || val === 1)];\n return [ne(col, val)];\n case 'contains':\n return [ilike(col, `%${val}%`)];\n case 'notContains':\n return [notIlike(col, `%${val}%`)];\n case 'gt':\n return [gt(col, val)];\n case 'gte':\n return [gte(col, val)];\n case 'lt':\n return [lt(col, val)];\n case 'lte':\n return [lte(col, val)];\n case 'isAnyOf':\n return [inArray(col, Array.isArray(val) ? val : [String(val)])];\n case 'isNotAnyOf':\n return [notInArray(col, Array.isArray(val) ? val : [String(val)])];\n default:\n return [];\n }\n });\n return conditions.length ? and(...conditions) : undefined;\n }\n\n // Builds a search WHERE — OR across all string fields when columnId is 'all', otherwise a single ilike\n static buildSearch(search: SearchState | null | undefined, fieldMap: FieldMap): SQL | undefined {\n if (!search?.value) return undefined;\n\n if (search.columnId === 'all') {\n const conditions = Object.values(fieldMap)\n .filter(\n (def): def is { column: Column; type: 'string' | 'number' | 'boolean' } =>\n 'column' in def && def.type === 'string',\n )\n .map((def) => ilike(def.column, `%${search.value}%`));\n return conditions.length ? or(...conditions) : undefined;\n }\n\n const def = fieldMap[search.columnId];\n if (!def || !('column' in def)) return undefined;\n return ilike(def.column, `%${search.value}%`);\n }\n\n // Maps each SortCondition to an asc/desc SQL expression\n static buildOrderBy(sort: SortCondition[] = [], fieldMap: FieldMap): SQL[] {\n return sort.flatMap((s) => {\n const def = fieldMap[s.field];\n if (!def || !('column' in def)) return [];\n return [s.direction === 'asc' ? asc(def.column) : desc(def.column)];\n });\n }\n}\n","export type FilterOperator =\n | 'equals'\n | 'notEquals'\n | 'contains'\n | 'notContains'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'isAnyOf'\n | 'isNotAnyOf';\n\nexport const FilterOperators = {\n EQUALS: 'equals',\n NOT_EQUALS: 'notEquals',\n CONTAINS: 'contains',\n NOT_CONTAINS: 'notContains',\n GT: 'gt',\n GTE: 'gte',\n LT: 'lt',\n LTE: 'lte',\n IS_ANY_OF: 'isAnyOf',\n IS_NOT_ANY_OF: 'isNotAnyOf',\n} as const satisfies Record<string, FilterOperator>;\n\nexport interface FilterCondition {\n field: string;\n operator: FilterOperator;\n value: string | number | string[];\n}\n\nexport interface SortCondition {\n field: string;\n direction: 'asc' | 'desc';\n}\n\nexport type DensityType = 'compact' | 'normal' | 'comfortable';\n\nexport interface ColumnPinning {\n left: string[];\n right: string[];\n}\n\nexport interface SearchState {\n columnId: string;\n value: string;\n}\n\nexport interface TableViewState {\n filters: FilterCondition[];\n sort: SortCondition[];\n columnVisibility: Record<string, boolean>;\n columnOrder: string[];\n columnSizing: Record<string, number>;\n columnPinning: ColumnPinning;\n lockedColumnSizing: boolean;\n density: DensityType;\n filterOrder: string[];\n filterVisibility: Record<string, boolean>;\n search: SearchState | null;\n pagination: { limit: number; offset: number };\n}\n","import { and, type Column, eq, gt, isNotNull, isNull, lt, or, type SQL, sql } from 'drizzle-orm';\n\nexport const MAX_PAGE_SIZE = 100;\n\nexport interface KeysetOrderBy {\n column: Column;\n direction: 'asc' | 'desc';\n nulls?: 'first' | 'last';\n}\n\n// Stable signature of an ORDER BY, used to bind a cursor to the sort that produced it.\nexport function keysetSignature(entries: { key: string; direction: 'asc' | 'desc' }[]): string {\n return entries.map((e) => `${e.key}:${e.direction}`).join(',');\n}\n\nexport class KeysetProcessor {\n // Builds the \"after this row\" predicate for keyset pagination.\n static buildAfter(orderBy: KeysetOrderBy[], values: unknown[]): SQL {\n const first = orderBy[0];\n if (!first) return sql`true`;\n // Fast path: uniform direction + all NOT NULL columns (>= 2 cols) → a Postgres row-value comparison.\n const uniform = orderBy.every((o) => o.direction === first.direction);\n const anyNullable = orderBy.some((o) => o.nulls !== undefined);\n if (uniform && !anyNullable && orderBy.length >= 2) {\n return KeysetProcessor.buildRowValue(orderBy, values, first.direction);\n }\n return KeysetProcessor.buildOrExpansion(orderBy, values);\n }\n\n // (c1, c2, …) > (v1, v2, …) for asc, < for desc. Correct only for uniform direction, no NULLs.\n private static buildRowValue(orderBy: KeysetOrderBy[], values: unknown[], direction: 'asc' | 'desc'): SQL {\n const cols = sql.join(\n orderBy.map((o) => sql`${o.column}`),\n sql`, `,\n );\n const vals = sql.join(\n values.map((v) => sql`${v}`),\n sql`, `,\n );\n const op = direction === 'asc' ? sql`>` : sql`<`;\n return sql`(${cols}) ${op} (${vals})`;\n }\n\n // Lexicographic OR-expansion, NULL-aware per column when a `nulls` placement is declared.\n private static buildOrExpansion(orderBy: KeysetOrderBy[], values: unknown[]): SQL {\n const groups: SQL[] = [];\n for (let i = 0; i < orderBy.length; i++) {\n const current = orderBy[i];\n if (!current) continue;\n const conditions: SQL[] = [];\n for (let j = 0; j < i; j++) {\n const prior = orderBy[j];\n if (prior) conditions.push(KeysetProcessor.tie(prior.column, values[j]));\n }\n conditions.push(KeysetProcessor.strictlyAfter(current, values[i]));\n const group = conditions.length === 1 ? conditions[0] : and(...conditions);\n if (group) groups.push(group);\n }\n const firstGroup = groups[0];\n if (groups.length === 1 && firstGroup) return firstGroup;\n return or(...groups) as SQL;\n }\n\n // Tie on an earlier column: match its boundary value (NULL-safe).\n private static tie(column: Column, value: unknown): SQL {\n return value === null || value === undefined ? isNull(column) : eq(column, value);\n }\n\n // Strictly past the boundary on this column, respecting direction and NULL placement.\n private static strictlyAfter(o: KeysetOrderBy, value: unknown): SQL {\n // NOT NULL column (no nulls hint): clean comparison — original behavior, index-friendly.\n if (o.nulls === undefined) {\n return (o.direction === 'asc' ? gt(o.column, value) : lt(o.column, value)) as SQL;\n }\n const nullsLast = o.nulls === 'last';\n // A NULL boundary value: only rows on the \"far\" side of the NULL group are strictly after it.\n if (value === null || value === undefined) {\n return (nullsLast ? sql`false` : isNotNull(o.column)) as SQL;\n }\n const cmp = o.direction === 'asc' ? gt(o.column, value) : lt(o.column, value);\n // With NULLS LAST, a NULL column value sorts after any non-NULL boundary → also \"after\".\n return (nullsLast ? or(cmp, isNull(o.column)) : cmp) as SQL;\n }\n}\n","import { Logger } from '@nestjs/common';\nimport {\n and,\n asc,\n desc,\n eq,\n getTableName,\n getViewName,\n type InferInsertModel,\n type InferSelectModel,\n type InferSelectViewModel,\n ilike,\n inArray,\n is,\n notInArray,\n type SQL,\n sql,\n} from 'drizzle-orm';\nimport type { PgColumn, PgSequence, PgTable, SelectedFields } from 'drizzle-orm/pg-core';\nimport type { AnyPgAsyncSelect } from 'drizzle-orm/pg-core/async';\nimport { PgViewBase } from 'drizzle-orm/pg-core/view-base';\nimport { MAX_PAGE_SIZE } from '../filter';\nimport type { TypedDrizzleClient } from '../schema.registry';\nimport { PrimaryDatabaseService } from '../services/primary-database.service';\nimport type { FindForSelectConfig, SelectQueryResult } from '../types';\n\n// Converts snake_case string to camelCase\nfunction snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\ntype RelationsWhereFilter = Record<string, unknown>;\n\ninterface TypedRelationalQueryBuilder<TSelect> {\n findFirst(config?: {\n where?: RelationsWhereFilter;\n with?: Record<string, unknown>;\n columns?: Record<string, boolean>;\n }): Promise<TSelect | undefined>;\n\n findMany(config?: {\n where?: RelationsWhereFilter;\n orderBy?: Record<string, 'asc' | 'desc'>;\n limit?: number;\n offset?: number;\n with?: Record<string, unknown>;\n columns?: Record<string, boolean>;\n }): Promise<TSelect[]>;\n}\n\nexport abstract class PrimaryBaseRepository<\n TTable extends PgTable | PgViewBase,\n TInsert = TTable extends PgTable ? InferInsertModel<TTable> : never,\n TSelect = TTable extends PgTable\n ? InferSelectModel<TTable>\n : TTable extends PgViewBase\n ? InferSelectViewModel<TTable>\n : never,\n> {\n protected readonly logger: Logger;\n protected readonly sequence?: PgSequence;\n\n private readonly tableName: string;\n private readonly isView: boolean;\n\n protected get db(): TypedDrizzleClient {\n return this.database.drizzleClient;\n }\n\n protected get model(): TypedRelationalQueryBuilder<TSelect> {\n if (this.isView) {\n throw new Error(\n `${this.constructor.name}: relational queries (.model) are not supported on the view '${this.tableName}'. Use findForSelect / findAllAndCount instead.`,\n );\n }\n\n const query = this.database.drizzleClient.query;\n const queryKeys = Object.keys(query || {});\n this.logger.debug(`Looking for '${this.tableName}' in query keys: [${queryKeys.join(', ')}]`);\n\n const model = query[this.tableName as keyof TypedDrizzleClient['query']];\n if (!model) {\n this.logger.error(`Table '${this.tableName}' not found in query object. Available: [${queryKeys.join(', ')}]`);\n }\n\n return model as unknown as TypedRelationalQueryBuilder<TSelect>;\n }\n\n constructor(\n protected readonly database: PrimaryDatabaseService,\n protected readonly table: TTable,\n options?: {\n sequence?: PgSequence;\n },\n ) {\n // Convert snake_case table/view name to camelCase to match Drizzle query object keys\n this.isView = is(table, PgViewBase);\n const dbTableName = this.isView ? getViewName(table as PgViewBase) : getTableName(table as PgTable);\n this.tableName = snakeToCamel(dbTableName);\n this.sequence = options?.sequence;\n this.logger = new Logger(this.constructor.name);\n this.logger.debug(`Initialized ${this.constructor.name}`);\n this.logger.debug(`Table name: '${dbTableName}' -> query key: '${this.tableName}'`);\n }\n\n // Returns next value from configured sequence, or an explicitly passed sequence\n protected async nextSequenceValue(sequence?: PgSequence): Promise<number> {\n const resolvedSequence = sequence ?? this.sequence;\n if (!resolvedSequence) {\n throw new Error(`${this.constructor.name}: sequence is required for nextSequenceValue`);\n }\n\n const sequenceName = resolvedSequence.schema\n ? `${resolvedSequence.schema}.${resolvedSequence.seqName}`\n : resolvedSequence.seqName;\n\n const result = await this.db.execute<{ sequence_value: number }>(\n sql`select nextval(${sequenceName}::regclass) as sequence_value`,\n );\n const rows = (result as { rows?: Array<{ sequence_value: number | string }> }).rows ?? [];\n return Number(rows[0]?.sequence_value ?? 1);\n }\n\n // Creates a new record and returns it\n async create(data: TInsert, tx?: TypedDrizzleClient): Promise<TSelect> {\n this.logger.log('Creating record');\n const db = tx ?? this.db;\n const results = (await db\n .insert(this.table as PgTable)\n .values(data as Record<string, unknown>)\n .returning()) as TSelect[];\n const record = results[0];\n if (!record) throw new Error(`${this.tableName}: database operation returned no record`);\n return record;\n }\n\n // Finds a single record by primary key ID\n async findById(id: string): Promise<TSelect | undefined> {\n this.logger.debug(`Finding record by ID: ${id}`);\n return this.model.findFirst({\n where: { id },\n });\n }\n\n // Finds a single record matching the given where filter\n async findOne(where: RelationsWhereFilter): Promise<TSelect | undefined> {\n this.logger.debug('Finding record with custom query');\n return this.model.findFirst({ where });\n }\n\n // Finds multiple records with optional filtering, ordering, and pagination\n async findMany(options?: {\n where?: RelationsWhereFilter;\n orderBy?: Record<string, 'asc' | 'desc'>;\n limit?: number;\n offset?: number;\n }): Promise<TSelect[]> {\n this.logger.debug('Finding multiple records');\n return this.model.findMany(options);\n }\n\n // Builds a select query with optional custom fields, joins, filter, grouping, ordering, and pagination\n private buildSelectQuery(options?: {\n select?: Record<string, unknown>;\n where?: SQL;\n orderBy?: SQL[];\n limit?: number;\n offset?: number;\n leftJoin?: { table: PgTable; on: SQL | undefined };\n leftJoins?: { table: PgTable; on: SQL | undefined }[];\n groupBy?: (PgColumn | SQL)[];\n }) {\n // Type as the concrete async select and cast each reassignment — Drizzle's dynamic builder returns union types.\n let query = (\n options?.select\n ? this.db.select(options.select as SelectedFields).from(this.table as PgTable)\n : this.db.select().from(this.table as PgTable)\n ).$dynamic() as AnyPgAsyncSelect;\n\n if (options?.leftJoin) {\n query = query.leftJoin(options.leftJoin.table, options.leftJoin.on) as AnyPgAsyncSelect;\n }\n if (options?.leftJoins) {\n for (const join of options.leftJoins) {\n query = query.leftJoin(join.table, join.on) as AnyPgAsyncSelect;\n }\n }\n if (options?.where) {\n query = query.where(options.where) as AnyPgAsyncSelect;\n }\n if (options?.groupBy?.length) {\n query = query.groupBy(...options.groupBy) as AnyPgAsyncSelect;\n }\n if (options?.orderBy?.length) {\n query = query.orderBy(...options.orderBy) as AnyPgAsyncSelect;\n }\n if (options?.limit) {\n query = query.limit(options.limit) as AnyPgAsyncSelect;\n }\n if (options?.offset) {\n query = query.offset(options.offset) as AnyPgAsyncSelect;\n }\n return query;\n }\n\n // Returns paginated result and total count, with optional custom select, LEFT JOINs, GROUP BY, and ordering\n async findAllAndCount<TResult = TSelect>(options?: {\n select?: Record<string, unknown>;\n where?: SQL;\n orderBy?: SQL[];\n limit?: number;\n offset?: number;\n leftJoin?: { table: PgTable; on: SQL | undefined };\n leftJoins?: { table: PgTable; on: SQL | undefined }[];\n groupBy?: (PgColumn | SQL)[];\n }): Promise<{ result: TResult[]; count: number }> {\n let countResultPromise: Promise<{ count: number }[]>;\n\n if (options?.groupBy?.length) {\n // When groupBy is active, wrap the grouped query in a subquery so we count distinct groups.\n let subq = this.db\n .select({ _: sql`1` })\n .from(this.table as PgTable)\n .$dynamic();\n if (options.leftJoin) {\n subq = subq.leftJoin(options.leftJoin.table, options.leftJoin.on) as typeof subq;\n }\n if (options.leftJoins) {\n for (const join of options.leftJoins) {\n subq = subq.leftJoin(join.table, join.on) as typeof subq;\n }\n }\n if (options.where) {\n subq = subq.where(options.where) as typeof subq;\n }\n subq = subq.groupBy(...options.groupBy) as typeof subq;\n\n const named = subq.as('_count_subq');\n countResultPromise = this.db.select({ count: sql<number>`count(*)::int` }).from(named) as unknown as Promise<\n { count: number }[]\n >;\n } else {\n // Count query mirrors the same JOINs so WHERE clauses on joined columns are valid\n let countQuery = this.db\n .select({ count: sql<number>`count(*)::int` })\n .from(this.table as PgTable)\n .$dynamic();\n if (options?.leftJoin) {\n countQuery = countQuery.leftJoin(options.leftJoin.table, options.leftJoin.on) as typeof countQuery;\n }\n if (options?.leftJoins) {\n for (const join of options.leftJoins) {\n countQuery = countQuery.leftJoin(join.table, join.on) as typeof countQuery;\n }\n }\n if (options?.where) {\n countQuery = countQuery.where(options.where) as typeof countQuery;\n }\n countResultPromise = countQuery as unknown as Promise<{ count: number }[]>;\n }\n\n const [countResult, result] = await Promise.all([\n countResultPromise,\n this.buildSelectQuery(options) as unknown as Promise<TResult[]>,\n ]);\n return { result, count: (countResult[0] as { count: number }).count };\n }\n\n // Fetches limit+1 rows for keyset pagination and trims, returning rows plus hasMore.\n async findKeyset<TResult = TSelect>(options: {\n select?: Record<string, unknown>;\n where?: SQL;\n orderBy: SQL[];\n limit: number;\n leftJoin?: { table: PgTable; on: SQL | undefined };\n leftJoins?: { table: PgTable; on: SQL | undefined }[];\n groupBy?: (PgColumn | SQL)[];\n }): Promise<{ rows: TResult[]; hasMore: boolean }> {\n // Clamp the requested page to [1, MAX_PAGE_SIZE], then fetch limit+1 to detect hasMore and trim.\n const limit = Math.min(Math.max(1, Math.trunc(options.limit) || 1), MAX_PAGE_SIZE);\n const rows = (await this.buildSelectQuery({\n ...options,\n limit: limit + 1,\n })) as unknown as TResult[];\n const hasMore = rows.length > limit;\n return { rows: hasMore ? rows.slice(0, limit) : rows, hasMore };\n }\n\n // Updates a record by ID and returns the updated record\n async update(id: string, data: Partial<TInsert>, tx?: TypedDrizzleClient): Promise<TSelect> {\n this.logger.log(`Updating record with ID: ${id}`);\n const db = tx ?? this.db;\n const idColumn = (this.table as unknown as Record<string, PgColumn>).id;\n if (!idColumn) throw new Error(`Table '${this.tableName}' has no 'id' column`);\n const results = (await db\n .update(this.table as PgTable)\n .set(data as Record<string, unknown>)\n .where(eq(idColumn, id))\n .returning()) as TSelect[];\n const record = results[0];\n if (!record) throw new Error(`${this.tableName}: database operation returned no record`);\n return record;\n }\n\n // Updates all records matching the SQL condition and returns the affected count\n async updateMany(where: SQL, data: Partial<TInsert>, tx?: TypedDrizzleClient): Promise<{ count: number }> {\n this.logger.log('Updating multiple records');\n const db = tx ?? this.db;\n const result = await db\n .update(this.table as PgTable)\n .set(data as Record<string, unknown>)\n .where(where);\n return { count: result.rowCount ?? 0 };\n }\n\n // Deletes a record by ID and returns the deleted record\n async delete(id: string, tx?: TypedDrizzleClient): Promise<TSelect> {\n this.logger.log(`Deleting record with ID: ${id}`);\n const db = tx ?? this.db;\n const idColumn = (this.table as unknown as Record<string, PgColumn>).id;\n if (!idColumn) throw new Error(`Table '${this.tableName}' has no 'id' column`);\n const results = (await db\n .delete(this.table as PgTable)\n .where(eq(idColumn, id))\n .returning()) as TSelect[];\n const record = results[0];\n if (!record) throw new Error(`${this.tableName}: database operation returned no record`);\n return record;\n }\n\n // Deletes all records matching the SQL condition and returns the affected count\n async deleteMany(where: SQL, tx?: TypedDrizzleClient): Promise<{ count: number }> {\n this.logger.log('Deleting multiple records');\n const db = tx ?? this.db;\n const result = await db.delete(this.table as PgTable).where(where);\n return { count: result.rowCount ?? 0 };\n }\n\n // Counts records matching the optional SQL condition\n async count(where?: SQL): Promise<number> {\n this.logger.debug('Counting records');\n\n let query = this.db\n .select({ count: sql<number>`count(*)::int` })\n .from(this.table as PgTable)\n .$dynamic();\n\n if (where) {\n query = query.where(where);\n }\n\n const results = await query;\n return (results[0] as { count: number }).count;\n }\n\n // Returns true if at least one record matches the SQL condition\n async exists(where: SQL): Promise<boolean> {\n const count = await this.count(where);\n return count > 0;\n }\n\n // Executes the callback within a database transaction, applying the ALS RLS context once at BEGIN.\n async transaction<T>(callback: (tx: TypedDrizzleClient) => Promise<T>): Promise<T> {\n return this.database.runInTransaction(async () => callback(this.database.drizzleClient));\n }\n\n // Finds records formatted as select dropdown options with optional search, pagination, and grouping\n async findForSelect(config: FindForSelectConfig): Promise<SelectQueryResult> {\n this.logger.debug('Finding records for select dropdown');\n\n // Use selectDistinct when deduplication is needed (e.g., distinct app codes across versions)\n const selectFn = config.distinct ? this.db.selectDistinct.bind(this.db) : this.db.select.bind(this.db);\n\n interface SelectRow {\n value: string | number | boolean;\n label: string;\n description?: string;\n groupId?: string | number;\n }\n interface SelectRowWithCount extends SelectRow {\n totalCount: number;\n }\n\n // Parse values from CSV string or use array as-is\n const parsedValues =\n typeof config.values === 'string'\n ? config.values\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean)\n : config.values;\n\n // Parse excludeIds from CSV string or use array as-is\n const parsedExcludeIds =\n typeof config.excludeIds === 'string'\n ? config.excludeIds\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean)\n : (config.excludeIds ?? []);\n\n const tableColumns = this.table as unknown as Record<string, PgColumn>;\n\n const joinTables = config.joins?.map((join) => join.table as unknown as Record<string, PgColumn>) ?? [];\n const resolveColumn = (key: string): PgColumn | undefined => {\n if (tableColumns[key]) return tableColumns[key];\n for (const joinColumns of joinTables) {\n if (joinColumns[key]) return joinColumns[key];\n }\n return undefined;\n };\n\n const valueCol = resolveColumn(config.value);\n if (!valueCol) throw new Error(`Column '${config.value}' not found in table '${this.tableName}' or its joins`);\n\n const labelCol = resolveColumn(config.label);\n if (!labelCol) throw new Error(`Column '${config.label}' not found in table '${this.tableName}' or its joins`);\n\n const descriptionCol = config.description ? resolveColumn(config.description) : undefined;\n\n const parseKeys = (input?: string | string[]): string[] => {\n if (!input) return [];\n const values = Array.isArray(input) ? input : input.split(',');\n return values.map((v) => v.trim()).filter(Boolean);\n };\n const additionalKeys = parseKeys(config.additionalKeys);\n const additionalEntries: { key: string; expr: PgColumn | SQL }[] = [\n ...additionalKeys\n .map((key) => ({ key, expr: resolveColumn(key) as PgColumn | undefined }))\n .filter((e): e is { key: string; expr: PgColumn } => Boolean(e.expr)),\n ...Object.entries(config.additionalExpressions ?? {}).map(([key, expr]) => ({ key, expr })),\n ];\n const additionalAlias = (key: string) => `__additional_${key}`;\n\n // When values are provided, fetch those specific options by value (skip search/pagination)\n if (parsedValues && parsedValues.length > 0) {\n const selectCols: Record<string, PgColumn | SQL> = { value: valueCol, label: labelCol };\n if (descriptionCol) selectCols.description = descriptionCol;\n if (config.groupIdKey) {\n const groupIdCol = resolveColumn(config.groupIdKey);\n if (groupIdCol) selectCols.groupId = groupIdCol;\n }\n for (const entry of additionalEntries) {\n selectCols[additionalAlias(entry.key)] = entry.expr;\n }\n\n let valuesQuery = selectFn(selectCols as SelectedFields)\n .from(this.table as PgTable)\n .$dynamic();\n\n if (config.joins) {\n for (const join of config.joins) {\n if (join.type === 'inner') {\n valuesQuery = valuesQuery.innerJoin(join.table, join.on);\n } else {\n valuesQuery = valuesQuery.leftJoin(join.table, join.on);\n }\n }\n }\n\n const rows = await valuesQuery.where(inArray(valueCol, parsedValues));\n\n return {\n options: (rows as unknown as SelectRow[]).map((row) => ({\n value: row.value,\n label: String(row.label),\n ...(descriptionCol && row.description != null ? { description: String(row.description) } : {}),\n ...(config.groupIdKey && row.groupId != null ? { groupId: row.groupId } : {}),\n ...(additionalEntries.length > 0\n ? {\n additionals: additionalEntries.reduce<Record<string, string | number | boolean | null>>(\n (acc, entry) => {\n const value = (row as unknown as Record<string, unknown>)[additionalAlias(entry.key)];\n if (value !== undefined) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n acc[entry.key] = value;\n } else {\n acc[entry.key] = String(value);\n }\n }\n return acc;\n },\n {},\n ),\n }\n : {}),\n })),\n hasMore: false,\n ...(config.groups ? { groups: config.groups } : {}),\n };\n }\n\n // Use SQL builder for count(*) over() window function support\n const selectFields: Record<string, PgColumn | SQL> = {\n value: valueCol,\n label: labelCol,\n totalCount: sql<number>`count(*) over()`.mapWith(Number),\n };\n if (descriptionCol) selectFields.description = descriptionCol;\n if (config.groupIdKey) {\n const groupIdCol = resolveColumn(config.groupIdKey);\n if (groupIdCol) selectFields.groupId = groupIdCol;\n }\n for (const entry of additionalEntries) {\n selectFields[additionalAlias(entry.key)] = entry.expr;\n }\n\n const conditions: SQL[] = [];\n if (config.search) {\n conditions.push(ilike(labelCol, `%${config.search}%`));\n }\n if (parsedExcludeIds.length > 0) {\n conditions.push(notInArray(valueCol, parsedExcludeIds));\n }\n if (config.where) {\n for (const [field, val] of Object.entries(config.where)) {\n const column = tableColumns[field];\n if (column) {\n conditions.push(eq(column, val));\n }\n }\n }\n // Append raw SQL conditions (e.g. for joined table columns)\n if (config.conditions) {\n conditions.push(...config.conditions);\n }\n\n const orderByKey = config.orderByKey || (config.orderBy ? Object.keys(config.orderBy)[0] : undefined);\n const orderDirection = config.orderDirection || (config.orderBy ? Object.values(config.orderBy)[0] : undefined);\n const orderByCol = orderByKey ? (tableColumns[orderByKey] ?? labelCol) : labelCol;\n const limit = Number(config.limit) || 20;\n const offset = Number(config.offset) || 0;\n\n let query = selectFn(selectFields as SelectedFields)\n .from(this.table as PgTable)\n .$dynamic();\n\n // Apply optional JOINs\n if (config.joins) {\n for (const join of config.joins) {\n if (join.type === 'inner') {\n query = query.innerJoin(join.table, join.on);\n } else {\n query = query.leftJoin(join.table, join.on);\n }\n }\n }\n\n if (conditions.length > 0) {\n query = query.where(conditions.length === 1 ? conditions[0] : (and(...conditions) as SQL));\n }\n\n const orderClauses: SQL[] = [];\n if (config.groupIdKey) {\n const groupIdCol = resolveColumn(config.groupIdKey);\n if (groupIdCol) orderClauses.push(asc(groupIdCol));\n }\n orderClauses.push(orderDirection === 'desc' ? desc(orderByCol) : asc(orderByCol));\n\n query = query\n .orderBy(...orderClauses)\n .limit(limit)\n .offset(offset);\n\n const rows = await query;\n\n const totalCount = rows.length > 0 ? (rows[0] as unknown as SelectRowWithCount).totalCount : 0;\n\n const options = (rows as unknown as SelectRow[]).map((row) => ({\n value: row.value,\n label: String(row.label),\n ...(descriptionCol && row.description != null ? { description: String(row.description) } : {}),\n ...(config.groupIdKey && row.groupId != null ? { groupId: row.groupId } : {}),\n ...(additionalEntries.length > 0\n ? {\n additionals: additionalEntries.reduce<Record<string, string | number | boolean | null>>((acc, entry) => {\n const value = (row as unknown as Record<string, unknown>)[additionalAlias(entry.key)];\n if (value !== undefined) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n acc[entry.key] = value;\n } else {\n acc[entry.key] = String(value);\n }\n }\n return acc;\n }, {}),\n }\n : {}),\n }));\n\n // Auto-resolve groups from groupTable when provided\n let resolvedGroups = config.groups;\n\n if (config.groupTable && config.groupIdKey) {\n const groupTableColumns = config.groupTable as unknown as Record<string, PgColumn>;\n const groupIdKey = config.groupTableIdKey ?? 'id';\n const groupNameKey = config.groupLabelKey ?? 'name';\n const groupIdCol = groupTableColumns[groupIdKey];\n if (!groupIdCol) throw new Error(`Column '${groupIdKey}' not found in group table`);\n const groupNameCol = groupTableColumns[groupNameKey];\n if (!groupNameCol) throw new Error(`Column '${groupNameKey}' not found in group table`);\n\n const groupRows = await this.db\n .select({ id: groupIdCol, name: groupNameCol } as SelectedFields)\n .from(config.groupTable)\n .orderBy(asc(groupNameCol));\n\n resolvedGroups = (groupRows as unknown as Array<{ id: string | number; name: string }>).map((r) => ({\n id: r.id,\n name: String(r.name),\n }));\n }\n\n return {\n options,\n hasMore: offset + limit < totalCount,\n totalCount,\n ...(resolvedGroups ? { groups: resolvedGroups } : {}),\n };\n }\n}\n"],"mappings":";;;;AAAA,SAA6BA,QAA6BC,cAA6B;AACvF,SAASC,iBAAiB;;;ACDnB,IAAMC,0BAA0BC,OAAO,yBAAA;;;ACA9C,SAASC,yBAAyB;AAClC,SACEC,QACAC,YACAC,8BACAC,cAGK;AACP,SAASC,eAAe;;;ACRxB,SAASC,YAAuG;AAUzG,IAAMC,eAAN,cAA2BC,KAAAA;EAVlC,OAUkCA;;;EACfC;EACAC;EACAC;EAEjB,YAAYC,SAA8B;AACxC,UAAM,EAAEH,QAAQC,OAAOC,iBAAiB,GAAGE,WAAAA,IAAeD;AAC1D,UAAMC,UAAAA;AACN,SAAKJ,SAASA;AACd,SAAKC,QAAQA;AACb,SAAKC,kBAAkBA;EACzB;;EAGSG,MAAMC,cAAmBC,QAAcC,IAAe;AAE7D,QAAI,OAAOF,iBAAiB,YAAY;AACtC,aAAO,MAAMD,MAAMC,YAAAA;IACrB;AAEA,QAAIA,gBAAgB,OAAQA,aAA6BG,WAAW,YAAY;AAC9E,aAAO,MAAMJ,MAAMC,cAAcC,QAAQC,EAAAA;IAC3C;AAEA,QAAI,OAAOD,WAAW,cAAc,OAAOC,OAAO,YAAY;AAC5D,aAAO,MAAMH,MAAMC,cAAcC,QAAQC,EAAAA;IAC3C;AAEA,UAAME,MAAM,KAAKV,OAAOW,SAAQ;AAEhC,QAAID,QAAQE,UAAa,KAAKX,MAAMU,SAAQ,MAAOC,UAAa,CAAC,KAAKV,iBAAiB;AACrF,aAAO,MAAMG,MAAMC,cAAcC,MAAAA;IACnC;AAEA,WAAO,KAAKM,WAAWP,cAAcC,QAAQG,GAAAA;EAC/C;;EAGA,MAAcG,WAAWP,cAAmBC,QAAaG,KAAoD;AAC3G,UAAMI,SAAS,MAAM,MAAMC,QAAAA;AAC3B,QAAI;AACF,YAAMD,OAAOT,MAAM,OAAA;AAEnB,YAAO,KAAKH,gBAAsCY,QAAQJ,GAAAA;AAC1D,YAAMM,SAAS,MAAMF,OAAOT,MAAMC,cAAcC,MAAAA;AAChD,YAAMO,OAAOT,MAAM,QAAA;AACnBS,aAAOG,QAAO;AACd,aAAOD;IACT,SAASE,KAAK;AACZ,UAAI;AACF,cAAMJ,OAAOT,MAAM,UAAA;MACrB,QAAQ;MAER;AAEAS,aAAOG,QAAQC,GAAAA;AACf,YAAMA;IACR;EACF;AACF;;;;;;;;;;;;;;;;;;;;ADrDO,IAAMC,yBAAN,MAAMA,wBAAAA;SAAAA;;;;EACMC,SAAS,IAAIC,OAAOF,wBAAuBG,IAAI;EAExDC,OAA4B;EAC5BC,KAAgC;;EAGvBC,SAAS,IAAIC,kBAAAA;;EAGbC,QAAQ,IAAID,kBAAAA;EAE7B,YAEmBE,SACjB;SADiBA,UAAAA;EAChB;EAEH,MAAMC,eAAe;AACnB,QAAI,KAAKD,QAAQE,WAAW;AAC1B,YAAM,KAAKC,wBAAuB;IACpC;EACF;;EAGA,MAAcA,0BAAyC;AACrD,QAAI;AACF,YAAM,EAAEC,MAAMC,OAAO,MAAMC,UAAUC,UAAUC,UAAUC,QAAQC,UAAU,UAAS,IAAK,KAAKV,QAAQE;AAEtG,WAAKP,OAAO,IAAIgB,aAAa;QAC3BP;QACAC;QACAO,MAAMN;QACNC;QACAC;QACAK,KAAK,KAAKb,QAAQc,kBAAkB;QACpCC,KAAKL,YAAY,YAAY,QAAQ;UAAEM,oBAAoBN,YAAY;QAAY;QACnF,GAAID,UAAU;UAAET,SAAS,iBAAiBS,MAAAA;QAAS;QACnDZ,QAAQ,KAAKA;QACbE,OAAO,KAAKA;QACZkB,iBAAiB,KAAKjB,QAAQiB;MAChC,CAAA;AAEA,WAAKzB,OAAO0B,MACV,sCAAsCC,OAAOC,KAAK,KAAKpB,QAAQqB,oBAAoB,CAAC,CAAA,EAAGC,KAAK,IAAA,CAAA,GAAQ;AAEtG,WAAK1B,KAAK2B,QAAQ;QAChBC,QAAQ,KAAK7B;QACb8B,WAAW,KAAKzB,QAAQqB;MAC1B,CAAA;AAGA,YAAM,KAAK1B,KAAK+B,MAAM,UAAA;AACtB,WAAKlC,OAAOmC,IAAI,0CAA0ClB,UAAU,QAAA,GAAW;IACjF,SAASmB,OAAO;AACd,WAAKpC,OAAOoC,MAAM,yCAAyCA,KAAAA;AAC3D,YAAM,IAAIC,6BAA6B,0CAAA;IACzC;EACF;;EAGA,IAAIC,gBAAoC;AACtC,UAAMC,SAAS,KAAKhC,MAAMiC,SAAQ;AAClC,QAAID,OAAQ,QAAOA;AACnB,QAAI,CAAC,KAAKnC,IAAI;AACZ,YAAM,IAAIqC,MAAM,yCAAA;IAClB;AACA,WAAO,KAAKrC;EACd;;EAGAsC,kBAAqBC,KAAcC,IAAkC;AACnE,WAAO,KAAKvC,OAAOwC,IAAIF,KAAKC,EAAAA;EAC9B;;EAGA,MAAME,iBAAoBF,IAAkC;AAC1D,UAAML,SAAS,KAAKhC,MAAMiC,SAAQ;AAClC,QAAID,QAAQ;AACV,aAAOA,OAAOQ,YAAY,OAAOC,OAAO,KAAKzC,MAAMsC,IAAIG,IAA0BJ,EAAAA,CAAAA;IACnF;AAEA,QAAI,CAAC,KAAKxC,IAAI;AACZ,YAAM,IAAIqC,MAAM,yCAAA;IAClB;AACA,UAAME,MAAM,KAAKtC,OAAOmC,SAAQ;AAChC,UAAMS,WAAW,KAAKzC,QAAQiB;AAE9B,WAAO,KAAKrB,GAAG2C,YAAY,OAAOG,OAAAA;AAChC,UAAIP,QAAQQ,UAAaF,UAAU;AAGjC,cAAMG,gBAAiBF,IAAYG,SAASrB;AAC5C,YAAIoB,eAAe;AACjB,gBAAMH,SAASG,eAAeT,GAAAA;QAChC;MACF;AACA,aAAO,KAAKpC,MAAMsC,IAAIK,IAA0BN,EAAAA;IAClD,CAAA;EACF;;EAGA,MAAMU,wBAA2BV,IAAkC;AACjE,WAAO,KAAKE,iBAAiBF,EAAAA;EAC/B;EAEA,MAAMW,kBAAkB;AACtB,QAAI,KAAKpD,MAAM;AACb,YAAM,KAAKA,KAAKqD,IAAG;AACnB,WAAKxD,OAAOmC,IAAI,oCAAA;IAClB;EACF;AACF;;;;;;;;;;;;;;;;;;AFxHO,IAAMsB,iBAAN,MAAMA,gBAAAA;SAAAA;;;;EAEX,OAAOC,UAA2CC,SAGhC;AAChB,UAAMC,gBAA0B;MAC9BC,SAASC;MACTC,YAAYJ,QAAQI;MACpBC,QAAQL,QAAQK,UAAU,CAAA;IAC5B;AAEA,WAAO;MACLC,QAAQR;MACRS,WAAW;QAAC;UAAEL,SAASM;UAAWC,UAAUD;QAAU;QAAGP;QAAeS;;MACxEC,SAAS;QAACD;QAAwBT;;IACpC;EACF;AACF;;;;;;;AI1BA,SAASW,mBAAmB;;;;;;;;;;;;AAGrB,IAAMC,oBAAN,MAAMA;SAAAA;;;EAEXC;EAGAC;EAGAC;AACF;;;IARiBC,SAAS;;;;;;IAGTA,SAAS;;;;;;;;;;ACP1B,SAASC,eAAAA,cAAaC,2BAA2B;;;;;;;;;;;;AAE1C,IAAMC,wBAAN,MAAMA;SAAAA;;;EAEXC;EAGAC;EAGAC;AACF;;;;;;;IALyBC,UAAU;;;;;;;;;;ACNnC,SAASC,eAAAA,cAAaC,uBAAAA,4BAA2B;;;;;;;;;;;;AAE1C,IAAMC,kBAAN,MAAMA;SAAAA;;;EAEXC;EAGAC;EAGAC;EAGAC;AACF;;;IAXiBC,SAAS;;;;;;IAGTA,SAAS;MAAEC,MAAM;MAAYC,MAAM;IAAW;;;;;;IAG9CF,SAAS;;;;;;IAGTA,SAAS;MAAC;;;;;AAIpB,IAAMG,mBAAN,MAAMA;SAAAA;;;EAEXC;EAGAN;EAGAO;AACF;;;IARiBL,SAAS;;;;;;IAGTA,SAAS;;;;;;IAGTA,SAAS;;;;AAInB,IAAMM,oBAAN,MAAMA;SAAAA;;;EAEXC;EAGAC;EAGAC;EAGAC;EAGAC;EAGAC;EAGAC;AACF;;;IApBiBb,SAAS;;;;;;IAGTA,SAAS;;;;;;IAGDA,SAAS;;;;;;IAGTA,SAAS;;;;;;IAGTA,SAAS;;;;;;IAGTc,MAAM;MAACnB;;;;;;;IAGPmB,MAAMX;;;;;;AC9C/B,SAASY,uBAAAA,4BAA2B;AACpC,SAASC,YAAY;AACrB,SAASC,MAAMC,OAAOC,YAAYC,UAAUC,WAAW;;;;;;;;;;;;AAGhD,IAAMC,wBAAN,MAAMA;SAAAA;;;EAIXC;EAOAC;EAOAC;EAKAC;EAQAC;EAKAC;EAKAC;EAKAC;EAQAC;EAKAC;EAKAC;EAWAC;AACF;;;IA3EyBC,aAAa;IAAkCC,SAAS;;;;;;;;IAKxDD,aAAa;IAA6BC,SAAS;IAAIC,SAAS;;;aAE3EC,MAAAA;;;;;;;IAKWH,aAAa;IAA6BC,SAAS;IAAGC,SAAS;;;aAE1EC,MAAAA;;;;;;;IAKWH,aAAa;IAAoDC,SAAS;;;;;;;;IAM/FD,aAAa;IACbC,SAAS;;;;;;;;IAMYD,aAAa;IAAgCC,SAAS;IAAMC,SAAS;;;;;;;;IAKrEF,aAAa;IAAgCC,SAAS;IAAQC,SAAS;;;;;;;;IAKvEF,aAAa;IAAsCC,SAAS;;;;;;;;IAMjFD,aAAa;IACbC,SAAS;;;;;;;;IAMYD,aAAa;IAA4BC,SAAS;;;;;;;;IAKlDD,aAAa;IAAkCC,SAAS;IAAQC,SAAS;;;;;;;;IAM9FF,aAAa;IACbC,SAAS;IACTC,SAAS;IACTE,MAAM;MAAC;MAAO;;;;;;IAIT;IAAO;;;;;;AC/EhB,SAASC,eAAAA,oBAAmB;AAC5B,SAASC,WAAWC,YAAYC,YAAAA,iBAAgB;;;;;;;;;;;;AAEzC,IAAMC,qBAAN,MAAMA;SAAAA;;;EAIXC;EAKAC;AACF;;;IATiBC,SAAS;;;;;;;;IAKTA,SAAS;;;;;;;;ACT1B,SAASC,eAAAA,cAAaC,uBAAAA,4BAA2B;;;;;;;;;;;;AAG1C,IAAMC,mBAAN,MAAMA;SAAAA;;;EAEXC;EAGAC;EAGAC;EAGAC;AACF;;;;;;;;;;;;;;;IAFyBC,UAAU;;;;;;ACbnC,SAASC,YAAYC,uBAAuB;;;ACA5C,SAASC,kBAAkB;;;ACA3B,SAASC,qBAAiC;AAanC,IAAeC,uBAAf,cAA4CC,cAAAA;EAbnD,OAamDA;;;EACjD,YAAYC,iBAA0CC,YAAwB;AAC5E,UAAMC,UAAU,OAAOF,oBAAoB,WAAW;MAAEG,QAAQH;IAAgB,IAAIA;AAEpF,UACE;MACEI,MAAMF,QAAQE,QAAQ;MACtBC,OAAOH,QAAQG;MACfF,QAAQD,QAAQC;MAChBG,QAAQJ,QAAQI,UAAU,CAAA;IAC5B,GACAL,UAAAA;EAEJ;AACF;;;AC3BA,SAASM,cAAAA,mBAAkB;AAGpB,IAAMC,sBAAN,cAAkCC,qBAAAA;EAHzC,OAGyCA;;;EACvC,YAAYC,iBAA2C;AACrD,UAAMA,mBAAmB,eAAeC,YAAWC,WAAW;EAChE;AACF;;;ACPA,SAASC,cAAAA,mBAAkB;;;ACA3B,SAASC,cAAAA,mBAAkB;;;ACA3B,SAASC,cAAAA,mBAAkB;;;ACA3B,SAASC,cAAAA,mBAAkB;;;ACGpB,IAAMC,yBAAN,cAAqCC,oBAAAA;EAF5C,OAE4CA;;;EAC1C,YAAYC,SAAS,qCAAqC;AACxD,UAAM;MAAEC,OAAO;MAAkBD;IAAO,CAAA;EAC1C;AACF;;;ACPA,SAASE,cAAAA,mBAAkB;;;ACA3B,SAASC,cAAAA,mBAAkB;;;ACA3B,SAASC,cAAAA,mBAAkB;;;ACA3B,SAASC,cAAAA,oBAAkB;;;ACA3B,SAASC,cAAAA,oBAAkB;;;ACA3B,SAASC,cAAAA,oBAAkB;;;ACA3B,SAASC,cAAAA,oBAAkB;;;ACA3B,SAASC,cAAAA,oBAAkB;;;ACA3B,SAASC,cAAAA,oBAAkB;;;ACA3B,SAASC,cAAAA,oBAAkB;;;ACA3B,SAASC,cAAAA,oBAAkB;;;ACA3B,SAASC,cAAAA,oBAAkB;;;ApBU3B,IAAMC,gBAAgBC,QAAQC,IAAIC,wBAAwB;AAE1D,SAASC,KAAKC,MAAY;AACxB,SAAOC,WAAW,UAAUN,aAAAA,EAAeO,OAAOF,IAAAA,EAAMG,OAAO,WAAA;AACjE;AAFSJ;AAIF,IAAMK,cAAN,MAAMA;EAhBb,OAgBaA;;;;EAEX,OAAOC,OAAOC,QAAmBC,YAAY,IAAY;AACvD,UAAMC,aAAaF,OAAOG,IAAqB,CAACC,MAAAA;AAC9C,UAAIA,aAAaC,KAAM,QAAO;QAAEC,KAAK;QAAQF,GAAGA,EAAEG,YAAW;MAAG;AAChE,UAAIH,MAAM,QAAQA,MAAMI,OAAW,QAAO;AAC1C,UAAI,OAAOJ,MAAM,YAAY,OAAOA,MAAM,YAAY,OAAOA,MAAM,UAAW,QAAOA;AACrF,aAAOK,OAAOL,CAAAA;IAChB,CAAA;AACA,UAAMM,WAA2B;MAAEC,GAAGV;MAAWG,GAAGF;IAAW;AAC/D,UAAMR,OAAOkB,OAAOC,KAAKC,KAAKC,UAAUL,QAAAA,GAAW,MAAA,EAAQM,SAAS,WAAA;AACpE,WAAO,GAAGtB,IAAAA,IAAQD,KAAKC,IAAAA,CAAAA;EACzB;;EAGA,OAAOuB,OAAOC,QAAgBC,oBAAoB,IAAe;AAC/D,UAAMC,MAAMF,OAAOG,YAAY,GAAA;AAC/B,QAAID,OAAO,EAAG,OAAM,IAAIE,uBAAuB,8BAAA;AAC/C,UAAM5B,OAAOwB,OAAOK,MAAM,GAAGH,GAAAA;AAC7B,UAAMI,MAAMN,OAAOK,MAAMH,MAAM,CAAA;AAG/B,UAAMK,SAASb,OAAOC,KAAKW,KAAK,WAAA;AAChC,UAAME,SAASd,OAAOC,KAAKpB,KAAKC,IAAAA,GAAO,WAAA;AACvC,QAAI+B,OAAOE,WAAWD,OAAOC,UAAU,CAACC,gBAAgBH,QAAQC,MAAAA,GAAS;AACvE,YAAM,IAAIJ,uBAAuB,+CAAA;IACnC;AAEA,QAAIZ;AACJ,QAAI;AACFA,iBAAWI,KAAKe,MAAMjB,OAAOC,KAAKnB,MAAM,WAAA,EAAasB,SAAS,MAAA,CAAA;IAChE,QAAQ;AACN,YAAM,IAAIM,uBAAuB,wCAAA;IACnC;AACA,QAAI,CAACZ,YAAY,OAAOA,SAASC,MAAM,YAAY,CAACmB,MAAMC,QAAQrB,SAASN,CAAC,GAAG;AAC7E,YAAM,IAAIkB,uBAAuB,4CAAA;IACnC;AACA,QAAIZ,SAASC,MAAMQ,mBAAmB;AACpC,YAAM,IAAIG,uBAAuB,0DAAA;IACnC;AACA,WAAOZ,SAASN,EAAED,IAAI,CAACC,MAAAA;AACrB,UAAIA,KAAK,OAAOA,MAAM,YAAY,SAASA,KAAKA,EAAEE,QAAQ,OAAQ,QAAO,IAAID,KAAKD,EAAEA,CAAC;AACrF,aAAOA;IACT,CAAA;EACF;AACF;;;AqB7DA,SACE4B,KACAC,KAEAC,MACAC,IACAC,IACAC,KACAC,OACAC,SACAC,IACAC,KACAC,IACAC,UACAC,YACAC,UAEK;AAQA,IAAMC,kBAAN,MAAMA;EAzBb,OAyBaA;;;;EAEX,OAAOC,WAAWC,UAA6B,CAAA,GAAIC,UAAqC;AACtF,UAAMC,aAAaF,QAAQG,QAAQ,CAACC,MAAAA;AAClC,YAAMC,MAAMJ,SAASG,EAAEE,KAAK;AAC5B,UAAI,CAACD,IAAK,QAAO,CAAA;AAEjB,UAAI,gBAAgBA,IAAK,QAAOE,MAAMC,QAAQJ,EAAEK,KAAK,IAAI,CAAA,IAAK;QAACJ,IAAIK,WAAWN,EAAEK,OAAOL,EAAEO,QAAQ;;AACjG,YAAM,EAAEC,QAAQC,IAAG,IAAKR;AACxB,YAAMS,MAAMV,EAAEK;AACd,cAAQL,EAAEO,UAAQ;QAChB,KAAK;AACH,cAAIN,IAAIU,SAAS,UAAW,QAAO;YAACC,GAAGH,KAAKC,QAAQ,UAAUA,QAAQ,CAAA;;AACtE,iBAAO;YAACE,GAAGH,KAAKC,GAAAA;;QAClB,KAAK;AACH,cAAIT,IAAIU,SAAS,UAAW,QAAO;YAACE,GAAGJ,KAAKC,QAAQ,UAAUA,QAAQ,CAAA;;AACtE,iBAAO;YAACG,GAAGJ,KAAKC,GAAAA;;QAClB,KAAK;AACH,iBAAO;YAACI,MAAML,KAAK,IAAIC,GAAAA,GAAM;;QAC/B,KAAK;AACH,iBAAO;YAACK,SAASN,KAAK,IAAIC,GAAAA,GAAM;;QAClC,KAAK;AACH,iBAAO;YAACM,GAAGP,KAAKC,GAAAA;;QAClB,KAAK;AACH,iBAAO;YAACO,IAAIR,KAAKC,GAAAA;;QACnB,KAAK;AACH,iBAAO;YAACQ,GAAGT,KAAKC,GAAAA;;QAClB,KAAK;AACH,iBAAO;YAACS,IAAIV,KAAKC,GAAAA;;QACnB,KAAK;AACH,iBAAO;YAACU,QAAQX,KAAKN,MAAMC,QAAQM,GAAAA,IAAOA,MAAM;cAACW,OAAOX,GAAAA;aAAK;;QAC/D,KAAK;AACH,iBAAO;YAACY,WAAWb,KAAKN,MAAMC,QAAQM,GAAAA,IAAOA,MAAM;cAACW,OAAOX,GAAAA;aAAK;;QAClE;AACE,iBAAO,CAAA;MACX;IACF,CAAA;AACA,WAAOZ,WAAWyB,SAASC,IAAAA,GAAO1B,UAAAA,IAAc2B;EAClD;;EAGA,OAAOC,YAAYC,QAAwC9B,UAAqC;AAC9F,QAAI,CAAC8B,QAAQtB,MAAO,QAAOoB;AAE3B,QAAIE,OAAOC,aAAa,OAAO;AAC7B,YAAM9B,aAAa+B,OAAOC,OAAOjC,QAAAA,EAC9BkC,OACC,CAAC9B,SACC,YAAYA,QAAOA,KAAIU,SAAS,QAAA,EAEnCqB,IAAI,CAAC/B,SAAQa,MAAMb,KAAIO,QAAQ,IAAImB,OAAOtB,KAAK,GAAG,CAAA;AACrD,aAAOP,WAAWyB,SAASU,GAAAA,GAAMnC,UAAAA,IAAc2B;IACjD;AAEA,UAAMxB,MAAMJ,SAAS8B,OAAOC,QAAQ;AACpC,QAAI,CAAC3B,OAAO,EAAE,YAAYA,KAAM,QAAOwB;AACvC,WAAOX,MAAMb,IAAIO,QAAQ,IAAImB,OAAOtB,KAAK,GAAG;EAC9C;;EAGA,OAAO6B,aAAaC,OAAwB,CAAA,GAAItC,UAA2B;AACzE,WAAOsC,KAAKpC,QAAQ,CAACqC,MAAAA;AACnB,YAAMnC,MAAMJ,SAASuC,EAAElC,KAAK;AAC5B,UAAI,CAACD,OAAO,EAAE,YAAYA,KAAM,QAAO,CAAA;AACvC,aAAO;QAACmC,EAAEC,cAAc,QAAQC,IAAIrC,IAAIO,MAAM,IAAI+B,KAAKtC,IAAIO,MAAM;;IACnE,CAAA;EACF;AACF;;;AChFO,IAAMgC,kBAAkB;EAC7BC,QAAQ;EACRC,YAAY;EACZC,UAAU;EACVC,cAAc;EACdC,IAAI;EACJC,KAAK;EACLC,IAAI;EACJC,KAAK;EACLC,WAAW;EACXC,eAAe;AACjB;;;ACvBA,SAASC,OAAAA,MAAkBC,MAAAA,KAAIC,MAAAA,KAAIC,WAAWC,QAAQC,MAAAA,KAAIC,MAAAA,KAAcC,WAAW;AAE5E,IAAMC,gBAAgB;AAStB,SAASC,gBAAgBC,SAAqD;AACnF,SAAOA,QAAQC,IAAI,CAACC,MAAM,GAAGA,EAAEC,GAAG,IAAID,EAAEE,SAAS,EAAE,EAAEC,KAAK,GAAA;AAC5D;AAFgBN;AAIT,IAAMO,kBAAN,MAAMA,iBAAAA;EAfb,OAeaA;;;;EAEX,OAAOC,WAAWC,SAA0BC,QAAwB;AAClE,UAAMC,QAAQF,QAAQ,CAAA;AACtB,QAAI,CAACE,MAAO,QAAOC;AAEnB,UAAMC,UAAUJ,QAAQK,MAAM,CAACC,MAAMA,EAAEV,cAAcM,MAAMN,SAAS;AACpE,UAAMW,cAAcP,QAAQQ,KAAK,CAACF,MAAMA,EAAEG,UAAUC,MAAAA;AACpD,QAAIN,WAAW,CAACG,eAAeP,QAAQW,UAAU,GAAG;AAClD,aAAOb,iBAAgBc,cAAcZ,SAASC,QAAQC,MAAMN,SAAS;IACvE;AACA,WAAOE,iBAAgBe,iBAAiBb,SAASC,MAAAA;EACnD;;EAGA,OAAeW,cAAcZ,SAA0BC,QAAmBL,WAAgC;AACxG,UAAMkB,OAAOX,IAAIN,KACfG,QAAQP,IAAI,CAACa,MAAMH,MAAMG,EAAES,MAAM,EAAE,GACnCZ,OAAO;AAET,UAAMa,OAAOb,IAAIN,KACfI,OAAOR,IAAI,CAACwB,MAAMd,MAAMc,CAAAA,EAAG,GAC3Bd,OAAO;AAET,UAAMe,KAAKtB,cAAc,QAAQO,SAASA;AAC1C,WAAOA,OAAOW,IAAAA,KAASI,EAAAA,KAAOF,IAAAA;EAChC;;EAGA,OAAeH,iBAAiBb,SAA0BC,QAAwB;AAChF,UAAMkB,SAAgB,CAAA;AACtB,aAASC,IAAI,GAAGA,IAAIpB,QAAQW,QAAQS,KAAK;AACvC,YAAMC,UAAUrB,QAAQoB,CAAAA;AACxB,UAAI,CAACC,QAAS;AACd,YAAMC,aAAoB,CAAA;AAC1B,eAASC,IAAI,GAAGA,IAAIH,GAAGG,KAAK;AAC1B,cAAMC,QAAQxB,QAAQuB,CAAAA;AACtB,YAAIC,MAAOF,YAAWG,KAAK3B,iBAAgB4B,IAAIF,MAAMT,QAAQd,OAAOsB,CAAAA,CAAE,CAAA;MACxE;AACAD,iBAAWG,KAAK3B,iBAAgB6B,cAAcN,SAASpB,OAAOmB,CAAAA,CAAE,CAAA;AAChE,YAAMQ,QAAQN,WAAWX,WAAW,IAAIW,WAAW,CAAA,IAAKO,KAAAA,GAAOP,UAAAA;AAC/D,UAAIM,MAAOT,QAAOM,KAAKG,KAAAA;IACzB;AACA,UAAME,aAAaX,OAAO,CAAA;AAC1B,QAAIA,OAAOR,WAAW,KAAKmB,WAAY,QAAOA;AAC9C,WAAOC,IAAAA,GAAMZ,MAAAA;EACf;;EAGA,OAAeO,IAAIX,QAAgBiB,OAAqB;AACtD,WAAOA,UAAU,QAAQA,UAAUtB,SAAYuB,OAAOlB,MAAAA,IAAUmB,IAAGnB,QAAQiB,KAAAA;EAC7E;;EAGA,OAAeL,cAAcrB,GAAkB0B,OAAqB;AAElE,QAAI1B,EAAEG,UAAUC,QAAW;AACzB,aAAQJ,EAAEV,cAAc,QAAQuC,IAAG7B,EAAES,QAAQiB,KAAAA,IAASI,IAAG9B,EAAES,QAAQiB,KAAAA;IACrE;AACA,UAAMK,YAAY/B,EAAEG,UAAU;AAE9B,QAAIuB,UAAU,QAAQA,UAAUtB,QAAW;AACzC,aAAQ2B,YAAYlC,aAAamC,UAAUhC,EAAES,MAAM;IACrD;AACA,UAAMwB,MAAMjC,EAAEV,cAAc,QAAQuC,IAAG7B,EAAES,QAAQiB,KAAAA,IAASI,IAAG9B,EAAES,QAAQiB,KAAAA;AAEvE,WAAQK,YAAYN,IAAGQ,KAAKN,OAAO3B,EAAES,MAAM,CAAA,IAAKwB;EAClD;AACF;;;ACnFA,SAASC,UAAAA,eAAc;AACvB,SACEC,OAAAA,MACAC,OAAAA,MACAC,QAAAA,OACAC,MAAAA,KACAC,cACAC,aAIAC,SAAAA,QACAC,WAAAA,UACAC,IACAC,cAAAA,aAEAC,OAAAA,YACK;AAGP,SAASC,kBAAkB;AAO3B,SAASC,aAAaC,KAAW;AAC/B,SAAOA,IAAIC,QAAQ,aAAa,CAACC,GAAGC,WAAWA,OAAOC,YAAW,CAAA;AACnE;AAFSL;AAuBF,IAAeM,wBAAf,MAAeA;EAlDtB,OAkDsBA;;;;;EASDC;EACAC;EAEFC;EACAC;EAEjB,IAAcC,KAAyB;AACrC,WAAO,KAAKC,SAASC;EACvB;EAEA,IAAcC,QAA8C;AAC1D,QAAI,KAAKJ,QAAQ;AACf,YAAM,IAAIK,MACR,GAAG,KAAK,YAAYC,IAAI,gEAAgE,KAAKP,SAAS,iDAAiD;IAE3J;AAEA,UAAMQ,QAAQ,KAAKL,SAASC,cAAcI;AAC1C,UAAMC,YAAYC,OAAOC,KAAKH,SAAS,CAAC,CAAA;AACxC,SAAKV,OAAOc,MAAM,gBAAgB,KAAKZ,SAAS,qBAAqBS,UAAUI,KAAK,IAAA,CAAA,GAAQ;AAE5F,UAAMR,QAAQG,MAAM,KAAKR,SAAS;AAClC,QAAI,CAACK,OAAO;AACV,WAAKP,OAAOgB,MAAM,UAAU,KAAKd,SAAS,4CAA4CS,UAAUI,KAAK,IAAA,CAAA,GAAQ;IAC/G;AAEA,WAAOR;EACT;EAEA,YACqBF,UACAY,OACnBC,SAGA;SALmBb,WAAAA;SACAY,QAAAA;AAMnB,SAAKd,SAASgB,GAAGF,OAAOG,UAAAA;AACxB,UAAMC,cAAc,KAAKlB,SAASmB,YAAYL,KAAAA,IAAuBM,aAAaN,KAAAA;AAClF,SAAKf,YAAYT,aAAa4B,WAAAA;AAC9B,SAAKpB,WAAWiB,SAASjB;AACzB,SAAKD,SAAS,IAAIwB,QAAO,KAAK,YAAYf,IAAI;AAC9C,SAAKT,OAAOc,MAAM,eAAe,KAAK,YAAYL,IAAI,EAAE;AACxD,SAAKT,OAAOc,MAAM,gBAAgBO,WAAAA,oBAA+B,KAAKnB,SAAS,GAAG;EACpF;;EAGA,MAAgBuB,kBAAkBxB,UAAwC;AACxE,UAAMyB,mBAAmBzB,YAAY,KAAKA;AAC1C,QAAI,CAACyB,kBAAkB;AACrB,YAAM,IAAIlB,MAAM,GAAG,KAAK,YAAYC,IAAI,8CAA8C;IACxF;AAEA,UAAMkB,eAAeD,iBAAiBE,SAClC,GAAGF,iBAAiBE,MAAM,IAAIF,iBAAiBG,OAAO,KACtDH,iBAAiBG;AAErB,UAAMC,SAAS,MAAM,KAAK1B,GAAG2B,QAC3BC,sBAAqBL,YAAAA,+BAA2C;AAElE,UAAMM,OAAQH,OAAiEG,QAAQ,CAAA;AACvF,WAAOC,OAAOD,KAAK,CAAA,GAAIE,kBAAkB,CAAA;EAC3C;;EAGA,MAAMC,OAAOC,MAAeC,IAA2C;AACrE,SAAKtC,OAAOuC,IAAI,iBAAA;AAChB,UAAMnC,KAAKkC,MAAM,KAAKlC;AACtB,UAAMoC,UAAW,MAAMpC,GACpBqC,OAAO,KAAKxB,KAAK,EACjByB,OAAOL,IAAAA,EACPM,UAAS;AACZ,UAAMC,SAASJ,QAAQ,CAAA;AACvB,QAAI,CAACI,OAAQ,OAAM,IAAIpC,MAAM,GAAG,KAAKN,SAAS,yCAAyC;AACvF,WAAO0C;EACT;;EAGA,MAAMC,SAASC,IAA0C;AACvD,SAAK9C,OAAOc,MAAM,yBAAyBgC,EAAAA,EAAI;AAC/C,WAAO,KAAKvC,MAAMwC,UAAU;MAC1BC,OAAO;QAAEF;MAAG;IACd,CAAA;EACF;;EAGA,MAAMG,QAAQD,OAA2D;AACvE,SAAKhD,OAAOc,MAAM,kCAAA;AAClB,WAAO,KAAKP,MAAMwC,UAAU;MAAEC;IAAM,CAAA;EACtC;;EAGA,MAAME,SAAShC,SAKQ;AACrB,SAAKlB,OAAOc,MAAM,0BAAA;AAClB,WAAO,KAAKP,MAAM2C,SAAShC,OAAAA;EAC7B;;EAGQiC,iBAAiBjC,SAStB;AAED,QAAIR,SACFQ,SAASkC,SACL,KAAKhD,GAAGgD,OAAOlC,QAAQkC,MAAM,EAAoBC,KAAK,KAAKpC,KAAK,IAChE,KAAKb,GAAGgD,OAAM,EAAGC,KAAK,KAAKpC,KAAK,GACpCqC,SAAQ;AAEV,QAAIpC,SAASqC,UAAU;AACrB7C,cAAQA,MAAM6C,SAASrC,QAAQqC,SAAStC,OAAOC,QAAQqC,SAASC,EAAE;IACpE;AACA,QAAItC,SAASuC,WAAW;AACtB,iBAAW1C,QAAQG,QAAQuC,WAAW;AACpC/C,gBAAQA,MAAM6C,SAASxC,KAAKE,OAAOF,KAAKyC,EAAE;MAC5C;IACF;AACA,QAAItC,SAAS8B,OAAO;AAClBtC,cAAQA,MAAMsC,MAAM9B,QAAQ8B,KAAK;IACnC;AACA,QAAI9B,SAASwC,SAASC,QAAQ;AAC5BjD,cAAQA,MAAMgD,QAAO,GAAIxC,QAAQwC,OAAO;IAC1C;AACA,QAAIxC,SAAS0C,SAASD,QAAQ;AAC5BjD,cAAQA,MAAMkD,QAAO,GAAI1C,QAAQ0C,OAAO;IAC1C;AACA,QAAI1C,SAAS2C,OAAO;AAClBnD,cAAQA,MAAMmD,MAAM3C,QAAQ2C,KAAK;IACnC;AACA,QAAI3C,SAAS4C,QAAQ;AACnBpD,cAAQA,MAAMoD,OAAO5C,QAAQ4C,MAAM;IACrC;AACA,WAAOpD;EACT;;EAGA,MAAMqD,gBAAmC7C,SASS;AAChD,QAAI8C;AAEJ,QAAI9C,SAASwC,SAASC,QAAQ;AAE5B,UAAIM,OAAO,KAAK7D,GACbgD,OAAO;QAAExD,GAAGoC;MAAO,CAAA,EACnBqB,KAAK,KAAKpC,KAAK,EACfqC,SAAQ;AACX,UAAIpC,QAAQqC,UAAU;AACpBU,eAAOA,KAAKV,SAASrC,QAAQqC,SAAStC,OAAOC,QAAQqC,SAASC,EAAE;MAClE;AACA,UAAItC,QAAQuC,WAAW;AACrB,mBAAW1C,QAAQG,QAAQuC,WAAW;AACpCQ,iBAAOA,KAAKV,SAASxC,KAAKE,OAAOF,KAAKyC,EAAE;QAC1C;MACF;AACA,UAAItC,QAAQ8B,OAAO;AACjBiB,eAAOA,KAAKjB,MAAM9B,QAAQ8B,KAAK;MACjC;AACAiB,aAAOA,KAAKP,QAAO,GAAIxC,QAAQwC,OAAO;AAEtC,YAAMQ,QAAQD,KAAKE,GAAG,aAAA;AACtBH,2BAAqB,KAAK5D,GAAGgD,OAAO;QAAEgB,OAAOpC;MAA2B,CAAA,EAAGqB,KAAKa,KAAAA;IAGlF,OAAO;AAEL,UAAIG,aAAa,KAAKjE,GACnBgD,OAAO;QAAEgB,OAAOpC;MAA2B,CAAA,EAC3CqB,KAAK,KAAKpC,KAAK,EACfqC,SAAQ;AACX,UAAIpC,SAASqC,UAAU;AACrBc,qBAAaA,WAAWd,SAASrC,QAAQqC,SAAStC,OAAOC,QAAQqC,SAASC,EAAE;MAC9E;AACA,UAAItC,SAASuC,WAAW;AACtB,mBAAW1C,QAAQG,QAAQuC,WAAW;AACpCY,uBAAaA,WAAWd,SAASxC,KAAKE,OAAOF,KAAKyC,EAAE;QACtD;MACF;AACA,UAAItC,SAAS8B,OAAO;AAClBqB,qBAAaA,WAAWrB,MAAM9B,QAAQ8B,KAAK;MAC7C;AACAgB,2BAAqBK;IACvB;AAEA,UAAM,CAACC,aAAaxC,MAAAA,IAAU,MAAMyC,QAAQC,IAAI;MAC9CR;MACA,KAAKb,iBAAiBjC,OAAAA;KACvB;AACD,WAAO;MAAEY;MAAQsC,OAAQE,YAAY,CAAA,EAAyBF;IAAM;EACtE;;EAGA,MAAMK,WAA8BvD,SAQe;AAEjD,UAAM2C,QAAQa,KAAKC,IAAID,KAAKE,IAAI,GAAGF,KAAKG,MAAM3D,QAAQ2C,KAAK,KAAK,CAAA,GAAIiB,aAAAA;AACpE,UAAM7C,OAAQ,MAAM,KAAKkB,iBAAiB;MACxC,GAAGjC;MACH2C,OAAOA,QAAQ;IACjB,CAAA;AACA,UAAMkB,UAAU9C,KAAK0B,SAASE;AAC9B,WAAO;MAAE5B,MAAM8C,UAAU9C,KAAK+C,MAAM,GAAGnB,KAAAA,IAAS5B;MAAM8C;IAAQ;EAChE;;EAGA,MAAME,OAAOnC,IAAYT,MAAwBC,IAA2C;AAC1F,SAAKtC,OAAOuC,IAAI,4BAA4BO,EAAAA,EAAI;AAChD,UAAM1C,KAAKkC,MAAM,KAAKlC;AACtB,UAAM8E,WAAY,KAAKjE,MAA8C6B;AACrE,QAAI,CAACoC,SAAU,OAAM,IAAI1E,MAAM,UAAU,KAAKN,SAAS,sBAAsB;AAC7E,UAAMsC,UAAW,MAAMpC,GACpB6E,OAAO,KAAKhE,KAAK,EACjBkE,IAAI9C,IAAAA,EACJW,MAAMoC,IAAGF,UAAUpC,EAAAA,CAAAA,EACnBH,UAAS;AACZ,UAAMC,SAASJ,QAAQ,CAAA;AACvB,QAAI,CAACI,OAAQ,OAAM,IAAIpC,MAAM,GAAG,KAAKN,SAAS,yCAAyC;AACvF,WAAO0C;EACT;;EAGA,MAAMyC,WAAWrC,OAAYX,MAAwBC,IAAqD;AACxG,SAAKtC,OAAOuC,IAAI,2BAAA;AAChB,UAAMnC,KAAKkC,MAAM,KAAKlC;AACtB,UAAM0B,SAAS,MAAM1B,GAClB6E,OAAO,KAAKhE,KAAK,EACjBkE,IAAI9C,IAAAA,EACJW,MAAMA,KAAAA;AACT,WAAO;MAAEoB,OAAOtC,OAAOwD,YAAY;IAAE;EACvC;;EAGA,MAAMC,OAAOzC,IAAYR,IAA2C;AAClE,SAAKtC,OAAOuC,IAAI,4BAA4BO,EAAAA,EAAI;AAChD,UAAM1C,KAAKkC,MAAM,KAAKlC;AACtB,UAAM8E,WAAY,KAAKjE,MAA8C6B;AACrE,QAAI,CAACoC,SAAU,OAAM,IAAI1E,MAAM,UAAU,KAAKN,SAAS,sBAAsB;AAC7E,UAAMsC,UAAW,MAAMpC,GACpBmF,OAAO,KAAKtE,KAAK,EACjB+B,MAAMoC,IAAGF,UAAUpC,EAAAA,CAAAA,EACnBH,UAAS;AACZ,UAAMC,SAASJ,QAAQ,CAAA;AACvB,QAAI,CAACI,OAAQ,OAAM,IAAIpC,MAAM,GAAG,KAAKN,SAAS,yCAAyC;AACvF,WAAO0C;EACT;;EAGA,MAAM4C,WAAWxC,OAAYV,IAAqD;AAChF,SAAKtC,OAAOuC,IAAI,2BAAA;AAChB,UAAMnC,KAAKkC,MAAM,KAAKlC;AACtB,UAAM0B,SAAS,MAAM1B,GAAGmF,OAAO,KAAKtE,KAAK,EAAa+B,MAAMA,KAAAA;AAC5D,WAAO;MAAEoB,OAAOtC,OAAOwD,YAAY;IAAE;EACvC;;EAGA,MAAMlB,MAAMpB,OAA8B;AACxC,SAAKhD,OAAOc,MAAM,kBAAA;AAElB,QAAIJ,QAAQ,KAAKN,GACdgD,OAAO;MAAEgB,OAAOpC;IAA2B,CAAA,EAC3CqB,KAAK,KAAKpC,KAAK,EACfqC,SAAQ;AAEX,QAAIN,OAAO;AACTtC,cAAQA,MAAMsC,MAAMA,KAAAA;IACtB;AAEA,UAAMR,UAAU,MAAM9B;AACtB,WAAQ8B,QAAQ,CAAA,EAAyB4B;EAC3C;;EAGA,MAAMqB,OAAOzC,OAA8B;AACzC,UAAMoB,QAAQ,MAAM,KAAKA,MAAMpB,KAAAA;AAC/B,WAAOoB,QAAQ;EACjB;;EAGA,MAAMsB,YAAeC,UAA8D;AACjF,WAAO,KAAKtF,SAASuF,iBAAiB,YAAYD,SAAS,KAAKtF,SAASC,aAAa,CAAA;EACxF;;EAGA,MAAMuF,cAAcC,QAAyD;AAC3E,SAAK9F,OAAOc,MAAM,qCAAA;AAGlB,UAAMiF,WAAWD,OAAOE,WAAW,KAAK5F,GAAG6F,eAAeC,KAAK,KAAK9F,EAAE,IAAI,KAAKA,GAAGgD,OAAO8C,KAAK,KAAK9F,EAAE;AAarG,UAAM+F,eACJ,OAAOL,OAAOpD,WAAW,WACrBoD,OAAOpD,OACJ0D,MAAM,GAAA,EACNC,IAAI,CAACC,MAAMA,EAAEC,KAAI,CAAA,EACjBC,OAAOC,OAAAA,IACVX,OAAOpD;AAGb,UAAMgE,mBACJ,OAAOZ,OAAOa,eAAe,WACzBb,OAAOa,WACJP,MAAM,GAAA,EACNC,IAAI,CAACC,MAAMA,EAAEC,KAAI,CAAA,EACjBC,OAAOC,OAAAA,IACTX,OAAOa,cAAc,CAAA;AAE5B,UAAMC,eAAe,KAAK3F;AAE1B,UAAM4F,aAAaf,OAAOgB,OAAOT,IAAI,CAACtF,SAASA,KAAKE,KAAK,KAA4C,CAAA;AACrG,UAAM8F,gBAAgB,wBAACC,QAAAA;AACrB,UAAIJ,aAAaI,GAAAA,EAAM,QAAOJ,aAAaI,GAAAA;AAC3C,iBAAWC,eAAeJ,YAAY;AACpC,YAAII,YAAYD,GAAAA,EAAM,QAAOC,YAAYD,GAAAA;MAC3C;AACA,aAAOE;IACT,GANsB;AAQtB,UAAMC,WAAWJ,cAAcjB,OAAOsB,KAAK;AAC3C,QAAI,CAACD,SAAU,OAAM,IAAI3G,MAAM,WAAWsF,OAAOsB,KAAK,yBAAyB,KAAKlH,SAAS,gBAAgB;AAE7G,UAAMmH,WAAWN,cAAcjB,OAAOwB,KAAK;AAC3C,QAAI,CAACD,SAAU,OAAM,IAAI7G,MAAM,WAAWsF,OAAOwB,KAAK,yBAAyB,KAAKpH,SAAS,gBAAgB;AAE7G,UAAMqH,iBAAiBzB,OAAO0B,cAAcT,cAAcjB,OAAO0B,WAAW,IAAIN;AAEhF,UAAMO,YAAY,wBAACC,UAAAA;AACjB,UAAI,CAACA,MAAO,QAAO,CAAA;AACnB,YAAMhF,SAASiF,MAAMC,QAAQF,KAAAA,IAASA,QAAQA,MAAMtB,MAAM,GAAA;AAC1D,aAAO1D,OAAO2D,IAAI,CAACC,MAAMA,EAAEC,KAAI,CAAA,EAAIC,OAAOC,OAAAA;IAC5C,GAJkB;AAKlB,UAAMoB,iBAAiBJ,UAAU3B,OAAO+B,cAAc;AACtD,UAAMC,oBAA6D;SAC9DD,eACAxB,IAAI,CAACW,SAAS;QAAEA;QAAKe,MAAMhB,cAAcC,GAAAA;MAA6B,EAAA,EACtER,OAAO,CAACwB,MAA4CvB,QAAQuB,EAAED,IAAI,CAAA;SAClEnH,OAAOqH,QAAQnC,OAAOoC,yBAAyB,CAAC,CAAA,EAAG7B,IAAI,CAAC,CAACW,KAAKe,IAAAA,OAAW;QAAEf;QAAKe;MAAK,EAAA;;AAE1F,UAAMI,kBAAkB,wBAACnB,QAAgB,gBAAgBA,GAAAA,IAAjC;AAGxB,QAAIb,gBAAgBA,aAAaxC,SAAS,GAAG;AAC3C,YAAMyE,aAA6C;QAAEhB,OAAOD;QAAUG,OAAOD;MAAS;AACtF,UAAIE,eAAgBa,YAAWZ,cAAcD;AAC7C,UAAIzB,OAAOuC,YAAY;AACrB,cAAMC,aAAavB,cAAcjB,OAAOuC,UAAU;AAClD,YAAIC,WAAYF,YAAWG,UAAUD;MACvC;AACA,iBAAWE,SAASV,mBAAmB;AACrCM,mBAAWD,gBAAgBK,MAAMxB,GAAG,CAAA,IAAKwB,MAAMT;MACjD;AAEA,UAAIU,cAAc1C,SAASqC,UAAAA,EACxB/E,KAAK,KAAKpC,KAAK,EACfqC,SAAQ;AAEX,UAAIwC,OAAOgB,OAAO;AAChB,mBAAW/F,QAAQ+E,OAAOgB,OAAO;AAC/B,cAAI/F,KAAK2H,SAAS,SAAS;AACzBD,0BAAcA,YAAYE,UAAU5H,KAAKE,OAAOF,KAAKyC,EAAE;UACzD,OAAO;AACLiF,0BAAcA,YAAYlF,SAASxC,KAAKE,OAAOF,KAAKyC,EAAE;UACxD;QACF;MACF;AAEA,YAAMvB,QAAO,MAAMwG,YAAYzF,MAAM4F,SAAQzB,UAAUhB,YAAAA,CAAAA;AAEvD,aAAO;QACLjF,SAAUe,MAAgCoE,IAAI,CAACwC,SAAS;UACtDzB,OAAOyB,IAAIzB;UACXE,OAAOwB,OAAOD,IAAIvB,KAAK;UACvB,GAAIC,kBAAkBsB,IAAIrB,eAAe,OAAO;YAAEA,aAAasB,OAAOD,IAAIrB,WAAW;UAAE,IAAI,CAAC;UAC5F,GAAI1B,OAAOuC,cAAcQ,IAAIN,WAAW,OAAO;YAAEA,SAASM,IAAIN;UAAQ,IAAI,CAAC;UAC3E,GAAIT,kBAAkBnE,SAAS,IAC3B;YACEoF,aAAajB,kBAAkBkB,OAC7B,CAACC,KAAKT,UAAAA;AACJ,oBAAMpB,QAASyB,IAA2CV,gBAAgBK,MAAMxB,GAAG,CAAA;AACnF,kBAAII,UAAUF,QAAW;AACvB,oBACE,OAAOE,UAAU,YACjB,OAAOA,UAAU,YACjB,OAAOA,UAAU,aACjBA,UAAU,MACV;AACA6B,sBAAIT,MAAMxB,GAAG,IAAII;gBACnB,OAAO;AACL6B,sBAAIT,MAAMxB,GAAG,IAAI8B,OAAO1B,KAAAA;gBAC1B;cACF;AACA,qBAAO6B;YACT,GACA,CAAC,CAAA;UAEL,IACA,CAAC;QACP,EAAA;QACAlE,SAAS;QACT,GAAIe,OAAOoD,SAAS;UAAEA,QAAQpD,OAAOoD;QAAO,IAAI,CAAC;MACnD;IACF;AAGA,UAAMC,eAA+C;MACnD/B,OAAOD;MACPG,OAAOD;MACP+B,YAAYpH,sBAA6BqH,QAAQnH,MAAAA;IACnD;AACA,QAAIqF,eAAgB4B,cAAa3B,cAAcD;AAC/C,QAAIzB,OAAOuC,YAAY;AACrB,YAAMC,aAAavB,cAAcjB,OAAOuC,UAAU;AAClD,UAAIC,WAAYa,cAAaZ,UAAUD;IACzC;AACA,eAAWE,SAASV,mBAAmB;AACrCqB,mBAAahB,gBAAgBK,MAAMxB,GAAG,CAAA,IAAKwB,MAAMT;IACnD;AAEA,UAAMuB,aAAoB,CAAA;AAC1B,QAAIxD,OAAOyD,QAAQ;AACjBD,iBAAWE,KAAKC,OAAMpC,UAAU,IAAIvB,OAAOyD,MAAM,GAAG,CAAA;IACtD;AACA,QAAI7C,iBAAiB/C,SAAS,GAAG;AAC/B2F,iBAAWE,KAAKE,YAAWvC,UAAUT,gBAAAA,CAAAA;IACvC;AACA,QAAIZ,OAAO9C,OAAO;AAChB,iBAAW,CAAC2G,OAAOC,GAAAA,KAAQhJ,OAAOqH,QAAQnC,OAAO9C,KAAK,GAAG;AACvD,cAAM6G,SAASjD,aAAa+C,KAAAA;AAC5B,YAAIE,QAAQ;AACVP,qBAAWE,KAAKpE,IAAGyE,QAAQD,GAAAA,CAAAA;QAC7B;MACF;IACF;AAEA,QAAI9D,OAAOwD,YAAY;AACrBA,iBAAWE,KAAI,GAAI1D,OAAOwD,UAAU;IACtC;AAEA,UAAMQ,aAAahE,OAAOgE,eAAehE,OAAOlC,UAAUhD,OAAOC,KAAKiF,OAAOlC,OAAO,EAAE,CAAA,IAAKsD;AAC3F,UAAM6C,iBAAiBjE,OAAOiE,mBAAmBjE,OAAOlC,UAAUhD,OAAO8B,OAAOoD,OAAOlC,OAAO,EAAE,CAAA,IAAKsD;AACrG,UAAM8C,aAAaF,aAAclD,aAAakD,UAAAA,KAAezC,WAAYA;AACzE,UAAMxD,QAAQ3B,OAAO4D,OAAOjC,KAAK,KAAK;AACtC,UAAMC,SAAS5B,OAAO4D,OAAOhC,MAAM,KAAK;AAExC,QAAIpD,QAAQqF,SAASoD,YAAAA,EAClB9F,KAAK,KAAKpC,KAAK,EACfqC,SAAQ;AAGX,QAAIwC,OAAOgB,OAAO;AAChB,iBAAW/F,QAAQ+E,OAAOgB,OAAO;AAC/B,YAAI/F,KAAK2H,SAAS,SAAS;AACzBhI,kBAAQA,MAAMiI,UAAU5H,KAAKE,OAAOF,KAAKyC,EAAE;QAC7C,OAAO;AACL9C,kBAAQA,MAAM6C,SAASxC,KAAKE,OAAOF,KAAKyC,EAAE;QAC5C;MACF;IACF;AAEA,QAAI8F,WAAW3F,SAAS,GAAG;AACzBjD,cAAQA,MAAMsC,MAAMsG,WAAW3F,WAAW,IAAI2F,WAAW,CAAA,IAAMW,KAAAA,GAAOX,UAAAA,CAAAA;IACxE;AAEA,UAAMY,eAAsB,CAAA;AAC5B,QAAIpE,OAAOuC,YAAY;AACrB,YAAMC,aAAavB,cAAcjB,OAAOuC,UAAU;AAClD,UAAIC,WAAY4B,cAAaV,KAAKW,KAAI7B,UAAAA,CAAAA;IACxC;AACA4B,iBAAaV,KAAKO,mBAAmB,SAASK,MAAKJ,UAAAA,IAAcG,KAAIH,UAAAA,CAAAA;AAErEtJ,YAAQA,MACLkD,QAAO,GAAIsG,YAAAA,EACXrG,MAAMA,KAAAA,EACNC,OAAOA,MAAAA;AAEV,UAAM7B,OAAO,MAAMvB;AAEnB,UAAM0I,aAAanH,KAAK0B,SAAS,IAAK1B,KAAK,CAAA,EAAqCmH,aAAa;AAE7F,UAAMlI,UAAWe,KAAgCoE,IAAI,CAACwC,SAAS;MAC7DzB,OAAOyB,IAAIzB;MACXE,OAAOwB,OAAOD,IAAIvB,KAAK;MACvB,GAAIC,kBAAkBsB,IAAIrB,eAAe,OAAO;QAAEA,aAAasB,OAAOD,IAAIrB,WAAW;MAAE,IAAI,CAAC;MAC5F,GAAI1B,OAAOuC,cAAcQ,IAAIN,WAAW,OAAO;QAAEA,SAASM,IAAIN;MAAQ,IAAI,CAAC;MAC3E,GAAIT,kBAAkBnE,SAAS,IAC3B;QACEoF,aAAajB,kBAAkBkB,OAAyD,CAACC,KAAKT,UAAAA;AAC5F,gBAAMpB,QAASyB,IAA2CV,gBAAgBK,MAAMxB,GAAG,CAAA;AACnF,cAAII,UAAUF,QAAW;AACvB,gBACE,OAAOE,UAAU,YACjB,OAAOA,UAAU,YACjB,OAAOA,UAAU,aACjBA,UAAU,MACV;AACA6B,kBAAIT,MAAMxB,GAAG,IAAII;YACnB,OAAO;AACL6B,kBAAIT,MAAMxB,GAAG,IAAI8B,OAAO1B,KAAAA;YAC1B;UACF;AACA,iBAAO6B;QACT,GAAG,CAAC,CAAA;MACN,IACA,CAAC;IACP,EAAA;AAGA,QAAIoB,iBAAiBvE,OAAOoD;AAE5B,QAAIpD,OAAOwE,cAAcxE,OAAOuC,YAAY;AAC1C,YAAMkC,oBAAoBzE,OAAOwE;AACjC,YAAMjC,aAAavC,OAAO0E,mBAAmB;AAC7C,YAAMC,eAAe3E,OAAO4E,iBAAiB;AAC7C,YAAMpC,aAAaiC,kBAAkBlC,UAAAA;AACrC,UAAI,CAACC,WAAY,OAAM,IAAI9H,MAAM,WAAW6H,UAAAA,4BAAsC;AAClF,YAAMsC,eAAeJ,kBAAkBE,YAAAA;AACvC,UAAI,CAACE,aAAc,OAAM,IAAInK,MAAM,WAAWiK,YAAAA,4BAAwC;AAEtF,YAAMG,YAAY,MAAM,KAAKxK,GAC1BgD,OAAO;QAAEN,IAAIwF;QAAY7H,MAAMkK;MAAa,CAAA,EAC5CtH,KAAKyC,OAAOwE,UAAU,EACtB1G,QAAQuG,KAAIQ,YAAAA,CAAAA;AAEfN,uBAAkBO,UAAsEvE,IAAI,CAACwE,OAAO;QAClG/H,IAAI+H,EAAE/H;QACNrC,MAAMqI,OAAO+B,EAAEpK,IAAI;MACrB,EAAA;IACF;AAEA,WAAO;MACLS;MACA6D,SAASjB,SAASD,QAAQuF;MAC1BA;MACA,GAAIiB,iBAAiB;QAAEnB,QAAQmB;MAAe,IAAI,CAAC;IACrD;EACF;AACF;","names":["Global","Module","Reflector","DATABASE_MODULE_OPTIONS","Symbol","AsyncLocalStorage","Inject","Injectable","InternalServerErrorException","Logger","drizzle","Pool","RlsAwarePool","Pool","rlsAls","txAls","applyRlsContext","options","poolConfig","query","textOrConfig","values","cb","submit","rls","getStore","undefined","runWrapped","client","connect","result","release","err","PrimaryDatabaseService","logger","Logger","name","pool","db","rlsAls","AsyncLocalStorage","txAls","options","onModuleInit","primaryDb","initializeDrizzleClient","host","port","username","password","database","schema","sslMode","RlsAwarePool","user","max","maxConnections","ssl","rejectUnauthorized","applyRlsContext","debug","Object","keys","drizzleRelations","join","drizzle","client","relations","query","log","error","InternalServerErrorException","drizzleClient","pinned","getStore","Error","runWithRlsContext","rls","fn","run","runInTransaction","transaction","sp","applyRls","tx","undefined","sessionClient","session","runWithPinnedConnection","onModuleDestroy","end","DatabaseModule","forServer","options","asyncProvider","provide","DATABASE_MODULE_OPTIONS","useFactory","inject","module","providers","Reflector","useClass","PrimaryDatabaseService","exports","ApiProperty","CreateResponseDto","success","message","data","example","ApiProperty","ApiPropertyOptional","CursorListResponseDto","items","nextCursor","hasMore","nullable","ApiProperty","ApiPropertyOptional","ValidatedRowDto","index","data","valid","errors","example","code","name","ImportSummaryDto","total","invalid","ImportResponseDto","success","message","created","updated","skipped","rows","summary","type","ApiPropertyOptional","Type","IsIn","IsInt","IsOptional","IsString","Min","SelectOptionsQueryDto","search","limit","offset","values","excludeIds","valueKey","labelKey","descriptionKey","additionalKeys","groupIdKey","orderByKey","orderDirection","description","example","default","Number","enum","ApiProperty","IsBoolean","IsNotEmpty","IsString","SuccessResponseDto","success","message","example","ApiProperty","ApiPropertyOptional","TableResponseDto","result","count","state","activeViewId","nullable","createHmac","timingSafeEqual","HttpStatus","HttpException","HttpProblemException","HttpException","detailOrOptions","httpStatus","options","detail","type","label","errors","HttpStatus","BadRequestException","HttpProblemException","detailOrOptions","HttpStatus","BAD_REQUEST","HttpStatus","HttpStatus","HttpStatus","HttpStatus","InvalidCursorException","BadRequestException","detail","label","HttpStatus","HttpStatus","HttpStatus","HttpStatus","HttpStatus","HttpStatus","HttpStatus","HttpStatus","HttpStatus","HttpStatus","HttpStatus","HttpStatus","CURSOR_SECRET","process","env","KEYSET_CURSOR_SECRET","sign","body","createHmac","update","digest","CursorCodec","encode","values","signature","serialized","map","v","Date","__t","toISOString","undefined","String","envelope","s","Buffer","from","JSON","stringify","toString","decode","cursor","expectedSignature","dot","lastIndexOf","InvalidCursorException","slice","mac","macBuf","expBuf","length","timingSafeEqual","parse","Array","isArray","and","asc","desc","eq","gt","gte","ilike","inArray","lt","lte","ne","notIlike","notInArray","or","FilterProcessor","buildWhere","filters","fieldMap","conditions","flatMap","f","def","field","Array","isArray","value","expression","operator","column","col","val","type","eq","ne","ilike","notIlike","gt","gte","lt","lte","inArray","String","notInArray","length","and","undefined","buildSearch","search","columnId","Object","values","filter","map","or","buildOrderBy","sort","s","direction","asc","desc","FilterOperators","EQUALS","NOT_EQUALS","CONTAINS","NOT_CONTAINS","GT","GTE","LT","LTE","IS_ANY_OF","IS_NOT_ANY_OF","and","eq","gt","isNotNull","isNull","lt","or","sql","MAX_PAGE_SIZE","keysetSignature","entries","map","e","key","direction","join","KeysetProcessor","buildAfter","orderBy","values","first","sql","uniform","every","o","anyNullable","some","nulls","undefined","length","buildRowValue","buildOrExpansion","cols","column","vals","v","op","groups","i","current","conditions","j","prior","push","tie","strictlyAfter","group","and","firstGroup","or","value","isNull","eq","gt","lt","nullsLast","isNotNull","cmp","Logger","and","asc","desc","eq","getTableName","getViewName","ilike","inArray","is","notInArray","sql","PgViewBase","snakeToCamel","str","replace","_","letter","toUpperCase","PrimaryBaseRepository","logger","sequence","tableName","isView","db","database","drizzleClient","model","Error","name","query","queryKeys","Object","keys","debug","join","error","table","options","is","PgViewBase","dbTableName","getViewName","getTableName","Logger","nextSequenceValue","resolvedSequence","sequenceName","schema","seqName","result","execute","sql","rows","Number","sequence_value","create","data","tx","log","results","insert","values","returning","record","findById","id","findFirst","where","findOne","findMany","buildSelectQuery","select","from","$dynamic","leftJoin","on","leftJoins","groupBy","length","orderBy","limit","offset","findAllAndCount","countResultPromise","subq","named","as","count","countQuery","countResult","Promise","all","findKeyset","Math","min","max","trunc","MAX_PAGE_SIZE","hasMore","slice","update","idColumn","set","eq","updateMany","rowCount","delete","deleteMany","exists","transaction","callback","runInTransaction","findForSelect","config","selectFn","distinct","selectDistinct","bind","parsedValues","split","map","v","trim","filter","Boolean","parsedExcludeIds","excludeIds","tableColumns","joinTables","joins","resolveColumn","key","joinColumns","undefined","valueCol","value","labelCol","label","descriptionCol","description","parseKeys","input","Array","isArray","additionalKeys","additionalEntries","expr","e","entries","additionalExpressions","additionalAlias","selectCols","groupIdKey","groupIdCol","groupId","entry","valuesQuery","type","innerJoin","inArray","row","String","additionals","reduce","acc","groups","selectFields","totalCount","mapWith","conditions","search","push","ilike","notInArray","field","val","column","orderByKey","orderDirection","orderByCol","and","orderClauses","asc","desc","resolvedGroups","groupTable","groupTableColumns","groupTableIdKey","groupNameKey","groupLabelKey","groupNameCol","groupRows","r"]}
|
package/dist/decimal.d.cts
CHANGED
package/dist/decimal.d.ts
CHANGED