UNPKG

adonis-odm

Version:

A comprehensive MongoDB ODM for AdonisJS with Lucid-style API, type-safe relationships, embedded documents, and transaction support

65 lines 2.82 kB
import type { Document } from 'mongodb'; import type { BaseModel } from '../base_model/base_model.js'; import type { ModelQueryBuilder } from '../query_builder/model_query_builder.js'; import type { HasOne, HasMany, BelongsTo } from './relationships.js'; /** * SEAMLESS TYPE SAFETY SYSTEM * * This file contains advanced TypeScript types that enable seamless type safety * for relationship loading, exactly like AdonisJS Lucid, without requiring * any extra steps from developers. */ /** * Extract relationship keys from a model type */ export type ExtractRelationshipKeys<T extends BaseModel> = { [K in keyof T]: T[K] extends HasOne<any> | HasMany<any> | BelongsTo<any> ? K : never; }[keyof T]; /** * Extract the related model type from a relationship */ export type ExtractRelatedModel<T, K extends keyof T> = T[K] extends HasOne<infer R> ? InstanceType<R> : T[K] extends HasMany<infer R> ? InstanceType<R> : T[K] extends BelongsTo<infer R> ? InstanceType<R> : never; /** * Type-safe load callback that automatically infers the related model type */ export type SeamlessCallback<TModel extends BaseModel, TRelation extends keyof TModel> = (query: ModelQueryBuilder<ExtractRelatedModel<TModel, TRelation> & Document>) => void | Promise<void>; /** * Enhanced ModelQueryBuilder interface with seamless type safety */ export interface SeamlessModelQueryBuilder<TModel extends BaseModel> { load<K extends ExtractRelationshipKeys<TModel>>(relation: K, callback?: SeamlessCallback<TModel, K>): this; load(relation: string, callback?: (query: ModelQueryBuilder<any>) => void): this; } /** * Utility type to create a seamless query builder for a specific model */ export type CreateSeamlessQueryBuilder<TModel extends BaseModel> = ModelQueryBuilder<Document> & SeamlessModelQueryBuilder<TModel>; /** * DECLARATION MERGING HELPER * * This type can be used to create model-specific type declarations */ export type ModelSpecificLoad<TModel extends BaseModel> = { [K in ExtractRelationshipKeys<TModel>]: (relation: K, callback?: SeamlessCallback<TModel, K>) => ModelQueryBuilder<Document>; }; /** * EXAMPLE USAGE TYPES * * These show how to use the seamless type system with specific models */ export interface UserModelQueryBuilder { load(relation: 'profile', callback?: (query: ModelQueryBuilder<any>) => void): this; load(relation: 'posts', callback?: (query: ModelQueryBuilder<any>) => void): this; } export interface ProfileModelQueryBuilder { load(relation: 'user', callback?: (query: ModelQueryBuilder<any>) => void): this; } /** * GLOBAL DECLARATION MERGING INTERFACE * * This interface can be augmented by applications to provide * seamless type safety for all their models */ export interface GlobalSeamlessTypes { } //# sourceMappingURL=seamless_types.d.ts.map