package Ġcom . ap ol log raph ql . apollo 3 . ast . transformation Ċ Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Field Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Fragment Definition Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Fragment Spread Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Inline Fragment Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Node Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . GQ LO peration Definition Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Selection Set Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . Node Transformer Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . Schema Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . Source Location Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . Transform Result Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . definition From Scope Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . leaf Type Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . root Type Definition Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . transform Ċ Ċ fun Ġadd Required Fields ( operation : ĠG Q LO peration Definition , Ġschema : ĠSchema ): ĠG Q LO peration Definition Ġ{ ĊĠ Ġval Ġparent Type Ġ= Ġoperation . root Type Definition ( schema ) !!. name ĊĠ Ġreturn Ġoperation . transform ( ĊĠĠĠĠĠ ĠAdd Required Fields Transformer ( ĊĠĠĠĠĠĠĠĠĠ Ġschema , ĊĠĠĠĠĠĠĠĠĠ Ġparent Type , ĊĠĠĠĠĠĠĠĠĠ Ġempty Set () ĊĠĠĠĠĠ Ġ) ĊĠ Ġ) Ġas ĠG Q LO peration Definition Ċ } Ċ Ċ fun Ġadd Required Fields ( fragment Definition : ĠG QL Fragment Definition , Ġschema : ĠSchema ): ĠG QL Fragment Definition Ġ{ ĊĠ Ġreturn Ġfragment Definition . transform ( ĊĠĠĠĠĠ ĠAdd Required Fields Transformer ( ĊĠĠĠĠĠĠĠĠĠ Ġschema , ĊĠĠĠĠĠĠĠĠĠ Ġfragment Definition . type Condition . name , ĊĠĠĠĠĠĠĠĠĠ Ġempty Set () ĊĠĠĠĠĠ Ġ) ĊĠ Ġ) Ġas ĠG QL Fragment Definition Ċ } Ċ Ċ private Ġclass ĠAdd Required Fields Transformer ( ĊĠĠĠ Ġval Ġschema : ĠSchema , ĊĠĠĠ Ġval Ġparent Type : ĠString , ĊĠĠĠ Ġval Ġparent Fields : ĠSet < String >, Ċ ) Ġ: ĠNode Transformer Ġ{ ĊĠ Ġoverride Ġfun Ġtransform ( node : ĠG QL Node ): ĠTransform Result Ġ{ ĊĠĠĠ Ġif Ġ( node Ġ! is ĠG QL Selection Set ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠTransform Result . Continue ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġselection Set Ġ= Ġnode ĊĠĠĠ Ġval Ġhas Fragment Ġ= Ġselection Set . selections . any Ġ{ Ġit Ġis ĠG QL Fragment Spread Ġ|| Ġit Ġis ĠG QL Inline Fragment Ġ} ĊĠĠĠ Ġval Ġrequired Field Names Ġ= Ġschema . key Fields ( parent Type ). to Mutable Set () ĊĊĠĠĠ Ġif Ġ( required Field Names . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġrequired Field Names . add ("__ typename ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfield Names Ġ= Ġparent Fields Ġ+ Ġselection Set . selections . filter Is Instance < G QL Field >(). map Ġ{ Ġit . name Ġ}. toSet () ĊĊĠĠĠ Ġvar Ġnew Selections Ġ= Ġselection Set . selections . map Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠG QL Inline Fragment Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Set Ġ= Ġit . selection Set . transform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAdd Required Fields Transformer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type Condition . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Names Ġ+ Ġrequired Field Names ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠG QL Selection Set ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠG QL Fragment Spread Ġ-> Ġit ĊĠĠĠĠĠĠĠ Ġis ĠG QL Field Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġtype Definition Ġ= Ġit . definition From Scope ( schema , Ġparent Type ) !! ĊĠĠĠĠĠĠĠĠĠ Ġval Ġnew Selection Set Ġ= Ġit . selection Set ?. transform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAdd Required Fields Transformer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Definition . type . leaf Type (). name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Set () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠG QL Selection Set ? ĊĠĠĠĠĠĠĠĠĠ Ġit . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Set Ġ= Ġnew Selection Set ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfield Names ToAdd Ġ= Ġ( required Field Names Ġ- Ġfield Names ). to Mutable List () ĊĠĠĠ Ġif Ġ( has Fragment ) Ġ{ ĊĠĠĠĠĠ Ġfield Names ToAdd . add ("__ typename ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġnew Selections . filter Is Instance < G QL Field >(). forEach Ġ{ ĊĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠ Ġ* ĠVerify Ġthat Ġthe Ġfields Ġwe Ġadd Ġwon 't Ġoverwrite Ġan Ġexisting Ġalias ĊĠĠĠĠĠĠ Ġ* ĠThis Ġis Ġnot Ġ 1 0 0 % Ġcorrect Ġas Ġthis Ġvalidation Ġshould Ġbe Ġmade Ġmore Ġglobally ĊĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠ Ġcheck (! field Names ToAdd . contains ( it . alias )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Field Ġ${ it . alias }: Ġ${ it . name } Ġin Ġ$ parent Type Ġconflicts Ġwith Ġkey Ġfields " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġnew Selections Ġ= Ġnew Selections Ġ+ Ġfield Names ToAdd . map Ġ{ Ġbuild Field ( it ) Ġ} ĊĊĠĠĠ Ġnew Selections Ġ= Ġif Ġ( has Fragment ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġremove Ġthe Ġ__ typename Ġif Ġit Ġexists ĊĠĠĠĠĠ Ġ// Ġand Ġadd Ġit Ġagain Ġat Ġthe Ġtop Ġso Ġwe 're Ġguaranteed Ġto Ġhave Ġit Ġat Ġthe Ġbeginning Ġof Ġjson Ġparsing ĊĠĠĠĠĠ Ġval ĠtypeName Field Ġ= Ġnew Selections . first OrNull Ġ{ Ġ( it Ġas ? ĠG QL Field )?. name Ġ== Ġ"__ typename " Ġ} ĊĠĠĠĠĠ ĠlistOf NotNull ( typeName Field ) Ġ+ Ġnew Selections . filter Ġ{ Ġ( it Ġas ? ĠG QL Field )?. name Ġ!= Ġ"__ typename " Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġnew Selections ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠTransform Result . Replace ( ĊĠĠĠĠĠĠĠ Ġselection Set . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselections Ġ= Ġnew Selections ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠ Ġ} Ċ } ĊĊ Ċ private Ġfun Ġbuild Field ( name : ĠString ): ĠG QL Field Ġ{ ĊĠ Ġreturn ĠG QL Field ( ĊĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠ Ġarguments Ġ= Ġnull , ĊĠĠĠĠĠ Ġselection Set Ġ= Ġnull , ĊĠĠĠĠĠ Ġsource Location Ġ= ĠSource Location . UNKNOWN , ĊĠĠĠĠĠ Ġdirectives Ġ= Ġempty List (), ĊĠĠĠĠĠ Ġalias Ġ= Ġnull ĊĠ Ġ) Ċ }