alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
83 lines (73 loc) • 2.21 kB
text/typescript
import type { Static, TObject } from "alepha";
import type { SQLWrapper } from "drizzle-orm";
import type { PgQueryWhereOrSQL } from "./PgQueryWhere.ts";
/**
* Order direction for sorting
*/
export type OrderDirection = "asc" | "desc";
/**
* Single order by clause with column and direction
*/
export interface OrderByClause<T> {
column: keyof T;
direction?: OrderDirection;
}
/**
* Order by parameter - supports 3 modes:
* 1. String: orderBy: "name" (defaults to ASC)
* 2. Single object: orderBy: { column: "name", direction: "desc" }
* 3. Array: orderBy: [{ column: "name", direction: "asc" }, { column: "age", direction: "desc" }]
*/
export type OrderBy<T> = keyof T | OrderByClause<T> | Array<OrderByClause<T>>;
/**
* Generic query interface for PostgreSQL entities
*/
export interface PgQuery<T extends TObject = TObject> {
distinct?: (keyof Static<T>)[];
columns?: (keyof Static<T>)[];
where?: PgQueryWhereOrSQL<T>;
limit?: number;
offset?: number;
orderBy?: OrderBy<Static<T>>;
groupBy?: (keyof Static<T>)[];
}
export type PgStatic<
T extends TObject,
Relations extends PgRelationMap<T>,
> = Static<T> & {
[K in keyof Relations]: Static<Relations[K]["join"]["schema"]> &
(Relations[K]["with"] extends PgRelationMap<TObject>
? PgStatic<Relations[K]["join"]["schema"], Relations[K]["with"]>
: {});
};
export interface PgQueryRelations<
T extends TObject = TObject,
Relations extends PgRelationMap<T> | undefined = undefined,
> extends PgQuery<T> {
with?: Relations;
where?: PgQueryWhereOrSQL<T, Relations>;
}
export type PgRelationMap<Base extends TObject> = Record<
string,
PgRelation<Base>
>;
type TObjectAny = TObject<any>;
export type PgRelation<Base extends TObject> = {
type?: "left" | "inner" | "right";
join: {
schema: TObject;
name: string;
};
// `readonly` so a literal tuple written with `as const` (the natural
// shape for `["userId", users.cols.id]`) satisfies the type without an
// explicit cast. The relation manager only reads the indices.
on:
| SQLWrapper
| readonly [
keyof Static<Base>,
{
name: string;
},
];
with?: PgRelationMap<TObject>;
};