@onn-software/ddl-to-gql
Version:
Convert a SQL DDL to a GraphQL implementation with all relations.
3 lines (2 loc) • 9.01 kB
TypeScript
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";