orchid-graphql 1.9.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/index.cjs +345 -492
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +144 -131
- package/dist/index.d.mts +205 -0
- package/dist/index.mjs +360 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +27 -18
- package/src/orm/orm.ts +34 -52
- package/LICENSE +0 -21
- package/dist/index.d.ts +0 -192
- package/dist/index.js +0 -481
- package/dist/index.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../base/src/utils/is-plain-object.ts","../../base/src/filter/filter.ts","../../base/src/paginators/cursor.ts","../../base/src/utils/run-after.ts","../../base/src/resolvers/field.ts","../../base/src/resolvers/graph.ts","../../base/src/resolvers/page.ts","../../base/src/resolvers/relation.ts","../../base/src/resolvers/table.ts","../src/orm/orm.ts","../src/filter.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["export * from \"./filter\"\nexport {\n\tcreateGraphResolver,\n\tcreateGraphResolver as graph,\n} from \"./resolvers/graph\"\nexport {\n\tdefineTableResolver,\n\tdefineTableResolver as table,\n} from \"./resolvers/table\"\nexport {\n\tdefineCursorPaginator as cursor,\n\tdefineCursorPaginator,\n} from \"graphql-orm\"\nexport { defineFieldResolver, defineFieldResolver as field } from \"graphql-orm\"\nexport { definePageResolver, definePageResolver as page } from \"graphql-orm\"\nexport {\n\tdefineRelationResolver,\n\tdefineRelationResolver as relation,\n} from \"graphql-orm\"\n","export function isPlainObject(obj: any): obj is Record<string, any> {\n\treturn typeof obj === \"object\" && !Array.isArray(obj)\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport { isPlainObject } from \"../utils/is-plain-object\"\n\n// TODO: per-field definitions\nexport type FilterConfig = boolean\n\nexport type FieldFilterScalarValue = null | string | number | boolean\nexport type FieldFilterValue = FieldFilterScalarValue | Exclude<FieldFilterScalarValue, null>[]\nexport type FilterValue = { [property: string]: FieldFilterValue }\n\nexport type FilterQueryOptions<Orm extends OrmAdapter, Context = unknown> = {\n\tmodifiers?: FilterModifiers<Orm, Context>\n} & (Context extends undefined ? {\n\tcontext?: Context\n} : {\n\tcontext: Context\n})\n\nexport type FilterModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tvalue: any,\n\tcontext: Context,\n) => Orm[\"Query\"]\n\nexport type FilterModifiers<Orm extends OrmAdapter, Context> = Record<string, FilterModifier<Orm, Context>>\n\nexport function filterQuery<Orm extends OrmAdapter, Context>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\tfilter: FilterValue,\n\toptions?: FilterQueryOptions<Orm, Context>,\n): Orm[\"Query\"] {\n\tconst { context, modifiers } = options ?? {}\n\n\tif (!filter) {\n\t\treturn query\n\t}\n\tif (!isPlainObject(filter)) {\n\t\tthrow new Error(`Invalid filter: ${filter}, must be plain object.`)\n\t}\n\tfor (const [field, value] of Object.entries(filter)) {\n\t\tif (value === undefined) {\n\t\t\t// Support optional GraphQL arguments in filter\n\t\t\tcontinue\n\t\t}\n\t\tif (modifiers?.[field]) {\n\t\t\tquery = modifiers[field](query, value, context!) // TODO improve types, get rid of !\n\t\t} else {\n\t\t\tconst [table_field, op0] = field.split(\"__\")\n\t\t\tconst op = op0?.toLowerCase()\n\t\t\t// TODO: validate op\n\t\t\tquery = orm.where(query, table_field, op, value)\n\t\t}\n\t}\n\treturn query\n}\n","import { Buffer } from \"node:buffer\"\n\nimport type { OrmAdapter, SortOrder } from \"../orm/orm\"\n\nimport type { PaginateContext, Paginator } from \"./base\"\n\nexport function defineCursorPaginator(\n\toptions: Partial<CursorPaginatorOptions> = {},\n) {\n\treturn new CursorPaginator(options)\n}\n\nexport interface CursorPaginatorOptions {\n\tfields?: string[]\n\ttake?: number\n}\n\nexport interface CursorPaginatorArgs {\n\tcursor?: string\n\ttake?: number\n}\n\nexport interface CursorPaginatorPage<M> {\n\tnodes: M[]\n\tcursor?: string\n}\n\nclass CursorPaginator<Orm extends OrmAdapter, Context>\nimplements Paginator<Orm, Context> {\n\treadonly path = [\"nodes\"]\n\n\treadonly pageSize: number\n\n\treadonly fields?: Array<{\n\t\tname: string\n\t\tdesc: boolean\n\t}>\n\n\tconstructor(options: CursorPaginatorOptions = {}) {\n\t\tthis.pageSize = options.take ?? 10\n\t\tthis.fields = options.fields?.map((field) => {\n\t\t\tif (field.startsWith(\"-\")) {\n\t\t\t\treturn { name: field.slice(1), desc: true }\n\t\t\t} else {\n\t\t\t\treturn { name: field, desc: false }\n\t\t\t}\n\t\t})\n\t}\n\n\tpaginate(query: Orm[\"Query\"], context: PaginateContext<Orm, Context>) {\n\t\tconst { orm } = context.graph\n\t\tconst { args } = context.tree\n\n\t\tconst pageSize = (args.take as number | undefined) ?? this.pageSize\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\tconst table = orm.get_query_table(query)\n\n\t\tconst orderFields = (\n\t\t\tthis.fields\n\t\t\t\t? this.fields.map<SortOrder>(f => ({\n\t\t\t\t\t\tfield: f.name,\n\t\t\t\t\t\tdir: f.desc ? \"DESC\" : \"ASC\",\n\t\t\t\t\t}))\n\t\t\t\t: orm.get_query_order(query)\n\t\t).map(o => ({ ...o, alias: \"_order_\" + o.field }))\n\n\t\tif (this.fields) {\n\t\t\tquery = orm.reset_query_order(query)\n\t\t\tfor (const { alias, dir } of orderFields) {\n\t\t\t\tquery = orm.add_query_order(query, { field: alias, dir })\n\t\t\t}\n\t\t}\n\n\t\tif (!orderFields.length) {\n\t\t\tthrow new Error(\"Query must be ordered.\")\n\t\t}\n\n\t\tfor (const { field, alias } of orderFields) {\n\t\t\tquery = orm.select_field(query, { field, as: alias })\n\t\t}\n\n\t\tif (cursor) {\n\t\t\tconst parsedCursor = parseCursor(cursor)\n\t\t\t// Prepare raw SQL.\n\t\t\t// For example, for (amount asc, id asc) order, that would be:\n\t\t\t// (amount, $id) >= ($amount, id)\n\t\t\tconst left: string[] = []\n\t\t\tconst right: string[] = []\n\t\t\tfor (let i = 0; i < orderFields.length; ++i) {\n\t\t\t\tconst { field, alias, dir } = orderFields[i]\n\t\t\t\tconst [expressions, placeholders]\n\t\t\t\t\t= dir === \"ASC\" ? [left, right] : [right, left]\n\t\t\t\texpressions.push(`\"${table}\".\"${field}\"`)\n\t\t\t\tplaceholders.push(\"$\" + alias)\n\t\t\t}\n\t\t\tconst sqlExpr = `(${left.join(\",\")}) > (${right.join(\",\")})`\n\t\t\tconst bindings = Object.fromEntries(\n\t\t\t\torderFields.map(({ alias }, i) => [alias, parsedCursor[i]]),\n\t\t\t)\n\t\t\tquery = orm.where_raw(query, sqlExpr, bindings)\n\t\t}\n\t\tquery = orm.set_query_limit(query, pageSize + 1)\n\n\t\t// TODO add support for reverse cursor, borrow implementation from orchid-pagination.\n\t\tfunction createNodeCursor(node: any) {\n\t\t\treturn createCursor(\n\t\t\t\torderFields.map(({ field, alias }) => {\n\t\t\t\t\tconst value = node[alias]\n\t\t\t\t\t// TODO add support for custom serializer(s).\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Unable to create cursor: undefined field ${field} (${alias})`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn String(value)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\treturn orm.set_query_page_result(query, (nodes) => {\n\t\t\tlet cursor: string | undefined\n\t\t\tif (nodes.length > pageSize) {\n\t\t\t\tcursor = createNodeCursor(nodes[pageSize - 1])\n\t\t\t\tnodes = nodes.slice(0, pageSize)\n\t\t\t}\n\t\t\treturn { nodes, cursor }\n\t\t})\n\t}\n}\n\nfunction createCursor(parts: string[]) {\n\treturn Buffer.from(parts.map(String).join(String.fromCharCode(0))).toString(\n\t\t\"base64url\",\n\t)\n}\n\nfunction parseCursor(cursor: string): string[] {\n\treturn Buffer.from(cursor, \"base64url\")\n\t\t.toString()\n\t\t.split(String.fromCharCode(0))\n}\n","import type { OrmAdapter } from \"../orm/orm\"\n\nexport function run_after_query<Orm extends OrmAdapter>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\ttransform: (instance: any) => any,\n): Orm[\"Query\"] {\n\treturn orm.run_after_query(query, async (result) => {\n\t\t// FIXME: returning result is ignored in orchid (unlike objection). Add some hacks instead.\n\t\tif (Array.isArray(result)) {\n\t\t\tconst result1 = await Promise.all(result.map(transform))\n\t\t\treturn result1.filter(Boolean) // Skip empty objects\n\t\t} else if (result) {\n\t\t\treturn transform(result)\n\t\t} else {\n\t\t\t// Supposedly, single query returning NULL\n\t\t\treturn result\n\t\t}\n\t})\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\n\nimport type { TableResolveContext } from \"./table\"\n\nexport interface FieldResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** Table field (if different from GraphQL field) */\n\ttableField?: string\n\t/** Legacy alias for `tableField`. */\n\tmodelField?: string\n\t/** Custom query modifier (if different than simply selecting a field). */\n\tmodify?: FieldResolveModifier<Orm, Context>\n\t/** Post-process selected value. Return a new value or a promise. */\n\ttransform?(\n\t\tvalue: any,\n\t\tinstance: any,\n\t\tcontext: FieldResolveContext<Orm, Context>,\n\t): any\n}\n\nexport type FieldResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: FieldResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface FieldResolveContext<Orm extends OrmAdapter, Context>\n\textends TableResolveContext<Orm, Context> {\n\t/** GraphQL field */\n\tfield: string\n}\n\n// That is a coincidence for now.\nexport type FieldResolver<\n\tOrm extends OrmAdapter,\n\tContext,\n> = FieldResolveModifier<Orm, Context>\n\nexport function parse_field_options<\n\tO extends Pick<FieldResolverOptions<any, any>, \"modelField\" | \"tableField\">,\n>(options: O): Omit<O, \"modelField\"> {\n\tconst { tableField, modelField } = options\n\tif (tableField && modelField) {\n\t\tthrow new Error(\n\t\t\t`Both tableField and modelField are defined. Use only one of them.`,\n\t\t)\n\t}\n\treturn { ...options, tableField: tableField || modelField }\n}\n\nexport function defineFieldResolver<Orm extends OrmAdapter, Context>(\n\toptions: FieldResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify, transform } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { field } = context\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t} else {\n\t\t\tquery = context.graph.orm.select_field(query, {\n\t\t\t\tfield: tableField || field,\n\t\t\t\tas: field,\n\t\t\t})\n\t\t}\n\t\tif (transform) {\n\t\t\tquery = run_after_query(context.graph.orm, query, async (instance) => {\n\t\t\t\tinstance[field] = await transform(instance[field], instance, context)\n\t\t\t\treturn instance\n\t\t\t})\n\t\t}\n\t\treturn query\n\t}\n}\n","import type { GraphQLResolveInfo } from \"graphql\"\nimport type { ResolveTree } from \"graphql-parse-resolve-info\"\nimport { parseResolveInfo } from \"graphql-parse-resolve-info\"\n\nimport type { FilterConfig } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\nimport type { Paginator } from \"../paginators/base\"\n\nimport type { TableResolver, TableResolverOptions } from \"./table\"\n\nexport type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<\n\tTableResolverOptions<Orm, Context>,\n\t\"allowAllFields\" | \"allowAllFilters\"\n>\n\nexport interface GraphResolveOptions<Context> {\n\tinfo: GraphQLResolveInfo\n\tcontext: Context\n\tfilters?: FilterConfig\n\t/** Subfield path if not resolving root query, e.g.: ['user'] */\n\tpath?: string[]\n}\n\nexport type GraphResolveContext<Context> = Omit<\n\tGraphResolveOptions<Context>,\n\t\"info\"\n> & {\n\ttree: ResolveTree\n}\n\nexport class GraphResolver<Orm extends OrmAdapter, Context> {\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly type_resolvers: Record<string, TableResolver<Orm, Context>>,\n\t\treadonly options: GraphResolverOptions<Orm, Context> = {},\n\t) {}\n\n\tresolve<T>(\n\t\tquery: Orm[\"Query\"],\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t): Promise<T> {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_type(query, { ...context, tree })\n\t}\n\n\tresolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_page(query, paginator, { ...context, tree })\n\t}\n\n\t_get_resolve_tree(info: GraphQLResolveInfo) {\n\t\treturn parseResolveInfo(info) as ResolveTree\n\t}\n\n\t_resolve_type(\n\t\tquery: Orm[\"Query\"],\n\t\tcontext: GraphResolveContext<Context>,\n\t): Orm[\"Query\"] {\n\t\tlet { tree } = context\n\t\t// Dive into subtree if requested.\n\t\tif (context.path) {\n\t\t\tfor (const field of context.path) {\n\t\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t\tif (!tree) {\n\t\t\t\t\t// This graphql field was never requested, ignore.\n\t\t\t\t\t// This happens when a user resolves a graph for a root subfield which was not requested by the client (and is thus not present in the tree).\n\t\t\t\t\t//\n\t\t\t\t\t// FIXME: this break typings contract. We are supposed to return a query.\n\t\t\t\t\treturn Promise.resolve()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\tconst type_resolver = this.type_resolvers[type]\n\t\tif (!type_resolver) {\n\t\t\tthrow new Error(`Resolver not found for type ${type}.`)\n\t\t}\n\t\treturn type_resolver.resolve(query, {\n\t\t\t...context,\n\t\t\tgraph: this,\n\t\t\ttree,\n\t\t\ttype,\n\t\t\tpath: undefined,\n\t\t})\n\t}\n\n\t_resolve_page(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\tcontext: GraphResolveContext<Context>,\n\t) {\n\t\tif (context.path) {\n\t\t\t// TODO: handle non-empty context.path\n\t\t\tthrow new Error(\"Paginating under non-root path not yet supported.\")\n\t\t}\n\t\tquery = this._resolve_type(query, { ...context, path: paginator.path })\n\t\treturn paginator.paginate(query, {\n\t\t\t...context,\n\t\t\tgraph: this,\n\t\t})\n\t}\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport type { Paginator } from \"../paginators/base\"\n\nimport type { FieldResolver } from \"./field\"\nimport { parse_field_options } from \"./field\"\nimport type { RelationResolverOptions } from \"./relation\"\n\nexport function definePageResolver<Orm extends OrmAdapter, Context>(\n\tpaginator: Paginator<Orm, Context>,\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\t// Objection.js requires a workaround to handle paginated content,\n\t\t// it must be saved into context and re-injected later.\n\t\t// The modify + finish is a no-op in Orchid.\n\t\tconst pagination_context = {}\n\t\tquery = graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = modify ? modify(subquery, context) : subquery\n\t\t\t\tsubquery = graph._resolve_page(subquery, paginator, context)\n\t\t\t\tsubquery = graph.orm.modify_subquery_pagination(\n\t\t\t\t\tsubquery,\n\t\t\t\t\tpagination_context,\n\t\t\t\t)\n\t\t\t\treturn subquery\n\t\t\t},\n\t\t})\n\t\tquery = graph.orm.finish_query_pagination(query, field, pagination_context)\n\t\treturn query\n\t}\n}\n","import type { FilterConfig } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\n\nimport type {\n\tFieldResolver,\n\tFieldResolverOptions,\n} from \"./field\"\nimport { parse_field_options } from \"./field\"\nimport type { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Orm extends OrmAdapter, Context>\n\textends Omit<FieldResolverOptions<Orm, Context>, \"modify\"> {\n\tfilters?: FilterConfig\n\tmodify?: TableResolveModifier<Orm, Context>\n}\n\nexport function defineRelationResolver<Orm extends OrmAdapter, Context>(\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, filters, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\treturn graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolve_type(subquery, { ...context, filters })\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t}\n}\n","import type { FilterModifier, FilterValue } from \"../filter\"\nimport { filterQuery } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\n\nimport type { FieldResolver } from \"./field\"\nimport { defineFieldResolver } from \"./field\"\nimport type { GraphResolveContext, GraphResolver } from \"./graph\"\nimport { defineRelationResolver } from \"./relation\"\n\nexport interface TableResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** allow to resolve all table fields without explicitly listing them */\n\tallowAllFields?: boolean\n\t/** allow to filter all table fields without explicitly listing them */\n\tallowAllFilters?: boolean\n\tfields?: Record<string, SimpleFieldResolver<Orm, Context>>\n\tmodifiers?: Record<string, TableFilterModifier<Orm, Context>>\n\tmodify?: TableResolveModifier<Orm, Context>\n\ttransform?(instance: any, context: any): void | PromiseLike<void>\n}\n\nexport type SimpleFieldResolver<Orm extends OrmAdapter, Context>\n\t= | true\n\t\t| string\n\t\t| FieldResolver<Orm, Context>\n\nexport type TableResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface TableResolveContext<Orm extends OrmAdapter, Context>\n\textends GraphResolveContext<Context> {\n\tgraph: GraphResolver<Orm, Context>\n\t/** GraphQL type */\n\ttype: string\n}\n\nexport type TableFilterModifier<Orm extends OrmAdapter, Context> = FilterModifier<Orm, TableResolveContext<Orm, Context>>\n\nexport class TableResolver<Orm extends OrmAdapter, Context> {\n\t// Introspection results\n\treadonly relations: Set<string>\n\treadonly virtual_fields: Set<string>\n\treadonly modifiers?: Record<string, TableFilterModifier<Orm, Context>>\n\n\treadonly table_field_resolvers?: Record<string, FieldResolver<Orm, Context>>\n\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly table: Orm[\"Table\"],\n\t\treadonly options: TableResolverOptions<Orm, Context> = {},\n\t) {\n\t\tthis.relations = new Set(orm.get_table_relations(table))\n\t\tthis.virtual_fields = new Set(orm.get_table_virtual_fields(table))\n\t\tthis.modifiers = { ...orm.get_table_modifiers(table), ...options.modifiers }\n\n\t\t// Pre-create field resolvers\n\t\tconst { fields } = options\n\t\tif (fields) {\n\t\t\tthis.table_field_resolvers = Object.keys(fields).reduce<\n\t\t\t\tRecord<string, FieldResolver<Orm, Context>>\n\t\t\t>((resolvers, field) => {\n\t\t\t\tconst r0 = fields[field]\n\t\t\t\tconst r: FieldResolver<Orm, Context> | undefined\n\t\t\t\t\t= typeof r0 === \"function\"\n\t\t\t\t\t\t? r0\n\t\t\t\t\t\t: r0 === true\n\t\t\t\t\t\t\t? this._get_default_field_resolver(field)\n\t\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t\t\t? this._get_default_field_resolver(field, r0)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\tif (r === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Field resolver must be a function, string, or true; found ${typeof r0}.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tresolvers[field] = r\n\t\t\t\treturn resolvers\n\t\t\t}, {})\n\t\t}\n\t}\n\n\t/** Modify query to select fields/relations and filter the result set. */\n\tresolve(query: Orm[\"Query\"], context: TableResolveContext<Orm, Context>) {\n\t\tconst { modify, transform } = this.options\n\t\tconst { graph, tree, type, filters } = context\n\n\t\tconst query_table = this.orm.get_query_table(query)\n\t\tconst table_table = this.orm.get_table_table(this.table)\n\n\t\tif (query_table !== table_table) {\n\t\t\tthrow new Error(\n\t\t\t\t`Mismatching query table for type ${type}: expected ${table_table}, received ${query_table}.`,\n\t\t\t)\n\t\t}\n\n\t\tconst allow_all_fields\n\t\t\t= this.options.allowAllFields\n\t\t\t\t?? graph.options.allowAllFields\n\t\t\t\t?? !this.options.fields\n\n\t\tif (!allow_all_fields && !this.table_field_resolvers) {\n\t\t\tthrow new Error(\n\t\t\t\t`Resolver for type ${type} must either allow all fields or specify options.fields.`,\n\t\t\t)\n\t\t}\n\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t}\n\n\t\tfor (const subtree of Object.values(tree.fieldsByTypeName[type])) {\n\t\t\tconst field = subtree.name\n\t\t\tconst r: FieldResolver<Orm, Context> | undefined\n\t\t\t\t= this.table_field_resolvers?.[field]\n\t\t\t\t\t|| (allow_all_fields ? this._get_default_field_resolver(field) : undefined)\n\t\t\tif (!r) {\n\t\t\t\tthrow new Error(`No field resolver defined for field ${type}.${field}.`)\n\t\t\t}\n\t\t\tif (r) {\n\t\t\t\tquery = r(query, { ...context, tree: subtree, field })\n\t\t\t}\n\t\t}\n\n\t\tconst filter = context.tree.args?.filter\n\t\tif (filter) {\n\t\t\tconst allowAllFilters = this.options.allowAllFilters ?? graph.options.allowAllFilters\n\t\t\tconst filterConfig = allowAllFilters ? true : filters\n\n\t\t\tif (filterConfig) {\n\t\t\t\tquery = filterQuery<Orm, TableResolveContext<Orm, Context>>(context.graph.orm, query, filter as FilterValue, {\n\t\t\t\t\tmodifiers: this.modifiers,\n\t\t\t\t\tcontext,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tif (transform) {\n\t\t\tquery = run_after_query(this.orm, query, (instance) => {\n\t\t\t\treturn transform(instance, context)\n\t\t\t})\n\t\t}\n\n\t\tquery = this.orm.prevent_select_all(query)\n\n\t\treturn query\n\t}\n\n\t/**\n\t * Create field resolver which will modify query to resolve GraphQL field.\n\t */\n\t_get_default_field_resolver(\n\t\tfield: string,\n\t\ttableField?: string,\n\t): FieldResolver<Orm, Context> {\n\t\tconst table_field_lookup = tableField || field\n\t\tif (\n\t\t\tthis.options.modifiers?.[table_field_lookup]\n\t\t\t|| this.virtual_fields.has(table_field_lookup)\n\t\t) {\n\t\t\t// Keep query as is.\n\t\t\treturn query => query\n\t\t} else if (this.relations.has(table_field_lookup)) {\n\t\t\t// TODO: pre-create and cache\n\t\t\treturn defineRelationResolver({ tableField })\n\t\t} else {\n\t\t\t// TODO: create simplified resolver?\n\t\t\treturn defineFieldResolver({ tableField })\n\t\t}\n\t}\n}\n","import type { OrmAdapter, SortOrder } from \"graphql-orm\"\nimport type { Query, SelectQueryData, Table } from \"orchid-orm\"\nimport { raw } from \"orchid-orm\"\n\nexport type OrchidOrm = OrmAdapter<\n\tTable,\n\tQuery,\n\t// TODO: Type as QueryTransform once it's published.\n\tPick<Promise<any>, \"then\" | \"catch\">\n>\n\nexport const orm: OrchidOrm = {\n\tTable: undefined as unknown as OrchidOrm[\"Table\"],\n\tQuery: undefined as unknown as OrchidOrm[\"Query\"],\n\tQueryTransform: undefined as unknown as OrchidOrm[\"QueryTransform\"],\n\n\t// Reflection\n\n\tget_table_table(table) {\n\t\treturn table.table!\n\t},\n\n\tget_table_relations(table) {\n\t\treturn Object.keys(table.relations)\n\t},\n\n\tget_table_virtual_fields() {\n\t\t// Not supported by Orchid.\n\t\treturn []\n\t},\n\n\tget_table_modifiers() {\n\t\treturn undefined\n\t},\n\n\tget_query_table(query) {\n\t\tif (!query.table) {\n\t\t\tthrow new Error(\"Query must have table.\")\n\t\t}\n\t\treturn query.table\n\t},\n\n\t// Select\n\n\tselect_field(query, { field, as }) {\n\t\treturn query.select({ [as]: field })\n\t},\n\n\tselect_relation(query, { relation, as, modify }) {\n\t\t// as any casts needed in orchid-orm 1.31+\n\t\treturn query.select({\n\t\t\t[as]: (q: any) => modify(q[relation]),\n\t\t} as any)\n\t},\n\n\t// Find\n\n\twhere(query, field, op, value) {\n\t\treturn query.where({ [field]: op ? { [op]: value } : value })\n\t},\n\n\twhere_raw(query, expression, bindings) {\n\t\treturn query.where(raw({ raw: expression, values: bindings }))\n\t},\n\n\t// Order & Limit\n\n\treset_query_order(query) {\n\t\treturn query.clear(\"order\")\n\t},\n\n\tadd_query_order(query, { field, dir }) {\n\t\treturn query.order({ [field]: dir })\n\t},\n\n\tget_query_order(query) {\n\t\treturn (\n\t\t\t(query.q as SelectQueryData).order?.flatMap<SortOrder>((orderItem) => {\n\t\t\t\tif (typeof orderItem === \"string\") {\n\t\t\t\t\treturn { field: \"orderItem\", dir: \"ASC\" }\n\t\t\t\t} else if (typeof orderItem === \"object\") {\n\t\t\t\t\treturn Object.entries(orderItem).map<SortOrder>(([field, order]) => {\n\t\t\t\t\t\tconst [dir] = order.split(\" \", 1)\n\t\t\t\t\t\tif (dir === \"ASC\" || dir === \"DESC\") {\n\t\t\t\t\t\t\treturn { field, dir }\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(\"Unsupported order: \" + order)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError(\"Unsupported order type: \" + orderItem)\n\t\t\t\t}\n\t\t\t}) || []\n\t\t)\n\t},\n\n\tset_query_limit(query, limit) {\n\t\treturn query.limit(limit)\n\t},\n\n\t// Pagination helpers\n\n\tset_query_page_result(query, get_page) {\n\t\treturn query.transform(nodes => get_page(nodes as any))\n\t},\n\n\tmodify_subquery_pagination(subquery) {\n\t\treturn subquery\n\t},\n\n\tfinish_query_pagination(query) {\n\t\treturn query\n\t},\n\n\t// Misc\n\n\trun_after_query(query, fn) {\n\t\treturn query.afterQuery(data => fn(data))\n\t},\n\n\tprevent_select_all(query) {\n\t\t// Not needed in Orchid\n\t\treturn query\n\t},\n}\n","import type {\n\tFilterModifier as _FilterModifier,\n\tFilterModifiers as _FilterModifiers,\n\tFilterQueryOptions as _FilterQueryOptions,\n\tFilterValue,\n} from \"graphql-orm\"\nimport { filterQuery as _filterQuery } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\n\nimport { orm } from \"./orm/orm\"\nimport type { OrchidOrm } from \"./orm/orm\"\n\nexport { FilterValue }\n\nexport type FilterQueryOptions<Context = undefined> = _FilterQueryOptions<OrchidOrm, Context>\n\nexport type FilterModifier<Context = undefined> = _FilterModifier<OrchidOrm, Context>\nexport type FilterModifiers<Context = undefined> = _FilterModifiers<OrchidOrm, Context>\n\nexport function filterQuery<Q extends Query, Context = undefined>(\n\tquery: Q,\n\tfilter: FilterValue,\n\toptions?: FilterQueryOptions<Context>,\n): Q {\n\treturn _filterQuery(orm, query, filter, options) as Q\n}\n","import type {\n\tGraphResolveOptions,\n\tGraphResolverOptions,\n\tTableResolver,\n} from \"graphql-orm\"\nimport { GraphResolver } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\n\nimport type { OrchidOrm } from \"../orm/orm\"\nimport { orm } from \"../orm/orm\"\n\nexport function createGraphResolver<Context = unknown>(\n\ttypes: Record<string, TableResolver<OrchidOrm, Context>>,\n\toptions?: GraphResolverOptions<OrchidOrm, Context>,\n) {\n\treturn new OrchidGraphResolver<Context>(types, options)\n}\n\nclass OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Context> {\n\tconstructor(\n\t\tpublic readonly types: Record<string, TableResolver<OrchidOrm, Context>>,\n\t\tpublic readonly options: GraphResolverOptions<OrchidOrm, Context> = {},\n\t) {\n\t\tsuper(orm, types, options)\n\t}\n\n\tresolve<T>(\n\t\tquery: Query & {\n\t\t\treturnType: unknown extends T\n\t\t\t\t? any\n\t\t\t\t: T extends unknown[]\n\t\t\t\t\t? undefined | \"all\"\n\t\t\t\t\t: T extends undefined\n\t\t\t\t\t\t? \"one\"\n\t\t\t\t\t\t: \"oneOrThrow\"\n\t\t},\n\t\toptions: GraphResolveOptions<Context>,\n\t): Promise<T> {\n\t\treturn super.resolve(query, options)\n\t}\n}\n","import type { TableResolverOptions } from \"graphql-orm\"\nimport { TableResolver } from \"graphql-orm\"\nimport type { Table } from \"orchid-orm\"\n\nimport type { OrchidOrm } from \"../orm/orm\"\nimport { orm } from \"../orm/orm\"\n\nexport function defineTableResolver<Context = unknown>(\n\ttable: Table,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {},\n) {\n\treturn new TableResolver(orm, table as any, options)\n}\n"],"mappings":"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","names":["filterQuery","orm","orm","cursor","orm","orm","type","orm","filterQuery"]}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["filterQuery","parseResolveInfo","filterQuery","prepareOrchidCursorPagination","_filterQuery"],"sources":["../../base/src/utils/is-plain-object.ts","../../base/src/filter/filter.ts","../../base/src/paginators/cursor.ts","../../base/src/utils/run-after.ts","../../base/src/resolvers/field.ts","../../base/src/resolvers/graph.ts","../../base/src/resolvers/page.ts","../../base/src/resolvers/relation.ts","../../base/src/resolvers/table.ts","../src/orm/orm.ts","../src/filter.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["export function isPlainObject(obj: any): obj is Record<string, any> {\n\treturn typeof obj === \"object\" && !Array.isArray(obj)\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport { isPlainObject } from \"../utils/is-plain-object\"\n\n// TODO: per-field definitions\nexport type FilterConfig = boolean\n\nexport type FieldFilterScalarValue = null | string | number | boolean\nexport type FieldFilterValue = FieldFilterScalarValue | Exclude<FieldFilterScalarValue, null>[]\nexport type FilterValue = { [property: string]: FieldFilterValue } | null | undefined\n\nexport type FilterQueryOptions<Orm extends OrmAdapter, Context = unknown> = {\n\tmodifiers?: FilterModifiers<Orm, Context>\n} & (Context extends undefined ? {\n\tcontext?: Context\n} : {\n\tcontext: Context\n})\n\nexport type FilterModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tvalue: any,\n\tcontext: Context,\n) => Orm[\"Query\"]\n\nexport type FilterModifiers<Orm extends OrmAdapter, Context> = Record<string, FilterModifier<Orm, Context>>\n\nexport function filterQuery<Orm extends OrmAdapter, Context>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\tfilter: FilterValue,\n\toptions?: FilterQueryOptions<Orm, Context>,\n): Orm[\"Query\"] {\n\tconst { context, modifiers } = options ?? {}\n\n\tif (!filter) {\n\t\treturn query\n\t}\n\tif (!isPlainObject(filter)) {\n\t\tthrow new Error(`Invalid filter: ${filter}, must be plain object.`)\n\t}\n\tfor (const [field, value] of Object.entries(filter)) {\n\t\tif (value === undefined) {\n\t\t\t// Support optional GraphQL arguments in filter\n\t\t\tcontinue\n\t\t}\n\t\tif (modifiers?.[field]) {\n\t\t\tquery = modifiers[field](query, value, context!) // TODO improve types, get rid of !\n\t\t} else {\n\t\t\tconst [tableField, op0] = field.split(\"__\")\n\t\t\tconst op = op0?.toLowerCase()\n\t\t\t// TODO: validate op\n\t\t\tquery = orm.where(query, tableField, op, value)\n\t\t}\n\t}\n\treturn query\n}\n","import type { OrmAdapter, SortOrder } from \"../orm/orm\"\n\nimport type { PaginateContext, Paginator } from \"./base\"\n\nexport function defineCursorPaginator(\n\toptions: Partial<CursorPaginatorOptions> = {},\n) {\n\treturn new CursorPaginator(options)\n}\n\nexport interface CursorPaginatorOptions {\n\tfields?: string[]\n\ttake?: number\n}\n\nexport interface CursorPaginatorArgs {\n\tcursor?: string\n\ttake?: number\n}\n\nexport interface CursorPaginatorPage<M> {\n\tnodes: M[]\n\tcursor?: string\n}\n\nclass CursorPaginator<Orm extends OrmAdapter, Context>\nimplements Paginator<Orm, Context> {\n\treadonly path = [\"nodes\"]\n\n\treadonly pageSize: number\n\n\treadonly fields?: SortOrder[]\n\n\tconstructor(options: CursorPaginatorOptions = {}) {\n\t\tthis.pageSize = options.take ?? 10\n\t\tthis.fields = options.fields?.map((field) => {\n\t\t\tif (field.startsWith(\"-\")) {\n\t\t\t\treturn { field: field.slice(1), dir: \"DESC\" }\n\t\t\t} else {\n\t\t\t\treturn { field, dir: \"ASC\" }\n\t\t\t}\n\t\t})\n\t}\n\n\tpaginate(query: Orm[\"Query\"], context: PaginateContext<Orm, Context>) {\n\t\tconst { orm } = context.graph\n\t\tconst { args } = context.tree\n\n\t\tconst pageSize = (args.take as number | undefined) ?? this.pageSize\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\tconst prepared = orm.prepareCursorPagination(query, {\n\t\t\tcursor,\n\t\t\tfields: this.fields,\n\t\t\tlimit: pageSize,\n\t\t})\n\t\treturn orm.setQueryPageResult(prepared.query, prepared.getPage)\n\t}\n}\n","import type { OrmAdapter } from \"../orm/orm\"\n\nexport function runAfterQuery<Orm extends OrmAdapter>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\ttransform: (instance: any) => any,\n): Orm[\"Query\"] {\n\treturn orm.runAfterQuery(query, async (result) => {\n\t\t// FIXME: returning result is ignored in orchid (unlike objection). Add some hacks instead.\n\t\tif (Array.isArray(result)) {\n\t\t\tconst result1 = await Promise.all(result.map(transform))\n\t\t\treturn result1.filter(Boolean) // Skip empty objects\n\t\t} else if (result) {\n\t\t\treturn transform(result)\n\t\t} else {\n\t\t\t// Supposedly, single query returning NULL\n\t\t\treturn result\n\t\t}\n\t})\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport { runAfterQuery } from \"../utils/run-after\"\n\nimport type { TableResolveContext } from \"./table\"\n\nexport interface FieldResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** Table field (if different from GraphQL field) */\n\ttableField?: string\n\t/** Legacy alias for `tableField`. */\n\tmodelField?: string\n\t/** Custom query modifier (if different than simply selecting a field). */\n\tmodify?: FieldResolveModifier<Orm, Context>\n\t/** Post-process selected value. Return a new value or a promise. */\n\ttransform?(\n\t\tvalue: any,\n\t\tinstance: any,\n\t\tcontext: FieldResolveContext<Orm, Context>,\n\t): any\n}\n\nexport type FieldResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: FieldResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface FieldResolveContext<Orm extends OrmAdapter, Context>\n\textends TableResolveContext<Orm, Context> {\n\t/** GraphQL field */\n\tfield: string\n}\n\n// That is a coincidence for now.\nexport type FieldResolver<\n\tOrm extends OrmAdapter,\n\tContext,\n> = FieldResolveModifier<Orm, Context>\n\nexport function parseFieldOptions<\n\tO extends Pick<FieldResolverOptions<any, any>, \"modelField\" | \"tableField\">,\n>(options: O): Omit<O, \"modelField\"> {\n\tconst { tableField, modelField } = options\n\tif (tableField && modelField) {\n\t\tthrow new Error(\n\t\t\t`Both tableField and modelField are defined. Use only one of them.`,\n\t\t)\n\t}\n\treturn { ...options, tableField: tableField || modelField }\n}\n\nexport function defineFieldResolver<Orm extends OrmAdapter, Context>(\n\toptions: FieldResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify, transform } = parseFieldOptions(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { field } = context\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t} else {\n\t\t\tquery = context.graph.orm.selectField(query, {\n\t\t\t\tfield: tableField || field,\n\t\t\t\tas: field,\n\t\t\t})\n\t\t}\n\t\tif (transform) {\n\t\t\tquery = runAfterQuery(context.graph.orm, query, async (instance) => {\n\t\t\t\tinstance[field] = await transform(instance[field], instance, context)\n\t\t\t\treturn instance\n\t\t\t})\n\t\t}\n\t\treturn query\n\t}\n}\n","import type { GraphQLResolveInfo } from \"graphql\"\nimport type { ResolveTree } from \"graphql-parse-resolve-info\"\nimport { parseResolveInfo } from \"graphql-parse-resolve-info\"\n\nimport type { FilterConfig } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\nimport type { Paginator } from \"../paginators/base\"\n\nimport type { TableResolver, TableResolverOptions } from \"./table\"\n\nexport type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<\n\tTableResolverOptions<Orm, Context>,\n\t\"allowAllFields\" | \"allowAllFilters\"\n>\n\nexport interface GraphResolveOptions<Context> {\n\tinfo: GraphQLResolveInfo\n\tcontext: Context\n\tfilters?: FilterConfig\n\t/** Subfield path if not resolving root query, e.g.: ['user'] */\n\tpath?: string[]\n}\n\nexport type GraphResolveContext<Context> = Omit<\n\tGraphResolveOptions<Context>,\n\t\"info\"\n> & {\n\ttree: ResolveTree\n}\n\nexport class GraphResolver<Orm extends OrmAdapter, Context> {\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly typeResolvers: Record<string, TableResolver<Orm, Context>>,\n\t\treadonly options: GraphResolverOptions<Orm, Context> = {},\n\t) {}\n\n\tresolve<T>(\n\t\tquery: Orm[\"Query\"],\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t): Promise<T> {\n\t\tconst tree = this._getResolveTree(info)\n\t\treturn this._resolveType(query, { ...context, tree })\n\t}\n\n\tresolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t) {\n\t\tconst tree = this._getResolveTree(info)\n\t\treturn this._resolvePage(query, paginator, { ...context, tree })\n\t}\n\n\t_getResolveTree(info: GraphQLResolveInfo) {\n\t\treturn parseResolveInfo(info) as ResolveTree\n\t}\n\n\t_resolveType(\n\t\tquery: Orm[\"Query\"],\n\t\tcontext: GraphResolveContext<Context>,\n\t): Orm[\"Query\"] {\n\t\tlet { tree } = context\n\t\t// Dive into subtree if requested.\n\t\tif (context.path) {\n\t\t\tfor (const field of context.path) {\n\t\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t\tif (!tree) {\n\t\t\t\t\t// This graphql field was never requested, ignore.\n\t\t\t\t\t// This happens when a user resolves a graph for a root subfield which was not requested by the client (and is thus not present in the tree).\n\t\t\t\t\t//\n\t\t\t\t\t// FIXME: this break typings contract. We are supposed to return a query.\n\t\t\t\t\treturn Promise.resolve()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\tconst typeResolver = this.typeResolvers[type]\n\t\tif (!typeResolver) {\n\t\t\tthrow new Error(`Resolver not found for type ${type}.`)\n\t\t}\n\t\treturn typeResolver.resolve(query, {\n\t\t\t...context,\n\t\t\tgraph: this,\n\t\t\ttree,\n\t\t\ttype,\n\t\t\tpath: undefined,\n\t\t})\n\t}\n\n\t_resolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\tcontext: GraphResolveContext<Context>,\n\t) {\n\t\tif (context.path) {\n\t\t\t// TODO: handle non-empty context.path\n\t\t\tthrow new Error(\"Paginating under non-root path not yet supported.\")\n\t\t}\n\t\tquery = this._resolveType(query, { ...context, path: paginator.path })\n\t\treturn paginator.paginate(query, {\n\t\t\t...context,\n\t\t\tgraph: this,\n\t\t})\n\t}\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport type { Paginator } from \"../paginators/base\"\n\nimport type { FieldResolver } from \"./field\"\nimport { parseFieldOptions } from \"./field\"\nimport type { RelationResolverOptions } from \"./relation\"\n\nexport function definePageResolver<Orm extends OrmAdapter, Context>(\n\tpaginator: Paginator<Orm, Context>,\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify } = parseFieldOptions(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\t// Objection.js requires a workaround to handle paginated content,\n\t\t// it must be saved into context and re-injected later.\n\t\t// The modify + finish is a no-op in Orchid.\n\t\tconst paginationContext = {}\n\t\tquery = graph.orm.selectRelation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = modify ? modify(subquery, context) : subquery\n\t\t\t\tsubquery = graph._resolvePage(subquery, paginator, context)\n\t\t\t\tsubquery = graph.orm.modifySubqueryPagination(\n\t\t\t\t\tsubquery,\n\t\t\t\t\tpaginationContext,\n\t\t\t\t)\n\t\t\t\treturn subquery\n\t\t\t},\n\t\t})\n\t\tquery = graph.orm.finishQueryPagination(query, field, paginationContext)\n\t\treturn query\n\t}\n}\n","import type { FilterConfig } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\n\nimport type {\n\tFieldResolver,\n\tFieldResolverOptions,\n} from \"./field\"\nimport { parseFieldOptions } from \"./field\"\nimport type { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Orm extends OrmAdapter, Context>\n\textends Omit<FieldResolverOptions<Orm, Context>, \"modify\"> {\n\tfilters?: FilterConfig\n\tmodify?: TableResolveModifier<Orm, Context>\n}\n\nexport function defineRelationResolver<Orm extends OrmAdapter, Context>(\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, filters, modify } = parseFieldOptions(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\treturn graph.orm.selectRelation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolveType(subquery, { ...context, filters })\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t}\n}\n","import type { FilterModifier, FilterValue } from \"../filter\"\nimport { filterQuery } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\nimport { runAfterQuery } from \"../utils/run-after\"\n\nimport type { FieldResolver } from \"./field\"\nimport { defineFieldResolver } from \"./field\"\nimport type { GraphResolveContext, GraphResolver } from \"./graph\"\nimport { defineRelationResolver } from \"./relation\"\n\nexport interface TableResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** allow to resolve all table fields without explicitly listing them */\n\tallowAllFields?: boolean\n\t/** allow to filter all table fields without explicitly listing them */\n\tallowAllFilters?: boolean\n\tfields?: Record<string, SimpleFieldResolver<Orm, Context>>\n\tmodifiers?: Record<string, TableFilterModifier<Orm, Context>>\n\tmodify?: TableResolveModifier<Orm, Context>\n\ttransform?(instance: any, context: any): void | PromiseLike<void>\n}\n\nexport type SimpleFieldResolver<Orm extends OrmAdapter, Context>\n\t= | true\n\t\t| string\n\t\t| FieldResolver<Orm, Context>\n\nexport type TableResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface TableResolveContext<Orm extends OrmAdapter, Context>\n\textends GraphResolveContext<Context> {\n\tgraph: GraphResolver<Orm, Context>\n\t/** GraphQL type */\n\ttype: string\n}\n\nexport type TableFilterModifier<Orm extends OrmAdapter, Context> = FilterModifier<Orm, TableResolveContext<Orm, Context>>\n\nexport class TableResolver<Orm extends OrmAdapter, Context> {\n\t// Introspection results\n\treadonly relations: Set<string>\n\treadonly virtualFields: Set<string>\n\treadonly modifiers?: Record<string, TableFilterModifier<Orm, Context>>\n\n\treadonly tableFieldResolvers?: Record<string, FieldResolver<Orm, Context>>\n\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly table: Orm[\"Table\"],\n\t\treadonly options: TableResolverOptions<Orm, Context> = {},\n\t) {\n\t\tthis.relations = new Set(orm.getTableRelations(table))\n\t\tthis.virtualFields = new Set(orm.getTableVirtualFields(table))\n\t\tthis.modifiers = { ...orm.getTableModifiers(table), ...options.modifiers }\n\n\t\t// Pre-create field resolvers\n\t\tconst { fields } = options\n\t\tif (fields) {\n\t\t\tthis.tableFieldResolvers = Object.keys(fields).reduce<\n\t\t\t\tRecord<string, FieldResolver<Orm, Context>>\n\t\t\t>((resolvers, field) => {\n\t\t\t\tconst r0 = fields[field]\n\t\t\t\tconst r: FieldResolver<Orm, Context> | undefined\n\t\t\t\t\t= typeof r0 === \"function\"\n\t\t\t\t\t\t? r0\n\t\t\t\t\t\t: r0 === true\n\t\t\t\t\t\t\t? this._getDefaultFieldResolver(field)\n\t\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t\t\t? this._getDefaultFieldResolver(field, r0)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\tif (r === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Field resolver must be a function, string, or true; found ${typeof r0}.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tresolvers[field] = r\n\t\t\t\treturn resolvers\n\t\t\t}, {})\n\t\t}\n\t}\n\n\t/** Modify query to select fields/relations and filter the result set. */\n\tresolve(query: Orm[\"Query\"], context: TableResolveContext<Orm, Context>) {\n\t\tconst { modify, transform } = this.options\n\t\tconst { graph, tree, type, filters } = context\n\n\t\tconst queryTable = this.orm.getQueryTable(query)\n\t\tconst tableName = this.orm.getTableName(this.table)\n\n\t\tif (queryTable !== tableName) {\n\t\t\tthrow new Error(\n\t\t\t\t`Mismatching query table for type ${type}: expected ${tableName}, received ${queryTable}.`,\n\t\t\t)\n\t\t}\n\n\t\tconst allowAllFields\n\t\t\t= this.options.allowAllFields\n\t\t\t\t?? graph.options.allowAllFields\n\t\t\t\t?? !this.options.fields\n\n\t\tif (!allowAllFields && !this.tableFieldResolvers) {\n\t\t\tthrow new Error(\n\t\t\t\t`Resolver for type ${type} must either allow all fields or specify options.fields.`,\n\t\t\t)\n\t\t}\n\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t}\n\n\t\tfor (const subtree of Object.values(tree.fieldsByTypeName[type])) {\n\t\t\tconst field = subtree.name\n\t\t\tconst r: FieldResolver<Orm, Context> | undefined\n\t\t\t\t= this.tableFieldResolvers?.[field]\n\t\t\t\t\t|| (allowAllFields ? this._getDefaultFieldResolver(field) : undefined)\n\t\t\tif (!r) {\n\t\t\t\tthrow new Error(`No field resolver defined for field ${type}.${field}.`)\n\t\t\t}\n\t\t\tif (r) {\n\t\t\t\tquery = r(query, { ...context, tree: subtree, field })\n\t\t\t}\n\t\t}\n\n\t\tconst filter = context.tree.args?.filter\n\t\tif (filter) {\n\t\t\tconst allowAllFilters = this.options.allowAllFilters ?? graph.options.allowAllFilters\n\t\t\tconst filterConfig = allowAllFilters ? true : filters\n\n\t\t\tif (filterConfig) {\n\t\t\t\tquery = filterQuery<Orm, TableResolveContext<Orm, Context>>(context.graph.orm, query, filter as FilterValue, {\n\t\t\t\t\tmodifiers: this.modifiers,\n\t\t\t\t\tcontext,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tif (transform) {\n\t\t\tquery = runAfterQuery(this.orm, query, (instance: any) => {\n\t\t\t\treturn transform(instance, context)\n\t\t\t})\n\t\t}\n\n\t\tquery = this.orm.preventSelectAll(query)\n\n\t\treturn query\n\t}\n\n\t/**\n\t * Create field resolver which will modify query to resolve GraphQL field.\n\t */\n\t_getDefaultFieldResolver(\n\t\tfield: string,\n\t\ttableField?: string,\n\t): FieldResolver<Orm, Context> {\n\t\tconst tableFieldLookup = tableField || field\n\t\tif (\n\t\t\tthis.options.modifiers?.[tableFieldLookup]\n\t\t\t|| this.virtualFields.has(tableFieldLookup)\n\t\t) {\n\t\t\t// Keep query as is.\n\t\t\treturn query => query\n\t\t} else if (this.relations.has(tableFieldLookup)) {\n\t\t\t// TODO: pre-create and cache\n\t\t\treturn defineRelationResolver({ tableField })\n\t\t} else {\n\t\t\t// TODO: create simplified resolver?\n\t\t\treturn defineFieldResolver({ tableField })\n\t\t}\n\t}\n}\n","import type { OrmAdapter } from \"graphql-orm\"\nimport type { Query, Table } from \"orchid-orm\"\nimport { prepareCursorPagination as prepareOrchidCursorPagination } from \"orchid-pagination\"\n\nexport type OrchidOrm = OrmAdapter<\n\tTable,\n\tQuery,\n\t// TODO: Type as QueryTransform once it's published.\n\tPick<Promise<any>, \"then\" | \"catch\">\n>\n\nexport const orm: OrchidOrm = {\n\tTable: undefined as unknown as OrchidOrm[\"Table\"],\n\tQuery: undefined as unknown as OrchidOrm[\"Query\"],\n\tQueryTransform: undefined as unknown as OrchidOrm[\"QueryTransform\"],\n\n\t// Reflection\n\n\tgetTableName(table) {\n\t\treturn table.table!\n\t},\n\n\tgetTableRelations(table) {\n\t\treturn Object.keys(table.relations)\n\t},\n\n\tgetTableVirtualFields() {\n\t\t// Not supported by Orchid.\n\t\treturn []\n\t},\n\n\tgetTableModifiers() {\n\t\treturn undefined\n\t},\n\n\tgetQueryTable(query) {\n\t\tif (!query.table) {\n\t\t\tthrow new Error(\"Query must have table.\")\n\t\t}\n\t\treturn query.table\n\t},\n\n\t// Select\n\n\tselectField(query, { field, as }) {\n\t\treturn query.select({ [as]: field })\n\t},\n\n\tselectRelation(query, { relation, as, modify }) {\n\t\t// as any casts needed in orchid-orm 1.31+\n\t\treturn query.select({\n\t\t\t[as]: (q: any) => modify(q[relation]),\n\t\t} as any)\n\t},\n\n\t// Find\n\n\twhere(query, field, op, value) {\n\t\treturn query.where({ [field]: op ? { [op]: value } : value })\n\t},\n\n\t// Pagination helpers\n\n\tprepareCursorPagination(query, { cursor, fields, limit }) {\n\t\tif (fields) {\n\t\t\tquery = query.clear(\"order\")\n\t\t\tfor (const { field, dir } of fields) {\n\t\t\t\tquery = query.order({ [field]: dir })\n\t\t\t}\n\t\t}\n\t\tconst prepared = prepareOrchidCursorPagination(\n\t\t\tquery as never,\n\t\t\t{ limit },\n\t\t\t{ cursor },\n\t\t)\n\t\treturn {\n\t\t\tquery: prepared.query,\n\t\t\tgetPage(nodes) {\n\t\t\t\tconst page = prepared.finalize(nodes as never)\n\t\t\t\treturn { nodes: page.items, cursor: page.nextCursor }\n\t\t\t},\n\t\t}\n\t},\n\n\tsetQueryPageResult(query, get_page) {\n\t\treturn query.transform(nodes => get_page(nodes as any))\n\t},\n\n\tmodifySubqueryPagination(subquery) {\n\t\treturn subquery\n\t},\n\n\tfinishQueryPagination(query) {\n\t\treturn query\n\t},\n\n\t// Misc\n\n\trunAfterQuery(query, fn) {\n\t\treturn query.afterQuery(data => fn(data))\n\t},\n\n\tpreventSelectAll(query) {\n\t\t// Not needed in Orchid\n\t\treturn query\n\t},\n}\n","import type {\n\tFilterModifier as _FilterModifier,\n\tFilterModifiers as _FilterModifiers,\n\tFilterQueryOptions as _FilterQueryOptions,\n\tFilterValue,\n} from \"graphql-orm\"\nimport { filterQuery as _filterQuery } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\n\nimport { orm } from \"./orm/orm\"\nimport type { OrchidOrm } from \"./orm/orm\"\n\nexport { FilterValue }\n\nexport type FilterQueryOptions<Context = undefined> = _FilterQueryOptions<OrchidOrm, Context>\n\nexport type FilterModifier<Context = undefined> = _FilterModifier<OrchidOrm, Context>\nexport type FilterModifiers<Context = undefined> = _FilterModifiers<OrchidOrm, Context>\n\nexport function filterQuery<Q extends Query, Context = undefined>(\n\tquery: Q,\n\tfilter: FilterValue,\n\toptions?: FilterQueryOptions<Context>,\n): Q {\n\treturn _filterQuery(orm, query, filter, options) as Q\n}\n","import type {\n\tGraphResolveOptions,\n\tGraphResolverOptions,\n\tTableResolver,\n} from \"graphql-orm\"\nimport { GraphResolver } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\n\nimport type { OrchidOrm } from \"../orm/orm\"\nimport { orm } from \"../orm/orm\"\n\nexport function createGraphResolver<Context = unknown>(\n\ttypes: Record<string, TableResolver<OrchidOrm, Context>>,\n\toptions?: GraphResolverOptions<OrchidOrm, Context>,\n) {\n\treturn new OrchidGraphResolver<Context>(types, options)\n}\n\nclass OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Context> {\n\tconstructor(\n\t\tpublic readonly types: Record<string, TableResolver<OrchidOrm, Context>>,\n\t\tpublic readonly options: GraphResolverOptions<OrchidOrm, Context> = {},\n\t) {\n\t\tsuper(orm, types, options)\n\t}\n\n\tresolve<T>(\n\t\tquery: Query & {\n\t\t\treturnType: unknown extends T\n\t\t\t\t? any\n\t\t\t\t: T extends unknown[]\n\t\t\t\t\t? undefined | \"all\"\n\t\t\t\t\t: T extends undefined\n\t\t\t\t\t\t? \"one\"\n\t\t\t\t\t\t: \"oneOrThrow\"\n\t\t},\n\t\toptions: GraphResolveOptions<Context>,\n\t): Promise<T> {\n\t\treturn super.resolve(query, options)\n\t}\n}\n","import type { TableResolverOptions } from \"graphql-orm\"\nimport { TableResolver } from \"graphql-orm\"\nimport type { Table } from \"orchid-orm\"\n\nimport type { OrchidOrm } from \"../orm/orm\"\nimport { orm } from \"../orm/orm\"\n\nexport function defineTableResolver<Context = unknown>(\n\ttable: Table,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {},\n) {\n\treturn new TableResolver(orm, table as any, options)\n}\n"],"mappings":";;;;AAAA,SAAgB,cAAc,KAAsC;CACnE,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG;AACrD;;;ACwBA,SAAgBA,cACf,KACA,OACA,QACA,SACe;CACf,MAAM,EAAE,SAAS,cAAc,WAAW,CAAC;CAE3C,IAAI,CAAC,QACJ,OAAO;CAER,IAAI,CAAC,cAAc,MAAM,GACxB,MAAM,IAAI,MAAM,mBAAmB,OAAO,wBAAwB;CAEnE,KAAK,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ,MAAM,GAAG;EACpD,IAAI,UAAU,KAAA,GAEb;EAED,IAAA,cAAA,QAAA,cAAA,KAAA,IAAA,KAAA,IAAI,UAAY,QACf,QAAQ,UAAU,MAAM,CAAC,OAAO,OAAO,OAAQ;OACzC;GACN,MAAM,CAAC,YAAY,OAAO,MAAM,MAAM,IAAI;GAC1C,MAAM,KAAA,QAAA,QAAA,QAAA,KAAA,IAAA,KAAA,IAAK,IAAK,YAAY;GAE5B,QAAQ,IAAI,MAAM,OAAO,YAAY,IAAI,KAAK;EAC/C;CACD;CACA,OAAO;AACR;;;ACnDA,SAAgB,sBACf,UAA2C,CAAC,GAC3C;CACD,OAAO,IAAI,gBAAgB,OAAO;AACnC;AAiBA,IAAM,kBAAN,MACmC;CAClC,OAAgB,CAAC,OAAO;CAExB;CAEA;CAEA,YAAY,UAAkC,CAAC,GAAG;;EACjD,KAAK,WAAW,QAAQ,QAAQ;EAChC,KAAK,UAAA,kBAAS,QAAQ,YAAA,QAAA,oBAAA,KAAA,IAAA,KAAA,IAAA,gBAAQ,KAAK,UAAU;GAC5C,IAAI,MAAM,WAAW,GAAG,GACvB,OAAO;IAAE,OAAO,MAAM,MAAM,CAAC;IAAG,KAAK;GAAO;QAE5C,OAAO;IAAE;IAAO,KAAK;GAAM;EAE7B,CAAC;CACF;CAEA,SAAS,OAAqB,SAAwC;EACrE,MAAM,EAAE,QAAQ,QAAQ;EACxB,MAAM,EAAE,SAAS,QAAQ;EAEzB,MAAM,WAAY,KAAK,QAA+B,KAAK;EAC3D,MAAM,SAAS,KAAK;EAEpB,MAAM,WAAW,IAAI,wBAAwB,OAAO;GACnD;GACA,QAAQ,KAAK;GACb,OAAO;EACR,CAAC;EACD,OAAO,IAAI,mBAAmB,SAAS,OAAO,SAAS,OAAO;CAC/D;AACD;;;ACxDA,SAAgB,cACf,KACA,OACA,WACe;CACf,OAAO,IAAI,cAAc,OAAO,OAAO,WAAW;EAEjD,IAAI,MAAM,QAAQ,MAAM,GAEvB,QAAO,MADe,QAAQ,IAAI,OAAO,IAAI,SAAS,CAAC,EAAA,CACxC,OAAO,OAAO;OACvB,IAAI,QACV,OAAO,UAAU,MAAM;OAGvB,OAAO;CAET,CAAC;AACF;;;ACkBA,SAAgB,kBAEd,SAAmC;CACpC,MAAM,EAAE,YAAY,eAAe;CACnC,IAAI,cAAc,YACjB,MAAM,IAAI,MACT,mEACD;CAED,OAAO;EAAE,GAAG;EAAS,YAAY,cAAc;CAAW;AAC3D;AAEA,SAAgB,oBACf,UAA8C,CAAC,GACjB;CAC9B,MAAM,EAAE,YAAY,QAAQ,cAAc,kBAAkB,OAAO;CAEnE,OAAO,SAAS,QAAQ,OAAO,SAAS;EACvC,MAAM,EAAE,UAAU;EAClB,IAAI,QACH,QAAQ,OAAO,OAAO,OAAO;OAE7B,QAAQ,QAAQ,MAAM,IAAI,YAAY,OAAO;GAC5C,OAAO,cAAc;GACrB,IAAI;EACL,CAAC;EAEF,IAAI,WACH,QAAQ,cAAc,QAAQ,MAAM,KAAK,OAAO,OAAO,aAAa;GACnE,SAAS,SAAS,MAAM,UAAU,SAAS,QAAQ,UAAU,OAAO;GACpE,OAAO;EACR,CAAC;EAEF,OAAO;CACR;AACD;;;AC1CA,IAAa,gBAAb,MAA4D;CAEjD;CACA;CACA;CAHV,YACC,KACA,eACA,UAAuD,CAAC,GACvD;EAHQ,KAAA,MAAA;EACA,KAAA,gBAAA;EACA,KAAA,UAAA;CACP;CAEH,QACC,OACA,EAAE,MAAM,GAAG,WACE;EACb,MAAM,OAAO,KAAK,gBAAgB,IAAI;EACtC,OAAO,KAAK,aAAa,OAAO;GAAE,GAAG;GAAS;EAAK,CAAC;CACrD;CAEA,YACC,OACA,WACA,EAAE,MAAM,GAAG,WACV;EACD,MAAM,OAAO,KAAK,gBAAgB,IAAI;EACtC,OAAO,KAAK,aAAa,OAAO,WAAW;GAAE,GAAG;GAAS;EAAK,CAAC;CAChE;CAEA,gBAAgB,MAA0B;EACzC,QAAA,GAAOC,2BAAAA,iBAAAA,CAAiB,IAAI;CAC7B;CAEA,aACC,OACA,SACe;EACf,IAAI,EAAE,SAAS;EAEf,IAAI,QAAQ,MACX,KAAK,MAAM,SAAS,QAAQ,MAAM;GACjC,MAAM,OAAO,OAAO,KAAK,KAAK,gBAAgB,CAAC,CAAC;GAChD,OAAO,KAAK,iBAAiB,KAAK,CAAC;GACnC,IAAI,CAAC,MAKJ,OAAO,QAAQ,QAAQ;EAEzB;EAED,MAAM,OAAO,OAAO,KAAK,KAAK,gBAAgB,CAAC,CAAC;EAChD,MAAM,eAAe,KAAK,cAAc;EACxC,IAAI,CAAC,cACJ,MAAM,IAAI,MAAM,+BAA+B,KAAK,EAAE;EAEvD,OAAO,aAAa,QAAQ,OAAO;GAClC,GAAG;GACH,OAAO;GACP;GACA;GACA,MAAM,KAAA;EACP,CAAC;CACF;CAEA,aACC,OACA,WACA,SACC;EACD,IAAI,QAAQ,MAEX,MAAM,IAAI,MAAM,mDAAmD;EAEpE,QAAQ,KAAK,aAAa,OAAO;GAAE,GAAG;GAAS,MAAM,UAAU;EAAK,CAAC;EACrE,OAAO,UAAU,SAAS,OAAO;GAChC,GAAG;GACH,OAAO;EACR,CAAC;CACF;AACD;;;ACnGA,SAAgB,mBACf,WACA,UAAiD,CAAC,GACpB;CAC9B,MAAM,EAAE,YAAY,WAAW,kBAAkB,OAAO;CAExD,OAAO,SAAS,QAAQ,OAAO,SAAS;EACvC,MAAM,EAAE,OAAO,UAAU;EAIzB,MAAM,oBAAoB,CAAC;EAC3B,QAAQ,MAAM,IAAI,eAAe,OAAO;GACvC,UAAU,cAAc;GACxB,IAAI;GACJ,OAAO,UAAU;IAChB,WAAW,SAAS,OAAO,UAAU,OAAO,IAAI;IAChD,WAAW,MAAM,aAAa,UAAU,WAAW,OAAO;IAC1D,WAAW,MAAM,IAAI,yBACpB,UACA,iBACD;IACA,OAAO;GACR;EACD,CAAC;EACD,QAAQ,MAAM,IAAI,sBAAsB,OAAO,OAAO,iBAAiB;EACvE,OAAO;CACR;AACD;;;ACnBA,SAAgB,uBACf,UAAiD,CAAC,GACpB;CAC9B,MAAM,EAAE,YAAY,SAAS,WAAW,kBAAkB,OAAO;CAEjE,OAAO,SAAS,QAAQ,OAAO,SAAS;EACvC,MAAM,EAAE,OAAO,UAAU;EACzB,OAAO,MAAM,IAAI,eAAe,OAAO;GACtC,UAAU,cAAc;GACxB,IAAI;GACJ,OAAO,UAAU;IAChB,WAAW,MAAM,aAAa,UAAU;KAAE,GAAG;KAAS;IAAQ,CAAC;IAC/D,OAAO,SAAS,OAAO,UAAU,OAAO,IAAI;GAC7C;EACD,CAAC;CACF;AACD;;;ACQA,IAAa,gBAAb,MAA4D;CASjD;CACA;CACA;CATV;CACA;CACA;CAEA;CAEA,YACC,KACA,OACA,UAAuD,CAAC,GACvD;EAHQ,KAAA,MAAA;EACA,KAAA,QAAA;EACA,KAAA,UAAA;EAET,KAAK,YAAY,IAAI,IAAI,IAAI,kBAAkB,KAAK,CAAC;EACrD,KAAK,gBAAgB,IAAI,IAAI,IAAI,sBAAsB,KAAK,CAAC;EAC7D,KAAK,YAAY;GAAE,GAAG,IAAI,kBAAkB,KAAK;GAAG,GAAG,QAAQ;EAAU;EAGzE,MAAM,EAAE,WAAW;EACnB,IAAI,QACH,KAAK,sBAAsB,OAAO,KAAK,MAAM,CAAC,CAAC,QAE5C,WAAW,UAAU;GACvB,MAAM,KAAK,OAAO;GAClB,MAAM,IACH,OAAO,OAAO,aACb,KACA,OAAO,OACN,KAAK,yBAAyB,KAAK,IACnC,OAAO,OAAO,WACb,KAAK,yBAAyB,OAAO,EAAE,IACvC,KAAA;GACN,IAAI,MAAM,KAAA,GACT,MAAM,IAAI,MACT,6DAA6D,OAAO,GAAG,EACxE;GAED,UAAU,SAAS;GACnB,OAAO;EACR,GAAG,CAAC,CAAC;CAEP;;CAGA,QAAQ,OAAqB,SAA4C;;EACxE,MAAM,EAAE,QAAQ,cAAc,KAAK;EACnC,MAAM,EAAE,OAAO,MAAM,MAAM,YAAY;EAEvC,MAAM,aAAa,KAAK,IAAI,cAAc,KAAK;EAC/C,MAAM,YAAY,KAAK,IAAI,aAAa,KAAK,KAAK;EAElD,IAAI,eAAe,WAClB,MAAM,IAAI,MACT,oCAAoC,KAAK,aAAa,UAAU,aAAa,WAAW,EACzF;EAGD,MAAM,iBACH,KAAK,QAAQ,kBACX,MAAM,QAAQ,kBACd,CAAC,KAAK,QAAQ;EAEnB,IAAI,CAAC,kBAAkB,CAAC,KAAK,qBAC5B,MAAM,IAAI,MACT,qBAAqB,KAAK,yDAC3B;EAGD,IAAI,QACH,QAAQ,OAAO,OAAO,OAAO;EAG9B,KAAK,MAAM,WAAW,OAAO,OAAO,KAAK,iBAAiB,KAAK,GAAG;;GACjE,MAAM,QAAQ,QAAQ;GACtB,MAAM,MAAA,wBACH,KAAK,yBAAA,QAAA,0BAAA,KAAA,IAAA,KAAA,IAAA,sBAAsB,YACxB,iBAAiB,KAAK,yBAAyB,KAAK,IAAI,KAAA;GAC9D,IAAI,CAAC,GACJ,MAAM,IAAI,MAAM,uCAAuC,KAAK,GAAG,MAAM,EAAE;GAExE,IAAI,GACH,QAAQ,EAAE,OAAO;IAAE,GAAG;IAAS,MAAM;IAAS;GAAM,CAAC;EAEvD;EAEA,MAAM,UAAA,qBAAS,QAAQ,KAAK,UAAA,QAAA,uBAAA,KAAA,IAAA,KAAA,IAAA,mBAAM;EAClC,IAAI,QACqB;OAAA,KAAK,QAAQ,mBAAmB,MAAM,QAAQ,kBAC/B,OAAO,SAG7C,QAAQC,cAAoD,QAAQ,MAAM,KAAK,OAAO,QAAuB;IAC5G,WAAW,KAAK;IAChB;GACD,CAAC;EAAA;EAIH,IAAI,WACH,QAAQ,cAAc,KAAK,KAAK,QAAQ,aAAkB;GACzD,OAAO,UAAU,UAAU,OAAO;EACnC,CAAC;EAGF,QAAQ,KAAK,IAAI,iBAAiB,KAAK;EAEvC,OAAO;CACR;;;;CAKA,yBACC,OACA,YAC8B;;EAC9B,MAAM,mBAAmB,cAAc;EACvC,MAAA,wBACC,KAAK,QAAQ,eAAA,QAAA,0BAAA,KAAA,IAAA,KAAA,IAAA,sBAAY,sBACtB,KAAK,cAAc,IAAI,gBAAgB,GAG1C,QAAO,UAAS;OACV,IAAI,KAAK,UAAU,IAAI,gBAAgB,GAE7C,OAAO,uBAAuB,EAAE,WAAW,CAAC;OAG5C,OAAO,oBAAoB,EAAE,WAAW,CAAC;CAE3C;AACD;;;AChKA,MAAa,MAAiB;CAC7B,OAAO,KAAA;CACP,OAAO,KAAA;CACP,gBAAgB,KAAA;CAIhB,aAAa,OAAO;EACnB,OAAO,MAAM;CACd;CAEA,kBAAkB,OAAO;EACxB,OAAO,OAAO,KAAK,MAAM,SAAS;CACnC;CAEA,wBAAwB;EAEvB,OAAO,CAAC;CACT;CAEA,oBAAoB,CAEpB;CAEA,cAAc,OAAO;EACpB,IAAI,CAAC,MAAM,OACV,MAAM,IAAI,MAAM,wBAAwB;EAEzC,OAAO,MAAM;CACd;CAIA,YAAY,OAAO,EAAE,OAAO,MAAM;EACjC,OAAO,MAAM,OAAO,GAAG,KAAK,MAAM,CAAC;CACpC;CAEA,eAAe,OAAO,EAAE,UAAU,IAAI,UAAU;EAE/C,OAAO,MAAM,OAAO,GAClB,MAAM,MAAW,OAAO,EAAE,SAAS,EACrC,CAAQ;CACT;CAIA,MAAM,OAAO,OAAO,IAAI,OAAO;EAC9B,OAAO,MAAM,MAAM,GAAG,QAAQ,KAAK,GAAG,KAAK,MAAM,IAAI,MAAM,CAAC;CAC7D;CAIA,wBAAwB,OAAO,EAAE,QAAQ,QAAQ,SAAS;EACzD,IAAI,QAAQ;GACX,QAAQ,MAAM,MAAM,OAAO;GAC3B,KAAK,MAAM,EAAE,OAAO,SAAS,QAC5B,QAAQ,MAAM,MAAM,GAAG,QAAQ,IAAI,CAAC;EAEtC;EACA,MAAM,YAAA,GAAWC,kBAAAA,wBAAAA,CAChB,OACA,EAAE,MAAM,GACR,EAAE,OAAO,CACV;EACA,OAAO;GACN,OAAO,SAAS;GAChB,QAAQ,OAAO;IACd,MAAM,OAAO,SAAS,SAAS,KAAc;IAC7C,OAAO;KAAE,OAAO,KAAK;KAAO,QAAQ,KAAK;IAAW;GACrD;EACD;CACD;CAEA,mBAAmB,OAAO,UAAU;EACnC,OAAO,MAAM,WAAU,UAAS,SAAS,KAAY,CAAC;CACvD;CAEA,yBAAyB,UAAU;EAClC,OAAO;CACR;CAEA,sBAAsB,OAAO;EAC5B,OAAO;CACR;CAIA,cAAc,OAAO,IAAI;EACxB,OAAO,MAAM,YAAW,SAAQ,GAAG,IAAI,CAAC;CACzC;CAEA,iBAAiB,OAAO;EAEvB,OAAO;CACR;AACD;;;ACvFA,SAAgB,YACf,OACA,QACA,SACI;CACJ,OAAOC,cAAa,KAAK,OAAO,QAAQ,OAAO;AAChD;;;ACdA,SAAgB,oBACf,OACA,SACC;CACD,OAAO,IAAI,oBAA6B,OAAO,OAAO;AACvD;AAEA,IAAM,sBAAN,cAA2C,cAAkC;CAE3D;CACA;CAFjB,YACC,OACA,UAAoE,CAAC,GACpE;EACD,MAAM,KAAK,OAAO,OAAO;EAHT,KAAA,QAAA;EACA,KAAA,UAAA;CAGjB;CAEA,QACC,OASA,SACa;EACb,OAAO,MAAM,QAAQ,OAAO,OAAO;CACpC;AACD;;;ACjCA,SAAgB,oBACf,OACA,UAAoD,CAAC,GACpD;CACD,OAAO,IAAI,cAAc,KAAK,OAAc,OAAO;AACpD"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,192 +1,205 @@
|
|
|
1
|
-
import { GraphQLResolveInfo } from
|
|
2
|
-
import { ResolveTree } from
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import { GraphQLResolveInfo } from "graphql";
|
|
2
|
+
import { ResolveTree } from "graphql-parse-resolve-info";
|
|
3
|
+
import { Query, Table } from "orchid-orm";
|
|
4
|
+
//#region ../base/src/resolvers/field.d.ts
|
|
5
5
|
interface FieldResolverOptions<Orm extends OrmAdapter, Context> {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
/** Table field (if different from GraphQL field) */
|
|
7
|
+
tableField?: string;
|
|
8
|
+
/** Legacy alias for `tableField`. */
|
|
9
|
+
modelField?: string;
|
|
10
|
+
/** Custom query modifier (if different than simply selecting a field). */
|
|
11
|
+
modify?: FieldResolveModifier<Orm, Context>;
|
|
12
|
+
/** Post-process selected value. Return a new value or a promise. */
|
|
13
|
+
transform?(value: any, instance: any, context: FieldResolveContext<Orm, Context>): any;
|
|
14
14
|
}
|
|
15
15
|
type FieldResolveModifier<Orm extends OrmAdapter, Context> = (query: Orm["Query"], context: FieldResolveContext<Orm, Context>) => Orm["Query"];
|
|
16
16
|
interface FieldResolveContext<Orm extends OrmAdapter, Context> extends TableResolveContext<Orm, Context> {
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
/** GraphQL field */
|
|
18
|
+
field: string;
|
|
19
19
|
}
|
|
20
20
|
type FieldResolver<Orm extends OrmAdapter, Context> = FieldResolveModifier<Orm, Context>;
|
|
21
21
|
declare function defineFieldResolver<Orm extends OrmAdapter, Context>(options?: FieldResolverOptions<Orm, Context>): FieldResolver<Orm, Context>;
|
|
22
|
-
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region ../base/src/resolvers/table.d.ts
|
|
23
24
|
interface TableResolverOptions<Orm extends OrmAdapter, Context> {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
/** allow to resolve all table fields without explicitly listing them */
|
|
26
|
+
allowAllFields?: boolean;
|
|
27
|
+
/** allow to filter all table fields without explicitly listing them */
|
|
28
|
+
allowAllFilters?: boolean;
|
|
29
|
+
fields?: Record<string, SimpleFieldResolver<Orm, Context>>;
|
|
30
|
+
modifiers?: Record<string, TableFilterModifier<Orm, Context>>;
|
|
31
|
+
modify?: TableResolveModifier<Orm, Context>;
|
|
32
|
+
transform?(instance: any, context: any): void | PromiseLike<void>;
|
|
32
33
|
}
|
|
33
34
|
type SimpleFieldResolver<Orm extends OrmAdapter, Context> = true | string | FieldResolver<Orm, Context>;
|
|
34
35
|
type TableResolveModifier<Orm extends OrmAdapter, Context> = (query: Orm["Query"], context: TableResolveContext<Orm, Context>) => Orm["Query"];
|
|
35
36
|
interface TableResolveContext<Orm extends OrmAdapter, Context> extends GraphResolveContext<Context> {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
graph: GraphResolver<Orm, Context>;
|
|
38
|
+
/** GraphQL type */
|
|
39
|
+
type: string;
|
|
39
40
|
}
|
|
40
41
|
type TableFilterModifier<Orm extends OrmAdapter, Context> = FilterModifier$1<Orm, TableResolveContext<Orm, Context>>;
|
|
41
42
|
declare class TableResolver<Orm extends OrmAdapter, Context> {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
43
|
+
readonly orm: Orm;
|
|
44
|
+
readonly table: Orm["Table"];
|
|
45
|
+
readonly options: TableResolverOptions<Orm, Context>;
|
|
46
|
+
readonly relations: Set<string>;
|
|
47
|
+
readonly virtualFields: Set<string>;
|
|
48
|
+
readonly modifiers?: Record<string, TableFilterModifier<Orm, Context>>;
|
|
49
|
+
readonly tableFieldResolvers?: Record<string, FieldResolver<Orm, Context>>;
|
|
50
|
+
constructor(orm: Orm, table: Orm["Table"], options?: TableResolverOptions<Orm, Context>);
|
|
51
|
+
/** Modify query to select fields/relations and filter the result set. */
|
|
52
|
+
resolve(query: Orm["Query"], context: TableResolveContext<Orm, Context>): Orm["Query"];
|
|
53
|
+
/**
|
|
54
|
+
* Create field resolver which will modify query to resolve GraphQL field.
|
|
55
|
+
*/
|
|
56
|
+
_getDefaultFieldResolver(field: string, tableField?: string): FieldResolver<Orm, Context>;
|
|
56
57
|
}
|
|
57
|
-
|
|
58
|
+
//#endregion
|
|
59
|
+
//#region ../base/src/resolvers/graph.d.ts
|
|
58
60
|
type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<TableResolverOptions<Orm, Context>, "allowAllFields" | "allowAllFilters">;
|
|
59
61
|
interface GraphResolveOptions<Context> {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
info: GraphQLResolveInfo;
|
|
63
|
+
context: Context;
|
|
64
|
+
filters?: FilterConfig;
|
|
65
|
+
/** Subfield path if not resolving root query, e.g.: ['user'] */
|
|
66
|
+
path?: string[];
|
|
65
67
|
}
|
|
66
68
|
type GraphResolveContext<Context> = Omit<GraphResolveOptions<Context>, "info"> & {
|
|
67
|
-
|
|
69
|
+
tree: ResolveTree;
|
|
68
70
|
};
|
|
69
71
|
declare class GraphResolver<Orm extends OrmAdapter, Context> {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
72
|
+
readonly orm: Orm;
|
|
73
|
+
readonly typeResolvers: Record<string, TableResolver<Orm, Context>>;
|
|
74
|
+
readonly options: GraphResolverOptions<Orm, Context>;
|
|
75
|
+
constructor(orm: Orm, typeResolvers: Record<string, TableResolver<Orm, Context>>, options?: GraphResolverOptions<Orm, Context>);
|
|
76
|
+
resolve<T>(query: Orm["Query"], { info, ...context }: GraphResolveOptions<Context>): Promise<T>;
|
|
77
|
+
resolvePage(query: Orm["Query"], paginator: Paginator<Orm, Context>, { info, ...context }: GraphResolveOptions<Context>): Orm["QueryTransform"];
|
|
78
|
+
_getResolveTree(info: GraphQLResolveInfo): ResolveTree;
|
|
79
|
+
_resolveType(query: Orm["Query"], context: GraphResolveContext<Context>): Orm["Query"];
|
|
80
|
+
_resolvePage(query: Orm["Query"], paginator: Paginator<Orm, Context>, context: GraphResolveContext<Context>): Orm["QueryTransform"];
|
|
79
81
|
}
|
|
80
|
-
|
|
82
|
+
//#endregion
|
|
83
|
+
//#region ../base/src/paginators/base.d.ts
|
|
81
84
|
interface Paginator<Orm extends OrmAdapter, Context> {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
/** GraphQL path, for example: `["nodes"]` */
|
|
86
|
+
readonly path: string[];
|
|
87
|
+
paginate(query: Orm["Query"], context: PaginateContext<Orm, Context>): Orm["QueryTransform"];
|
|
85
88
|
}
|
|
86
89
|
interface PaginateContext<Orm extends OrmAdapter, Context> extends GraphResolveContext<Context> {
|
|
87
|
-
|
|
90
|
+
graph: GraphResolver<Orm, Context>;
|
|
88
91
|
}
|
|
89
92
|
type GetPageFn = (nodes: any[]) => any;
|
|
90
|
-
|
|
93
|
+
//#endregion
|
|
94
|
+
//#region ../base/src/orm/orm.d.ts
|
|
91
95
|
type OrmModifier<Orm extends OrmAdapter> = (query: Orm["Query"], ...args: any[]) => Orm["Query"];
|
|
92
96
|
interface SortOrder {
|
|
93
|
-
|
|
94
|
-
|
|
97
|
+
field: string;
|
|
98
|
+
dir: "ASC" | "DESC";
|
|
95
99
|
}
|
|
96
100
|
interface OrmAdapter<Table = any, Query = any, QueryTransform = any> {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
101
|
+
Table: Table;
|
|
102
|
+
Query: Query;
|
|
103
|
+
QueryTransform: QueryTransform;
|
|
104
|
+
/** ORM table -> db table */
|
|
105
|
+
getTableName(table: Table): string;
|
|
106
|
+
/** ORM table -> relation names */
|
|
107
|
+
getTableRelations(table: Table): string[];
|
|
108
|
+
/** ORM table -> virtual fields */
|
|
109
|
+
getTableVirtualFields(table: Table): string[];
|
|
110
|
+
getTableModifiers(table: Table): Record<string, OrmModifier<this>> | undefined;
|
|
111
|
+
/** ORM query -> db table */
|
|
112
|
+
getQueryTable(query: Query): string;
|
|
113
|
+
selectField(query: Query, opts: {
|
|
114
|
+
field: string;
|
|
115
|
+
as: string;
|
|
116
|
+
}): Query;
|
|
117
|
+
selectRelation(query: Query, opts: {
|
|
118
|
+
relation: string;
|
|
119
|
+
as: string;
|
|
120
|
+
modify: (subquery: Query) => Query;
|
|
121
|
+
}): Query;
|
|
122
|
+
where(query: Query, field: string, op: string | undefined, value: any): Query;
|
|
123
|
+
prepareCursorPagination(query: Query, options: {
|
|
124
|
+
cursor?: string;
|
|
125
|
+
fields?: SortOrder[];
|
|
126
|
+
limit: number;
|
|
127
|
+
}): {
|
|
128
|
+
query: Query;
|
|
129
|
+
getPage: GetPageFn;
|
|
130
|
+
};
|
|
131
|
+
setQueryPageResult(query: Query, getPage: GetPageFn): QueryTransform;
|
|
132
|
+
modifySubqueryPagination(subquery: Query, context: Record<string, any>): Query;
|
|
133
|
+
finishQueryPagination(query: Query, field: string, context: Record<string, any>): Query;
|
|
134
|
+
/** Set ORM query to run callback afterwards */
|
|
135
|
+
runAfterQuery(query: Query, fn: (result: any) => any): Query;
|
|
136
|
+
/** Prevent `SELECT *` by explicitly selecting ID */
|
|
137
|
+
preventSelectAll(query: Query): Query;
|
|
131
138
|
}
|
|
132
|
-
|
|
139
|
+
//#endregion
|
|
140
|
+
//#region ../base/src/filter/filter.d.ts
|
|
133
141
|
type FilterConfig = boolean;
|
|
134
142
|
type FieldFilterScalarValue = null | string | number | boolean;
|
|
135
143
|
type FieldFilterValue = FieldFilterScalarValue | Exclude<FieldFilterScalarValue, null>[];
|
|
136
144
|
type FilterValue = {
|
|
137
|
-
|
|
138
|
-
};
|
|
145
|
+
[property: string]: FieldFilterValue;
|
|
146
|
+
} | null | undefined;
|
|
139
147
|
type FilterQueryOptions$1<Orm extends OrmAdapter, Context = unknown> = {
|
|
140
|
-
|
|
148
|
+
modifiers?: FilterModifiers$1<Orm, Context>;
|
|
141
149
|
} & (Context extends undefined ? {
|
|
142
|
-
|
|
150
|
+
context?: Context;
|
|
143
151
|
} : {
|
|
144
|
-
|
|
152
|
+
context: Context;
|
|
145
153
|
});
|
|
146
154
|
type FilterModifier$1<Orm extends OrmAdapter, Context> = (query: Orm["Query"], value: any, context: Context) => Orm["Query"];
|
|
147
155
|
type FilterModifiers$1<Orm extends OrmAdapter, Context> = Record<string, FilterModifier$1<Orm, Context>>;
|
|
148
|
-
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region ../base/src/paginators/cursor.d.ts
|
|
149
158
|
declare function defineCursorPaginator(options?: Partial<CursorPaginatorOptions>): CursorPaginator<OrmAdapter<any, any, any>, unknown>;
|
|
150
159
|
interface CursorPaginatorOptions {
|
|
151
|
-
|
|
152
|
-
|
|
160
|
+
fields?: string[];
|
|
161
|
+
take?: number;
|
|
153
162
|
}
|
|
154
163
|
declare class CursorPaginator<Orm extends OrmAdapter, Context> implements Paginator<Orm, Context> {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}>;
|
|
161
|
-
constructor(options?: CursorPaginatorOptions);
|
|
162
|
-
paginate(query: Orm["Query"], context: PaginateContext<Orm, Context>): any;
|
|
164
|
+
readonly path: string[];
|
|
165
|
+
readonly pageSize: number;
|
|
166
|
+
readonly fields?: SortOrder[];
|
|
167
|
+
constructor(options?: CursorPaginatorOptions);
|
|
168
|
+
paginate(query: Orm["Query"], context: PaginateContext<Orm, Context>): any;
|
|
163
169
|
}
|
|
164
|
-
|
|
170
|
+
//#endregion
|
|
171
|
+
//#region ../base/src/resolvers/relation.d.ts
|
|
165
172
|
interface RelationResolverOptions<Orm extends OrmAdapter, Context> extends Omit<FieldResolverOptions<Orm, Context>, "modify"> {
|
|
166
|
-
|
|
167
|
-
|
|
173
|
+
filters?: FilterConfig;
|
|
174
|
+
modify?: TableResolveModifier<Orm, Context>;
|
|
168
175
|
}
|
|
169
176
|
declare function defineRelationResolver<Orm extends OrmAdapter, Context>(options?: RelationResolverOptions<Orm, Context>): FieldResolver<Orm, Context>;
|
|
170
|
-
|
|
177
|
+
//#endregion
|
|
178
|
+
//#region ../base/src/resolvers/page.d.ts
|
|
171
179
|
declare function definePageResolver<Orm extends OrmAdapter, Context>(paginator: Paginator<Orm, Context>, options?: RelationResolverOptions<Orm, Context>): FieldResolver<Orm, Context>;
|
|
172
|
-
|
|
180
|
+
//#endregion
|
|
181
|
+
//#region src/orm/orm.d.ts
|
|
173
182
|
type OrchidOrm = OrmAdapter<Table, Query, Pick<Promise<any>, "then" | "catch">>;
|
|
174
|
-
|
|
183
|
+
//#endregion
|
|
184
|
+
//#region src/filter.d.ts
|
|
175
185
|
type FilterQueryOptions<Context = undefined> = FilterQueryOptions$1<OrchidOrm, Context>;
|
|
176
186
|
type FilterModifier<Context = undefined> = FilterModifier$1<OrchidOrm, Context>;
|
|
177
187
|
type FilterModifiers<Context = undefined> = FilterModifiers$1<OrchidOrm, Context>;
|
|
178
188
|
declare function filterQuery<Q extends Query, Context = undefined>(query: Q, filter: FilterValue, options?: FilterQueryOptions<Context>): Q;
|
|
179
|
-
|
|
189
|
+
//#endregion
|
|
190
|
+
//#region src/resolvers/graph.d.ts
|
|
180
191
|
declare function createGraphResolver<Context = unknown>(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>): OrchidGraphResolver<Context>;
|
|
181
192
|
declare class OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Context> {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
193
|
+
readonly types: Record<string, TableResolver<OrchidOrm, Context>>;
|
|
194
|
+
readonly options: GraphResolverOptions<OrchidOrm, Context>;
|
|
195
|
+
constructor(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>);
|
|
196
|
+
resolve<T>(query: Query & {
|
|
197
|
+
returnType: unknown extends T ? any : T extends unknown[] ? undefined | "all" : T extends undefined ? "one" : "oneOrThrow";
|
|
198
|
+
}, options: GraphResolveOptions<Context>): Promise<T>;
|
|
188
199
|
}
|
|
189
|
-
|
|
200
|
+
//#endregion
|
|
201
|
+
//#region src/resolvers/table.d.ts
|
|
190
202
|
declare function defineTableResolver<Context = unknown>(table: Table, options?: TableResolverOptions<OrchidOrm, Context>): TableResolver<OrchidOrm, Context>;
|
|
191
|
-
|
|
192
|
-
export {
|
|
203
|
+
//#endregion
|
|
204
|
+
export { FilterModifier, FilterModifiers, FilterQueryOptions, type FilterValue, createGraphResolver, createGraphResolver as graph, defineCursorPaginator as cursor, defineCursorPaginator, defineFieldResolver, defineFieldResolver as field, definePageResolver, definePageResolver as page, defineRelationResolver, defineRelationResolver as relation, defineTableResolver, defineTableResolver as table, filterQuery };
|
|
205
|
+
//# sourceMappingURL=index.d.cts.map
|