orchid-graphql 1.0.0 → 1.1.1
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 +11 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +58 -54
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/src/index.ts +4 -10
- package/src/orm/orm.ts +8 -3
- package/src/resolvers/graph.ts +6 -11
- package/src/resolvers/table.ts +6 -7
package/dist/index.cjs
CHANGED
|
@@ -35,7 +35,7 @@ __export(src_exports, {
|
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(src_exports);
|
|
37
37
|
|
|
38
|
-
// ../graphql-orm
|
|
38
|
+
// ../graphql-orm/src/paginators/cursor.ts
|
|
39
39
|
function defineCursorPaginator(options = {}) {
|
|
40
40
|
return new CursorPaginator(options);
|
|
41
41
|
}
|
|
@@ -115,7 +115,7 @@ var CursorPaginator = class {
|
|
|
115
115
|
}
|
|
116
116
|
};
|
|
117
117
|
|
|
118
|
-
// ../graphql-orm
|
|
118
|
+
// ../graphql-orm/src/utils/run-after.ts
|
|
119
119
|
function run_after_query(orm2, query, transform) {
|
|
120
120
|
return orm2.run_after_query(query, async (result) => {
|
|
121
121
|
if (Array.isArray(result)) {
|
|
@@ -129,7 +129,7 @@ function run_after_query(orm2, query, transform) {
|
|
|
129
129
|
});
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
// ../graphql-orm
|
|
132
|
+
// ../graphql-orm/src/resolvers/field.ts
|
|
133
133
|
function defineFieldResolver(options = {}) {
|
|
134
134
|
const { tableField, modify, transform } = options;
|
|
135
135
|
return function resolve(query, context) {
|
|
@@ -152,7 +152,7 @@ function defineFieldResolver(options = {}) {
|
|
|
152
152
|
};
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
-
// ../graphql-orm
|
|
155
|
+
// ../graphql-orm/src/resolvers/graph.ts
|
|
156
156
|
var import_graphql_parse_resolve_info = require("graphql-parse-resolve-info");
|
|
157
157
|
var GraphResolver = class {
|
|
158
158
|
constructor(orm2, type_resolvers, options = {}) {
|
|
@@ -199,7 +199,7 @@ var GraphResolver = class {
|
|
|
199
199
|
}
|
|
200
200
|
};
|
|
201
201
|
|
|
202
|
-
// ../graphql-orm
|
|
202
|
+
// ../graphql-orm/src/resolvers/page.ts
|
|
203
203
|
function definePageResolver(paginator, options = {}) {
|
|
204
204
|
const { tableField, modify } = options;
|
|
205
205
|
return function resolve(query, context) {
|
|
@@ -222,7 +222,7 @@ function definePageResolver(paginator, options = {}) {
|
|
|
222
222
|
};
|
|
223
223
|
}
|
|
224
224
|
|
|
225
|
-
// ../graphql-orm
|
|
225
|
+
// ../graphql-orm/src/resolvers/relation.ts
|
|
226
226
|
function defineRelationResolver(options = {}) {
|
|
227
227
|
const { tableField, filters, modify } = options;
|
|
228
228
|
return function resolve(query, context) {
|
|
@@ -238,12 +238,12 @@ function defineRelationResolver(options = {}) {
|
|
|
238
238
|
};
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
-
// ../graphql-orm
|
|
241
|
+
// ../graphql-orm/src/utils/is-plain-object.ts
|
|
242
242
|
function is_plain_object(obj) {
|
|
243
243
|
return typeof obj === "object" && !Array.isArray(obj);
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
-
// ../graphql-orm
|
|
246
|
+
// ../graphql-orm/src/filters/filters.ts
|
|
247
247
|
function apply_filters(query, { filters, modifiers, context }) {
|
|
248
248
|
if (!filters) {
|
|
249
249
|
return query;
|
|
@@ -270,7 +270,7 @@ function apply_filters(query, { filters, modifiers, context }) {
|
|
|
270
270
|
return query;
|
|
271
271
|
}
|
|
272
272
|
|
|
273
|
-
// ../graphql-orm
|
|
273
|
+
// ../graphql-orm/src/resolvers/table.ts
|
|
274
274
|
var TableResolver = class {
|
|
275
275
|
constructor(orm2, table, options = {}) {
|
|
276
276
|
this.orm = orm2;
|
|
@@ -364,6 +364,8 @@ var TableResolver = class {
|
|
|
364
364
|
// src/orm/orm.ts
|
|
365
365
|
var import_orchid_core = require("orchid-core");
|
|
366
366
|
var orm = {
|
|
367
|
+
Table: void 0,
|
|
368
|
+
Query: void 0,
|
|
367
369
|
// Reflection
|
|
368
370
|
get_table_table(table) {
|
|
369
371
|
return table.table;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../graphql-orm-resolver/src/paginators/cursor.ts","../../graphql-orm-resolver/src/utils/run-after.ts","../../graphql-orm-resolver/src/resolvers/field.ts","../../graphql-orm-resolver/src/resolvers/graph.ts","../../graphql-orm-resolver/src/resolvers/page.ts","../../graphql-orm-resolver/src/resolvers/relation.ts","../../graphql-orm-resolver/src/utils/is-plain-object.ts","../../graphql-orm-resolver/src/filters/filters.ts","../../graphql-orm-resolver/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-resolver\"\nexport {\n\tdefineFieldResolver,\n\tdefineFieldResolver as field,\n} from \"graphql-orm-resolver\"\nexport {\n\tdefinePageResolver,\n\tdefinePageResolver as page,\n} from \"graphql-orm-resolver\"\nexport {\n\tdefineRelationResolver,\n\tdefineRelationResolver as relation,\n} from \"graphql-orm-resolver\"\n","import { 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 implements Paginator {\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: unknown, context: PaginateContext) {\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(\n\torm: OrmAdapter<any, any>,\n\tquery: unknown,\n\ttransform: (instance: any) => any\n) {\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 { run_after_query } from \"../utils/run-after\"\nimport { TableResolveContext } from \"./table\"\n\nexport interface FieldResolverOptions<Query = unknown> {\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<Query>\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<Query>\n\t): any\n}\n\nexport type FieldResolveModifier<Query = unknown> = (\n\tquery: Query,\n\tcontext: FieldResolveContext<Query>\n) => Query\n\nexport interface FieldResolveContext<Query = unknown>\n\textends TableResolveContext<Query> {\n\t/** GraphQL field */\n\tfield: string\n}\n\n// That is a coincidence for now.\nexport type FieldResolver<Query = unknown> = FieldResolveModifier<Query>\n\nexport function defineFieldResolver<Query = unknown>(\n\toptions: FieldResolverOptions<Query> = {}\n): FieldResolver<Query> {\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<Query = unknown> = Pick<\n\tTableResolverOptions<Query>,\n\t\"allowAllFields\" | \"allowAllFilters\"\n>\n\nexport interface GraphResolveOptions {\n\tinfo: GraphQLResolveInfo\n\tcontext: any\n\tfilters?: FiltersDef\n}\n\nexport interface GraphResolveContext {\n\ttree: ResolveTree\n\tfilters?: FiltersDef\n\tcontext: any\n}\n\nexport class GraphResolver<Query = unknown> {\n\tconstructor(\n\t\treadonly orm: OrmAdapter<any, Query>,\n\t\treadonly type_resolvers: Record<string, TableResolver<Query>>,\n\t\treadonly options: GraphResolverOptions<Query> = {}\n\t) {}\n\n\tresolve(\n\t\tquery: Query,\n\t\t{ info, context, filters }: GraphResolveOptions\n\t): 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: Query,\n\t\tpaginator: Paginator,\n\t\t{ info, context, filters }: GraphResolveOptions\n\t): 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(query: Query, context: GraphResolveContext): 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}) as Query\n\t}\n\n\t_resolve_page(\n\t\tquery: Query,\n\t\tpaginator: Paginator,\n\t\tcontext: GraphResolveContext\n\t): 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}) as Query\n\t}\n}\n","import { Paginator } from \"../paginators/base\"\nimport { FieldResolver } from \"./field\"\nimport { RelationResolverOptions } from \"./relation\"\n\nexport function definePageResolver<Query = unknown>(\n\tpaginator: Paginator,\n\toptions: RelationResolverOptions<Query> = {}\n): FieldResolver<Query> {\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 { FieldResolver, FieldResolverOptions } from \"./field\"\nimport { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Query = unknown>\n\textends Omit<FieldResolverOptions<Query>, \"modify\"> {\n\tfilters?: FiltersDef\n\tmodify?: TableResolveModifier<Query>\n}\n\nexport function defineRelationResolver<Query = unknown>(\n\toptions: RelationResolverOptions<Query> = {}\n): FieldResolver<Query> {\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 { 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<Query = unknown> {\n\tfilters: FiltersDef\n\tmodifiers?: Record<string, ApplyFiltersModifier<Query>>\n\tcontext: TableResolveContext<Query>\n}\n\nexport type ApplyFiltersModifier<Query = unknown> = (\n\tquery: Query,\n\tvalue: any,\n\tcontext: TableResolveContext<Query>\n) => Query\n\nexport function apply_filters<Query = unknown>(\n\tquery: Query,\n\t{ filters, modifiers, context }: ApplyFiltersOptions<Query>\n): 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<Query = unknown> {\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<Query>>\n\tmodifiers?: Record<string, ApplyFiltersModifier<Query>>\n\tmodify?: TableResolveModifier<Query>\n\ttransform?(instance: any, context: any): void | PromiseLike<void>\n}\n\nexport type SimpleFieldResolver<Query> = true | string | FieldResolver<Query>\n\nexport type TableResolveModifier<Query = unknown> = (\n\tquery: Query,\n\tcontext: TableResolveContext<Query>\n) => Query\n\nexport interface TableResolveContext<Query = unknown>\n\textends GraphResolveContext {\n\tgraph: GraphResolver<Query>\n\t/** GraphQL type */\n\ttype: string\n}\n\nexport class TableResolver<Query = unknown> {\n\t// Introspection results\n\treadonly relations: Set<string>\n\treadonly virtual_fields: Set<string>\n\treadonly modifiers?: Record<string, ApplyFiltersModifier<Query>>\n\n\treadonly table_field_resolvers?: Record<string, FieldResolver<Query>>\n\n\tconstructor(\n\t\treadonly orm: OrmAdapter<any, any>,\n\t\treadonly table: unknown,\n\t\treadonly options: TableResolverOptions<Query> = {}\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<Query>>\n\t\t\t>((resolvers, field) => {\n\t\t\t\tconst r0 = fields[field]\n\t\t\t\tconst r: FieldResolver<Query> | 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: Query, context: TableResolveContext<Query>) {\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<Query> | 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<Query>(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<Query> {\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-resolver\"\nimport { overrideParserInQuery } from \"orchid-core\"\nimport { DbTable } from \"orchid-orm\"\nimport { Query } from \"pqb\"\n\nexport const orm: OrmAdapter<DbTable<any>, Query> = {\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 {\n\tGraphResolver,\n\tGraphResolverOptions,\n\tTableResolver,\n} from \"graphql-orm-resolver\"\nimport { Query } from \"pqb\"\n\nimport { orm } from \"../orm/orm\"\n\nexport function createGraphResolver(\n\ttypes: Record<string, TableResolver<Query>>,\n\toptions?: GraphResolverOptions<Query>\n) {\n\treturn new GraphResolver<Query>(orm, types, options)\n}\n","import { TableResolver, TableResolverOptions } from \"graphql-orm-resolver\"\nimport { DbTable, TableClass } from \"orchid-orm\"\nimport { Query } from \"pqb\"\n\nimport { orm } from \"../orm/orm\"\n\nexport function defineTableResolver<T extends TableClass>(\n\ttable: DbTable<T>,\n\toptions: TableResolverOptions<Query> = {}\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\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 type { 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"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,103 +1,105 @@
|
|
|
1
1
|
import { GraphQLResolveInfo } from 'graphql';
|
|
2
2
|
import { ResolveTree } from 'graphql-parse-resolve-info';
|
|
3
|
+
import { DbTable } from 'orchid-orm';
|
|
3
4
|
import { Query } from 'pqb';
|
|
4
|
-
import { TableClass, DbTable } from 'orchid-orm';
|
|
5
5
|
|
|
6
|
-
interface FieldResolverOptions<
|
|
6
|
+
interface FieldResolverOptions<Orm extends OrmAdapter, Context> {
|
|
7
7
|
/** Table field (if different from GraphQL field) */
|
|
8
8
|
tableField?: string;
|
|
9
9
|
/** Custom query modifier (if different than simply selecting a field). */
|
|
10
|
-
modify?: FieldResolveModifier<
|
|
10
|
+
modify?: FieldResolveModifier<Orm, Context>;
|
|
11
11
|
/** Post-process selected value. Return a new value or a promise. */
|
|
12
|
-
transform?(value: any, instance: any, context: FieldResolveContext<
|
|
12
|
+
transform?(value: any, instance: any, context: FieldResolveContext<Orm, Context>): any;
|
|
13
13
|
}
|
|
14
|
-
type FieldResolveModifier<
|
|
15
|
-
interface FieldResolveContext<
|
|
14
|
+
type FieldResolveModifier<Orm extends OrmAdapter, Context> = (query: Orm["Query"], context: FieldResolveContext<Orm, Context>) => Orm["Query"];
|
|
15
|
+
interface FieldResolveContext<Orm extends OrmAdapter, Context> extends TableResolveContext<Orm, Context> {
|
|
16
16
|
/** GraphQL field */
|
|
17
17
|
field: string;
|
|
18
18
|
}
|
|
19
|
-
type FieldResolver<
|
|
20
|
-
declare function defineFieldResolver<
|
|
19
|
+
type FieldResolver<Orm extends OrmAdapter, Context> = FieldResolveModifier<Orm, Context>;
|
|
20
|
+
declare function defineFieldResolver<Orm extends OrmAdapter, Context>(options?: FieldResolverOptions<Orm, Context>): FieldResolver<Orm, Context>;
|
|
21
21
|
|
|
22
|
-
interface TableResolverOptions<
|
|
22
|
+
interface TableResolverOptions<Orm extends OrmAdapter, Context> {
|
|
23
23
|
/** allow to resolve all table fields without explicitly listing them */
|
|
24
24
|
allowAllFields?: boolean;
|
|
25
25
|
/** allow to filter all table fields without explicitly listing them */
|
|
26
26
|
allowAllFilters?: boolean;
|
|
27
|
-
fields?: Record<string, SimpleFieldResolver<
|
|
28
|
-
modifiers?: Record<string, ApplyFiltersModifier<
|
|
29
|
-
modify?: TableResolveModifier<
|
|
27
|
+
fields?: Record<string, SimpleFieldResolver<Orm, Context>>;
|
|
28
|
+
modifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>;
|
|
29
|
+
modify?: TableResolveModifier<Orm, Context>;
|
|
30
30
|
transform?(instance: any, context: any): void | PromiseLike<void>;
|
|
31
31
|
}
|
|
32
|
-
type SimpleFieldResolver<
|
|
33
|
-
type TableResolveModifier<
|
|
34
|
-
interface TableResolveContext<
|
|
35
|
-
graph: GraphResolver<
|
|
32
|
+
type SimpleFieldResolver<Orm extends OrmAdapter, Context> = true | string | FieldResolver<Orm, Context>;
|
|
33
|
+
type TableResolveModifier<Orm extends OrmAdapter, Context> = (query: Orm["Query"], context: TableResolveContext<Orm, Context>) => Orm["Query"];
|
|
34
|
+
interface TableResolveContext<Orm extends OrmAdapter, Context> extends GraphResolveContext<Context> {
|
|
35
|
+
graph: GraphResolver<Orm, Context>;
|
|
36
36
|
/** GraphQL type */
|
|
37
37
|
type: string;
|
|
38
38
|
}
|
|
39
|
-
declare class TableResolver<
|
|
40
|
-
readonly orm:
|
|
41
|
-
readonly table:
|
|
42
|
-
readonly options: TableResolverOptions<
|
|
39
|
+
declare class TableResolver<Orm extends OrmAdapter, Context> {
|
|
40
|
+
readonly orm: Orm;
|
|
41
|
+
readonly table: Orm["Table"];
|
|
42
|
+
readonly options: TableResolverOptions<Orm, Context>;
|
|
43
43
|
readonly relations: Set<string>;
|
|
44
44
|
readonly virtual_fields: Set<string>;
|
|
45
|
-
readonly modifiers?: Record<string, ApplyFiltersModifier<
|
|
46
|
-
readonly table_field_resolvers?: Record<string, FieldResolver<
|
|
47
|
-
constructor(orm:
|
|
45
|
+
readonly modifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>;
|
|
46
|
+
readonly table_field_resolvers?: Record<string, FieldResolver<Orm, Context>>;
|
|
47
|
+
constructor(orm: Orm, table: Orm["Table"], options?: TableResolverOptions<Orm, Context>);
|
|
48
48
|
/** Modify query to select fields/relations and filter the result set. */
|
|
49
|
-
resolve(query: Query, context: TableResolveContext<
|
|
49
|
+
resolve(query: Orm["Query"], context: TableResolveContext<Orm, Context>): Orm["Query"];
|
|
50
50
|
/**
|
|
51
51
|
* Create field resolver which will modify query to resolve GraphQL field.
|
|
52
52
|
*/
|
|
53
|
-
_get_default_field_resolver(field: string, tableField?: string): FieldResolver<
|
|
53
|
+
_get_default_field_resolver(field: string, tableField?: string): FieldResolver<Orm, Context>;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
type FiltersDef = boolean;
|
|
57
|
-
type ApplyFiltersModifier<
|
|
57
|
+
type ApplyFiltersModifier<Orm extends OrmAdapter, Context> = (query: Orm["Query"], value: any, context: TableResolveContext<Orm, Context>) => Orm["Query"];
|
|
58
58
|
|
|
59
|
-
type GraphResolverOptions<
|
|
59
|
+
type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<TableResolverOptions<Orm, Context>, "allowAllFields" | "allowAllFilters">;
|
|
60
60
|
interface GraphResolveOptions {
|
|
61
61
|
info: GraphQLResolveInfo;
|
|
62
62
|
context: any;
|
|
63
63
|
filters?: FiltersDef;
|
|
64
64
|
}
|
|
65
|
-
interface GraphResolveContext {
|
|
65
|
+
interface GraphResolveContext<Context> {
|
|
66
66
|
tree: ResolveTree;
|
|
67
67
|
filters?: FiltersDef;
|
|
68
|
-
context:
|
|
68
|
+
context: Context;
|
|
69
69
|
}
|
|
70
|
-
declare class GraphResolver<
|
|
71
|
-
readonly orm:
|
|
72
|
-
readonly type_resolvers: Record<string, TableResolver<
|
|
73
|
-
readonly options: GraphResolverOptions<
|
|
74
|
-
constructor(orm:
|
|
75
|
-
resolve(query: Query, { info, context, filters }: GraphResolveOptions): Query;
|
|
76
|
-
resolvePage(query: Query, paginator: Paginator, { info, context, filters }: GraphResolveOptions): Query;
|
|
70
|
+
declare class GraphResolver<Orm extends OrmAdapter, Context> {
|
|
71
|
+
readonly orm: Orm;
|
|
72
|
+
readonly type_resolvers: Record<string, TableResolver<Orm, Context>>;
|
|
73
|
+
readonly options: GraphResolverOptions<Orm, Context>;
|
|
74
|
+
constructor(orm: Orm, type_resolvers: Record<string, TableResolver<Orm, Context>>, options?: GraphResolverOptions<Orm, Context>);
|
|
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["Query"];
|
|
77
77
|
_get_resolve_tree(info: GraphQLResolveInfo): ResolveTree;
|
|
78
|
-
_resolve_type(query: Query, context: GraphResolveContext): Query;
|
|
79
|
-
_resolve_page(query: Query, paginator: Paginator, context: GraphResolveContext): Query;
|
|
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["Query"];
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
interface Paginator {
|
|
82
|
+
interface Paginator<Orm extends OrmAdapter, Context> {
|
|
83
83
|
/** GraphQL path, for example: `["nodes"]` */
|
|
84
84
|
readonly path: string[];
|
|
85
|
-
paginate(query:
|
|
85
|
+
paginate(query: Orm["Query"], context: PaginateContext<Orm, Context>): Orm["Query"];
|
|
86
86
|
}
|
|
87
|
-
interface PaginateContext extends GraphResolveContext {
|
|
88
|
-
graph: GraphResolver
|
|
87
|
+
interface PaginateContext<Orm extends OrmAdapter, Context> extends GraphResolveContext<Context> {
|
|
88
|
+
graph: GraphResolver<Orm, Context>;
|
|
89
89
|
}
|
|
90
90
|
type GetPageFn = (nodes: any[]) => any;
|
|
91
91
|
|
|
92
|
-
type OrmModifier<
|
|
93
|
-
interface OrmAdapter<Table =
|
|
92
|
+
type OrmModifier<Orm extends OrmAdapter> = (query: Orm["Query"], ...args: any[]) => Orm["Query"];
|
|
93
|
+
interface OrmAdapter<Table = any, Query = any> {
|
|
94
|
+
Table: Table;
|
|
95
|
+
Query: Query;
|
|
94
96
|
/** ORM table -> db table */
|
|
95
97
|
get_table_table(table: Table): string;
|
|
96
98
|
/** ORM table -> relation names */
|
|
97
99
|
get_table_relations(table: Table): string[];
|
|
98
100
|
/** ORM table -> virtual fields */
|
|
99
101
|
get_table_virtual_fields(table: Table): string[];
|
|
100
|
-
get_table_modifiers(table: Table): Record<string, OrmModifier<
|
|
102
|
+
get_table_modifiers(table: Table): Record<string, OrmModifier<this>> | undefined;
|
|
101
103
|
/** ORM query -> db table */
|
|
102
104
|
get_query_table(query: Query): string;
|
|
103
105
|
select_field(query: Query, opts: {
|
|
@@ -123,12 +125,12 @@ interface OrmAdapter<Table = unknown, Query = unknown> {
|
|
|
123
125
|
prevent_select_all(query: Query): Query;
|
|
124
126
|
}
|
|
125
127
|
|
|
126
|
-
declare function defineCursorPaginator(options?: Partial<CursorPaginatorOptions>): CursorPaginator
|
|
128
|
+
declare function defineCursorPaginator(options?: Partial<CursorPaginatorOptions>): CursorPaginator<OrmAdapter<any, any>, unknown>;
|
|
127
129
|
interface CursorPaginatorOptions {
|
|
128
130
|
fields: string[];
|
|
129
131
|
take: number;
|
|
130
132
|
}
|
|
131
|
-
declare class CursorPaginator implements Paginator {
|
|
133
|
+
declare class CursorPaginator<Orm extends OrmAdapter, Context> implements Paginator<Orm, Context> {
|
|
132
134
|
readonly path: string[];
|
|
133
135
|
readonly options: CursorPaginatorOptions;
|
|
134
136
|
readonly fields: Array<{
|
|
@@ -136,7 +138,7 @@ declare class CursorPaginator implements Paginator {
|
|
|
136
138
|
desc: boolean;
|
|
137
139
|
}>;
|
|
138
140
|
constructor(options?: Partial<CursorPaginatorOptions>);
|
|
139
|
-
paginate(query:
|
|
141
|
+
paginate(query: Orm["Query"], context: PaginateContext<Orm, Context>): Orm["Query"];
|
|
140
142
|
_create_cursor(instance: any): string;
|
|
141
143
|
_parse_cursor(cursor: string): {
|
|
142
144
|
expression: string;
|
|
@@ -144,16 +146,18 @@ declare class CursorPaginator implements Paginator {
|
|
|
144
146
|
};
|
|
145
147
|
}
|
|
146
148
|
|
|
147
|
-
interface RelationResolverOptions<
|
|
149
|
+
interface RelationResolverOptions<Orm extends OrmAdapter, Context> extends Omit<FieldResolverOptions<Orm, Context>, "modify"> {
|
|
148
150
|
filters?: FiltersDef;
|
|
149
|
-
modify?: TableResolveModifier<
|
|
151
|
+
modify?: TableResolveModifier<Orm, Context>;
|
|
150
152
|
}
|
|
151
|
-
declare function defineRelationResolver<
|
|
153
|
+
declare function defineRelationResolver<Orm extends OrmAdapter, Context>(options?: RelationResolverOptions<Orm, Context>): FieldResolver<Orm, Context>;
|
|
154
|
+
|
|
155
|
+
declare function definePageResolver<Orm extends OrmAdapter, Context>(paginator: Paginator<Orm, Context>, options?: RelationResolverOptions<Orm, Context>): FieldResolver<Orm, Context>;
|
|
152
156
|
|
|
153
|
-
|
|
157
|
+
type OrchidOrm = OrmAdapter<DbTable<any>, Query>;
|
|
154
158
|
|
|
155
|
-
declare function createGraphResolver(types: Record<string, TableResolver<
|
|
159
|
+
declare function createGraphResolver<Context = unknown>(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>): GraphResolver<OrchidOrm, Context>;
|
|
156
160
|
|
|
157
|
-
declare function defineTableResolver<
|
|
161
|
+
declare function defineTableResolver<Context = unknown>(table: DbTable<any>, options?: TableResolverOptions<OrchidOrm, Context>): TableResolver<OrchidOrm, Context>;
|
|
158
162
|
|
|
159
163
|
export { createGraphResolver, defineCursorPaginator as cursor, defineCursorPaginator, defineFieldResolver, definePageResolver, defineRelationResolver, defineTableResolver, defineFieldResolver as field, createGraphResolver as graph, definePageResolver as page, defineRelationResolver as relation, defineTableResolver as table };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../graphql-orm
|
|
1
|
+
// ../graphql-orm/src/paginators/cursor.ts
|
|
2
2
|
function defineCursorPaginator(options = {}) {
|
|
3
3
|
return new CursorPaginator(options);
|
|
4
4
|
}
|
|
@@ -78,7 +78,7 @@ var CursorPaginator = class {
|
|
|
78
78
|
}
|
|
79
79
|
};
|
|
80
80
|
|
|
81
|
-
// ../graphql-orm
|
|
81
|
+
// ../graphql-orm/src/utils/run-after.ts
|
|
82
82
|
function run_after_query(orm2, query, transform) {
|
|
83
83
|
return orm2.run_after_query(query, async (result) => {
|
|
84
84
|
if (Array.isArray(result)) {
|
|
@@ -92,7 +92,7 @@ function run_after_query(orm2, query, transform) {
|
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
// ../graphql-orm
|
|
95
|
+
// ../graphql-orm/src/resolvers/field.ts
|
|
96
96
|
function defineFieldResolver(options = {}) {
|
|
97
97
|
const { tableField, modify, transform } = options;
|
|
98
98
|
return function resolve(query, context) {
|
|
@@ -115,7 +115,7 @@ function defineFieldResolver(options = {}) {
|
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
// ../graphql-orm
|
|
118
|
+
// ../graphql-orm/src/resolvers/graph.ts
|
|
119
119
|
import { parseResolveInfo } from "graphql-parse-resolve-info";
|
|
120
120
|
var GraphResolver = class {
|
|
121
121
|
constructor(orm2, type_resolvers, options = {}) {
|
|
@@ -162,7 +162,7 @@ var GraphResolver = class {
|
|
|
162
162
|
}
|
|
163
163
|
};
|
|
164
164
|
|
|
165
|
-
// ../graphql-orm
|
|
165
|
+
// ../graphql-orm/src/resolvers/page.ts
|
|
166
166
|
function definePageResolver(paginator, options = {}) {
|
|
167
167
|
const { tableField, modify } = options;
|
|
168
168
|
return function resolve(query, context) {
|
|
@@ -185,7 +185,7 @@ function definePageResolver(paginator, options = {}) {
|
|
|
185
185
|
};
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
-
// ../graphql-orm
|
|
188
|
+
// ../graphql-orm/src/resolvers/relation.ts
|
|
189
189
|
function defineRelationResolver(options = {}) {
|
|
190
190
|
const { tableField, filters, modify } = options;
|
|
191
191
|
return function resolve(query, context) {
|
|
@@ -201,12 +201,12 @@ function defineRelationResolver(options = {}) {
|
|
|
201
201
|
};
|
|
202
202
|
}
|
|
203
203
|
|
|
204
|
-
// ../graphql-orm
|
|
204
|
+
// ../graphql-orm/src/utils/is-plain-object.ts
|
|
205
205
|
function is_plain_object(obj) {
|
|
206
206
|
return typeof obj === "object" && !Array.isArray(obj);
|
|
207
207
|
}
|
|
208
208
|
|
|
209
|
-
// ../graphql-orm
|
|
209
|
+
// ../graphql-orm/src/filters/filters.ts
|
|
210
210
|
function apply_filters(query, { filters, modifiers, context }) {
|
|
211
211
|
if (!filters) {
|
|
212
212
|
return query;
|
|
@@ -233,7 +233,7 @@ function apply_filters(query, { filters, modifiers, context }) {
|
|
|
233
233
|
return query;
|
|
234
234
|
}
|
|
235
235
|
|
|
236
|
-
// ../graphql-orm
|
|
236
|
+
// ../graphql-orm/src/resolvers/table.ts
|
|
237
237
|
var TableResolver = class {
|
|
238
238
|
constructor(orm2, table, options = {}) {
|
|
239
239
|
this.orm = orm2;
|
|
@@ -327,6 +327,8 @@ var TableResolver = class {
|
|
|
327
327
|
// src/orm/orm.ts
|
|
328
328
|
import { overrideParserInQuery } from "orchid-core";
|
|
329
329
|
var orm = {
|
|
330
|
+
Table: void 0,
|
|
331
|
+
Query: void 0,
|
|
330
332
|
// Reflection
|
|
331
333
|
get_table_table(table) {
|
|
332
334
|
return table.table;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../graphql-orm-resolver/src/paginators/cursor.ts","../../graphql-orm-resolver/src/utils/run-after.ts","../../graphql-orm-resolver/src/resolvers/field.ts","../../graphql-orm-resolver/src/resolvers/graph.ts","../../graphql-orm-resolver/src/resolvers/page.ts","../../graphql-orm-resolver/src/resolvers/relation.ts","../../graphql-orm-resolver/src/utils/is-plain-object.ts","../../graphql-orm-resolver/src/filters/filters.ts","../../graphql-orm-resolver/src/resolvers/table.ts","../src/orm/orm.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["import { 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 implements Paginator {\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: unknown, context: PaginateContext) {\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(\n\torm: OrmAdapter<any, any>,\n\tquery: unknown,\n\ttransform: (instance: any) => any\n) {\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 { run_after_query } from \"../utils/run-after\"\nimport { TableResolveContext } from \"./table\"\n\nexport interface FieldResolverOptions<Query = unknown> {\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<Query>\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<Query>\n\t): any\n}\n\nexport type FieldResolveModifier<Query = unknown> = (\n\tquery: Query,\n\tcontext: FieldResolveContext<Query>\n) => Query\n\nexport interface FieldResolveContext<Query = unknown>\n\textends TableResolveContext<Query> {\n\t/** GraphQL field */\n\tfield: string\n}\n\n// That is a coincidence for now.\nexport type FieldResolver<Query = unknown> = FieldResolveModifier<Query>\n\nexport function defineFieldResolver<Query = unknown>(\n\toptions: FieldResolverOptions<Query> = {}\n): FieldResolver<Query> {\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<Query = unknown> = Pick<\n\tTableResolverOptions<Query>,\n\t\"allowAllFields\" | \"allowAllFilters\"\n>\n\nexport interface GraphResolveOptions {\n\tinfo: GraphQLResolveInfo\n\tcontext: any\n\tfilters?: FiltersDef\n}\n\nexport interface GraphResolveContext {\n\ttree: ResolveTree\n\tfilters?: FiltersDef\n\tcontext: any\n}\n\nexport class GraphResolver<Query = unknown> {\n\tconstructor(\n\t\treadonly orm: OrmAdapter<any, Query>,\n\t\treadonly type_resolvers: Record<string, TableResolver<Query>>,\n\t\treadonly options: GraphResolverOptions<Query> = {}\n\t) {}\n\n\tresolve(\n\t\tquery: Query,\n\t\t{ info, context, filters }: GraphResolveOptions\n\t): 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: Query,\n\t\tpaginator: Paginator,\n\t\t{ info, context, filters }: GraphResolveOptions\n\t): 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(query: Query, context: GraphResolveContext): 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}) as Query\n\t}\n\n\t_resolve_page(\n\t\tquery: Query,\n\t\tpaginator: Paginator,\n\t\tcontext: GraphResolveContext\n\t): 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}) as Query\n\t}\n}\n","import { Paginator } from \"../paginators/base\"\nimport { FieldResolver } from \"./field\"\nimport { RelationResolverOptions } from \"./relation\"\n\nexport function definePageResolver<Query = unknown>(\n\tpaginator: Paginator,\n\toptions: RelationResolverOptions<Query> = {}\n): FieldResolver<Query> {\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 { FieldResolver, FieldResolverOptions } from \"./field\"\nimport { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Query = unknown>\n\textends Omit<FieldResolverOptions<Query>, \"modify\"> {\n\tfilters?: FiltersDef\n\tmodify?: TableResolveModifier<Query>\n}\n\nexport function defineRelationResolver<Query = unknown>(\n\toptions: RelationResolverOptions<Query> = {}\n): FieldResolver<Query> {\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 { 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<Query = unknown> {\n\tfilters: FiltersDef\n\tmodifiers?: Record<string, ApplyFiltersModifier<Query>>\n\tcontext: TableResolveContext<Query>\n}\n\nexport type ApplyFiltersModifier<Query = unknown> = (\n\tquery: Query,\n\tvalue: any,\n\tcontext: TableResolveContext<Query>\n) => Query\n\nexport function apply_filters<Query = unknown>(\n\tquery: Query,\n\t{ filters, modifiers, context }: ApplyFiltersOptions<Query>\n): 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<Query = unknown> {\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<Query>>\n\tmodifiers?: Record<string, ApplyFiltersModifier<Query>>\n\tmodify?: TableResolveModifier<Query>\n\ttransform?(instance: any, context: any): void | PromiseLike<void>\n}\n\nexport type SimpleFieldResolver<Query> = true | string | FieldResolver<Query>\n\nexport type TableResolveModifier<Query = unknown> = (\n\tquery: Query,\n\tcontext: TableResolveContext<Query>\n) => Query\n\nexport interface TableResolveContext<Query = unknown>\n\textends GraphResolveContext {\n\tgraph: GraphResolver<Query>\n\t/** GraphQL type */\n\ttype: string\n}\n\nexport class TableResolver<Query = unknown> {\n\t// Introspection results\n\treadonly relations: Set<string>\n\treadonly virtual_fields: Set<string>\n\treadonly modifiers?: Record<string, ApplyFiltersModifier<Query>>\n\n\treadonly table_field_resolvers?: Record<string, FieldResolver<Query>>\n\n\tconstructor(\n\t\treadonly orm: OrmAdapter<any, any>,\n\t\treadonly table: unknown,\n\t\treadonly options: TableResolverOptions<Query> = {}\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<Query>>\n\t\t\t>((resolvers, field) => {\n\t\t\t\tconst r0 = fields[field]\n\t\t\t\tconst r: FieldResolver<Query> | 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: Query, context: TableResolveContext<Query>) {\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<Query> | 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<Query>(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<Query> {\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-resolver\"\nimport { overrideParserInQuery } from \"orchid-core\"\nimport { DbTable } from \"orchid-orm\"\nimport { Query } from \"pqb\"\n\nexport const orm: OrmAdapter<DbTable<any>, Query> = {\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 {\n\tGraphResolver,\n\tGraphResolverOptions,\n\tTableResolver,\n} from \"graphql-orm-resolver\"\nimport { Query } from \"pqb\"\n\nimport { orm } from \"../orm/orm\"\n\nexport function createGraphResolver(\n\ttypes: Record<string, TableResolver<Query>>,\n\toptions?: GraphResolverOptions<Query>\n) {\n\treturn new GraphResolver<Query>(orm, types, options)\n}\n","import { TableResolver, TableResolverOptions } from \"graphql-orm-resolver\"\nimport { DbTable, TableClass } from \"orchid-orm\"\nimport { Query } from \"pqb\"\n\nimport { orm } from \"../orm/orm\"\n\nexport function defineTableResolver<T extends TableClass>(\n\ttable: DbTable<T>,\n\toptions: TableResolverOptions<Query> = {}\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":["../../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 type { 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"]}
|
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.1.1",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/IlyaSemenov/orchid-graphql"
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"graphql": "^16",
|
|
28
28
|
"orchid-core": "^0.4.11",
|
|
29
29
|
"orchid-orm": "^1.9.36",
|
|
30
|
-
"pqb": "
|
|
30
|
+
"pqb": ">=0.11.29 <0.13"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@apollo/server": "~4.7.1",
|
|
@@ -36,17 +36,17 @@
|
|
|
36
36
|
"graphql": "~16.6.0",
|
|
37
37
|
"graphql-request": "~6.0.0",
|
|
38
38
|
"graphql-tag": "^2.12.6",
|
|
39
|
-
"orchid-core": "~0.4.
|
|
40
|
-
"orchid-orm": "~1.
|
|
39
|
+
"orchid-core": "~0.4.14",
|
|
40
|
+
"orchid-orm": "~1.10.2",
|
|
41
41
|
"pg": "~8.11.0",
|
|
42
|
-
"pqb": "~0.
|
|
42
|
+
"pqb": "~0.12.2",
|
|
43
43
|
"tsup": "~6.7.0",
|
|
44
44
|
"typescript": "~5.0.4",
|
|
45
45
|
"vite": "~4.3.8",
|
|
46
46
|
"vite-node": "~0.31.1",
|
|
47
47
|
"vite-tsconfig-paths": "~4.2.0",
|
|
48
48
|
"vitest": "~0.31.1",
|
|
49
|
-
"graphql-orm
|
|
49
|
+
"graphql-orm": "1.1.0"
|
|
50
50
|
},
|
|
51
51
|
"scripts": {
|
|
52
52
|
"dev": "vite-node --watch playground/readme.sample.ts",
|
package/src/index.ts
CHANGED
|
@@ -9,16 +9,10 @@ export {
|
|
|
9
9
|
export {
|
|
10
10
|
defineCursorPaginator as cursor,
|
|
11
11
|
defineCursorPaginator,
|
|
12
|
-
} from "graphql-orm
|
|
13
|
-
export {
|
|
14
|
-
|
|
15
|
-
defineFieldResolver as field,
|
|
16
|
-
} from "graphql-orm-resolver"
|
|
17
|
-
export {
|
|
18
|
-
definePageResolver,
|
|
19
|
-
definePageResolver as page,
|
|
20
|
-
} from "graphql-orm-resolver"
|
|
12
|
+
} from "graphql-orm"
|
|
13
|
+
export { defineFieldResolver, defineFieldResolver as field } from "graphql-orm"
|
|
14
|
+
export { definePageResolver, definePageResolver as page } from "graphql-orm"
|
|
21
15
|
export {
|
|
22
16
|
defineRelationResolver,
|
|
23
17
|
defineRelationResolver as relation,
|
|
24
|
-
} from "graphql-orm
|
|
18
|
+
} from "graphql-orm"
|
package/src/orm/orm.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import { OrmAdapter } from "graphql-orm
|
|
1
|
+
import { OrmAdapter } from "graphql-orm"
|
|
2
2
|
import { overrideParserInQuery } from "orchid-core"
|
|
3
3
|
import { DbTable } from "orchid-orm"
|
|
4
|
-
import { Query } from "pqb"
|
|
4
|
+
import type { Query } from "pqb"
|
|
5
|
+
|
|
6
|
+
export type OrchidOrm = OrmAdapter<DbTable<any>, Query>
|
|
7
|
+
|
|
8
|
+
export const orm: OrchidOrm = {
|
|
9
|
+
Table: undefined as unknown as OrchidOrm["Table"],
|
|
10
|
+
Query: undefined as unknown as OrchidOrm["Query"],
|
|
5
11
|
|
|
6
|
-
export const orm: OrmAdapter<DbTable<any>, Query> = {
|
|
7
12
|
// Reflection
|
|
8
13
|
|
|
9
14
|
get_table_table(table) {
|
package/src/resolvers/graph.ts
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
GraphResolver,
|
|
3
|
-
GraphResolverOptions,
|
|
4
|
-
TableResolver,
|
|
5
|
-
} from "graphql-orm-resolver"
|
|
6
|
-
import { Query } from "pqb"
|
|
1
|
+
import { GraphResolver, GraphResolverOptions, TableResolver } from "graphql-orm"
|
|
7
2
|
|
|
8
|
-
import { orm } from "../orm/orm"
|
|
3
|
+
import { OrchidOrm, orm } from "../orm/orm"
|
|
9
4
|
|
|
10
|
-
export function createGraphResolver(
|
|
11
|
-
types: Record<string, TableResolver<
|
|
12
|
-
options?: GraphResolverOptions<
|
|
5
|
+
export function createGraphResolver<Context = unknown>(
|
|
6
|
+
types: Record<string, TableResolver<OrchidOrm, Context>>,
|
|
7
|
+
options?: GraphResolverOptions<OrchidOrm, Context>
|
|
13
8
|
) {
|
|
14
|
-
return new GraphResolver<
|
|
9
|
+
return new GraphResolver<OrchidOrm, Context>(orm, types, options)
|
|
15
10
|
}
|
package/src/resolvers/table.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import { TableResolver, TableResolverOptions } from "graphql-orm
|
|
2
|
-
import { DbTable
|
|
3
|
-
import { Query } from "pqb"
|
|
1
|
+
import { TableResolver, TableResolverOptions } from "graphql-orm"
|
|
2
|
+
import { DbTable } from "orchid-orm"
|
|
4
3
|
|
|
5
|
-
import { orm } from "../orm/orm"
|
|
4
|
+
import { OrchidOrm, orm } from "../orm/orm"
|
|
6
5
|
|
|
7
|
-
export function defineTableResolver<
|
|
8
|
-
table: DbTable<
|
|
9
|
-
options: TableResolverOptions<
|
|
6
|
+
export function defineTableResolver<Context = unknown>(
|
|
7
|
+
table: DbTable<any>,
|
|
8
|
+
options: TableResolverOptions<OrchidOrm, Context> = {}
|
|
10
9
|
) {
|
|
11
10
|
return new TableResolver(orm, table, options)
|
|
12
11
|
}
|