export declare const baseRepo = "import * as model from './model';\n\nexport interface OnnRepo<T extends {}> {\n  insertBy(context: model.OnnContext, _: unknown, value: T): Promise<model.MutationResult>;\n  upsertBy(context: model.OnnContext, clauses: model.Clause<keyof T>[], value: T): Promise<model.MutationResult>;\n  updateBy(context: model.OnnContext, clauses: model.Clause<keyof T>[], value: Partial<T>): Promise<model.MutationResult>;\n  deleteBy(context: model.OnnContext, clauses: model.Clause<keyof T>[], _: unknown): Promise<model.MutationResult>;\n  delete(context: model.OnnContext, clauses: model.Clause<keyof T>[]): Promise<model.MutationResult>;\n  getBy(context: model.OnnContext, clauses: model.Clause<keyof T>[], orderBy?: { field: string, direction: 'asc' | 'desc' }, fields?: string[]): Promise<T>;\n  getPaginatedBy(context: model.OnnContext,\n    clauses: model.Clause<keyof T>[],\n    paginate?: model.Paginate | null,\n    orderBy?: { field: string, direction: 'asc' | 'desc' },\n    distinct?: string[],\n    fields?: string[],\n    builder?: (qb: model.QueryBuilder<T>) => model.QueryBuilder<T>\n  ): Promise<model.Paginated<T>>;\n\n  insert(context: model.OnnContext, value: T): Promise<model.MutationResult>;\n  upsertByEquals(context: model.OnnContext, key: keyof T, keyValue: any, value: T): Promise<model.MutationResult>;\n  updateByEquals(context: model.OnnContext, key: keyof T, keyValue: any, value: Partial<T>): Promise<model.MutationResult>;\n  deleteByEquals(context: model.OnnContext, key: keyof T, keyValue: any, _: unknown): Promise<model.MutationResult>;\n  getByEquals(context: model.OnnContext, key: keyof T, keyValue: any, orderBy?: { field: string, direction: 'asc' | 'desc' }, fields?: string[]): Promise<T>;\n  getPaginatedByEquals(context: model.OnnContext,\n                 key: keyof T, \n                 keyValue: any,\n                 paginate?: model.Paginate | null,\n                 orderBy?: { field: string, direction: 'asc' | 'desc' },\n                 distinct?: string[],\n                 fields?: string[],\n                 builder?: (qb: model.QueryBuilder<T>) => model.QueryBuilder<T>\n  ): Promise<model.Paginated<T>>;\n}\n\nexport abstract class OnnBaseRepo<SQL_TYPE extends {}> implements OnnRepo<SQL_TYPE> {\n\n  static BUILDER_FACTORY: <T extends {}>(context: model.OnnContext | any) => model.QueryBuilder<T> = (context) => {\n    throw new Error('No BUILDER_FACTORY set')\n  };\n\n  protected constructor(private tableName: string) {}\n\n  builder = (context: model.OnnContext | any) => OnnBaseRepo.BUILDER_FACTORY<SQL_TYPE>(context).table(this.tableName);\n\n  paginate = async (\n    qb: model.QueryBuilder<SQL_TYPE>,\n    fields: string[] = ['*'],\n    paginate: model.Paginate,\n    orderBy?: { field: string, direction: 'asc' | 'desc' },\n  ): Promise<model.Paginated<SQL_TYPE>> => {\n    const totalEntries = await qb.executeCount();\n    \n    const _qb = qb.select(fields).orderBy(orderBy);\n    const noLimit = paginate.pageSize <= 0;\n    const query = noLimit ? _qb : _qb.offset(paginate.pageIndex * paginate.pageSize).limit(paginate.pageSize);\n    const data = await query.executeQuery();\n\n    return {\n      pageIndex: noLimit ? 0 : paginate.pageIndex,\n      pageSize: noLimit ? totalEntries : paginate.pageSize,\n      totalEntries,\n      data: data,\n    };\n  };\n  \n  abstract insertBy(context: model.OnnContext, _: unknown, value: SQL_TYPE): Promise<model.MutationResult>;\n  abstract updateBy(context: model.OnnContext, clauses: model.Clause<keyof SQL_TYPE>[], value: Partial<SQL_TYPE>): Promise<model.MutationResult>;\n  abstract deleteBy(context: model.OnnContext, clauses: model.Clause<keyof SQL_TYPE>[], _: unknown): Promise<model.MutationResult>;\n  abstract getBy(context: model.OnnContext, clauses: model.Clause<keyof SQL_TYPE>[], orderBy?: { field: string; direction: \"asc\" | \"desc\" }, fields?: string[]): Promise<SQL_TYPE>;\n  abstract getPaginatedBy(context: model.OnnContext, clauses: model.Clause<keyof SQL_TYPE>[], paginate?: model.Paginate | null, orderBy?: { field: string; direction: \"asc\" | \"desc\" }, fields?: string[], distinct?: string[], builder?: (qb: model.QueryBuilder<SQL_TYPE>) => model.QueryBuilder<SQL_TYPE>): Promise<model.Paginated<SQL_TYPE>>;\n\n  upsertByEquals = (context: model.OnnContext, key: keyof SQL_TYPE, keyValue: any, value: SQL_TYPE) => this.upsertBy(context, [{ field: key, operator: model.QueryOperator.EQUALS, value: keyValue }],value);\n  updateByEquals = (context: model.OnnContext, key: keyof SQL_TYPE, keyValue: any, value: Partial<SQL_TYPE>) => this.updateBy(context, [{ field: key, operator: model.QueryOperator.EQUALS, value: keyValue }],value);\n  deleteByEquals = (context: model.OnnContext, key: keyof SQL_TYPE, keyValue: any) => this.deleteBy(context, [{ field: key, operator: model.QueryOperator.EQUALS, value: keyValue }],null);\n  getByEquals = (context: model.OnnContext, key: keyof SQL_TYPE, keyValue: any, orderBy?: { field: string; direction: \"asc\" | \"desc\" }, fields?: string[]) => this.getBy(context, [{ field: key, operator: model.QueryOperator.EQUALS, value: keyValue }],orderBy, fields);\n  getPaginatedByEquals = (context: model.OnnContext, key: keyof SQL_TYPE, keyValue: any, paginate?: model.Paginate | null, orderBy?: { field: string; direction: \"asc\" | \"desc\" }, distinct?: string[], fields?: string[], builder?: (qb: model.QueryBuilder<SQL_TYPE>) => model.QueryBuilder<SQL_TYPE>) =>\n      this.getPaginatedBy(context, [{ field: key, operator: model.QueryOperator.EQUALS, value: keyValue }], paginate, orderBy, distinct, fields, builder);\n  \n  async upsertBy(context: model.OnnContext, clauses: model.Clause<keyof SQL_TYPE>[], value: SQL_TYPE): Promise<model.MutationResult> {\n    const current = await this.getBy(context, clauses);\n    if(!current) {\n      const res = await this.insertBy(context, null, value);\n      return {rows: 1, res: ''};\n    }else {\n      return await this.updateBy(context, clauses, value)\n    };\n  }\n  \n  async insert(context: model.OnnContext, value: SQL_TYPE): Promise<model.MutationResult> {\n      return await this.insertBy(context, null, value);\n  }\n  \n  async delete(context: model.OnnContext, clauses: model.Clause<keyof SQL_TYPE>[]): Promise<model.MutationResult> {\n      return await this.deleteBy(context, clauses, null);\n  }\n  \n}\n\nexport const onnRepoFactory: Record<string, <T extends {}>() => OnnRepo<T>> = {\n__REPO_FACTORIES__\n}\n\n";
export declare const repoTemplate = "\n__UNSAFE_LOOKUP__\nexport class __SQL_TYPE___Repo extends OnnBaseRepo<model.__SQL_TYPE__> {\n\n  static TABLE = '__SQL_TABLE__';\n\n  constructor() {\n    super(__SQL_TYPE___Repo.TABLE);\n  }\n  \n  async insertBy(\n    context: model.OnnContext | any,\n    _: unknown,\n    value: model.__SQL_TYPE__): Promise<model.MutationResult> {\n    \n__UNSAFE_VALUE_MAPPERS__\n\n    return await this.builder(context)\n      .executeInsert(value) as any;\n  }\n  \n  async updateBy(\n    context: model.OnnContext | any,\n    clauses: model.Clause<keyof model.__SQL_TYPE__>[],\n    value: Partial<model.__SQL_TYPE__>): Promise<model.MutationResult> {\n    \n__UNSAFE_CLAUSE_MAPPERS__\n__UNSAFE_VALUE_MAPPERS__\n\n    return await this.builder(context)\n      .where(...clauses)\n      .executeUpdate(value) as any;\n  }\n  \n  async deleteBy(\n    context: model.OnnContext | any,\n    clauses: model.Clause<keyof model.__SQL_TYPE__>[],\n    _: unknown): Promise<model.MutationResult> {\n    \n__UNSAFE_CLAUSE_MAPPERS__\n\n    return await this.builder(context)\n      .where(...clauses)\n      .executeDelete() as any;\n  }\n  \n  async getBy(\n    context: model.OnnContext | any,\n    clauses: model.Clause<keyof model.__SQL_TYPE__>[],\n    orderBy?: { field: string, direction: 'asc' | 'desc' },\n    fields: string[] = ['*']\n  ): Promise<model.__SQL_TYPE__> {\n__UNSAFE_ORDER_MAPPERS__\n__UNSAFE_CLAUSE_MAPPERS__\n    const [res] = await this.builder(context)\n        .select(fields)\n        .where(...clauses)\n        .orderBy(orderBy)\n        .limit(1)\n        .executeQuery() as any;\n        \n    if(res) {\n__SAFE_MAPPERS__\n    }\n    return res;\n  }\n\n  async getPaginatedBy(\n    context: model.OnnContext | any,\n    clauses: model.Clause<keyof model.__SQL_TYPE__>[],\n    paginate?: model.Paginate | null,\n    orderBy?: { field: string, direction: 'asc' | 'desc' },\n    distinct: string[] = [],\n    fields: string[] = ['*'],\n    builder: (qb: model.QueryBuilder<model.__SQL_TYPE__>) => model.QueryBuilder<model.__SQL_TYPE__> = qb => qb\n  ): Promise<model.Paginated<model.__SQL_TYPE__>> {  \n__UNSAFE_ORDER_MAPPERS__\n__UNSAFE_DISTINCT_MAPPERS__\n__UNSAFE_CLAUSE_MAPPERS__\n    const queryBuilder = this.builder(context).where(...clauses).distinct(distinct);\n    const paginated = await this.paginate(builder(queryBuilder), fields, paginate ?? { pageIndex: -1, pageSize: -1 }, orderBy);\n__SAFE_PAGINATED_MAPPERS__\n    return paginated;\n  }\n}\n\n";
