/** * Relation graph builder. * * Passe de post-traitement sur l'AST brut du parser : apparie les champs * relation par clé (modelA, modelB, relationName), classifie chaque arête, * et produit les maps de lien entre scalaires FK et relations. * * Référence design : docs/design/relations.md §1. * * Règle d'or : ne JAMAIS apparier deux champs relation par « ils pointent * vers le même modèle » — `Post { author User, reviewer User }` produirait * un appariement aléatoire et silencieusement faux. L'appariement se fait * par nom de relation, que Prisma garantit unique pour un couple de modèles. */ import type { PrismaModel, PrismaSchema } from './parser.js'; export type RelationKind = 'to-one-owning' | 'to-one-inverse' | 'to-many-inverse' | 'm2m'; export type UnsupportedReason = 'composite-fk' | 'ambiguous'; export interface RelationEdge { /** Modèle porteur du champ */ model: string; /** Nom du champ relation */ field: string; kind: RelationKind; /** Modèle cible */ target: string; /** Nom de relation (@relation("...")), chaîne vide si absent */ relationName: string; isRequired: boolean; isList: boolean; /** Noms des scalaires FK portés par ce champ (vide si non owning) */ scalarFields: string[]; selfReferential: boolean; /** false quand la back-reference n'existe pas dans le schéma */ hasBackReference: boolean; unsupported?: UnsupportedReason; } export interface RelationGraph { /** Arêtes indexées par "Model.field" */ edges: Map; /** "authorId" → "author" (nom du champ relation owning) */ scalarToRelation: Map; /** "Post.author" → ["authorId"] */ relationToScalars: Map; /** Diagnostics non bloquants (groupes ambigus, etc.) */ diagnostics: string[]; } export declare function buildRelationGraph(schema: PrismaSchema): RelationGraph; /** Raccourci : arêtes d'un modèle donné, dans l'ordre déclaré du schéma. */ export declare function relationsOf(model: PrismaModel, graph: RelationGraph): RelationEdge[];