alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
1,076 lines • 56.4 kB
TypeScript
import { Alepha, KIND, Primitive, Static, TNull, TObject, TOptional, TSchema, TUnion } from "alepha";
import { Page } from "alepha/orm";
import { ServerRequest } from "alepha/server";
import { BuildExtraConfigColumns, SQL } from "drizzle-orm";
import { PgColumnBuilderBase, PgSequenceOptions, PgTableExtraConfigValue, UpdateDeleteAction } from "drizzle-orm/pg-core";
import "drizzle-orm/pg-core/foreign-keys";
import "alepha/datetime";
import "drizzle-orm/pg-core/session";
import "alepha/crypto";
import "drizzle-kit/api";
import "drizzle-orm/d1";
import "drizzle-orm/sqlite-core";
//#region ../../src/api/audits/entities/audits.d.ts
/**
* Audit severity levels for categorizing events.
*/
declare const auditSeveritySchema: import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>;
type AuditSeverity = Static<typeof auditSeveritySchema>;
/**
* Audit log entity for tracking important system events.
*
* Stores comprehensive audit information including:
* - Who performed the action (userId, userRealm)
* - What happened (type, action, resource)
* - When it happened (createdAt)
* - Context and details (metadata, ipAddress, userAgent)
*/
declare const audits: import("alepha/orm").EntityPrimitive<import("zod").ZodObject<{
id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>;
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>, typeof import("alepha/orm").PG_DEFAULT>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>>;
declare const auditEntitySchema: import("zod").ZodObject<{
id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>;
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>, typeof import("alepha/orm").PG_DEFAULT>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
declare const auditEntityInsertSchema: import("alepha/orm").TObjectInsert<import("zod").ZodObject<{
id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>;
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>, typeof import("alepha/orm").PG_DEFAULT>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>>;
type AuditEntity = Static<typeof audits.schema>;
//#endregion
//#region ../../src/api/audits/schemas/auditQuerySchema.d.ts
/**
* Query schema for searching and filtering audit logs.
*/
declare const auditQuerySchema: import("zod").ZodObject<{
page: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>;
size: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>;
sort: import("zod").ZodOptional<import("zod").ZodString>;
type: import("zod").ZodOptional<import("zod").ZodString>;
action: import("zod").ZodOptional<import("zod").ZodString>;
severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("zod").ZodOptional<import("zod").ZodBoolean>;
from: import("zod").ZodOptional<import("zod").ZodString>;
to: import("zod").ZodOptional<import("zod").ZodString>;
search: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
type AuditQuery = Static<typeof auditQuerySchema>;
//#endregion
//#region ../../src/api/audits/schemas/createAuditSchema.d.ts
/**
* Schema for creating a new audit log entry.
*/
declare const createAuditSchema: import("zod").ZodObject<{
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("zod").ZodOptional<import("zod").ZodBoolean>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
type CreateAudit = Static<typeof createAuditSchema>;
//#endregion
//#region ../../src/api/audits/services/AuditService.d.ts
/**
* Registered audit type definition.
*/
interface AuditTypeDefinition {
type: string;
description?: string;
actions: string[];
/**
* Dedicated retention (in days) for this audit type.
*
* Overrides the global default applied by the cleanup job. `0` keeps entries
* forever. When `undefined`, the global default retention applies.
*/
retentionDays?: number;
}
/**
* Service for managing audit logs.
*
* Provides methods for:
* - Creating audit entries
* - Querying audit history
* - Aggregating audit statistics
* - Managing registered audit types
*/
declare class AuditService {
protected readonly alepha: Alepha;
protected readonly log: import("alepha/logger").Logger;
protected readonly repo: import("alepha/orm").Repository<import("zod").ZodObject<{
id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>;
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>, typeof import("alepha/orm").PG_DEFAULT>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>>;
/**
* Registry of audit types and their allowed actions.
*/
protected readonly auditTypes: Map<string, AuditTypeDefinition>;
/**
* Register an audit type with its allowed actions.
*/
registerType(definition: AuditTypeDefinition): void;
/**
* Get all registered audit types.
*/
getRegisteredTypes(): AuditTypeDefinition[];
/**
* Distinct action names across all registered audit types, sorted.
*
* Sourced from the `$audit` type registry. Audit types register lazily —
* when their holder (e.g. `SessionAudits`, `ParameterAudits`) is first
* injected — so the admin filter only lists actions for audit domains that
* are actually in use, which is the intended behaviour.
*/
getDistinctActions(): string[];
/**
* Get current request context if available.
*/
protected getRequestContext(): ServerRequest | undefined;
/**
* Create a new audit log entry.
* Automatically populates ipAddress, userAgent, and requestId from the current request context.
*/
create(data: CreateAudit): Promise<AuditEntity>;
/**
* Record an audit event (convenience method).
*/
record(type: string, action: string, options?: Omit<CreateAudit, "type" | "action">): Promise<AuditEntity>;
/**
* Find audit entries with filtering and pagination.
*/
find(query?: AuditQuery): Promise<Page<AuditEntity>>;
/**
* Get audit entry by ID.
*/
getById(id: string): Promise<AuditEntity>;
/**
* Get audit entries for a specific user.
*/
findByUser(userId: string, query?: Omit<AuditQuery, "userId">): Promise<Page<AuditEntity>>;
/**
* Get audit entries for a specific resource.
*/
findByResource(resourceType: string, resourceId: string, query?: Omit<AuditQuery, "resourceType" | "resourceId">): Promise<Page<AuditEntity>>;
/**
* Get audit statistics for a time period.
*/
getStats(options?: {
from?: Date;
to?: Date;
userRealm?: string;
}): Promise<AuditStats>;
/**
* Delete audit entries created before the given date (retention policy).
*
* @returns number of deleted entries.
*/
deleteOlderThan(date: Date): Promise<number>;
/**
* Delete audit entries that have outlived their retention window.
*
* Each registered audit type that declares a dedicated `retentionDays` is
* pruned using its own window; every other type — including unregistered or
* legacy types — falls back to `defaultRetentionDays`. A retention of `0`
* (per-type or default) keeps that scope forever.
*
* `now` is injected rather than read from the clock so the policy is
* deterministic and testable.
*
* @param now - reference "now" used to compute cutoff dates.
* @param defaultRetentionDays - global default for types without an override.
* @returns total number of deleted entries.
*/
deleteExpired(now: Date, defaultRetentionDays: number): Promise<number>;
}
/**
* Audit statistics summary.
*/
interface AuditStats {
total: number;
byType: Record<string, number>;
bySeverity: Record<AuditSeverity, number>;
successRate: number;
recentFailures: AuditEntity[];
}
//#endregion
//#region ../../src/api/audits/controllers/AdminAuditController.d.ts
/**
* REST API controller for audit log management.
*
* Provides endpoints for:
* - Querying audit logs with filtering
* - Creating audit entries
* - Getting audit statistics
* - Viewing registered audit types
*/
declare class AdminAuditController {
protected readonly url = "/audits";
protected readonly group = "admin:audits";
protected readonly auditService: AuditService;
protected readonly repo: import("alepha/orm").Repository<import("zod").ZodObject<{
id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>;
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>, typeof import("alepha/orm").PG_DEFAULT>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>>;
/**
* Find audit entries with filtering and pagination.
*/
readonly findAudits: import("alepha/server").ActionPrimitiveFn<{
query: import("zod").ZodObject<{
page: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>;
size: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>;
sort: import("zod").ZodOptional<import("zod").ZodString>;
type: import("zod").ZodOptional<import("zod").ZodString>;
action: import("zod").ZodOptional<import("zod").ZodString>;
severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("zod").ZodOptional<import("zod").ZodBoolean>;
from: import("zod").ZodOptional<import("zod").ZodString>;
to: import("zod").ZodOptional<import("zod").ZodString>;
search: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
response: import("zod").ZodObject<{
content: import("zod").ZodArray<import("zod").ZodObject<{
id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>;
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>, typeof import("alepha/orm").PG_DEFAULT>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>>;
page: import("zod").ZodObject<{
number: import("zod").ZodInt;
size: import("zod").ZodInt;
offset: import("zod").ZodInt;
numberOfElements: import("zod").ZodInt;
totalElements: import("zod").ZodOptional<import("zod").ZodInt>;
totalPages: import("zod").ZodOptional<import("zod").ZodInt>;
isEmpty: import("zod").ZodBoolean;
isFirst: import("zod").ZodBoolean;
isLast: import("zod").ZodBoolean;
}, import("zod/v4/core").$strip>;
}, import("zod/v4/core").$strip>;
}>;
/**
* Get a single audit entry by ID.
*/
readonly getAudit: import("alepha/server").ActionPrimitiveFn<{
params: import("zod").ZodObject<{
id: import("zod").ZodString;
}, import("zod/v4/core").$strip>;
response: import("zod").ZodObject<{
id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>;
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>, typeof import("alepha/orm").PG_DEFAULT>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
}>;
/**
* Delete many audit entries by id in one repository call. Use with care —
* audit logs are usually retained for compliance reasons.
*/
readonly deleteAudits: import("alepha/server").ActionPrimitiveFn<{
body: import("zod").ZodObject<{
ids: import("zod").ZodArray<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
response: import("zod").ZodObject<{
deleted: import("zod").ZodArray<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
}>;
/**
* Create a new audit entry.
* System-only — this permission should never be assigned to human roles.
*/
readonly createAudit: import("alepha/server").ActionPrimitiveFn<{
body: import("zod").ZodObject<{
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("zod").ZodOptional<import("zod").ZodBoolean>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
response: import("zod").ZodObject<{
id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>;
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>, typeof import("alepha/orm").PG_DEFAULT>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
}>;
/**
* Get audit entries for a specific user.
*/
readonly findByUser: import("alepha/server").ActionPrimitiveFn<{
params: import("zod").ZodObject<{
userId: import("zod").ZodString;
}, import("zod/v4/core").$strip>;
query: import("zod").ZodObject<{
page: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>;
size: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>;
sort: import("zod").ZodOptional<import("zod").ZodString>;
type: import("zod").ZodOptional<import("zod").ZodString>;
action: import("zod").ZodOptional<import("zod").ZodString>;
severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("zod").ZodOptional<import("zod").ZodBoolean>;
from: import("zod").ZodOptional<import("zod").ZodString>;
to: import("zod").ZodOptional<import("zod").ZodString>;
search: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
response: import("zod").ZodObject<{
content: import("zod").ZodArray<import("zod").ZodObject<{
id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>;
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>, typeof import("alepha/orm").PG_DEFAULT>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>>;
page: import("zod").ZodObject<{
number: import("zod").ZodInt;
size: import("zod").ZodInt;
offset: import("zod").ZodInt;
numberOfElements: import("zod").ZodInt;
totalElements: import("zod").ZodOptional<import("zod").ZodInt>;
totalPages: import("zod").ZodOptional<import("zod").ZodInt>;
isEmpty: import("zod").ZodBoolean;
isFirst: import("zod").ZodBoolean;
isLast: import("zod").ZodBoolean;
}, import("zod/v4/core").$strip>;
}, import("zod/v4/core").$strip>;
}>;
/**
* Get audit entries for a specific resource.
*/
readonly findByResource: import("alepha/server").ActionPrimitiveFn<{
params: import("zod").ZodObject<{
resourceType: import("zod").ZodString;
resourceId: import("zod").ZodString;
}, import("zod/v4/core").$strip>;
query: import("zod").ZodObject<{
page: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>;
size: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>;
sort: import("zod").ZodOptional<import("zod").ZodString>;
type: import("zod").ZodOptional<import("zod").ZodString>;
action: import("zod").ZodOptional<import("zod").ZodString>;
severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
success: import("zod").ZodOptional<import("zod").ZodBoolean>;
from: import("zod").ZodOptional<import("zod").ZodString>;
to: import("zod").ZodOptional<import("zod").ZodString>;
search: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
response: import("zod").ZodObject<{
content: import("zod").ZodArray<import("zod").ZodObject<{
id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>;
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>, typeof import("alepha/orm").PG_DEFAULT>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>>;
page: import("zod").ZodObject<{
number: import("zod").ZodInt;
size: import("zod").ZodInt;
offset: import("zod").ZodInt;
numberOfElements: import("zod").ZodInt;
totalElements: import("zod").ZodOptional<import("zod").ZodInt>;
totalPages: import("zod").ZodOptional<import("zod").ZodInt>;
isEmpty: import("zod").ZodBoolean;
isFirst: import("zod").ZodBoolean;
isLast: import("zod").ZodBoolean;
}, import("zod/v4/core").$strip>;
}, import("zod/v4/core").$strip>;
}>;
/**
* Get audit statistics.
*/
readonly getAuditStats: import("alepha/server").ActionPrimitiveFn<{
query: import("zod").ZodObject<{
from: import("zod").ZodOptional<import("zod").ZodString>;
to: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
response: import("zod").ZodObject<{
total: import("zod").ZodInt;
byType: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodInt>;
bySeverity: import("zod").ZodObject<{
info: import("zod").ZodInt;
warning: import("zod").ZodInt;
critical: import("zod").ZodInt;
}, import("zod/v4/core").$strip>;
successRate: import("zod").ZodNumber;
recentFailures: import("zod").ZodArray<import("zod").ZodObject<{
id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>;
type: import("zod").ZodString;
action: import("zod").ZodString;
severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{
critical: "critical";
info: "info";
warning: "warning";
}>>, typeof import("alepha/orm").PG_DEFAULT>;
userId: import("zod").ZodOptional<import("zod").ZodString>;
userRealm: import("zod").ZodOptional<import("zod").ZodString>;
userEmail: import("zod").ZodOptional<import("zod").ZodString>;
resourceType: import("zod").ZodOptional<import("zod").ZodString>;
resourceId: import("zod").ZodOptional<import("zod").ZodString>;
description: import("zod").ZodOptional<import("zod").ZodString>;
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>;
ipAddress: import("zod").ZodOptional<import("zod").ZodString>;
userAgent: import("zod").ZodOptional<import("zod").ZodString>;
sessionId: import("zod").ZodOptional<import("zod").ZodString>;
requestId: import("zod").ZodOptional<import("zod").ZodString>;
success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>;
errorMessage: import("zod").ZodOptional<import("zod").ZodString>;
}, import("zod/v4/core").$strip>>;
}, import("zod/v4/core").$strip>;
}>;
/**
* List distinct action names present in the audit log (for filters).
*/
readonly getAuditActions: import("alepha/server").ActionPrimitiveFn<{
response: import("zod").ZodArray<import("zod").ZodString>;
}>;
/**
* Get registered audit types.
*/
readonly getTypes: import("alepha/server").ActionPrimitiveFn<{
response: import("zod").ZodArray<import("zod").ZodObject<{
type: import("zod").ZodString;
description: import("zod").ZodOptional<import("zod").ZodString>;
actions: import("zod").ZodArray<import("zod").ZodString>;
}, import("zod/v4/core").$strip>>;
}>;
/**
* Get distinct values for filters.
*/
readonly getFilterOptions: import("alepha/server").ActionPrimitiveFn<{
response: import("zod").ZodObject<{
types: import("zod").ZodArray<import("zod").ZodString>;
actions: import("zod").ZodArray<import("zod").ZodString>;
resourceTypes: import("zod").ZodArray<import("zod").ZodString>;
userRealms: import("zod").ZodArray<import("zod").ZodString>;
}, import("zod/v4/core").$strip>;
}>;
}
//#endregion
//#region ../../src/api/audits/parameters/AuditParameters.d.ts
/**
* Audit module configuration atom.
*/
declare const auditOptions: import("alepha").Atom<import("zod").ZodObject<{
retentionDays: import("zod").ZodDefault<import("zod").ZodInt>;
}, import("zod/v4/core").$strip>, "alepha.api.audits.options">;
type AuditOptions = Static<typeof auditOptions.schema>;
declare module "alepha" {
interface State {
[auditOptions.key]: AuditOptions;
}
}
/**
* Typed accessor for audit module configuration ({@link auditOptions}).
*/
declare class AuditParameters {
protected readonly options: Readonly<{
retentionDays: number;
}>;
get<K extends keyof AuditOptions>(key: K): AuditOptions[K];
}
//#endregion
//#region ../../src/api/audits/jobs/AuditJobs.d.ts
/**
* Scheduled enforcement of the audit retention policy.
*/
declare class AuditJobs {
protected readonly auditService: AuditService;
protected readonly auditParameters: AuditParameters;
/**
* Delete audit entries that have outlived their retention window.
*
* Runs daily and applies each audit type's dedicated `retentionDays` plus the
* global default (`auditOptions.retentionDays`). A default of `0` disables
* cleanup for types without a dedicated retention.
*/
readonly cleanExpired: import("alepha/scheduler").SchedulerPrimitive;
}
//#endregion
//#region ../../src/api/audits/primitives/$audit.d.ts
/**
* Options for creating an audit type primitive.
*/
interface AuditPrimitiveOptions {
/**
* Unique audit type identifier (e.g., "auth", "payment", "order").
*/
type: string;
/**
* Human-readable description of this audit type.
*/
description?: string;
/**
* List of allowed actions for this audit type.
*/
actions: string[];
/**
* Number of days entries of this audit type are retained before the periodic
* cleanup job deletes them.
*
* Overrides the global default retention (see `auditOptions.retentionDays` in
* `AuditParameters`). Set to `0` to keep this type's entries forever,
* regardless of the global default. When omitted, the global default applies.
*
* @example
* ```ts
* // Keep security audits for two years, ignoring the global default.
* $audit({ type: "security", actions: ["login"], retentionDays: 730 });
* ```
*/
retentionDays?: number;
}
/**
* Audit type primitive for registering domain-specific audit events.
*
* Provides a type-safe way to define and log audit events within a specific domain.
*
* @example
* ```ts
* class PaymentAudits {
* audit = $audit({
* type: "payment",
* description: "Payment-related audit events",
* actions: ["create", "refund", "cancel", "dispute"],
* });
*
* async logPaymentCreated(paymentId: string, userId: string, amount: number) {
* await this.audit.log("create", {
* userId,
* resourceType: "payment",
* resourceId: paymentId,
* description: `Payment of ${amount} created`,
* metadata: { amount },
* });
* }
* }
* ```
*/
declare class AuditPrimitive extends Primitive<AuditPrimitiveOptions> {
protected readonly auditService: AuditService;
/**
* The audit type identifier.
*/
get type(): string;
/**
* The audit type description.
*/
get description(): string | undefined;
/**
* The allowed actions for this audit type.
*/
get actions(): string[];
/**
* The dedicated retention (in days) for this audit type, if set.
*/
get retentionDays(): number | undefined;
/**
* Log an audit event for this type.
*/
log(action: string, options?: AuditLogOptions): Promise<void>;
/**
* Log a successful audit event.
*/
logSuccess(action: string, options?: Omit<AuditLogOptions, "success">): Promise<void>;
/**
* Log a failed audit event.
*/
logFailure(action: string, errorMessage: string, options?: Omit<AuditLogOptions, "success" | "errorMessage">): Promise<void>;
/**
* Called during initialization to register this audit type.
*/
protected onInit(): void;
}
/**
* Options for logging an audit event.
*/
interface AuditLogOptions {
severity?: "info" | "warning" | "critical";
userId?: string;
userRealm?: string;
userEmail?: string;
resourceType?: string;
resourceId?: string;
description?: string;
metadata?: Record<string, unknown>;
ipAddress?: string;
userAgent?: string;
sessionId?: string;
requestId?: string;
success?: boolean;
errorMessage?: string;
}
/**
* Create an audit type primitive.
*
* @example
* ```ts
* class OrderAudits {
* audit = $audit({
* type: "order",
* description: "Order management events",
* actions: ["create", "update", "cancel", "fulfill", "ship"],
* });
* }
* ```
*/
declare const $audit: {
(options: AuditPrimitiveOptions): AuditPrimitive;
[KIND]: typeof AuditPrimitive;
};
//#endregion
//#region ../../src/orm/core/schemas/insertSchema.d.ts
/**
* Transforms a TObject schema for insert operations.
* All default properties at the root level are made optional.
* Generated columns are excluded entirely.
*
* @example
* Before: { name: string; age: number(default=0); fullName: generated }
* After: { name: string; age?: number; }
*/
type TObjectInsert<T extends TObject> = TObject<{ [K in keyof T["shape"] as T["shape"][K] extends {
[PG_GENERATED]: any;
} ? never : K]: T["shape"][K] extends {
[PG_DEFAULT]: any;
} | {
[PG_ORGANIZATION]: any;
} ? TOptional<Extract<T["shape"][K], TSchema>> : T["shape"][K]; }>;
//#endregion
//#region ../../src/orm/core/schemas/updateSchema.d.ts
/**
* Transforms a TObject schema for update operations.
* All optional properties at the root level are made nullable (i.e., `T | null`).
* Generated columns are excluded entirely.
*
* @example
* Before: { name?: string; age: number; fullName: generated }
* After: { name?: string | null; age: number; }
*/
type TObjectUpdate<T extends TObject> = TObject<{ [K in keyof T["shape"] as T["shape"][K] extends {
[PG_GENERATED]: any;
} ? never : K]: T["shape"][K] extends TOptional<infer U extends TSchema> ? TOptional<TUnion<[U, TNull]>> : T["shape"][K]; }>;
//#endregion
//#region ../../src/orm/core/primitives/$entity.d.ts
interface EntityPrimitiveOptions<T extends TObject, Keys = keyof Static<T>> {
/**
* The database table name that will be created for this entity.
* If not provided, name will be inferred from the $repository variable name.
*/
name: string;
/**
* TypeBox schema defining the table structure and column types.
*/
schema: T;
/**
* Database indexes to create for query optimization.
*/
indexes?: (Keys | {
/**
* Single column to index.
*/
column: Keys;
/**
* Whether this should be a unique index (enforces uniqueness constraint).
*/
unique?: boolean;
/**
* Custom name for the index. If not provided, generates name automatically.
*/
name?: string;
/**
* Partial index condition. Only rows matching this SQL expression are indexed.
*/
where?: SQL;
} | {
/**
* Multiple columns for composite index (order matters for query optimization).
*/
columns: Keys[];
/**
* Whether this should be a unique index (enforces uniqueness constraint).
*/
unique?: boolean;
/**
* Custom name for the index. If not provided, generates name automatically.
*/
name?: string;
/**
* Partial index condition. Only rows matching this SQL expression are indexed.
*/
where?: SQL;
} | {
/**
* SQL expressions for expression-based indexes.
*
* Can include column references and SQL functions like `LOWER()`, `UPPER()`, etc.
* Columns and expressions can be mixed together.
*
* @example
* ```ts
* // Case-insensitive unique username per realm
* indexes: [{
* expressions: (self) => [self.realm, sql`LOWER(${self.username})`],
* unique: true,
* name: "users_realm_username_lower_idx",
* }]
* ```
*/
expressions: (self: Record<Keys & string, any>) => (SQL | any)[];
/**
* Whether this should be a unique index (enforces uniqueness constraint).
*/
unique?: boolean;
/**
* Custom name for the index. If not provided, generates name automatically.
*/
name: string;
/**
* Partial index condition. Only rows matching this SQL expression are indexed.
*/
where?: SQL;
})[];
/**
* Foreign key constraints to maintain referential integrity.
*/
foreignKeys?: Array<{
/**
* Optional name for the foreign key constraint.
*/
name?: string;
/**
* Local columns that reference the foreign table.
*/
columns: Array<keyof Static<T>>;
/**
* Referenced columns in the foreign table.
* Must be EntityColumn references from other entities.
*/
foreignColumns: Array<() => EntityColumn<any>>;
}>;
/**
* Additional table constraints for data validation.
*
* Constraints enforce business rules at the database level, providing
* an additional layer of data integrity beyond application validation.
*
* **Constraint Types**:
* - **Unique constraints**: Prevent duplicate values across columns
* - **Check constraints**: Enforce custom validation rules with SQL expressions
*
* @example
* ```ts
* constraints: [
* {
* name: "unique_user_email",
* columns: ["email"],
* unique: true
* },
* {
* name: "valid_age_range",
* columns: ["age"],
* check: sql`age >= 0 AND age <= 150`
* },
* {
* name: "unique_user_username_per_tenant",
* columns: ["tenantId", "username"],
* unique: true
* }
* ]
* ```
*/
constraints?: Array<{
/**
* Columns involved in this constraint.
*/
columns: Array<keyof Static<T>>;
/**
* Optional name for the constraint.
*/
name?: string;
/**
* Whether this is a unique constraint.
*/
unique?: boolean | {};
/**
* SQL expression for check constraint validation.
*/
check?: SQL;
}>;
/**
* Advanced Drizzle ORM configuration for complex table setups.
*/
config?: (self: BuildExtraConfigColumns<string, FromSchema<T>, "pg">) => PgTableExtraConfigValue[];
}
declare class EntityPrimitive<T extends TObject = TObject> {
readonly options: EntityPrimitiveOptions<T>;
constructor(options: EntityPrimitiveOptions<T>);
alias(alias: string): this;
get cols(): EntityColumns<T>;
get name(): string;
get schema(): T;
protected _insertSchema?: TObjectInsert<T>;
get insertSchema(): TObjectInsert<T>;
protected _updateSchema?: TObjectUpdate<