Skip to content

Commit 2986f94

Browse files
committed
Added config option to limit depth of relations (temporary (hopefully) solution to issue #11)
1 parent 4055a35 commit 2986f94

File tree

9 files changed

+52
-17
lines changed

9 files changed

+52
-17
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ runPg.ts
1313
Tests/.temp
1414
Tests/Migrations
1515
.DS_Store
16+
drizzle.test-heavy.ts

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "drizzle-graphql",
33
"type": "module",
44
"author": "Drizzle Team",
5-
"version": "0.7.3",
5+
"version": "0.8.0",
66
"description": "Automatically generate GraphQL schema or customizable schema config fields from Drizzle ORM schema",
77
"scripts": {
88
"build": "pnpm tsx scripts/build.ts",
@@ -44,7 +44,7 @@
4444
"cpy": "^11.0.1",
4545
"dockerode": "^4.0.2",
4646
"dprint": "^0.45.1",
47-
"drizzle-kit": "^0.21.2",
47+
"drizzle-kit": "^0.21.4",
4848
"drizzle-orm": "0.30.10",
4949
"get-port": "^7.0.0",
5050
"glob": "^10.3.10",

pnpm-lock.yaml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,22 @@ export const buildSchema = <TDbClient extends AnyDrizzleDB<any>>(
1818
);
1919
}
2020

21+
if (typeof config?.relationsDepthLimit === 'number') {
22+
if (config.relationsDepthLimit < 0) {
23+
throw new Error('config.relationsDepthLimit is supposed to be nonnegative integer or undefined!');
24+
}
25+
if (config.relationsDepthLimit !== ~~config.relationsDepthLimit) {
26+
throw new Error('config.relationsDepthLimit is supposed to be nonnegative integer or undefined!');
27+
}
28+
}
29+
2130
let generatorOutput;
2231
if (is(db, MySqlDatabase)) {
23-
generatorOutput = generateMySQL(db, schema);
32+
generatorOutput = generateMySQL(db, schema, config?.relationsDepthLimit);
2433
} else if (is(db, PgDatabase)) {
25-
generatorOutput = generatePG(db, schema);
34+
generatorOutput = generatePG(db, schema, config?.relationsDepthLimit);
2635
} else if (is(db, BaseSQLiteDatabase)) {
27-
generatorOutput = generateSQLite(db, schema);
36+
generatorOutput = generateSQLite(db, schema, config?.relationsDepthLimit);
2837
} else throw new Error('Unknown database instance type');
2938

3039
const { queries, mutations, inputs, types } = generatorOutput;

src/types.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -392,13 +392,25 @@ export type GeneratedData<
392392
entities: GeneratedEntities<TDatabase>;
393393
};
394394

395-
/**
396-
* Determines whether generated mutations will be passed to returned schema.
397-
*
398-
* Set value to `false` to omit mutations from returned schema.
399-
*
400-
* Flag is treated as if set to `true` by default.
401-
*/
402395
export type BuildSchemaConfig = {
396+
/**
397+
* Determines whether generated mutations will be passed to returned schema.
398+
*
399+
* Set value to `false` to omit mutations from returned schema.
400+
*
401+
* Flag is treated as if set to `true` by default.
402+
*/
403403
mutations?: boolean;
404+
/**
405+
* Limits depth of generated relation fields on queries.
406+
*
407+
* Expects non-negative integer or undefined.
408+
*
409+
* Set value to `undefined` to not limit relation depth.
410+
*
411+
* Set value to `0` to omit relations altogether.
412+
*
413+
* Value is treated as if set to `undefined` by default.
414+
*/
415+
relationsDepthLimit?: number;
404416
};

src/util/builders/common.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,8 @@ const generateSelectFields = <TWithOrder extends boolean>(
325325
relationMap: Record<string, Record<string, TableNamedRelations>>,
326326
typeName: string,
327327
withOrder: TWithOrder,
328+
relationsDepthLimit: number | undefined,
329+
currentDepth: number = 0,
328330
usedTables: Set<string> = new Set(),
329331
): SelectData<TWithOrder> => {
330332
const relations = relationMap[tableName];
@@ -340,7 +342,10 @@ const generateSelectFields = <TWithOrder extends boolean>(
340342

341343
const tableFields = generateTableSelectTypeFieldsCached(table, tableName);
342344

343-
if (usedTables.has(tableName) || !relationEntries.length) {
345+
if (
346+
usedTables.has(tableName) || (typeof relationsDepthLimit === 'number' && currentDepth >= relationsDepthLimit)
347+
|| !relationEntries.length
348+
) {
344349
return {
345350
order,
346351
filters,
@@ -351,6 +356,7 @@ const generateSelectFields = <TWithOrder extends boolean>(
351356

352357
const rawRelationFields: [string, ConvertedRelationColumnWithArgs][] = [];
353358
const updatedUsedTables = new Set(usedTables).add(tableName);
359+
const newDepth = currentDepth + 1;
354360

355361
for (const [relationName, { targetTableName, relation }] of relationEntries) {
356362
const relTypeName = `${typeName}${pascalize(relationName)}Relation`;
@@ -362,6 +368,8 @@ const generateSelectFields = <TWithOrder extends boolean>(
362368
relationMap,
363369
relTypeName,
364370
!isOne,
371+
relationsDepthLimit,
372+
newDepth,
365373
updatedUsedTables,
366374
);
367375

@@ -410,6 +418,7 @@ export const generateTableTypes = <
410418
tables: Record<string, Table>,
411419
relationMap: Record<string, Record<string, TableNamedRelations>>,
412420
withReturning: WithReturning,
421+
relationsDepthLimit: number | undefined,
413422
): GeneratedTableTypes<WithReturning> => {
414423
const stylizedName = pascalize(tableName);
415424
const { tableFields, relationFields, filters, order } = generateSelectFields(
@@ -418,6 +427,7 @@ export const generateTableTypes = <
418427
relationMap,
419428
stylizedName,
420429
true,
430+
relationsDepthLimit,
421431
);
422432

423433
const table = tables[tableName]!;

src/util/builders/mysql.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ export const generateSchemaData = <
338338
>(
339339
db: TDrizzleInstance,
340340
schema: TSchema,
341+
relationsDepthLimit: number | undefined,
341342
): GeneratedEntities<TDrizzleInstance, TSchema> => {
342343
const rawSchema = schema;
343344
const schemaEntries = Object.entries(rawSchema);
@@ -383,7 +384,7 @@ export const generateSchemaData = <
383384
const gqlSchemaTypes = Object.fromEntries(
384385
Object.entries(tables).map(([tableName, table]) => [
385386
tableName,
386-
generateTableTypes(tableName, tables, namedRelations, false),
387+
generateTableTypes(tableName, tables, namedRelations, false, relationsDepthLimit),
387388
]),
388389
);
389390

src/util/builders/pg.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ export const generateSchemaData = <
349349
>(
350350
db: TDrizzleInstance,
351351
schema: TSchema,
352+
relationsDepthLimit: number | undefined,
352353
): GeneratedEntities<TDrizzleInstance, TSchema> => {
353354
const rawSchema = schema;
354355
const schemaEntries = Object.entries(rawSchema);
@@ -397,7 +398,7 @@ export const generateSchemaData = <
397398
const gqlSchemaTypes = Object.fromEntries(
398399
Object.entries(tables).map(([tableName, table]) => [
399400
tableName,
400-
generateTableTypes(tableName, tables, namedRelations, true),
401+
generateTableTypes(tableName, tables, namedRelations, true, relationsDepthLimit),
401402
]),
402403
);
403404

src/util/builders/sqlite.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ export const generateSchemaData = <
353353
>(
354354
db: TDrizzleInstance,
355355
schema: TSchema,
356+
relationsDepthLimit: number | undefined,
356357
): GeneratedEntities<TDrizzleInstance, TSchema> => {
357358
const rawSchema = schema;
358359
const schemaEntries = Object.entries(rawSchema);
@@ -406,7 +407,7 @@ export const generateSchemaData = <
406407
const gqlSchemaTypes = Object.fromEntries(
407408
Object.entries(tables).map(([tableName, table]) => [
408409
tableName,
409-
generateTableTypes(tableName, tables, namedRelations, true),
410+
generateTableTypes(tableName, tables, namedRelations, true, relationsDepthLimit),
410411
]),
411412
);
412413

0 commit comments

Comments
 (0)