@algochad/prisma-core
Version:
A comprehensive NestJS library that provides EF-Core-like operations using Prisma and GraphQL. Features LINQ-style query builders, advanced data manipulation, GraphQL integration with genql, and a unified API for both Prisma and GraphQL operations. Includ
297 lines (233 loc) • 8.27 kB
Markdown
# API Reference
## 🛠️ API Reference
### Core Components
The `PrismaCoreModule` provides these essential components:
- **`PrismaCoreService`** - Core service with Prisma client integration
- **`PrismaRepository`** - Universal repository base class with dynamic model access
- **`PrismaUnifiedBuilder`** - Unified query and mutation builder
- **`Enumerable`** - Synchronous LINQ operations
- **`AsyncEnumerable`** - Asynchronous LINQ operations for performance
- **`BenchmarkUtils`** - Performance testing and optimization utilities
### Configuration Options
```typescript
// Basic configuration
PrismaCoreModule.forRoot({
prismaClientProvider: {
provide: 'PRISMA_CLIENT',
useFactory: () => new PrismaClient(),
},
});
// Advanced configuration with options
PrismaCoreModule.forRoot({
prismaClientProvider: PRISMA_CLIENT_PROVIDER,
options: {
enableBenchmarking: true,
defaultTimeout: 30000,
enableQueryLogging: process.env.NODE_ENV === 'development',
},
});
```
### PrismaCoreService
The core service that provides Prisma client integration.
```typescript
class PrismaCoreService {
constructor(prismaClient: PrismaClient, options?: PrismaCoreOptions);
// Get the Prisma client instance
get client(): PrismaClient;
// Execute within a transaction
transaction<T>(fn: (tx: PrismaClient) => Promise<T>): Promise<T>;
// Health check
isHealthy(): Promise<boolean>;
}
```
### PrismaRepository
Base repository class with universal model access.
```typescript
abstract class PrismaRepository {
constructor(databaseService: PrismaCoreService);
// Dynamic model access
model<T>(modelName: string): PrismaUnifiedBuilder<T>;
// Get available model names
getModelNames(): string[];
// Clear internal cache
clearCache(): void;
// Direct client access
get client(): PrismaClient;
}
```
### PrismaUnifiedBuilder
Unified query and mutation builder with LINQ-style operations.
```typescript
class PrismaUnifiedBuilder<T> {
// Query operations
Where(condition: WhereInput): PrismaUnifiedBuilder<T>;
Select(fields: SelectInput): PrismaUnifiedBuilder<T>;
Include(relations: IncludeInput): PrismaUnifiedBuilder<T>;
OrderBy(sort: OrderByInput): PrismaUnifiedBuilder<T>;
Take(count: number): PrismaUnifiedBuilder<T>;
Skip(count: number): PrismaUnifiedBuilder<T>;
// Execution methods
ToArray(): Promise<T[]>;
ToEnumerable(): Promise<Enumerable<T>>;
ToAsyncEnumerable(): Promise<AsyncEnumerable<T>>;
First(): Promise<T | null>;
Count(): Promise<number>;
// Mutation operations
Create(data: CreateInput): Promise<T>;
Update(where: WhereUniqueInput, data: UpdateInput): Promise<T>;
Delete(where: WhereUniqueInput): Promise<T>;
CreateMany(data: CreateInput[]): Promise<{ count: number }>;
UpdateMany(
where: WhereInput,
data: UpdateInput,
): Promise<{ count: number }>;
DeleteMany(where: WhereInput): Promise<{ count: number }>;
// Transaction support
Transaction<R>(fn: (tx: PrismaUnifiedBuilder<T>) => Promise<R>): Promise<R>;
}
```
### Enumerable (Synchronous LINQ)
Synchronous LINQ operations for collections.
```typescript
class Enumerable<T> {
static from<T>(source: T[]): Enumerable<T>;
// Filtering
Where(predicate: (item: T) => boolean): Enumerable<T>;
// Projection
Select<R>(selector: (item: T) => R): Enumerable<R>;
SelectMany<R>(selector: (item: T) => R[]): Enumerable<R>;
// Ordering
OrderBy<K>(keySelector: (item: T) => K): OrderedEnumerable<T>;
OrderByDescending<K>(keySelector: (item: T) => K): OrderedEnumerable<T>;
// Aggregation
Sum(selector?: (item: T) => number): number;
Average(selector?: (item: T) => number): number;
Min<K>(selector?: (item: T) => K): K;
Max<K>(selector?: (item: T) => K): K;
Count(predicate?: (item: T) => boolean): number;
// Existence
Any(predicate?: (item: T) => boolean): boolean;
All(predicate: (item: T) => boolean): boolean;
// Set operations
Distinct(keySelector?: (item: T) => any): Enumerable<T>;
Union(other: Enumerable<T>): Enumerable<T>;
Intersect(other: Enumerable<T>): Enumerable<T>;
Except(other: Enumerable<T>): Enumerable<T>;
// Pagination
Take(count: number): Enumerable<T>;
Skip(count: number): Enumerable<T>;
// Grouping
GroupBy<K>(keySelector: (item: T) => K): Enumerable<Grouping<K, T>>;
// Conversion
ToArray(): T[];
ToMap<K, V>(
keySelector: (item: T) => K,
valueSelector: (item: T) => V,
): Map<K, V>;
// Custom aggregation
Aggregate<R>(
seed: R,
accumulator: (acc: R, item: T) => R,
resultSelector?: (result: R) => R,
): R;
}
```
### AsyncEnumerable (Asynchronous LINQ)
Asynchronous LINQ operations for performance-critical scenarios.
```typescript
class AsyncEnumerable<T> {
static from<T>(source: T[]): AsyncEnumerable<T>;
static fromAsync<T>(source: AsyncIterable<T>): AsyncEnumerable<T>;
// Filtering
Where(
predicate: (item: T) => boolean | Promise<boolean>,
): AsyncEnumerable<T>;
// Projection
Select<R>(selector: (item: T) => R | Promise<R>): AsyncEnumerable<R>;
SelectMany<R>(
selector: (item: T) => R[] | Promise<R[]>,
): AsyncEnumerable<R>;
// Ordering
OrderBy<K>(keySelector: (item: T) => K): OrderedAsyncEnumerable<T>;
OrderByDescending<K>(
keySelector: (item: T) => K,
): OrderedAsyncEnumerable<T>;
// Aggregation
Sum(selector?: (item: T) => number): Promise<number>;
Average(selector?: (item: T) => number): Promise<number>;
Min<K>(selector?: (item: T) => K): Promise<K>;
Max<K>(selector?: (item: T) => K): Promise<K>;
Count(predicate?: (item: T) => boolean | Promise<boolean>): Promise<number>;
// Existence
Any(predicate?: (item: T) => boolean | Promise<boolean>): Promise<boolean>;
All(predicate: (item: T) => boolean | Promise<boolean>): Promise<boolean>;
// Set operations
Distinct(keySelector?: (item: T) => any): AsyncEnumerable<T>;
// Pagination
Take(count: number): AsyncEnumerable<T>;
Skip(count: number): AsyncEnumerable<T>;
// Grouping
GroupBy<K>(keySelector: (item: T) => K): AsyncEnumerable<Grouping<K, T>>;
// Conversion
ToArrayAsync(): Promise<T[]>;
ToMapAsync<K, V>(
keySelector: (item: T) => K,
valueSelector: (item: T) => V,
): Promise<Map<K, V>>;
// Custom aggregation
Aggregate<R>(
seed: R,
accumulator: (acc: R, item: T) => R | Promise<R>,
resultSelector?: (result: R) => R | Promise<R>,
): Promise<R>;
}
```
### BenchmarkUtils
Performance testing and optimization utilities.
```typescript
class BenchmarkUtils {
// Comprehensive benchmarking
static runComprehensiveBenchmark(
dataSize: number,
): Promise<BenchmarkSummary>;
static printBenchmarkSummary(summary: BenchmarkSummary): void;
// Stress testing
static runStressTest(dataSizes: number[]): Promise<void>;
static runScalabilityTest(
minSize: number,
maxSize: number,
steps: number,
): Promise<void>;
static runEdgeCaseTests(): Promise<void>;
static runFullBenchmarkSuite(): Promise<void>;
// Custom benchmarking
static benchmarkCustomOperation<T>(
name: string,
operation: () => Promise<T>,
options?: BenchmarkOptions,
): Promise<BenchmarkResult>;
static compareOperations(
operations: OperationConfig[],
): Promise<ComparisonResult>;
static printComparison(comparison: ComparisonResult): void;
// Benchmark creation
static createBenchmark(name: string): Benchmark;
}
interface BenchmarkOptions {
iterations?: number;
warmupIterations?: number;
trackMemory?: boolean;
}
interface BenchmarkResult {
name: string;
averageTime: number;
minTime: number;
maxTime: number;
memoryUsage: number;
iterations: number;
}
```
## Next Steps
- [Check troubleshooting guide](./troubleshooting.md)
- [See examples and tutorials](./examples.md)
- [Learn about contributing](./contributing.md)