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

normalizeRelation() — drizzle-orm Function Reference

Architecture documentation for the normalizeRelation() function in relations.ts from the drizzle-orm codebase.

Entity Profile

Dependency Diagram

graph TD
  95b7f368_fe07_2aac_c3ae_6c1fc186391c["normalizeRelation()"]
  2f47d090_425d_2e56_2395_4c4d912316f0["relations.ts"]
  95b7f368_fe07_2aac_c3ae_6c1fc186391c -->|defined in| 2f47d090_425d_2e56_2395_4c4d912316f0
  c020d230_75a2_3639_d9a6_35f2ba7fd5bc["is()"]
  95b7f368_fe07_2aac_c3ae_6c1fc186391c -->|calls| c020d230_75a2_3639_d9a6_35f2ba7fd5bc
  style 95b7f368_fe07_2aac_c3ae_6c1fc186391c fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

drizzle-orm/src/relations.ts lines 559–634

export function normalizeRelation(
	schema: TablesRelationalConfig,
	tableNamesMap: Record<string, string>,
	relation: Relation,
): NormalizedRelation {
	if (is(relation, One) && relation.config) {
		return {
			fields: relation.config.fields,
			references: relation.config.references,
		};
	}

	const referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];
	if (!referencedTableTsName) {
		throw new Error(
			`Table "${relation.referencedTable[Table.Symbol.Name]}" not found in schema`,
		);
	}

	const referencedTableConfig = schema[referencedTableTsName];
	if (!referencedTableConfig) {
		throw new Error(`Table "${referencedTableTsName}" not found in schema`);
	}

	const sourceTable = relation.sourceTable;
	const sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];
	if (!sourceTableTsName) {
		throw new Error(
			`Table "${sourceTable[Table.Symbol.Name]}" not found in schema`,
		);
	}

	const reverseRelations: Relation[] = [];
	for (
		const referencedTableRelation of Object.values(
			referencedTableConfig.relations,
		)
	) {
		if (
			(relation.relationName
				&& relation !== referencedTableRelation
				&& referencedTableRelation.relationName === relation.relationName)
			|| (!relation.relationName
				&& referencedTableRelation.referencedTable === relation.sourceTable)
		) {
			reverseRelations.push(referencedTableRelation);
		}
	}

	if (reverseRelations.length > 1) {
		throw relation.relationName
			? new Error(
				`There are multiple relations with name "${relation.relationName}" in table "${referencedTableTsName}"`,
			)
			: new Error(
				`There are multiple relations between "${referencedTableTsName}" and "${
					relation.sourceTable[Table.Symbol.Name]
				}". Please specify relation name`,
			);
	}

	if (
		reverseRelations[0]
		&& is(reverseRelations[0], One)
		&& reverseRelations[0].config
	) {
		return {
			fields: reverseRelations[0].config.references,
			references: reverseRelations[0].config.fields,
		};
	}

	throw new Error(
		`There is not enough information to infer relation "${sourceTableTsName}.${relation.fieldName}"`,
	);
}

Domain

Subdomains

Calls

Frequently Asked Questions

What does normalizeRelation() do?
normalizeRelation() is a function in the drizzle-orm codebase, defined in drizzle-orm/src/relations.ts.
Where is normalizeRelation() defined?
normalizeRelation() is defined in drizzle-orm/src/relations.ts at line 559.
What does normalizeRelation() call?
normalizeRelation() calls 1 function(s): is.

Analyze Your Own Codebase

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

Try Supermodel Free