orchid-graphql 1.8.0 → 1.9.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 CHANGED
@@ -45,7 +45,7 @@ const BaseTable = createBaseTable()
45
45
 
46
46
  class PostTable extends BaseTable {
47
47
  readonly table = "post"
48
- columns = this.setColumns((t) => ({
48
+ columns = this.setColumns(t => ({
49
49
  id: t.identity().primaryKey(),
50
50
  text: t.text(0, 5000),
51
51
  }))
@@ -285,8 +285,8 @@ const graph = r.graph(
285
285
  // (related table must be also registered in this graph resolver)
286
286
  author: true,
287
287
  // Modify query when this field is resolved
288
- preview: (q) =>
289
- q.select({ preview: q.sql<string>`substr(text,1,100)` }),
288
+ preview: q =>
289
+ q.select({ preview: q.sql <string>`substr(text,1,100)` }),
290
290
  // Same as text: true
291
291
  text: r.field(),
292
292
  // Custom field resolver
@@ -296,8 +296,8 @@ const graph = r.graph(
296
296
  }),
297
297
  preview2: r.field({
298
298
  // Modify query
299
- modify: (q) =>
300
- q.select({ preview2: q.sql<string>`substr(text,1,100)` }),
299
+ modify: q =>
300
+ q.select({ preview2: q.sql <string>`substr(text,1,100)` }),
301
301
  // Post-process selected value
302
302
  transform(
303
303
  // Selected value
package/dist/index.cjs CHANGED
@@ -18,8 +18,8 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
20
  // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
23
  createGraphResolver: () => createGraphResolver,
24
24
  cursor: () => defineCursorPaginator,
25
25
  defineCursorPaginator: () => defineCursorPaginator,
@@ -28,12 +28,42 @@ __export(src_exports, {
28
28
  defineRelationResolver: () => defineRelationResolver,
29
29
  defineTableResolver: () => defineTableResolver,
30
30
  field: () => defineFieldResolver,
31
+ filterQuery: () => filterQuery2,
31
32
  graph: () => createGraphResolver,
32
33
  page: () => definePageResolver,
33
34
  relation: () => defineRelationResolver,
34
35
  table: () => defineTableResolver
35
36
  });
36
- module.exports = __toCommonJS(src_exports);
37
+ module.exports = __toCommonJS(index_exports);
38
+
39
+ // ../base/src/utils/is-plain-object.ts
40
+ function isPlainObject(obj) {
41
+ return typeof obj === "object" && !Array.isArray(obj);
42
+ }
43
+
44
+ // ../base/src/filter/filter.ts
45
+ function filterQuery(orm2, query, filter, options) {
46
+ const { context, modifiers } = options ?? {};
47
+ if (!filter) {
48
+ return query;
49
+ }
50
+ if (!isPlainObject(filter)) {
51
+ throw new Error(`Invalid filter: ${filter}, must be plain object.`);
52
+ }
53
+ for (const [field, value] of Object.entries(filter)) {
54
+ if (value === void 0) {
55
+ continue;
56
+ }
57
+ if (modifiers?.[field]) {
58
+ query = modifiers[field](query, value, context);
59
+ } else {
60
+ const [table_field, op0] = field.split("__");
61
+ const op = op0?.toLowerCase();
62
+ query = orm2.where(query, table_field, op, value);
63
+ }
64
+ }
65
+ return query;
66
+ }
37
67
 
38
68
  // ../base/src/paginators/cursor.ts
39
69
  var import_node_buffer = require("buffer");
@@ -266,38 +296,6 @@ function defineRelationResolver(options = {}) {
266
296
  };
267
297
  }
268
298
 
269
- // ../base/src/utils/is-plain-object.ts
270
- function is_plain_object(obj) {
271
- return typeof obj === "object" && !Array.isArray(obj);
272
- }
273
-
274
- // ../base/src/filters/filters.ts
275
- function apply_filters(query, { filters, modifiers, context }) {
276
- if (!filters) {
277
- return query;
278
- }
279
- const filter_obj = context.tree.args?.filter;
280
- if (!filter_obj) {
281
- return query;
282
- }
283
- if (!is_plain_object(filter_obj)) {
284
- throw new Error(`Invalid filter: ${filter_obj}, must be object.`);
285
- }
286
- for (const [field, value] of Object.entries(filter_obj)) {
287
- if (value === void 0) {
288
- continue;
289
- }
290
- if (modifiers?.[field]) {
291
- query = modifiers[field](query, value, context);
292
- } else {
293
- const [table_field, op0] = field.split("__");
294
- const op = op0?.toLowerCase();
295
- query = context.graph.orm.where(query, table_field, op, value);
296
- }
297
- }
298
- return query;
299
- }
300
-
301
299
  // ../base/src/resolvers/table.ts
302
300
  var TableResolver = class {
303
301
  constructor(orm2, table, options = {}) {
@@ -357,14 +355,16 @@ var TableResolver = class {
357
355
  query = r(query, { ...context, tree: subtree, field });
358
356
  }
359
357
  }
360
- const allow_all_filters = this.options.allowAllFilters ?? graph.options.allowAllFilters;
361
- const effective_filters = allow_all_filters ? true : filters;
362
- if (effective_filters) {
363
- query = apply_filters(query, {
364
- filters: effective_filters,
365
- modifiers: this.modifiers,
366
- context
367
- });
358
+ const filter = context.tree.args?.filter;
359
+ if (filter) {
360
+ const allowAllFilters = this.options.allowAllFilters ?? graph.options.allowAllFilters;
361
+ const filterConfig = allowAllFilters ? true : filters;
362
+ if (filterConfig) {
363
+ query = filterQuery(context.graph.orm, query, filter, {
364
+ modifiers: this.modifiers,
365
+ context
366
+ });
367
+ }
368
368
  }
369
369
  if (transform) {
370
370
  query = run_after_query(this.orm, query, (instance) => {
@@ -477,6 +477,11 @@ var orm = {
477
477
  }
478
478
  };
479
479
 
480
+ // src/filter.ts
481
+ function filterQuery2(query, filter, options) {
482
+ return filterQuery(orm, query, filter, options);
483
+ }
484
+
480
485
  // src/resolvers/graph.ts
481
486
  function createGraphResolver(types, options) {
482
487
  return new OrchidGraphResolver(types, options);
@@ -506,6 +511,7 @@ function defineTableResolver(table, options = {}) {
506
511
  defineRelationResolver,
507
512
  defineTableResolver,
508
513
  field,
514
+ filterQuery,
509
515
  graph,
510
516
  page,
511
517
  relation,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.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/utils/is-plain-object.ts","../../base/src/filters/filters.ts","../../base/src/resolvers/table.ts","../src/orm/orm.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["export {\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","import { Buffer } from \"node:buffer\"\n\nimport { OrmAdapter, SortOrder } from \"../orm/orm\"\nimport { 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>\n\timplements Paginator<Orm, Context>\n{\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\tdir === \"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 { 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 { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { 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 { parseResolveInfo, ResolveTree } from \"graphql-parse-resolve-info\"\n\nimport { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\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?: FiltersDef\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 { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\nimport { FieldResolver, parse_field_options } from \"./field\"\nimport { 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 { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport {\n\tFieldResolver,\n\tFieldResolverOptions,\n\tparse_field_options,\n} from \"./field\"\nimport { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Orm extends OrmAdapter, Context>\n\textends Omit<FieldResolverOptions<Orm, Context>, \"modify\"> {\n\tfilters?: FiltersDef\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","export function is_plain_object(obj: any): obj is Record<string, any> {\n\treturn typeof obj === \"object\" && !Array.isArray(obj)\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { TableResolveContext } from \"../resolvers/table\"\nimport { is_plain_object } from \"../utils/is-plain-object\"\n\n// TODO: per-field definitions\nexport type FiltersDef = boolean\n\nexport type FilterScalarValue = null | string | number | boolean\nexport type FilterValue = FilterScalarValue | Exclude<FilterScalarValue, null>[]\nexport type Filter = { [property: string]: FilterValue }\n\ninterface ApplyFiltersOptions<Orm extends OrmAdapter, Context> {\n\tfilters: FiltersDef\n\tmodifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\tcontext: TableResolveContext<Orm, Context>\n}\n\nexport type ApplyFiltersModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tvalue: any,\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport function apply_filters<Orm extends OrmAdapter, Context>(\n\tquery: Orm[\"Query\"],\n\t{ filters, modifiers, context }: ApplyFiltersOptions<Orm, Context>,\n): Orm[\"Query\"] {\n\tif (!filters) {\n\t\treturn query\n\t}\n\tconst filter_obj = context.tree.args?.filter\n\tif (!filter_obj) {\n\t\treturn query\n\t}\n\tif (!is_plain_object(filter_obj)) {\n\t\tthrow new Error(`Invalid filter: ${filter_obj}, must be object.`)\n\t}\n\tfor (const [field, value] of Object.entries(filter_obj)) {\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)\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 = context.graph.orm.where(query, table_field, op, value)\n\t\t}\n\t}\n\treturn query\n}\n","import { apply_filters, ApplyFiltersModifier } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { defineFieldResolver, FieldResolver } 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, ApplyFiltersModifier<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| string\n\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 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, ApplyFiltersModifier<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\ttypeof 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\tthis.options.allowAllFields ??\n\t\t\tgraph.options.allowAllFields ??\n\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\tthis.table_field_resolvers?.[field] ||\n\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 allow_all_filters =\n\t\t\tthis.options.allowAllFilters ?? graph.options.allowAllFilters\n\n\t\tconst effective_filters = allow_all_filters ? true : filters\n\n\t\tif (effective_filters) {\n\t\t\tquery = apply_filters<Orm, Context>(query, {\n\t\t\t\tfilters: effective_filters,\n\t\t\t\tmodifiers: this.modifiers,\n\t\t\t\tcontext,\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\tthis.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 { 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 {\n\tGraphResolveOptions,\n\tGraphResolver,\n\tGraphResolverOptions,\n\tTableResolver,\n} from \"graphql-orm\"\nimport { Query } from \"orchid-orm\"\n\nimport { OrchidOrm, 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 { TableResolver, TableResolverOptions } from \"graphql-orm\"\nimport { Table } from \"orchid-orm\"\n\nimport { OrchidOrm, 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":["orm","cursor","orm","orm","type","orm"]}
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"]}
package/dist/index.d.cts CHANGED
@@ -26,7 +26,7 @@ interface TableResolverOptions<Orm extends OrmAdapter, Context> {
26
26
  /** allow to filter all table fields without explicitly listing them */
27
27
  allowAllFilters?: boolean;
28
28
  fields?: Record<string, SimpleFieldResolver<Orm, Context>>;
29
- modifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>;
29
+ modifiers?: Record<string, TableFilterModifier<Orm, Context>>;
30
30
  modify?: TableResolveModifier<Orm, Context>;
31
31
  transform?(instance: any, context: any): void | PromiseLike<void>;
32
32
  }
@@ -37,13 +37,14 @@ interface TableResolveContext<Orm extends OrmAdapter, Context> extends GraphReso
37
37
  /** GraphQL type */
38
38
  type: string;
39
39
  }
40
+ type TableFilterModifier<Orm extends OrmAdapter, Context> = FilterModifier$1<Orm, TableResolveContext<Orm, Context>>;
40
41
  declare class TableResolver<Orm extends OrmAdapter, Context> {
41
42
  readonly orm: Orm;
42
43
  readonly table: Orm["Table"];
43
44
  readonly options: TableResolverOptions<Orm, Context>;
44
45
  readonly relations: Set<string>;
45
46
  readonly virtual_fields: Set<string>;
46
- readonly modifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>;
47
+ readonly modifiers?: Record<string, TableFilterModifier<Orm, Context>>;
47
48
  readonly table_field_resolvers?: Record<string, FieldResolver<Orm, Context>>;
48
49
  constructor(orm: Orm, table: Orm["Table"], options?: TableResolverOptions<Orm, Context>);
49
50
  /** Modify query to select fields/relations and filter the result set. */
@@ -54,14 +55,11 @@ declare class TableResolver<Orm extends OrmAdapter, Context> {
54
55
  _get_default_field_resolver(field: string, tableField?: string): FieldResolver<Orm, Context>;
55
56
  }
56
57
 
57
- type FiltersDef = boolean;
58
- type ApplyFiltersModifier<Orm extends OrmAdapter, Context> = (query: Orm["Query"], value: any, context: TableResolveContext<Orm, Context>) => Orm["Query"];
59
-
60
58
  type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<TableResolverOptions<Orm, Context>, "allowAllFields" | "allowAllFilters">;
61
59
  interface GraphResolveOptions<Context> {
62
60
  info: GraphQLResolveInfo;
63
61
  context: Context;
64
- filters?: FiltersDef;
62
+ filters?: FilterConfig;
65
63
  /** Subfield path if not resolving root query, e.g.: ['user'] */
66
64
  path?: string[];
67
65
  }
@@ -132,6 +130,22 @@ interface OrmAdapter<Table = any, Query = any, QueryTransform = any> {
132
130
  prevent_select_all(query: Query): Query;
133
131
  }
134
132
 
133
+ type FilterConfig = boolean;
134
+ type FieldFilterScalarValue = null | string | number | boolean;
135
+ type FieldFilterValue = FieldFilterScalarValue | Exclude<FieldFilterScalarValue, null>[];
136
+ type FilterValue = {
137
+ [property: string]: FieldFilterValue;
138
+ };
139
+ type FilterQueryOptions$1<Orm extends OrmAdapter, Context = unknown> = {
140
+ modifiers?: FilterModifiers$1<Orm, Context>;
141
+ } & (Context extends undefined ? {
142
+ context?: Context;
143
+ } : {
144
+ context: Context;
145
+ });
146
+ type FilterModifier$1<Orm extends OrmAdapter, Context> = (query: Orm["Query"], value: any, context: Context) => Orm["Query"];
147
+ type FilterModifiers$1<Orm extends OrmAdapter, Context> = Record<string, FilterModifier$1<Orm, Context>>;
148
+
135
149
  declare function defineCursorPaginator(options?: Partial<CursorPaginatorOptions>): CursorPaginator<OrmAdapter<any, any, any>, unknown>;
136
150
  interface CursorPaginatorOptions {
137
151
  fields?: string[];
@@ -149,7 +163,7 @@ declare class CursorPaginator<Orm extends OrmAdapter, Context> implements Pagina
149
163
  }
150
164
 
151
165
  interface RelationResolverOptions<Orm extends OrmAdapter, Context> extends Omit<FieldResolverOptions<Orm, Context>, "modify"> {
152
- filters?: FiltersDef;
166
+ filters?: FilterConfig;
153
167
  modify?: TableResolveModifier<Orm, Context>;
154
168
  }
155
169
  declare function defineRelationResolver<Orm extends OrmAdapter, Context>(options?: RelationResolverOptions<Orm, Context>): FieldResolver<Orm, Context>;
@@ -158,6 +172,11 @@ declare function definePageResolver<Orm extends OrmAdapter, Context>(paginator:
158
172
 
159
173
  type OrchidOrm = OrmAdapter<Table, Query, Pick<Promise<any>, "then" | "catch">>;
160
174
 
175
+ type FilterQueryOptions<Context = undefined> = FilterQueryOptions$1<OrchidOrm, Context>;
176
+ type FilterModifier<Context = undefined> = FilterModifier$1<OrchidOrm, Context>;
177
+ type FilterModifiers<Context = undefined> = FilterModifiers$1<OrchidOrm, Context>;
178
+ declare function filterQuery<Q extends Query, Context = undefined>(query: Q, filter: FilterValue, options?: FilterQueryOptions<Context>): Q;
179
+
161
180
  declare function createGraphResolver<Context = unknown>(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>): OrchidGraphResolver<Context>;
162
181
  declare class OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Context> {
163
182
  readonly types: Record<string, TableResolver<OrchidOrm, Context>>;
@@ -170,4 +189,4 @@ declare class OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Cont
170
189
 
171
190
  declare function defineTableResolver<Context = unknown>(table: Table, options?: TableResolverOptions<OrchidOrm, Context>): TableResolver<OrchidOrm, Context>;
172
191
 
173
- export { createGraphResolver, defineCursorPaginator as cursor, defineCursorPaginator, defineFieldResolver, definePageResolver, defineRelationResolver, defineTableResolver, defineFieldResolver as field, createGraphResolver as graph, definePageResolver as page, defineRelationResolver as relation, defineTableResolver as table };
192
+ export { type FilterModifier, type FilterModifiers, type FilterQueryOptions, type FilterValue, createGraphResolver, defineCursorPaginator as cursor, defineCursorPaginator, defineFieldResolver, definePageResolver, defineRelationResolver, defineTableResolver, defineFieldResolver as field, filterQuery, createGraphResolver as graph, definePageResolver as page, defineRelationResolver as relation, defineTableResolver as table };
package/dist/index.d.ts CHANGED
@@ -26,7 +26,7 @@ interface TableResolverOptions<Orm extends OrmAdapter, Context> {
26
26
  /** allow to filter all table fields without explicitly listing them */
27
27
  allowAllFilters?: boolean;
28
28
  fields?: Record<string, SimpleFieldResolver<Orm, Context>>;
29
- modifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>;
29
+ modifiers?: Record<string, TableFilterModifier<Orm, Context>>;
30
30
  modify?: TableResolveModifier<Orm, Context>;
31
31
  transform?(instance: any, context: any): void | PromiseLike<void>;
32
32
  }
@@ -37,13 +37,14 @@ interface TableResolveContext<Orm extends OrmAdapter, Context> extends GraphReso
37
37
  /** GraphQL type */
38
38
  type: string;
39
39
  }
40
+ type TableFilterModifier<Orm extends OrmAdapter, Context> = FilterModifier$1<Orm, TableResolveContext<Orm, Context>>;
40
41
  declare class TableResolver<Orm extends OrmAdapter, Context> {
41
42
  readonly orm: Orm;
42
43
  readonly table: Orm["Table"];
43
44
  readonly options: TableResolverOptions<Orm, Context>;
44
45
  readonly relations: Set<string>;
45
46
  readonly virtual_fields: Set<string>;
46
- readonly modifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>;
47
+ readonly modifiers?: Record<string, TableFilterModifier<Orm, Context>>;
47
48
  readonly table_field_resolvers?: Record<string, FieldResolver<Orm, Context>>;
48
49
  constructor(orm: Orm, table: Orm["Table"], options?: TableResolverOptions<Orm, Context>);
49
50
  /** Modify query to select fields/relations and filter the result set. */
@@ -54,14 +55,11 @@ declare class TableResolver<Orm extends OrmAdapter, Context> {
54
55
  _get_default_field_resolver(field: string, tableField?: string): FieldResolver<Orm, Context>;
55
56
  }
56
57
 
57
- type FiltersDef = boolean;
58
- type ApplyFiltersModifier<Orm extends OrmAdapter, Context> = (query: Orm["Query"], value: any, context: TableResolveContext<Orm, Context>) => Orm["Query"];
59
-
60
58
  type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<TableResolverOptions<Orm, Context>, "allowAllFields" | "allowAllFilters">;
61
59
  interface GraphResolveOptions<Context> {
62
60
  info: GraphQLResolveInfo;
63
61
  context: Context;
64
- filters?: FiltersDef;
62
+ filters?: FilterConfig;
65
63
  /** Subfield path if not resolving root query, e.g.: ['user'] */
66
64
  path?: string[];
67
65
  }
@@ -132,6 +130,22 @@ interface OrmAdapter<Table = any, Query = any, QueryTransform = any> {
132
130
  prevent_select_all(query: Query): Query;
133
131
  }
134
132
 
133
+ type FilterConfig = boolean;
134
+ type FieldFilterScalarValue = null | string | number | boolean;
135
+ type FieldFilterValue = FieldFilterScalarValue | Exclude<FieldFilterScalarValue, null>[];
136
+ type FilterValue = {
137
+ [property: string]: FieldFilterValue;
138
+ };
139
+ type FilterQueryOptions$1<Orm extends OrmAdapter, Context = unknown> = {
140
+ modifiers?: FilterModifiers$1<Orm, Context>;
141
+ } & (Context extends undefined ? {
142
+ context?: Context;
143
+ } : {
144
+ context: Context;
145
+ });
146
+ type FilterModifier$1<Orm extends OrmAdapter, Context> = (query: Orm["Query"], value: any, context: Context) => Orm["Query"];
147
+ type FilterModifiers$1<Orm extends OrmAdapter, Context> = Record<string, FilterModifier$1<Orm, Context>>;
148
+
135
149
  declare function defineCursorPaginator(options?: Partial<CursorPaginatorOptions>): CursorPaginator<OrmAdapter<any, any, any>, unknown>;
136
150
  interface CursorPaginatorOptions {
137
151
  fields?: string[];
@@ -149,7 +163,7 @@ declare class CursorPaginator<Orm extends OrmAdapter, Context> implements Pagina
149
163
  }
150
164
 
151
165
  interface RelationResolverOptions<Orm extends OrmAdapter, Context> extends Omit<FieldResolverOptions<Orm, Context>, "modify"> {
152
- filters?: FiltersDef;
166
+ filters?: FilterConfig;
153
167
  modify?: TableResolveModifier<Orm, Context>;
154
168
  }
155
169
  declare function defineRelationResolver<Orm extends OrmAdapter, Context>(options?: RelationResolverOptions<Orm, Context>): FieldResolver<Orm, Context>;
@@ -158,6 +172,11 @@ declare function definePageResolver<Orm extends OrmAdapter, Context>(paginator:
158
172
 
159
173
  type OrchidOrm = OrmAdapter<Table, Query, Pick<Promise<any>, "then" | "catch">>;
160
174
 
175
+ type FilterQueryOptions<Context = undefined> = FilterQueryOptions$1<OrchidOrm, Context>;
176
+ type FilterModifier<Context = undefined> = FilterModifier$1<OrchidOrm, Context>;
177
+ type FilterModifiers<Context = undefined> = FilterModifiers$1<OrchidOrm, Context>;
178
+ declare function filterQuery<Q extends Query, Context = undefined>(query: Q, filter: FilterValue, options?: FilterQueryOptions<Context>): Q;
179
+
161
180
  declare function createGraphResolver<Context = unknown>(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>): OrchidGraphResolver<Context>;
162
181
  declare class OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Context> {
163
182
  readonly types: Record<string, TableResolver<OrchidOrm, Context>>;
@@ -170,4 +189,4 @@ declare class OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Cont
170
189
 
171
190
  declare function defineTableResolver<Context = unknown>(table: Table, options?: TableResolverOptions<OrchidOrm, Context>): TableResolver<OrchidOrm, Context>;
172
191
 
173
- export { createGraphResolver, defineCursorPaginator as cursor, defineCursorPaginator, defineFieldResolver, definePageResolver, defineRelationResolver, defineTableResolver, defineFieldResolver as field, createGraphResolver as graph, definePageResolver as page, defineRelationResolver as relation, defineTableResolver as table };
192
+ export { type FilterModifier, type FilterModifiers, type FilterQueryOptions, type FilterValue, createGraphResolver, defineCursorPaginator as cursor, defineCursorPaginator, defineFieldResolver, definePageResolver, defineRelationResolver, defineTableResolver, defineFieldResolver as field, filterQuery, createGraphResolver as graph, definePageResolver as page, defineRelationResolver as relation, defineTableResolver as table };
package/dist/index.js CHANGED
@@ -1,5 +1,34 @@
1
+ // ../base/src/utils/is-plain-object.ts
2
+ function isPlainObject(obj) {
3
+ return typeof obj === "object" && !Array.isArray(obj);
4
+ }
5
+
6
+ // ../base/src/filter/filter.ts
7
+ function filterQuery(orm2, query, filter, options) {
8
+ const { context, modifiers } = options ?? {};
9
+ if (!filter) {
10
+ return query;
11
+ }
12
+ if (!isPlainObject(filter)) {
13
+ throw new Error(`Invalid filter: ${filter}, must be plain object.`);
14
+ }
15
+ for (const [field, value] of Object.entries(filter)) {
16
+ if (value === void 0) {
17
+ continue;
18
+ }
19
+ if (modifiers?.[field]) {
20
+ query = modifiers[field](query, value, context);
21
+ } else {
22
+ const [table_field, op0] = field.split("__");
23
+ const op = op0?.toLowerCase();
24
+ query = orm2.where(query, table_field, op, value);
25
+ }
26
+ }
27
+ return query;
28
+ }
29
+
1
30
  // ../base/src/paginators/cursor.ts
2
- import { Buffer } from "node:buffer";
31
+ import { Buffer } from "buffer";
3
32
  function defineCursorPaginator(options = {}) {
4
33
  return new CursorPaginator(options);
5
34
  }
@@ -229,38 +258,6 @@ function defineRelationResolver(options = {}) {
229
258
  };
230
259
  }
231
260
 
232
- // ../base/src/utils/is-plain-object.ts
233
- function is_plain_object(obj) {
234
- return typeof obj === "object" && !Array.isArray(obj);
235
- }
236
-
237
- // ../base/src/filters/filters.ts
238
- function apply_filters(query, { filters, modifiers, context }) {
239
- if (!filters) {
240
- return query;
241
- }
242
- const filter_obj = context.tree.args?.filter;
243
- if (!filter_obj) {
244
- return query;
245
- }
246
- if (!is_plain_object(filter_obj)) {
247
- throw new Error(`Invalid filter: ${filter_obj}, must be object.`);
248
- }
249
- for (const [field, value] of Object.entries(filter_obj)) {
250
- if (value === void 0) {
251
- continue;
252
- }
253
- if (modifiers?.[field]) {
254
- query = modifiers[field](query, value, context);
255
- } else {
256
- const [table_field, op0] = field.split("__");
257
- const op = op0?.toLowerCase();
258
- query = context.graph.orm.where(query, table_field, op, value);
259
- }
260
- }
261
- return query;
262
- }
263
-
264
261
  // ../base/src/resolvers/table.ts
265
262
  var TableResolver = class {
266
263
  constructor(orm2, table, options = {}) {
@@ -320,14 +317,16 @@ var TableResolver = class {
320
317
  query = r(query, { ...context, tree: subtree, field });
321
318
  }
322
319
  }
323
- const allow_all_filters = this.options.allowAllFilters ?? graph.options.allowAllFilters;
324
- const effective_filters = allow_all_filters ? true : filters;
325
- if (effective_filters) {
326
- query = apply_filters(query, {
327
- filters: effective_filters,
328
- modifiers: this.modifiers,
329
- context
330
- });
320
+ const filter = context.tree.args?.filter;
321
+ if (filter) {
322
+ const allowAllFilters = this.options.allowAllFilters ?? graph.options.allowAllFilters;
323
+ const filterConfig = allowAllFilters ? true : filters;
324
+ if (filterConfig) {
325
+ query = filterQuery(context.graph.orm, query, filter, {
326
+ modifiers: this.modifiers,
327
+ context
328
+ });
329
+ }
331
330
  }
332
331
  if (transform) {
333
332
  query = run_after_query(this.orm, query, (instance) => {
@@ -440,6 +439,11 @@ var orm = {
440
439
  }
441
440
  };
442
441
 
442
+ // src/filter.ts
443
+ function filterQuery2(query, filter, options) {
444
+ return filterQuery(orm, query, filter, options);
445
+ }
446
+
443
447
  // src/resolvers/graph.ts
444
448
  function createGraphResolver(types, options) {
445
449
  return new OrchidGraphResolver(types, options);
@@ -468,6 +472,7 @@ export {
468
472
  defineRelationResolver,
469
473
  defineTableResolver,
470
474
  defineFieldResolver as field,
475
+ filterQuery2 as filterQuery,
471
476
  createGraphResolver as graph,
472
477
  definePageResolver as page,
473
478
  defineRelationResolver as relation,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../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/utils/is-plain-object.ts","../../base/src/filters/filters.ts","../../base/src/resolvers/table.ts","../src/orm/orm.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["import { Buffer } from \"node:buffer\"\n\nimport { OrmAdapter, SortOrder } from \"../orm/orm\"\nimport { 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>\n\timplements Paginator<Orm, Context>\n{\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\tdir === \"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 { 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 { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { 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 { parseResolveInfo, ResolveTree } from \"graphql-parse-resolve-info\"\n\nimport { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\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?: FiltersDef\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 { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\nimport { FieldResolver, parse_field_options } from \"./field\"\nimport { 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 { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport {\n\tFieldResolver,\n\tFieldResolverOptions,\n\tparse_field_options,\n} from \"./field\"\nimport { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Orm extends OrmAdapter, Context>\n\textends Omit<FieldResolverOptions<Orm, Context>, \"modify\"> {\n\tfilters?: FiltersDef\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","export function is_plain_object(obj: any): obj is Record<string, any> {\n\treturn typeof obj === \"object\" && !Array.isArray(obj)\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { TableResolveContext } from \"../resolvers/table\"\nimport { is_plain_object } from \"../utils/is-plain-object\"\n\n// TODO: per-field definitions\nexport type FiltersDef = boolean\n\nexport type FilterScalarValue = null | string | number | boolean\nexport type FilterValue = FilterScalarValue | Exclude<FilterScalarValue, null>[]\nexport type Filter = { [property: string]: FilterValue }\n\ninterface ApplyFiltersOptions<Orm extends OrmAdapter, Context> {\n\tfilters: FiltersDef\n\tmodifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\tcontext: TableResolveContext<Orm, Context>\n}\n\nexport type ApplyFiltersModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tvalue: any,\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport function apply_filters<Orm extends OrmAdapter, Context>(\n\tquery: Orm[\"Query\"],\n\t{ filters, modifiers, context }: ApplyFiltersOptions<Orm, Context>,\n): Orm[\"Query\"] {\n\tif (!filters) {\n\t\treturn query\n\t}\n\tconst filter_obj = context.tree.args?.filter\n\tif (!filter_obj) {\n\t\treturn query\n\t}\n\tif (!is_plain_object(filter_obj)) {\n\t\tthrow new Error(`Invalid filter: ${filter_obj}, must be object.`)\n\t}\n\tfor (const [field, value] of Object.entries(filter_obj)) {\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)\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 = context.graph.orm.where(query, table_field, op, value)\n\t\t}\n\t}\n\treturn query\n}\n","import { apply_filters, ApplyFiltersModifier } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { defineFieldResolver, FieldResolver } 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, ApplyFiltersModifier<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| string\n\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 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, ApplyFiltersModifier<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\ttypeof 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\tthis.options.allowAllFields ??\n\t\t\tgraph.options.allowAllFields ??\n\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\tthis.table_field_resolvers?.[field] ||\n\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 allow_all_filters =\n\t\t\tthis.options.allowAllFilters ?? graph.options.allowAllFilters\n\n\t\tconst effective_filters = allow_all_filters ? true : filters\n\n\t\tif (effective_filters) {\n\t\t\tquery = apply_filters<Orm, Context>(query, {\n\t\t\t\tfilters: effective_filters,\n\t\t\t\tmodifiers: this.modifiers,\n\t\t\t\tcontext,\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\tthis.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 { 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 {\n\tGraphResolveOptions,\n\tGraphResolver,\n\tGraphResolverOptions,\n\tTableResolver,\n} from \"graphql-orm\"\nimport { Query } from \"orchid-orm\"\n\nimport { OrchidOrm, 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 { TableResolver, TableResolverOptions } from \"graphql-orm\"\nimport { Table } from \"orchid-orm\"\n\nimport { OrchidOrm, 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,SAAS,cAAc;AAKhB,SAAS,sBACf,UAA2C,CAAC,GAC3C;AACD,SAAO,IAAI,gBAAgB,OAAO;AACnC;AAiBA,IAAM,kBAAN,MAEA;AAAA,EACU,OAAO,CAAC,OAAO;AAAA,EAEf;AAAA,EAEA;AAAA,EAKT,YAAY,UAAkC,CAAC,GAAG;AACjD,SAAK,WAAW,QAAQ,QAAQ;AAChC,SAAK,SAAS,QAAQ,QAAQ,IAAI,CAAC,UAAU;AAC5C,UAAI,MAAM,WAAW,GAAG,GAAG;AAC1B,eAAO,EAAE,MAAM,MAAM,MAAM,CAAC,GAAG,MAAM,KAAK;AAAA,MAC3C,OAAO;AACN,eAAO,EAAE,MAAM,OAAO,MAAM,MAAM;AAAA,MACnC;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,SAAS,OAAqB,SAAwC;AACrE,UAAM,EAAE,KAAAA,KAAI,IAAI,QAAQ;AACxB,UAAM,EAAE,KAAK,IAAI,QAAQ;AAEzB,UAAM,WAAY,KAAK,QAA+B,KAAK;AAC3D,UAAM,SAAS,KAAK;AAEpB,UAAM,QAAQA,KAAI,gBAAgB,KAAK;AAEvC,UAAM,eACL,KAAK,SACF,KAAK,OAAO,IAAe,CAAC,OAAO;AAAA,MACnC,OAAO,EAAE;AAAA,MACT,KAAK,EAAE,OAAO,SAAS;AAAA,IACxB,EAAE,IACDA,KAAI,gBAAgB,KAAK,GAC3B,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,YAAY,EAAE,MAAM,EAAE;AAEnD,QAAI,KAAK,QAAQ;AAChB,cAAQA,KAAI,kBAAkB,KAAK;AACnC,iBAAW,EAAE,OAAO,IAAI,KAAK,aAAa;AACzC,gBAAQA,KAAI,gBAAgB,OAAO,EAAE,OAAO,OAAO,IAAI,CAAC;AAAA,MACzD;AAAA,IACD;AAEA,QAAI,CAAC,YAAY,QAAQ;AACxB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IACzC;AAEA,eAAW,EAAE,OAAO,MAAM,KAAK,aAAa;AAC3C,cAAQA,KAAI,aAAa,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC;AAAA,IACrD;AAEA,QAAI,QAAQ;AACX,YAAM,eAAe,YAAY,MAAM;AAIvC,YAAM,OAAiB,CAAC;AACxB,YAAM,QAAkB,CAAC;AACzB,eAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,EAAE,GAAG;AAC5C,cAAM,EAAE,OAAO,OAAO,IAAI,IAAI,YAAY,CAAC;AAC3C,cAAM,CAAC,aAAa,YAAY,IAC/B,QAAQ,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,IAAI;AAC7C,oBAAY,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG;AACxC,qBAAa,KAAK,MAAM,KAAK;AAAA,MAC9B;AACA,YAAM,UAAU,IAAI,KAAK,KAAK,GAAG,CAAC,QAAQ,MAAM,KAAK,GAAG,CAAC;AACzD,YAAM,WAAW,OAAO;AAAA,QACvB,YAAY,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;AAAA,MAC3D;AACA,cAAQA,KAAI,UAAU,OAAO,SAAS,QAAQ;AAAA,IAC/C;AACA,YAAQA,KAAI,gBAAgB,OAAO,WAAW,CAAC;AAG/C,aAAS,iBAAiB,MAAW;AACpC,aAAO;AAAA,QACN,YAAY,IAAI,CAAC,EAAE,OAAO,MAAM,MAAM;AACrC,gBAAM,QAAQ,KAAK,KAAK;AAExB,cAAI,UAAU,QAAW;AACxB,kBAAM,IAAI;AAAA,cACT,4CAA4C,KAAK,KAAK,KAAK;AAAA,YAC5D;AAAA,UACD;AACA,iBAAO,OAAO,KAAK;AAAA,QACpB,CAAC;AAAA,MACF;AAAA,IACD;AAEA,WAAOA,KAAI,sBAAsB,OAAO,CAAC,UAAU;AAClD,UAAIC;AACJ,UAAI,MAAM,SAAS,UAAU;AAC5B,QAAAA,UAAS,iBAAiB,MAAM,WAAW,CAAC,CAAC;AAC7C,gBAAQ,MAAM,MAAM,GAAG,QAAQ;AAAA,MAChC;AACA,aAAO,EAAE,OAAO,QAAAA,QAAO;AAAA,IACxB,CAAC;AAAA,EACF;AACD;AAEA,SAAS,aAAa,OAAiB;AACtC,SAAO,OAAO,KAAK,MAAM,IAAI,MAAM,EAAE,KAAK,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE;AAAA,IAClE;AAAA,EACD;AACD;AAEA,SAAS,YAAY,QAA0B;AAC9C,SAAO,OAAO,KAAK,QAAQ,WAAW,EACpC,SAAS,EACT,MAAM,OAAO,aAAa,CAAC,CAAC;AAC/B;;;AC3IO,SAAS,gBACfC,MACA,OACA,WACe;AACf,SAAOA,KAAI,gBAAgB,OAAO,OAAO,WAAW;AAEnD,QAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,YAAM,UAAU,MAAM,QAAQ,IAAI,OAAO,IAAI,SAAS,CAAC;AACvD,aAAO,QAAQ,OAAO,OAAO;AAAA,IAC9B,WAAW,QAAQ;AAClB,aAAO,UAAU,MAAM;AAAA,IACxB,OAAO;AAEN,aAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;;;ACiBO,SAAS,oBAEd,SAAmC;AACpC,QAAM,EAAE,YAAY,WAAW,IAAI;AACnC,MAAI,cAAc,YAAY;AAC7B,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,SAAO,EAAE,GAAG,SAAS,YAAY,cAAc,WAAW;AAC3D;AAEO,SAAS,oBACf,UAA8C,CAAC,GACjB;AAC9B,QAAM,EAAE,YAAY,QAAQ,UAAU,IAAI,oBAAoB,OAAO;AAErE,SAAO,SAAS,QAAQ,OAAO,SAAS;AACvC,UAAM,EAAE,MAAM,IAAI;AAClB,QAAI,QAAQ;AACX,cAAQ,OAAO,OAAO,OAAO;AAAA,IAC9B,OAAO;AACN,cAAQ,QAAQ,MAAM,IAAI,aAAa,OAAO;AAAA,QAC7C,OAAO,cAAc;AAAA,QACrB,IAAI;AAAA,MACL,CAAC;AAAA,IACF;AACA,QAAI,WAAW;AACd,cAAQ,gBAAgB,QAAQ,MAAM,KAAK,OAAO,OAAO,aAAa;AACrE,iBAAS,KAAK,IAAI,MAAM,UAAU,SAAS,KAAK,GAAG,UAAU,OAAO;AACpE,eAAO;AAAA,MACR,CAAC;AAAA,IACF;AACA,WAAO;AAAA,EACR;AACD;;;ACtEA,SAAS,wBAAqC;AA2BvC,IAAM,gBAAN,MAAqD;AAAA,EAC3D,YACUC,MACA,gBACA,UAA8C,CAAC,GACvD;AAHQ,eAAAA;AACA;AACA;AAAA,EACP;AAAA,EAEH,QACC,OACA,EAAE,MAAM,GAAG,QAAQ,GACN;AACb,UAAM,OAAO,KAAK,kBAAkB,IAAI;AACxC,WAAO,KAAK,cAAc,OAAO,EAAE,GAAG,SAAS,KAAK,CAAC;AAAA,EACtD;AAAA,EAEA,YACC,OACA,WACA,EAAE,MAAM,GAAG,QAAQ,GAClB;AACD,UAAM,OAAO,KAAK,kBAAkB,IAAI;AACxC,WAAO,KAAK,cAAc,OAAO,WAAW,EAAE,GAAG,SAAS,KAAK,CAAC;AAAA,EACjE;AAAA,EAEA,kBAAkB,MAA0B;AAC3C,WAAO,iBAAiB,IAAI;AAAA,EAC7B;AAAA,EAEA,cACC,OACA,SACe;AACf,QAAI,EAAE,KAAK,IAAI;AAEf,QAAI,QAAQ,MAAM;AACjB,iBAAW,SAAS,QAAQ,MAAM;AACjC,cAAMC,QAAO,OAAO,KAAK,KAAK,gBAAgB,EAAE,CAAC;AACjD,eAAO,KAAK,iBAAiBA,KAAI,EAAE,KAAK;AACxC,YAAI,CAAC,MAAM;AAKV,iBAAO,QAAQ,QAAQ;AAAA,QACxB;AAAA,MACD;AAAA,IACD;AACA,UAAM,OAAO,OAAO,KAAK,KAAK,gBAAgB,EAAE,CAAC;AACjD,UAAM,gBAAgB,KAAK,eAAe,IAAI;AAC9C,QAAI,CAAC,eAAe;AACnB,YAAM,IAAI,MAAM,+BAA+B,IAAI,GAAG;AAAA,IACvD;AACA,WAAO,cAAc,QAAQ,OAAO;AAAA,MACnC,GAAG;AAAA,MACH,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACP,CAAC;AAAA,EACF;AAAA,EAEA,cACC,OACA,WACA,SACC;AACD,QAAI,QAAQ,MAAM;AAEjB,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACpE;AACA,YAAQ,KAAK,cAAc,OAAO,EAAE,GAAG,SAAS,MAAM,UAAU,KAAK,CAAC;AACtE,WAAO,UAAU,SAAS,OAAO;AAAA,MAChC,GAAG;AAAA,MACH,OAAO;AAAA,IACR,CAAC;AAAA,EACF;AACD;;;ACnGO,SAAS,mBACf,WACA,UAAiD,CAAC,GACpB;AAC9B,QAAM,EAAE,YAAY,OAAO,IAAI,oBAAoB,OAAO;AAE1D,SAAO,SAAS,QAAQ,OAAO,SAAS;AACvC,UAAM,EAAE,OAAO,MAAM,IAAI;AAIzB,UAAM,qBAAqB,CAAC;AAC5B,YAAQ,MAAM,IAAI,gBAAgB,OAAO;AAAA,MACxC,UAAU,cAAc;AAAA,MACxB,IAAI;AAAA,MACJ,OAAO,UAAU;AAChB,mBAAW,SAAS,OAAO,UAAU,OAAO,IAAI;AAChD,mBAAW,MAAM,cAAc,UAAU,WAAW,OAAO;AAC3D,mBAAW,MAAM,IAAI;AAAA,UACpB;AAAA,UACA;AAAA,QACD;AACA,eAAO;AAAA,MACR;AAAA,IACD,CAAC;AACD,YAAQ,MAAM,IAAI,wBAAwB,OAAO,OAAO,kBAAkB;AAC1E,WAAO;AAAA,EACR;AACD;;;AClBO,SAAS,uBACf,UAAiD,CAAC,GACpB;AAC9B,QAAM,EAAE,YAAY,SAAS,OAAO,IAAI,oBAAoB,OAAO;AAEnE,SAAO,SAAS,QAAQ,OAAO,SAAS;AACvC,UAAM,EAAE,OAAO,MAAM,IAAI;AACzB,WAAO,MAAM,IAAI,gBAAgB,OAAO;AAAA,MACvC,UAAU,cAAc;AAAA,MACxB,IAAI;AAAA,MACJ,OAAO,UAAU;AAChB,mBAAW,MAAM,cAAc,UAAU,EAAE,GAAG,SAAS,QAAQ,CAAC;AAChE,eAAO,SAAS,OAAO,UAAU,OAAO,IAAI;AAAA,MAC7C;AAAA,IACD,CAAC;AAAA,EACF;AACD;;;AC/BO,SAAS,gBAAgB,KAAsC;AACrE,SAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG;AACrD;;;ACqBO,SAAS,cACf,OACA,EAAE,SAAS,WAAW,QAAQ,GACf;AACf,MAAI,CAAC,SAAS;AACb,WAAO;AAAA,EACR;AACA,QAAM,aAAa,QAAQ,KAAK,MAAM;AACtC,MAAI,CAAC,YAAY;AAChB,WAAO;AAAA,EACR;AACA,MAAI,CAAC,gBAAgB,UAAU,GAAG;AACjC,UAAM,IAAI,MAAM,mBAAmB,UAAU,mBAAmB;AAAA,EACjE;AACA,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACxD,QAAI,UAAU,QAAW;AAExB;AAAA,IACD;AACA,QAAI,YAAY,KAAK,GAAG;AACvB,cAAQ,UAAU,KAAK,EAAE,OAAO,OAAO,OAAO;AAAA,IAC/C,OAAO;AACN,YAAM,CAAC,aAAa,GAAG,IAAI,MAAM,MAAM,IAAI;AAC3C,YAAM,KAAK,KAAK,YAAY;AAE5B,cAAQ,QAAQ,MAAM,IAAI,MAAM,OAAO,aAAa,IAAI,KAAK;AAAA,IAC9D;AAAA,EACD;AACA,SAAO;AACR;;;ACjBO,IAAM,gBAAN,MAAqD;AAAA,EAQ3D,YACUC,MACA,OACA,UAA8C,CAAC,GACvD;AAHQ,eAAAA;AACA;AACA;AAET,SAAK,YAAY,IAAI,IAAIA,KAAI,oBAAoB,KAAK,CAAC;AACvD,SAAK,iBAAiB,IAAI,IAAIA,KAAI,yBAAyB,KAAK,CAAC;AACjE,SAAK,YAAY,EAAE,GAAGA,KAAI,oBAAoB,KAAK,GAAG,GAAG,QAAQ,UAAU;AAG3E,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI,QAAQ;AACX,WAAK,wBAAwB,OAAO,KAAK,MAAM,EAAE,OAE/C,CAAC,WAAW,UAAU;AACvB,cAAM,KAAK,OAAO,KAAK;AACvB,cAAM,IACL,OAAO,OAAO,aACX,KACA,OAAO,OACN,KAAK,4BAA4B,KAAK,IACtC,OAAO,OAAO,WACb,KAAK,4BAA4B,OAAO,EAAE,IAC1C;AACN,YAAI,MAAM,QAAW;AACpB,gBAAM,IAAI;AAAA,YACT,6DAA6D,OAAO,EAAE;AAAA,UACvE;AAAA,QACD;AACA,kBAAU,KAAK,IAAI;AACnB,eAAO;AAAA,MACR,GAAG,CAAC,CAAC;AAAA,IACN;AAAA,EACD;AAAA;AAAA,EAvCS;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA;AAAA,EAsCT,QAAQ,OAAqB,SAA4C;AACxE,UAAM,EAAE,QAAQ,UAAU,IAAI,KAAK;AACnC,UAAM,EAAE,OAAO,MAAM,MAAM,QAAQ,IAAI;AAEvC,UAAM,cAAc,KAAK,IAAI,gBAAgB,KAAK;AAClD,UAAM,cAAc,KAAK,IAAI,gBAAgB,KAAK,KAAK;AAEvD,QAAI,gBAAgB,aAAa;AAChC,YAAM,IAAI;AAAA,QACT,oCAAoC,IAAI,cAAc,WAAW,cAAc,WAAW;AAAA,MAC3F;AAAA,IACD;AAEA,UAAM,mBACL,KAAK,QAAQ,kBACb,MAAM,QAAQ,kBACd,CAAC,KAAK,QAAQ;AAEf,QAAI,CAAC,oBAAoB,CAAC,KAAK,uBAAuB;AACrD,YAAM,IAAI;AAAA,QACT,qBAAqB,IAAI;AAAA,MAC1B;AAAA,IACD;AAEA,QAAI,QAAQ;AACX,cAAQ,OAAO,OAAO,OAAO;AAAA,IAC9B;AAEA,eAAW,WAAW,OAAO,OAAO,KAAK,iBAAiB,IAAI,CAAC,GAAG;AACjE,YAAM,QAAQ,QAAQ;AACtB,YAAM,IACL,KAAK,wBAAwB,KAAK,MACjC,mBAAmB,KAAK,4BAA4B,KAAK,IAAI;AAC/D,UAAI,CAAC,GAAG;AACP,cAAM,IAAI,MAAM,uCAAuC,IAAI,IAAI,KAAK,GAAG;AAAA,MACxE;AACA,UAAI,GAAG;AACN,gBAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,MAAM,SAAS,MAAM,CAAC;AAAA,MACtD;AAAA,IACD;AAEA,UAAM,oBACL,KAAK,QAAQ,mBAAmB,MAAM,QAAQ;AAE/C,UAAM,oBAAoB,oBAAoB,OAAO;AAErD,QAAI,mBAAmB;AACtB,cAAQ,cAA4B,OAAO;AAAA,QAC1C,SAAS;AAAA,QACT,WAAW,KAAK;AAAA,QAChB;AAAA,MACD,CAAC;AAAA,IACF;AAEA,QAAI,WAAW;AACd,cAAQ,gBAAgB,KAAK,KAAK,OAAO,CAAC,aAAa;AACtD,eAAO,UAAU,UAAU,OAAO;AAAA,MACnC,CAAC;AAAA,IACF;AAEA,YAAQ,KAAK,IAAI,mBAAmB,KAAK;AAEzC,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,4BACC,OACA,YAC8B;AAC9B,UAAM,qBAAqB,cAAc;AACzC,QACC,KAAK,QAAQ,YAAY,kBAAkB,KAC3C,KAAK,eAAe,IAAI,kBAAkB,GACzC;AAED,aAAO,CAAC,UAAU;AAAA,IACnB,WAAW,KAAK,UAAU,IAAI,kBAAkB,GAAG;AAElD,aAAO,uBAAuB,EAAE,WAAW,CAAC;AAAA,IAC7C,OAAO;AAEN,aAAO,oBAAoB,EAAE,WAAW,CAAC;AAAA,IAC1C;AAAA,EACD;AACD;;;ACpKA,SAAS,WAAW;AASb,IAAM,MAAiB;AAAA,EAC7B,OAAO;AAAA,EACP,OAAO;AAAA,EACP,gBAAgB;AAAA;AAAA,EAIhB,gBAAgB,OAAO;AACtB,WAAO,MAAM;AAAA,EACd;AAAA,EAEA,oBAAoB,OAAO;AAC1B,WAAO,OAAO,KAAK,MAAM,SAAS;AAAA,EACnC;AAAA,EAEA,2BAA2B;AAE1B,WAAO,CAAC;AAAA,EACT;AAAA,EAEA,sBAAsB;AACrB,WAAO;AAAA,EACR;AAAA,EAEA,gBAAgB,OAAO;AACtB,QAAI,CAAC,MAAM,OAAO;AACjB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IACzC;AACA,WAAO,MAAM;AAAA,EACd;AAAA;AAAA,EAIA,aAAa,OAAO,EAAE,OAAO,GAAG,GAAG;AAClC,WAAO,MAAM,OAAO,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;AAAA,EACpC;AAAA,EAEA,gBAAgB,OAAO,EAAE,UAAU,IAAI,OAAO,GAAG;AAEhD,WAAO,MAAM,OAAO;AAAA,MACnB,CAAC,EAAE,GAAG,CAAC,MAAW,OAAO,EAAE,QAAQ,CAAC;AAAA,IACrC,CAAQ;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,OAAO,OAAO,IAAI,OAAO;AAC9B,WAAO,MAAM,MAAM,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC;AAAA,EAC7D;AAAA,EAEA,UAAU,OAAO,YAAY,UAAU;AACtC,WAAO,MAAM,MAAM,IAAI,EAAE,KAAK,YAAY,QAAQ,SAAS,CAAC,CAAC;AAAA,EAC9D;AAAA;AAAA,EAIA,kBAAkB,OAAO;AACxB,WAAO,MAAM,MAAM,OAAO;AAAA,EAC3B;AAAA,EAEA,gBAAgB,OAAO,EAAE,OAAO,IAAI,GAAG;AACtC,WAAO,MAAM,MAAM,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;AAAA,EACpC;AAAA,EAEA,gBAAgB,OAAO;AACtB,WACE,MAAM,EAAsB,OAAO,QAAmB,CAAC,cAAc;AACrE,UAAI,OAAO,cAAc,UAAU;AAClC,eAAO,EAAE,OAAO,aAAa,KAAK,MAAM;AAAA,MACzC,WAAW,OAAO,cAAc,UAAU;AACzC,eAAO,OAAO,QAAQ,SAAS,EAAE,IAAe,CAAC,CAAC,OAAO,KAAK,MAAM;AACnE,gBAAM,CAAC,GAAG,IAAI,MAAM,MAAM,KAAK,CAAC;AAChC,cAAI,QAAQ,SAAS,QAAQ,QAAQ;AACpC,mBAAO,EAAE,OAAO,IAAI;AAAA,UACrB,OAAO;AACN,kBAAM,IAAI,MAAM,wBAAwB,KAAK;AAAA,UAC9C;AAAA,QACD,CAAC;AAAA,MACF,OAAO;AACN,cAAM,IAAI,UAAU,6BAA6B,SAAS;AAAA,MAC3D;AAAA,IACD,CAAC,KAAK,CAAC;AAAA,EAET;AAAA,EAEA,gBAAgB,OAAO,OAAO;AAC7B,WAAO,MAAM,MAAM,KAAK;AAAA,EACzB;AAAA;AAAA,EAIA,sBAAsB,OAAO,UAAU;AACtC,WAAO,MAAM,UAAU,CAAC,UAAU,SAAS,KAAY,CAAC;AAAA,EACzD;AAAA,EAEA,2BAA2B,UAAU;AACpC,WAAO;AAAA,EACR;AAAA,EAEA,wBAAwB,OAAO;AAC9B,WAAO;AAAA,EACR;AAAA;AAAA,EAIA,gBAAgB,OAAO,IAAI;AAC1B,WAAO,MAAM,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;AAAA,EAC3C;AAAA,EAEA,mBAAmB,OAAO;AAEzB,WAAO;AAAA,EACR;AACD;;;AClHO,SAAS,oBACf,OACA,SACC;AACD,SAAO,IAAI,oBAA6B,OAAO,OAAO;AACvD;AAEA,IAAM,sBAAN,cAA2C,cAAkC;AAAA,EAC5E,YACiB,OACA,UAAoD,CAAC,GACpE;AACD,UAAM,KAAK,OAAO,OAAO;AAHT;AACA;AAAA,EAGjB;AAAA,EAEA,QACC,OASA,SACa;AACb,WAAO,MAAM,QAAQ,OAAO,OAAO;AAAA,EACpC;AACD;;;AClCO,SAAS,oBACf,OACA,UAAoD,CAAC,GACpD;AACD,SAAO,IAAI,cAAc,KAAK,OAAc,OAAO;AACpD;","names":["orm","cursor","orm","orm","type","orm"]}
1
+ {"version":3,"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 }\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":";AAAO,SAAS,cAAc,KAAsC;AACnE,SAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG;AACrD;;;ACwBO,SAAS,YACfA,MACA,OACA,QACA,SACe;AACf,QAAM,EAAE,SAAS,UAAU,IAAI,WAAW,CAAC;AAE3C,MAAI,CAAC,QAAQ;AACZ,WAAO;AAAA,EACR;AACA,MAAI,CAAC,cAAc,MAAM,GAAG;AAC3B,UAAM,IAAI,MAAM,mBAAmB,MAAM,yBAAyB;AAAA,EACnE;AACA,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACpD,QAAI,UAAU,QAAW;AAExB;AAAA,IACD;AACA,QAAI,YAAY,KAAK,GAAG;AACvB,cAAQ,UAAU,KAAK,EAAE,OAAO,OAAO,OAAQ;AAAA,IAChD,OAAO;AACN,YAAM,CAAC,aAAa,GAAG,IAAI,MAAM,MAAM,IAAI;AAC3C,YAAM,KAAK,KAAK,YAAY;AAE5B,cAAQA,KAAI,MAAM,OAAO,aAAa,IAAI,KAAK;AAAA,IAChD;AAAA,EACD;AACA,SAAO;AACR;;;ACvDA,SAAS,cAAc;AAMhB,SAAS,sBACf,UAA2C,CAAC,GAC3C;AACD,SAAO,IAAI,gBAAgB,OAAO;AACnC;AAiBA,IAAM,kBAAN,MACmC;AAAA,EACzB,OAAO,CAAC,OAAO;AAAA,EAEf;AAAA,EAEA;AAAA,EAKT,YAAY,UAAkC,CAAC,GAAG;AACjD,SAAK,WAAW,QAAQ,QAAQ;AAChC,SAAK,SAAS,QAAQ,QAAQ,IAAI,CAAC,UAAU;AAC5C,UAAI,MAAM,WAAW,GAAG,GAAG;AAC1B,eAAO,EAAE,MAAM,MAAM,MAAM,CAAC,GAAG,MAAM,KAAK;AAAA,MAC3C,OAAO;AACN,eAAO,EAAE,MAAM,OAAO,MAAM,MAAM;AAAA,MACnC;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,SAAS,OAAqB,SAAwC;AACrE,UAAM,EAAE,KAAAC,KAAI,IAAI,QAAQ;AACxB,UAAM,EAAE,KAAK,IAAI,QAAQ;AAEzB,UAAM,WAAY,KAAK,QAA+B,KAAK;AAC3D,UAAM,SAAS,KAAK;AAEpB,UAAM,QAAQA,KAAI,gBAAgB,KAAK;AAEvC,UAAM,eACL,KAAK,SACF,KAAK,OAAO,IAAe,QAAM;AAAA,MACjC,OAAO,EAAE;AAAA,MACT,KAAK,EAAE,OAAO,SAAS;AAAA,IACxB,EAAE,IACDA,KAAI,gBAAgB,KAAK,GAC3B,IAAI,QAAM,EAAE,GAAG,GAAG,OAAO,YAAY,EAAE,MAAM,EAAE;AAEjD,QAAI,KAAK,QAAQ;AAChB,cAAQA,KAAI,kBAAkB,KAAK;AACnC,iBAAW,EAAE,OAAO,IAAI,KAAK,aAAa;AACzC,gBAAQA,KAAI,gBAAgB,OAAO,EAAE,OAAO,OAAO,IAAI,CAAC;AAAA,MACzD;AAAA,IACD;AAEA,QAAI,CAAC,YAAY,QAAQ;AACxB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IACzC;AAEA,eAAW,EAAE,OAAO,MAAM,KAAK,aAAa;AAC3C,cAAQA,KAAI,aAAa,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC;AAAA,IACrD;AAEA,QAAI,QAAQ;AACX,YAAM,eAAe,YAAY,MAAM;AAIvC,YAAM,OAAiB,CAAC;AACxB,YAAM,QAAkB,CAAC;AACzB,eAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,EAAE,GAAG;AAC5C,cAAM,EAAE,OAAO,OAAO,IAAI,IAAI,YAAY,CAAC;AAC3C,cAAM,CAAC,aAAa,YAAY,IAC7B,QAAQ,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,IAAI;AAC/C,oBAAY,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG;AACxC,qBAAa,KAAK,MAAM,KAAK;AAAA,MAC9B;AACA,YAAM,UAAU,IAAI,KAAK,KAAK,GAAG,CAAC,QAAQ,MAAM,KAAK,GAAG,CAAC;AACzD,YAAM,WAAW,OAAO;AAAA,QACvB,YAAY,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;AAAA,MAC3D;AACA,cAAQA,KAAI,UAAU,OAAO,SAAS,QAAQ;AAAA,IAC/C;AACA,YAAQA,KAAI,gBAAgB,OAAO,WAAW,CAAC;AAG/C,aAAS,iBAAiB,MAAW;AACpC,aAAO;AAAA,QACN,YAAY,IAAI,CAAC,EAAE,OAAO,MAAM,MAAM;AACrC,gBAAM,QAAQ,KAAK,KAAK;AAExB,cAAI,UAAU,QAAW;AACxB,kBAAM,IAAI;AAAA,cACT,4CAA4C,KAAK,KAAK,KAAK;AAAA,YAC5D;AAAA,UACD;AACA,iBAAO,OAAO,KAAK;AAAA,QACpB,CAAC;AAAA,MACF;AAAA,IACD;AAEA,WAAOA,KAAI,sBAAsB,OAAO,CAAC,UAAU;AAClD,UAAIC;AACJ,UAAI,MAAM,SAAS,UAAU;AAC5B,QAAAA,UAAS,iBAAiB,MAAM,WAAW,CAAC,CAAC;AAC7C,gBAAQ,MAAM,MAAM,GAAG,QAAQ;AAAA,MAChC;AACA,aAAO,EAAE,OAAO,QAAAA,QAAO;AAAA,IACxB,CAAC;AAAA,EACF;AACD;AAEA,SAAS,aAAa,OAAiB;AACtC,SAAO,OAAO,KAAK,MAAM,IAAI,MAAM,EAAE,KAAK,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE;AAAA,IAClE;AAAA,EACD;AACD;AAEA,SAAS,YAAY,QAA0B;AAC9C,SAAO,OAAO,KAAK,QAAQ,WAAW,EACpC,SAAS,EACT,MAAM,OAAO,aAAa,CAAC,CAAC;AAC/B;;;AC3IO,SAAS,gBACfC,MACA,OACA,WACe;AACf,SAAOA,KAAI,gBAAgB,OAAO,OAAO,WAAW;AAEnD,QAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,YAAM,UAAU,MAAM,QAAQ,IAAI,OAAO,IAAI,SAAS,CAAC;AACvD,aAAO,QAAQ,OAAO,OAAO;AAAA,IAC9B,WAAW,QAAQ;AAClB,aAAO,UAAU,MAAM;AAAA,IACxB,OAAO;AAEN,aAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;;;ACkBO,SAAS,oBAEd,SAAmC;AACpC,QAAM,EAAE,YAAY,WAAW,IAAI;AACnC,MAAI,cAAc,YAAY;AAC7B,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,SAAO,EAAE,GAAG,SAAS,YAAY,cAAc,WAAW;AAC3D;AAEO,SAAS,oBACf,UAA8C,CAAC,GACjB;AAC9B,QAAM,EAAE,YAAY,QAAQ,UAAU,IAAI,oBAAoB,OAAO;AAErE,SAAO,SAAS,QAAQ,OAAO,SAAS;AACvC,UAAM,EAAE,MAAM,IAAI;AAClB,QAAI,QAAQ;AACX,cAAQ,OAAO,OAAO,OAAO;AAAA,IAC9B,OAAO;AACN,cAAQ,QAAQ,MAAM,IAAI,aAAa,OAAO;AAAA,QAC7C,OAAO,cAAc;AAAA,QACrB,IAAI;AAAA,MACL,CAAC;AAAA,IACF;AACA,QAAI,WAAW;AACd,cAAQ,gBAAgB,QAAQ,MAAM,KAAK,OAAO,OAAO,aAAa;AACrE,iBAAS,KAAK,IAAI,MAAM,UAAU,SAAS,KAAK,GAAG,UAAU,OAAO;AACpE,eAAO;AAAA,MACR,CAAC;AAAA,IACF;AACA,WAAO;AAAA,EACR;AACD;;;ACtEA,SAAS,wBAAwB;AA4B1B,IAAM,gBAAN,MAAqD;AAAA,EAC3D,YACUC,MACA,gBACA,UAA8C,CAAC,GACvD;AAHQ,eAAAA;AACA;AACA;AAAA,EACP;AAAA,EAEH,QACC,OACA,EAAE,MAAM,GAAG,QAAQ,GACN;AACb,UAAM,OAAO,KAAK,kBAAkB,IAAI;AACxC,WAAO,KAAK,cAAc,OAAO,EAAE,GAAG,SAAS,KAAK,CAAC;AAAA,EACtD;AAAA,EAEA,YACC,OACA,WACA,EAAE,MAAM,GAAG,QAAQ,GAClB;AACD,UAAM,OAAO,KAAK,kBAAkB,IAAI;AACxC,WAAO,KAAK,cAAc,OAAO,WAAW,EAAE,GAAG,SAAS,KAAK,CAAC;AAAA,EACjE;AAAA,EAEA,kBAAkB,MAA0B;AAC3C,WAAO,iBAAiB,IAAI;AAAA,EAC7B;AAAA,EAEA,cACC,OACA,SACe;AACf,QAAI,EAAE,KAAK,IAAI;AAEf,QAAI,QAAQ,MAAM;AACjB,iBAAW,SAAS,QAAQ,MAAM;AACjC,cAAMC,QAAO,OAAO,KAAK,KAAK,gBAAgB,EAAE,CAAC;AACjD,eAAO,KAAK,iBAAiBA,KAAI,EAAE,KAAK;AACxC,YAAI,CAAC,MAAM;AAKV,iBAAO,QAAQ,QAAQ;AAAA,QACxB;AAAA,MACD;AAAA,IACD;AACA,UAAM,OAAO,OAAO,KAAK,KAAK,gBAAgB,EAAE,CAAC;AACjD,UAAM,gBAAgB,KAAK,eAAe,IAAI;AAC9C,QAAI,CAAC,eAAe;AACnB,YAAM,IAAI,MAAM,+BAA+B,IAAI,GAAG;AAAA,IACvD;AACA,WAAO,cAAc,QAAQ,OAAO;AAAA,MACnC,GAAG;AAAA,MACH,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACP,CAAC;AAAA,EACF;AAAA,EAEA,cACC,OACA,WACA,SACC;AACD,QAAI,QAAQ,MAAM;AAEjB,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACpE;AACA,YAAQ,KAAK,cAAc,OAAO,EAAE,GAAG,SAAS,MAAM,UAAU,KAAK,CAAC;AACtE,WAAO,UAAU,SAAS,OAAO;AAAA,MAChC,GAAG;AAAA,MACH,OAAO;AAAA,IACR,CAAC;AAAA,EACF;AACD;;;ACnGO,SAAS,mBACf,WACA,UAAiD,CAAC,GACpB;AAC9B,QAAM,EAAE,YAAY,OAAO,IAAI,oBAAoB,OAAO;AAE1D,SAAO,SAAS,QAAQ,OAAO,SAAS;AACvC,UAAM,EAAE,OAAO,MAAM,IAAI;AAIzB,UAAM,qBAAqB,CAAC;AAC5B,YAAQ,MAAM,IAAI,gBAAgB,OAAO;AAAA,MACxC,UAAU,cAAc;AAAA,MACxB,IAAI;AAAA,MACJ,OAAO,UAAU;AAChB,mBAAW,SAAS,OAAO,UAAU,OAAO,IAAI;AAChD,mBAAW,MAAM,cAAc,UAAU,WAAW,OAAO;AAC3D,mBAAW,MAAM,IAAI;AAAA,UACpB;AAAA,UACA;AAAA,QACD;AACA,eAAO;AAAA,MACR;AAAA,IACD,CAAC;AACD,YAAQ,MAAM,IAAI,wBAAwB,OAAO,OAAO,kBAAkB;AAC1E,WAAO;AAAA,EACR;AACD;;;ACnBO,SAAS,uBACf,UAAiD,CAAC,GACpB;AAC9B,QAAM,EAAE,YAAY,SAAS,OAAO,IAAI,oBAAoB,OAAO;AAEnE,SAAO,SAAS,QAAQ,OAAO,SAAS;AACvC,UAAM,EAAE,OAAO,MAAM,IAAI;AACzB,WAAO,MAAM,IAAI,gBAAgB,OAAO;AAAA,MACvC,UAAU,cAAc;AAAA,MACxB,IAAI;AAAA,MACJ,OAAO,UAAU;AAChB,mBAAW,MAAM,cAAc,UAAU,EAAE,GAAG,SAAS,QAAQ,CAAC;AAChE,eAAO,SAAS,OAAO,UAAU,OAAO,IAAI;AAAA,MAC7C;AAAA,IACD,CAAC;AAAA,EACF;AACD;;;ACQO,IAAM,gBAAN,MAAqD;AAAA,EAQ3D,YACUC,MACA,OACA,UAA8C,CAAC,GACvD;AAHQ,eAAAA;AACA;AACA;AAET,SAAK,YAAY,IAAI,IAAIA,KAAI,oBAAoB,KAAK,CAAC;AACvD,SAAK,iBAAiB,IAAI,IAAIA,KAAI,yBAAyB,KAAK,CAAC;AACjE,SAAK,YAAY,EAAE,GAAGA,KAAI,oBAAoB,KAAK,GAAG,GAAG,QAAQ,UAAU;AAG3E,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI,QAAQ;AACX,WAAK,wBAAwB,OAAO,KAAK,MAAM,EAAE,OAE/C,CAAC,WAAW,UAAU;AACvB,cAAM,KAAK,OAAO,KAAK;AACvB,cAAM,IACH,OAAO,OAAO,aACb,KACA,OAAO,OACN,KAAK,4BAA4B,KAAK,IACtC,OAAO,OAAO,WACb,KAAK,4BAA4B,OAAO,EAAE,IAC1C;AACN,YAAI,MAAM,QAAW;AACpB,gBAAM,IAAI;AAAA,YACT,6DAA6D,OAAO,EAAE;AAAA,UACvE;AAAA,QACD;AACA,kBAAU,KAAK,IAAI;AACnB,eAAO;AAAA,MACR,GAAG,CAAC,CAAC;AAAA,IACN;AAAA,EACD;AAAA;AAAA,EAvCS;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA;AAAA,EAsCT,QAAQ,OAAqB,SAA4C;AACxE,UAAM,EAAE,QAAQ,UAAU,IAAI,KAAK;AACnC,UAAM,EAAE,OAAO,MAAM,MAAM,QAAQ,IAAI;AAEvC,UAAM,cAAc,KAAK,IAAI,gBAAgB,KAAK;AAClD,UAAM,cAAc,KAAK,IAAI,gBAAgB,KAAK,KAAK;AAEvD,QAAI,gBAAgB,aAAa;AAChC,YAAM,IAAI;AAAA,QACT,oCAAoC,IAAI,cAAc,WAAW,cAAc,WAAW;AAAA,MAC3F;AAAA,IACD;AAEA,UAAM,mBACH,KAAK,QAAQ,kBACX,MAAM,QAAQ,kBACd,CAAC,KAAK,QAAQ;AAEnB,QAAI,CAAC,oBAAoB,CAAC,KAAK,uBAAuB;AACrD,YAAM,IAAI;AAAA,QACT,qBAAqB,IAAI;AAAA,MAC1B;AAAA,IACD;AAEA,QAAI,QAAQ;AACX,cAAQ,OAAO,OAAO,OAAO;AAAA,IAC9B;AAEA,eAAW,WAAW,OAAO,OAAO,KAAK,iBAAiB,IAAI,CAAC,GAAG;AACjE,YAAM,QAAQ,QAAQ;AACtB,YAAM,IACH,KAAK,wBAAwB,KAAK,MAC/B,mBAAmB,KAAK,4BAA4B,KAAK,IAAI;AACnE,UAAI,CAAC,GAAG;AACP,cAAM,IAAI,MAAM,uCAAuC,IAAI,IAAI,KAAK,GAAG;AAAA,MACxE;AACA,UAAI,GAAG;AACN,gBAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,MAAM,SAAS,MAAM,CAAC;AAAA,MACtD;AAAA,IACD;AAEA,UAAM,SAAS,QAAQ,KAAK,MAAM;AAClC,QAAI,QAAQ;AACX,YAAM,kBAAkB,KAAK,QAAQ,mBAAmB,MAAM,QAAQ;AACtE,YAAM,eAAe,kBAAkB,OAAO;AAE9C,UAAI,cAAc;AACjB,gBAAQ,YAAoD,QAAQ,MAAM,KAAK,OAAO,QAAuB;AAAA,UAC5G,WAAW,KAAK;AAAA,UAChB;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAEA,QAAI,WAAW;AACd,cAAQ,gBAAgB,KAAK,KAAK,OAAO,CAAC,aAAa;AACtD,eAAO,UAAU,UAAU,OAAO;AAAA,MACnC,CAAC;AAAA,IACF;AAEA,YAAQ,KAAK,IAAI,mBAAmB,KAAK;AAEzC,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,4BACC,OACA,YAC8B;AAC9B,UAAM,qBAAqB,cAAc;AACzC,QACC,KAAK,QAAQ,YAAY,kBAAkB,KACxC,KAAK,eAAe,IAAI,kBAAkB,GAC5C;AAED,aAAO,WAAS;AAAA,IACjB,WAAW,KAAK,UAAU,IAAI,kBAAkB,GAAG;AAElD,aAAO,uBAAuB,EAAE,WAAW,CAAC;AAAA,IAC7C,OAAO;AAEN,aAAO,oBAAoB,EAAE,WAAW,CAAC;AAAA,IAC1C;AAAA,EACD;AACD;;;ACzKA,SAAS,WAAW;AASb,IAAM,MAAiB;AAAA,EAC7B,OAAO;AAAA,EACP,OAAO;AAAA,EACP,gBAAgB;AAAA;AAAA,EAIhB,gBAAgB,OAAO;AACtB,WAAO,MAAM;AAAA,EACd;AAAA,EAEA,oBAAoB,OAAO;AAC1B,WAAO,OAAO,KAAK,MAAM,SAAS;AAAA,EACnC;AAAA,EAEA,2BAA2B;AAE1B,WAAO,CAAC;AAAA,EACT;AAAA,EAEA,sBAAsB;AACrB,WAAO;AAAA,EACR;AAAA,EAEA,gBAAgB,OAAO;AACtB,QAAI,CAAC,MAAM,OAAO;AACjB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IACzC;AACA,WAAO,MAAM;AAAA,EACd;AAAA;AAAA,EAIA,aAAa,OAAO,EAAE,OAAO,GAAG,GAAG;AAClC,WAAO,MAAM,OAAO,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;AAAA,EACpC;AAAA,EAEA,gBAAgB,OAAO,EAAE,UAAU,IAAI,OAAO,GAAG;AAEhD,WAAO,MAAM,OAAO;AAAA,MACnB,CAAC,EAAE,GAAG,CAAC,MAAW,OAAO,EAAE,QAAQ,CAAC;AAAA,IACrC,CAAQ;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,OAAO,OAAO,IAAI,OAAO;AAC9B,WAAO,MAAM,MAAM,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC;AAAA,EAC7D;AAAA,EAEA,UAAU,OAAO,YAAY,UAAU;AACtC,WAAO,MAAM,MAAM,IAAI,EAAE,KAAK,YAAY,QAAQ,SAAS,CAAC,CAAC;AAAA,EAC9D;AAAA;AAAA,EAIA,kBAAkB,OAAO;AACxB,WAAO,MAAM,MAAM,OAAO;AAAA,EAC3B;AAAA,EAEA,gBAAgB,OAAO,EAAE,OAAO,IAAI,GAAG;AACtC,WAAO,MAAM,MAAM,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;AAAA,EACpC;AAAA,EAEA,gBAAgB,OAAO;AACtB,WACE,MAAM,EAAsB,OAAO,QAAmB,CAAC,cAAc;AACrE,UAAI,OAAO,cAAc,UAAU;AAClC,eAAO,EAAE,OAAO,aAAa,KAAK,MAAM;AAAA,MACzC,WAAW,OAAO,cAAc,UAAU;AACzC,eAAO,OAAO,QAAQ,SAAS,EAAE,IAAe,CAAC,CAAC,OAAO,KAAK,MAAM;AACnE,gBAAM,CAAC,GAAG,IAAI,MAAM,MAAM,KAAK,CAAC;AAChC,cAAI,QAAQ,SAAS,QAAQ,QAAQ;AACpC,mBAAO,EAAE,OAAO,IAAI;AAAA,UACrB,OAAO;AACN,kBAAM,IAAI,MAAM,wBAAwB,KAAK;AAAA,UAC9C;AAAA,QACD,CAAC;AAAA,MACF,OAAO;AACN,cAAM,IAAI,UAAU,6BAA6B,SAAS;AAAA,MAC3D;AAAA,IACD,CAAC,KAAK,CAAC;AAAA,EAET;AAAA,EAEA,gBAAgB,OAAO,OAAO;AAC7B,WAAO,MAAM,MAAM,KAAK;AAAA,EACzB;AAAA;AAAA,EAIA,sBAAsB,OAAO,UAAU;AACtC,WAAO,MAAM,UAAU,WAAS,SAAS,KAAY,CAAC;AAAA,EACvD;AAAA,EAEA,2BAA2B,UAAU;AACpC,WAAO;AAAA,EACR;AAAA,EAEA,wBAAwB,OAAO;AAC9B,WAAO;AAAA,EACR;AAAA;AAAA,EAIA,gBAAgB,OAAO,IAAI;AAC1B,WAAO,MAAM,WAAW,UAAQ,GAAG,IAAI,CAAC;AAAA,EACzC;AAAA,EAEA,mBAAmB,OAAO;AAEzB,WAAO;AAAA,EACR;AACD;;;ACzGO,SAASC,aACf,OACA,QACA,SACI;AACJ,SAAO,YAAa,KAAK,OAAO,QAAQ,OAAO;AAChD;;;ACdO,SAAS,oBACf,OACA,SACC;AACD,SAAO,IAAI,oBAA6B,OAAO,OAAO;AACvD;AAEA,IAAM,sBAAN,cAA2C,cAAkC;AAAA,EAC5E,YACiB,OACA,UAAoD,CAAC,GACpE;AACD,UAAM,KAAK,OAAO,OAAO;AAHT;AACA;AAAA,EAGjB;AAAA,EAEA,QACC,OASA,SACa;AACb,WAAO,MAAM,QAAQ,OAAO,OAAO;AAAA,EACpC;AACD;;;ACjCO,SAAS,oBACf,OACA,UAAoD,CAAC,GACpD;AACD,SAAO,IAAI,cAAc,KAAK,OAAc,OAAO;AACpD;","names":["orm","orm","cursor","orm","orm","type","orm","filterQuery"]}
package/package.json CHANGED
@@ -1,18 +1,22 @@
1
1
  {
2
2
  "name": "orchid-graphql",
3
+ "type": "module",
4
+ "version": "1.9.0",
3
5
  "description": "orchid-orm plugin: resolve GraphQL query with Orchid ORM",
4
- "version": "1.8.0",
6
+ "author": "Ilya Semenov",
7
+ "license": "MIT",
5
8
  "repository": {
6
9
  "type": "git",
7
10
  "url": "https://github.com/IlyaSemenov/orchid-graphql"
8
11
  },
9
- "author": "Ilya Semenov",
10
- "license": "MIT",
11
- "type": "module",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js",
16
+ "require": "./dist/index.cjs"
17
+ }
18
+ },
12
19
  "main": "dist/index.cjs",
13
- "module": "dist/index.js",
14
- "types": "dist/index.d.ts",
15
- "source": "src/index.ts",
16
20
  "files": [
17
21
  "dist",
18
22
  "src"
@@ -20,13 +24,13 @@
20
24
  "engines": {
21
25
  "node": ">=14"
22
26
  },
23
- "dependencies": {
24
- "graphql-parse-resolve-info": "^4.13.0"
25
- },
26
27
  "peerDependencies": {
27
28
  "graphql": "^16",
28
29
  "orchid-orm": "^1.31.5"
29
30
  },
31
+ "dependencies": {
32
+ "graphql-parse-resolve-info": "^4.13.0"
33
+ },
30
34
  "devDependencies": {
31
35
  "@apollo/server": "^4.7.1",
32
36
  "graphql": "^16.6.0",
@@ -34,13 +38,13 @@
34
38
  "graphql-tag": "^2.12.6",
35
39
  "orchid-orm": "^1.31.5",
36
40
  "tsconfig-vite-node": "^1.1.2",
37
- "tstyche": "^2.0.0",
38
- "tsup": "^8.1.0",
39
- "vite": "^5.3.1",
40
- "vite-node": "^1.6.0",
41
- "vite-tsconfig-paths": "^4.3.2",
42
- "vitest": "^1.6.0",
43
- "graphql-orm": "1.5.0"
41
+ "tstyche": "^4.3.0",
42
+ "tsup": "^8.5.0",
43
+ "vite": "^7.0.5",
44
+ "vite-node": "^3.2.4",
45
+ "vite-tsconfig-paths": "^5.1.4",
46
+ "vitest": "^3.2.4",
47
+ "graphql-orm": "1.6.0"
44
48
  },
45
49
  "scripts": {
46
50
  "dev": "vite-node --watch playground/readme.sample.ts",
package/src/filter.ts ADDED
@@ -0,0 +1,26 @@
1
+ import type {
2
+ FilterModifier as _FilterModifier,
3
+ FilterModifiers as _FilterModifiers,
4
+ FilterQueryOptions as _FilterQueryOptions,
5
+ FilterValue,
6
+ } from "graphql-orm"
7
+ import { filterQuery as _filterQuery } from "graphql-orm"
8
+ import type { Query } from "orchid-orm"
9
+
10
+ import { orm } from "./orm/orm"
11
+ import type { OrchidOrm } from "./orm/orm"
12
+
13
+ export { FilterValue }
14
+
15
+ export type FilterQueryOptions<Context = undefined> = _FilterQueryOptions<OrchidOrm, Context>
16
+
17
+ export type FilterModifier<Context = undefined> = _FilterModifier<OrchidOrm, Context>
18
+ export type FilterModifiers<Context = undefined> = _FilterModifiers<OrchidOrm, Context>
19
+
20
+ export function filterQuery<Q extends Query, Context = undefined>(
21
+ query: Q,
22
+ filter: FilterValue,
23
+ options?: FilterQueryOptions<Context>,
24
+ ): Q {
25
+ return _filterQuery(orm, query, filter, options) as Q
26
+ }
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from "./filter"
1
2
  export {
2
3
  createGraphResolver,
3
4
  createGraphResolver as graph,
package/src/orm/orm.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { OrmAdapter, SortOrder } from "graphql-orm"
1
+ import type { OrmAdapter, SortOrder } from "graphql-orm"
2
2
  import type { Query, SelectQueryData, Table } from "orchid-orm"
3
3
  import { raw } from "orchid-orm"
4
4
 
@@ -101,7 +101,7 @@ export const orm: OrchidOrm = {
101
101
  // Pagination helpers
102
102
 
103
103
  set_query_page_result(query, get_page) {
104
- return query.transform((nodes) => get_page(nodes as any))
104
+ return query.transform(nodes => get_page(nodes as any))
105
105
  },
106
106
 
107
107
  modify_subquery_pagination(subquery) {
@@ -115,7 +115,7 @@ export const orm: OrchidOrm = {
115
115
  // Misc
116
116
 
117
117
  run_after_query(query, fn) {
118
- return query.afterQuery((data) => fn(data))
118
+ return query.afterQuery(data => fn(data))
119
119
  },
120
120
 
121
121
  prevent_select_all(query) {
@@ -1,12 +1,13 @@
1
- import {
1
+ import type {
2
2
  GraphResolveOptions,
3
- GraphResolver,
4
3
  GraphResolverOptions,
5
4
  TableResolver,
6
5
  } from "graphql-orm"
7
- import { Query } from "orchid-orm"
6
+ import { GraphResolver } from "graphql-orm"
7
+ import type { Query } from "orchid-orm"
8
8
 
9
- import { OrchidOrm, orm } from "../orm/orm"
9
+ import type { OrchidOrm } from "../orm/orm"
10
+ import { orm } from "../orm/orm"
10
11
 
11
12
  export function createGraphResolver<Context = unknown>(
12
13
  types: Record<string, TableResolver<OrchidOrm, Context>>,
@@ -1,7 +1,9 @@
1
- import { TableResolver, TableResolverOptions } from "graphql-orm"
2
- import { Table } from "orchid-orm"
1
+ import type { TableResolverOptions } from "graphql-orm"
2
+ import { TableResolver } from "graphql-orm"
3
+ import type { Table } from "orchid-orm"
3
4
 
4
- import { OrchidOrm, orm } from "../orm/orm"
5
+ import type { OrchidOrm } from "../orm/orm"
6
+ import { orm } from "../orm/orm"
5
7
 
6
8
  export function defineTableResolver<Context = unknown>(
7
9
  table: Table,