orchid-graphql 1.1.0 → 1.2.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 +5 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +9 -8
- package/dist/index.js +5 -20
- package/dist/index.js.map +1 -1
- package/package.json +6 -8
- package/src/orm/orm.ts +11 -25
package/dist/index.cjs
CHANGED
|
@@ -72,7 +72,7 @@ var CursorPaginator = class {
|
|
|
72
72
|
query = orm2.where_raw(query, expression, bindings);
|
|
73
73
|
}
|
|
74
74
|
query = orm2.set_query_limit(query, take + 1);
|
|
75
|
-
|
|
75
|
+
return orm2.set_query_page_result(query, (nodes) => {
|
|
76
76
|
let cursor2;
|
|
77
77
|
if (nodes.length > take) {
|
|
78
78
|
cursor2 = this._create_cursor(nodes[take - 1]);
|
|
@@ -80,7 +80,6 @@ var CursorPaginator = class {
|
|
|
80
80
|
}
|
|
81
81
|
return { nodes, cursor: cursor2 };
|
|
82
82
|
});
|
|
83
|
-
return query;
|
|
84
83
|
}
|
|
85
84
|
_create_cursor(instance) {
|
|
86
85
|
return JSON.stringify(
|
|
@@ -362,10 +361,10 @@ var TableResolver = class {
|
|
|
362
361
|
};
|
|
363
362
|
|
|
364
363
|
// src/orm/orm.ts
|
|
365
|
-
var import_orchid_core = require("orchid-core");
|
|
366
364
|
var orm = {
|
|
367
365
|
Table: void 0,
|
|
368
366
|
Query: void 0,
|
|
367
|
+
QueryTransform: void 0,
|
|
369
368
|
// Reflection
|
|
370
369
|
get_table_table(table) {
|
|
371
370
|
return table.table;
|
|
@@ -413,25 +412,12 @@ var orm = {
|
|
|
413
412
|
},
|
|
414
413
|
// Pagination helpers
|
|
415
414
|
set_query_page_result(query, get_page) {
|
|
416
|
-
|
|
417
|
-
const { handleResult } = _query;
|
|
418
|
-
_query.handleResult = (q, result, s2) => {
|
|
419
|
-
const data = handleResult(q, result, s2);
|
|
420
|
-
return s2 ? data : get_page(data);
|
|
421
|
-
};
|
|
422
|
-
_query[s] = get_page;
|
|
423
|
-
return query;
|
|
415
|
+
return query.transform((nodes) => get_page(nodes));
|
|
424
416
|
},
|
|
425
|
-
modify_subquery_pagination(subquery
|
|
426
|
-
context.get_page = subquery.query[s];
|
|
417
|
+
modify_subquery_pagination(subquery) {
|
|
427
418
|
return subquery;
|
|
428
419
|
},
|
|
429
|
-
finish_query_pagination(query
|
|
430
|
-
const { get_page } = context;
|
|
431
|
-
if (!get_page) {
|
|
432
|
-
throw new Error(`Internal error: paginator didn't provide page callback.`);
|
|
433
|
-
}
|
|
434
|
-
(0, import_orchid_core.overrideParserInQuery)(query.query, field, get_page);
|
|
420
|
+
finish_query_pagination(query) {
|
|
435
421
|
return query;
|
|
436
422
|
},
|
|
437
423
|
// Misc
|
|
@@ -442,7 +428,6 @@ var orm = {
|
|
|
442
428
|
return query;
|
|
443
429
|
}
|
|
444
430
|
};
|
|
445
|
-
var s = Symbol("subquery_pagination_handler");
|
|
446
431
|
|
|
447
432
|
// src/resolvers/graph.ts
|
|
448
433
|
function createGraphResolver(types, options) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -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\tquery = 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\n\t\treturn query\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/** 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 defineFieldResolver<Orm extends OrmAdapter, Context>(\n\toptions: FieldResolverOptions<Orm, Context> = {}\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify, transform } = 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 {\n\tinfo: GraphQLResolveInfo\n\tcontext: any\n\tfilters?: FiltersDef\n}\n\nexport interface GraphResolveContext<Context> {\n\ttree: ResolveTree\n\tfilters?: FiltersDef\n\tcontext: Context\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, filters }: GraphResolveOptions\n\t): Orm[\"Query\"] {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_type(query, { tree, filters, context })\n\t}\n\n\tresolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\t{ info, context, filters }: GraphResolveOptions\n\t): Orm[\"Query\"] {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_page(query, paginator, { tree, filters, context })\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\tconst { tree } = context\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})\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): Orm[\"Query\"] {\n\t\tlet { tree } = context\n\t\t// Skip page subtree(s)\n\t\tfor (const field of paginator.path) {\n\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t// TODO: raise exception if not found\n\t\t}\n\t\tquery = this._resolve_type(query, { ...context, tree })\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 } 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 } = options\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\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\t// The modify+finish hack is needed for both Objection and Orchid (with completely different implementations)\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 { FieldResolver, FieldResolverOptions } 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 } = 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? this._get_default_field_resolver(field)\n\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t? this._get_default_field_resolver(field, r0)\n\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 { overrideParserInQuery } from \"orchid-core\"\nimport { DbTable } from \"orchid-orm\"\nimport { Query } from \"pqb\"\n\nexport type OrchidOrm = OrmAdapter<DbTable<any>, Query>\n\nexport const orm: OrchidOrm = {\n\tTable: undefined as unknown as OrchidOrm[\"Table\"],\n\tQuery: undefined as unknown as OrchidOrm[\"Query\"],\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(query.raw(expression, 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\t// For root query\n\t\tconst _query = query.query\n\t\tconst { handleResult } = _query\n\t\t_query.handleResult = (q, result, s) => {\n\t\t\tconst data = handleResult(q, result, s)\n\t\t\t// Sometimes this is called for subqueries, sometimes not.\n\t\t\t// TODO: investigate and use always.\n\t\t\treturn s ? data : get_page(data as any[])\n\t\t}\n\t\t// For subqueries\n\t\t;(_query as any)[s] = get_page\n\t\treturn query\n\t},\n\n\tmodify_subquery_pagination(subquery, context) {\n\t\tcontext.get_page = (subquery.query as any)[s]\n\t\treturn subquery\n\t},\n\n\tfinish_query_pagination(query, field, context) {\n\t\tconst { get_page } = context\n\t\tif (!get_page) {\n\t\t\tthrow new Error(`Internal error: paginator didn't provide page callback.`)\n\t\t}\n\t\toverrideParserInQuery(query.query, field, get_page)\n\t\treturn query\n\t},\n\n\t// Misc\n\n\trun_after_query(query, fn) {\n\t\treturn query.afterQuery(async (_, result) => fn(result))\n\t},\n\n\tprevent_select_all(query) {\n\t\t// Not needed in Orchid\n\t\treturn query\n\t},\n}\n\nconst s = Symbol(\"subquery_pagination_handler\")\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 } from \"orchid-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function defineTableResolver<Context = unknown>(\n\ttable: DbTable<any>,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {}\n) {\n\treturn new TableResolver(orm, table, options)\n}\n"],"mappings":"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","names":["orm","cursor","orm","orm","orm","s"]}
|
|
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/** 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 defineFieldResolver<Orm extends OrmAdapter, Context>(\n\toptions: FieldResolverOptions<Orm, Context> = {}\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify, transform } = 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 {\n\tinfo: GraphQLResolveInfo\n\tcontext: any\n\tfilters?: FiltersDef\n}\n\nexport interface GraphResolveContext<Context> {\n\ttree: ResolveTree\n\tfilters?: FiltersDef\n\tcontext: Context\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, filters }: GraphResolveOptions\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_type(query, { tree, filters, context })\n\t}\n\n\tresolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\t{ info, context, filters }: GraphResolveOptions\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_page(query, paginator, { tree, filters, context })\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\tconst { tree } = context\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})\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\tlet { tree } = context\n\t\t// Skip page subtree(s)\n\t\tfor (const field of paginator.path) {\n\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t// TODO: raise exception if not found\n\t\t}\n\t\tquery = this._resolve_type(query, { ...context, tree })\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 } 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 } = 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 { FieldResolver, FieldResolverOptions } 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 } = 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? this._get_default_field_resolver(field)\n\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t? this._get_default_field_resolver(field, r0)\n\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 { DbTable } from \"orchid-orm\"\nimport type { Query } from \"pqb\"\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(query.raw(expression, 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(async (_, result) => fn(result))\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 } from \"orchid-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function defineTableResolver<Context = unknown>(\n\ttable: DbTable<any>,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {}\n) {\n\treturn new TableResolver(orm, table, options)\n}\n"],"mappings":"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","names":["orm","cursor","orm","orm","orm"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -73,16 +73,16 @@ declare class GraphResolver<Orm extends OrmAdapter, Context> {
|
|
|
73
73
|
readonly options: GraphResolverOptions<Orm, Context>;
|
|
74
74
|
constructor(orm: Orm, type_resolvers: Record<string, TableResolver<Orm, Context>>, options?: GraphResolverOptions<Orm, Context>);
|
|
75
75
|
resolve(query: Orm["Query"], { info, context, filters }: GraphResolveOptions): Orm["Query"];
|
|
76
|
-
resolvePage(query: Orm["Query"], paginator: Paginator<Orm, Context>, { info, context, filters }: GraphResolveOptions): Orm["
|
|
76
|
+
resolvePage(query: Orm["Query"], paginator: Paginator<Orm, Context>, { info, context, filters }: GraphResolveOptions): Orm["QueryTransform"];
|
|
77
77
|
_get_resolve_tree(info: GraphQLResolveInfo): ResolveTree;
|
|
78
78
|
_resolve_type(query: Orm["Query"], context: GraphResolveContext<Context>): Orm["Query"];
|
|
79
|
-
_resolve_page(query: Orm["Query"], paginator: Paginator<Orm, Context>, context: GraphResolveContext<Context>): Orm["
|
|
79
|
+
_resolve_page(query: Orm["Query"], paginator: Paginator<Orm, Context>, context: GraphResolveContext<Context>): Orm["QueryTransform"];
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
interface Paginator<Orm extends OrmAdapter, Context> {
|
|
83
83
|
/** GraphQL path, for example: `["nodes"]` */
|
|
84
84
|
readonly path: string[];
|
|
85
|
-
paginate(query: Orm["Query"], context: PaginateContext<Orm, Context>): Orm["
|
|
85
|
+
paginate(query: Orm["Query"], context: PaginateContext<Orm, Context>): Orm["QueryTransform"];
|
|
86
86
|
}
|
|
87
87
|
interface PaginateContext<Orm extends OrmAdapter, Context> extends GraphResolveContext<Context> {
|
|
88
88
|
graph: GraphResolver<Orm, Context>;
|
|
@@ -90,9 +90,10 @@ interface PaginateContext<Orm extends OrmAdapter, Context> extends GraphResolveC
|
|
|
90
90
|
type GetPageFn = (nodes: any[]) => any;
|
|
91
91
|
|
|
92
92
|
type OrmModifier<Orm extends OrmAdapter> = (query: Orm["Query"], ...args: any[]) => Orm["Query"];
|
|
93
|
-
interface OrmAdapter<Table = any, Query = any> {
|
|
93
|
+
interface OrmAdapter<Table = any, Query = any, QueryTransform = any> {
|
|
94
94
|
Table: Table;
|
|
95
95
|
Query: Query;
|
|
96
|
+
QueryTransform: QueryTransform;
|
|
96
97
|
/** ORM table -> db table */
|
|
97
98
|
get_table_table(table: Table): string;
|
|
98
99
|
/** ORM table -> relation names */
|
|
@@ -116,7 +117,7 @@ interface OrmAdapter<Table = any, Query = any> {
|
|
|
116
117
|
reset_query_order(query: Query): Query;
|
|
117
118
|
add_query_order(query: Query, field: string, desc: boolean): Query;
|
|
118
119
|
set_query_limit(query: Query, limit: number): Query;
|
|
119
|
-
set_query_page_result(query: Query, get_page: GetPageFn):
|
|
120
|
+
set_query_page_result(query: Query, get_page: GetPageFn): QueryTransform;
|
|
120
121
|
modify_subquery_pagination(subquery: Query, context: Record<string, any>): Query;
|
|
121
122
|
finish_query_pagination(query: Query, field: string, context: Record<string, any>): Query;
|
|
122
123
|
/** Set ORM query to run callback afterwards */
|
|
@@ -125,7 +126,7 @@ interface OrmAdapter<Table = any, Query = any> {
|
|
|
125
126
|
prevent_select_all(query: Query): Query;
|
|
126
127
|
}
|
|
127
128
|
|
|
128
|
-
declare function defineCursorPaginator(options?: Partial<CursorPaginatorOptions>): CursorPaginator<OrmAdapter<any, any>, unknown>;
|
|
129
|
+
declare function defineCursorPaginator(options?: Partial<CursorPaginatorOptions>): CursorPaginator<OrmAdapter<any, any, any>, unknown>;
|
|
129
130
|
interface CursorPaginatorOptions {
|
|
130
131
|
fields: string[];
|
|
131
132
|
take: number;
|
|
@@ -138,7 +139,7 @@ declare class CursorPaginator<Orm extends OrmAdapter, Context> implements Pagina
|
|
|
138
139
|
desc: boolean;
|
|
139
140
|
}>;
|
|
140
141
|
constructor(options?: Partial<CursorPaginatorOptions>);
|
|
141
|
-
paginate(query: Orm["Query"], context: PaginateContext<Orm, Context>):
|
|
142
|
+
paginate(query: Orm["Query"], context: PaginateContext<Orm, Context>): any;
|
|
142
143
|
_create_cursor(instance: any): string;
|
|
143
144
|
_parse_cursor(cursor: string): {
|
|
144
145
|
expression: string;
|
|
@@ -154,7 +155,7 @@ declare function defineRelationResolver<Orm extends OrmAdapter, Context>(options
|
|
|
154
155
|
|
|
155
156
|
declare function definePageResolver<Orm extends OrmAdapter, Context>(paginator: Paginator<Orm, Context>, options?: RelationResolverOptions<Orm, Context>): FieldResolver<Orm, Context>;
|
|
156
157
|
|
|
157
|
-
type OrchidOrm = OrmAdapter<DbTable<any>, Query
|
|
158
|
+
type OrchidOrm = OrmAdapter<DbTable<any>, Query, Pick<Promise<any>, "then" | "catch">>;
|
|
158
159
|
|
|
159
160
|
declare function createGraphResolver<Context = unknown>(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>): GraphResolver<OrchidOrm, Context>;
|
|
160
161
|
|
package/dist/index.js
CHANGED
|
@@ -35,7 +35,7 @@ var CursorPaginator = class {
|
|
|
35
35
|
query = orm2.where_raw(query, expression, bindings);
|
|
36
36
|
}
|
|
37
37
|
query = orm2.set_query_limit(query, take + 1);
|
|
38
|
-
|
|
38
|
+
return orm2.set_query_page_result(query, (nodes) => {
|
|
39
39
|
let cursor2;
|
|
40
40
|
if (nodes.length > take) {
|
|
41
41
|
cursor2 = this._create_cursor(nodes[take - 1]);
|
|
@@ -43,7 +43,6 @@ var CursorPaginator = class {
|
|
|
43
43
|
}
|
|
44
44
|
return { nodes, cursor: cursor2 };
|
|
45
45
|
});
|
|
46
|
-
return query;
|
|
47
46
|
}
|
|
48
47
|
_create_cursor(instance) {
|
|
49
48
|
return JSON.stringify(
|
|
@@ -325,10 +324,10 @@ var TableResolver = class {
|
|
|
325
324
|
};
|
|
326
325
|
|
|
327
326
|
// src/orm/orm.ts
|
|
328
|
-
import { overrideParserInQuery } from "orchid-core";
|
|
329
327
|
var orm = {
|
|
330
328
|
Table: void 0,
|
|
331
329
|
Query: void 0,
|
|
330
|
+
QueryTransform: void 0,
|
|
332
331
|
// Reflection
|
|
333
332
|
get_table_table(table) {
|
|
334
333
|
return table.table;
|
|
@@ -376,25 +375,12 @@ var orm = {
|
|
|
376
375
|
},
|
|
377
376
|
// Pagination helpers
|
|
378
377
|
set_query_page_result(query, get_page) {
|
|
379
|
-
|
|
380
|
-
const { handleResult } = _query;
|
|
381
|
-
_query.handleResult = (q, result, s2) => {
|
|
382
|
-
const data = handleResult(q, result, s2);
|
|
383
|
-
return s2 ? data : get_page(data);
|
|
384
|
-
};
|
|
385
|
-
_query[s] = get_page;
|
|
386
|
-
return query;
|
|
378
|
+
return query.transform((nodes) => get_page(nodes));
|
|
387
379
|
},
|
|
388
|
-
modify_subquery_pagination(subquery
|
|
389
|
-
context.get_page = subquery.query[s];
|
|
380
|
+
modify_subquery_pagination(subquery) {
|
|
390
381
|
return subquery;
|
|
391
382
|
},
|
|
392
|
-
finish_query_pagination(query
|
|
393
|
-
const { get_page } = context;
|
|
394
|
-
if (!get_page) {
|
|
395
|
-
throw new Error(`Internal error: paginator didn't provide page callback.`);
|
|
396
|
-
}
|
|
397
|
-
overrideParserInQuery(query.query, field, get_page);
|
|
383
|
+
finish_query_pagination(query) {
|
|
398
384
|
return query;
|
|
399
385
|
},
|
|
400
386
|
// Misc
|
|
@@ -405,7 +391,6 @@ var orm = {
|
|
|
405
391
|
return query;
|
|
406
392
|
}
|
|
407
393
|
};
|
|
408
|
-
var s = Symbol("subquery_pagination_handler");
|
|
409
394
|
|
|
410
395
|
// src/resolvers/graph.ts
|
|
411
396
|
function createGraphResolver(types, 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\tquery = 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\n\t\treturn query\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/** 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 defineFieldResolver<Orm extends OrmAdapter, Context>(\n\toptions: FieldResolverOptions<Orm, Context> = {}\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify, transform } = 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 {\n\tinfo: GraphQLResolveInfo\n\tcontext: any\n\tfilters?: FiltersDef\n}\n\nexport interface GraphResolveContext<Context> {\n\ttree: ResolveTree\n\tfilters?: FiltersDef\n\tcontext: Context\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, filters }: GraphResolveOptions\n\t): Orm[\"Query\"] {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_type(query, { tree, filters, context })\n\t}\n\n\tresolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\t{ info, context, filters }: GraphResolveOptions\n\t): Orm[\"Query\"] {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_page(query, paginator, { tree, filters, context })\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\tconst { tree } = context\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})\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): Orm[\"Query\"] {\n\t\tlet { tree } = context\n\t\t// Skip page subtree(s)\n\t\tfor (const field of paginator.path) {\n\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t// TODO: raise exception if not found\n\t\t}\n\t\tquery = this._resolve_type(query, { ...context, tree })\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 } 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 } = options\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\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\t// The modify+finish hack is needed for both Objection and Orchid (with completely different implementations)\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 { FieldResolver, FieldResolverOptions } 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 } = 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? this._get_default_field_resolver(field)\n\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t? this._get_default_field_resolver(field, r0)\n\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 { overrideParserInQuery } from \"orchid-core\"\nimport { DbTable } from \"orchid-orm\"\nimport { Query } from \"pqb\"\n\nexport type OrchidOrm = OrmAdapter<DbTable<any>, Query>\n\nexport const orm: OrchidOrm = {\n\tTable: undefined as unknown as OrchidOrm[\"Table\"],\n\tQuery: undefined as unknown as OrchidOrm[\"Query\"],\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(query.raw(expression, 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\t// For root query\n\t\tconst _query = query.query\n\t\tconst { handleResult } = _query\n\t\t_query.handleResult = (q, result, s) => {\n\t\t\tconst data = handleResult(q, result, s)\n\t\t\t// Sometimes this is called for subqueries, sometimes not.\n\t\t\t// TODO: investigate and use always.\n\t\t\treturn s ? data : get_page(data as any[])\n\t\t}\n\t\t// For subqueries\n\t\t;(_query as any)[s] = get_page\n\t\treturn query\n\t},\n\n\tmodify_subquery_pagination(subquery, context) {\n\t\tcontext.get_page = (subquery.query as any)[s]\n\t\treturn subquery\n\t},\n\n\tfinish_query_pagination(query, field, context) {\n\t\tconst { get_page } = context\n\t\tif (!get_page) {\n\t\t\tthrow new Error(`Internal error: paginator didn't provide page callback.`)\n\t\t}\n\t\toverrideParserInQuery(query.query, field, get_page)\n\t\treturn query\n\t},\n\n\t// Misc\n\n\trun_after_query(query, fn) {\n\t\treturn query.afterQuery(async (_, result) => fn(result))\n\t},\n\n\tprevent_select_all(query) {\n\t\t// Not needed in Orchid\n\t\treturn query\n\t},\n}\n\nconst s = Symbol(\"subquery_pagination_handler\")\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 } from \"orchid-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function defineTableResolver<Context = unknown>(\n\ttable: DbTable<any>,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {}\n) {\n\treturn new TableResolver(orm, table, options)\n}\n"],"mappings":";AAGO,SAAS,sBACf,UAA2C,CAAC,GAC3C;AACD,SAAO,IAAI,gBAAgB,OAAO;AACnC;AAiBA,IAAM,kBAAN,MAEA;AAAA,EACU,OAAO,CAAC,OAAO;AAAA,EACf;AAAA,EAEA;AAAA,EAKT,YAAY,UAA2C,CAAC,GAAG;AAC1D,SAAK,UAAU;AAAA,MACd,QAAQ,CAAC,IAAI;AAAA,MACb,MAAM;AAAA,MACN,GAAG;AAAA,IACJ;AACA,SAAK,SAAS,KAAK,QAAQ,OAAO,IAAI,CAAC,UAAU;AAChD,UAAI,MAAM,WAAW,GAAG,GAAG;AAC1B,eAAO,EAAE,MAAM,MAAM,MAAM,CAAC,GAAG,MAAM,KAAK;AAAA,MAC3C,OAAO;AACN,eAAO,EAAE,MAAM,OAAO,MAAM,MAAM;AAAA,MACnC;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,SAAS,OAAqB,SAAwC;AACrE,UAAM,EAAE,KAAAA,KAAI,IAAI,QAAQ;AACxB,UAAM,EAAE,KAAK,IAAI,QAAQ;AAEzB,UAAM,OAAQ,KAAK,QAA+B,KAAK,QAAQ;AAC/D,UAAM,SAAS,KAAK;AAGpB,YAAQA,KAAI,kBAAkB,KAAK;AACnC,eAAW,SAAS,KAAK,QAAQ;AAEhC,cAAQA,KAAI,aAAa,OAAO,EAAE,OAAO,MAAM,MAAM,IAAI,MAAM,KAAK,CAAC;AACrE,cAAQA,KAAI,gBAAgB,OAAO,MAAM,MAAM,MAAM,IAAI;AAAA,IAC1D;AAEA,QAAI,QAAQ;AACX,YAAM,EAAE,YAAY,SAAS,IAAI,KAAK,cAAc,MAAM;AAC1D,cAAQA,KAAI,UAAU,OAAO,YAAY,QAAQ;AAAA,IAClD;AACA,YAAQA,KAAI,gBAAgB,OAAO,OAAO,CAAC;AAE3C,YAAQA,KAAI,sBAAsB,OAAO,CAAC,UAAU;AACnD,UAAIC;AACJ,UAAI,MAAM,SAAS,MAAM;AACxB,QAAAA,UAAS,KAAK,eAAe,MAAM,OAAO,CAAC,CAAC;AAC5C,gBAAQ,MAAM,MAAM,GAAG,IAAI;AAAA,MAC5B;AACA,aAAO,EAAE,OAAO,QAAAA,QAAO;AAAA,IACxB,CAAC;AAED,WAAO;AAAA,EACR;AAAA,EAEA,eAAe,UAAe;AAC7B,WAAO,KAAK;AAAA,MACX,KAAK,OAAO,IAAI,CAAC,UAAU;AAC1B,cAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,YAAI,UAAU,QAAW;AACxB,gBAAM,IAAI;AAAA,YACT,4CAA4C,MAAM;AAAA,UACnD;AAAA,QACD;AACA,eAAO,OAAO,KAAK;AAAA,MACpB,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAEA,cAAc,QAAgB;AAC7B,UAAM,SAAS,KAAK,MAAM,MAAM;AAChC,UAAM,OAAiB,CAAC;AACxB,UAAM,QAAkB,CAAC;AACzB,UAAM,WAAgC,CAAC;AACvC,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,EAAE,GAAG;AAC5C,YAAM,QAAQ,KAAK,OAAO,CAAC;AAC3B,YAAM,cAAc,MAAM,OAAO,QAAQ;AACzC,YAAM,eAAe,MAAM,OAAO,OAAO;AACzC,kBAAY,KAAK,IAAI,MAAM,OAAO;AAClC,mBAAa,KAAK,MAAM,MAAM,IAAI;AAClC,eAAS,MAAM,IAAI,IAAI,OAAO,CAAC;AAAA,IAChC;AACA,WAAO;AAAA,MACN,YAAY,IAAI,KAAK,KAAK,GAAG,SAAS,MAAM,KAAK,GAAG;AAAA,MACpD;AAAA,IACD;AAAA,EACD;AACD;;;ACjHO,SAAS,gBACfC,MACA,OACA,WACe;AACf,SAAOA,KAAI,gBAAgB,OAAO,OAAO,WAAW;AAEnD,QAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,YAAM,UAAU,MAAM,QAAQ,IAAI,OAAO,IAAI,SAAS,CAAC;AACvD,aAAO,QAAQ,OAAO,OAAO;AAAA,IAC9B,WAAW,QAAQ;AAClB,aAAO,UAAU,MAAM;AAAA,IACxB,OAAO;AAEN,aAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;;;ACeO,SAAS,oBACf,UAA8C,CAAC,GACjB;AAC9B,QAAM,EAAE,YAAY,QAAQ,UAAU,IAAI;AAE1C,SAAO,SAAS,QAAQ,OAAO,SAAS;AACvC,UAAM,EAAE,MAAM,IAAI;AAClB,QAAI,QAAQ;AACX,cAAQ,OAAO,OAAO,OAAO;AAAA,IAC9B,OAAO;AACN,cAAQ,QAAQ,MAAM,IAAI,aAAa,OAAO;AAAA,QAC7C,OAAO,cAAc;AAAA,QACrB,IAAI;AAAA,MACL,CAAC;AAAA,IACF;AACA,QAAI,WAAW;AACd,cAAQ,gBAAgB,QAAQ,MAAM,KAAK,OAAO,OAAO,aAAa;AACrE,iBAAS,KAAK,IAAI,MAAM,UAAU,SAAS,KAAK,GAAG,UAAU,OAAO;AACpE,eAAO;AAAA,MACR,CAAC;AAAA,IACF;AACA,WAAO;AAAA,EACR;AACD;;;ACxDA,SAAS,wBAAqC;AAwBvC,IAAM,gBAAN,MAAqD;AAAA,EAC3D,YACUC,MACA,gBACA,UAA8C,CAAC,GACvD;AAHQ,eAAAA;AACA;AACA;AAAA,EACP;AAAA,EAEH,QACC,OACA,EAAE,MAAM,SAAS,QAAQ,GACV;AACf,UAAM,OAAO,KAAK,kBAAkB,IAAI;AACxC,WAAO,KAAK,cAAc,OAAO,EAAE,MAAM,SAAS,QAAQ,CAAC;AAAA,EAC5D;AAAA,EAEA,YACC,OACA,WACA,EAAE,MAAM,SAAS,QAAQ,GACV;AACf,UAAM,OAAO,KAAK,kBAAkB,IAAI;AACxC,WAAO,KAAK,cAAc,OAAO,WAAW,EAAE,MAAM,SAAS,QAAQ,CAAC;AAAA,EACvE;AAAA,EAEA,kBAAkB,MAA0B;AAC3C,WAAO,iBAAiB,IAAI;AAAA,EAC7B;AAAA,EAEA,cACC,OACA,SACe;AACf,UAAM,EAAE,KAAK,IAAI;AACjB,UAAM,OAAO,OAAO,KAAK,KAAK,gBAAgB,EAAE,CAAC;AACjD,UAAM,gBAAgB,KAAK,eAAe,IAAI;AAC9C,QAAI,CAAC,eAAe;AACnB,YAAM,IAAI,MAAM,+BAA+B,OAAO;AAAA,IACvD;AACA,WAAO,cAAc,QAAQ,OAAO;AAAA,MACnC,GAAG;AAAA,MACH,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,cACC,OACA,WACA,SACe;AACf,QAAI,EAAE,KAAK,IAAI;AAEf,eAAW,SAAS,UAAU,MAAM;AACnC,YAAM,OAAO,OAAO,KAAK,KAAK,gBAAgB,EAAE,CAAC;AACjD,aAAO,KAAK,iBAAiB,IAAI,EAAE,KAAK;AAAA,IAEzC;AACA,YAAQ,KAAK,cAAc,OAAO,EAAE,GAAG,SAAS,KAAK,CAAC;AACtD,WAAO,UAAU,SAAS,OAAO;AAAA,MAChC,GAAG;AAAA,MACH,OAAO;AAAA,IACR,CAAC;AAAA,EACF;AACD;;;ACpFO,SAAS,mBACf,WACA,UAAiD,CAAC,GACpB;AAC9B,QAAM,EAAE,YAAY,OAAO,IAAI;AAE/B,SAAO,SAAS,QAAQ,OAAO,SAAS;AACvC,UAAM,EAAE,OAAO,MAAM,IAAI;AACzB,UAAM,qBAAqB,CAAC;AAC5B,YAAQ,MAAM,IAAI,gBAAgB,OAAO;AAAA,MACxC,UAAU,cAAc;AAAA,MACxB,IAAI;AAAA,MACJ,OAAO,UAAU;AAChB,mBAAW,MAAM,cAAc,UAAU,WAAW,OAAO;AAE3D,mBAAW,MAAM,IAAI;AAAA,UACpB;AAAA,UACA;AAAA,QACD;AACA,eAAO,SAAS,OAAO,UAAU,OAAO,IAAI;AAAA,MAC7C;AAAA,IACD,CAAC;AACD,YAAQ,MAAM,IAAI,wBAAwB,OAAO,OAAO,kBAAkB;AAC1E,WAAO;AAAA,EACR;AACD;;;ACnBO,SAAS,uBACf,UAAiD,CAAC,GACpB;AAC9B,QAAM,EAAE,YAAY,SAAS,OAAO,IAAI;AAExC,SAAO,SAAS,QAAQ,OAAO,SAAS;AACvC,UAAM,EAAE,OAAO,MAAM,IAAI;AACzB,WAAO,MAAM,IAAI,gBAAgB,OAAO;AAAA,MACvC,UAAU,cAAc;AAAA,MACxB,IAAI;AAAA,MACJ,OAAO,UAAU;AAChB,mBAAW,MAAM,cAAc,UAAU,EAAE,GAAG,SAAS,QAAQ,CAAC;AAChE,eAAO,SAAS,OAAO,UAAU,OAAO,IAAI;AAAA,MAC7C;AAAA,IACD,CAAC;AAAA,EACF;AACD;;;AC3BO,SAAS,gBAAgB,KAAsC;AACrE,SAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG;AACrD;;;ACqBO,SAAS,cACf,OACA,EAAE,SAAS,WAAW,QAAQ,GACf;AACf,MAAI,CAAC,SAAS;AACb,WAAO;AAAA,EACR;AACA,QAAM,aAAa,QAAQ,KAAK,MAAM;AACtC,MAAI,CAAC,YAAY;AAChB,WAAO;AAAA,EACR;AACA,MAAI,CAAC,gBAAgB,UAAU,GAAG;AACjC,UAAM,IAAI,MAAM,mBAAmB,6BAA6B;AAAA,EACjE;AACA,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACxD,QAAI,UAAU,QAAW;AAExB;AAAA,IACD;AACA,QAAI,YAAY,KAAK,GAAG;AACvB,cAAQ,UAAU,KAAK,EAAE,OAAO,OAAO,OAAO;AAAA,IAC/C,OAAO;AACN,YAAM,CAAC,aAAa,GAAG,IAAI,MAAM,MAAM,IAAI;AAC3C,YAAM,KAAK,KAAK,YAAY;AAE5B,cAAQ,QAAQ,MAAM,IAAI,MAAM,OAAO,aAAa,IAAI,KAAK;AAAA,IAC9D;AAAA,EACD;AACA,SAAO;AACR;;;ACjBO,IAAM,gBAAN,MAAqD;AAAA,EAQ3D,YACUC,MACA,OACA,UAA8C,CAAC,GACvD;AAHQ,eAAAA;AACA;AACA;AAET,SAAK,YAAY,IAAI,IAAIA,KAAI,oBAAoB,KAAK,CAAC;AACvD,SAAK,iBAAiB,IAAI,IAAIA,KAAI,yBAAyB,KAAK,CAAC;AACjE,SAAK,YAAY,EAAE,GAAGA,KAAI,oBAAoB,KAAK,GAAG,GAAG,QAAQ,UAAU;AAG3E,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI,QAAQ;AACX,WAAK,wBAAwB,OAAO,KAAK,MAAM,EAAE,OAE/C,CAAC,WAAW,UAAU;AACvB,cAAM,KAAK,OAAO,KAAK;AACvB,cAAM,IACL,OAAO,OAAO,aACX,KACA,OAAO,OACP,KAAK,4BAA4B,KAAK,IACtC,OAAO,OAAO,WACd,KAAK,4BAA4B,OAAO,EAAE,IAC1C;AACJ,YAAI,MAAM,QAAW;AACpB,gBAAM,IAAI;AAAA,YACT,6DAA6D,OAAO;AAAA,UACrE;AAAA,QACD;AACA,kBAAU,KAAK,IAAI;AACnB,eAAO;AAAA,MACR,GAAG,CAAC,CAAC;AAAA,IACN;AAAA,EACD;AAAA;AAAA,EAvCS;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA;AAAA,EAsCT,QAAQ,OAAqB,SAA4C;AACxE,UAAM,EAAE,QAAQ,UAAU,IAAI,KAAK;AACnC,UAAM,EAAE,OAAO,MAAM,MAAM,QAAQ,IAAI;AAEvC,UAAM,cAAc,KAAK,IAAI,gBAAgB,KAAK;AAClD,UAAM,cAAc,KAAK,IAAI,gBAAgB,KAAK,KAAK;AAEvD,QAAI,gBAAgB,aAAa;AAChC,YAAM,IAAI;AAAA,QACT,oCAAoC,kBAAkB,yBAAyB;AAAA,MAChF;AAAA,IACD;AAEA,UAAM,mBACL,KAAK,QAAQ,kBACb,MAAM,QAAQ,kBACd,CAAC,KAAK,QAAQ;AAEf,QAAI,CAAC,oBAAoB,CAAC,KAAK,uBAAuB;AACrD,YAAM,IAAI;AAAA,QACT,qBAAqB;AAAA,MACtB;AAAA,IACD;AAEA,QAAI,QAAQ;AACX,cAAQ,OAAO,OAAO,OAAO;AAAA,IAC9B;AAEA,eAAW,WAAW,OAAO,OAAO,KAAK,iBAAiB,IAAI,CAAC,GAAG;AACjE,YAAM,QAAQ,QAAQ;AACtB,YAAM,IACL,KAAK,wBAAwB,KAAK,MACjC,mBAAmB,KAAK,4BAA4B,KAAK,IAAI;AAC/D,UAAI,CAAC,GAAG;AACP,cAAM,IAAI,MAAM,uCAAuC,QAAQ,QAAQ;AAAA,MACxE;AACA,UAAI,GAAG;AACN,gBAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,MAAM,SAAS,MAAM,CAAC;AAAA,MACtD;AAAA,IACD;AAEA,UAAM,oBACL,KAAK,QAAQ,mBAAmB,MAAM,QAAQ;AAE/C,UAAM,oBAAoB,oBAAoB,OAAO;AAErD,QAAI,mBAAmB;AACtB,cAAQ,cAA4B,OAAO;AAAA,QAC1C,SAAS;AAAA,QACT,WAAW,KAAK;AAAA,QAChB;AAAA,MACD,CAAC;AAAA,IACF;AAEA,QAAI,WAAW;AACd,cAAQ,gBAAgB,KAAK,KAAK,OAAO,CAAC,aAAa;AACtD,eAAO,UAAU,UAAU,OAAO;AAAA,MACnC,CAAC;AAAA,IACF;AAEA,YAAQ,KAAK,IAAI,mBAAmB,KAAK;AAEzC,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,4BACC,OACA,YAC8B;AAC9B,UAAM,qBAAqB,cAAc;AACzC,QACC,KAAK,QAAQ,YAAY,kBAAkB,KAC3C,KAAK,eAAe,IAAI,kBAAkB,GACzC;AAED,aAAO,CAAC,UAAU;AAAA,IACnB,WAAW,KAAK,UAAU,IAAI,kBAAkB,GAAG;AAElD,aAAO,uBAAuB,EAAE,WAAW,CAAC;AAAA,IAC7C,OAAO;AAEN,aAAO,oBAAoB,EAAE,WAAW,CAAC;AAAA,IAC1C;AAAA,EACD;AACD;;;ACrKA,SAAS,6BAA6B;AAM/B,IAAM,MAAiB;AAAA,EAC7B,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EAIP,gBAAgB,OAAO;AACtB,WAAO,MAAM;AAAA,EACd;AAAA,EAEA,oBAAoB,OAAO;AAC1B,WAAO,OAAO,KAAK,MAAM,SAAS;AAAA,EACnC;AAAA,EAEA,2BAA2B;AAE1B,WAAO,CAAC;AAAA,EACT;AAAA,EAEA,sBAAsB;AACrB,WAAO;AAAA,EACR;AAAA,EAEA,gBAAgB,OAAO;AACtB,QAAI,CAAC,MAAM,OAAO;AACjB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IACzC;AACA,WAAO,MAAM;AAAA,EACd;AAAA;AAAA,EAIA,aAAa,OAAO,EAAE,OAAO,GAAG,GAAG;AAClC,WAAO,MAAM,OAAO,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;AAAA,EACpC;AAAA,EAEA,gBAAgB,OAAO,EAAE,UAAU,IAAI,OAAO,GAAG;AAChD,WAAO,MAAM,OAAO;AAAA,MACnB,CAAC,EAAE,GAAG,CAAC,MAAM,OAAQ,EAAU,QAAQ,CAAC;AAAA,IACzC,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,OAAO,OAAO,IAAI,OAAO;AAC9B,WAAO,MAAM,MAAM,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC;AAAA,EAC7D;AAAA,EAEA,UAAU,OAAO,YAAY,UAAU;AACtC,WAAO,MAAM,MAAM,MAAM,IAAI,YAAY,QAAQ,CAAC;AAAA,EACnD;AAAA;AAAA,EAIA,kBAAkB,OAAO;AACxB,WAAO,MAAM,MAAM,OAAO;AAAA,EAC3B;AAAA,EAEA,gBAAgB,OAAO,OAAO,MAAM;AACnC,WAAO,MAAM,MAAM,EAAE,CAAC,KAAK,GAAG,OAAO,SAAS,MAAM,CAAC;AAAA,EACtD;AAAA,EAEA,gBAAgB,OAAO,OAAO;AAC7B,WAAO,MAAM,MAAM,KAAK;AAAA,EACzB;AAAA;AAAA,EAIA,sBAAsB,OAAO,UAAU;AAEtC,UAAM,SAAS,MAAM;AACrB,UAAM,EAAE,aAAa,IAAI;AACzB,WAAO,eAAe,CAAC,GAAG,QAAQC,OAAM;AACvC,YAAM,OAAO,aAAa,GAAG,QAAQA,EAAC;AAGtC,aAAOA,KAAI,OAAO,SAAS,IAAa;AAAA,IACzC;AAEC,IAAC,OAAe,CAAC,IAAI;AACtB,WAAO;AAAA,EACR;AAAA,EAEA,2BAA2B,UAAU,SAAS;AAC7C,YAAQ,WAAY,SAAS,MAAc,CAAC;AAC5C,WAAO;AAAA,EACR;AAAA,EAEA,wBAAwB,OAAO,OAAO,SAAS;AAC9C,UAAM,EAAE,SAAS,IAAI;AACrB,QAAI,CAAC,UAAU;AACd,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC1E;AACA,0BAAsB,MAAM,OAAO,OAAO,QAAQ;AAClD,WAAO;AAAA,EACR;AAAA;AAAA,EAIA,gBAAgB,OAAO,IAAI;AAC1B,WAAO,MAAM,WAAW,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;AAAA,EACxD;AAAA,EAEA,mBAAmB,OAAO;AAEzB,WAAO;AAAA,EACR;AACD;AAEA,IAAM,IAAI,OAAO,6BAA6B;;;AChHvC,SAAS,oBACf,OACA,SACC;AACD,SAAO,IAAI,cAAkC,KAAK,OAAO,OAAO;AACjE;;;ACJO,SAAS,oBACf,OACA,UAAoD,CAAC,GACpD;AACD,SAAO,IAAI,cAAc,KAAK,OAAO,OAAO;AAC7C;","names":["orm","cursor","orm","orm","orm","s"]}
|
|
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/** 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 defineFieldResolver<Orm extends OrmAdapter, Context>(\n\toptions: FieldResolverOptions<Orm, Context> = {}\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify, transform } = 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 {\n\tinfo: GraphQLResolveInfo\n\tcontext: any\n\tfilters?: FiltersDef\n}\n\nexport interface GraphResolveContext<Context> {\n\ttree: ResolveTree\n\tfilters?: FiltersDef\n\tcontext: Context\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, filters }: GraphResolveOptions\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_type(query, { tree, filters, context })\n\t}\n\n\tresolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\t{ info, context, filters }: GraphResolveOptions\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_page(query, paginator, { tree, filters, context })\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\tconst { tree } = context\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})\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\tlet { tree } = context\n\t\t// Skip page subtree(s)\n\t\tfor (const field of paginator.path) {\n\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t// TODO: raise exception if not found\n\t\t}\n\t\tquery = this._resolve_type(query, { ...context, tree })\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 } 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 } = 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 { FieldResolver, FieldResolverOptions } 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 } = 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? this._get_default_field_resolver(field)\n\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t? this._get_default_field_resolver(field, r0)\n\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 { DbTable } from \"orchid-orm\"\nimport type { Query } from \"pqb\"\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(query.raw(expression, 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(async (_, result) => fn(result))\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 } from \"orchid-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function defineTableResolver<Context = unknown>(\n\ttable: DbTable<any>,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {}\n) {\n\treturn new TableResolver(orm, table, options)\n}\n"],"mappings":"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","names":["orm","cursor","orm","orm","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.
|
|
4
|
+
"version": "1.2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/IlyaSemenov/orchid-graphql"
|
|
@@ -25,9 +25,8 @@
|
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
27
|
"graphql": "^16",
|
|
28
|
-
"orchid-
|
|
29
|
-
"
|
|
30
|
-
"pqb": "^0.11.29"
|
|
28
|
+
"orchid-orm": "^1.10.3",
|
|
29
|
+
"pqb": ">=0.12.3 <0.13"
|
|
31
30
|
},
|
|
32
31
|
"devDependencies": {
|
|
33
32
|
"@apollo/server": "~4.7.1",
|
|
@@ -36,17 +35,16 @@
|
|
|
36
35
|
"graphql": "~16.6.0",
|
|
37
36
|
"graphql-request": "~6.0.0",
|
|
38
37
|
"graphql-tag": "^2.12.6",
|
|
39
|
-
"orchid-
|
|
40
|
-
"orchid-orm": "~1.9.42",
|
|
38
|
+
"orchid-orm": "~1.10.3",
|
|
41
39
|
"pg": "~8.11.0",
|
|
42
|
-
"pqb": "~0.
|
|
40
|
+
"pqb": "~0.12.3",
|
|
43
41
|
"tsup": "~6.7.0",
|
|
44
42
|
"typescript": "~5.0.4",
|
|
45
43
|
"vite": "~4.3.8",
|
|
46
44
|
"vite-node": "~0.31.1",
|
|
47
45
|
"vite-tsconfig-paths": "~4.2.0",
|
|
48
46
|
"vitest": "~0.31.1",
|
|
49
|
-
"graphql-orm": "1.
|
|
47
|
+
"graphql-orm": "1.2.0"
|
|
50
48
|
},
|
|
51
49
|
"scripts": {
|
|
52
50
|
"dev": "vite-node --watch playground/readme.sample.ts",
|
package/src/orm/orm.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { OrmAdapter } from "graphql-orm"
|
|
2
|
-
import { overrideParserInQuery } from "orchid-core"
|
|
3
2
|
import { DbTable } from "orchid-orm"
|
|
4
|
-
import { Query } from "pqb"
|
|
3
|
+
import type { Query } from "pqb"
|
|
5
4
|
|
|
6
|
-
export type OrchidOrm = OrmAdapter<
|
|
5
|
+
export type OrchidOrm = OrmAdapter<
|
|
6
|
+
DbTable<any>,
|
|
7
|
+
Query,
|
|
8
|
+
// TODO: Type as QueryTransform once it's published.
|
|
9
|
+
Pick<Promise<any>, "then" | "catch">
|
|
10
|
+
>
|
|
7
11
|
|
|
8
12
|
export const orm: OrchidOrm = {
|
|
9
13
|
Table: undefined as unknown as OrchidOrm["Table"],
|
|
10
14
|
Query: undefined as unknown as OrchidOrm["Query"],
|
|
15
|
+
QueryTransform: undefined as unknown as OrchidOrm["QueryTransform"],
|
|
11
16
|
|
|
12
17
|
// Reflection
|
|
13
18
|
|
|
@@ -74,31 +79,14 @@ export const orm: OrchidOrm = {
|
|
|
74
79
|
// Pagination helpers
|
|
75
80
|
|
|
76
81
|
set_query_page_result(query, get_page) {
|
|
77
|
-
|
|
78
|
-
const _query = query.query
|
|
79
|
-
const { handleResult } = _query
|
|
80
|
-
_query.handleResult = (q, result, s) => {
|
|
81
|
-
const data = handleResult(q, result, s)
|
|
82
|
-
// Sometimes this is called for subqueries, sometimes not.
|
|
83
|
-
// TODO: investigate and use always.
|
|
84
|
-
return s ? data : get_page(data as any[])
|
|
85
|
-
}
|
|
86
|
-
// For subqueries
|
|
87
|
-
;(_query as any)[s] = get_page
|
|
88
|
-
return query
|
|
82
|
+
return query.transform((nodes) => get_page(nodes as any))
|
|
89
83
|
},
|
|
90
84
|
|
|
91
|
-
modify_subquery_pagination(subquery
|
|
92
|
-
context.get_page = (subquery.query as any)[s]
|
|
85
|
+
modify_subquery_pagination(subquery) {
|
|
93
86
|
return subquery
|
|
94
87
|
},
|
|
95
88
|
|
|
96
|
-
finish_query_pagination(query
|
|
97
|
-
const { get_page } = context
|
|
98
|
-
if (!get_page) {
|
|
99
|
-
throw new Error(`Internal error: paginator didn't provide page callback.`)
|
|
100
|
-
}
|
|
101
|
-
overrideParserInQuery(query.query, field, get_page)
|
|
89
|
+
finish_query_pagination(query) {
|
|
102
90
|
return query
|
|
103
91
|
},
|
|
104
92
|
|
|
@@ -113,5 +101,3 @@ export const orm: OrchidOrm = {
|
|
|
113
101
|
return query
|
|
114
102
|
},
|
|
115
103
|
}
|
|
116
|
-
|
|
117
|
-
const s = Symbol("subquery_pagination_handler")
|