Home / Function/ relationsToTypeScriptForStudio() — drizzle-orm Function Reference

relationsToTypeScriptForStudio() — drizzle-orm Function Reference

Architecture documentation for the relationsToTypeScriptForStudio() function in introspect-pg.ts from the drizzle-orm codebase.

Entity Profile

Dependency Diagram

graph TD
  0e89f7cd_3c24_fd23_c2b1_c420cfd92ae8["relationsToTypeScriptForStudio()"]
  71516551_23e3_bf30_27c9_000fb046ef71["introspect-pg.ts"]
  0e89f7cd_3c24_fd23_c2b1_c420cfd92ae8 -->|defined in| 71516551_23e3_bf30_27c9_000fb046ef71
  style 0e89f7cd_3c24_fd23_c2b1_c420cfd92ae8 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

drizzle-kit/src/introspect-pg.ts lines 190–275

export const relationsToTypeScriptForStudio = (
	schema: Record<string, Record<string, AnyPgTable<{}>>>,
	relations: Record<string, Relations<string, Record<string, Relation<string>>>>,
) => {
	const relationalSchema: Record<string, unknown> = {
		...Object.fromEntries(
			Object.entries(schema)
				.map(([key, val]) => {
					// have unique keys across schemas
					const mappedTableEntries = Object.entries(val).map((tableEntry) => {
						return [`__${key}__.${tableEntry[0]}`, tableEntry[1]];
					});

					return mappedTableEntries;
				})
				.flat(),
		),
		...relations,
	};

	const relationsConfig = extractTablesRelationalConfig(relationalSchema, createTableRelationsHelpers);

	let result = '';

	function findColumnKey(table: AnyPgTable, columnName: string) {
		for (const tableEntry of Object.entries(table)) {
			const key = tableEntry[0];
			const value = tableEntry[1];

			if (value.name === columnName) {
				return key;
			}
		}
	}

	Object.values(relationsConfig.tables).forEach((table) => {
		const tableName = table.tsName.split('.')[1];
		const relations = table.relations;
		let hasRelations = false;
		let relationsObjAsStr = '';
		let hasOne = false;
		let hasMany = false;

		Object.values(relations).forEach((relation) => {
			hasRelations = true;

			if (is(relation, Many)) {
				hasMany = true;
				relationsObjAsStr += `\t\t${relation.fieldName}: many(${
					relationsConfig.tableNamesMap[relation.referencedTableName].split('.')[1]
				}${typeof relation.relationName !== 'undefined' ? `, { relationName: "${relation.relationName}"}` : ''}),`;
			}

			if (is(relation, One)) {
				hasOne = true;
				relationsObjAsStr += `\t\t${relation.fieldName}: one(${
					relationsConfig.tableNamesMap[relation.referencedTableName].split('.')[1]
				}, { fields: [${
					relation.config?.fields.map(
						(c) =>
							`${relationsConfig.tableNamesMap[getTableName(relation.sourceTable)].split('.')[1]}.${
								findColumnKey(relation.sourceTable, c.name)
							}`,
					)
				}], references: [${
					relation.config?.references.map(
						(c) =>
							`${relationsConfig.tableNamesMap[getTableName(relation.referencedTable)].split('.')[1]}.${
								findColumnKey(relation.referencedTable, c.name)
							}`,
					)
				}]${typeof relation.relationName !== 'undefined' ? `, relationName: "${relation.relationName}"` : ''}}),`;
			}
		});

		if (hasRelations) {
			result += `export const ${tableName}Relation = relations(${tableName}, ({${hasOne ? 'one' : ''}${
				hasOne && hasMany ? ', ' : ''
			}${hasMany ? 'many' : ''}}) => ({
        ${relationsObjAsStr}
      }));\n`;

Domain

Subdomains

Frequently Asked Questions

What does relationsToTypeScriptForStudio() do?
relationsToTypeScriptForStudio() is a function in the drizzle-orm codebase, defined in drizzle-kit/src/introspect-pg.ts.
Where is relationsToTypeScriptForStudio() defined?
relationsToTypeScriptForStudio() is defined in drizzle-kit/src/introspect-pg.ts at line 190.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free