orchid-graphql 1.5.0 → 1.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.cjs +2 -288
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -17
- package/dist/index.d.ts +3 -17
- package/dist/index.js +1 -282
- package/dist/index.js.map +1 -1
- package/package.json +17 -16
- package/src/orm/orm.ts +1 -1
- package/src/resolvers/table.ts +4 -4
package/README.md
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
6
|
var __export = (target, all) => {
|
|
9
7
|
for (var name in all)
|
|
@@ -17,14 +15,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
15
|
}
|
|
18
16
|
return to;
|
|
19
17
|
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
19
|
|
|
30
20
|
// src/index.ts
|
|
@@ -170,284 +160,8 @@ function defineFieldResolver(options = {}) {
|
|
|
170
160
|
};
|
|
171
161
|
}
|
|
172
162
|
|
|
173
|
-
// ../graphql-orm/src/utils/graphql-parse-resolve-info.ts
|
|
174
|
-
var import_node_assert = __toESM(require("assert"), 1);
|
|
175
|
-
var import_graphql = require("graphql");
|
|
176
|
-
var import_graphql2 = require("graphql");
|
|
177
|
-
|
|
178
|
-
// ../graphql-orm/src/utils/graphql-parse-resolve-info-debug.ts
|
|
179
|
-
function debugFactory(name) {
|
|
180
|
-
function debug2() {
|
|
181
|
-
}
|
|
182
|
-
debug2.enabled = false;
|
|
183
|
-
return debug2;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// ../graphql-orm/src/utils/graphql-parse-resolve-info.ts
|
|
187
|
-
var debug = debugFactory("graphql-parse-resolve-info");
|
|
188
|
-
var DEBUG_ENABLED = debug.enabled;
|
|
189
|
-
function getArgVal(resolveInfo, argument) {
|
|
190
|
-
if (argument.kind === "Variable") {
|
|
191
|
-
return resolveInfo.variableValues[argument.name.value];
|
|
192
|
-
} else if (argument.kind === "BooleanValue") {
|
|
193
|
-
return argument.value;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
function argNameIsIf(arg) {
|
|
197
|
-
return arg && arg.name ? arg.name.value === "if" : false;
|
|
198
|
-
}
|
|
199
|
-
function skipField(resolveInfo, { directives = [] }) {
|
|
200
|
-
let skip = false;
|
|
201
|
-
directives.forEach((directive) => {
|
|
202
|
-
const directiveName = directive.name.value;
|
|
203
|
-
if (Array.isArray(directive.arguments)) {
|
|
204
|
-
const ifArgumentAst = directive.arguments.find(argNameIsIf);
|
|
205
|
-
if (ifArgumentAst) {
|
|
206
|
-
const argumentValueAst = ifArgumentAst.value;
|
|
207
|
-
if (directiveName === "skip") {
|
|
208
|
-
skip = skip || getArgVal(resolveInfo, argumentValueAst);
|
|
209
|
-
} else if (directiveName === "include") {
|
|
210
|
-
skip = skip || !getArgVal(resolveInfo, argumentValueAst);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
return skip;
|
|
216
|
-
}
|
|
217
|
-
function parseResolveInfo(resolveInfo, inOptions = {}) {
|
|
218
|
-
const fieldNodes = (
|
|
219
|
-
// @ts-ignore Property 'fieldASTs' does not exist on type 'GraphQLResolveInfo'.
|
|
220
|
-
resolveInfo.fieldNodes || resolveInfo.fieldASTs
|
|
221
|
-
);
|
|
222
|
-
const options = inOptions === true ? {} : inOptions;
|
|
223
|
-
const forceParse = inOptions === true || inOptions.forceParse;
|
|
224
|
-
const { parentType } = resolveInfo;
|
|
225
|
-
if (!fieldNodes) {
|
|
226
|
-
throw new Error("No fieldNodes provided!");
|
|
227
|
-
}
|
|
228
|
-
if (options.keepRoot == null) {
|
|
229
|
-
options.keepRoot = false;
|
|
230
|
-
}
|
|
231
|
-
if (options.deep == null) {
|
|
232
|
-
options.deep = true;
|
|
233
|
-
}
|
|
234
|
-
const tree = fieldTreeFromAST(
|
|
235
|
-
fieldNodes,
|
|
236
|
-
resolveInfo,
|
|
237
|
-
void 0,
|
|
238
|
-
options,
|
|
239
|
-
parentType
|
|
240
|
-
);
|
|
241
|
-
if (!options.keepRoot) {
|
|
242
|
-
const typeKey = firstKey(tree);
|
|
243
|
-
if (!typeKey) {
|
|
244
|
-
if (forceParse) {
|
|
245
|
-
throw new Error(
|
|
246
|
-
`GraphQL schema issue: simplified parseResolveInfo failed (tree had no keys); perhaps you need to use the keepRoot option?`
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
return null;
|
|
250
|
-
}
|
|
251
|
-
const fields = tree[typeKey];
|
|
252
|
-
const fieldKey = firstKey(fields);
|
|
253
|
-
if (!fieldKey) {
|
|
254
|
-
if (forceParse) {
|
|
255
|
-
throw new Error(
|
|
256
|
-
`GraphQL schema issue: simplified parseResolveInfo failed (could not get key from fields); perhaps you need to use the keepRoot option?`
|
|
257
|
-
);
|
|
258
|
-
}
|
|
259
|
-
return null;
|
|
260
|
-
}
|
|
261
|
-
return fields[fieldKey];
|
|
262
|
-
}
|
|
263
|
-
return tree;
|
|
264
|
-
}
|
|
265
|
-
function getFieldFromAST(ast, parentType) {
|
|
266
|
-
if (ast.kind === "Field") {
|
|
267
|
-
const fieldNode = ast;
|
|
268
|
-
const fieldName = fieldNode.name.value;
|
|
269
|
-
if (!(parentType instanceof import_graphql.GraphQLUnionType)) {
|
|
270
|
-
const type = parentType;
|
|
271
|
-
return type.getFields()[fieldName];
|
|
272
|
-
} else {
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
return void 0;
|
|
276
|
-
}
|
|
277
|
-
var iNum = 1;
|
|
278
|
-
function fieldTreeFromAST(inASTs, resolveInfo, initTree = {}, options = {}, parentType, depth = "") {
|
|
279
|
-
const instance = iNum++;
|
|
280
|
-
if (DEBUG_ENABLED)
|
|
281
|
-
debug(
|
|
282
|
-
"%s[%d] Entering fieldTreeFromAST with parent type '%s'",
|
|
283
|
-
depth,
|
|
284
|
-
instance,
|
|
285
|
-
parentType
|
|
286
|
-
);
|
|
287
|
-
const { variableValues } = resolveInfo;
|
|
288
|
-
const fragments = resolveInfo.fragments || {};
|
|
289
|
-
const asts = Array.isArray(inASTs) ? inASTs : [inASTs];
|
|
290
|
-
if (!initTree[parentType.name]) {
|
|
291
|
-
initTree[parentType.name] = {};
|
|
292
|
-
}
|
|
293
|
-
const outerDepth = depth;
|
|
294
|
-
return asts.reduce((tree, selectionVal, idx) => {
|
|
295
|
-
const depth2 = DEBUG_ENABLED ? `${outerDepth} ` : null;
|
|
296
|
-
if (DEBUG_ENABLED)
|
|
297
|
-
debug(
|
|
298
|
-
"%s[%d] Processing AST %d of %d; kind = %s",
|
|
299
|
-
depth2,
|
|
300
|
-
instance,
|
|
301
|
-
idx + 1,
|
|
302
|
-
asts.length,
|
|
303
|
-
selectionVal.kind
|
|
304
|
-
);
|
|
305
|
-
if (skipField(resolveInfo, selectionVal)) {
|
|
306
|
-
if (DEBUG_ENABLED)
|
|
307
|
-
debug("%s[%d] IGNORING due to directive", depth2, instance);
|
|
308
|
-
} else if (selectionVal.kind === "Field") {
|
|
309
|
-
const val = selectionVal;
|
|
310
|
-
const name = val.name.value;
|
|
311
|
-
const isReserved = name[0] === "_" && name[1] === "_" && name !== "__id";
|
|
312
|
-
if (isReserved) {
|
|
313
|
-
if (DEBUG_ENABLED)
|
|
314
|
-
debug(
|
|
315
|
-
"%s[%d] IGNORING because field '%s' is reserved",
|
|
316
|
-
depth2,
|
|
317
|
-
instance,
|
|
318
|
-
name
|
|
319
|
-
);
|
|
320
|
-
} else {
|
|
321
|
-
const alias = val.alias && val.alias.value ? val.alias.value : name;
|
|
322
|
-
if (DEBUG_ENABLED)
|
|
323
|
-
debug(
|
|
324
|
-
"%s[%d] Field '%s' (alias = '%s')",
|
|
325
|
-
depth2,
|
|
326
|
-
instance,
|
|
327
|
-
name,
|
|
328
|
-
alias
|
|
329
|
-
);
|
|
330
|
-
const field = getFieldFromAST(val, parentType);
|
|
331
|
-
if (field == null) {
|
|
332
|
-
return tree;
|
|
333
|
-
}
|
|
334
|
-
const fieldGqlTypeOrUndefined = (0, import_graphql.getNamedType)(field.type);
|
|
335
|
-
if (!fieldGqlTypeOrUndefined) {
|
|
336
|
-
return tree;
|
|
337
|
-
}
|
|
338
|
-
const fieldGqlType = fieldGqlTypeOrUndefined;
|
|
339
|
-
const args = (0, import_graphql2.getArgumentValues)(
|
|
340
|
-
field,
|
|
341
|
-
val,
|
|
342
|
-
variableValues
|
|
343
|
-
) || {};
|
|
344
|
-
if (parentType.name && !tree[parentType.name][alias]) {
|
|
345
|
-
const newTreeRoot = {
|
|
346
|
-
name,
|
|
347
|
-
alias,
|
|
348
|
-
args,
|
|
349
|
-
fieldsByTypeName: (0, import_graphql.isCompositeType)(fieldGqlType) ? {
|
|
350
|
-
[fieldGqlType.name]: {}
|
|
351
|
-
} : {}
|
|
352
|
-
};
|
|
353
|
-
tree[parentType.name][alias] = newTreeRoot;
|
|
354
|
-
}
|
|
355
|
-
const selectionSet = val.selectionSet;
|
|
356
|
-
if (selectionSet != null && options.deep && (0, import_graphql.isCompositeType)(fieldGqlType)) {
|
|
357
|
-
const newParentType = fieldGqlType;
|
|
358
|
-
if (DEBUG_ENABLED)
|
|
359
|
-
debug("%s[%d] Recursing into subfields", depth2, instance);
|
|
360
|
-
fieldTreeFromAST(
|
|
361
|
-
selectionSet.selections,
|
|
362
|
-
resolveInfo,
|
|
363
|
-
tree[parentType.name][alias].fieldsByTypeName,
|
|
364
|
-
options,
|
|
365
|
-
newParentType,
|
|
366
|
-
`${depth2} `
|
|
367
|
-
);
|
|
368
|
-
} else {
|
|
369
|
-
if (DEBUG_ENABLED)
|
|
370
|
-
debug("%s[%d] Exiting (no fields to add)", depth2, instance);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
} else if (selectionVal.kind === "FragmentSpread" && options.deep) {
|
|
374
|
-
const val = selectionVal;
|
|
375
|
-
const name = val.name && val.name.value;
|
|
376
|
-
if (DEBUG_ENABLED)
|
|
377
|
-
debug("%s[%d] Fragment spread '%s'", depth2, instance, name);
|
|
378
|
-
const fragment = fragments[name];
|
|
379
|
-
(0, import_node_assert.default)(fragment, 'unknown fragment "' + name + '"');
|
|
380
|
-
let fragmentType = parentType;
|
|
381
|
-
if (fragment.typeCondition) {
|
|
382
|
-
fragmentType = getType(resolveInfo, fragment.typeCondition);
|
|
383
|
-
}
|
|
384
|
-
if (fragmentType && (0, import_graphql.isCompositeType)(fragmentType)) {
|
|
385
|
-
const newParentType = fragmentType;
|
|
386
|
-
fieldTreeFromAST(
|
|
387
|
-
fragment.selectionSet.selections,
|
|
388
|
-
resolveInfo,
|
|
389
|
-
tree,
|
|
390
|
-
options,
|
|
391
|
-
newParentType,
|
|
392
|
-
`${depth2} `
|
|
393
|
-
);
|
|
394
|
-
}
|
|
395
|
-
} else if (selectionVal.kind === "InlineFragment" && options.deep) {
|
|
396
|
-
const val = selectionVal;
|
|
397
|
-
const fragment = val;
|
|
398
|
-
let fragmentType = parentType;
|
|
399
|
-
if (fragment.typeCondition) {
|
|
400
|
-
fragmentType = getType(resolveInfo, fragment.typeCondition);
|
|
401
|
-
}
|
|
402
|
-
if (DEBUG_ENABLED)
|
|
403
|
-
debug(
|
|
404
|
-
"%s[%d] Inline fragment (parent = '%s', type = '%s')",
|
|
405
|
-
depth2,
|
|
406
|
-
instance,
|
|
407
|
-
parentType,
|
|
408
|
-
fragmentType
|
|
409
|
-
);
|
|
410
|
-
if (fragmentType && (0, import_graphql.isCompositeType)(fragmentType)) {
|
|
411
|
-
const newParentType = fragmentType;
|
|
412
|
-
fieldTreeFromAST(
|
|
413
|
-
fragment.selectionSet.selections,
|
|
414
|
-
resolveInfo,
|
|
415
|
-
tree,
|
|
416
|
-
options,
|
|
417
|
-
newParentType,
|
|
418
|
-
`${depth2} `
|
|
419
|
-
);
|
|
420
|
-
}
|
|
421
|
-
} else {
|
|
422
|
-
if (DEBUG_ENABLED)
|
|
423
|
-
debug(
|
|
424
|
-
"%s[%d] IGNORING because kind '%s' not understood",
|
|
425
|
-
depth2,
|
|
426
|
-
instance,
|
|
427
|
-
selectionVal.kind
|
|
428
|
-
);
|
|
429
|
-
}
|
|
430
|
-
return tree;
|
|
431
|
-
}, initTree);
|
|
432
|
-
}
|
|
433
|
-
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
434
|
-
function firstKey(obj) {
|
|
435
|
-
for (const key in obj) {
|
|
436
|
-
if (hasOwnProperty.call(obj, key)) {
|
|
437
|
-
return key;
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
function getType(resolveInfo, typeCondition) {
|
|
442
|
-
const { schema } = resolveInfo;
|
|
443
|
-
const { kind, name } = typeCondition;
|
|
444
|
-
if (kind === "NamedType") {
|
|
445
|
-
const typeName = name.value;
|
|
446
|
-
return schema.getType(typeName);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
|
|
450
163
|
// ../graphql-orm/src/resolvers/graph.ts
|
|
164
|
+
var import_graphql_parse_resolve_info = require("graphql-parse-resolve-info");
|
|
451
165
|
var GraphResolver = class {
|
|
452
166
|
constructor(orm2, type_resolvers, options = {}) {
|
|
453
167
|
this.orm = orm2;
|
|
@@ -463,7 +177,7 @@ var GraphResolver = class {
|
|
|
463
177
|
return this._resolve_page(query, paginator, { ...context, tree });
|
|
464
178
|
}
|
|
465
179
|
_get_resolve_tree(info) {
|
|
466
|
-
return parseResolveInfo(info);
|
|
180
|
+
return (0, import_graphql_parse_resolve_info.parseResolveInfo)(info);
|
|
467
181
|
}
|
|
468
182
|
_resolve_type(query, context) {
|
|
469
183
|
let { tree } = context;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../graphql-orm/src/paginators/cursor.ts","../../graphql-orm/src/utils/run-after.ts","../../graphql-orm/src/resolvers/field.ts","../../graphql-orm/src/utils/graphql-parse-resolve-info.ts","../../graphql-orm/src/utils/graphql-parse-resolve-info-debug.ts","../../graphql-orm/src/resolvers/graph.ts","../../graphql-orm/src/resolvers/page.ts","../../graphql-orm/src/resolvers/relation.ts","../../graphql-orm/src/utils/is-plain-object.ts","../../graphql-orm/src/filters/filters.ts","../../graphql-orm/src/resolvers/table.ts","../src/orm/orm.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["export {\n\tcreateGraphResolver,\n\tcreateGraphResolver as graph,\n} from \"./resolvers/graph\"\nexport {\n\tdefineTableResolver,\n\tdefineTableResolver as table,\n} from \"./resolvers/table\"\nexport {\n\tdefineCursorPaginator as cursor,\n\tdefineCursorPaginator,\n} from \"graphql-orm\"\nexport { defineFieldResolver, defineFieldResolver as field } from \"graphql-orm\"\nexport { definePageResolver, definePageResolver as page } from \"graphql-orm\"\nexport {\n\tdefineRelationResolver,\n\tdefineRelationResolver as relation,\n} from \"graphql-orm\"\n","import { OrmAdapter } from \"../orm/orm\"\nimport { PaginateContext, Paginator } from \"./base\"\n\nexport function defineCursorPaginator(\n\toptions: Partial<CursorPaginatorOptions> = {},\n) {\n\treturn new CursorPaginator(options)\n}\n\nexport interface CursorPaginatorOptions {\n\tfields: string[]\n\ttake: number\n}\n\nexport interface CursorPaginatorArgs {\n\tcursor?: string\n\ttake?: number\n}\n\nexport interface CursorPaginatorPage<M> {\n\tnodes: M[]\n\tcursor?: string\n}\n\nclass CursorPaginator<Orm extends OrmAdapter, Context>\n\timplements Paginator<Orm, Context>\n{\n\treadonly path = [\"nodes\"]\n\treadonly options: CursorPaginatorOptions\n\n\treadonly fields: Array<{\n\t\tname: string\n\t\tdesc: boolean\n\t}>\n\n\tconstructor(options: Partial<CursorPaginatorOptions> = {}) {\n\t\tthis.options = {\n\t\t\tfields: [\"id\"],\n\t\t\ttake: 10,\n\t\t\t...options,\n\t\t}\n\t\tthis.fields = this.options.fields.map((field) => {\n\t\t\tif (field.startsWith(\"-\")) {\n\t\t\t\treturn { name: field.slice(1), desc: true }\n\t\t\t} else {\n\t\t\t\treturn { name: field, desc: false }\n\t\t\t}\n\t\t})\n\t}\n\n\tpaginate(query: Orm[\"Query\"], context: PaginateContext<Orm, Context>) {\n\t\tconst { orm } = context.graph\n\t\tconst { args } = context.tree\n\n\t\tconst take = (args.take as number | undefined) ?? this.options.take\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\t// Set query order\n\t\tquery = orm.reset_query_order(query)\n\t\tfor (const field of this.fields) {\n\t\t\t// TODO: prevent potential name clash with aliases like .as(`_${table_ref}_order_key_0`)\n\t\t\tquery = orm.select_field(query, { field: field.name, as: field.name })\n\t\t\tquery = orm.add_query_order(query, field.name, field.desc)\n\t\t}\n\n\t\tif (cursor) {\n\t\t\tconst { expression, bindings } = this._parse_cursor(cursor)\n\t\t\tquery = orm.where_raw(query, expression, bindings)\n\t\t}\n\t\tquery = orm.set_query_limit(query, take + 1)\n\n\t\treturn orm.set_query_page_result(query, (nodes) => {\n\t\t\tlet cursor: string | undefined\n\t\t\tif (nodes.length > take) {\n\t\t\t\tcursor = this._create_cursor(nodes[take - 1])\n\t\t\t\tnodes = nodes.slice(0, take)\n\t\t\t}\n\t\t\treturn { nodes, cursor }\n\t\t})\n\t}\n\n\t_create_cursor(instance: any) {\n\t\treturn JSON.stringify(\n\t\t\tthis.fields.map((field) => {\n\t\t\t\tconst value = instance[field.name]\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unable to create cursor: undefined field ${field.name}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn String(value)\n\t\t\t}),\n\t\t)\n\t}\n\n\t_parse_cursor(cursor: string) {\n\t\tconst values = JSON.parse(cursor)\n\t\tconst left: string[] = []\n\t\tconst right: string[] = []\n\t\tconst bindings: Record<string, any> = {}\n\t\tfor (let i = 0; i < this.fields.length; ++i) {\n\t\t\tconst field = this.fields[i]\n\t\t\tconst expressions = field.desc ? right : left\n\t\t\tconst placeholders = field.desc ? left : right\n\t\t\texpressions.push(`\"${field.name}\"`)\n\t\t\tplaceholders.push(\"$\" + field.name)\n\t\t\tbindings[field.name] = values[i]\n\t\t}\n\t\treturn {\n\t\t\texpression: `(${left.join(\",\")}) > (${right.join(\",\")})`,\n\t\t\tbindings,\n\t\t}\n\t}\n}\n","import { OrmAdapter } from \"../orm/orm\"\n\nexport function run_after_query<Orm extends OrmAdapter>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\ttransform: (instance: any) => any,\n): Orm[\"Query\"] {\n\treturn orm.run_after_query(query, async (result) => {\n\t\t// FIXME: returning result is ignored in orchid (unlike objection). Add some hacks instead.\n\t\tif (Array.isArray(result)) {\n\t\t\tconst result1 = await Promise.all(result.map(transform))\n\t\t\treturn result1.filter(Boolean) // Skip empty objects\n\t\t} else if (result) {\n\t\t\treturn transform(result)\n\t\t} else {\n\t\t\t// Supposedly, single query returning NULL\n\t\t\treturn result\n\t\t}\n\t})\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { TableResolveContext } from \"./table\"\n\nexport interface FieldResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** Table field (if different from GraphQL field) */\n\ttableField?: string\n\t/** Legacy alias for `tableField`. */\n\tmodelField?: string\n\t/** Custom query modifier (if different than simply selecting a field). */\n\tmodify?: FieldResolveModifier<Orm, Context>\n\t/** Post-process selected value. Return a new value or a promise. */\n\ttransform?(\n\t\tvalue: any,\n\t\tinstance: any,\n\t\tcontext: FieldResolveContext<Orm, Context>,\n\t): any\n}\n\nexport type FieldResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: FieldResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface FieldResolveContext<Orm extends OrmAdapter, Context>\n\textends TableResolveContext<Orm, Context> {\n\t/** GraphQL field */\n\tfield: string\n}\n\n// That is a coincidence for now.\nexport type FieldResolver<\n\tOrm extends OrmAdapter,\n\tContext,\n> = FieldResolveModifier<Orm, Context>\n\nexport function parse_field_options<\n\tO extends Pick<FieldResolverOptions<any, any>, \"modelField\" | \"tableField\">,\n>(options: O): Omit<O, \"modelField\"> {\n\tconst { tableField, modelField } = options\n\tif (tableField && modelField) {\n\t\tthrow new Error(\n\t\t\t`Both tableField and modelField are defined. Use only one of them.`,\n\t\t)\n\t}\n\treturn { ...options, tableField: tableField || modelField }\n}\n\nexport function defineFieldResolver<Orm extends OrmAdapter, Context>(\n\toptions: FieldResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify, transform } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { field } = context\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t} else {\n\t\t\tquery = context.graph.orm.select_field(query, {\n\t\t\t\tfield: tableField || field,\n\t\t\t\tas: field,\n\t\t\t})\n\t\t}\n\t\tif (transform) {\n\t\t\tquery = run_after_query(context.graph.orm, query, async (instance) => {\n\t\t\t\tinstance[field] = await transform(instance[field], instance, context)\n\t\t\t\treturn instance\n\t\t\t})\n\t\t}\n\t\treturn query\n\t}\n}\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\n//\n// Copy of graphql-parse-resolve-info.\n//\n// Copy/paste from https://github.com/graphile/graphile-engine/blob/9d6c29e3505844ca64020fb6850093a7678a0fa4/packages/graphql-parse-resolve-info/src/index.ts\n// with import fixes.\n//\n// The original graphql-parse-resolve-info lists graphql 14 as a peer dependency.\n// Copy/pasting it here prevents unmet peer dependency errors in projects using graphql-orm.\n//\n// Uses fake debug instead of npm debug (via tsconfig.paths)\n\nimport assert from \"node:assert\"\n\nimport {\n\tASTNode,\n\tFieldNode,\n\tFragmentSpreadNode,\n\tgetNamedType,\n\tGraphQLCompositeType,\n\tGraphQLField,\n\tGraphQLInterfaceType,\n\tGraphQLNamedType,\n\tGraphQLObjectType,\n\tGraphQLResolveInfo,\n\tGraphQLType,\n\tGraphQLUnionType,\n\tInlineFragmentNode,\n\tisCompositeType,\n\tNamedTypeNode,\n\tSelectionNode,\n} from \"graphql\"\nimport { getArgumentValues } from \"graphql\"\n\nimport debugFactory from \"./graphql-parse-resolve-info-debug\"\n\nexport interface FieldsByTypeName {\n\t[str: string]: {\n\t\t[str: string]: ResolveTree\n\t}\n}\n\nexport interface ResolveTree {\n\tname: string\n\talias: string\n\targs: {\n\t\t[str: string]: unknown\n\t}\n\tfieldsByTypeName: FieldsByTypeName\n}\n\nconst debug = debugFactory(\"graphql-parse-resolve-info\")\n\nconst DEBUG_ENABLED = debug.enabled\n\nfunction getArgVal(resolveInfo: GraphQLResolveInfo, argument: any) {\n\tif (argument.kind === \"Variable\") {\n\t\treturn resolveInfo.variableValues[argument.name.value]\n\t} else if (argument.kind === \"BooleanValue\") {\n\t\treturn argument.value\n\t}\n}\n\nfunction argNameIsIf(arg: any): boolean {\n\treturn arg && arg.name ? arg.name.value === \"if\" : false\n}\n\nfunction skipField(\n\tresolveInfo: GraphQLResolveInfo,\n\t{ directives = [] }: SelectionNode,\n) {\n\tlet skip = false\n\tdirectives.forEach((directive) => {\n\t\tconst directiveName = directive.name.value\n\t\tif (Array.isArray(directive.arguments)) {\n\t\t\tconst ifArgumentAst = directive.arguments.find(argNameIsIf)\n\t\t\tif (ifArgumentAst) {\n\t\t\t\tconst argumentValueAst = ifArgumentAst.value\n\t\t\t\tif (directiveName === \"skip\") {\n\t\t\t\t\tskip = skip || getArgVal(resolveInfo, argumentValueAst)\n\t\t\t\t} else if (directiveName === \"include\") {\n\t\t\t\t\tskip = skip || !getArgVal(resolveInfo, argumentValueAst)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\treturn skip\n}\n\n// Originally based on https://github.com/tjmehta/graphql-parse-fields\n\nexport function getAliasFromResolveInfo(\n\tresolveInfo: GraphQLResolveInfo,\n): string {\n\tconst asts: ReadonlyArray<FieldNode> =\n\t\t// @ts-ignore Property 'fieldASTs' does not exist on type 'GraphQLResolveInfo'.\n\t\tresolveInfo.fieldNodes || resolveInfo.fieldASTs\n\tfor (let i = 0, l = asts.length; i < l; i++) {\n\t\tconst val = asts[i]\n\t\tif (val.kind === \"Field\") {\n\t\t\tconst alias = val.alias ? val.alias.value : val.name && val.name.value\n\t\t\tif (alias) {\n\t\t\t\treturn alias\n\t\t\t}\n\t\t}\n\t}\n\tthrow new Error(\"Could not determine alias?!\")\n}\n\nexport interface ParseOptions {\n\tkeepRoot?: boolean\n\tdeep?: boolean\n\tforceParse?: boolean\n}\n\nexport function parseResolveInfo(\n\tresolveInfo: GraphQLResolveInfo,\n): ResolveTree | null\nexport function parseResolveInfo(\n\tresolveInfo: GraphQLResolveInfo,\n\tforceParse: true,\n): ResolveTree\nexport function parseResolveInfo(\n\tresolveInfo: GraphQLResolveInfo,\n\toptions: ParseOptions,\n): ResolveTree | FieldsByTypeName | null | void\nexport function parseResolveInfo(\n\tresolveInfo: GraphQLResolveInfo,\n\tinOptions: ParseOptions | true = {},\n): ResolveTree | FieldsByTypeName | null | void {\n\tconst fieldNodes: ReadonlyArray<FieldNode> =\n\t\t// @ts-ignore Property 'fieldASTs' does not exist on type 'GraphQLResolveInfo'.\n\t\tresolveInfo.fieldNodes || resolveInfo.fieldASTs\n\tconst options = inOptions === true ? {} : inOptions\n\tconst forceParse = inOptions === true || inOptions.forceParse\n\n\tconst { parentType } = resolveInfo\n\tif (!fieldNodes) {\n\t\tthrow new Error(\"No fieldNodes provided!\")\n\t}\n\tif (options.keepRoot == null) {\n\t\toptions.keepRoot = false\n\t}\n\tif (options.deep == null) {\n\t\toptions.deep = true\n\t}\n\tconst tree = fieldTreeFromAST(\n\t\tfieldNodes,\n\t\tresolveInfo,\n\t\tundefined,\n\t\toptions,\n\t\tparentType,\n\t)\n\tif (!options.keepRoot) {\n\t\tconst typeKey = firstKey(tree)\n\t\tif (!typeKey) {\n\t\t\tif (forceParse) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`GraphQL schema issue: simplified parseResolveInfo failed (tree had no keys); perhaps you need to use the keepRoot option?`,\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\t\tconst fields = tree[typeKey]\n\t\tconst fieldKey = firstKey(fields)\n\t\tif (!fieldKey) {\n\t\t\tif (forceParse) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`GraphQL schema issue: simplified parseResolveInfo failed (could not get key from fields); perhaps you need to use the keepRoot option?`,\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\t\treturn fields[fieldKey]\n\t}\n\treturn tree\n}\n\nfunction getFieldFromAST<TContext>(\n\tast: ASTNode,\n\tparentType: GraphQLCompositeType,\n): GraphQLField<GraphQLCompositeType, TContext> | undefined {\n\tif (ast.kind === \"Field\") {\n\t\tconst fieldNode: FieldNode = ast\n\t\tconst fieldName = fieldNode.name.value\n\t\tif (!(parentType instanceof GraphQLUnionType)) {\n\t\t\tconst type: GraphQLObjectType | GraphQLInterfaceType = parentType\n\t\t\treturn type.getFields()[fieldName]\n\t\t} else {\n\t\t\t// XXX: TODO: Handle GraphQLUnionType\n\t\t}\n\t}\n\treturn undefined\n}\n\nlet iNum = 1\nfunction fieldTreeFromAST<T extends SelectionNode>(\n\tinASTs: ReadonlyArray<T> | T,\n\tresolveInfo: GraphQLResolveInfo,\n\tinitTree: FieldsByTypeName = {},\n\toptions: ParseOptions = {},\n\tparentType: GraphQLCompositeType,\n\tdepth = \"\",\n): FieldsByTypeName {\n\tconst instance = iNum++\n\tif (DEBUG_ENABLED)\n\t\tdebug(\n\t\t\t\"%s[%d] Entering fieldTreeFromAST with parent type '%s'\",\n\t\t\tdepth,\n\t\t\tinstance,\n\t\t\tparentType,\n\t\t)\n\tconst { variableValues } = resolveInfo\n\tconst fragments = resolveInfo.fragments || {}\n\tconst asts: ReadonlyArray<T> = Array.isArray(inASTs) ? inASTs : [inASTs]\n\tif (!initTree[parentType.name]) {\n\t\tinitTree[parentType.name] = {}\n\t}\n\tconst outerDepth = depth\n\treturn asts.reduce((tree, selectionVal: SelectionNode, idx) => {\n\t\tconst depth = DEBUG_ENABLED ? `${outerDepth} ` : null\n\t\tif (DEBUG_ENABLED)\n\t\t\tdebug(\n\t\t\t\t\"%s[%d] Processing AST %d of %d; kind = %s\",\n\t\t\t\tdepth,\n\t\t\t\tinstance,\n\t\t\t\tidx + 1,\n\t\t\t\tasts.length,\n\t\t\t\tselectionVal.kind,\n\t\t\t)\n\t\tif (skipField(resolveInfo, selectionVal)) {\n\t\t\tif (DEBUG_ENABLED)\n\t\t\t\tdebug(\"%s[%d] IGNORING due to directive\", depth, instance)\n\t\t} else if (selectionVal.kind === \"Field\") {\n\t\t\tconst val: FieldNode = selectionVal\n\t\t\tconst name = val.name.value\n\t\t\tconst isReserved = name[0] === \"_\" && name[1] === \"_\" && name !== \"__id\"\n\t\t\tif (isReserved) {\n\t\t\t\tif (DEBUG_ENABLED)\n\t\t\t\t\tdebug(\n\t\t\t\t\t\t\"%s[%d] IGNORING because field '%s' is reserved\",\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tinstance,\n\t\t\t\t\t\tname,\n\t\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tconst alias: string =\n\t\t\t\t\tval.alias && val.alias.value ? val.alias.value : name\n\t\t\t\tif (DEBUG_ENABLED)\n\t\t\t\t\tdebug(\n\t\t\t\t\t\t\"%s[%d] Field '%s' (alias = '%s')\",\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tinstance,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\talias,\n\t\t\t\t\t)\n\t\t\t\tconst field = getFieldFromAST(val, parentType)\n\t\t\t\tif (field == null) {\n\t\t\t\t\treturn tree\n\t\t\t\t}\n\t\t\t\tconst fieldGqlTypeOrUndefined = getNamedType(field.type)\n\t\t\t\tif (!fieldGqlTypeOrUndefined) {\n\t\t\t\t\treturn tree\n\t\t\t\t}\n\t\t\t\tconst fieldGqlType: GraphQLNamedType = fieldGqlTypeOrUndefined\n\t\t\t\tconst args =\n\t\t\t\t\tgetArgumentValues(\n\t\t\t\t\t\tfield as GraphQLField<unknown, unknown>,\n\t\t\t\t\t\tval,\n\t\t\t\t\t\tvariableValues,\n\t\t\t\t\t) || {}\n\t\t\t\tif (parentType.name && !tree[parentType.name][alias]) {\n\t\t\t\t\tconst newTreeRoot: ResolveTree = {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\talias,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\tfieldsByTypeName: isCompositeType(fieldGqlType)\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t[fieldGqlType.name]: {},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {},\n\t\t\t\t\t}\n\t\t\t\t\ttree[parentType.name][alias] = newTreeRoot\n\t\t\t\t}\n\t\t\t\tconst selectionSet = val.selectionSet\n\t\t\t\tif (\n\t\t\t\t\tselectionSet != null &&\n\t\t\t\t\toptions.deep &&\n\t\t\t\t\tisCompositeType(fieldGqlType)\n\t\t\t\t) {\n\t\t\t\t\tconst newParentType: GraphQLCompositeType = fieldGqlType\n\t\t\t\t\tif (DEBUG_ENABLED)\n\t\t\t\t\t\tdebug(\"%s[%d] Recursing into subfields\", depth, instance)\n\t\t\t\t\tfieldTreeFromAST(\n\t\t\t\t\t\tselectionSet.selections,\n\t\t\t\t\t\tresolveInfo,\n\t\t\t\t\t\ttree[parentType.name][alias].fieldsByTypeName,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tnewParentType,\n\t\t\t\t\t\t`${depth} `,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\t// No fields to add\n\t\t\t\t\tif (DEBUG_ENABLED)\n\t\t\t\t\t\tdebug(\"%s[%d] Exiting (no fields to add)\", depth, instance)\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (selectionVal.kind === \"FragmentSpread\" && options.deep) {\n\t\t\tconst val: FragmentSpreadNode = selectionVal\n\t\t\tconst name = val.name && val.name.value\n\t\t\tif (DEBUG_ENABLED)\n\t\t\t\tdebug(\"%s[%d] Fragment spread '%s'\", depth, instance, name)\n\t\t\tconst fragment = fragments[name]\n\t\t\tassert(fragment, 'unknown fragment \"' + name + '\"')\n\t\t\tlet fragmentType: GraphQLNamedType | null | undefined = parentType\n\t\t\tif (fragment.typeCondition) {\n\t\t\t\tfragmentType = getType(resolveInfo, fragment.typeCondition)\n\t\t\t}\n\t\t\tif (fragmentType && isCompositeType(fragmentType)) {\n\t\t\t\tconst newParentType: GraphQLCompositeType = fragmentType\n\t\t\t\tfieldTreeFromAST(\n\t\t\t\t\tfragment.selectionSet.selections,\n\t\t\t\t\tresolveInfo,\n\t\t\t\t\ttree,\n\t\t\t\t\toptions,\n\t\t\t\t\tnewParentType,\n\t\t\t\t\t`${depth} `,\n\t\t\t\t)\n\t\t\t}\n\t\t} else if (selectionVal.kind === \"InlineFragment\" && options.deep) {\n\t\t\tconst val: InlineFragmentNode = selectionVal\n\t\t\tconst fragment = val\n\t\t\tlet fragmentType: GraphQLNamedType | null | undefined = parentType\n\t\t\tif (fragment.typeCondition) {\n\t\t\t\tfragmentType = getType(resolveInfo, fragment.typeCondition)\n\t\t\t}\n\t\t\tif (DEBUG_ENABLED)\n\t\t\t\tdebug(\n\t\t\t\t\t\"%s[%d] Inline fragment (parent = '%s', type = '%s')\",\n\t\t\t\t\tdepth,\n\t\t\t\t\tinstance,\n\t\t\t\t\tparentType,\n\t\t\t\t\tfragmentType,\n\t\t\t\t)\n\t\t\tif (fragmentType && isCompositeType(fragmentType)) {\n\t\t\t\tconst newParentType: GraphQLCompositeType = fragmentType\n\t\t\t\tfieldTreeFromAST(\n\t\t\t\t\tfragment.selectionSet.selections,\n\t\t\t\t\tresolveInfo,\n\t\t\t\t\ttree,\n\t\t\t\t\toptions,\n\t\t\t\t\tnewParentType,\n\t\t\t\t\t`${depth} `,\n\t\t\t\t)\n\t\t\t}\n\t\t} else {\n\t\t\tif (DEBUG_ENABLED)\n\t\t\t\tdebug(\n\t\t\t\t\t\"%s[%d] IGNORING because kind '%s' not understood\",\n\t\t\t\t\tdepth,\n\t\t\t\t\tinstance,\n\t\t\t\t\tselectionVal.kind,\n\t\t\t\t)\n\t\t}\n\t\t// Ref: https://github.com/graphile/postgraphile/pull/342/files#diff-d6702ec9fed755c88b9d70b430fda4d8R148\n\t\treturn tree\n\t}, initTree)\n}\n\nconst hasOwnProperty = Object.prototype.hasOwnProperty\nfunction firstKey(obj: object) {\n\tfor (const key in obj) {\n\t\tif (hasOwnProperty.call(obj, key)) {\n\t\t\treturn key\n\t\t}\n\t}\n}\n\nfunction getType(\n\tresolveInfo: GraphQLResolveInfo,\n\ttypeCondition: NamedTypeNode,\n) {\n\tconst { schema } = resolveInfo\n\tconst { kind, name } = typeCondition\n\tif (kind === \"NamedType\") {\n\t\tconst typeName = name.value\n\t\treturn schema.getType(typeName)\n\t}\n}\n\nexport function simplifyParsedResolveInfoFragmentWithType(\n\tparsedResolveInfoFragment: ResolveTree,\n\ttype: GraphQLType,\n) {\n\tconst { fieldsByTypeName } = parsedResolveInfoFragment\n\tconst fields = {}\n\tconst strippedType = getNamedType(type)\n\tif (isCompositeType(strippedType)) {\n\t\tObject.assign(fields, fieldsByTypeName[strippedType.name])\n\t\tif (strippedType instanceof GraphQLObjectType) {\n\t\t\tconst objectType: GraphQLObjectType = strippedType\n\t\t\t// GraphQL ensures that the subfields cannot clash, so it's safe to simply overwrite them\n\t\t\tfor (const anInterface of objectType.getInterfaces()) {\n\t\t\t\tObject.assign(fields, fieldsByTypeName[anInterface.name])\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\t...parsedResolveInfoFragment,\n\t\tfields,\n\t}\n}\n\nexport const parse = parseResolveInfo\nexport const simplify = simplifyParsedResolveInfoFragmentWithType\nexport const getAlias = getAliasFromResolveInfo\n","// Mimic npm debug (but don't actually have it as a dependency)\n\ninterface DebugFn {\n\t(message: string, ...args: any[]): void\n\tenabled: boolean\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport default function debugFactory(name: string): DebugFn {\n\tfunction debug() {}\n\tdebug.enabled = false\n\treturn debug\n}\n","import type { GraphQLResolveInfo } from \"graphql\"\n\nimport { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\nimport {\n\tparseResolveInfo,\n\ttype ResolveTree,\n} from \"../utils/graphql-parse-resolve-info\"\nimport type { TableResolver, TableResolverOptions } from \"./table\"\n\nexport type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<\n\tTableResolverOptions<Orm, Context>,\n\t\"allowAllFields\" | \"allowAllFilters\"\n>\n\nexport interface GraphResolveOptions<Context> {\n\tinfo: GraphQLResolveInfo\n\tcontext: Context\n\tfilters?: FiltersDef\n\t/** Subfield path if not resolving root query, e.g.: ['user'] */\n\tpath?: string[]\n}\n\nexport type GraphResolveContext<Context> = Omit<\n\tGraphResolveOptions<Context>,\n\t\"info\"\n> & {\n\ttree: ResolveTree\n}\n\nexport class GraphResolver<Orm extends OrmAdapter, Context> {\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly type_resolvers: Record<string, TableResolver<Orm, Context>>,\n\t\treadonly options: GraphResolverOptions<Orm, Context> = {},\n\t) {}\n\n\tresolve(\n\t\tquery: Orm[\"Query\"],\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_type(query, { ...context, tree })\n\t}\n\n\tresolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_page(query, paginator, { ...context, tree })\n\t}\n\n\t_get_resolve_tree(info: GraphQLResolveInfo) {\n\t\treturn parseResolveInfo(info) as ResolveTree\n\t}\n\n\t_resolve_type(query: Orm[\"Query\"], context: GraphResolveContext<Context>) {\n\t\tlet { tree } = context\n\t\t// Dive into subtree if requested.\n\t\tif (context.path) {\n\t\t\tfor (const field of context.path) {\n\t\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t\tif (!tree) {\n\t\t\t\t\t// This graphql field was never requested, ignore.\n\t\t\t\t\t// This happens when a user resolves a graph for a root subfield which was not requested by the client (and is thus not present in the tree).\n\t\t\t\t\t//\n\t\t\t\t\t// FIXME: this break typings contract. We are supposed to return a query.\n\t\t\t\t\t// However, if we advertise to optionally return undefined, this result won't be accepted by upstream graphql tooling types.\n\t\t\t\t\t// This is the least evil I see for now.\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\tconst type_resolver = this.type_resolvers[type]\n\t\tif (!type_resolver) {\n\t\t\tthrow new Error(`Resolver not found for type ${type}.`)\n\t\t}\n\t\treturn type_resolver.resolve(query, {\n\t\t\t...context,\n\t\t\tgraph: this as any,\n\t\t\ttree,\n\t\t\ttype,\n\t\t\tpath: undefined,\n\t\t})\n\t}\n\n\t_resolve_page(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\tcontext: GraphResolveContext<Context>,\n\t) {\n\t\tif (context.path) {\n\t\t\t// TODO: handle non-empty context.path\n\t\t\tthrow new Error(\"Paginating under non-root path not yet supported.\")\n\t\t}\n\t\tquery = this._resolve_type(query, { ...context, path: paginator.path })\n\t\treturn paginator.paginate(query, {\n\t\t\t...context,\n\t\t\tgraph: this as any,\n\t\t})\n\t}\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\nimport { FieldResolver, parse_field_options } from \"./field\"\nimport { RelationResolverOptions } from \"./relation\"\n\nexport function definePageResolver<Orm extends OrmAdapter, Context>(\n\tpaginator: Paginator<Orm, Context>,\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\t// Objection.js requires a workaround to handle paginated content,\n\t\t// it must be saved into context and re-injected later.\n\t\t// The modify + finish is a no-op in Orchid.\n\t\tconst pagination_context = {}\n\t\tquery = graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolve_page(subquery, paginator, context)\n\t\t\t\tsubquery = graph.orm.modify_subquery_pagination(\n\t\t\t\t\tsubquery,\n\t\t\t\t\tpagination_context,\n\t\t\t\t)\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t\tquery = graph.orm.finish_query_pagination(query, field, pagination_context)\n\t\treturn query\n\t}\n}\n","import { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport {\n\tFieldResolver,\n\tFieldResolverOptions,\n\tparse_field_options,\n} from \"./field\"\nimport { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Orm extends OrmAdapter, Context>\n\textends Omit<FieldResolverOptions<Orm, Context>, \"modify\"> {\n\tfilters?: FiltersDef\n\tmodify?: TableResolveModifier<Orm, Context>\n}\n\nexport function defineRelationResolver<Orm extends OrmAdapter, Context>(\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, filters, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\treturn graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolve_type(subquery, { ...context, filters })\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t}\n}\n","export function is_plain_object(obj: any): obj is Record<string, any> {\n\treturn typeof obj === \"object\" && !Array.isArray(obj)\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { TableResolveContext } from \"../resolvers/table\"\nimport { is_plain_object } from \"../utils/is-plain-object\"\n\n// TODO: per-field definitions\nexport type FiltersDef = boolean\n\nexport type FilterScalarValue = null | string | number | boolean\nexport type FilterValue = FilterScalarValue | Exclude<FilterScalarValue, null>[]\nexport type Filter = { [property: string]: FilterValue }\n\ninterface ApplyFiltersOptions<Orm extends OrmAdapter, Context> {\n\tfilters: FiltersDef\n\tmodifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\tcontext: TableResolveContext<Orm, Context>\n}\n\nexport type ApplyFiltersModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tvalue: any,\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport function apply_filters<Orm extends OrmAdapter, Context>(\n\tquery: Orm[\"Query\"],\n\t{ filters, modifiers, context }: ApplyFiltersOptions<Orm, Context>,\n): Orm[\"Query\"] {\n\tif (!filters) {\n\t\treturn query\n\t}\n\tconst filter_obj = context.tree.args?.filter\n\tif (!filter_obj) {\n\t\treturn query\n\t}\n\tif (!is_plain_object(filter_obj)) {\n\t\tthrow new Error(`Invalid filter: ${filter_obj}, must be object.`)\n\t}\n\tfor (const [field, value] of Object.entries(filter_obj)) {\n\t\tif (value === undefined) {\n\t\t\t// Support optional GraphQL arguments in filter\n\t\t\tcontinue\n\t\t}\n\t\tif (modifiers?.[field]) {\n\t\t\tquery = modifiers[field](query, value, context)\n\t\t} else {\n\t\t\tconst [table_field, op0] = field.split(\"__\")\n\t\t\tconst op = op0?.toLowerCase()\n\t\t\t// TODO: validate op\n\t\t\tquery = context.graph.orm.where(query, table_field, op, value)\n\t\t}\n\t}\n\treturn query\n}\n","import { apply_filters, ApplyFiltersModifier } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { defineFieldResolver, FieldResolver } from \"./field\"\nimport type { GraphResolveContext, GraphResolver } from \"./graph\"\nimport { defineRelationResolver } from \"./relation\"\n\nexport interface TableResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** allow to resolve all table fields without explicitly listing them */\n\tallowAllFields?: boolean\n\t/** allow to filter all table fields without explicitly listing them */\n\tallowAllFilters?: boolean\n\tfields?: Record<string, SimpleFieldResolver<Orm, Context>>\n\tmodifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\tmodify?: TableResolveModifier<Orm, Context>\n\ttransform?(instance: any, context: any): void | PromiseLike<void>\n}\n\nexport type SimpleFieldResolver<Orm extends OrmAdapter, Context> =\n\t| true\n\t| string\n\t| FieldResolver<Orm, Context>\n\nexport type TableResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface TableResolveContext<Orm extends OrmAdapter, Context>\n\textends GraphResolveContext<Context> {\n\tgraph: GraphResolver<Orm, Context>\n\t/** GraphQL type */\n\ttype: string\n}\n\nexport class TableResolver<Orm extends OrmAdapter, Context> {\n\t// Introspection results\n\treadonly relations: Set<string>\n\treadonly virtual_fields: Set<string>\n\treadonly modifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\n\treadonly table_field_resolvers?: Record<string, FieldResolver<Orm, Context>>\n\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly table: Orm[\"Table\"],\n\t\treadonly options: TableResolverOptions<Orm, Context> = {},\n\t) {\n\t\tthis.relations = new Set(orm.get_table_relations(table))\n\t\tthis.virtual_fields = new Set(orm.get_table_virtual_fields(table))\n\t\tthis.modifiers = { ...orm.get_table_modifiers(table), ...options.modifiers }\n\n\t\t// Pre-create field resolvers\n\t\tconst { fields } = options\n\t\tif (fields) {\n\t\t\tthis.table_field_resolvers = Object.keys(fields).reduce<\n\t\t\t\tRecord<string, FieldResolver<Orm, Context>>\n\t\t\t>((resolvers, field) => {\n\t\t\t\tconst r0 = fields[field]\n\t\t\t\tconst r: FieldResolver<Orm, Context> | undefined =\n\t\t\t\t\ttypeof r0 === \"function\"\n\t\t\t\t\t\t? r0\n\t\t\t\t\t\t: r0 === true\n\t\t\t\t\t\t\t? this._get_default_field_resolver(field)\n\t\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t\t\t? this._get_default_field_resolver(field, r0)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\tif (r === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Field resolver must be a function, string, or true; found ${typeof r0}.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tresolvers[field] = r\n\t\t\t\treturn resolvers\n\t\t\t}, {})\n\t\t}\n\t}\n\n\t/** Modify query to select fields/relations and filter the result set. */\n\tresolve(query: Orm[\"Query\"], context: TableResolveContext<Orm, Context>) {\n\t\tconst { modify, transform } = this.options\n\t\tconst { graph, tree, type, filters } = context\n\n\t\tconst query_table = this.orm.get_query_table(query)\n\t\tconst table_table = this.orm.get_table_table(this.table)\n\n\t\tif (query_table !== table_table) {\n\t\t\tthrow new Error(\n\t\t\t\t`Mismatching query table for type ${type}: expected ${table_table}, received ${query_table}.`,\n\t\t\t)\n\t\t}\n\n\t\tconst allow_all_fields =\n\t\t\tthis.options.allowAllFields ??\n\t\t\tgraph.options.allowAllFields ??\n\t\t\t!this.options.fields\n\n\t\tif (!allow_all_fields && !this.table_field_resolvers) {\n\t\t\tthrow new Error(\n\t\t\t\t`Resolver for type ${type} must either allow all fields or specify options.fields.`,\n\t\t\t)\n\t\t}\n\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t}\n\n\t\tfor (const subtree of Object.values(tree.fieldsByTypeName[type])) {\n\t\t\tconst field = subtree.name\n\t\t\tconst r: FieldResolver<Orm, Context> | undefined =\n\t\t\t\tthis.table_field_resolvers?.[field] ||\n\t\t\t\t(allow_all_fields ? this._get_default_field_resolver(field) : undefined)\n\t\t\tif (!r) {\n\t\t\t\tthrow new Error(`No field resolver defined for field ${type}.${field}.`)\n\t\t\t}\n\t\t\tif (r) {\n\t\t\t\tquery = r(query, { ...context, tree: subtree, field })\n\t\t\t}\n\t\t}\n\n\t\tconst allow_all_filters =\n\t\t\tthis.options.allowAllFilters ?? graph.options.allowAllFilters\n\n\t\tconst effective_filters = allow_all_filters ? true : filters\n\n\t\tif (effective_filters) {\n\t\t\tquery = apply_filters<Orm, Context>(query, {\n\t\t\t\tfilters: effective_filters,\n\t\t\t\tmodifiers: this.modifiers,\n\t\t\t\tcontext,\n\t\t\t})\n\t\t}\n\n\t\tif (transform) {\n\t\t\tquery = run_after_query(this.orm, query, (instance) => {\n\t\t\t\treturn transform(instance, context)\n\t\t\t})\n\t\t}\n\n\t\tquery = this.orm.prevent_select_all(query)\n\n\t\treturn query\n\t}\n\n\t/**\n\t * Create field resolver which will modify query to resolve GraphQL field.\n\t */\n\t_get_default_field_resolver(\n\t\tfield: string,\n\t\ttableField?: string,\n\t): FieldResolver<Orm, Context> {\n\t\tconst table_field_lookup = tableField || field\n\t\tif (\n\t\t\tthis.options.modifiers?.[table_field_lookup] ||\n\t\t\tthis.virtual_fields.has(table_field_lookup)\n\t\t) {\n\t\t\t// Keep query as is.\n\t\t\treturn (query) => query\n\t\t} else if (this.relations.has(table_field_lookup)) {\n\t\t\t// TODO: pre-create and cache\n\t\t\treturn defineRelationResolver({ tableField })\n\t\t} else {\n\t\t\t// TODO: create simplified resolver?\n\t\t\treturn defineFieldResolver({ tableField })\n\t\t}\n\t}\n}\n","import { OrmAdapter } from \"graphql-orm\"\nimport { DbTable, raw } from \"orchid-orm\"\nimport type { Query } from \"pqb\"\n\nexport type OrchidOrm = OrmAdapter<\n\tDbTable<any>,\n\tQuery,\n\t// TODO: Type as QueryTransform once it's published.\n\tPick<Promise<any>, \"then\" | \"catch\">\n>\n\nexport const orm: OrchidOrm = {\n\tTable: undefined as unknown as OrchidOrm[\"Table\"],\n\tQuery: undefined as unknown as OrchidOrm[\"Query\"],\n\tQueryTransform: undefined as unknown as OrchidOrm[\"QueryTransform\"],\n\n\t// Reflection\n\n\tget_table_table(table) {\n\t\treturn table.table\n\t},\n\n\tget_table_relations(table) {\n\t\treturn Object.keys(table.relations)\n\t},\n\n\tget_table_virtual_fields() {\n\t\t// Not supported by Orchid.\n\t\treturn []\n\t},\n\n\tget_table_modifiers() {\n\t\treturn undefined\n\t},\n\n\tget_query_table(query) {\n\t\tif (!query.table) {\n\t\t\tthrow new Error(\"Query must have table.\")\n\t\t}\n\t\treturn query.table\n\t},\n\n\t// Select\n\n\tselect_field(query, { field, as }) {\n\t\treturn query.select({ [as]: field })\n\t},\n\n\tselect_relation(query, { relation, as, modify }) {\n\t\treturn query.select({\n\t\t\t[as]: (q) => modify((q as any)[relation]),\n\t\t})\n\t},\n\n\t// Find\n\n\twhere(query, field, op, value) {\n\t\treturn query.where({ [field]: op ? { [op]: value } : value })\n\t},\n\n\twhere_raw(query, expression, bindings) {\n\t\treturn query.where(raw({ raw: expression, values: bindings }))\n\t},\n\n\t// Order & Limit\n\n\treset_query_order(query) {\n\t\treturn query.clear(\"order\")\n\t},\n\n\tadd_query_order(query, field, desc) {\n\t\treturn query.order({ [field]: desc ? \"DESC\" : \"ASC\" })\n\t},\n\n\tset_query_limit(query, limit) {\n\t\treturn query.limit(limit)\n\t},\n\n\t// Pagination helpers\n\n\tset_query_page_result(query, get_page) {\n\t\treturn query.transform((nodes) => get_page(nodes as any))\n\t},\n\n\tmodify_subquery_pagination(subquery) {\n\t\treturn subquery\n\t},\n\n\tfinish_query_pagination(query) {\n\t\treturn query\n\t},\n\n\t// Misc\n\n\trun_after_query(query, fn) {\n\t\treturn query.afterQuery((data) => fn(data))\n\t},\n\n\tprevent_select_all(query) {\n\t\t// Not needed in Orchid\n\t\treturn query\n\t},\n}\n","import { GraphResolver, GraphResolverOptions, TableResolver } from \"graphql-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function createGraphResolver<Context = unknown>(\n\ttypes: Record<string, TableResolver<OrchidOrm, Context>>,\n\toptions?: GraphResolverOptions<OrchidOrm, Context>,\n) {\n\treturn new GraphResolver<OrchidOrm, Context>(orm, types, options)\n}\n","import { TableResolver, TableResolverOptions } from \"graphql-orm\"\nimport { DbTable } 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","import_graphql","debug","depth","assert","orm","type","orm"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../graphql-orm/src/paginators/cursor.ts","../../graphql-orm/src/utils/run-after.ts","../../graphql-orm/src/resolvers/field.ts","../../graphql-orm/src/resolvers/graph.ts","../../graphql-orm/src/resolvers/page.ts","../../graphql-orm/src/resolvers/relation.ts","../../graphql-orm/src/utils/is-plain-object.ts","../../graphql-orm/src/filters/filters.ts","../../graphql-orm/src/resolvers/table.ts","../src/orm/orm.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["export {\n\tcreateGraphResolver,\n\tcreateGraphResolver as graph,\n} from \"./resolvers/graph\"\nexport {\n\tdefineTableResolver,\n\tdefineTableResolver as table,\n} from \"./resolvers/table\"\nexport {\n\tdefineCursorPaginator as cursor,\n\tdefineCursorPaginator,\n} from \"graphql-orm\"\nexport { defineFieldResolver, defineFieldResolver as field } from \"graphql-orm\"\nexport { definePageResolver, definePageResolver as page } from \"graphql-orm\"\nexport {\n\tdefineRelationResolver,\n\tdefineRelationResolver as relation,\n} from \"graphql-orm\"\n","import { OrmAdapter } from \"../orm/orm\"\nimport { PaginateContext, Paginator } from \"./base\"\n\nexport function defineCursorPaginator(\n\toptions: Partial<CursorPaginatorOptions> = {},\n) {\n\treturn new CursorPaginator(options)\n}\n\nexport interface CursorPaginatorOptions {\n\tfields: string[]\n\ttake: number\n}\n\nexport interface CursorPaginatorArgs {\n\tcursor?: string\n\ttake?: number\n}\n\nexport interface CursorPaginatorPage<M> {\n\tnodes: M[]\n\tcursor?: string\n}\n\nclass CursorPaginator<Orm extends OrmAdapter, Context>\n\timplements Paginator<Orm, Context>\n{\n\treadonly path = [\"nodes\"]\n\treadonly options: CursorPaginatorOptions\n\n\treadonly fields: Array<{\n\t\tname: string\n\t\tdesc: boolean\n\t}>\n\n\tconstructor(options: Partial<CursorPaginatorOptions> = {}) {\n\t\tthis.options = {\n\t\t\tfields: [\"id\"],\n\t\t\ttake: 10,\n\t\t\t...options,\n\t\t}\n\t\tthis.fields = this.options.fields.map((field) => {\n\t\t\tif (field.startsWith(\"-\")) {\n\t\t\t\treturn { name: field.slice(1), desc: true }\n\t\t\t} else {\n\t\t\t\treturn { name: field, desc: false }\n\t\t\t}\n\t\t})\n\t}\n\n\tpaginate(query: Orm[\"Query\"], context: PaginateContext<Orm, Context>) {\n\t\tconst { orm } = context.graph\n\t\tconst { args } = context.tree\n\n\t\tconst take = (args.take as number | undefined) ?? this.options.take\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\t// Set query order\n\t\tquery = orm.reset_query_order(query)\n\t\tfor (const field of this.fields) {\n\t\t\t// TODO: prevent potential name clash with aliases like .as(`_${table_ref}_order_key_0`)\n\t\t\tquery = orm.select_field(query, { field: field.name, as: field.name })\n\t\t\tquery = orm.add_query_order(query, field.name, field.desc)\n\t\t}\n\n\t\tif (cursor) {\n\t\t\tconst { expression, bindings } = this._parse_cursor(cursor)\n\t\t\tquery = orm.where_raw(query, expression, bindings)\n\t\t}\n\t\tquery = orm.set_query_limit(query, take + 1)\n\n\t\treturn orm.set_query_page_result(query, (nodes) => {\n\t\t\tlet cursor: string | undefined\n\t\t\tif (nodes.length > take) {\n\t\t\t\tcursor = this._create_cursor(nodes[take - 1])\n\t\t\t\tnodes = nodes.slice(0, take)\n\t\t\t}\n\t\t\treturn { nodes, cursor }\n\t\t})\n\t}\n\n\t_create_cursor(instance: any) {\n\t\treturn JSON.stringify(\n\t\t\tthis.fields.map((field) => {\n\t\t\t\tconst value = instance[field.name]\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unable to create cursor: undefined field ${field.name}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn String(value)\n\t\t\t}),\n\t\t)\n\t}\n\n\t_parse_cursor(cursor: string) {\n\t\tconst values = JSON.parse(cursor)\n\t\tconst left: string[] = []\n\t\tconst right: string[] = []\n\t\tconst bindings: Record<string, any> = {}\n\t\tfor (let i = 0; i < this.fields.length; ++i) {\n\t\t\tconst field = this.fields[i]\n\t\t\tconst expressions = field.desc ? right : left\n\t\t\tconst placeholders = field.desc ? left : right\n\t\t\texpressions.push(`\"${field.name}\"`)\n\t\t\tplaceholders.push(\"$\" + field.name)\n\t\t\tbindings[field.name] = values[i]\n\t\t}\n\t\treturn {\n\t\t\texpression: `(${left.join(\",\")}) > (${right.join(\",\")})`,\n\t\t\tbindings,\n\t\t}\n\t}\n}\n","import { OrmAdapter } from \"../orm/orm\"\n\nexport function run_after_query<Orm extends OrmAdapter>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\ttransform: (instance: any) => any,\n): Orm[\"Query\"] {\n\treturn orm.run_after_query(query, async (result) => {\n\t\t// FIXME: returning result is ignored in orchid (unlike objection). Add some hacks instead.\n\t\tif (Array.isArray(result)) {\n\t\t\tconst result1 = await Promise.all(result.map(transform))\n\t\t\treturn result1.filter(Boolean) // Skip empty objects\n\t\t} else if (result) {\n\t\t\treturn transform(result)\n\t\t} else {\n\t\t\t// Supposedly, single query returning NULL\n\t\t\treturn result\n\t\t}\n\t})\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { TableResolveContext } from \"./table\"\n\nexport interface FieldResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** Table field (if different from GraphQL field) */\n\ttableField?: string\n\t/** Legacy alias for `tableField`. */\n\tmodelField?: string\n\t/** Custom query modifier (if different than simply selecting a field). */\n\tmodify?: FieldResolveModifier<Orm, Context>\n\t/** Post-process selected value. Return a new value or a promise. */\n\ttransform?(\n\t\tvalue: any,\n\t\tinstance: any,\n\t\tcontext: FieldResolveContext<Orm, Context>,\n\t): any\n}\n\nexport type FieldResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: FieldResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface FieldResolveContext<Orm extends OrmAdapter, Context>\n\textends TableResolveContext<Orm, Context> {\n\t/** GraphQL field */\n\tfield: string\n}\n\n// That is a coincidence for now.\nexport type FieldResolver<\n\tOrm extends OrmAdapter,\n\tContext,\n> = FieldResolveModifier<Orm, Context>\n\nexport function parse_field_options<\n\tO extends Pick<FieldResolverOptions<any, any>, \"modelField\" | \"tableField\">,\n>(options: O): Omit<O, \"modelField\"> {\n\tconst { tableField, modelField } = options\n\tif (tableField && modelField) {\n\t\tthrow new Error(\n\t\t\t`Both tableField and modelField are defined. Use only one of them.`,\n\t\t)\n\t}\n\treturn { ...options, tableField: tableField || modelField }\n}\n\nexport function defineFieldResolver<Orm extends OrmAdapter, Context>(\n\toptions: FieldResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify, transform } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { field } = context\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t} else {\n\t\t\tquery = context.graph.orm.select_field(query, {\n\t\t\t\tfield: tableField || field,\n\t\t\t\tas: field,\n\t\t\t})\n\t\t}\n\t\tif (transform) {\n\t\t\tquery = run_after_query(context.graph.orm, query, async (instance) => {\n\t\t\t\tinstance[field] = await transform(instance[field], instance, context)\n\t\t\t\treturn instance\n\t\t\t})\n\t\t}\n\t\treturn query\n\t}\n}\n","import type { GraphQLResolveInfo } from \"graphql\"\nimport { parseResolveInfo, ResolveTree } from \"graphql-parse-resolve-info\"\n\nimport { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\nimport type { TableResolver, TableResolverOptions } from \"./table\"\n\nexport type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<\n\tTableResolverOptions<Orm, Context>,\n\t\"allowAllFields\" | \"allowAllFilters\"\n>\n\nexport interface GraphResolveOptions<Context> {\n\tinfo: GraphQLResolveInfo\n\tcontext: Context\n\tfilters?: FiltersDef\n\t/** Subfield path if not resolving root query, e.g.: ['user'] */\n\tpath?: string[]\n}\n\nexport type GraphResolveContext<Context> = Omit<\n\tGraphResolveOptions<Context>,\n\t\"info\"\n> & {\n\ttree: ResolveTree\n}\n\nexport class GraphResolver<Orm extends OrmAdapter, Context> {\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly type_resolvers: Record<string, TableResolver<Orm, Context>>,\n\t\treadonly options: GraphResolverOptions<Orm, Context> = {},\n\t) {}\n\n\tresolve(\n\t\tquery: Orm[\"Query\"],\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_type(query, { ...context, tree })\n\t}\n\n\tresolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_page(query, paginator, { ...context, tree })\n\t}\n\n\t_get_resolve_tree(info: GraphQLResolveInfo) {\n\t\treturn parseResolveInfo(info) as ResolveTree\n\t}\n\n\t_resolve_type(query: Orm[\"Query\"], context: GraphResolveContext<Context>) {\n\t\tlet { tree } = context\n\t\t// Dive into subtree if requested.\n\t\tif (context.path) {\n\t\t\tfor (const field of context.path) {\n\t\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t\tif (!tree) {\n\t\t\t\t\t// This graphql field was never requested, ignore.\n\t\t\t\t\t// This happens when a user resolves a graph for a root subfield which was not requested by the client (and is thus not present in the tree).\n\t\t\t\t\t//\n\t\t\t\t\t// FIXME: this break typings contract. We are supposed to return a query.\n\t\t\t\t\t// However, if we advertise to optionally return undefined, this result won't be accepted by upstream graphql tooling types.\n\t\t\t\t\t// This is the least evil I see for now.\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\tconst type_resolver = this.type_resolvers[type]\n\t\tif (!type_resolver) {\n\t\t\tthrow new Error(`Resolver not found for type ${type}.`)\n\t\t}\n\t\treturn type_resolver.resolve(query, {\n\t\t\t...context,\n\t\t\tgraph: this as any,\n\t\t\ttree,\n\t\t\ttype,\n\t\t\tpath: undefined,\n\t\t})\n\t}\n\n\t_resolve_page(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\tcontext: GraphResolveContext<Context>,\n\t) {\n\t\tif (context.path) {\n\t\t\t// TODO: handle non-empty context.path\n\t\t\tthrow new Error(\"Paginating under non-root path not yet supported.\")\n\t\t}\n\t\tquery = this._resolve_type(query, { ...context, path: paginator.path })\n\t\treturn paginator.paginate(query, {\n\t\t\t...context,\n\t\t\tgraph: this as any,\n\t\t})\n\t}\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\nimport { FieldResolver, parse_field_options } from \"./field\"\nimport { RelationResolverOptions } from \"./relation\"\n\nexport function definePageResolver<Orm extends OrmAdapter, Context>(\n\tpaginator: Paginator<Orm, Context>,\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\t// Objection.js requires a workaround to handle paginated content,\n\t\t// it must be saved into context and re-injected later.\n\t\t// The modify + finish is a no-op in Orchid.\n\t\tconst pagination_context = {}\n\t\tquery = graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolve_page(subquery, paginator, context)\n\t\t\t\tsubquery = graph.orm.modify_subquery_pagination(\n\t\t\t\t\tsubquery,\n\t\t\t\t\tpagination_context,\n\t\t\t\t)\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t\tquery = graph.orm.finish_query_pagination(query, field, pagination_context)\n\t\treturn query\n\t}\n}\n","import { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport {\n\tFieldResolver,\n\tFieldResolverOptions,\n\tparse_field_options,\n} from \"./field\"\nimport { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Orm extends OrmAdapter, Context>\n\textends Omit<FieldResolverOptions<Orm, Context>, \"modify\"> {\n\tfilters?: FiltersDef\n\tmodify?: TableResolveModifier<Orm, Context>\n}\n\nexport function defineRelationResolver<Orm extends OrmAdapter, Context>(\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, filters, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\treturn graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolve_type(subquery, { ...context, filters })\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t}\n}\n","export function is_plain_object(obj: any): obj is Record<string, any> {\n\treturn typeof obj === \"object\" && !Array.isArray(obj)\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { TableResolveContext } from \"../resolvers/table\"\nimport { is_plain_object } from \"../utils/is-plain-object\"\n\n// TODO: per-field definitions\nexport type FiltersDef = boolean\n\nexport type FilterScalarValue = null | string | number | boolean\nexport type FilterValue = FilterScalarValue | Exclude<FilterScalarValue, null>[]\nexport type Filter = { [property: string]: FilterValue }\n\ninterface ApplyFiltersOptions<Orm extends OrmAdapter, Context> {\n\tfilters: FiltersDef\n\tmodifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\tcontext: TableResolveContext<Orm, Context>\n}\n\nexport type ApplyFiltersModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tvalue: any,\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport function apply_filters<Orm extends OrmAdapter, Context>(\n\tquery: Orm[\"Query\"],\n\t{ filters, modifiers, context }: ApplyFiltersOptions<Orm, Context>,\n): Orm[\"Query\"] {\n\tif (!filters) {\n\t\treturn query\n\t}\n\tconst filter_obj = context.tree.args?.filter\n\tif (!filter_obj) {\n\t\treturn query\n\t}\n\tif (!is_plain_object(filter_obj)) {\n\t\tthrow new Error(`Invalid filter: ${filter_obj}, must be object.`)\n\t}\n\tfor (const [field, value] of Object.entries(filter_obj)) {\n\t\tif (value === undefined) {\n\t\t\t// Support optional GraphQL arguments in filter\n\t\t\tcontinue\n\t\t}\n\t\tif (modifiers?.[field]) {\n\t\t\tquery = modifiers[field](query, value, context)\n\t\t} else {\n\t\t\tconst [table_field, op0] = field.split(\"__\")\n\t\t\tconst op = op0?.toLowerCase()\n\t\t\t// TODO: validate op\n\t\t\tquery = context.graph.orm.where(query, table_field, op, value)\n\t\t}\n\t}\n\treturn query\n}\n","import { apply_filters, ApplyFiltersModifier } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { defineFieldResolver, FieldResolver } from \"./field\"\nimport type { GraphResolveContext, GraphResolver } from \"./graph\"\nimport { defineRelationResolver } from \"./relation\"\n\nexport interface TableResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** allow to resolve all table fields without explicitly listing them */\n\tallowAllFields?: boolean\n\t/** allow to filter all table fields without explicitly listing them */\n\tallowAllFilters?: boolean\n\tfields?: Record<string, SimpleFieldResolver<Orm, Context>>\n\tmodifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\tmodify?: TableResolveModifier<Orm, Context>\n\ttransform?(instance: any, context: any): void | PromiseLike<void>\n}\n\nexport type SimpleFieldResolver<Orm extends OrmAdapter, Context> =\n\t| true\n\t| string\n\t| FieldResolver<Orm, Context>\n\nexport type TableResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface TableResolveContext<Orm extends OrmAdapter, Context>\n\textends GraphResolveContext<Context> {\n\tgraph: GraphResolver<Orm, Context>\n\t/** GraphQL type */\n\ttype: string\n}\n\nexport class TableResolver<Orm extends OrmAdapter, Context> {\n\t// Introspection results\n\treadonly relations: Set<string>\n\treadonly virtual_fields: Set<string>\n\treadonly modifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\n\treadonly table_field_resolvers?: Record<string, FieldResolver<Orm, Context>>\n\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly table: Orm[\"Table\"],\n\t\treadonly options: TableResolverOptions<Orm, Context> = {},\n\t) {\n\t\tthis.relations = new Set(orm.get_table_relations(table))\n\t\tthis.virtual_fields = new Set(orm.get_table_virtual_fields(table))\n\t\tthis.modifiers = { ...orm.get_table_modifiers(table), ...options.modifiers }\n\n\t\t// Pre-create field resolvers\n\t\tconst { fields } = options\n\t\tif (fields) {\n\t\t\tthis.table_field_resolvers = Object.keys(fields).reduce<\n\t\t\t\tRecord<string, FieldResolver<Orm, Context>>\n\t\t\t>((resolvers, field) => {\n\t\t\t\tconst r0 = fields[field]\n\t\t\t\tconst r: FieldResolver<Orm, Context> | undefined =\n\t\t\t\t\ttypeof r0 === \"function\"\n\t\t\t\t\t\t? r0\n\t\t\t\t\t\t: r0 === true\n\t\t\t\t\t\t\t? this._get_default_field_resolver(field)\n\t\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t\t\t? this._get_default_field_resolver(field, r0)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\tif (r === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Field resolver must be a function, string, or true; found ${typeof r0}.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tresolvers[field] = r\n\t\t\t\treturn resolvers\n\t\t\t}, {})\n\t\t}\n\t}\n\n\t/** Modify query to select fields/relations and filter the result set. */\n\tresolve(query: Orm[\"Query\"], context: TableResolveContext<Orm, Context>) {\n\t\tconst { modify, transform } = this.options\n\t\tconst { graph, tree, type, filters } = context\n\n\t\tconst query_table = this.orm.get_query_table(query)\n\t\tconst table_table = this.orm.get_table_table(this.table)\n\n\t\tif (query_table !== table_table) {\n\t\t\tthrow new Error(\n\t\t\t\t`Mismatching query table for type ${type}: expected ${table_table}, received ${query_table}.`,\n\t\t\t)\n\t\t}\n\n\t\tconst allow_all_fields =\n\t\t\tthis.options.allowAllFields ??\n\t\t\tgraph.options.allowAllFields ??\n\t\t\t!this.options.fields\n\n\t\tif (!allow_all_fields && !this.table_field_resolvers) {\n\t\t\tthrow new Error(\n\t\t\t\t`Resolver for type ${type} must either allow all fields or specify options.fields.`,\n\t\t\t)\n\t\t}\n\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t}\n\n\t\tfor (const subtree of Object.values(tree.fieldsByTypeName[type])) {\n\t\t\tconst field = subtree.name\n\t\t\tconst r: FieldResolver<Orm, Context> | undefined =\n\t\t\t\tthis.table_field_resolvers?.[field] ||\n\t\t\t\t(allow_all_fields ? this._get_default_field_resolver(field) : undefined)\n\t\t\tif (!r) {\n\t\t\t\tthrow new Error(`No field resolver defined for field ${type}.${field}.`)\n\t\t\t}\n\t\t\tif (r) {\n\t\t\t\tquery = r(query, { ...context, tree: subtree, field })\n\t\t\t}\n\t\t}\n\n\t\tconst allow_all_filters =\n\t\t\tthis.options.allowAllFilters ?? graph.options.allowAllFilters\n\n\t\tconst effective_filters = allow_all_filters ? true : filters\n\n\t\tif (effective_filters) {\n\t\t\tquery = apply_filters<Orm, Context>(query, {\n\t\t\t\tfilters: effective_filters,\n\t\t\t\tmodifiers: this.modifiers,\n\t\t\t\tcontext,\n\t\t\t})\n\t\t}\n\n\t\tif (transform) {\n\t\t\tquery = run_after_query(this.orm, query, (instance) => {\n\t\t\t\treturn transform(instance, context)\n\t\t\t})\n\t\t}\n\n\t\tquery = this.orm.prevent_select_all(query)\n\n\t\treturn query\n\t}\n\n\t/**\n\t * Create field resolver which will modify query to resolve GraphQL field.\n\t */\n\t_get_default_field_resolver(\n\t\tfield: string,\n\t\ttableField?: string,\n\t): FieldResolver<Orm, Context> {\n\t\tconst table_field_lookup = tableField || field\n\t\tif (\n\t\t\tthis.options.modifiers?.[table_field_lookup] ||\n\t\t\tthis.virtual_fields.has(table_field_lookup)\n\t\t) {\n\t\t\t// Keep query as is.\n\t\t\treturn (query) => query\n\t\t} else if (this.relations.has(table_field_lookup)) {\n\t\t\t// TODO: pre-create and cache\n\t\t\treturn defineRelationResolver({ tableField })\n\t\t} else {\n\t\t\t// TODO: create simplified resolver?\n\t\t\treturn defineFieldResolver({ tableField })\n\t\t}\n\t}\n}\n","import { OrmAdapter } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\nimport { DbTable, raw } from \"orchid-orm\"\n\nexport type OrchidOrm = OrmAdapter<\n\tDbTable<any>,\n\tQuery,\n\t// TODO: Type as QueryTransform once it's published.\n\tPick<Promise<any>, \"then\" | \"catch\">\n>\n\nexport const orm: OrchidOrm = {\n\tTable: undefined as unknown as OrchidOrm[\"Table\"],\n\tQuery: undefined as unknown as OrchidOrm[\"Query\"],\n\tQueryTransform: undefined as unknown as OrchidOrm[\"QueryTransform\"],\n\n\t// Reflection\n\n\tget_table_table(table) {\n\t\treturn table.table\n\t},\n\n\tget_table_relations(table) {\n\t\treturn Object.keys(table.relations)\n\t},\n\n\tget_table_virtual_fields() {\n\t\t// Not supported by Orchid.\n\t\treturn []\n\t},\n\n\tget_table_modifiers() {\n\t\treturn undefined\n\t},\n\n\tget_query_table(query) {\n\t\tif (!query.table) {\n\t\t\tthrow new Error(\"Query must have table.\")\n\t\t}\n\t\treturn query.table\n\t},\n\n\t// Select\n\n\tselect_field(query, { field, as }) {\n\t\treturn query.select({ [as]: field })\n\t},\n\n\tselect_relation(query, { relation, as, modify }) {\n\t\treturn query.select({\n\t\t\t[as]: (q) => modify((q as any)[relation]),\n\t\t})\n\t},\n\n\t// Find\n\n\twhere(query, field, op, value) {\n\t\treturn query.where({ [field]: op ? { [op]: value } : value })\n\t},\n\n\twhere_raw(query, expression, bindings) {\n\t\treturn query.where(raw({ raw: expression, values: bindings }))\n\t},\n\n\t// Order & Limit\n\n\treset_query_order(query) {\n\t\treturn query.clear(\"order\")\n\t},\n\n\tadd_query_order(query, field, desc) {\n\t\treturn query.order({ [field]: desc ? \"DESC\" : \"ASC\" })\n\t},\n\n\tset_query_limit(query, limit) {\n\t\treturn query.limit(limit)\n\t},\n\n\t// Pagination helpers\n\n\tset_query_page_result(query, get_page) {\n\t\treturn query.transform((nodes) => get_page(nodes as any))\n\t},\n\n\tmodify_subquery_pagination(subquery) {\n\t\treturn subquery\n\t},\n\n\tfinish_query_pagination(query) {\n\t\treturn query\n\t},\n\n\t// Misc\n\n\trun_after_query(query, fn) {\n\t\treturn query.afterQuery((data) => fn(data))\n\t},\n\n\tprevent_select_all(query) {\n\t\t// Not needed in Orchid\n\t\treturn query\n\t},\n}\n","import { GraphResolver, GraphResolverOptions, TableResolver } from \"graphql-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function createGraphResolver<Context = unknown>(\n\ttypes: Record<string, TableResolver<OrchidOrm, Context>>,\n\toptions?: GraphResolverOptions<OrchidOrm, Context>,\n) {\n\treturn new GraphResolver<OrchidOrm, Context>(orm, types, options)\n}\n","import { TableResolver, TableResolverOptions } from \"graphql-orm\"\nimport { DbTable, Table } from \"orchid-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function defineTableResolver<TableT extends Table, Context = unknown>(\n\ttable: DbTable<TableT>,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {},\n) {\n\treturn new TableResolver(orm, table as unknown as DbTable<any>, options)\n}\n"],"mappings":"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","names":["orm","cursor","orm","orm","type","orm"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { GraphQLResolveInfo } from 'graphql';
|
|
2
|
-
import {
|
|
3
|
-
import { Query } from '
|
|
2
|
+
import { ResolveTree } from 'graphql-parse-resolve-info';
|
|
3
|
+
import { DbTable, Query, Table } from 'orchid-orm';
|
|
4
4
|
|
|
5
5
|
interface FieldResolverOptions<Orm extends OrmAdapter, Context> {
|
|
6
6
|
/** Table field (if different from GraphQL field) */
|
|
@@ -57,20 +57,6 @@ declare class TableResolver<Orm extends OrmAdapter, Context> {
|
|
|
57
57
|
type FiltersDef = boolean;
|
|
58
58
|
type ApplyFiltersModifier<Orm extends OrmAdapter, Context> = (query: Orm["Query"], value: any, context: TableResolveContext<Orm, Context>) => Orm["Query"];
|
|
59
59
|
|
|
60
|
-
interface FieldsByTypeName {
|
|
61
|
-
[str: string]: {
|
|
62
|
-
[str: string]: ResolveTree;
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
interface ResolveTree {
|
|
66
|
-
name: string;
|
|
67
|
-
alias: string;
|
|
68
|
-
args: {
|
|
69
|
-
[str: string]: unknown;
|
|
70
|
-
};
|
|
71
|
-
fieldsByTypeName: FieldsByTypeName;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
60
|
type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<TableResolverOptions<Orm, Context>, "allowAllFields" | "allowAllFilters">;
|
|
75
61
|
interface GraphResolveOptions<Context> {
|
|
76
62
|
info: GraphQLResolveInfo;
|
|
@@ -174,6 +160,6 @@ type OrchidOrm = OrmAdapter<DbTable<any>, Query, Pick<Promise<any>, "then" | "ca
|
|
|
174
160
|
|
|
175
161
|
declare function createGraphResolver<Context = unknown>(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>): GraphResolver<OrchidOrm, Context>;
|
|
176
162
|
|
|
177
|
-
declare function defineTableResolver<Context = unknown>(table: DbTable<
|
|
163
|
+
declare function defineTableResolver<TableT extends Table, Context = unknown>(table: DbTable<TableT>, options?: TableResolverOptions<OrchidOrm, Context>): TableResolver<OrchidOrm, Context>;
|
|
178
164
|
|
|
179
165
|
export { createGraphResolver, defineCursorPaginator as cursor, defineCursorPaginator, defineFieldResolver, definePageResolver, defineRelationResolver, defineTableResolver, defineFieldResolver as field, createGraphResolver as graph, definePageResolver as page, defineRelationResolver as relation, defineTableResolver as table };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { GraphQLResolveInfo } from 'graphql';
|
|
2
|
-
import {
|
|
3
|
-
import { Query } from '
|
|
2
|
+
import { ResolveTree } from 'graphql-parse-resolve-info';
|
|
3
|
+
import { DbTable, Query, Table } from 'orchid-orm';
|
|
4
4
|
|
|
5
5
|
interface FieldResolverOptions<Orm extends OrmAdapter, Context> {
|
|
6
6
|
/** Table field (if different from GraphQL field) */
|
|
@@ -57,20 +57,6 @@ declare class TableResolver<Orm extends OrmAdapter, Context> {
|
|
|
57
57
|
type FiltersDef = boolean;
|
|
58
58
|
type ApplyFiltersModifier<Orm extends OrmAdapter, Context> = (query: Orm["Query"], value: any, context: TableResolveContext<Orm, Context>) => Orm["Query"];
|
|
59
59
|
|
|
60
|
-
interface FieldsByTypeName {
|
|
61
|
-
[str: string]: {
|
|
62
|
-
[str: string]: ResolveTree;
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
interface ResolveTree {
|
|
66
|
-
name: string;
|
|
67
|
-
alias: string;
|
|
68
|
-
args: {
|
|
69
|
-
[str: string]: unknown;
|
|
70
|
-
};
|
|
71
|
-
fieldsByTypeName: FieldsByTypeName;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
60
|
type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<TableResolverOptions<Orm, Context>, "allowAllFields" | "allowAllFilters">;
|
|
75
61
|
interface GraphResolveOptions<Context> {
|
|
76
62
|
info: GraphQLResolveInfo;
|
|
@@ -174,6 +160,6 @@ type OrchidOrm = OrmAdapter<DbTable<any>, Query, Pick<Promise<any>, "then" | "ca
|
|
|
174
160
|
|
|
175
161
|
declare function createGraphResolver<Context = unknown>(types: Record<string, TableResolver<OrchidOrm, Context>>, options?: GraphResolverOptions<OrchidOrm, Context>): GraphResolver<OrchidOrm, Context>;
|
|
176
162
|
|
|
177
|
-
declare function defineTableResolver<Context = unknown>(table: DbTable<
|
|
163
|
+
declare function defineTableResolver<TableT extends Table, Context = unknown>(table: DbTable<TableT>, options?: TableResolverOptions<OrchidOrm, Context>): TableResolver<OrchidOrm, Context>;
|
|
178
164
|
|
|
179
165
|
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
|
@@ -123,289 +123,8 @@ function defineFieldResolver(options = {}) {
|
|
|
123
123
|
};
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
// ../graphql-orm/src/utils/graphql-parse-resolve-info.ts
|
|
127
|
-
import assert from "node:assert";
|
|
128
|
-
import {
|
|
129
|
-
getNamedType,
|
|
130
|
-
GraphQLObjectType,
|
|
131
|
-
GraphQLUnionType,
|
|
132
|
-
isCompositeType
|
|
133
|
-
} from "graphql";
|
|
134
|
-
import { getArgumentValues } from "graphql";
|
|
135
|
-
|
|
136
|
-
// ../graphql-orm/src/utils/graphql-parse-resolve-info-debug.ts
|
|
137
|
-
function debugFactory(name) {
|
|
138
|
-
function debug2() {
|
|
139
|
-
}
|
|
140
|
-
debug2.enabled = false;
|
|
141
|
-
return debug2;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// ../graphql-orm/src/utils/graphql-parse-resolve-info.ts
|
|
145
|
-
var debug = debugFactory("graphql-parse-resolve-info");
|
|
146
|
-
var DEBUG_ENABLED = debug.enabled;
|
|
147
|
-
function getArgVal(resolveInfo, argument) {
|
|
148
|
-
if (argument.kind === "Variable") {
|
|
149
|
-
return resolveInfo.variableValues[argument.name.value];
|
|
150
|
-
} else if (argument.kind === "BooleanValue") {
|
|
151
|
-
return argument.value;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
function argNameIsIf(arg) {
|
|
155
|
-
return arg && arg.name ? arg.name.value === "if" : false;
|
|
156
|
-
}
|
|
157
|
-
function skipField(resolveInfo, { directives = [] }) {
|
|
158
|
-
let skip = false;
|
|
159
|
-
directives.forEach((directive) => {
|
|
160
|
-
const directiveName = directive.name.value;
|
|
161
|
-
if (Array.isArray(directive.arguments)) {
|
|
162
|
-
const ifArgumentAst = directive.arguments.find(argNameIsIf);
|
|
163
|
-
if (ifArgumentAst) {
|
|
164
|
-
const argumentValueAst = ifArgumentAst.value;
|
|
165
|
-
if (directiveName === "skip") {
|
|
166
|
-
skip = skip || getArgVal(resolveInfo, argumentValueAst);
|
|
167
|
-
} else if (directiveName === "include") {
|
|
168
|
-
skip = skip || !getArgVal(resolveInfo, argumentValueAst);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
return skip;
|
|
174
|
-
}
|
|
175
|
-
function parseResolveInfo(resolveInfo, inOptions = {}) {
|
|
176
|
-
const fieldNodes = (
|
|
177
|
-
// @ts-ignore Property 'fieldASTs' does not exist on type 'GraphQLResolveInfo'.
|
|
178
|
-
resolveInfo.fieldNodes || resolveInfo.fieldASTs
|
|
179
|
-
);
|
|
180
|
-
const options = inOptions === true ? {} : inOptions;
|
|
181
|
-
const forceParse = inOptions === true || inOptions.forceParse;
|
|
182
|
-
const { parentType } = resolveInfo;
|
|
183
|
-
if (!fieldNodes) {
|
|
184
|
-
throw new Error("No fieldNodes provided!");
|
|
185
|
-
}
|
|
186
|
-
if (options.keepRoot == null) {
|
|
187
|
-
options.keepRoot = false;
|
|
188
|
-
}
|
|
189
|
-
if (options.deep == null) {
|
|
190
|
-
options.deep = true;
|
|
191
|
-
}
|
|
192
|
-
const tree = fieldTreeFromAST(
|
|
193
|
-
fieldNodes,
|
|
194
|
-
resolveInfo,
|
|
195
|
-
void 0,
|
|
196
|
-
options,
|
|
197
|
-
parentType
|
|
198
|
-
);
|
|
199
|
-
if (!options.keepRoot) {
|
|
200
|
-
const typeKey = firstKey(tree);
|
|
201
|
-
if (!typeKey) {
|
|
202
|
-
if (forceParse) {
|
|
203
|
-
throw new Error(
|
|
204
|
-
`GraphQL schema issue: simplified parseResolveInfo failed (tree had no keys); perhaps you need to use the keepRoot option?`
|
|
205
|
-
);
|
|
206
|
-
}
|
|
207
|
-
return null;
|
|
208
|
-
}
|
|
209
|
-
const fields = tree[typeKey];
|
|
210
|
-
const fieldKey = firstKey(fields);
|
|
211
|
-
if (!fieldKey) {
|
|
212
|
-
if (forceParse) {
|
|
213
|
-
throw new Error(
|
|
214
|
-
`GraphQL schema issue: simplified parseResolveInfo failed (could not get key from fields); perhaps you need to use the keepRoot option?`
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
return null;
|
|
218
|
-
}
|
|
219
|
-
return fields[fieldKey];
|
|
220
|
-
}
|
|
221
|
-
return tree;
|
|
222
|
-
}
|
|
223
|
-
function getFieldFromAST(ast, parentType) {
|
|
224
|
-
if (ast.kind === "Field") {
|
|
225
|
-
const fieldNode = ast;
|
|
226
|
-
const fieldName = fieldNode.name.value;
|
|
227
|
-
if (!(parentType instanceof GraphQLUnionType)) {
|
|
228
|
-
const type = parentType;
|
|
229
|
-
return type.getFields()[fieldName];
|
|
230
|
-
} else {
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return void 0;
|
|
234
|
-
}
|
|
235
|
-
var iNum = 1;
|
|
236
|
-
function fieldTreeFromAST(inASTs, resolveInfo, initTree = {}, options = {}, parentType, depth = "") {
|
|
237
|
-
const instance = iNum++;
|
|
238
|
-
if (DEBUG_ENABLED)
|
|
239
|
-
debug(
|
|
240
|
-
"%s[%d] Entering fieldTreeFromAST with parent type '%s'",
|
|
241
|
-
depth,
|
|
242
|
-
instance,
|
|
243
|
-
parentType
|
|
244
|
-
);
|
|
245
|
-
const { variableValues } = resolveInfo;
|
|
246
|
-
const fragments = resolveInfo.fragments || {};
|
|
247
|
-
const asts = Array.isArray(inASTs) ? inASTs : [inASTs];
|
|
248
|
-
if (!initTree[parentType.name]) {
|
|
249
|
-
initTree[parentType.name] = {};
|
|
250
|
-
}
|
|
251
|
-
const outerDepth = depth;
|
|
252
|
-
return asts.reduce((tree, selectionVal, idx) => {
|
|
253
|
-
const depth2 = DEBUG_ENABLED ? `${outerDepth} ` : null;
|
|
254
|
-
if (DEBUG_ENABLED)
|
|
255
|
-
debug(
|
|
256
|
-
"%s[%d] Processing AST %d of %d; kind = %s",
|
|
257
|
-
depth2,
|
|
258
|
-
instance,
|
|
259
|
-
idx + 1,
|
|
260
|
-
asts.length,
|
|
261
|
-
selectionVal.kind
|
|
262
|
-
);
|
|
263
|
-
if (skipField(resolveInfo, selectionVal)) {
|
|
264
|
-
if (DEBUG_ENABLED)
|
|
265
|
-
debug("%s[%d] IGNORING due to directive", depth2, instance);
|
|
266
|
-
} else if (selectionVal.kind === "Field") {
|
|
267
|
-
const val = selectionVal;
|
|
268
|
-
const name = val.name.value;
|
|
269
|
-
const isReserved = name[0] === "_" && name[1] === "_" && name !== "__id";
|
|
270
|
-
if (isReserved) {
|
|
271
|
-
if (DEBUG_ENABLED)
|
|
272
|
-
debug(
|
|
273
|
-
"%s[%d] IGNORING because field '%s' is reserved",
|
|
274
|
-
depth2,
|
|
275
|
-
instance,
|
|
276
|
-
name
|
|
277
|
-
);
|
|
278
|
-
} else {
|
|
279
|
-
const alias = val.alias && val.alias.value ? val.alias.value : name;
|
|
280
|
-
if (DEBUG_ENABLED)
|
|
281
|
-
debug(
|
|
282
|
-
"%s[%d] Field '%s' (alias = '%s')",
|
|
283
|
-
depth2,
|
|
284
|
-
instance,
|
|
285
|
-
name,
|
|
286
|
-
alias
|
|
287
|
-
);
|
|
288
|
-
const field = getFieldFromAST(val, parentType);
|
|
289
|
-
if (field == null) {
|
|
290
|
-
return tree;
|
|
291
|
-
}
|
|
292
|
-
const fieldGqlTypeOrUndefined = getNamedType(field.type);
|
|
293
|
-
if (!fieldGqlTypeOrUndefined) {
|
|
294
|
-
return tree;
|
|
295
|
-
}
|
|
296
|
-
const fieldGqlType = fieldGqlTypeOrUndefined;
|
|
297
|
-
const args = getArgumentValues(
|
|
298
|
-
field,
|
|
299
|
-
val,
|
|
300
|
-
variableValues
|
|
301
|
-
) || {};
|
|
302
|
-
if (parentType.name && !tree[parentType.name][alias]) {
|
|
303
|
-
const newTreeRoot = {
|
|
304
|
-
name,
|
|
305
|
-
alias,
|
|
306
|
-
args,
|
|
307
|
-
fieldsByTypeName: isCompositeType(fieldGqlType) ? {
|
|
308
|
-
[fieldGqlType.name]: {}
|
|
309
|
-
} : {}
|
|
310
|
-
};
|
|
311
|
-
tree[parentType.name][alias] = newTreeRoot;
|
|
312
|
-
}
|
|
313
|
-
const selectionSet = val.selectionSet;
|
|
314
|
-
if (selectionSet != null && options.deep && isCompositeType(fieldGqlType)) {
|
|
315
|
-
const newParentType = fieldGqlType;
|
|
316
|
-
if (DEBUG_ENABLED)
|
|
317
|
-
debug("%s[%d] Recursing into subfields", depth2, instance);
|
|
318
|
-
fieldTreeFromAST(
|
|
319
|
-
selectionSet.selections,
|
|
320
|
-
resolveInfo,
|
|
321
|
-
tree[parentType.name][alias].fieldsByTypeName,
|
|
322
|
-
options,
|
|
323
|
-
newParentType,
|
|
324
|
-
`${depth2} `
|
|
325
|
-
);
|
|
326
|
-
} else {
|
|
327
|
-
if (DEBUG_ENABLED)
|
|
328
|
-
debug("%s[%d] Exiting (no fields to add)", depth2, instance);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
} else if (selectionVal.kind === "FragmentSpread" && options.deep) {
|
|
332
|
-
const val = selectionVal;
|
|
333
|
-
const name = val.name && val.name.value;
|
|
334
|
-
if (DEBUG_ENABLED)
|
|
335
|
-
debug("%s[%d] Fragment spread '%s'", depth2, instance, name);
|
|
336
|
-
const fragment = fragments[name];
|
|
337
|
-
assert(fragment, 'unknown fragment "' + name + '"');
|
|
338
|
-
let fragmentType = parentType;
|
|
339
|
-
if (fragment.typeCondition) {
|
|
340
|
-
fragmentType = getType(resolveInfo, fragment.typeCondition);
|
|
341
|
-
}
|
|
342
|
-
if (fragmentType && isCompositeType(fragmentType)) {
|
|
343
|
-
const newParentType = fragmentType;
|
|
344
|
-
fieldTreeFromAST(
|
|
345
|
-
fragment.selectionSet.selections,
|
|
346
|
-
resolveInfo,
|
|
347
|
-
tree,
|
|
348
|
-
options,
|
|
349
|
-
newParentType,
|
|
350
|
-
`${depth2} `
|
|
351
|
-
);
|
|
352
|
-
}
|
|
353
|
-
} else if (selectionVal.kind === "InlineFragment" && options.deep) {
|
|
354
|
-
const val = selectionVal;
|
|
355
|
-
const fragment = val;
|
|
356
|
-
let fragmentType = parentType;
|
|
357
|
-
if (fragment.typeCondition) {
|
|
358
|
-
fragmentType = getType(resolveInfo, fragment.typeCondition);
|
|
359
|
-
}
|
|
360
|
-
if (DEBUG_ENABLED)
|
|
361
|
-
debug(
|
|
362
|
-
"%s[%d] Inline fragment (parent = '%s', type = '%s')",
|
|
363
|
-
depth2,
|
|
364
|
-
instance,
|
|
365
|
-
parentType,
|
|
366
|
-
fragmentType
|
|
367
|
-
);
|
|
368
|
-
if (fragmentType && isCompositeType(fragmentType)) {
|
|
369
|
-
const newParentType = fragmentType;
|
|
370
|
-
fieldTreeFromAST(
|
|
371
|
-
fragment.selectionSet.selections,
|
|
372
|
-
resolveInfo,
|
|
373
|
-
tree,
|
|
374
|
-
options,
|
|
375
|
-
newParentType,
|
|
376
|
-
`${depth2} `
|
|
377
|
-
);
|
|
378
|
-
}
|
|
379
|
-
} else {
|
|
380
|
-
if (DEBUG_ENABLED)
|
|
381
|
-
debug(
|
|
382
|
-
"%s[%d] IGNORING because kind '%s' not understood",
|
|
383
|
-
depth2,
|
|
384
|
-
instance,
|
|
385
|
-
selectionVal.kind
|
|
386
|
-
);
|
|
387
|
-
}
|
|
388
|
-
return tree;
|
|
389
|
-
}, initTree);
|
|
390
|
-
}
|
|
391
|
-
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
392
|
-
function firstKey(obj) {
|
|
393
|
-
for (const key in obj) {
|
|
394
|
-
if (hasOwnProperty.call(obj, key)) {
|
|
395
|
-
return key;
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
function getType(resolveInfo, typeCondition) {
|
|
400
|
-
const { schema } = resolveInfo;
|
|
401
|
-
const { kind, name } = typeCondition;
|
|
402
|
-
if (kind === "NamedType") {
|
|
403
|
-
const typeName = name.value;
|
|
404
|
-
return schema.getType(typeName);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
|
|
408
126
|
// ../graphql-orm/src/resolvers/graph.ts
|
|
127
|
+
import { parseResolveInfo } from "graphql-parse-resolve-info";
|
|
409
128
|
var GraphResolver = class {
|
|
410
129
|
constructor(orm2, type_resolvers, options = {}) {
|
|
411
130
|
this.orm = orm2;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../graphql-orm/src/paginators/cursor.ts","../../graphql-orm/src/utils/run-after.ts","../../graphql-orm/src/resolvers/field.ts","../../graphql-orm/src/utils/graphql-parse-resolve-info.ts","../../graphql-orm/src/utils/graphql-parse-resolve-info-debug.ts","../../graphql-orm/src/resolvers/graph.ts","../../graphql-orm/src/resolvers/page.ts","../../graphql-orm/src/resolvers/relation.ts","../../graphql-orm/src/utils/is-plain-object.ts","../../graphql-orm/src/filters/filters.ts","../../graphql-orm/src/resolvers/table.ts","../src/orm/orm.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["import { OrmAdapter } from \"../orm/orm\"\nimport { PaginateContext, Paginator } from \"./base\"\n\nexport function defineCursorPaginator(\n\toptions: Partial<CursorPaginatorOptions> = {},\n) {\n\treturn new CursorPaginator(options)\n}\n\nexport interface CursorPaginatorOptions {\n\tfields: string[]\n\ttake: number\n}\n\nexport interface CursorPaginatorArgs {\n\tcursor?: string\n\ttake?: number\n}\n\nexport interface CursorPaginatorPage<M> {\n\tnodes: M[]\n\tcursor?: string\n}\n\nclass CursorPaginator<Orm extends OrmAdapter, Context>\n\timplements Paginator<Orm, Context>\n{\n\treadonly path = [\"nodes\"]\n\treadonly options: CursorPaginatorOptions\n\n\treadonly fields: Array<{\n\t\tname: string\n\t\tdesc: boolean\n\t}>\n\n\tconstructor(options: Partial<CursorPaginatorOptions> = {}) {\n\t\tthis.options = {\n\t\t\tfields: [\"id\"],\n\t\t\ttake: 10,\n\t\t\t...options,\n\t\t}\n\t\tthis.fields = this.options.fields.map((field) => {\n\t\t\tif (field.startsWith(\"-\")) {\n\t\t\t\treturn { name: field.slice(1), desc: true }\n\t\t\t} else {\n\t\t\t\treturn { name: field, desc: false }\n\t\t\t}\n\t\t})\n\t}\n\n\tpaginate(query: Orm[\"Query\"], context: PaginateContext<Orm, Context>) {\n\t\tconst { orm } = context.graph\n\t\tconst { args } = context.tree\n\n\t\tconst take = (args.take as number | undefined) ?? this.options.take\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\t// Set query order\n\t\tquery = orm.reset_query_order(query)\n\t\tfor (const field of this.fields) {\n\t\t\t// TODO: prevent potential name clash with aliases like .as(`_${table_ref}_order_key_0`)\n\t\t\tquery = orm.select_field(query, { field: field.name, as: field.name })\n\t\t\tquery = orm.add_query_order(query, field.name, field.desc)\n\t\t}\n\n\t\tif (cursor) {\n\t\t\tconst { expression, bindings } = this._parse_cursor(cursor)\n\t\t\tquery = orm.where_raw(query, expression, bindings)\n\t\t}\n\t\tquery = orm.set_query_limit(query, take + 1)\n\n\t\treturn orm.set_query_page_result(query, (nodes) => {\n\t\t\tlet cursor: string | undefined\n\t\t\tif (nodes.length > take) {\n\t\t\t\tcursor = this._create_cursor(nodes[take - 1])\n\t\t\t\tnodes = nodes.slice(0, take)\n\t\t\t}\n\t\t\treturn { nodes, cursor }\n\t\t})\n\t}\n\n\t_create_cursor(instance: any) {\n\t\treturn JSON.stringify(\n\t\t\tthis.fields.map((field) => {\n\t\t\t\tconst value = instance[field.name]\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unable to create cursor: undefined field ${field.name}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn String(value)\n\t\t\t}),\n\t\t)\n\t}\n\n\t_parse_cursor(cursor: string) {\n\t\tconst values = JSON.parse(cursor)\n\t\tconst left: string[] = []\n\t\tconst right: string[] = []\n\t\tconst bindings: Record<string, any> = {}\n\t\tfor (let i = 0; i < this.fields.length; ++i) {\n\t\t\tconst field = this.fields[i]\n\t\t\tconst expressions = field.desc ? right : left\n\t\t\tconst placeholders = field.desc ? left : right\n\t\t\texpressions.push(`\"${field.name}\"`)\n\t\t\tplaceholders.push(\"$\" + field.name)\n\t\t\tbindings[field.name] = values[i]\n\t\t}\n\t\treturn {\n\t\t\texpression: `(${left.join(\",\")}) > (${right.join(\",\")})`,\n\t\t\tbindings,\n\t\t}\n\t}\n}\n","import { OrmAdapter } from \"../orm/orm\"\n\nexport function run_after_query<Orm extends OrmAdapter>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\ttransform: (instance: any) => any,\n): Orm[\"Query\"] {\n\treturn orm.run_after_query(query, async (result) => {\n\t\t// FIXME: returning result is ignored in orchid (unlike objection). Add some hacks instead.\n\t\tif (Array.isArray(result)) {\n\t\t\tconst result1 = await Promise.all(result.map(transform))\n\t\t\treturn result1.filter(Boolean) // Skip empty objects\n\t\t} else if (result) {\n\t\t\treturn transform(result)\n\t\t} else {\n\t\t\t// Supposedly, single query returning NULL\n\t\t\treturn result\n\t\t}\n\t})\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { TableResolveContext } from \"./table\"\n\nexport interface FieldResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** Table field (if different from GraphQL field) */\n\ttableField?: string\n\t/** Legacy alias for `tableField`. */\n\tmodelField?: string\n\t/** Custom query modifier (if different than simply selecting a field). */\n\tmodify?: FieldResolveModifier<Orm, Context>\n\t/** Post-process selected value. Return a new value or a promise. */\n\ttransform?(\n\t\tvalue: any,\n\t\tinstance: any,\n\t\tcontext: FieldResolveContext<Orm, Context>,\n\t): any\n}\n\nexport type FieldResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: FieldResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface FieldResolveContext<Orm extends OrmAdapter, Context>\n\textends TableResolveContext<Orm, Context> {\n\t/** GraphQL field */\n\tfield: string\n}\n\n// That is a coincidence for now.\nexport type FieldResolver<\n\tOrm extends OrmAdapter,\n\tContext,\n> = FieldResolveModifier<Orm, Context>\n\nexport function parse_field_options<\n\tO extends Pick<FieldResolverOptions<any, any>, \"modelField\" | \"tableField\">,\n>(options: O): Omit<O, \"modelField\"> {\n\tconst { tableField, modelField } = options\n\tif (tableField && modelField) {\n\t\tthrow new Error(\n\t\t\t`Both tableField and modelField are defined. Use only one of them.`,\n\t\t)\n\t}\n\treturn { ...options, tableField: tableField || modelField }\n}\n\nexport function defineFieldResolver<Orm extends OrmAdapter, Context>(\n\toptions: FieldResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify, transform } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { field } = context\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t} else {\n\t\t\tquery = context.graph.orm.select_field(query, {\n\t\t\t\tfield: tableField || field,\n\t\t\t\tas: field,\n\t\t\t})\n\t\t}\n\t\tif (transform) {\n\t\t\tquery = run_after_query(context.graph.orm, query, async (instance) => {\n\t\t\t\tinstance[field] = await transform(instance[field], instance, context)\n\t\t\t\treturn instance\n\t\t\t})\n\t\t}\n\t\treturn query\n\t}\n}\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\n//\n// Copy of graphql-parse-resolve-info.\n//\n// Copy/paste from https://github.com/graphile/graphile-engine/blob/9d6c29e3505844ca64020fb6850093a7678a0fa4/packages/graphql-parse-resolve-info/src/index.ts\n// with import fixes.\n//\n// The original graphql-parse-resolve-info lists graphql 14 as a peer dependency.\n// Copy/pasting it here prevents unmet peer dependency errors in projects using graphql-orm.\n//\n// Uses fake debug instead of npm debug (via tsconfig.paths)\n\nimport assert from \"node:assert\"\n\nimport {\n\tASTNode,\n\tFieldNode,\n\tFragmentSpreadNode,\n\tgetNamedType,\n\tGraphQLCompositeType,\n\tGraphQLField,\n\tGraphQLInterfaceType,\n\tGraphQLNamedType,\n\tGraphQLObjectType,\n\tGraphQLResolveInfo,\n\tGraphQLType,\n\tGraphQLUnionType,\n\tInlineFragmentNode,\n\tisCompositeType,\n\tNamedTypeNode,\n\tSelectionNode,\n} from \"graphql\"\nimport { getArgumentValues } from \"graphql\"\n\nimport debugFactory from \"./graphql-parse-resolve-info-debug\"\n\nexport interface FieldsByTypeName {\n\t[str: string]: {\n\t\t[str: string]: ResolveTree\n\t}\n}\n\nexport interface ResolveTree {\n\tname: string\n\talias: string\n\targs: {\n\t\t[str: string]: unknown\n\t}\n\tfieldsByTypeName: FieldsByTypeName\n}\n\nconst debug = debugFactory(\"graphql-parse-resolve-info\")\n\nconst DEBUG_ENABLED = debug.enabled\n\nfunction getArgVal(resolveInfo: GraphQLResolveInfo, argument: any) {\n\tif (argument.kind === \"Variable\") {\n\t\treturn resolveInfo.variableValues[argument.name.value]\n\t} else if (argument.kind === \"BooleanValue\") {\n\t\treturn argument.value\n\t}\n}\n\nfunction argNameIsIf(arg: any): boolean {\n\treturn arg && arg.name ? arg.name.value === \"if\" : false\n}\n\nfunction skipField(\n\tresolveInfo: GraphQLResolveInfo,\n\t{ directives = [] }: SelectionNode,\n) {\n\tlet skip = false\n\tdirectives.forEach((directive) => {\n\t\tconst directiveName = directive.name.value\n\t\tif (Array.isArray(directive.arguments)) {\n\t\t\tconst ifArgumentAst = directive.arguments.find(argNameIsIf)\n\t\t\tif (ifArgumentAst) {\n\t\t\t\tconst argumentValueAst = ifArgumentAst.value\n\t\t\t\tif (directiveName === \"skip\") {\n\t\t\t\t\tskip = skip || getArgVal(resolveInfo, argumentValueAst)\n\t\t\t\t} else if (directiveName === \"include\") {\n\t\t\t\t\tskip = skip || !getArgVal(resolveInfo, argumentValueAst)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\treturn skip\n}\n\n// Originally based on https://github.com/tjmehta/graphql-parse-fields\n\nexport function getAliasFromResolveInfo(\n\tresolveInfo: GraphQLResolveInfo,\n): string {\n\tconst asts: ReadonlyArray<FieldNode> =\n\t\t// @ts-ignore Property 'fieldASTs' does not exist on type 'GraphQLResolveInfo'.\n\t\tresolveInfo.fieldNodes || resolveInfo.fieldASTs\n\tfor (let i = 0, l = asts.length; i < l; i++) {\n\t\tconst val = asts[i]\n\t\tif (val.kind === \"Field\") {\n\t\t\tconst alias = val.alias ? val.alias.value : val.name && val.name.value\n\t\t\tif (alias) {\n\t\t\t\treturn alias\n\t\t\t}\n\t\t}\n\t}\n\tthrow new Error(\"Could not determine alias?!\")\n}\n\nexport interface ParseOptions {\n\tkeepRoot?: boolean\n\tdeep?: boolean\n\tforceParse?: boolean\n}\n\nexport function parseResolveInfo(\n\tresolveInfo: GraphQLResolveInfo,\n): ResolveTree | null\nexport function parseResolveInfo(\n\tresolveInfo: GraphQLResolveInfo,\n\tforceParse: true,\n): ResolveTree\nexport function parseResolveInfo(\n\tresolveInfo: GraphQLResolveInfo,\n\toptions: ParseOptions,\n): ResolveTree | FieldsByTypeName | null | void\nexport function parseResolveInfo(\n\tresolveInfo: GraphQLResolveInfo,\n\tinOptions: ParseOptions | true = {},\n): ResolveTree | FieldsByTypeName | null | void {\n\tconst fieldNodes: ReadonlyArray<FieldNode> =\n\t\t// @ts-ignore Property 'fieldASTs' does not exist on type 'GraphQLResolveInfo'.\n\t\tresolveInfo.fieldNodes || resolveInfo.fieldASTs\n\tconst options = inOptions === true ? {} : inOptions\n\tconst forceParse = inOptions === true || inOptions.forceParse\n\n\tconst { parentType } = resolveInfo\n\tif (!fieldNodes) {\n\t\tthrow new Error(\"No fieldNodes provided!\")\n\t}\n\tif (options.keepRoot == null) {\n\t\toptions.keepRoot = false\n\t}\n\tif (options.deep == null) {\n\t\toptions.deep = true\n\t}\n\tconst tree = fieldTreeFromAST(\n\t\tfieldNodes,\n\t\tresolveInfo,\n\t\tundefined,\n\t\toptions,\n\t\tparentType,\n\t)\n\tif (!options.keepRoot) {\n\t\tconst typeKey = firstKey(tree)\n\t\tif (!typeKey) {\n\t\t\tif (forceParse) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`GraphQL schema issue: simplified parseResolveInfo failed (tree had no keys); perhaps you need to use the keepRoot option?`,\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\t\tconst fields = tree[typeKey]\n\t\tconst fieldKey = firstKey(fields)\n\t\tif (!fieldKey) {\n\t\t\tif (forceParse) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`GraphQL schema issue: simplified parseResolveInfo failed (could not get key from fields); perhaps you need to use the keepRoot option?`,\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\t\treturn fields[fieldKey]\n\t}\n\treturn tree\n}\n\nfunction getFieldFromAST<TContext>(\n\tast: ASTNode,\n\tparentType: GraphQLCompositeType,\n): GraphQLField<GraphQLCompositeType, TContext> | undefined {\n\tif (ast.kind === \"Field\") {\n\t\tconst fieldNode: FieldNode = ast\n\t\tconst fieldName = fieldNode.name.value\n\t\tif (!(parentType instanceof GraphQLUnionType)) {\n\t\t\tconst type: GraphQLObjectType | GraphQLInterfaceType = parentType\n\t\t\treturn type.getFields()[fieldName]\n\t\t} else {\n\t\t\t// XXX: TODO: Handle GraphQLUnionType\n\t\t}\n\t}\n\treturn undefined\n}\n\nlet iNum = 1\nfunction fieldTreeFromAST<T extends SelectionNode>(\n\tinASTs: ReadonlyArray<T> | T,\n\tresolveInfo: GraphQLResolveInfo,\n\tinitTree: FieldsByTypeName = {},\n\toptions: ParseOptions = {},\n\tparentType: GraphQLCompositeType,\n\tdepth = \"\",\n): FieldsByTypeName {\n\tconst instance = iNum++\n\tif (DEBUG_ENABLED)\n\t\tdebug(\n\t\t\t\"%s[%d] Entering fieldTreeFromAST with parent type '%s'\",\n\t\t\tdepth,\n\t\t\tinstance,\n\t\t\tparentType,\n\t\t)\n\tconst { variableValues } = resolveInfo\n\tconst fragments = resolveInfo.fragments || {}\n\tconst asts: ReadonlyArray<T> = Array.isArray(inASTs) ? inASTs : [inASTs]\n\tif (!initTree[parentType.name]) {\n\t\tinitTree[parentType.name] = {}\n\t}\n\tconst outerDepth = depth\n\treturn asts.reduce((tree, selectionVal: SelectionNode, idx) => {\n\t\tconst depth = DEBUG_ENABLED ? `${outerDepth} ` : null\n\t\tif (DEBUG_ENABLED)\n\t\t\tdebug(\n\t\t\t\t\"%s[%d] Processing AST %d of %d; kind = %s\",\n\t\t\t\tdepth,\n\t\t\t\tinstance,\n\t\t\t\tidx + 1,\n\t\t\t\tasts.length,\n\t\t\t\tselectionVal.kind,\n\t\t\t)\n\t\tif (skipField(resolveInfo, selectionVal)) {\n\t\t\tif (DEBUG_ENABLED)\n\t\t\t\tdebug(\"%s[%d] IGNORING due to directive\", depth, instance)\n\t\t} else if (selectionVal.kind === \"Field\") {\n\t\t\tconst val: FieldNode = selectionVal\n\t\t\tconst name = val.name.value\n\t\t\tconst isReserved = name[0] === \"_\" && name[1] === \"_\" && name !== \"__id\"\n\t\t\tif (isReserved) {\n\t\t\t\tif (DEBUG_ENABLED)\n\t\t\t\t\tdebug(\n\t\t\t\t\t\t\"%s[%d] IGNORING because field '%s' is reserved\",\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tinstance,\n\t\t\t\t\t\tname,\n\t\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tconst alias: string =\n\t\t\t\t\tval.alias && val.alias.value ? val.alias.value : name\n\t\t\t\tif (DEBUG_ENABLED)\n\t\t\t\t\tdebug(\n\t\t\t\t\t\t\"%s[%d] Field '%s' (alias = '%s')\",\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tinstance,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\talias,\n\t\t\t\t\t)\n\t\t\t\tconst field = getFieldFromAST(val, parentType)\n\t\t\t\tif (field == null) {\n\t\t\t\t\treturn tree\n\t\t\t\t}\n\t\t\t\tconst fieldGqlTypeOrUndefined = getNamedType(field.type)\n\t\t\t\tif (!fieldGqlTypeOrUndefined) {\n\t\t\t\t\treturn tree\n\t\t\t\t}\n\t\t\t\tconst fieldGqlType: GraphQLNamedType = fieldGqlTypeOrUndefined\n\t\t\t\tconst args =\n\t\t\t\t\tgetArgumentValues(\n\t\t\t\t\t\tfield as GraphQLField<unknown, unknown>,\n\t\t\t\t\t\tval,\n\t\t\t\t\t\tvariableValues,\n\t\t\t\t\t) || {}\n\t\t\t\tif (parentType.name && !tree[parentType.name][alias]) {\n\t\t\t\t\tconst newTreeRoot: ResolveTree = {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\talias,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\tfieldsByTypeName: isCompositeType(fieldGqlType)\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t[fieldGqlType.name]: {},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {},\n\t\t\t\t\t}\n\t\t\t\t\ttree[parentType.name][alias] = newTreeRoot\n\t\t\t\t}\n\t\t\t\tconst selectionSet = val.selectionSet\n\t\t\t\tif (\n\t\t\t\t\tselectionSet != null &&\n\t\t\t\t\toptions.deep &&\n\t\t\t\t\tisCompositeType(fieldGqlType)\n\t\t\t\t) {\n\t\t\t\t\tconst newParentType: GraphQLCompositeType = fieldGqlType\n\t\t\t\t\tif (DEBUG_ENABLED)\n\t\t\t\t\t\tdebug(\"%s[%d] Recursing into subfields\", depth, instance)\n\t\t\t\t\tfieldTreeFromAST(\n\t\t\t\t\t\tselectionSet.selections,\n\t\t\t\t\t\tresolveInfo,\n\t\t\t\t\t\ttree[parentType.name][alias].fieldsByTypeName,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tnewParentType,\n\t\t\t\t\t\t`${depth} `,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\t// No fields to add\n\t\t\t\t\tif (DEBUG_ENABLED)\n\t\t\t\t\t\tdebug(\"%s[%d] Exiting (no fields to add)\", depth, instance)\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (selectionVal.kind === \"FragmentSpread\" && options.deep) {\n\t\t\tconst val: FragmentSpreadNode = selectionVal\n\t\t\tconst name = val.name && val.name.value\n\t\t\tif (DEBUG_ENABLED)\n\t\t\t\tdebug(\"%s[%d] Fragment spread '%s'\", depth, instance, name)\n\t\t\tconst fragment = fragments[name]\n\t\t\tassert(fragment, 'unknown fragment \"' + name + '\"')\n\t\t\tlet fragmentType: GraphQLNamedType | null | undefined = parentType\n\t\t\tif (fragment.typeCondition) {\n\t\t\t\tfragmentType = getType(resolveInfo, fragment.typeCondition)\n\t\t\t}\n\t\t\tif (fragmentType && isCompositeType(fragmentType)) {\n\t\t\t\tconst newParentType: GraphQLCompositeType = fragmentType\n\t\t\t\tfieldTreeFromAST(\n\t\t\t\t\tfragment.selectionSet.selections,\n\t\t\t\t\tresolveInfo,\n\t\t\t\t\ttree,\n\t\t\t\t\toptions,\n\t\t\t\t\tnewParentType,\n\t\t\t\t\t`${depth} `,\n\t\t\t\t)\n\t\t\t}\n\t\t} else if (selectionVal.kind === \"InlineFragment\" && options.deep) {\n\t\t\tconst val: InlineFragmentNode = selectionVal\n\t\t\tconst fragment = val\n\t\t\tlet fragmentType: GraphQLNamedType | null | undefined = parentType\n\t\t\tif (fragment.typeCondition) {\n\t\t\t\tfragmentType = getType(resolveInfo, fragment.typeCondition)\n\t\t\t}\n\t\t\tif (DEBUG_ENABLED)\n\t\t\t\tdebug(\n\t\t\t\t\t\"%s[%d] Inline fragment (parent = '%s', type = '%s')\",\n\t\t\t\t\tdepth,\n\t\t\t\t\tinstance,\n\t\t\t\t\tparentType,\n\t\t\t\t\tfragmentType,\n\t\t\t\t)\n\t\t\tif (fragmentType && isCompositeType(fragmentType)) {\n\t\t\t\tconst newParentType: GraphQLCompositeType = fragmentType\n\t\t\t\tfieldTreeFromAST(\n\t\t\t\t\tfragment.selectionSet.selections,\n\t\t\t\t\tresolveInfo,\n\t\t\t\t\ttree,\n\t\t\t\t\toptions,\n\t\t\t\t\tnewParentType,\n\t\t\t\t\t`${depth} `,\n\t\t\t\t)\n\t\t\t}\n\t\t} else {\n\t\t\tif (DEBUG_ENABLED)\n\t\t\t\tdebug(\n\t\t\t\t\t\"%s[%d] IGNORING because kind '%s' not understood\",\n\t\t\t\t\tdepth,\n\t\t\t\t\tinstance,\n\t\t\t\t\tselectionVal.kind,\n\t\t\t\t)\n\t\t}\n\t\t// Ref: https://github.com/graphile/postgraphile/pull/342/files#diff-d6702ec9fed755c88b9d70b430fda4d8R148\n\t\treturn tree\n\t}, initTree)\n}\n\nconst hasOwnProperty = Object.prototype.hasOwnProperty\nfunction firstKey(obj: object) {\n\tfor (const key in obj) {\n\t\tif (hasOwnProperty.call(obj, key)) {\n\t\t\treturn key\n\t\t}\n\t}\n}\n\nfunction getType(\n\tresolveInfo: GraphQLResolveInfo,\n\ttypeCondition: NamedTypeNode,\n) {\n\tconst { schema } = resolveInfo\n\tconst { kind, name } = typeCondition\n\tif (kind === \"NamedType\") {\n\t\tconst typeName = name.value\n\t\treturn schema.getType(typeName)\n\t}\n}\n\nexport function simplifyParsedResolveInfoFragmentWithType(\n\tparsedResolveInfoFragment: ResolveTree,\n\ttype: GraphQLType,\n) {\n\tconst { fieldsByTypeName } = parsedResolveInfoFragment\n\tconst fields = {}\n\tconst strippedType = getNamedType(type)\n\tif (isCompositeType(strippedType)) {\n\t\tObject.assign(fields, fieldsByTypeName[strippedType.name])\n\t\tif (strippedType instanceof GraphQLObjectType) {\n\t\t\tconst objectType: GraphQLObjectType = strippedType\n\t\t\t// GraphQL ensures that the subfields cannot clash, so it's safe to simply overwrite them\n\t\t\tfor (const anInterface of objectType.getInterfaces()) {\n\t\t\t\tObject.assign(fields, fieldsByTypeName[anInterface.name])\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\t...parsedResolveInfoFragment,\n\t\tfields,\n\t}\n}\n\nexport const parse = parseResolveInfo\nexport const simplify = simplifyParsedResolveInfoFragmentWithType\nexport const getAlias = getAliasFromResolveInfo\n","// Mimic npm debug (but don't actually have it as a dependency)\n\ninterface DebugFn {\n\t(message: string, ...args: any[]): void\n\tenabled: boolean\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport default function debugFactory(name: string): DebugFn {\n\tfunction debug() {}\n\tdebug.enabled = false\n\treturn debug\n}\n","import type { GraphQLResolveInfo } from \"graphql\"\n\nimport { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\nimport {\n\tparseResolveInfo,\n\ttype ResolveTree,\n} from \"../utils/graphql-parse-resolve-info\"\nimport type { TableResolver, TableResolverOptions } from \"./table\"\n\nexport type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<\n\tTableResolverOptions<Orm, Context>,\n\t\"allowAllFields\" | \"allowAllFilters\"\n>\n\nexport interface GraphResolveOptions<Context> {\n\tinfo: GraphQLResolveInfo\n\tcontext: Context\n\tfilters?: FiltersDef\n\t/** Subfield path if not resolving root query, e.g.: ['user'] */\n\tpath?: string[]\n}\n\nexport type GraphResolveContext<Context> = Omit<\n\tGraphResolveOptions<Context>,\n\t\"info\"\n> & {\n\ttree: ResolveTree\n}\n\nexport class GraphResolver<Orm extends OrmAdapter, Context> {\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly type_resolvers: Record<string, TableResolver<Orm, Context>>,\n\t\treadonly options: GraphResolverOptions<Orm, Context> = {},\n\t) {}\n\n\tresolve(\n\t\tquery: Orm[\"Query\"],\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_type(query, { ...context, tree })\n\t}\n\n\tresolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_page(query, paginator, { ...context, tree })\n\t}\n\n\t_get_resolve_tree(info: GraphQLResolveInfo) {\n\t\treturn parseResolveInfo(info) as ResolveTree\n\t}\n\n\t_resolve_type(query: Orm[\"Query\"], context: GraphResolveContext<Context>) {\n\t\tlet { tree } = context\n\t\t// Dive into subtree if requested.\n\t\tif (context.path) {\n\t\t\tfor (const field of context.path) {\n\t\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t\tif (!tree) {\n\t\t\t\t\t// This graphql field was never requested, ignore.\n\t\t\t\t\t// This happens when a user resolves a graph for a root subfield which was not requested by the client (and is thus not present in the tree).\n\t\t\t\t\t//\n\t\t\t\t\t// FIXME: this break typings contract. We are supposed to return a query.\n\t\t\t\t\t// However, if we advertise to optionally return undefined, this result won't be accepted by upstream graphql tooling types.\n\t\t\t\t\t// This is the least evil I see for now.\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\tconst type_resolver = this.type_resolvers[type]\n\t\tif (!type_resolver) {\n\t\t\tthrow new Error(`Resolver not found for type ${type}.`)\n\t\t}\n\t\treturn type_resolver.resolve(query, {\n\t\t\t...context,\n\t\t\tgraph: this as any,\n\t\t\ttree,\n\t\t\ttype,\n\t\t\tpath: undefined,\n\t\t})\n\t}\n\n\t_resolve_page(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\tcontext: GraphResolveContext<Context>,\n\t) {\n\t\tif (context.path) {\n\t\t\t// TODO: handle non-empty context.path\n\t\t\tthrow new Error(\"Paginating under non-root path not yet supported.\")\n\t\t}\n\t\tquery = this._resolve_type(query, { ...context, path: paginator.path })\n\t\treturn paginator.paginate(query, {\n\t\t\t...context,\n\t\t\tgraph: this as any,\n\t\t})\n\t}\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\nimport { FieldResolver, parse_field_options } from \"./field\"\nimport { RelationResolverOptions } from \"./relation\"\n\nexport function definePageResolver<Orm extends OrmAdapter, Context>(\n\tpaginator: Paginator<Orm, Context>,\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\t// Objection.js requires a workaround to handle paginated content,\n\t\t// it must be saved into context and re-injected later.\n\t\t// The modify + finish is a no-op in Orchid.\n\t\tconst pagination_context = {}\n\t\tquery = graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolve_page(subquery, paginator, context)\n\t\t\t\tsubquery = graph.orm.modify_subquery_pagination(\n\t\t\t\t\tsubquery,\n\t\t\t\t\tpagination_context,\n\t\t\t\t)\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t\tquery = graph.orm.finish_query_pagination(query, field, pagination_context)\n\t\treturn query\n\t}\n}\n","import { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport {\n\tFieldResolver,\n\tFieldResolverOptions,\n\tparse_field_options,\n} from \"./field\"\nimport { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Orm extends OrmAdapter, Context>\n\textends Omit<FieldResolverOptions<Orm, Context>, \"modify\"> {\n\tfilters?: FiltersDef\n\tmodify?: TableResolveModifier<Orm, Context>\n}\n\nexport function defineRelationResolver<Orm extends OrmAdapter, Context>(\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, filters, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\treturn graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolve_type(subquery, { ...context, filters })\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t}\n}\n","export function is_plain_object(obj: any): obj is Record<string, any> {\n\treturn typeof obj === \"object\" && !Array.isArray(obj)\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { TableResolveContext } from \"../resolvers/table\"\nimport { is_plain_object } from \"../utils/is-plain-object\"\n\n// TODO: per-field definitions\nexport type FiltersDef = boolean\n\nexport type FilterScalarValue = null | string | number | boolean\nexport type FilterValue = FilterScalarValue | Exclude<FilterScalarValue, null>[]\nexport type Filter = { [property: string]: FilterValue }\n\ninterface ApplyFiltersOptions<Orm extends OrmAdapter, Context> {\n\tfilters: FiltersDef\n\tmodifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\tcontext: TableResolveContext<Orm, Context>\n}\n\nexport type ApplyFiltersModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tvalue: any,\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport function apply_filters<Orm extends OrmAdapter, Context>(\n\tquery: Orm[\"Query\"],\n\t{ filters, modifiers, context }: ApplyFiltersOptions<Orm, Context>,\n): Orm[\"Query\"] {\n\tif (!filters) {\n\t\treturn query\n\t}\n\tconst filter_obj = context.tree.args?.filter\n\tif (!filter_obj) {\n\t\treturn query\n\t}\n\tif (!is_plain_object(filter_obj)) {\n\t\tthrow new Error(`Invalid filter: ${filter_obj}, must be object.`)\n\t}\n\tfor (const [field, value] of Object.entries(filter_obj)) {\n\t\tif (value === undefined) {\n\t\t\t// Support optional GraphQL arguments in filter\n\t\t\tcontinue\n\t\t}\n\t\tif (modifiers?.[field]) {\n\t\t\tquery = modifiers[field](query, value, context)\n\t\t} else {\n\t\t\tconst [table_field, op0] = field.split(\"__\")\n\t\t\tconst op = op0?.toLowerCase()\n\t\t\t// TODO: validate op\n\t\t\tquery = context.graph.orm.where(query, table_field, op, value)\n\t\t}\n\t}\n\treturn query\n}\n","import { apply_filters, ApplyFiltersModifier } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { defineFieldResolver, FieldResolver } from \"./field\"\nimport type { GraphResolveContext, GraphResolver } from \"./graph\"\nimport { defineRelationResolver } from \"./relation\"\n\nexport interface TableResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** allow to resolve all table fields without explicitly listing them */\n\tallowAllFields?: boolean\n\t/** allow to filter all table fields without explicitly listing them */\n\tallowAllFilters?: boolean\n\tfields?: Record<string, SimpleFieldResolver<Orm, Context>>\n\tmodifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\tmodify?: TableResolveModifier<Orm, Context>\n\ttransform?(instance: any, context: any): void | PromiseLike<void>\n}\n\nexport type SimpleFieldResolver<Orm extends OrmAdapter, Context> =\n\t| true\n\t| string\n\t| FieldResolver<Orm, Context>\n\nexport type TableResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface TableResolveContext<Orm extends OrmAdapter, Context>\n\textends GraphResolveContext<Context> {\n\tgraph: GraphResolver<Orm, Context>\n\t/** GraphQL type */\n\ttype: string\n}\n\nexport class TableResolver<Orm extends OrmAdapter, Context> {\n\t// Introspection results\n\treadonly relations: Set<string>\n\treadonly virtual_fields: Set<string>\n\treadonly modifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\n\treadonly table_field_resolvers?: Record<string, FieldResolver<Orm, Context>>\n\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly table: Orm[\"Table\"],\n\t\treadonly options: TableResolverOptions<Orm, Context> = {},\n\t) {\n\t\tthis.relations = new Set(orm.get_table_relations(table))\n\t\tthis.virtual_fields = new Set(orm.get_table_virtual_fields(table))\n\t\tthis.modifiers = { ...orm.get_table_modifiers(table), ...options.modifiers }\n\n\t\t// Pre-create field resolvers\n\t\tconst { fields } = options\n\t\tif (fields) {\n\t\t\tthis.table_field_resolvers = Object.keys(fields).reduce<\n\t\t\t\tRecord<string, FieldResolver<Orm, Context>>\n\t\t\t>((resolvers, field) => {\n\t\t\t\tconst r0 = fields[field]\n\t\t\t\tconst r: FieldResolver<Orm, Context> | undefined =\n\t\t\t\t\ttypeof r0 === \"function\"\n\t\t\t\t\t\t? r0\n\t\t\t\t\t\t: r0 === true\n\t\t\t\t\t\t\t? this._get_default_field_resolver(field)\n\t\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t\t\t? this._get_default_field_resolver(field, r0)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\tif (r === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Field resolver must be a function, string, or true; found ${typeof r0}.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tresolvers[field] = r\n\t\t\t\treturn resolvers\n\t\t\t}, {})\n\t\t}\n\t}\n\n\t/** Modify query to select fields/relations and filter the result set. */\n\tresolve(query: Orm[\"Query\"], context: TableResolveContext<Orm, Context>) {\n\t\tconst { modify, transform } = this.options\n\t\tconst { graph, tree, type, filters } = context\n\n\t\tconst query_table = this.orm.get_query_table(query)\n\t\tconst table_table = this.orm.get_table_table(this.table)\n\n\t\tif (query_table !== table_table) {\n\t\t\tthrow new Error(\n\t\t\t\t`Mismatching query table for type ${type}: expected ${table_table}, received ${query_table}.`,\n\t\t\t)\n\t\t}\n\n\t\tconst allow_all_fields =\n\t\t\tthis.options.allowAllFields ??\n\t\t\tgraph.options.allowAllFields ??\n\t\t\t!this.options.fields\n\n\t\tif (!allow_all_fields && !this.table_field_resolvers) {\n\t\t\tthrow new Error(\n\t\t\t\t`Resolver for type ${type} must either allow all fields or specify options.fields.`,\n\t\t\t)\n\t\t}\n\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t}\n\n\t\tfor (const subtree of Object.values(tree.fieldsByTypeName[type])) {\n\t\t\tconst field = subtree.name\n\t\t\tconst r: FieldResolver<Orm, Context> | undefined =\n\t\t\t\tthis.table_field_resolvers?.[field] ||\n\t\t\t\t(allow_all_fields ? this._get_default_field_resolver(field) : undefined)\n\t\t\tif (!r) {\n\t\t\t\tthrow new Error(`No field resolver defined for field ${type}.${field}.`)\n\t\t\t}\n\t\t\tif (r) {\n\t\t\t\tquery = r(query, { ...context, tree: subtree, field })\n\t\t\t}\n\t\t}\n\n\t\tconst allow_all_filters =\n\t\t\tthis.options.allowAllFilters ?? graph.options.allowAllFilters\n\n\t\tconst effective_filters = allow_all_filters ? true : filters\n\n\t\tif (effective_filters) {\n\t\t\tquery = apply_filters<Orm, Context>(query, {\n\t\t\t\tfilters: effective_filters,\n\t\t\t\tmodifiers: this.modifiers,\n\t\t\t\tcontext,\n\t\t\t})\n\t\t}\n\n\t\tif (transform) {\n\t\t\tquery = run_after_query(this.orm, query, (instance) => {\n\t\t\t\treturn transform(instance, context)\n\t\t\t})\n\t\t}\n\n\t\tquery = this.orm.prevent_select_all(query)\n\n\t\treturn query\n\t}\n\n\t/**\n\t * Create field resolver which will modify query to resolve GraphQL field.\n\t */\n\t_get_default_field_resolver(\n\t\tfield: string,\n\t\ttableField?: string,\n\t): FieldResolver<Orm, Context> {\n\t\tconst table_field_lookup = tableField || field\n\t\tif (\n\t\t\tthis.options.modifiers?.[table_field_lookup] ||\n\t\t\tthis.virtual_fields.has(table_field_lookup)\n\t\t) {\n\t\t\t// Keep query as is.\n\t\t\treturn (query) => query\n\t\t} else if (this.relations.has(table_field_lookup)) {\n\t\t\t// TODO: pre-create and cache\n\t\t\treturn defineRelationResolver({ tableField })\n\t\t} else {\n\t\t\t// TODO: create simplified resolver?\n\t\t\treturn defineFieldResolver({ tableField })\n\t\t}\n\t}\n}\n","import { OrmAdapter } from \"graphql-orm\"\nimport { DbTable, raw } from \"orchid-orm\"\nimport type { Query } from \"pqb\"\n\nexport type OrchidOrm = OrmAdapter<\n\tDbTable<any>,\n\tQuery,\n\t// TODO: Type as QueryTransform once it's published.\n\tPick<Promise<any>, \"then\" | \"catch\">\n>\n\nexport const orm: OrchidOrm = {\n\tTable: undefined as unknown as OrchidOrm[\"Table\"],\n\tQuery: undefined as unknown as OrchidOrm[\"Query\"],\n\tQueryTransform: undefined as unknown as OrchidOrm[\"QueryTransform\"],\n\n\t// Reflection\n\n\tget_table_table(table) {\n\t\treturn table.table\n\t},\n\n\tget_table_relations(table) {\n\t\treturn Object.keys(table.relations)\n\t},\n\n\tget_table_virtual_fields() {\n\t\t// Not supported by Orchid.\n\t\treturn []\n\t},\n\n\tget_table_modifiers() {\n\t\treturn undefined\n\t},\n\n\tget_query_table(query) {\n\t\tif (!query.table) {\n\t\t\tthrow new Error(\"Query must have table.\")\n\t\t}\n\t\treturn query.table\n\t},\n\n\t// Select\n\n\tselect_field(query, { field, as }) {\n\t\treturn query.select({ [as]: field })\n\t},\n\n\tselect_relation(query, { relation, as, modify }) {\n\t\treturn query.select({\n\t\t\t[as]: (q) => modify((q as any)[relation]),\n\t\t})\n\t},\n\n\t// Find\n\n\twhere(query, field, op, value) {\n\t\treturn query.where({ [field]: op ? { [op]: value } : value })\n\t},\n\n\twhere_raw(query, expression, bindings) {\n\t\treturn query.where(raw({ raw: expression, values: bindings }))\n\t},\n\n\t// Order & Limit\n\n\treset_query_order(query) {\n\t\treturn query.clear(\"order\")\n\t},\n\n\tadd_query_order(query, field, desc) {\n\t\treturn query.order({ [field]: desc ? \"DESC\" : \"ASC\" })\n\t},\n\n\tset_query_limit(query, limit) {\n\t\treturn query.limit(limit)\n\t},\n\n\t// Pagination helpers\n\n\tset_query_page_result(query, get_page) {\n\t\treturn query.transform((nodes) => get_page(nodes as any))\n\t},\n\n\tmodify_subquery_pagination(subquery) {\n\t\treturn subquery\n\t},\n\n\tfinish_query_pagination(query) {\n\t\treturn query\n\t},\n\n\t// Misc\n\n\trun_after_query(query, fn) {\n\t\treturn query.afterQuery((data) => fn(data))\n\t},\n\n\tprevent_select_all(query) {\n\t\t// Not needed in Orchid\n\t\treturn query\n\t},\n}\n","import { GraphResolver, GraphResolverOptions, TableResolver } from \"graphql-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function createGraphResolver<Context = unknown>(\n\ttypes: Record<string, TableResolver<OrchidOrm, Context>>,\n\toptions?: GraphResolverOptions<OrchidOrm, Context>,\n) {\n\treturn new GraphResolver<OrchidOrm, Context>(orm, types, options)\n}\n","import { TableResolver, TableResolverOptions } from \"graphql-orm\"\nimport { DbTable } 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","debug","depth","orm","type","orm"]}
|
|
1
|
+
{"version":3,"sources":["../../graphql-orm/src/paginators/cursor.ts","../../graphql-orm/src/utils/run-after.ts","../../graphql-orm/src/resolvers/field.ts","../../graphql-orm/src/resolvers/graph.ts","../../graphql-orm/src/resolvers/page.ts","../../graphql-orm/src/resolvers/relation.ts","../../graphql-orm/src/utils/is-plain-object.ts","../../graphql-orm/src/filters/filters.ts","../../graphql-orm/src/resolvers/table.ts","../src/orm/orm.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["import { OrmAdapter } from \"../orm/orm\"\nimport { PaginateContext, Paginator } from \"./base\"\n\nexport function defineCursorPaginator(\n\toptions: Partial<CursorPaginatorOptions> = {},\n) {\n\treturn new CursorPaginator(options)\n}\n\nexport interface CursorPaginatorOptions {\n\tfields: string[]\n\ttake: number\n}\n\nexport interface CursorPaginatorArgs {\n\tcursor?: string\n\ttake?: number\n}\n\nexport interface CursorPaginatorPage<M> {\n\tnodes: M[]\n\tcursor?: string\n}\n\nclass CursorPaginator<Orm extends OrmAdapter, Context>\n\timplements Paginator<Orm, Context>\n{\n\treadonly path = [\"nodes\"]\n\treadonly options: CursorPaginatorOptions\n\n\treadonly fields: Array<{\n\t\tname: string\n\t\tdesc: boolean\n\t}>\n\n\tconstructor(options: Partial<CursorPaginatorOptions> = {}) {\n\t\tthis.options = {\n\t\t\tfields: [\"id\"],\n\t\t\ttake: 10,\n\t\t\t...options,\n\t\t}\n\t\tthis.fields = this.options.fields.map((field) => {\n\t\t\tif (field.startsWith(\"-\")) {\n\t\t\t\treturn { name: field.slice(1), desc: true }\n\t\t\t} else {\n\t\t\t\treturn { name: field, desc: false }\n\t\t\t}\n\t\t})\n\t}\n\n\tpaginate(query: Orm[\"Query\"], context: PaginateContext<Orm, Context>) {\n\t\tconst { orm } = context.graph\n\t\tconst { args } = context.tree\n\n\t\tconst take = (args.take as number | undefined) ?? this.options.take\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\t// Set query order\n\t\tquery = orm.reset_query_order(query)\n\t\tfor (const field of this.fields) {\n\t\t\t// TODO: prevent potential name clash with aliases like .as(`_${table_ref}_order_key_0`)\n\t\t\tquery = orm.select_field(query, { field: field.name, as: field.name })\n\t\t\tquery = orm.add_query_order(query, field.name, field.desc)\n\t\t}\n\n\t\tif (cursor) {\n\t\t\tconst { expression, bindings } = this._parse_cursor(cursor)\n\t\t\tquery = orm.where_raw(query, expression, bindings)\n\t\t}\n\t\tquery = orm.set_query_limit(query, take + 1)\n\n\t\treturn orm.set_query_page_result(query, (nodes) => {\n\t\t\tlet cursor: string | undefined\n\t\t\tif (nodes.length > take) {\n\t\t\t\tcursor = this._create_cursor(nodes[take - 1])\n\t\t\t\tnodes = nodes.slice(0, take)\n\t\t\t}\n\t\t\treturn { nodes, cursor }\n\t\t})\n\t}\n\n\t_create_cursor(instance: any) {\n\t\treturn JSON.stringify(\n\t\t\tthis.fields.map((field) => {\n\t\t\t\tconst value = instance[field.name]\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unable to create cursor: undefined field ${field.name}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn String(value)\n\t\t\t}),\n\t\t)\n\t}\n\n\t_parse_cursor(cursor: string) {\n\t\tconst values = JSON.parse(cursor)\n\t\tconst left: string[] = []\n\t\tconst right: string[] = []\n\t\tconst bindings: Record<string, any> = {}\n\t\tfor (let i = 0; i < this.fields.length; ++i) {\n\t\t\tconst field = this.fields[i]\n\t\t\tconst expressions = field.desc ? right : left\n\t\t\tconst placeholders = field.desc ? left : right\n\t\t\texpressions.push(`\"${field.name}\"`)\n\t\t\tplaceholders.push(\"$\" + field.name)\n\t\t\tbindings[field.name] = values[i]\n\t\t}\n\t\treturn {\n\t\t\texpression: `(${left.join(\",\")}) > (${right.join(\",\")})`,\n\t\t\tbindings,\n\t\t}\n\t}\n}\n","import { OrmAdapter } from \"../orm/orm\"\n\nexport function run_after_query<Orm extends OrmAdapter>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\ttransform: (instance: any) => any,\n): Orm[\"Query\"] {\n\treturn orm.run_after_query(query, async (result) => {\n\t\t// FIXME: returning result is ignored in orchid (unlike objection). Add some hacks instead.\n\t\tif (Array.isArray(result)) {\n\t\t\tconst result1 = await Promise.all(result.map(transform))\n\t\t\treturn result1.filter(Boolean) // Skip empty objects\n\t\t} else if (result) {\n\t\t\treturn transform(result)\n\t\t} else {\n\t\t\t// Supposedly, single query returning NULL\n\t\t\treturn result\n\t\t}\n\t})\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { TableResolveContext } from \"./table\"\n\nexport interface FieldResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** Table field (if different from GraphQL field) */\n\ttableField?: string\n\t/** Legacy alias for `tableField`. */\n\tmodelField?: string\n\t/** Custom query modifier (if different than simply selecting a field). */\n\tmodify?: FieldResolveModifier<Orm, Context>\n\t/** Post-process selected value. Return a new value or a promise. */\n\ttransform?(\n\t\tvalue: any,\n\t\tinstance: any,\n\t\tcontext: FieldResolveContext<Orm, Context>,\n\t): any\n}\n\nexport type FieldResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: FieldResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface FieldResolveContext<Orm extends OrmAdapter, Context>\n\textends TableResolveContext<Orm, Context> {\n\t/** GraphQL field */\n\tfield: string\n}\n\n// That is a coincidence for now.\nexport type FieldResolver<\n\tOrm extends OrmAdapter,\n\tContext,\n> = FieldResolveModifier<Orm, Context>\n\nexport function parse_field_options<\n\tO extends Pick<FieldResolverOptions<any, any>, \"modelField\" | \"tableField\">,\n>(options: O): Omit<O, \"modelField\"> {\n\tconst { tableField, modelField } = options\n\tif (tableField && modelField) {\n\t\tthrow new Error(\n\t\t\t`Both tableField and modelField are defined. Use only one of them.`,\n\t\t)\n\t}\n\treturn { ...options, tableField: tableField || modelField }\n}\n\nexport function defineFieldResolver<Orm extends OrmAdapter, Context>(\n\toptions: FieldResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify, transform } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { field } = context\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t} else {\n\t\t\tquery = context.graph.orm.select_field(query, {\n\t\t\t\tfield: tableField || field,\n\t\t\t\tas: field,\n\t\t\t})\n\t\t}\n\t\tif (transform) {\n\t\t\tquery = run_after_query(context.graph.orm, query, async (instance) => {\n\t\t\t\tinstance[field] = await transform(instance[field], instance, context)\n\t\t\t\treturn instance\n\t\t\t})\n\t\t}\n\t\treturn query\n\t}\n}\n","import type { GraphQLResolveInfo } from \"graphql\"\nimport { parseResolveInfo, ResolveTree } from \"graphql-parse-resolve-info\"\n\nimport { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\nimport type { TableResolver, TableResolverOptions } from \"./table\"\n\nexport type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<\n\tTableResolverOptions<Orm, Context>,\n\t\"allowAllFields\" | \"allowAllFilters\"\n>\n\nexport interface GraphResolveOptions<Context> {\n\tinfo: GraphQLResolveInfo\n\tcontext: Context\n\tfilters?: FiltersDef\n\t/** Subfield path if not resolving root query, e.g.: ['user'] */\n\tpath?: string[]\n}\n\nexport type GraphResolveContext<Context> = Omit<\n\tGraphResolveOptions<Context>,\n\t\"info\"\n> & {\n\ttree: ResolveTree\n}\n\nexport class GraphResolver<Orm extends OrmAdapter, Context> {\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly type_resolvers: Record<string, TableResolver<Orm, Context>>,\n\t\treadonly options: GraphResolverOptions<Orm, Context> = {},\n\t) {}\n\n\tresolve(\n\t\tquery: Orm[\"Query\"],\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_type(query, { ...context, tree })\n\t}\n\n\tresolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_page(query, paginator, { ...context, tree })\n\t}\n\n\t_get_resolve_tree(info: GraphQLResolveInfo) {\n\t\treturn parseResolveInfo(info) as ResolveTree\n\t}\n\n\t_resolve_type(query: Orm[\"Query\"], context: GraphResolveContext<Context>) {\n\t\tlet { tree } = context\n\t\t// Dive into subtree if requested.\n\t\tif (context.path) {\n\t\t\tfor (const field of context.path) {\n\t\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t\tif (!tree) {\n\t\t\t\t\t// This graphql field was never requested, ignore.\n\t\t\t\t\t// This happens when a user resolves a graph for a root subfield which was not requested by the client (and is thus not present in the tree).\n\t\t\t\t\t//\n\t\t\t\t\t// FIXME: this break typings contract. We are supposed to return a query.\n\t\t\t\t\t// However, if we advertise to optionally return undefined, this result won't be accepted by upstream graphql tooling types.\n\t\t\t\t\t// This is the least evil I see for now.\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\tconst type_resolver = this.type_resolvers[type]\n\t\tif (!type_resolver) {\n\t\t\tthrow new Error(`Resolver not found for type ${type}.`)\n\t\t}\n\t\treturn type_resolver.resolve(query, {\n\t\t\t...context,\n\t\t\tgraph: this as any,\n\t\t\ttree,\n\t\t\ttype,\n\t\t\tpath: undefined,\n\t\t})\n\t}\n\n\t_resolve_page(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\tcontext: GraphResolveContext<Context>,\n\t) {\n\t\tif (context.path) {\n\t\t\t// TODO: handle non-empty context.path\n\t\t\tthrow new Error(\"Paginating under non-root path not yet supported.\")\n\t\t}\n\t\tquery = this._resolve_type(query, { ...context, path: paginator.path })\n\t\treturn paginator.paginate(query, {\n\t\t\t...context,\n\t\t\tgraph: this as any,\n\t\t})\n\t}\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { Paginator } from \"../paginators/base\"\nimport { FieldResolver, parse_field_options } from \"./field\"\nimport { RelationResolverOptions } from \"./relation\"\n\nexport function definePageResolver<Orm extends OrmAdapter, Context>(\n\tpaginator: Paginator<Orm, Context>,\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\t// Objection.js requires a workaround to handle paginated content,\n\t\t// it must be saved into context and re-injected later.\n\t\t// The modify + finish is a no-op in Orchid.\n\t\tconst pagination_context = {}\n\t\tquery = graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolve_page(subquery, paginator, context)\n\t\t\t\tsubquery = graph.orm.modify_subquery_pagination(\n\t\t\t\t\tsubquery,\n\t\t\t\t\tpagination_context,\n\t\t\t\t)\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t\tquery = graph.orm.finish_query_pagination(query, field, pagination_context)\n\t\treturn query\n\t}\n}\n","import { FiltersDef } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport {\n\tFieldResolver,\n\tFieldResolverOptions,\n\tparse_field_options,\n} from \"./field\"\nimport { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Orm extends OrmAdapter, Context>\n\textends Omit<FieldResolverOptions<Orm, Context>, \"modify\"> {\n\tfilters?: FiltersDef\n\tmodify?: TableResolveModifier<Orm, Context>\n}\n\nexport function defineRelationResolver<Orm extends OrmAdapter, Context>(\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, filters, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\treturn graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolve_type(subquery, { ...context, filters })\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t}\n}\n","export function is_plain_object(obj: any): obj is Record<string, any> {\n\treturn typeof obj === \"object\" && !Array.isArray(obj)\n}\n","import { OrmAdapter } from \"../orm/orm\"\nimport { TableResolveContext } from \"../resolvers/table\"\nimport { is_plain_object } from \"../utils/is-plain-object\"\n\n// TODO: per-field definitions\nexport type FiltersDef = boolean\n\nexport type FilterScalarValue = null | string | number | boolean\nexport type FilterValue = FilterScalarValue | Exclude<FilterScalarValue, null>[]\nexport type Filter = { [property: string]: FilterValue }\n\ninterface ApplyFiltersOptions<Orm extends OrmAdapter, Context> {\n\tfilters: FiltersDef\n\tmodifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\tcontext: TableResolveContext<Orm, Context>\n}\n\nexport type ApplyFiltersModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tvalue: any,\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport function apply_filters<Orm extends OrmAdapter, Context>(\n\tquery: Orm[\"Query\"],\n\t{ filters, modifiers, context }: ApplyFiltersOptions<Orm, Context>,\n): Orm[\"Query\"] {\n\tif (!filters) {\n\t\treturn query\n\t}\n\tconst filter_obj = context.tree.args?.filter\n\tif (!filter_obj) {\n\t\treturn query\n\t}\n\tif (!is_plain_object(filter_obj)) {\n\t\tthrow new Error(`Invalid filter: ${filter_obj}, must be object.`)\n\t}\n\tfor (const [field, value] of Object.entries(filter_obj)) {\n\t\tif (value === undefined) {\n\t\t\t// Support optional GraphQL arguments in filter\n\t\t\tcontinue\n\t\t}\n\t\tif (modifiers?.[field]) {\n\t\t\tquery = modifiers[field](query, value, context)\n\t\t} else {\n\t\t\tconst [table_field, op0] = field.split(\"__\")\n\t\t\tconst op = op0?.toLowerCase()\n\t\t\t// TODO: validate op\n\t\t\tquery = context.graph.orm.where(query, table_field, op, value)\n\t\t}\n\t}\n\treturn query\n}\n","import { apply_filters, ApplyFiltersModifier } from \"../filters/filters\"\nimport { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\nimport { defineFieldResolver, FieldResolver } from \"./field\"\nimport type { GraphResolveContext, GraphResolver } from \"./graph\"\nimport { defineRelationResolver } from \"./relation\"\n\nexport interface TableResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** allow to resolve all table fields without explicitly listing them */\n\tallowAllFields?: boolean\n\t/** allow to filter all table fields without explicitly listing them */\n\tallowAllFilters?: boolean\n\tfields?: Record<string, SimpleFieldResolver<Orm, Context>>\n\tmodifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\tmodify?: TableResolveModifier<Orm, Context>\n\ttransform?(instance: any, context: any): void | PromiseLike<void>\n}\n\nexport type SimpleFieldResolver<Orm extends OrmAdapter, Context> =\n\t| true\n\t| string\n\t| FieldResolver<Orm, Context>\n\nexport type TableResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface TableResolveContext<Orm extends OrmAdapter, Context>\n\textends GraphResolveContext<Context> {\n\tgraph: GraphResolver<Orm, Context>\n\t/** GraphQL type */\n\ttype: string\n}\n\nexport class TableResolver<Orm extends OrmAdapter, Context> {\n\t// Introspection results\n\treadonly relations: Set<string>\n\treadonly virtual_fields: Set<string>\n\treadonly modifiers?: Record<string, ApplyFiltersModifier<Orm, Context>>\n\n\treadonly table_field_resolvers?: Record<string, FieldResolver<Orm, Context>>\n\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly table: Orm[\"Table\"],\n\t\treadonly options: TableResolverOptions<Orm, Context> = {},\n\t) {\n\t\tthis.relations = new Set(orm.get_table_relations(table))\n\t\tthis.virtual_fields = new Set(orm.get_table_virtual_fields(table))\n\t\tthis.modifiers = { ...orm.get_table_modifiers(table), ...options.modifiers }\n\n\t\t// Pre-create field resolvers\n\t\tconst { fields } = options\n\t\tif (fields) {\n\t\t\tthis.table_field_resolvers = Object.keys(fields).reduce<\n\t\t\t\tRecord<string, FieldResolver<Orm, Context>>\n\t\t\t>((resolvers, field) => {\n\t\t\t\tconst r0 = fields[field]\n\t\t\t\tconst r: FieldResolver<Orm, Context> | undefined =\n\t\t\t\t\ttypeof r0 === \"function\"\n\t\t\t\t\t\t? r0\n\t\t\t\t\t\t: r0 === true\n\t\t\t\t\t\t\t? this._get_default_field_resolver(field)\n\t\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t\t\t? this._get_default_field_resolver(field, r0)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\tif (r === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Field resolver must be a function, string, or true; found ${typeof r0}.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tresolvers[field] = r\n\t\t\t\treturn resolvers\n\t\t\t}, {})\n\t\t}\n\t}\n\n\t/** Modify query to select fields/relations and filter the result set. */\n\tresolve(query: Orm[\"Query\"], context: TableResolveContext<Orm, Context>) {\n\t\tconst { modify, transform } = this.options\n\t\tconst { graph, tree, type, filters } = context\n\n\t\tconst query_table = this.orm.get_query_table(query)\n\t\tconst table_table = this.orm.get_table_table(this.table)\n\n\t\tif (query_table !== table_table) {\n\t\t\tthrow new Error(\n\t\t\t\t`Mismatching query table for type ${type}: expected ${table_table}, received ${query_table}.`,\n\t\t\t)\n\t\t}\n\n\t\tconst allow_all_fields =\n\t\t\tthis.options.allowAllFields ??\n\t\t\tgraph.options.allowAllFields ??\n\t\t\t!this.options.fields\n\n\t\tif (!allow_all_fields && !this.table_field_resolvers) {\n\t\t\tthrow new Error(\n\t\t\t\t`Resolver for type ${type} must either allow all fields or specify options.fields.`,\n\t\t\t)\n\t\t}\n\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t}\n\n\t\tfor (const subtree of Object.values(tree.fieldsByTypeName[type])) {\n\t\t\tconst field = subtree.name\n\t\t\tconst r: FieldResolver<Orm, Context> | undefined =\n\t\t\t\tthis.table_field_resolvers?.[field] ||\n\t\t\t\t(allow_all_fields ? this._get_default_field_resolver(field) : undefined)\n\t\t\tif (!r) {\n\t\t\t\tthrow new Error(`No field resolver defined for field ${type}.${field}.`)\n\t\t\t}\n\t\t\tif (r) {\n\t\t\t\tquery = r(query, { ...context, tree: subtree, field })\n\t\t\t}\n\t\t}\n\n\t\tconst allow_all_filters =\n\t\t\tthis.options.allowAllFilters ?? graph.options.allowAllFilters\n\n\t\tconst effective_filters = allow_all_filters ? true : filters\n\n\t\tif (effective_filters) {\n\t\t\tquery = apply_filters<Orm, Context>(query, {\n\t\t\t\tfilters: effective_filters,\n\t\t\t\tmodifiers: this.modifiers,\n\t\t\t\tcontext,\n\t\t\t})\n\t\t}\n\n\t\tif (transform) {\n\t\t\tquery = run_after_query(this.orm, query, (instance) => {\n\t\t\t\treturn transform(instance, context)\n\t\t\t})\n\t\t}\n\n\t\tquery = this.orm.prevent_select_all(query)\n\n\t\treturn query\n\t}\n\n\t/**\n\t * Create field resolver which will modify query to resolve GraphQL field.\n\t */\n\t_get_default_field_resolver(\n\t\tfield: string,\n\t\ttableField?: string,\n\t): FieldResolver<Orm, Context> {\n\t\tconst table_field_lookup = tableField || field\n\t\tif (\n\t\t\tthis.options.modifiers?.[table_field_lookup] ||\n\t\t\tthis.virtual_fields.has(table_field_lookup)\n\t\t) {\n\t\t\t// Keep query as is.\n\t\t\treturn (query) => query\n\t\t} else if (this.relations.has(table_field_lookup)) {\n\t\t\t// TODO: pre-create and cache\n\t\t\treturn defineRelationResolver({ tableField })\n\t\t} else {\n\t\t\t// TODO: create simplified resolver?\n\t\t\treturn defineFieldResolver({ tableField })\n\t\t}\n\t}\n}\n","import { OrmAdapter } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\nimport { DbTable, raw } from \"orchid-orm\"\n\nexport type OrchidOrm = OrmAdapter<\n\tDbTable<any>,\n\tQuery,\n\t// TODO: Type as QueryTransform once it's published.\n\tPick<Promise<any>, \"then\" | \"catch\">\n>\n\nexport const orm: OrchidOrm = {\n\tTable: undefined as unknown as OrchidOrm[\"Table\"],\n\tQuery: undefined as unknown as OrchidOrm[\"Query\"],\n\tQueryTransform: undefined as unknown as OrchidOrm[\"QueryTransform\"],\n\n\t// Reflection\n\n\tget_table_table(table) {\n\t\treturn table.table\n\t},\n\n\tget_table_relations(table) {\n\t\treturn Object.keys(table.relations)\n\t},\n\n\tget_table_virtual_fields() {\n\t\t// Not supported by Orchid.\n\t\treturn []\n\t},\n\n\tget_table_modifiers() {\n\t\treturn undefined\n\t},\n\n\tget_query_table(query) {\n\t\tif (!query.table) {\n\t\t\tthrow new Error(\"Query must have table.\")\n\t\t}\n\t\treturn query.table\n\t},\n\n\t// Select\n\n\tselect_field(query, { field, as }) {\n\t\treturn query.select({ [as]: field })\n\t},\n\n\tselect_relation(query, { relation, as, modify }) {\n\t\treturn query.select({\n\t\t\t[as]: (q) => modify((q as any)[relation]),\n\t\t})\n\t},\n\n\t// Find\n\n\twhere(query, field, op, value) {\n\t\treturn query.where({ [field]: op ? { [op]: value } : value })\n\t},\n\n\twhere_raw(query, expression, bindings) {\n\t\treturn query.where(raw({ raw: expression, values: bindings }))\n\t},\n\n\t// Order & Limit\n\n\treset_query_order(query) {\n\t\treturn query.clear(\"order\")\n\t},\n\n\tadd_query_order(query, field, desc) {\n\t\treturn query.order({ [field]: desc ? \"DESC\" : \"ASC\" })\n\t},\n\n\tset_query_limit(query, limit) {\n\t\treturn query.limit(limit)\n\t},\n\n\t// Pagination helpers\n\n\tset_query_page_result(query, get_page) {\n\t\treturn query.transform((nodes) => get_page(nodes as any))\n\t},\n\n\tmodify_subquery_pagination(subquery) {\n\t\treturn subquery\n\t},\n\n\tfinish_query_pagination(query) {\n\t\treturn query\n\t},\n\n\t// Misc\n\n\trun_after_query(query, fn) {\n\t\treturn query.afterQuery((data) => fn(data))\n\t},\n\n\tprevent_select_all(query) {\n\t\t// Not needed in Orchid\n\t\treturn query\n\t},\n}\n","import { GraphResolver, GraphResolverOptions, TableResolver } from \"graphql-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function createGraphResolver<Context = unknown>(\n\ttypes: Record<string, TableResolver<OrchidOrm, Context>>,\n\toptions?: GraphResolverOptions<OrchidOrm, Context>,\n) {\n\treturn new GraphResolver<OrchidOrm, Context>(orm, types, options)\n}\n","import { TableResolver, TableResolverOptions } from \"graphql-orm\"\nimport { DbTable, Table } from \"orchid-orm\"\n\nimport { OrchidOrm, orm } from \"../orm/orm\"\n\nexport function defineTableResolver<TableT extends Table, Context = unknown>(\n\ttable: DbTable<TableT>,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {},\n) {\n\treturn new TableResolver(orm, table as unknown as DbTable<any>, options)\n}\n"],"mappings":"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","names":["orm","cursor","orm","orm","type","orm"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orchid-graphql",
|
|
3
3
|
"description": "orchid-orm plugin: resolve GraphQL query with Orchid ORM",
|
|
4
|
-
"version": "1.5.
|
|
4
|
+
"version": "1.5.2",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/IlyaSemenov/orchid-graphql"
|
|
@@ -20,29 +20,30 @@
|
|
|
20
20
|
"engines": {
|
|
21
21
|
"node": ">=14"
|
|
22
22
|
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"graphql-parse-resolve-info": "^4.13.0"
|
|
25
|
+
},
|
|
23
26
|
"peerDependencies": {
|
|
24
27
|
"graphql": "^16",
|
|
25
|
-
"orchid-orm": "^1.
|
|
26
|
-
"pqb": ">=0.14"
|
|
28
|
+
"orchid-orm": "^1.22.0"
|
|
27
29
|
},
|
|
28
30
|
"devDependencies": {
|
|
29
|
-
"@apollo/server": "
|
|
30
|
-
"graphql": "
|
|
31
|
-
"graphql-request": "
|
|
31
|
+
"@apollo/server": "^4.7.1",
|
|
32
|
+
"graphql": "^16.6.0",
|
|
33
|
+
"graphql-request": "^6.0.0",
|
|
32
34
|
"graphql-tag": "^2.12.6",
|
|
33
|
-
"orchid-orm": "
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"vite": "
|
|
38
|
-
"vite-
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"graphql-orm": "1.4.0"
|
|
35
|
+
"orchid-orm": "^1.23.0",
|
|
36
|
+
"tsconfig-vite-node": "^1.1.2",
|
|
37
|
+
"tsup": "^8.1.0",
|
|
38
|
+
"vite": "^5.3.1",
|
|
39
|
+
"vite-node": "^1.6.0",
|
|
40
|
+
"vite-tsconfig-paths": "^4.3.2",
|
|
41
|
+
"vitest": "^1.6.0",
|
|
42
|
+
"graphql-orm": "1.4.1"
|
|
42
43
|
},
|
|
43
44
|
"scripts": {
|
|
44
45
|
"dev": "vite-node --watch playground/readme.sample.ts",
|
|
45
46
|
"build": "tsup",
|
|
46
|
-
"test": "vitest run"
|
|
47
|
+
"test": "vitest run && tsc --noEmit"
|
|
47
48
|
}
|
|
48
49
|
}
|
package/src/orm/orm.ts
CHANGED
package/src/resolvers/table.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { TableResolver, TableResolverOptions } from "graphql-orm"
|
|
2
|
-
import { DbTable } from "orchid-orm"
|
|
2
|
+
import { DbTable, Table } from "orchid-orm"
|
|
3
3
|
|
|
4
4
|
import { OrchidOrm, orm } from "../orm/orm"
|
|
5
5
|
|
|
6
|
-
export function defineTableResolver<Context = unknown>(
|
|
7
|
-
table: DbTable<
|
|
6
|
+
export function defineTableResolver<TableT extends Table, Context = unknown>(
|
|
7
|
+
table: DbTable<TableT>,
|
|
8
8
|
options: TableResolverOptions<OrchidOrm, Context> = {},
|
|
9
9
|
) {
|
|
10
|
-
return new TableResolver(orm, table
|
|
10
|
+
return new TableResolver(orm, table as unknown as DbTable<any>, options)
|
|
11
11
|
}
|