orchid-graphql 1.9.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +76 -76
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -26
- package/dist/index.d.ts +26 -26
- package/dist/index.js +76 -76
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
- package/src/orm/orm.ts +17 -17
package/dist/index.cjs
CHANGED
|
@@ -57,9 +57,9 @@ function filterQuery(orm2, query, filter, options) {
|
|
|
57
57
|
if (modifiers?.[field]) {
|
|
58
58
|
query = modifiers[field](query, value, context);
|
|
59
59
|
} else {
|
|
60
|
-
const [
|
|
60
|
+
const [tableField, op0] = field.split("__");
|
|
61
61
|
const op = op0?.toLowerCase();
|
|
62
|
-
query = orm2.where(query,
|
|
62
|
+
query = orm2.where(query, tableField, op, value);
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
return query;
|
|
@@ -89,22 +89,22 @@ var CursorPaginator = class {
|
|
|
89
89
|
const { args } = context.tree;
|
|
90
90
|
const pageSize = args.take ?? this.pageSize;
|
|
91
91
|
const cursor = args.cursor;
|
|
92
|
-
const table = orm2.
|
|
92
|
+
const table = orm2.getQueryTable(query);
|
|
93
93
|
const orderFields = (this.fields ? this.fields.map((f) => ({
|
|
94
94
|
field: f.name,
|
|
95
95
|
dir: f.desc ? "DESC" : "ASC"
|
|
96
|
-
})) : orm2.
|
|
96
|
+
})) : orm2.getQueryOrder(query)).map((o) => ({ ...o, alias: "_order_" + o.field }));
|
|
97
97
|
if (this.fields) {
|
|
98
|
-
query = orm2.
|
|
98
|
+
query = orm2.resetQueryOrder(query);
|
|
99
99
|
for (const { alias, dir } of orderFields) {
|
|
100
|
-
query = orm2.
|
|
100
|
+
query = orm2.addQueryOrder(query, { field: alias, dir });
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
if (!orderFields.length) {
|
|
104
104
|
throw new Error("Query must be ordered.");
|
|
105
105
|
}
|
|
106
106
|
for (const { field, alias } of orderFields) {
|
|
107
|
-
query = orm2.
|
|
107
|
+
query = orm2.selectField(query, { field, as: alias });
|
|
108
108
|
}
|
|
109
109
|
if (cursor) {
|
|
110
110
|
const parsedCursor = parseCursor(cursor);
|
|
@@ -120,9 +120,9 @@ var CursorPaginator = class {
|
|
|
120
120
|
const bindings = Object.fromEntries(
|
|
121
121
|
orderFields.map(({ alias }, i) => [alias, parsedCursor[i]])
|
|
122
122
|
);
|
|
123
|
-
query = orm2.
|
|
123
|
+
query = orm2.whereRaw(query, sqlExpr, bindings);
|
|
124
124
|
}
|
|
125
|
-
query = orm2.
|
|
125
|
+
query = orm2.setQueryLimit(query, pageSize + 1);
|
|
126
126
|
function createNodeCursor(node) {
|
|
127
127
|
return createCursor(
|
|
128
128
|
orderFields.map(({ field, alias }) => {
|
|
@@ -136,7 +136,7 @@ var CursorPaginator = class {
|
|
|
136
136
|
})
|
|
137
137
|
);
|
|
138
138
|
}
|
|
139
|
-
return orm2.
|
|
139
|
+
return orm2.setQueryPageResult(query, (nodes) => {
|
|
140
140
|
let cursor2;
|
|
141
141
|
if (nodes.length > pageSize) {
|
|
142
142
|
cursor2 = createNodeCursor(nodes[pageSize - 1]);
|
|
@@ -156,8 +156,8 @@ function parseCursor(cursor) {
|
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
// ../base/src/utils/run-after.ts
|
|
159
|
-
function
|
|
160
|
-
return orm2.
|
|
159
|
+
function runAfterQuery(orm2, query, transform) {
|
|
160
|
+
return orm2.runAfterQuery(query, async (result) => {
|
|
161
161
|
if (Array.isArray(result)) {
|
|
162
162
|
const result1 = await Promise.all(result.map(transform));
|
|
163
163
|
return result1.filter(Boolean);
|
|
@@ -170,7 +170,7 @@ function run_after_query(orm2, query, transform) {
|
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
// ../base/src/resolvers/field.ts
|
|
173
|
-
function
|
|
173
|
+
function parseFieldOptions(options) {
|
|
174
174
|
const { tableField, modelField } = options;
|
|
175
175
|
if (tableField && modelField) {
|
|
176
176
|
throw new Error(
|
|
@@ -180,19 +180,19 @@ function parse_field_options(options) {
|
|
|
180
180
|
return { ...options, tableField: tableField || modelField };
|
|
181
181
|
}
|
|
182
182
|
function defineFieldResolver(options = {}) {
|
|
183
|
-
const { tableField, modify, transform } =
|
|
183
|
+
const { tableField, modify, transform } = parseFieldOptions(options);
|
|
184
184
|
return function resolve(query, context) {
|
|
185
185
|
const { field } = context;
|
|
186
186
|
if (modify) {
|
|
187
187
|
query = modify(query, context);
|
|
188
188
|
} else {
|
|
189
|
-
query = context.graph.orm.
|
|
189
|
+
query = context.graph.orm.selectField(query, {
|
|
190
190
|
field: tableField || field,
|
|
191
191
|
as: field
|
|
192
192
|
});
|
|
193
193
|
}
|
|
194
194
|
if (transform) {
|
|
195
|
-
query =
|
|
195
|
+
query = runAfterQuery(context.graph.orm, query, async (instance) => {
|
|
196
196
|
instance[field] = await transform(instance[field], instance, context);
|
|
197
197
|
return instance;
|
|
198
198
|
});
|
|
@@ -204,23 +204,23 @@ function defineFieldResolver(options = {}) {
|
|
|
204
204
|
// ../base/src/resolvers/graph.ts
|
|
205
205
|
var import_graphql_parse_resolve_info = require("graphql-parse-resolve-info");
|
|
206
206
|
var GraphResolver = class {
|
|
207
|
-
constructor(orm2,
|
|
207
|
+
constructor(orm2, typeResolvers, options = {}) {
|
|
208
208
|
this.orm = orm2;
|
|
209
|
-
this.
|
|
209
|
+
this.typeResolvers = typeResolvers;
|
|
210
210
|
this.options = options;
|
|
211
211
|
}
|
|
212
212
|
resolve(query, { info, ...context }) {
|
|
213
|
-
const tree = this.
|
|
214
|
-
return this.
|
|
213
|
+
const tree = this._getResolveTree(info);
|
|
214
|
+
return this._resolveType(query, { ...context, tree });
|
|
215
215
|
}
|
|
216
216
|
resolvePage(query, paginator, { info, ...context }) {
|
|
217
|
-
const tree = this.
|
|
218
|
-
return this.
|
|
217
|
+
const tree = this._getResolveTree(info);
|
|
218
|
+
return this._resolvePage(query, paginator, { ...context, tree });
|
|
219
219
|
}
|
|
220
|
-
|
|
220
|
+
_getResolveTree(info) {
|
|
221
221
|
return (0, import_graphql_parse_resolve_info.parseResolveInfo)(info);
|
|
222
222
|
}
|
|
223
|
-
|
|
223
|
+
_resolveType(query, context) {
|
|
224
224
|
let { tree } = context;
|
|
225
225
|
if (context.path) {
|
|
226
226
|
for (const field of context.path) {
|
|
@@ -232,11 +232,11 @@ var GraphResolver = class {
|
|
|
232
232
|
}
|
|
233
233
|
}
|
|
234
234
|
const type = Object.keys(tree.fieldsByTypeName)[0];
|
|
235
|
-
const
|
|
236
|
-
if (!
|
|
235
|
+
const typeResolver = this.typeResolvers[type];
|
|
236
|
+
if (!typeResolver) {
|
|
237
237
|
throw new Error(`Resolver not found for type ${type}.`);
|
|
238
238
|
}
|
|
239
|
-
return
|
|
239
|
+
return typeResolver.resolve(query, {
|
|
240
240
|
...context,
|
|
241
241
|
graph: this,
|
|
242
242
|
tree,
|
|
@@ -244,11 +244,11 @@ var GraphResolver = class {
|
|
|
244
244
|
path: void 0
|
|
245
245
|
});
|
|
246
246
|
}
|
|
247
|
-
|
|
247
|
+
_resolvePage(query, paginator, context) {
|
|
248
248
|
if (context.path) {
|
|
249
249
|
throw new Error("Paginating under non-root path not yet supported.");
|
|
250
250
|
}
|
|
251
|
-
query = this.
|
|
251
|
+
query = this._resolveType(query, { ...context, path: paginator.path });
|
|
252
252
|
return paginator.paginate(query, {
|
|
253
253
|
...context,
|
|
254
254
|
graph: this
|
|
@@ -258,38 +258,38 @@ var GraphResolver = class {
|
|
|
258
258
|
|
|
259
259
|
// ../base/src/resolvers/page.ts
|
|
260
260
|
function definePageResolver(paginator, options = {}) {
|
|
261
|
-
const { tableField, modify } =
|
|
261
|
+
const { tableField, modify } = parseFieldOptions(options);
|
|
262
262
|
return function resolve(query, context) {
|
|
263
263
|
const { graph, field } = context;
|
|
264
|
-
const
|
|
265
|
-
query = graph.orm.
|
|
264
|
+
const paginationContext = {};
|
|
265
|
+
query = graph.orm.selectRelation(query, {
|
|
266
266
|
relation: tableField || field,
|
|
267
267
|
as: field,
|
|
268
268
|
modify(subquery) {
|
|
269
269
|
subquery = modify ? modify(subquery, context) : subquery;
|
|
270
|
-
subquery = graph.
|
|
271
|
-
subquery = graph.orm.
|
|
270
|
+
subquery = graph._resolvePage(subquery, paginator, context);
|
|
271
|
+
subquery = graph.orm.modifySubqueryPagination(
|
|
272
272
|
subquery,
|
|
273
|
-
|
|
273
|
+
paginationContext
|
|
274
274
|
);
|
|
275
275
|
return subquery;
|
|
276
276
|
}
|
|
277
277
|
});
|
|
278
|
-
query = graph.orm.
|
|
278
|
+
query = graph.orm.finishQueryPagination(query, field, paginationContext);
|
|
279
279
|
return query;
|
|
280
280
|
};
|
|
281
281
|
}
|
|
282
282
|
|
|
283
283
|
// ../base/src/resolvers/relation.ts
|
|
284
284
|
function defineRelationResolver(options = {}) {
|
|
285
|
-
const { tableField, filters, modify } =
|
|
285
|
+
const { tableField, filters, modify } = parseFieldOptions(options);
|
|
286
286
|
return function resolve(query, context) {
|
|
287
287
|
const { graph, field } = context;
|
|
288
|
-
return graph.orm.
|
|
288
|
+
return graph.orm.selectRelation(query, {
|
|
289
289
|
relation: tableField || field,
|
|
290
290
|
as: field,
|
|
291
291
|
modify(subquery) {
|
|
292
|
-
subquery = graph.
|
|
292
|
+
subquery = graph._resolveType(subquery, { ...context, filters });
|
|
293
293
|
return modify ? modify(subquery, context) : subquery;
|
|
294
294
|
}
|
|
295
295
|
});
|
|
@@ -302,14 +302,14 @@ var TableResolver = class {
|
|
|
302
302
|
this.orm = orm2;
|
|
303
303
|
this.table = table;
|
|
304
304
|
this.options = options;
|
|
305
|
-
this.relations = new Set(orm2.
|
|
306
|
-
this.
|
|
307
|
-
this.modifiers = { ...orm2.
|
|
305
|
+
this.relations = new Set(orm2.getTableRelations(table));
|
|
306
|
+
this.virtualFields = new Set(orm2.getTableVirtualFields(table));
|
|
307
|
+
this.modifiers = { ...orm2.getTableModifiers(table), ...options.modifiers };
|
|
308
308
|
const { fields } = options;
|
|
309
309
|
if (fields) {
|
|
310
|
-
this.
|
|
310
|
+
this.tableFieldResolvers = Object.keys(fields).reduce((resolvers, field) => {
|
|
311
311
|
const r0 = fields[field];
|
|
312
|
-
const r = typeof r0 === "function" ? r0 : r0 === true ? this.
|
|
312
|
+
const r = typeof r0 === "function" ? r0 : r0 === true ? this._getDefaultFieldResolver(field) : typeof r0 === "string" ? this._getDefaultFieldResolver(field, r0) : void 0;
|
|
313
313
|
if (r === void 0) {
|
|
314
314
|
throw new Error(
|
|
315
315
|
`Field resolver must be a function, string, or true; found ${typeof r0}.`
|
|
@@ -322,22 +322,22 @@ var TableResolver = class {
|
|
|
322
322
|
}
|
|
323
323
|
// Introspection results
|
|
324
324
|
relations;
|
|
325
|
-
|
|
325
|
+
virtualFields;
|
|
326
326
|
modifiers;
|
|
327
|
-
|
|
327
|
+
tableFieldResolvers;
|
|
328
328
|
/** Modify query to select fields/relations and filter the result set. */
|
|
329
329
|
resolve(query, context) {
|
|
330
330
|
const { modify, transform } = this.options;
|
|
331
331
|
const { graph, tree, type, filters } = context;
|
|
332
|
-
const
|
|
333
|
-
const
|
|
334
|
-
if (
|
|
332
|
+
const queryTable = this.orm.getQueryTable(query);
|
|
333
|
+
const tableName = this.orm.getTableName(this.table);
|
|
334
|
+
if (queryTable !== tableName) {
|
|
335
335
|
throw new Error(
|
|
336
|
-
`Mismatching query table for type ${type}: expected ${
|
|
336
|
+
`Mismatching query table for type ${type}: expected ${tableName}, received ${queryTable}.`
|
|
337
337
|
);
|
|
338
338
|
}
|
|
339
|
-
const
|
|
340
|
-
if (!
|
|
339
|
+
const allowAllFields = this.options.allowAllFields ?? graph.options.allowAllFields ?? !this.options.fields;
|
|
340
|
+
if (!allowAllFields && !this.tableFieldResolvers) {
|
|
341
341
|
throw new Error(
|
|
342
342
|
`Resolver for type ${type} must either allow all fields or specify options.fields.`
|
|
343
343
|
);
|
|
@@ -347,7 +347,7 @@ var TableResolver = class {
|
|
|
347
347
|
}
|
|
348
348
|
for (const subtree of Object.values(tree.fieldsByTypeName[type])) {
|
|
349
349
|
const field = subtree.name;
|
|
350
|
-
const r = this.
|
|
350
|
+
const r = this.tableFieldResolvers?.[field] || (allowAllFields ? this._getDefaultFieldResolver(field) : void 0);
|
|
351
351
|
if (!r) {
|
|
352
352
|
throw new Error(`No field resolver defined for field ${type}.${field}.`);
|
|
353
353
|
}
|
|
@@ -367,21 +367,21 @@ var TableResolver = class {
|
|
|
367
367
|
}
|
|
368
368
|
}
|
|
369
369
|
if (transform) {
|
|
370
|
-
query =
|
|
370
|
+
query = runAfterQuery(this.orm, query, (instance) => {
|
|
371
371
|
return transform(instance, context);
|
|
372
372
|
});
|
|
373
373
|
}
|
|
374
|
-
query = this.orm.
|
|
374
|
+
query = this.orm.preventSelectAll(query);
|
|
375
375
|
return query;
|
|
376
376
|
}
|
|
377
377
|
/**
|
|
378
378
|
* Create field resolver which will modify query to resolve GraphQL field.
|
|
379
379
|
*/
|
|
380
|
-
|
|
381
|
-
const
|
|
382
|
-
if (this.options.modifiers?.[
|
|
380
|
+
_getDefaultFieldResolver(field, tableField) {
|
|
381
|
+
const tableFieldLookup = tableField || field;
|
|
382
|
+
if (this.options.modifiers?.[tableFieldLookup] || this.virtualFields.has(tableFieldLookup)) {
|
|
383
383
|
return (query) => query;
|
|
384
|
-
} else if (this.relations.has(
|
|
384
|
+
} else if (this.relations.has(tableFieldLookup)) {
|
|
385
385
|
return defineRelationResolver({ tableField });
|
|
386
386
|
} else {
|
|
387
387
|
return defineFieldResolver({ tableField });
|
|
@@ -396,29 +396,29 @@ var orm = {
|
|
|
396
396
|
Query: void 0,
|
|
397
397
|
QueryTransform: void 0,
|
|
398
398
|
// Reflection
|
|
399
|
-
|
|
399
|
+
getTableName(table) {
|
|
400
400
|
return table.table;
|
|
401
401
|
},
|
|
402
|
-
|
|
402
|
+
getTableRelations(table) {
|
|
403
403
|
return Object.keys(table.relations);
|
|
404
404
|
},
|
|
405
|
-
|
|
405
|
+
getTableVirtualFields() {
|
|
406
406
|
return [];
|
|
407
407
|
},
|
|
408
|
-
|
|
408
|
+
getTableModifiers() {
|
|
409
409
|
return void 0;
|
|
410
410
|
},
|
|
411
|
-
|
|
411
|
+
getQueryTable(query) {
|
|
412
412
|
if (!query.table) {
|
|
413
413
|
throw new Error("Query must have table.");
|
|
414
414
|
}
|
|
415
415
|
return query.table;
|
|
416
416
|
},
|
|
417
417
|
// Select
|
|
418
|
-
|
|
418
|
+
selectField(query, { field, as }) {
|
|
419
419
|
return query.select({ [as]: field });
|
|
420
420
|
},
|
|
421
|
-
|
|
421
|
+
selectRelation(query, { relation, as, modify }) {
|
|
422
422
|
return query.select({
|
|
423
423
|
[as]: (q) => modify(q[relation])
|
|
424
424
|
});
|
|
@@ -427,17 +427,17 @@ var orm = {
|
|
|
427
427
|
where(query, field, op, value) {
|
|
428
428
|
return query.where({ [field]: op ? { [op]: value } : value });
|
|
429
429
|
},
|
|
430
|
-
|
|
430
|
+
whereRaw(query, expression, bindings) {
|
|
431
431
|
return query.where((0, import_orchid_orm.raw)({ raw: expression, values: bindings }));
|
|
432
432
|
},
|
|
433
433
|
// Order & Limit
|
|
434
|
-
|
|
434
|
+
resetQueryOrder(query) {
|
|
435
435
|
return query.clear("order");
|
|
436
436
|
},
|
|
437
|
-
|
|
437
|
+
addQueryOrder(query, { field, dir }) {
|
|
438
438
|
return query.order({ [field]: dir });
|
|
439
439
|
},
|
|
440
|
-
|
|
440
|
+
getQueryOrder(query) {
|
|
441
441
|
return query.q.order?.flatMap((orderItem) => {
|
|
442
442
|
if (typeof orderItem === "string") {
|
|
443
443
|
return { field: "orderItem", dir: "ASC" };
|
|
@@ -455,24 +455,24 @@ var orm = {
|
|
|
455
455
|
}
|
|
456
456
|
}) || [];
|
|
457
457
|
},
|
|
458
|
-
|
|
458
|
+
setQueryLimit(query, limit) {
|
|
459
459
|
return query.limit(limit);
|
|
460
460
|
},
|
|
461
461
|
// Pagination helpers
|
|
462
|
-
|
|
462
|
+
setQueryPageResult(query, get_page) {
|
|
463
463
|
return query.transform((nodes) => get_page(nodes));
|
|
464
464
|
},
|
|
465
|
-
|
|
465
|
+
modifySubqueryPagination(subquery) {
|
|
466
466
|
return subquery;
|
|
467
467
|
},
|
|
468
|
-
|
|
468
|
+
finishQueryPagination(query) {
|
|
469
469
|
return query;
|
|
470
470
|
},
|
|
471
471
|
// Misc
|
|
472
|
-
|
|
472
|
+
runAfterQuery(query, fn) {
|
|
473
473
|
return query.afterQuery((data) => fn(data));
|
|
474
474
|
},
|
|
475
|
-
|
|
475
|
+
preventSelectAll(query) {
|
|
476
476
|
return query;
|
|
477
477
|
}
|
|
478
478
|
};
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../base/src/utils/is-plain-object.ts","../../base/src/filter/filter.ts","../../base/src/paginators/cursor.ts","../../base/src/utils/run-after.ts","../../base/src/resolvers/field.ts","../../base/src/resolvers/graph.ts","../../base/src/resolvers/page.ts","../../base/src/resolvers/relation.ts","../../base/src/resolvers/table.ts","../src/orm/orm.ts","../src/filter.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["export * from \"./filter\"\nexport {\n\tcreateGraphResolver,\n\tcreateGraphResolver as graph,\n} from \"./resolvers/graph\"\nexport {\n\tdefineTableResolver,\n\tdefineTableResolver as table,\n} from \"./resolvers/table\"\nexport {\n\tdefineCursorPaginator as cursor,\n\tdefineCursorPaginator,\n} from \"graphql-orm\"\nexport { defineFieldResolver, defineFieldResolver as field } from \"graphql-orm\"\nexport { definePageResolver, definePageResolver as page } from \"graphql-orm\"\nexport {\n\tdefineRelationResolver,\n\tdefineRelationResolver as relation,\n} from \"graphql-orm\"\n","export function isPlainObject(obj: any): obj is Record<string, any> {\n\treturn typeof obj === \"object\" && !Array.isArray(obj)\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport { isPlainObject } from \"../utils/is-plain-object\"\n\n// TODO: per-field definitions\nexport type FilterConfig = boolean\n\nexport type FieldFilterScalarValue = null | string | number | boolean\nexport type FieldFilterValue = FieldFilterScalarValue | Exclude<FieldFilterScalarValue, null>[]\nexport type FilterValue = { [property: string]: FieldFilterValue }\n\nexport type FilterQueryOptions<Orm extends OrmAdapter, Context = unknown> = {\n\tmodifiers?: FilterModifiers<Orm, Context>\n} & (Context extends undefined ? {\n\tcontext?: Context\n} : {\n\tcontext: Context\n})\n\nexport type FilterModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tvalue: any,\n\tcontext: Context,\n) => Orm[\"Query\"]\n\nexport type FilterModifiers<Orm extends OrmAdapter, Context> = Record<string, FilterModifier<Orm, Context>>\n\nexport function filterQuery<Orm extends OrmAdapter, Context>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\tfilter: FilterValue,\n\toptions?: FilterQueryOptions<Orm, Context>,\n): Orm[\"Query\"] {\n\tconst { context, modifiers } = options ?? {}\n\n\tif (!filter) {\n\t\treturn query\n\t}\n\tif (!isPlainObject(filter)) {\n\t\tthrow new Error(`Invalid filter: ${filter}, must be plain object.`)\n\t}\n\tfor (const [field, value] of Object.entries(filter)) {\n\t\tif (value === undefined) {\n\t\t\t// Support optional GraphQL arguments in filter\n\t\t\tcontinue\n\t\t}\n\t\tif (modifiers?.[field]) {\n\t\t\tquery = modifiers[field](query, value, context!) // TODO improve types, get rid of !\n\t\t} else {\n\t\t\tconst [table_field, op0] = field.split(\"__\")\n\t\t\tconst op = op0?.toLowerCase()\n\t\t\t// TODO: validate op\n\t\t\tquery = orm.where(query, table_field, op, value)\n\t\t}\n\t}\n\treturn query\n}\n","import { Buffer } from \"node:buffer\"\n\nimport type { OrmAdapter, SortOrder } from \"../orm/orm\"\n\nimport type { PaginateContext, Paginator } from \"./base\"\n\nexport function defineCursorPaginator(\n\toptions: Partial<CursorPaginatorOptions> = {},\n) {\n\treturn new CursorPaginator(options)\n}\n\nexport interface CursorPaginatorOptions {\n\tfields?: string[]\n\ttake?: number\n}\n\nexport interface CursorPaginatorArgs {\n\tcursor?: string\n\ttake?: number\n}\n\nexport interface CursorPaginatorPage<M> {\n\tnodes: M[]\n\tcursor?: string\n}\n\nclass CursorPaginator<Orm extends OrmAdapter, Context>\nimplements Paginator<Orm, Context> {\n\treadonly path = [\"nodes\"]\n\n\treadonly pageSize: number\n\n\treadonly fields?: Array<{\n\t\tname: string\n\t\tdesc: boolean\n\t}>\n\n\tconstructor(options: CursorPaginatorOptions = {}) {\n\t\tthis.pageSize = options.take ?? 10\n\t\tthis.fields = options.fields?.map((field) => {\n\t\t\tif (field.startsWith(\"-\")) {\n\t\t\t\treturn { name: field.slice(1), desc: true }\n\t\t\t} else {\n\t\t\t\treturn { name: field, desc: false }\n\t\t\t}\n\t\t})\n\t}\n\n\tpaginate(query: Orm[\"Query\"], context: PaginateContext<Orm, Context>) {\n\t\tconst { orm } = context.graph\n\t\tconst { args } = context.tree\n\n\t\tconst pageSize = (args.take as number | undefined) ?? this.pageSize\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\tconst table = orm.get_query_table(query)\n\n\t\tconst orderFields = (\n\t\t\tthis.fields\n\t\t\t\t? this.fields.map<SortOrder>(f => ({\n\t\t\t\t\t\tfield: f.name,\n\t\t\t\t\t\tdir: f.desc ? \"DESC\" : \"ASC\",\n\t\t\t\t\t}))\n\t\t\t\t: orm.get_query_order(query)\n\t\t).map(o => ({ ...o, alias: \"_order_\" + o.field }))\n\n\t\tif (this.fields) {\n\t\t\tquery = orm.reset_query_order(query)\n\t\t\tfor (const { alias, dir } of orderFields) {\n\t\t\t\tquery = orm.add_query_order(query, { field: alias, dir })\n\t\t\t}\n\t\t}\n\n\t\tif (!orderFields.length) {\n\t\t\tthrow new Error(\"Query must be ordered.\")\n\t\t}\n\n\t\tfor (const { field, alias } of orderFields) {\n\t\t\tquery = orm.select_field(query, { field, as: alias })\n\t\t}\n\n\t\tif (cursor) {\n\t\t\tconst parsedCursor = parseCursor(cursor)\n\t\t\t// Prepare raw SQL.\n\t\t\t// For example, for (amount asc, id asc) order, that would be:\n\t\t\t// (amount, $id) >= ($amount, id)\n\t\t\tconst left: string[] = []\n\t\t\tconst right: string[] = []\n\t\t\tfor (let i = 0; i < orderFields.length; ++i) {\n\t\t\t\tconst { field, alias, dir } = orderFields[i]\n\t\t\t\tconst [expressions, placeholders]\n\t\t\t\t\t= dir === \"ASC\" ? [left, right] : [right, left]\n\t\t\t\texpressions.push(`\"${table}\".\"${field}\"`)\n\t\t\t\tplaceholders.push(\"$\" + alias)\n\t\t\t}\n\t\t\tconst sqlExpr = `(${left.join(\",\")}) > (${right.join(\",\")})`\n\t\t\tconst bindings = Object.fromEntries(\n\t\t\t\torderFields.map(({ alias }, i) => [alias, parsedCursor[i]]),\n\t\t\t)\n\t\t\tquery = orm.where_raw(query, sqlExpr, bindings)\n\t\t}\n\t\tquery = orm.set_query_limit(query, pageSize + 1)\n\n\t\t// TODO add support for reverse cursor, borrow implementation from orchid-pagination.\n\t\tfunction createNodeCursor(node: any) {\n\t\t\treturn createCursor(\n\t\t\t\torderFields.map(({ field, alias }) => {\n\t\t\t\t\tconst value = node[alias]\n\t\t\t\t\t// TODO add support for custom serializer(s).\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Unable to create cursor: undefined field ${field} (${alias})`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn String(value)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\treturn orm.set_query_page_result(query, (nodes) => {\n\t\t\tlet cursor: string | undefined\n\t\t\tif (nodes.length > pageSize) {\n\t\t\t\tcursor = createNodeCursor(nodes[pageSize - 1])\n\t\t\t\tnodes = nodes.slice(0, pageSize)\n\t\t\t}\n\t\t\treturn { nodes, cursor }\n\t\t})\n\t}\n}\n\nfunction createCursor(parts: string[]) {\n\treturn Buffer.from(parts.map(String).join(String.fromCharCode(0))).toString(\n\t\t\"base64url\",\n\t)\n}\n\nfunction parseCursor(cursor: string): string[] {\n\treturn Buffer.from(cursor, \"base64url\")\n\t\t.toString()\n\t\t.split(String.fromCharCode(0))\n}\n","import type { OrmAdapter } from \"../orm/orm\"\n\nexport function run_after_query<Orm extends OrmAdapter>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\ttransform: (instance: any) => any,\n): Orm[\"Query\"] {\n\treturn orm.run_after_query(query, async (result) => {\n\t\t// FIXME: returning result is ignored in orchid (unlike objection). Add some hacks instead.\n\t\tif (Array.isArray(result)) {\n\t\t\tconst result1 = await Promise.all(result.map(transform))\n\t\t\treturn result1.filter(Boolean) // Skip empty objects\n\t\t} else if (result) {\n\t\t\treturn transform(result)\n\t\t} else {\n\t\t\t// Supposedly, single query returning NULL\n\t\t\treturn result\n\t\t}\n\t})\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\n\nimport type { TableResolveContext } from \"./table\"\n\nexport interface FieldResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** Table field (if different from GraphQL field) */\n\ttableField?: string\n\t/** Legacy alias for `tableField`. */\n\tmodelField?: string\n\t/** Custom query modifier (if different than simply selecting a field). */\n\tmodify?: FieldResolveModifier<Orm, Context>\n\t/** Post-process selected value. Return a new value or a promise. */\n\ttransform?(\n\t\tvalue: any,\n\t\tinstance: any,\n\t\tcontext: FieldResolveContext<Orm, Context>,\n\t): any\n}\n\nexport type FieldResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: FieldResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface FieldResolveContext<Orm extends OrmAdapter, Context>\n\textends TableResolveContext<Orm, Context> {\n\t/** GraphQL field */\n\tfield: string\n}\n\n// That is a coincidence for now.\nexport type FieldResolver<\n\tOrm extends OrmAdapter,\n\tContext,\n> = FieldResolveModifier<Orm, Context>\n\nexport function parse_field_options<\n\tO extends Pick<FieldResolverOptions<any, any>, \"modelField\" | \"tableField\">,\n>(options: O): Omit<O, \"modelField\"> {\n\tconst { tableField, modelField } = options\n\tif (tableField && modelField) {\n\t\tthrow new Error(\n\t\t\t`Both tableField and modelField are defined. Use only one of them.`,\n\t\t)\n\t}\n\treturn { ...options, tableField: tableField || modelField }\n}\n\nexport function defineFieldResolver<Orm extends OrmAdapter, Context>(\n\toptions: FieldResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify, transform } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { field } = context\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t} else {\n\t\t\tquery = context.graph.orm.select_field(query, {\n\t\t\t\tfield: tableField || field,\n\t\t\t\tas: field,\n\t\t\t})\n\t\t}\n\t\tif (transform) {\n\t\t\tquery = run_after_query(context.graph.orm, query, async (instance) => {\n\t\t\t\tinstance[field] = await transform(instance[field], instance, context)\n\t\t\t\treturn instance\n\t\t\t})\n\t\t}\n\t\treturn query\n\t}\n}\n","import type { GraphQLResolveInfo } from \"graphql\"\nimport type { ResolveTree } from \"graphql-parse-resolve-info\"\nimport { parseResolveInfo } from \"graphql-parse-resolve-info\"\n\nimport type { FilterConfig } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\nimport type { Paginator } from \"../paginators/base\"\n\nimport type { TableResolver, TableResolverOptions } from \"./table\"\n\nexport type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<\n\tTableResolverOptions<Orm, Context>,\n\t\"allowAllFields\" | \"allowAllFilters\"\n>\n\nexport interface GraphResolveOptions<Context> {\n\tinfo: GraphQLResolveInfo\n\tcontext: Context\n\tfilters?: FilterConfig\n\t/** Subfield path if not resolving root query, e.g.: ['user'] */\n\tpath?: string[]\n}\n\nexport type GraphResolveContext<Context> = Omit<\n\tGraphResolveOptions<Context>,\n\t\"info\"\n> & {\n\ttree: ResolveTree\n}\n\nexport class GraphResolver<Orm extends OrmAdapter, Context> {\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly type_resolvers: Record<string, TableResolver<Orm, Context>>,\n\t\treadonly options: GraphResolverOptions<Orm, Context> = {},\n\t) {}\n\n\tresolve<T>(\n\t\tquery: Orm[\"Query\"],\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t): Promise<T> {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_type(query, { ...context, tree })\n\t}\n\n\tresolvePage(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t) {\n\t\tconst tree = this._get_resolve_tree(info)\n\t\treturn this._resolve_page(query, paginator, { ...context, tree })\n\t}\n\n\t_get_resolve_tree(info: GraphQLResolveInfo) {\n\t\treturn parseResolveInfo(info) as ResolveTree\n\t}\n\n\t_resolve_type(\n\t\tquery: Orm[\"Query\"],\n\t\tcontext: GraphResolveContext<Context>,\n\t): Orm[\"Query\"] {\n\t\tlet { tree } = context\n\t\t// Dive into subtree if requested.\n\t\tif (context.path) {\n\t\t\tfor (const field of context.path) {\n\t\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t\tif (!tree) {\n\t\t\t\t\t// This graphql field was never requested, ignore.\n\t\t\t\t\t// This happens when a user resolves a graph for a root subfield which was not requested by the client (and is thus not present in the tree).\n\t\t\t\t\t//\n\t\t\t\t\t// FIXME: this break typings contract. We are supposed to return a query.\n\t\t\t\t\treturn Promise.resolve()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\tconst type_resolver = this.type_resolvers[type]\n\t\tif (!type_resolver) {\n\t\t\tthrow new Error(`Resolver not found for type ${type}.`)\n\t\t}\n\t\treturn type_resolver.resolve(query, {\n\t\t\t...context,\n\t\t\tgraph: this,\n\t\t\ttree,\n\t\t\ttype,\n\t\t\tpath: undefined,\n\t\t})\n\t}\n\n\t_resolve_page(\n\t\tquery: Orm[\"Query\"],\n\t\tpaginator: Paginator<Orm, Context>,\n\t\tcontext: GraphResolveContext<Context>,\n\t) {\n\t\tif (context.path) {\n\t\t\t// TODO: handle non-empty context.path\n\t\t\tthrow new Error(\"Paginating under non-root path not yet supported.\")\n\t\t}\n\t\tquery = this._resolve_type(query, { ...context, path: paginator.path })\n\t\treturn paginator.paginate(query, {\n\t\t\t...context,\n\t\t\tgraph: this,\n\t\t})\n\t}\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport type { Paginator } from \"../paginators/base\"\n\nimport type { FieldResolver } from \"./field\"\nimport { parse_field_options } from \"./field\"\nimport type { RelationResolverOptions } from \"./relation\"\n\nexport function definePageResolver<Orm extends OrmAdapter, Context>(\n\tpaginator: Paginator<Orm, Context>,\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\t// Objection.js requires a workaround to handle paginated content,\n\t\t// it must be saved into context and re-injected later.\n\t\t// The modify + finish is a no-op in Orchid.\n\t\tconst pagination_context = {}\n\t\tquery = graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = modify ? modify(subquery, context) : subquery\n\t\t\t\tsubquery = graph._resolve_page(subquery, paginator, context)\n\t\t\t\tsubquery = graph.orm.modify_subquery_pagination(\n\t\t\t\t\tsubquery,\n\t\t\t\t\tpagination_context,\n\t\t\t\t)\n\t\t\t\treturn subquery\n\t\t\t},\n\t\t})\n\t\tquery = graph.orm.finish_query_pagination(query, field, pagination_context)\n\t\treturn query\n\t}\n}\n","import type { FilterConfig } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\n\nimport type {\n\tFieldResolver,\n\tFieldResolverOptions,\n} from \"./field\"\nimport { parse_field_options } from \"./field\"\nimport type { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Orm extends OrmAdapter, Context>\n\textends Omit<FieldResolverOptions<Orm, Context>, \"modify\"> {\n\tfilters?: FilterConfig\n\tmodify?: TableResolveModifier<Orm, Context>\n}\n\nexport function defineRelationResolver<Orm extends OrmAdapter, Context>(\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, filters, modify } = parse_field_options(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\treturn graph.orm.select_relation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolve_type(subquery, { ...context, filters })\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t}\n}\n","import type { FilterModifier, FilterValue } from \"../filter\"\nimport { filterQuery } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\nimport { run_after_query } from \"../utils/run-after\"\n\nimport type { FieldResolver } from \"./field\"\nimport { defineFieldResolver } from \"./field\"\nimport type { GraphResolveContext, GraphResolver } from \"./graph\"\nimport { defineRelationResolver } from \"./relation\"\n\nexport interface TableResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** allow to resolve all table fields without explicitly listing them */\n\tallowAllFields?: boolean\n\t/** allow to filter all table fields without explicitly listing them */\n\tallowAllFilters?: boolean\n\tfields?: Record<string, SimpleFieldResolver<Orm, Context>>\n\tmodifiers?: Record<string, TableFilterModifier<Orm, Context>>\n\tmodify?: TableResolveModifier<Orm, Context>\n\ttransform?(instance: any, context: any): void | PromiseLike<void>\n}\n\nexport type SimpleFieldResolver<Orm extends OrmAdapter, Context>\n\t= | true\n\t\t| string\n\t\t| FieldResolver<Orm, Context>\n\nexport type TableResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface TableResolveContext<Orm extends OrmAdapter, Context>\n\textends GraphResolveContext<Context> {\n\tgraph: GraphResolver<Orm, Context>\n\t/** GraphQL type */\n\ttype: string\n}\n\nexport type TableFilterModifier<Orm extends OrmAdapter, Context> = FilterModifier<Orm, TableResolveContext<Orm, Context>>\n\nexport class TableResolver<Orm extends OrmAdapter, Context> {\n\t// Introspection results\n\treadonly relations: Set<string>\n\treadonly virtual_fields: Set<string>\n\treadonly modifiers?: Record<string, TableFilterModifier<Orm, Context>>\n\n\treadonly table_field_resolvers?: Record<string, FieldResolver<Orm, Context>>\n\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly table: Orm[\"Table\"],\n\t\treadonly options: TableResolverOptions<Orm, Context> = {},\n\t) {\n\t\tthis.relations = new Set(orm.get_table_relations(table))\n\t\tthis.virtual_fields = new Set(orm.get_table_virtual_fields(table))\n\t\tthis.modifiers = { ...orm.get_table_modifiers(table), ...options.modifiers }\n\n\t\t// Pre-create field resolvers\n\t\tconst { fields } = options\n\t\tif (fields) {\n\t\t\tthis.table_field_resolvers = Object.keys(fields).reduce<\n\t\t\t\tRecord<string, FieldResolver<Orm, Context>>\n\t\t\t>((resolvers, field) => {\n\t\t\t\tconst r0 = fields[field]\n\t\t\t\tconst r: FieldResolver<Orm, Context> | undefined\n\t\t\t\t\t= typeof r0 === \"function\"\n\t\t\t\t\t\t? r0\n\t\t\t\t\t\t: r0 === true\n\t\t\t\t\t\t\t? this._get_default_field_resolver(field)\n\t\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t\t\t? this._get_default_field_resolver(field, r0)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\tif (r === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Field resolver must be a function, string, or true; found ${typeof r0}.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tresolvers[field] = r\n\t\t\t\treturn resolvers\n\t\t\t}, {})\n\t\t}\n\t}\n\n\t/** Modify query to select fields/relations and filter the result set. */\n\tresolve(query: Orm[\"Query\"], context: TableResolveContext<Orm, Context>) {\n\t\tconst { modify, transform } = this.options\n\t\tconst { graph, tree, type, filters } = context\n\n\t\tconst query_table = this.orm.get_query_table(query)\n\t\tconst table_table = this.orm.get_table_table(this.table)\n\n\t\tif (query_table !== table_table) {\n\t\t\tthrow new Error(\n\t\t\t\t`Mismatching query table for type ${type}: expected ${table_table}, received ${query_table}.`,\n\t\t\t)\n\t\t}\n\n\t\tconst allow_all_fields\n\t\t\t= this.options.allowAllFields\n\t\t\t\t?? graph.options.allowAllFields\n\t\t\t\t?? !this.options.fields\n\n\t\tif (!allow_all_fields && !this.table_field_resolvers) {\n\t\t\tthrow new Error(\n\t\t\t\t`Resolver for type ${type} must either allow all fields or specify options.fields.`,\n\t\t\t)\n\t\t}\n\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t}\n\n\t\tfor (const subtree of Object.values(tree.fieldsByTypeName[type])) {\n\t\t\tconst field = subtree.name\n\t\t\tconst r: FieldResolver<Orm, Context> | undefined\n\t\t\t\t= this.table_field_resolvers?.[field]\n\t\t\t\t\t|| (allow_all_fields ? this._get_default_field_resolver(field) : undefined)\n\t\t\tif (!r) {\n\t\t\t\tthrow new Error(`No field resolver defined for field ${type}.${field}.`)\n\t\t\t}\n\t\t\tif (r) {\n\t\t\t\tquery = r(query, { ...context, tree: subtree, field })\n\t\t\t}\n\t\t}\n\n\t\tconst filter = context.tree.args?.filter\n\t\tif (filter) {\n\t\t\tconst allowAllFilters = this.options.allowAllFilters ?? graph.options.allowAllFilters\n\t\t\tconst filterConfig = allowAllFilters ? true : filters\n\n\t\t\tif (filterConfig) {\n\t\t\t\tquery = filterQuery<Orm, TableResolveContext<Orm, Context>>(context.graph.orm, query, filter as FilterValue, {\n\t\t\t\t\tmodifiers: this.modifiers,\n\t\t\t\t\tcontext,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tif (transform) {\n\t\t\tquery = run_after_query(this.orm, query, (instance) => {\n\t\t\t\treturn transform(instance, context)\n\t\t\t})\n\t\t}\n\n\t\tquery = this.orm.prevent_select_all(query)\n\n\t\treturn query\n\t}\n\n\t/**\n\t * Create field resolver which will modify query to resolve GraphQL field.\n\t */\n\t_get_default_field_resolver(\n\t\tfield: string,\n\t\ttableField?: string,\n\t): FieldResolver<Orm, Context> {\n\t\tconst table_field_lookup = tableField || field\n\t\tif (\n\t\t\tthis.options.modifiers?.[table_field_lookup]\n\t\t\t|| this.virtual_fields.has(table_field_lookup)\n\t\t) {\n\t\t\t// Keep query as is.\n\t\t\treturn query => query\n\t\t} else if (this.relations.has(table_field_lookup)) {\n\t\t\t// TODO: pre-create and cache\n\t\t\treturn defineRelationResolver({ tableField })\n\t\t} else {\n\t\t\t// TODO: create simplified resolver?\n\t\t\treturn defineFieldResolver({ tableField })\n\t\t}\n\t}\n}\n","import type { OrmAdapter, SortOrder } from \"graphql-orm\"\nimport type { Query, SelectQueryData, Table } from \"orchid-orm\"\nimport { raw } from \"orchid-orm\"\n\nexport type OrchidOrm = OrmAdapter<\n\tTable,\n\tQuery,\n\t// TODO: Type as QueryTransform once it's published.\n\tPick<Promise<any>, \"then\" | \"catch\">\n>\n\nexport const orm: OrchidOrm = {\n\tTable: undefined as unknown as OrchidOrm[\"Table\"],\n\tQuery: undefined as unknown as OrchidOrm[\"Query\"],\n\tQueryTransform: undefined as unknown as OrchidOrm[\"QueryTransform\"],\n\n\t// Reflection\n\n\tget_table_table(table) {\n\t\treturn table.table!\n\t},\n\n\tget_table_relations(table) {\n\t\treturn Object.keys(table.relations)\n\t},\n\n\tget_table_virtual_fields() {\n\t\t// Not supported by Orchid.\n\t\treturn []\n\t},\n\n\tget_table_modifiers() {\n\t\treturn undefined\n\t},\n\n\tget_query_table(query) {\n\t\tif (!query.table) {\n\t\t\tthrow new Error(\"Query must have table.\")\n\t\t}\n\t\treturn query.table\n\t},\n\n\t// Select\n\n\tselect_field(query, { field, as }) {\n\t\treturn query.select({ [as]: field })\n\t},\n\n\tselect_relation(query, { relation, as, modify }) {\n\t\t// as any casts needed in orchid-orm 1.31+\n\t\treturn query.select({\n\t\t\t[as]: (q: any) => modify(q[relation]),\n\t\t} as any)\n\t},\n\n\t// Find\n\n\twhere(query, field, op, value) {\n\t\treturn query.where({ [field]: op ? { [op]: value } : value })\n\t},\n\n\twhere_raw(query, expression, bindings) {\n\t\treturn query.where(raw({ raw: expression, values: bindings }))\n\t},\n\n\t// Order & Limit\n\n\treset_query_order(query) {\n\t\treturn query.clear(\"order\")\n\t},\n\n\tadd_query_order(query, { field, dir }) {\n\t\treturn query.order({ [field]: dir })\n\t},\n\n\tget_query_order(query) {\n\t\treturn (\n\t\t\t(query.q as SelectQueryData).order?.flatMap<SortOrder>((orderItem) => {\n\t\t\t\tif (typeof orderItem === \"string\") {\n\t\t\t\t\treturn { field: \"orderItem\", dir: \"ASC\" }\n\t\t\t\t} else if (typeof orderItem === \"object\") {\n\t\t\t\t\treturn Object.entries(orderItem).map<SortOrder>(([field, order]) => {\n\t\t\t\t\t\tconst [dir] = order.split(\" \", 1)\n\t\t\t\t\t\tif (dir === \"ASC\" || dir === \"DESC\") {\n\t\t\t\t\t\t\treturn { field, dir }\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(\"Unsupported order: \" + order)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError(\"Unsupported order type: \" + orderItem)\n\t\t\t\t}\n\t\t\t}) || []\n\t\t)\n\t},\n\n\tset_query_limit(query, limit) {\n\t\treturn query.limit(limit)\n\t},\n\n\t// Pagination helpers\n\n\tset_query_page_result(query, get_page) {\n\t\treturn query.transform(nodes => get_page(nodes as any))\n\t},\n\n\tmodify_subquery_pagination(subquery) {\n\t\treturn subquery\n\t},\n\n\tfinish_query_pagination(query) {\n\t\treturn query\n\t},\n\n\t// Misc\n\n\trun_after_query(query, fn) {\n\t\treturn query.afterQuery(data => fn(data))\n\t},\n\n\tprevent_select_all(query) {\n\t\t// Not needed in Orchid\n\t\treturn query\n\t},\n}\n","import type {\n\tFilterModifier as _FilterModifier,\n\tFilterModifiers as _FilterModifiers,\n\tFilterQueryOptions as _FilterQueryOptions,\n\tFilterValue,\n} from \"graphql-orm\"\nimport { filterQuery as _filterQuery } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\n\nimport { orm } from \"./orm/orm\"\nimport type { OrchidOrm } from \"./orm/orm\"\n\nexport { FilterValue }\n\nexport type FilterQueryOptions<Context = undefined> = _FilterQueryOptions<OrchidOrm, Context>\n\nexport type FilterModifier<Context = undefined> = _FilterModifier<OrchidOrm, Context>\nexport type FilterModifiers<Context = undefined> = _FilterModifiers<OrchidOrm, Context>\n\nexport function filterQuery<Q extends Query, Context = undefined>(\n\tquery: Q,\n\tfilter: FilterValue,\n\toptions?: FilterQueryOptions<Context>,\n): Q {\n\treturn _filterQuery(orm, query, filter, options) as Q\n}\n","import type {\n\tGraphResolveOptions,\n\tGraphResolverOptions,\n\tTableResolver,\n} from \"graphql-orm\"\nimport { GraphResolver } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\n\nimport type { OrchidOrm } from \"../orm/orm\"\nimport { orm } from \"../orm/orm\"\n\nexport function createGraphResolver<Context = unknown>(\n\ttypes: Record<string, TableResolver<OrchidOrm, Context>>,\n\toptions?: GraphResolverOptions<OrchidOrm, Context>,\n) {\n\treturn new OrchidGraphResolver<Context>(types, options)\n}\n\nclass OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Context> {\n\tconstructor(\n\t\tpublic readonly types: Record<string, TableResolver<OrchidOrm, Context>>,\n\t\tpublic readonly options: GraphResolverOptions<OrchidOrm, Context> = {},\n\t) {\n\t\tsuper(orm, types, options)\n\t}\n\n\tresolve<T>(\n\t\tquery: Query & {\n\t\t\treturnType: unknown extends T\n\t\t\t\t? any\n\t\t\t\t: T extends unknown[]\n\t\t\t\t\t? undefined | \"all\"\n\t\t\t\t\t: T extends undefined\n\t\t\t\t\t\t? \"one\"\n\t\t\t\t\t\t: \"oneOrThrow\"\n\t\t},\n\t\toptions: GraphResolveOptions<Context>,\n\t): Promise<T> {\n\t\treturn super.resolve(query, options)\n\t}\n}\n","import type { TableResolverOptions } from \"graphql-orm\"\nimport { TableResolver } from \"graphql-orm\"\nimport type { Table } from \"orchid-orm\"\n\nimport type { OrchidOrm } from \"../orm/orm\"\nimport { orm } from \"../orm/orm\"\n\nexport function defineTableResolver<Context = unknown>(\n\ttable: Table,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {},\n) {\n\treturn new TableResolver(orm, table as any, options)\n}\n"],"mappings":"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","names":["filterQuery","orm","orm","cursor","orm","orm","type","orm","filterQuery"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../base/src/utils/is-plain-object.ts","../../base/src/filter/filter.ts","../../base/src/paginators/cursor.ts","../../base/src/utils/run-after.ts","../../base/src/resolvers/field.ts","../../base/src/resolvers/graph.ts","../../base/src/resolvers/page.ts","../../base/src/resolvers/relation.ts","../../base/src/resolvers/table.ts","../src/orm/orm.ts","../src/filter.ts","../src/resolvers/graph.ts","../src/resolvers/table.ts"],"sourcesContent":["export * from \"./filter\"\nexport {\n\tcreateGraphResolver,\n\tcreateGraphResolver as graph,\n} from \"./resolvers/graph\"\nexport {\n\tdefineTableResolver,\n\tdefineTableResolver as table,\n} from \"./resolvers/table\"\nexport {\n\tdefineCursorPaginator as cursor,\n\tdefineCursorPaginator,\n} from \"graphql-orm\"\nexport { defineFieldResolver, defineFieldResolver as field } from \"graphql-orm\"\nexport { definePageResolver, definePageResolver as page } from \"graphql-orm\"\nexport {\n\tdefineRelationResolver,\n\tdefineRelationResolver as relation,\n} from \"graphql-orm\"\n","export function isPlainObject(obj: any): obj is Record<string, any> {\n\treturn typeof obj === \"object\" && !Array.isArray(obj)\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport { isPlainObject } from \"../utils/is-plain-object\"\n\n// TODO: per-field definitions\nexport type FilterConfig = boolean\n\nexport type FieldFilterScalarValue = null | string | number | boolean\nexport type FieldFilterValue = FieldFilterScalarValue | Exclude<FieldFilterScalarValue, null>[]\nexport type FilterValue = { [property: string]: FieldFilterValue } | null | undefined\n\nexport type FilterQueryOptions<Orm extends OrmAdapter, Context = unknown> = {\n\tmodifiers?: FilterModifiers<Orm, Context>\n} & (Context extends undefined ? {\n\tcontext?: Context\n} : {\n\tcontext: Context\n})\n\nexport type FilterModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tvalue: any,\n\tcontext: Context,\n) => Orm[\"Query\"]\n\nexport type FilterModifiers<Orm extends OrmAdapter, Context> = Record<string, FilterModifier<Orm, Context>>\n\nexport function filterQuery<Orm extends OrmAdapter, Context>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\tfilter: FilterValue,\n\toptions?: FilterQueryOptions<Orm, Context>,\n): Orm[\"Query\"] {\n\tconst { context, modifiers } = options ?? {}\n\n\tif (!filter) {\n\t\treturn query\n\t}\n\tif (!isPlainObject(filter)) {\n\t\tthrow new Error(`Invalid filter: ${filter}, must be plain object.`)\n\t}\n\tfor (const [field, value] of Object.entries(filter)) {\n\t\tif (value === undefined) {\n\t\t\t// Support optional GraphQL arguments in filter\n\t\t\tcontinue\n\t\t}\n\t\tif (modifiers?.[field]) {\n\t\t\tquery = modifiers[field](query, value, context!) // TODO improve types, get rid of !\n\t\t} else {\n\t\t\tconst [tableField, op0] = field.split(\"__\")\n\t\t\tconst op = op0?.toLowerCase()\n\t\t\t// TODO: validate op\n\t\t\tquery = orm.where(query, tableField, op, value)\n\t\t}\n\t}\n\treturn query\n}\n","import { Buffer } from \"node:buffer\"\n\nimport type { OrmAdapter, SortOrder } from \"../orm/orm\"\n\nimport type { PaginateContext, Paginator } from \"./base\"\n\nexport function defineCursorPaginator(\n\toptions: Partial<CursorPaginatorOptions> = {},\n) {\n\treturn new CursorPaginator(options)\n}\n\nexport interface CursorPaginatorOptions {\n\tfields?: string[]\n\ttake?: number\n}\n\nexport interface CursorPaginatorArgs {\n\tcursor?: string\n\ttake?: number\n}\n\nexport interface CursorPaginatorPage<M> {\n\tnodes: M[]\n\tcursor?: string\n}\n\nclass CursorPaginator<Orm extends OrmAdapter, Context>\nimplements Paginator<Orm, Context> {\n\treadonly path = [\"nodes\"]\n\n\treadonly pageSize: number\n\n\treadonly fields?: Array<{\n\t\tname: string\n\t\tdesc: boolean\n\t}>\n\n\tconstructor(options: CursorPaginatorOptions = {}) {\n\t\tthis.pageSize = options.take ?? 10\n\t\tthis.fields = options.fields?.map((field) => {\n\t\t\tif (field.startsWith(\"-\")) {\n\t\t\t\treturn { name: field.slice(1), desc: true }\n\t\t\t} else {\n\t\t\t\treturn { name: field, desc: false }\n\t\t\t}\n\t\t})\n\t}\n\n\tpaginate(query: Orm[\"Query\"], context: PaginateContext<Orm, Context>) {\n\t\tconst { orm } = context.graph\n\t\tconst { args } = context.tree\n\n\t\tconst pageSize = (args.take as number | undefined) ?? this.pageSize\n\t\tconst cursor = args.cursor as string | undefined\n\n\t\tconst table = orm.getQueryTable(query)\n\n\t\tconst orderFields = (\n\t\t\tthis.fields\n\t\t\t\t? this.fields.map<SortOrder>(f => ({\n\t\t\t\t\t\tfield: f.name,\n\t\t\t\t\t\tdir: f.desc ? \"DESC\" : \"ASC\",\n\t\t\t\t\t}))\n\t\t\t\t: orm.getQueryOrder(query)\n\t\t).map(o => ({ ...o, alias: \"_order_\" + o.field }))\n\n\t\tif (this.fields) {\n\t\t\tquery = orm.resetQueryOrder(query)\n\t\t\tfor (const { alias, dir } of orderFields) {\n\t\t\t\tquery = orm.addQueryOrder(query, { field: alias, dir })\n\t\t\t}\n\t\t}\n\n\t\tif (!orderFields.length) {\n\t\t\tthrow new Error(\"Query must be ordered.\")\n\t\t}\n\n\t\tfor (const { field, alias } of orderFields) {\n\t\t\tquery = orm.selectField(query, { field, as: alias })\n\t\t}\n\n\t\tif (cursor) {\n\t\t\tconst parsedCursor = parseCursor(cursor)\n\t\t\t// Prepare raw SQL.\n\t\t\t// For example, for (amount asc, id asc) order, that would be:\n\t\t\t// (amount, $id) >= ($amount, id)\n\t\t\tconst left: string[] = []\n\t\t\tconst right: string[] = []\n\t\t\tfor (let i = 0; i < orderFields.length; ++i) {\n\t\t\t\tconst { field, alias, dir } = orderFields[i]\n\t\t\t\tconst [expressions, placeholders]\n\t\t\t\t\t= dir === \"ASC\" ? [left, right] : [right, left]\n\t\t\t\texpressions.push(`\"${table}\".\"${field}\"`)\n\t\t\t\tplaceholders.push(\"$\" + alias)\n\t\t\t}\n\t\t\tconst sqlExpr = `(${left.join(\",\")}) > (${right.join(\",\")})`\n\t\t\tconst bindings = Object.fromEntries(\n\t\t\t\torderFields.map(({ alias }, i) => [alias, parsedCursor[i]]),\n\t\t\t)\n\t\t\tquery = orm.whereRaw(query, sqlExpr, bindings)\n\t\t}\n\t\tquery = orm.setQueryLimit(query, pageSize + 1)\n\n\t\t// TODO add support for reverse cursor, borrow implementation from orchid-pagination.\n\t\tfunction createNodeCursor(node: any) {\n\t\t\treturn createCursor(\n\t\t\t\torderFields.map(({ field, alias }) => {\n\t\t\t\t\tconst value = node[alias]\n\t\t\t\t\t// TODO add support for custom serializer(s).\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Unable to create cursor: undefined field ${field} (${alias})`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn String(value)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\treturn orm.setQueryPageResult(query, (nodes) => {\n\t\t\tlet cursor: string | undefined\n\t\t\tif (nodes.length > pageSize) {\n\t\t\t\tcursor = createNodeCursor(nodes[pageSize - 1])\n\t\t\t\tnodes = nodes.slice(0, pageSize)\n\t\t\t}\n\t\t\treturn { nodes, cursor }\n\t\t})\n\t}\n}\n\nfunction createCursor(parts: string[]) {\n\treturn Buffer.from(parts.map(String).join(String.fromCharCode(0))).toString(\n\t\t\"base64url\",\n\t)\n}\n\nfunction parseCursor(cursor: string): string[] {\n\treturn Buffer.from(cursor, \"base64url\")\n\t\t.toString()\n\t\t.split(String.fromCharCode(0))\n}\n","import type { OrmAdapter } from \"../orm/orm\"\n\nexport function runAfterQuery<Orm extends OrmAdapter>(\n\torm: Orm,\n\tquery: Orm[\"Query\"],\n\ttransform: (instance: any) => any,\n): Orm[\"Query\"] {\n\treturn orm.runAfterQuery(query, async (result) => {\n\t\t// FIXME: returning result is ignored in orchid (unlike objection). Add some hacks instead.\n\t\tif (Array.isArray(result)) {\n\t\t\tconst result1 = await Promise.all(result.map(transform))\n\t\t\treturn result1.filter(Boolean) // Skip empty objects\n\t\t} else if (result) {\n\t\t\treturn transform(result)\n\t\t} else {\n\t\t\t// Supposedly, single query returning NULL\n\t\t\treturn result\n\t\t}\n\t})\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport { runAfterQuery } from \"../utils/run-after\"\n\nimport type { TableResolveContext } from \"./table\"\n\nexport interface FieldResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** Table field (if different from GraphQL field) */\n\ttableField?: string\n\t/** Legacy alias for `tableField`. */\n\tmodelField?: string\n\t/** Custom query modifier (if different than simply selecting a field). */\n\tmodify?: FieldResolveModifier<Orm, Context>\n\t/** Post-process selected value. Return a new value or a promise. */\n\ttransform?(\n\t\tvalue: any,\n\t\tinstance: any,\n\t\tcontext: FieldResolveContext<Orm, Context>,\n\t): any\n}\n\nexport type FieldResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: FieldResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface FieldResolveContext<Orm extends OrmAdapter, Context>\n\textends TableResolveContext<Orm, Context> {\n\t/** GraphQL field */\n\tfield: string\n}\n\n// That is a coincidence for now.\nexport type FieldResolver<\n\tOrm extends OrmAdapter,\n\tContext,\n> = FieldResolveModifier<Orm, Context>\n\nexport function parseFieldOptions<\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 } = parseFieldOptions(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.selectField(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 = runAfterQuery(context.graph.orm, query, async (instance) => {\n\t\t\t\tinstance[field] = await transform(instance[field], instance, context)\n\t\t\t\treturn instance\n\t\t\t})\n\t\t}\n\t\treturn query\n\t}\n}\n","import type { GraphQLResolveInfo } from \"graphql\"\nimport type { ResolveTree } from \"graphql-parse-resolve-info\"\nimport { parseResolveInfo } from \"graphql-parse-resolve-info\"\n\nimport type { FilterConfig } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\nimport type { Paginator } from \"../paginators/base\"\n\nimport type { TableResolver, TableResolverOptions } from \"./table\"\n\nexport type GraphResolverOptions<Orm extends OrmAdapter, Context> = Pick<\n\tTableResolverOptions<Orm, Context>,\n\t\"allowAllFields\" | \"allowAllFilters\"\n>\n\nexport interface GraphResolveOptions<Context> {\n\tinfo: GraphQLResolveInfo\n\tcontext: Context\n\tfilters?: FilterConfig\n\t/** Subfield path if not resolving root query, e.g.: ['user'] */\n\tpath?: string[]\n}\n\nexport type GraphResolveContext<Context> = Omit<\n\tGraphResolveOptions<Context>,\n\t\"info\"\n> & {\n\ttree: ResolveTree\n}\n\nexport class GraphResolver<Orm extends OrmAdapter, Context> {\n\tconstructor(\n\t\treadonly orm: Orm,\n\t\treadonly typeResolvers: Record<string, TableResolver<Orm, Context>>,\n\t\treadonly options: GraphResolverOptions<Orm, Context> = {},\n\t) {}\n\n\tresolve<T>(\n\t\tquery: Orm[\"Query\"],\n\t\t{ info, ...context }: GraphResolveOptions<Context>,\n\t): Promise<T> {\n\t\tconst tree = this._getResolveTree(info)\n\t\treturn this._resolveType(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._getResolveTree(info)\n\t\treturn this._resolvePage(query, paginator, { ...context, tree })\n\t}\n\n\t_getResolveTree(info: GraphQLResolveInfo) {\n\t\treturn parseResolveInfo(info) as ResolveTree\n\t}\n\n\t_resolveType(\n\t\tquery: Orm[\"Query\"],\n\t\tcontext: GraphResolveContext<Context>,\n\t): Orm[\"Query\"] {\n\t\tlet { tree } = context\n\t\t// Dive into subtree if requested.\n\t\tif (context.path) {\n\t\t\tfor (const field of context.path) {\n\t\t\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\t\t\ttree = tree.fieldsByTypeName[type][field]\n\t\t\t\tif (!tree) {\n\t\t\t\t\t// This graphql field was never requested, ignore.\n\t\t\t\t\t// This happens when a user resolves a graph for a root subfield which was not requested by the client (and is thus not present in the tree).\n\t\t\t\t\t//\n\t\t\t\t\t// FIXME: this break typings contract. We are supposed to return a query.\n\t\t\t\t\treturn Promise.resolve()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst type = Object.keys(tree.fieldsByTypeName)[0]\n\t\tconst typeResolver = this.typeResolvers[type]\n\t\tif (!typeResolver) {\n\t\t\tthrow new Error(`Resolver not found for type ${type}.`)\n\t\t}\n\t\treturn typeResolver.resolve(query, {\n\t\t\t...context,\n\t\t\tgraph: this,\n\t\t\ttree,\n\t\t\ttype,\n\t\t\tpath: undefined,\n\t\t})\n\t}\n\n\t_resolvePage(\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._resolveType(query, { ...context, path: paginator.path })\n\t\treturn paginator.paginate(query, {\n\t\t\t...context,\n\t\t\tgraph: this,\n\t\t})\n\t}\n}\n","import type { OrmAdapter } from \"../orm/orm\"\nimport type { Paginator } from \"../paginators/base\"\n\nimport type { FieldResolver } from \"./field\"\nimport { parseFieldOptions } from \"./field\"\nimport type { RelationResolverOptions } from \"./relation\"\n\nexport function definePageResolver<Orm extends OrmAdapter, Context>(\n\tpaginator: Paginator<Orm, Context>,\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, modify } = parseFieldOptions(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 paginationContext = {}\n\t\tquery = graph.orm.selectRelation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = modify ? modify(subquery, context) : subquery\n\t\t\t\tsubquery = graph._resolvePage(subquery, paginator, context)\n\t\t\t\tsubquery = graph.orm.modifySubqueryPagination(\n\t\t\t\t\tsubquery,\n\t\t\t\t\tpaginationContext,\n\t\t\t\t)\n\t\t\t\treturn subquery\n\t\t\t},\n\t\t})\n\t\tquery = graph.orm.finishQueryPagination(query, field, paginationContext)\n\t\treturn query\n\t}\n}\n","import type { FilterConfig } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\n\nimport type {\n\tFieldResolver,\n\tFieldResolverOptions,\n} from \"./field\"\nimport { parseFieldOptions } from \"./field\"\nimport type { TableResolveModifier } from \"./table\"\n\nexport interface RelationResolverOptions<Orm extends OrmAdapter, Context>\n\textends Omit<FieldResolverOptions<Orm, Context>, \"modify\"> {\n\tfilters?: FilterConfig\n\tmodify?: TableResolveModifier<Orm, Context>\n}\n\nexport function defineRelationResolver<Orm extends OrmAdapter, Context>(\n\toptions: RelationResolverOptions<Orm, Context> = {},\n): FieldResolver<Orm, Context> {\n\tconst { tableField, filters, modify } = parseFieldOptions(options)\n\n\treturn function resolve(query, context) {\n\t\tconst { graph, field } = context\n\t\treturn graph.orm.selectRelation(query, {\n\t\t\trelation: tableField || field,\n\t\t\tas: field,\n\t\t\tmodify(subquery) {\n\t\t\t\tsubquery = graph._resolveType(subquery, { ...context, filters })\n\t\t\t\treturn modify ? modify(subquery, context) : subquery\n\t\t\t},\n\t\t})\n\t}\n}\n","import type { FilterModifier, FilterValue } from \"../filter\"\nimport { filterQuery } from \"../filter\"\nimport type { OrmAdapter } from \"../orm/orm\"\nimport { runAfterQuery } from \"../utils/run-after\"\n\nimport type { FieldResolver } from \"./field\"\nimport { defineFieldResolver } from \"./field\"\nimport type { GraphResolveContext, GraphResolver } from \"./graph\"\nimport { defineRelationResolver } from \"./relation\"\n\nexport interface TableResolverOptions<Orm extends OrmAdapter, Context> {\n\t/** allow to resolve all table fields without explicitly listing them */\n\tallowAllFields?: boolean\n\t/** allow to filter all table fields without explicitly listing them */\n\tallowAllFilters?: boolean\n\tfields?: Record<string, SimpleFieldResolver<Orm, Context>>\n\tmodifiers?: Record<string, TableFilterModifier<Orm, Context>>\n\tmodify?: TableResolveModifier<Orm, Context>\n\ttransform?(instance: any, context: any): void | PromiseLike<void>\n}\n\nexport type SimpleFieldResolver<Orm extends OrmAdapter, Context>\n\t= | true\n\t\t| string\n\t\t| FieldResolver<Orm, Context>\n\nexport type TableResolveModifier<Orm extends OrmAdapter, Context> = (\n\tquery: Orm[\"Query\"],\n\tcontext: TableResolveContext<Orm, Context>,\n) => Orm[\"Query\"]\n\nexport interface TableResolveContext<Orm extends OrmAdapter, Context>\n\textends GraphResolveContext<Context> {\n\tgraph: GraphResolver<Orm, Context>\n\t/** GraphQL type */\n\ttype: string\n}\n\nexport type TableFilterModifier<Orm extends OrmAdapter, Context> = FilterModifier<Orm, TableResolveContext<Orm, Context>>\n\nexport class TableResolver<Orm extends OrmAdapter, Context> {\n\t// Introspection results\n\treadonly relations: Set<string>\n\treadonly virtualFields: Set<string>\n\treadonly modifiers?: Record<string, TableFilterModifier<Orm, Context>>\n\n\treadonly tableFieldResolvers?: 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.getTableRelations(table))\n\t\tthis.virtualFields = new Set(orm.getTableVirtualFields(table))\n\t\tthis.modifiers = { ...orm.getTableModifiers(table), ...options.modifiers }\n\n\t\t// Pre-create field resolvers\n\t\tconst { fields } = options\n\t\tif (fields) {\n\t\t\tthis.tableFieldResolvers = Object.keys(fields).reduce<\n\t\t\t\tRecord<string, FieldResolver<Orm, Context>>\n\t\t\t>((resolvers, field) => {\n\t\t\t\tconst r0 = fields[field]\n\t\t\t\tconst r: FieldResolver<Orm, Context> | undefined\n\t\t\t\t\t= typeof r0 === \"function\"\n\t\t\t\t\t\t? r0\n\t\t\t\t\t\t: r0 === true\n\t\t\t\t\t\t\t? this._getDefaultFieldResolver(field)\n\t\t\t\t\t\t\t: typeof r0 === \"string\"\n\t\t\t\t\t\t\t\t? this._getDefaultFieldResolver(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 queryTable = this.orm.getQueryTable(query)\n\t\tconst tableName = this.orm.getTableName(this.table)\n\n\t\tif (queryTable !== tableName) {\n\t\t\tthrow new Error(\n\t\t\t\t`Mismatching query table for type ${type}: expected ${tableName}, received ${queryTable}.`,\n\t\t\t)\n\t\t}\n\n\t\tconst allowAllFields\n\t\t\t= this.options.allowAllFields\n\t\t\t\t?? graph.options.allowAllFields\n\t\t\t\t?? !this.options.fields\n\n\t\tif (!allowAllFields && !this.tableFieldResolvers) {\n\t\t\tthrow new Error(\n\t\t\t\t`Resolver for type ${type} must either allow all fields or specify options.fields.`,\n\t\t\t)\n\t\t}\n\n\t\tif (modify) {\n\t\t\tquery = modify(query, context)\n\t\t}\n\n\t\tfor (const subtree of Object.values(tree.fieldsByTypeName[type])) {\n\t\t\tconst field = subtree.name\n\t\t\tconst r: FieldResolver<Orm, Context> | undefined\n\t\t\t\t= this.tableFieldResolvers?.[field]\n\t\t\t\t\t|| (allowAllFields ? this._getDefaultFieldResolver(field) : undefined)\n\t\t\tif (!r) {\n\t\t\t\tthrow new Error(`No field resolver defined for field ${type}.${field}.`)\n\t\t\t}\n\t\t\tif (r) {\n\t\t\t\tquery = r(query, { ...context, tree: subtree, field })\n\t\t\t}\n\t\t}\n\n\t\tconst filter = context.tree.args?.filter\n\t\tif (filter) {\n\t\t\tconst allowAllFilters = this.options.allowAllFilters ?? graph.options.allowAllFilters\n\t\t\tconst filterConfig = allowAllFilters ? true : filters\n\n\t\t\tif (filterConfig) {\n\t\t\t\tquery = filterQuery<Orm, TableResolveContext<Orm, Context>>(context.graph.orm, query, filter as FilterValue, {\n\t\t\t\t\tmodifiers: this.modifiers,\n\t\t\t\t\tcontext,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tif (transform) {\n\t\t\tquery = runAfterQuery(this.orm, query, (instance: any) => {\n\t\t\t\treturn transform(instance, context)\n\t\t\t})\n\t\t}\n\n\t\tquery = this.orm.preventSelectAll(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_getDefaultFieldResolver(\n\t\tfield: string,\n\t\ttableField?: string,\n\t): FieldResolver<Orm, Context> {\n\t\tconst tableFieldLookup = tableField || field\n\t\tif (\n\t\t\tthis.options.modifiers?.[tableFieldLookup]\n\t\t\t|| this.virtualFields.has(tableFieldLookup)\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(tableFieldLookup)) {\n\t\t\t// TODO: pre-create and cache\n\t\t\treturn defineRelationResolver({ tableField })\n\t\t} else {\n\t\t\t// TODO: create simplified resolver?\n\t\t\treturn defineFieldResolver({ tableField })\n\t\t}\n\t}\n}\n","import type { OrmAdapter, SortOrder } from \"graphql-orm\"\nimport type { Query, SelectQueryData, Table } from \"orchid-orm\"\nimport { raw } from \"orchid-orm\"\n\nexport type OrchidOrm = OrmAdapter<\n\tTable,\n\tQuery,\n\t// TODO: Type as QueryTransform once it's published.\n\tPick<Promise<any>, \"then\" | \"catch\">\n>\n\nexport const orm: OrchidOrm = {\n\tTable: undefined as unknown as OrchidOrm[\"Table\"],\n\tQuery: undefined as unknown as OrchidOrm[\"Query\"],\n\tQueryTransform: undefined as unknown as OrchidOrm[\"QueryTransform\"],\n\n\t// Reflection\n\n\tgetTableName(table) {\n\t\treturn table.table!\n\t},\n\n\tgetTableRelations(table) {\n\t\treturn Object.keys(table.relations)\n\t},\n\n\tgetTableVirtualFields() {\n\t\t// Not supported by Orchid.\n\t\treturn []\n\t},\n\n\tgetTableModifiers() {\n\t\treturn undefined\n\t},\n\n\tgetQueryTable(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\tselectField(query, { field, as }) {\n\t\treturn query.select({ [as]: field })\n\t},\n\n\tselectRelation(query, { relation, as, modify }) {\n\t\t// as any casts needed in orchid-orm 1.31+\n\t\treturn query.select({\n\t\t\t[as]: (q: any) => modify(q[relation]),\n\t\t} as any)\n\t},\n\n\t// Find\n\n\twhere(query, field, op, value) {\n\t\treturn query.where({ [field]: op ? { [op]: value } : value })\n\t},\n\n\twhereRaw(query, expression, bindings) {\n\t\treturn query.where(raw({ raw: expression, values: bindings }))\n\t},\n\n\t// Order & Limit\n\n\tresetQueryOrder(query) {\n\t\treturn query.clear(\"order\")\n\t},\n\n\taddQueryOrder(query, { field, dir }) {\n\t\treturn query.order({ [field]: dir })\n\t},\n\n\tgetQueryOrder(query) {\n\t\treturn (\n\t\t\t(query.q as SelectQueryData).order?.flatMap<SortOrder>((orderItem) => {\n\t\t\t\tif (typeof orderItem === \"string\") {\n\t\t\t\t\treturn { field: \"orderItem\", dir: \"ASC\" }\n\t\t\t\t} else if (typeof orderItem === \"object\") {\n\t\t\t\t\treturn Object.entries(orderItem).map<SortOrder>(([field, order]) => {\n\t\t\t\t\t\tconst [dir] = order.split(\" \", 1)\n\t\t\t\t\t\tif (dir === \"ASC\" || dir === \"DESC\") {\n\t\t\t\t\t\t\treturn { field, dir }\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(\"Unsupported order: \" + order)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError(\"Unsupported order type: \" + orderItem)\n\t\t\t\t}\n\t\t\t}) || []\n\t\t)\n\t},\n\n\tsetQueryLimit(query, limit) {\n\t\treturn query.limit(limit)\n\t},\n\n\t// Pagination helpers\n\n\tsetQueryPageResult(query, get_page) {\n\t\treturn query.transform(nodes => get_page(nodes as any))\n\t},\n\n\tmodifySubqueryPagination(subquery) {\n\t\treturn subquery\n\t},\n\n\tfinishQueryPagination(query) {\n\t\treturn query\n\t},\n\n\t// Misc\n\n\trunAfterQuery(query, fn) {\n\t\treturn query.afterQuery(data => fn(data))\n\t},\n\n\tpreventSelectAll(query) {\n\t\t// Not needed in Orchid\n\t\treturn query\n\t},\n}\n","import type {\n\tFilterModifier as _FilterModifier,\n\tFilterModifiers as _FilterModifiers,\n\tFilterQueryOptions as _FilterQueryOptions,\n\tFilterValue,\n} from \"graphql-orm\"\nimport { filterQuery as _filterQuery } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\n\nimport { orm } from \"./orm/orm\"\nimport type { OrchidOrm } from \"./orm/orm\"\n\nexport { FilterValue }\n\nexport type FilterQueryOptions<Context = undefined> = _FilterQueryOptions<OrchidOrm, Context>\n\nexport type FilterModifier<Context = undefined> = _FilterModifier<OrchidOrm, Context>\nexport type FilterModifiers<Context = undefined> = _FilterModifiers<OrchidOrm, Context>\n\nexport function filterQuery<Q extends Query, Context = undefined>(\n\tquery: Q,\n\tfilter: FilterValue,\n\toptions?: FilterQueryOptions<Context>,\n): Q {\n\treturn _filterQuery(orm, query, filter, options) as Q\n}\n","import type {\n\tGraphResolveOptions,\n\tGraphResolverOptions,\n\tTableResolver,\n} from \"graphql-orm\"\nimport { GraphResolver } from \"graphql-orm\"\nimport type { Query } from \"orchid-orm\"\n\nimport type { OrchidOrm } from \"../orm/orm\"\nimport { orm } from \"../orm/orm\"\n\nexport function createGraphResolver<Context = unknown>(\n\ttypes: Record<string, TableResolver<OrchidOrm, Context>>,\n\toptions?: GraphResolverOptions<OrchidOrm, Context>,\n) {\n\treturn new OrchidGraphResolver<Context>(types, options)\n}\n\nclass OrchidGraphResolver<Context> extends GraphResolver<OrchidOrm, Context> {\n\tconstructor(\n\t\tpublic readonly types: Record<string, TableResolver<OrchidOrm, Context>>,\n\t\tpublic readonly options: GraphResolverOptions<OrchidOrm, Context> = {},\n\t) {\n\t\tsuper(orm, types, options)\n\t}\n\n\tresolve<T>(\n\t\tquery: Query & {\n\t\t\treturnType: unknown extends T\n\t\t\t\t? any\n\t\t\t\t: T extends unknown[]\n\t\t\t\t\t? undefined | \"all\"\n\t\t\t\t\t: T extends undefined\n\t\t\t\t\t\t? \"one\"\n\t\t\t\t\t\t: \"oneOrThrow\"\n\t\t},\n\t\toptions: GraphResolveOptions<Context>,\n\t): Promise<T> {\n\t\treturn super.resolve(query, options)\n\t}\n}\n","import type { TableResolverOptions } from \"graphql-orm\"\nimport { TableResolver } from \"graphql-orm\"\nimport type { Table } from \"orchid-orm\"\n\nimport type { OrchidOrm } from \"../orm/orm\"\nimport { orm } from \"../orm/orm\"\n\nexport function defineTableResolver<Context = unknown>(\n\ttable: Table,\n\toptions: TableResolverOptions<OrchidOrm, Context> = {},\n) {\n\treturn new TableResolver(orm, table as any, options)\n}\n"],"mappings":"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","names":["filterQuery","orm","orm","cursor","orm","orm","type","orm","filterQuery"]}
|