UNPKG

ts-sql-query

Version:

Type-safe SQL query builder like QueryDSL or JOOQ in Java or Linq in .Net for TypeScript with MariaDB, MySql, Oracle, PostgreSql, Sqlite and SqlServer support.

73 lines (72 loc) 7.73 kB
import type { CUSTOMIZED_TABLE_OR_VIEW, ITable, ITableOrView, IView, IWithView, OuterJoinSource, TableOrViewAlias, TABLE_OR_VIEW_ALIAS, ITableOrViewRef, OLD, OldTableOrView, OUTER_JOIN_SOURCE, ITableOrViewOuterJoin, VALUES_FOR_INSERT, ValuesForInsertTableOrView, IValues, ResolvedShape } from "./ITableOrView"; import type { AnyValueSource, IValueSource, RemapValueSourceType, RemapValueSourceTypeWithOptionalType, ValueSourceOf, ValueSourceValueType } from "../expressions/values"; import type { tableOrViewRef, type, viewName } from "./symbols"; import type { AnyDB } from "../databases"; import type { Column, ColumnWithDefaultValue, ComputedColumn, ExtractColumnInfo, OptionalColumn, PrimaryKeyAutogeneratedColumn } from "./Column"; export type ColumnsOf<TABLE_OR_VIEW extends ITableOrView<any>> = ({ [K in keyof TABLE_OR_VIEW]-?: TABLE_OR_VIEW[K] extends ValueSourceOf<TABLE_OR_VIEW[typeof tableOrViewRef]> & Column ? K : never; })[keyof TABLE_OR_VIEW]; type ValueSourcesOf<TABLE_OR_VIEW> = ({ [K in keyof TABLE_OR_VIEW]-?: TABLE_OR_VIEW[K] extends AnyValueSource ? K : never; })[keyof TABLE_OR_VIEW]; export type OldValues<TABLE_OR_VIEW extends ITableOrView<any>> = { [K in ValueSourcesOf<TABLE_OR_VIEW>]: RemapValueSourceType<OLD<TABLE_OR_VIEW[typeof tableOrViewRef]>, TABLE_OR_VIEW[K]> & ExtractColumnInfo<TABLE_OR_VIEW[K]>; } & OldTableOrView<TABLE_OR_VIEW>; export type ValuesForInsert<TABLE_OR_VIEW extends ITableOrView<any>> = { [K in ValueSourcesOf<TABLE_OR_VIEW>]: RemapValueSourceType<VALUES_FOR_INSERT<TABLE_OR_VIEW[typeof tableOrViewRef]>, TABLE_OR_VIEW[K]> & ExtractColumnInfo<TABLE_OR_VIEW[K]>; } & ValuesForInsertTableOrView<TABLE_OR_VIEW>; export type AliasedTableOrView<TABLE_OR_VIEW extends ITableOrView<any>, ALIAS> = { [K in ValueSourcesOf<TABLE_OR_VIEW>]: RemapValueSourceType<TABLE_OR_VIEW_ALIAS<TABLE_OR_VIEW[typeof tableOrViewRef], ALIAS>, TABLE_OR_VIEW[K]> & ExtractColumnInfo<TABLE_OR_VIEW[K]>; } & TableOrViewAlias<TABLE_OR_VIEW, ALIAS>; export type TableOrViewWithRef<TABLE_OR_VIEW extends ITableOrView<any>, REF extends ITableOrViewRef<AnyDB>> = { [K in ValueSourcesOf<TABLE_OR_VIEW>]: RemapValueSourceType<REF, TABLE_OR_VIEW[K]> & ExtractColumnInfo<TABLE_OR_VIEW[K]>; } & ITableOrView<REF>; type WithViewColumns<TABLE_OR_VIEW extends ITableOrView<any>, COLUMNS> = { [K in ValueSourcesOf<COLUMNS>]: RemapValueSourceTypeWithOptionalType<TABLE_OR_VIEW[typeof tableOrViewRef], COLUMNS[K], WithOptionalTypeOf<COLUMNS[K]>> & Column; } & TABLE_OR_VIEW; type WithOptionalTypeOf<TYPE> = TYPE extends IValueSource<any, any, any, infer OPTIONAL_TYPE> ? ('required' extends OPTIONAL_TYPE ? 'required' : 'optional') : never; export type OuterJoinSourceOf<TABLE_OR_VIEW extends ITableOrView<any>, ALIAS> = { [K in ValueSourcesOf<TABLE_OR_VIEW>]: RemapValueSourceTypeWithOptionalType<OUTER_JOIN_SOURCE<TABLE_OR_VIEW[typeof tableOrViewRef], ALIAS>, TABLE_OR_VIEW[K], OuterOptionalTypeOf<TABLE_OR_VIEW[K]>>; } & OuterJoinSource<TABLE_OR_VIEW, ALIAS>; export type OuterJoinTableOrView<TABLE_OR_VIEW extends ITableOrView<any>, ALIAS> = { [K in ValueSourcesOf<TABLE_OR_VIEW>]: RemapValueSourceTypeWithOptionalType<OUTER_JOIN_SOURCE<TABLE_OR_VIEW[typeof tableOrViewRef], ALIAS>, TABLE_OR_VIEW[K], OuterOptionalTypeOf<TABLE_OR_VIEW[K]>>; } & ITableOrViewOuterJoin<TABLE_OR_VIEW, ALIAS>; type OuterOptionalTypeOf<TYPE> = TYPE extends IValueSource<any, any, any, infer OPTIONAL_TYPE> ? ('required' extends OPTIONAL_TYPE ? 'originallyRequired' : OPTIONAL_TYPE) : never; export interface WITH_VIEW<DB extends AnyDB, NAME extends string> extends ITableOrViewRef<DB> { [viewName]: NAME; [type]: 'with'; } type AddAliasMethods<T extends ITableOrView<any>> = T & { as<ALIAS extends string>(as: ALIAS): AliasedTableOrView<T, ALIAS>; forUseInLeftJoin(): OuterJoinSourceOf<T, ''>; forUseInLeftJoinAs<ALIAS extends string>(as: ALIAS): OuterJoinSourceOf<T, ALIAS>; }; export type WithView<REF extends WITH_VIEW<AnyDB, any>, COLUMNS> = AddAliasMethods<WithViewColumns<IWithView<REF>, COLUMNS>>; type CustomizedTableOrViewType<TABLE_OR_VIEW extends ITableOrView<any>, REF extends ITableOrViewRef<AnyDB>> = TABLE_OR_VIEW extends TableOrViewAlias<infer T, infer ALIAS> ? (T extends ITable<any> ? TableOrViewAlias<ITable<REF>, ALIAS> : T extends IView<any> ? TableOrViewAlias<IView<REF>, ALIAS> : T extends IWithView<any> ? TableOrViewAlias<IWithView<REF>, ALIAS> : T extends IValues<any> ? TableOrViewAlias<IValues<REF>, ALIAS> : never) : TABLE_OR_VIEW extends ITable<any> ? ITable<REF> : TABLE_OR_VIEW extends IView<any> ? IView<REF> : TABLE_OR_VIEW extends IWithView<any> ? IWithView<REF> : TABLE_OR_VIEW extends IValues<any> ? IValues<REF> : never; type CustomizedTableOrViewRefFor<TABLE_OR_VIEW extends ITableOrView<any>, NAME> = TABLE_OR_VIEW[typeof tableOrViewRef] extends TABLE_OR_VIEW_ALIAS<infer R, infer ALIAS> ? TABLE_OR_VIEW_ALIAS<CUSTOMIZED_TABLE_OR_VIEW<R, NAME>, ALIAS> : CUSTOMIZED_TABLE_OR_VIEW<TABLE_OR_VIEW[typeof tableOrViewRef], NAME>; type CustomizedTableOrViewRefForWitNoAlias<TABLE_OR_VIEW extends ITableOrView<any>, NAME> = TABLE_OR_VIEW[typeof tableOrViewRef] extends TABLE_OR_VIEW_ALIAS<infer R, any> ? CUSTOMIZED_TABLE_OR_VIEW<R, NAME> : CUSTOMIZED_TABLE_OR_VIEW<TABLE_OR_VIEW[typeof tableOrViewRef], NAME>; type CustomizedTableOrViewNoAliasable<TABLE_OR_VIEW extends ITableOrView<any>, NAME> = { [K in ValueSourcesOf<TABLE_OR_VIEW>]: RemapValueSourceType<CustomizedTableOrViewRefFor<TABLE_OR_VIEW, NAME>, TABLE_OR_VIEW[K]>; } & CustomizedTableOrViewType<TABLE_OR_VIEW, CustomizedTableOrViewRefForWitNoAlias<TABLE_OR_VIEW, NAME>>; export type CustomizedTableOrView<T extends ITableOrView<any>, NAME extends string> = (T extends { as(as: any): any; } ? AddAliasMethods<CustomizedTableOrViewNoAliasable<T, NAME>> : CustomizedTableOrViewNoAliasable<T, NAME>) & {}; export type AutogeneratedPrimaryKeyColumnsTypesOf<T extends ITableOrView<any>> = ({ [K in keyof T]-?: T[K] extends ValueSourceOf<T[typeof tableOrViewRef]> & Column ? (T[K] extends ComputedColumn ? never : (T[K] extends PrimaryKeyAutogeneratedColumn ? ValueSourceValueType<T[K]> : never)) : never; })[keyof T]; export type ColumnsForSetOfWithShape<TABLE extends ITableOrView<any>, SHAPE> = SHAPE extends ResolvedShape<TABLE> ? ColumnsForSetOf<SHAPE> : ColumnsForSetOf<TABLE>; export type ColumnsForSetOf<TYPE extends ITableOrView<any>> = ({ [K in keyof TYPE]-?: TYPE[K] extends ValueSourceOf<TYPE[typeof tableOrViewRef]> & Column ? (TYPE[K] extends ComputedColumn ? never : K) : never; })[keyof TYPE]; export type RequiredColumnsForSetOfWithShape<TABLE extends ITableOrView<any>, SHAPE> = SHAPE extends ResolvedShape<TABLE> ? RequiredColumnsForSetOf<SHAPE> : RequiredColumnsForSetOf<TABLE>; export type RequiredColumnsForSetOf<T extends ITableOrView<any>> = ({ [K in keyof T]-?: T[K] extends ValueSourceOf<T[typeof tableOrViewRef]> & Column ? (T[K] extends ComputedColumn ? never : (T[K] extends OptionalColumn ? never : (T[K] extends ColumnWithDefaultValue ? never : K))) : never; })[keyof T]; export type OptionalColumnsForSetOfWithShape<TABLE extends ITableOrView<any>, SHAPE> = SHAPE extends ResolvedShape<TABLE> ? OptionalColumnsForSetOf<SHAPE> : OptionalColumnsForSetOf<TABLE>; export type OptionalColumnsForSetOf<T extends ITableOrView<any>> = ({ [K in keyof T]-?: T[K] extends ValueSourceOf<T[typeof tableOrViewRef]> & Column ? (T[K] extends ComputedColumn ? never : (T[K] extends OptionalColumn ? K : (T[K] extends ColumnWithDefaultValue ? K : never))) : never; })[keyof T]; export type ResolveShape<T extends ITableOrView<any>, SHAPE extends {}> = { [P in keyof SHAPE]: SHAPE[P] extends keyof T ? T[SHAPE[P]] : SHAPE[P]; } & ResolvedShape<T>; export {};