orchid-graphql 1.5.2 → 1.7.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/dist/index.cjs CHANGED
@@ -35,7 +35,7 @@ __export(src_exports, {
35
35
  });
36
36
  module.exports = __toCommonJS(src_exports);
37
37
 
38
- // ../graphql-orm/src/paginators/cursor.ts
38
+ // ../base/src/paginators/cursor.ts
39
39
  function defineCursorPaginator(options = {}) {
40
40
  return new CursorPaginator(options);
41
41
  }
@@ -114,7 +114,7 @@ var CursorPaginator = class {
114
114
  }
115
115
  };
116
116
 
117
- // ../graphql-orm/src/utils/run-after.ts
117
+ // ../base/src/utils/run-after.ts
118
118
  function run_after_query(orm2, query, transform) {
119
119
  return orm2.run_after_query(query, async (result) => {
120
120
  if (Array.isArray(result)) {
@@ -128,7 +128,7 @@ function run_after_query(orm2, query, transform) {
128
128
  });
129
129
  }
130
130
 
131
- // ../graphql-orm/src/resolvers/field.ts
131
+ // ../base/src/resolvers/field.ts
132
132
  function parse_field_options(options) {
133
133
  const { tableField, modelField } = options;
134
134
  if (tableField && modelField) {
@@ -160,7 +160,7 @@ function defineFieldResolver(options = {}) {
160
160
  };
161
161
  }
162
162
 
163
- // ../graphql-orm/src/resolvers/graph.ts
163
+ // ../base/src/resolvers/graph.ts
164
164
  var import_graphql_parse_resolve_info = require("graphql-parse-resolve-info");
165
165
  var GraphResolver = class {
166
166
  constructor(orm2, type_resolvers, options = {}) {
@@ -186,7 +186,7 @@ var GraphResolver = class {
186
186
  const type2 = Object.keys(tree.fieldsByTypeName)[0];
187
187
  tree = tree.fieldsByTypeName[type2][field];
188
188
  if (!tree) {
189
- return void 0;
189
+ return Promise.resolve();
190
190
  }
191
191
  }
192
192
  }
@@ -215,7 +215,7 @@ var GraphResolver = class {
215
215
  }
216
216
  };
217
217
 
218
- // ../graphql-orm/src/resolvers/page.ts
218
+ // ../base/src/resolvers/page.ts
219
219
  function definePageResolver(paginator, options = {}) {
220
220
  const { tableField, modify } = parse_field_options(options);
221
221
  return function resolve(query, context) {
@@ -238,7 +238,7 @@ function definePageResolver(paginator, options = {}) {
238
238
  };
239
239
  }
240
240
 
241
- // ../graphql-orm/src/resolvers/relation.ts
241
+ // ../base/src/resolvers/relation.ts
242
242
  function defineRelationResolver(options = {}) {
243
243
  const { tableField, filters, modify } = parse_field_options(options);
244
244
  return function resolve(query, context) {
@@ -254,12 +254,12 @@ function defineRelationResolver(options = {}) {
254
254
  };
255
255
  }
256
256
 
257
- // ../graphql-orm/src/utils/is-plain-object.ts
257
+ // ../base/src/utils/is-plain-object.ts
258
258
  function is_plain_object(obj) {
259
259
  return typeof obj === "object" && !Array.isArray(obj);
260
260
  }
261
261
 
262
- // ../graphql-orm/src/filters/filters.ts
262
+ // ../base/src/filters/filters.ts
263
263
  function apply_filters(query, { filters, modifiers, context }) {
264
264
  if (!filters) {
265
265
  return query;
@@ -286,7 +286,7 @@ function apply_filters(query, { filters, modifiers, context }) {
286
286
  return query;
287
287
  }
288
288
 
289
- // ../graphql-orm/src/resolvers/table.ts
289
+ // ../base/src/resolvers/table.ts
290
290
  var TableResolver = class {
291
291
  constructor(orm2, table, options = {}) {
292
292
  this.orm = orm2;
@@ -449,8 +449,18 @@ var orm = {
449
449
 
450
450
  // src/resolvers/graph.ts
451
451
  function createGraphResolver(types, options) {
452
- return new GraphResolver(orm, types, options);
452
+ return new OrchidGraphResolver(types, options);
453
453
  }
454
+ var OrchidGraphResolver = class extends GraphResolver {
455
+ constructor(types, options = {}) {
456
+ super(orm, types, options);
457
+ this.types = types;
458
+ this.options = options;
459
+ }
460
+ resolve(query, options) {
461
+ return super.resolve(query, options);
462
+ }
463
+ };
454
464
 
455
465
  // src/resolvers/table.ts
456
466
  function defineTableResolver(table, options = {}) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../graphql-orm/src/paginators/cursor.ts","../../graphql-orm/src/utils/run-after.ts","../../graphql-orm/src/resolvers/field.ts","../../graphql-orm/src/resolvers/graph.ts","../../graphql-orm/src/resolvers/page.ts","../../graphql-orm/src/resolvers/relation.ts","../../graphql-orm/src/utils/is-plain-object.ts","../../graphql-orm/src/filters/filters.ts","../../graphql-orm/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 { OrmAdapter } 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\treadonly options: CursorPaginatorOptions\n\n\treadonly fields: Array<{\n\t\tname: string\n\t\tdesc: boolean\n\t}>\n\n\tconstructor(options: Partial<CursorPaginatorOptions> = {}) {\n\t\tthis.options = {\n\t\t\tfields: [\"id\"],\n\t\t\ttake: 10,\n\t\t\t...options,\n\t\t}\n\t\tthis.fields = this.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 take = (args.take as number | undefined) ?? this.options.take\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\t// Set query order\n\t\tquery = orm.reset_query_order(query)\n\t\tfor (const field of this.fields) {\n\t\t\t// TODO: prevent potential name clash with aliases like .as(`_${table_ref}_order_key_0`)\n\t\t\tquery = orm.select_field(query, { field: field.name, as: field.name })\n\t\t\tquery = orm.add_query_order(query, field.name, field.desc)\n\t\t}\n\n\t\tif (cursor) {\n\t\t\tconst { expression, bindings } = this._parse_cursor(cursor)\n\t\t\tquery = orm.where_raw(query, expression, bindings)\n\t\t}\n\t\tquery = orm.set_query_limit(query, take + 1)\n\n\t\treturn orm.set_query_page_result(query, (nodes) => {\n\t\t\tlet cursor: string | undefined\n\t\t\tif (nodes.length > take) {\n\t\t\t\tcursor = this._create_cursor(nodes[take - 1])\n\t\t\t\tnodes = nodes.slice(0, take)\n\t\t\t}\n\t\t\treturn { nodes, cursor }\n\t\t})\n\t}\n\n\t_create_cursor(instance: any) {\n\t\treturn JSON.stringify(\n\t\t\tthis.fields.map((field) => {\n\t\t\t\tconst value = instance[field.name]\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unable to create cursor: undefined field ${field.name}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn String(value)\n\t\t\t}),\n\t\t)\n\t}\n\n\t_parse_cursor(cursor: string) {\n\t\tconst values = JSON.parse(cursor)\n\t\tconst left: string[] = []\n\t\tconst right: string[] = []\n\t\tconst bindings: Record<string, any> = {}\n\t\tfor (let i = 0; i < this.fields.length; ++i) {\n\t\t\tconst field = this.fields[i]\n\t\t\tconst expressions = field.desc ? right : left\n\t\t\tconst placeholders = field.desc ? left : right\n\t\t\texpressions.push(`\"${field.name}\"`)\n\t\t\tplaceholders.push(\"$\" + field.name)\n\t\t\tbindings[field.name] = values[i]\n\t\t}\n\t\treturn {\n\t\t\texpression: `(${left.join(\",\")}) > (${right.join(\",\")})`,\n\t\t\tbindings,\n\t\t}\n\t}\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(\n\t\tquery: Orm[\"Query\"],\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\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(query: Orm[\"Query\"], context: GraphResolveContext<Context>) {\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\t// However, if we advertise to optionally return undefined, this result won't be accepted by upstream graphql tooling types.\n\t\t\t\t\t// This is the least evil I see for now.\n\t\t\t\t\treturn undefined\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 as any,\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 as any,\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 = 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 modify ? modify(subquery, context) : 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 } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\nimport { DbTable, raw } from \"orchid-orm\"\n\nexport type OrchidOrm = OrmAdapter<\n\tDbTable<any>,\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\treturn query.select({\n\t\t\t[as]: (q) => modify((q as any)[relation]),\n\t\t})\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, desc) {\n\t\treturn query.order({ [field]: desc ? \"DESC\" : \"ASC\" })\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 { GraphResolver, GraphResolverOptions, TableResolver } from \"graphql-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 GraphResolver<OrchidOrm, Context>(orm, types, options)\n}\n","import { TableResolver, TableResolverOptions } from \"graphql-orm\"\nimport { DbTable, Table } from \"orchid-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function defineTableResolver<TableT extends Table, Context = unknown>(\n\ttable: DbTable<TableT>,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {},\n) {\n\treturn new TableResolver(orm, table as unknown as DbTable<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/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 { OrmAdapter } 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\treadonly options: CursorPaginatorOptions\n\n\treadonly fields: Array<{\n\t\tname: string\n\t\tdesc: boolean\n\t}>\n\n\tconstructor(options: Partial<CursorPaginatorOptions> = {}) {\n\t\tthis.options = {\n\t\t\tfields: [\"id\"],\n\t\t\ttake: 10,\n\t\t\t...options,\n\t\t}\n\t\tthis.fields = this.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 take = (args.take as number | undefined) ?? this.options.take\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\t// Set query order\n\t\tquery = orm.reset_query_order(query)\n\t\tfor (const field of this.fields) {\n\t\t\t// TODO: prevent potential name clash with aliases like .as(`_${table_ref}_order_key_0`)\n\t\t\tquery = orm.select_field(query, { field: field.name, as: field.name })\n\t\t\tquery = orm.add_query_order(query, field.name, field.desc)\n\t\t}\n\n\t\tif (cursor) {\n\t\t\tconst { expression, bindings } = this._parse_cursor(cursor)\n\t\t\tquery = orm.where_raw(query, expression, bindings)\n\t\t}\n\t\tquery = orm.set_query_limit(query, take + 1)\n\n\t\treturn orm.set_query_page_result(query, (nodes) => {\n\t\t\tlet cursor: string | undefined\n\t\t\tif (nodes.length > take) {\n\t\t\t\tcursor = this._create_cursor(nodes[take - 1])\n\t\t\t\tnodes = nodes.slice(0, take)\n\t\t\t}\n\t\t\treturn { nodes, cursor }\n\t\t})\n\t}\n\n\t_create_cursor(instance: any) {\n\t\treturn JSON.stringify(\n\t\t\tthis.fields.map((field) => {\n\t\t\t\tconst value = instance[field.name]\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unable to create cursor: undefined field ${field.name}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn String(value)\n\t\t\t}),\n\t\t)\n\t}\n\n\t_parse_cursor(cursor: string) {\n\t\tconst values = JSON.parse(cursor)\n\t\tconst left: string[] = []\n\t\tconst right: string[] = []\n\t\tconst bindings: Record<string, any> = {}\n\t\tfor (let i = 0; i < this.fields.length; ++i) {\n\t\t\tconst field = this.fields[i]\n\t\t\tconst expressions = field.desc ? right : left\n\t\t\tconst placeholders = field.desc ? left : right\n\t\t\texpressions.push(`\"${field.name}\"`)\n\t\t\tplaceholders.push(\"$\" + field.name)\n\t\t\tbindings[field.name] = values[i]\n\t\t}\n\t\treturn {\n\t\t\texpression: `(${left.join(\",\")}) > (${right.join(\",\")})`,\n\t\t\tbindings,\n\t\t}\n\t}\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 = 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 modify ? modify(subquery, context) : 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 } from \"graphql-orm\"\nimport type { Query, 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, desc) {\n\t\treturn query.order({ [field]: desc ? \"DESC\" : \"ASC\" })\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"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { GraphQLResolveInfo } from 'graphql';
2
2
  import { ResolveTree } from 'graphql-parse-resolve-info';
3
- import { DbTable, Query, Table } from 'orchid-orm';
3
+ import { Table, Query } from 'orchid-orm';
4
4
 
5
5
  interface FieldResolverOptions<Orm extends OrmAdapter, Context> {
6
6
  /** Table field (if different from GraphQL field) */
@@ -73,10 +73,10 @@ declare class GraphResolver<Orm extends OrmAdapter, Context> {
73
73
  readonly type_resolvers: Record<string, TableResolver<Orm, Context>>;
74
74
  readonly options: GraphResolverOptions<Orm, Context>;
75
75
  constructor(orm: Orm, type_resolvers: Record<string, TableResolver<Orm, Context>>, options?: GraphResolverOptions<Orm, Context>);
76
- resolve(query: Orm["Query"], { info, ...context }: GraphResolveOptions<Context>): Orm["Query"] | undefined;
76
+ resolve<T>(query: Orm["Query"], { info, ...context }: GraphResolveOptions<Context>): Promise<T>;
77
77
  resolvePage(query: Orm["Query"], paginator: Paginator<Orm, Context>, { info, ...context }: GraphResolveOptions<Context>): Orm["QueryTransform"];
78
78
  _get_resolve_tree(info: GraphQLResolveInfo): ResolveTree;
79
- _resolve_type(query: Orm["Query"], context: GraphResolveContext<Context>): Orm["Query"] | undefined;
79
+ _resolve_type(query: Orm["Query"], context: GraphResolveContext<Context>): Orm["Query"];
80
80
  _resolve_page(query: Orm["Query"], paginator: Paginator<Orm, Context>, context: GraphResolveContext<Context>): Orm["QueryTransform"];
81
81
  }
82
82
 
@@ -156,10 +156,18 @@ declare function defineRelationResolver<Orm extends OrmAdapter, Context>(options
156
156
 
157
157
  declare function definePageResolver<Orm extends OrmAdapter, Context>(paginator: Paginator<Orm, Context>, options?: RelationResolverOptions<Orm, Context>): FieldResolver<Orm, Context>;
158
158
 
159
- type OrchidOrm = OrmAdapter<DbTable<any>, Query, Pick<Promise<any>, "then" | "catch">>;
159
+ type OrchidOrm = OrmAdapter<Table, Query, Pick<Promise<any>, "then" | "catch">>;
160
160
 
161
- declare function createGraphResolver<Context = unknown>(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>): GraphResolver<OrchidOrm, Context>;
161
+ declare function createGraphResolver<Context = unknown>(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>): OrchidGraphResolver<Context>;
162
+ declare class OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Context> {
163
+ readonly types: Record<string, TableResolver<OrchidOrm, Context>>;
164
+ readonly options: GraphResolverOptions<OrchidOrm, Context>;
165
+ constructor(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>);
166
+ resolve<T>(query: Query & {
167
+ returnType: unknown extends T ? any : T extends unknown[] ? undefined | "all" : T extends undefined ? "one" : "oneOrThrow";
168
+ }, options: GraphResolveOptions<Context>): Promise<T>;
169
+ }
162
170
 
163
- declare function defineTableResolver<TableT extends Table, Context = unknown>(table: DbTable<TableT>, options?: TableResolverOptions<OrchidOrm, Context>): TableResolver<OrchidOrm, Context>;
171
+ declare function defineTableResolver<Context = unknown>(table: Table, options?: TableResolverOptions<OrchidOrm, Context>): TableResolver<OrchidOrm, Context>;
164
172
 
165
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 };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { GraphQLResolveInfo } from 'graphql';
2
2
  import { ResolveTree } from 'graphql-parse-resolve-info';
3
- import { DbTable, Query, Table } from 'orchid-orm';
3
+ import { Table, Query } from 'orchid-orm';
4
4
 
5
5
  interface FieldResolverOptions<Orm extends OrmAdapter, Context> {
6
6
  /** Table field (if different from GraphQL field) */
@@ -73,10 +73,10 @@ declare class GraphResolver<Orm extends OrmAdapter, Context> {
73
73
  readonly type_resolvers: Record<string, TableResolver<Orm, Context>>;
74
74
  readonly options: GraphResolverOptions<Orm, Context>;
75
75
  constructor(orm: Orm, type_resolvers: Record<string, TableResolver<Orm, Context>>, options?: GraphResolverOptions<Orm, Context>);
76
- resolve(query: Orm["Query"], { info, ...context }: GraphResolveOptions<Context>): Orm["Query"] | undefined;
76
+ resolve<T>(query: Orm["Query"], { info, ...context }: GraphResolveOptions<Context>): Promise<T>;
77
77
  resolvePage(query: Orm["Query"], paginator: Paginator<Orm, Context>, { info, ...context }: GraphResolveOptions<Context>): Orm["QueryTransform"];
78
78
  _get_resolve_tree(info: GraphQLResolveInfo): ResolveTree;
79
- _resolve_type(query: Orm["Query"], context: GraphResolveContext<Context>): Orm["Query"] | undefined;
79
+ _resolve_type(query: Orm["Query"], context: GraphResolveContext<Context>): Orm["Query"];
80
80
  _resolve_page(query: Orm["Query"], paginator: Paginator<Orm, Context>, context: GraphResolveContext<Context>): Orm["QueryTransform"];
81
81
  }
82
82
 
@@ -156,10 +156,18 @@ declare function defineRelationResolver<Orm extends OrmAdapter, Context>(options
156
156
 
157
157
  declare function definePageResolver<Orm extends OrmAdapter, Context>(paginator: Paginator<Orm, Context>, options?: RelationResolverOptions<Orm, Context>): FieldResolver<Orm, Context>;
158
158
 
159
- type OrchidOrm = OrmAdapter<DbTable<any>, Query, Pick<Promise<any>, "then" | "catch">>;
159
+ type OrchidOrm = OrmAdapter<Table, Query, Pick<Promise<any>, "then" | "catch">>;
160
160
 
161
- declare function createGraphResolver<Context = unknown>(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>): GraphResolver<OrchidOrm, Context>;
161
+ declare function createGraphResolver<Context = unknown>(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>): OrchidGraphResolver<Context>;
162
+ declare class OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Context> {
163
+ readonly types: Record<string, TableResolver<OrchidOrm, Context>>;
164
+ readonly options: GraphResolverOptions<OrchidOrm, Context>;
165
+ constructor(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>);
166
+ resolve<T>(query: Query & {
167
+ returnType: unknown extends T ? any : T extends unknown[] ? undefined | "all" : T extends undefined ? "one" : "oneOrThrow";
168
+ }, options: GraphResolveOptions<Context>): Promise<T>;
169
+ }
162
170
 
163
- declare function defineTableResolver<TableT extends Table, Context = unknown>(table: DbTable<TableT>, options?: TableResolverOptions<OrchidOrm, Context>): TableResolver<OrchidOrm, Context>;
171
+ declare function defineTableResolver<Context = unknown>(table: Table, options?: TableResolverOptions<OrchidOrm, Context>): TableResolver<OrchidOrm, Context>;
164
172
 
165
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 };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- // ../graphql-orm/src/paginators/cursor.ts
1
+ // ../base/src/paginators/cursor.ts
2
2
  function defineCursorPaginator(options = {}) {
3
3
  return new CursorPaginator(options);
4
4
  }
@@ -77,7 +77,7 @@ var CursorPaginator = class {
77
77
  }
78
78
  };
79
79
 
80
- // ../graphql-orm/src/utils/run-after.ts
80
+ // ../base/src/utils/run-after.ts
81
81
  function run_after_query(orm2, query, transform) {
82
82
  return orm2.run_after_query(query, async (result) => {
83
83
  if (Array.isArray(result)) {
@@ -91,7 +91,7 @@ function run_after_query(orm2, query, transform) {
91
91
  });
92
92
  }
93
93
 
94
- // ../graphql-orm/src/resolvers/field.ts
94
+ // ../base/src/resolvers/field.ts
95
95
  function parse_field_options(options) {
96
96
  const { tableField, modelField } = options;
97
97
  if (tableField && modelField) {
@@ -123,7 +123,7 @@ function defineFieldResolver(options = {}) {
123
123
  };
124
124
  }
125
125
 
126
- // ../graphql-orm/src/resolvers/graph.ts
126
+ // ../base/src/resolvers/graph.ts
127
127
  import { parseResolveInfo } from "graphql-parse-resolve-info";
128
128
  var GraphResolver = class {
129
129
  constructor(orm2, type_resolvers, options = {}) {
@@ -149,7 +149,7 @@ var GraphResolver = class {
149
149
  const type2 = Object.keys(tree.fieldsByTypeName)[0];
150
150
  tree = tree.fieldsByTypeName[type2][field];
151
151
  if (!tree) {
152
- return void 0;
152
+ return Promise.resolve();
153
153
  }
154
154
  }
155
155
  }
@@ -178,7 +178,7 @@ var GraphResolver = class {
178
178
  }
179
179
  };
180
180
 
181
- // ../graphql-orm/src/resolvers/page.ts
181
+ // ../base/src/resolvers/page.ts
182
182
  function definePageResolver(paginator, options = {}) {
183
183
  const { tableField, modify } = parse_field_options(options);
184
184
  return function resolve(query, context) {
@@ -201,7 +201,7 @@ function definePageResolver(paginator, options = {}) {
201
201
  };
202
202
  }
203
203
 
204
- // ../graphql-orm/src/resolvers/relation.ts
204
+ // ../base/src/resolvers/relation.ts
205
205
  function defineRelationResolver(options = {}) {
206
206
  const { tableField, filters, modify } = parse_field_options(options);
207
207
  return function resolve(query, context) {
@@ -217,12 +217,12 @@ function defineRelationResolver(options = {}) {
217
217
  };
218
218
  }
219
219
 
220
- // ../graphql-orm/src/utils/is-plain-object.ts
220
+ // ../base/src/utils/is-plain-object.ts
221
221
  function is_plain_object(obj) {
222
222
  return typeof obj === "object" && !Array.isArray(obj);
223
223
  }
224
224
 
225
- // ../graphql-orm/src/filters/filters.ts
225
+ // ../base/src/filters/filters.ts
226
226
  function apply_filters(query, { filters, modifiers, context }) {
227
227
  if (!filters) {
228
228
  return query;
@@ -249,7 +249,7 @@ function apply_filters(query, { filters, modifiers, context }) {
249
249
  return query;
250
250
  }
251
251
 
252
- // ../graphql-orm/src/resolvers/table.ts
252
+ // ../base/src/resolvers/table.ts
253
253
  var TableResolver = class {
254
254
  constructor(orm2, table, options = {}) {
255
255
  this.orm = orm2;
@@ -412,8 +412,18 @@ var orm = {
412
412
 
413
413
  // src/resolvers/graph.ts
414
414
  function createGraphResolver(types, options) {
415
- return new GraphResolver(orm, types, options);
415
+ return new OrchidGraphResolver(types, options);
416
416
  }
417
+ var OrchidGraphResolver = class extends GraphResolver {
418
+ constructor(types, options = {}) {
419
+ super(orm, types, options);
420
+ this.types = types;
421
+ this.options = options;
422
+ }
423
+ resolve(query, options) {
424
+ return super.resolve(query, options);
425
+ }
426
+ };
417
427
 
418
428
  // src/resolvers/table.ts
419
429
  function defineTableResolver(table, options = {}) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../graphql-orm/src/paginators/cursor.ts","../../graphql-orm/src/utils/run-after.ts","../../graphql-orm/src/resolvers/field.ts","../../graphql-orm/src/resolvers/graph.ts","../../graphql-orm/src/resolvers/page.ts","../../graphql-orm/src/resolvers/relation.ts","../../graphql-orm/src/utils/is-plain-object.ts","../../graphql-orm/src/filters/filters.ts","../../graphql-orm/src/resolvers/table.ts","../src/orm/orm.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["import { OrmAdapter } 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\treadonly options: CursorPaginatorOptions\n\n\treadonly fields: Array<{\n\t\tname: string\n\t\tdesc: boolean\n\t}>\n\n\tconstructor(options: Partial<CursorPaginatorOptions> = {}) {\n\t\tthis.options = {\n\t\t\tfields: [\"id\"],\n\t\t\ttake: 10,\n\t\t\t...options,\n\t\t}\n\t\tthis.fields = this.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 take = (args.take as number | undefined) ?? this.options.take\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\t// Set query order\n\t\tquery = orm.reset_query_order(query)\n\t\tfor (const field of this.fields) {\n\t\t\t// TODO: prevent potential name clash with aliases like .as(`_${table_ref}_order_key_0`)\n\t\t\tquery = orm.select_field(query, { field: field.name, as: field.name })\n\t\t\tquery = orm.add_query_order(query, field.name, field.desc)\n\t\t}\n\n\t\tif (cursor) {\n\t\t\tconst { expression, bindings } = this._parse_cursor(cursor)\n\t\t\tquery = orm.where_raw(query, expression, bindings)\n\t\t}\n\t\tquery = orm.set_query_limit(query, take + 1)\n\n\t\treturn orm.set_query_page_result(query, (nodes) => {\n\t\t\tlet cursor: string | undefined\n\t\t\tif (nodes.length > take) {\n\t\t\t\tcursor = this._create_cursor(nodes[take - 1])\n\t\t\t\tnodes = nodes.slice(0, take)\n\t\t\t}\n\t\t\treturn { nodes, cursor }\n\t\t})\n\t}\n\n\t_create_cursor(instance: any) {\n\t\treturn JSON.stringify(\n\t\t\tthis.fields.map((field) => {\n\t\t\t\tconst value = instance[field.name]\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unable to create cursor: undefined field ${field.name}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn String(value)\n\t\t\t}),\n\t\t)\n\t}\n\n\t_parse_cursor(cursor: string) {\n\t\tconst values = JSON.parse(cursor)\n\t\tconst left: string[] = []\n\t\tconst right: string[] = []\n\t\tconst bindings: Record<string, any> = {}\n\t\tfor (let i = 0; i < this.fields.length; ++i) {\n\t\t\tconst field = this.fields[i]\n\t\t\tconst expressions = field.desc ? right : left\n\t\t\tconst placeholders = field.desc ? left : right\n\t\t\texpressions.push(`\"${field.name}\"`)\n\t\t\tplaceholders.push(\"$\" + field.name)\n\t\t\tbindings[field.name] = values[i]\n\t\t}\n\t\treturn {\n\t\t\texpression: `(${left.join(\",\")}) > (${right.join(\",\")})`,\n\t\t\tbindings,\n\t\t}\n\t}\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(\n\t\tquery: Orm[\"Query\"],\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\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(query: Orm[\"Query\"], context: GraphResolveContext<Context>) {\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\t// However, if we advertise to optionally return undefined, this result won't be accepted by upstream graphql tooling types.\n\t\t\t\t\t// This is the least evil I see for now.\n\t\t\t\t\treturn undefined\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 as any,\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 as any,\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 = 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 modify ? modify(subquery, context) : 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 } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\nimport { DbTable, raw } from \"orchid-orm\"\n\nexport type OrchidOrm = OrmAdapter<\n\tDbTable<any>,\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\treturn query.select({\n\t\t\t[as]: (q) => modify((q as any)[relation]),\n\t\t})\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, desc) {\n\t\treturn query.order({ [field]: desc ? \"DESC\" : \"ASC\" })\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 { GraphResolver, GraphResolverOptions, TableResolver } from \"graphql-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 GraphResolver<OrchidOrm, Context>(orm, types, options)\n}\n","import { TableResolver, TableResolverOptions } from \"graphql-orm\"\nimport { DbTable, Table } from \"orchid-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function defineTableResolver<TableT extends Table, Context = unknown>(\n\ttable: DbTable<TableT>,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {},\n) {\n\treturn new TableResolver(orm, table as unknown as DbTable<any>, options)\n}\n"],"mappings":"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","names":["orm","cursor","orm","orm","type","orm"]}
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 { OrmAdapter } 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\treadonly options: CursorPaginatorOptions\n\n\treadonly fields: Array<{\n\t\tname: string\n\t\tdesc: boolean\n\t}>\n\n\tconstructor(options: Partial<CursorPaginatorOptions> = {}) {\n\t\tthis.options = {\n\t\t\tfields: [\"id\"],\n\t\t\ttake: 10,\n\t\t\t...options,\n\t\t}\n\t\tthis.fields = this.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 take = (args.take as number | undefined) ?? this.options.take\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\t// Set query order\n\t\tquery = orm.reset_query_order(query)\n\t\tfor (const field of this.fields) {\n\t\t\t// TODO: prevent potential name clash with aliases like .as(`_${table_ref}_order_key_0`)\n\t\t\tquery = orm.select_field(query, { field: field.name, as: field.name })\n\t\t\tquery = orm.add_query_order(query, field.name, field.desc)\n\t\t}\n\n\t\tif (cursor) {\n\t\t\tconst { expression, bindings } = this._parse_cursor(cursor)\n\t\t\tquery = orm.where_raw(query, expression, bindings)\n\t\t}\n\t\tquery = orm.set_query_limit(query, take + 1)\n\n\t\treturn orm.set_query_page_result(query, (nodes) => {\n\t\t\tlet cursor: string | undefined\n\t\t\tif (nodes.length > take) {\n\t\t\t\tcursor = this._create_cursor(nodes[take - 1])\n\t\t\t\tnodes = nodes.slice(0, take)\n\t\t\t}\n\t\t\treturn { nodes, cursor }\n\t\t})\n\t}\n\n\t_create_cursor(instance: any) {\n\t\treturn JSON.stringify(\n\t\t\tthis.fields.map((field) => {\n\t\t\t\tconst value = instance[field.name]\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unable to create cursor: undefined field ${field.name}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn String(value)\n\t\t\t}),\n\t\t)\n\t}\n\n\t_parse_cursor(cursor: string) {\n\t\tconst values = JSON.parse(cursor)\n\t\tconst left: string[] = []\n\t\tconst right: string[] = []\n\t\tconst bindings: Record<string, any> = {}\n\t\tfor (let i = 0; i < this.fields.length; ++i) {\n\t\t\tconst field = this.fields[i]\n\t\t\tconst expressions = field.desc ? right : left\n\t\t\tconst placeholders = field.desc ? left : right\n\t\t\texpressions.push(`\"${field.name}\"`)\n\t\t\tplaceholders.push(\"$\" + field.name)\n\t\t\tbindings[field.name] = values[i]\n\t\t}\n\t\treturn {\n\t\t\texpression: `(${left.join(\",\")}) > (${right.join(\",\")})`,\n\t\t\tbindings,\n\t\t}\n\t}\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 = 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 modify ? modify(subquery, context) : 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 } from \"graphql-orm\"\nimport type { Query, 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, desc) {\n\t\treturn query.order({ [field]: desc ? \"DESC\" : \"ASC\" })\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"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "orchid-graphql",
3
3
  "description": "orchid-orm plugin: resolve GraphQL query with Orchid ORM",
4
- "version": "1.5.2",
4
+ "version": "1.7.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/IlyaSemenov/orchid-graphql"
@@ -25,25 +25,26 @@
25
25
  },
26
26
  "peerDependencies": {
27
27
  "graphql": "^16",
28
- "orchid-orm": "^1.22.0"
28
+ "orchid-orm": "^1.31.5"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@apollo/server": "^4.7.1",
32
32
  "graphql": "^16.6.0",
33
33
  "graphql-request": "^6.0.0",
34
34
  "graphql-tag": "^2.12.6",
35
- "orchid-orm": "^1.23.0",
35
+ "orchid-orm": "^1.31.5",
36
36
  "tsconfig-vite-node": "^1.1.2",
37
+ "tstyche": "^2.0.0",
37
38
  "tsup": "^8.1.0",
38
39
  "vite": "^5.3.1",
39
40
  "vite-node": "^1.6.0",
40
41
  "vite-tsconfig-paths": "^4.3.2",
41
42
  "vitest": "^1.6.0",
42
- "graphql-orm": "1.4.1"
43
+ "graphql-orm": "1.5.0"
43
44
  },
44
45
  "scripts": {
45
46
  "dev": "vite-node --watch playground/readme.sample.ts",
46
47
  "build": "tsup",
47
- "test": "vitest run && tsc --noEmit"
48
+ "test": "vitest run && tsc --noEmit && tstyche"
48
49
  }
49
50
  }
package/src/orm/orm.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { OrmAdapter } from "graphql-orm"
2
- import type { Query } from "orchid-orm"
3
- import { DbTable, raw } from "orchid-orm"
2
+ import type { Query, Table } from "orchid-orm"
3
+ import { raw } from "orchid-orm"
4
4
 
5
5
  export type OrchidOrm = OrmAdapter<
6
- DbTable<any>,
6
+ Table,
7
7
  Query,
8
8
  // TODO: Type as QueryTransform once it's published.
9
9
  Pick<Promise<any>, "then" | "catch">
@@ -17,7 +17,7 @@ export const orm: OrchidOrm = {
17
17
  // Reflection
18
18
 
19
19
  get_table_table(table) {
20
- return table.table
20
+ return table.table!
21
21
  },
22
22
 
23
23
  get_table_relations(table) {
@@ -47,9 +47,10 @@ export const orm: OrchidOrm = {
47
47
  },
48
48
 
49
49
  select_relation(query, { relation, as, modify }) {
50
+ // as any casts needed in orchid-orm 1.31+
50
51
  return query.select({
51
- [as]: (q) => modify((q as any)[relation]),
52
- })
52
+ [as]: (q: any) => modify(q[relation]),
53
+ } as any)
53
54
  },
54
55
 
55
56
  // Find
@@ -1,4 +1,10 @@
1
- import { GraphResolver, GraphResolverOptions, TableResolver } from "graphql-orm"
1
+ import {
2
+ GraphResolveOptions,
3
+ GraphResolver,
4
+ GraphResolverOptions,
5
+ TableResolver,
6
+ } from "graphql-orm"
7
+ import { Query } from "orchid-orm"
2
8
 
3
9
  import { OrchidOrm, orm } from "../orm/orm"
4
10
 
@@ -6,5 +12,29 @@ export function createGraphResolver<Context = unknown>(
6
12
  types: Record<string, TableResolver<OrchidOrm, Context>>,
7
13
  options?: GraphResolverOptions<OrchidOrm, Context>,
8
14
  ) {
9
- return new GraphResolver<OrchidOrm, Context>(orm, types, options)
15
+ return new OrchidGraphResolver<Context>(types, options)
16
+ }
17
+
18
+ class OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Context> {
19
+ constructor(
20
+ public readonly types: Record<string, TableResolver<OrchidOrm, Context>>,
21
+ public readonly options: GraphResolverOptions<OrchidOrm, Context> = {},
22
+ ) {
23
+ super(orm, types, options)
24
+ }
25
+
26
+ resolve<T>(
27
+ query: Query & {
28
+ returnType: unknown extends T
29
+ ? any
30
+ : T extends unknown[]
31
+ ? undefined | "all"
32
+ : T extends undefined
33
+ ? "one"
34
+ : "oneOrThrow"
35
+ },
36
+ options: GraphResolveOptions<Context>,
37
+ ): Promise<T> {
38
+ return super.resolve(query, options)
39
+ }
10
40
  }
@@ -1,11 +1,11 @@
1
1
  import { TableResolver, TableResolverOptions } from "graphql-orm"
2
- import { DbTable, Table } from "orchid-orm"
2
+ import { Table } from "orchid-orm"
3
3
 
4
4
  import { OrchidOrm, orm } from "../orm/orm"
5
5
 
6
- export function defineTableResolver<TableT extends Table, Context = unknown>(
7
- table: DbTable<TableT>,
6
+ export function defineTableResolver<Context = unknown>(
7
+ table: Table,
8
8
  options: TableResolverOptions<OrchidOrm, Context> = {},
9
9
  ) {
10
- return new TableResolver(orm, table as unknown as DbTable<any>, options)
10
+ return new TableResolver(orm, table as any, options)
11
11
  }