Skip to content

Commit ce9b19c

Browse files
authored
feat: make fields configurable for determining whether or not to fetch edges (#614)
* docs: fix link to types file * feat: make fields configurable for determining whether or not to fetch edges * Add changeset
1 parent 0750527 commit ce9b19c

File tree

3 files changed

+47
-5
lines changed

3 files changed

+47
-5
lines changed

.changeset/moody-apricots-wonder.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@slonik/dataloaders": minor
3+
---
4+
5+
feat: make fields configurable for determining whether or not to fetch edges

packages/slonik-dataloaders/src/factories/createConnectionLoaderClass.test.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ describe('createConnectionLoaderClass', () => {
456456
expect(results[1].count).toEqual(2);
457457
});
458458

459-
it('gets the edges without fetching edges', async () => {
459+
it('gets the edges without fetching count', async () => {
460460
const loader = new PersonConnectionLoader(pool);
461461
const results = await Promise.all([
462462
loader.load({
@@ -474,6 +474,38 @@ describe('createConnectionLoaderClass', () => {
474474
expect(results[1].count).toEqual(0);
475475
expect(results[1].edges.length).toEqual(2);
476476
});
477+
478+
it('fetches edges for fields provided in resolverFieldsThatRequireFetchingEdges config variable', async () => {
479+
const loaderClass = createConnectionLoaderClass({
480+
query: sql.type(
481+
z
482+
.object({
483+
id: z.number(),
484+
name: z.string(),
485+
uid: z.string(),
486+
})
487+
.strict(),
488+
)`
489+
SELECT
490+
id,
491+
uid,
492+
name
493+
FROM person
494+
`,
495+
resolverFieldsThatRequireFetchingEdges: ['data'],
496+
});
497+
498+
const loader = new loaderClass(pool);
499+
const result = await loader.load({
500+
info: getInfo(['data']),
501+
});
502+
503+
expect(countTaggedQueries('@count-query')).toEqual(0);
504+
expect(countTaggedQueries('@edges-query')).toEqual(1);
505+
506+
expect(result.count).toEqual(0);
507+
expect(result.edges.length).toEqual(10);
508+
});
477509
});
478510

479511
describe('createConnectionLoaderClass (with validation)', () => {

packages/slonik-dataloaders/src/factories/createConnectionLoaderClass.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,13 @@ const TABLE_ALIAS = 't1';
3737
export const createConnectionLoaderClass = <T extends ZodTypeAny>(config: {
3838
columnNameTransformer?: (column: string) => string;
3939
query: QuerySqlToken<T>;
40+
resolverFieldsThatRequireFetchingEdges?: string[];
4041
}) => {
4142
const { columnNameTransformer = snakeCase, query } = config;
4243

44+
const fieldsThatRequireFetchingEdges =
45+
config.resolverFieldsThatRequireFetchingEdges ?? ['pageInfo', 'edges'];
46+
4347
const columnIdentifiers = getColumnIdentifiers<z.infer<T>>(
4448
TABLE_ALIAS,
4549
columnNameTransformer,
@@ -105,10 +109,11 @@ export const createConnectionLoaderClass = <T extends ZodTypeAny>(config: {
105109
countQueries.push(null);
106110
}
107111

108-
if (
109-
requestedFields.has('pageInfo') ||
110-
requestedFields.has('edges')
111-
) {
112+
const shouldFetchEdges = fieldsThatRequireFetchingEdges.some(
113+
(field) => requestedFields.has(field),
114+
);
115+
116+
if (shouldFetchEdges) {
112117
const orderByExpressions: Array<[SqlToken, OrderDirection]> =
113118
orderBy ? orderBy(columnIdentifiers) : [];
114119

0 commit comments

Comments
 (0)