package Ġcom . ap ol log raph ql . apollo . compiler Ċ Ċ import Ġcom . ap ol log raph ql . apollo . compiler . ir . Fragment Ċ import Ġcom . ap ol log raph ql . apollo . compiler . parser . int rospection . Int rospection Query Ċ import Ġcom . squareup . mos hi . Json Class Ċ import Ġjava . io . File Ċ Ċ @ Json Class ( generate Adapter Ġ= Ġtrue ) Ċ data Ġclass ĠApollo Metadata ( ĊĠĠĠ Ġval Ġschema : ĠInt rospection Query . Wrapper ?, ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfragments , Ġin ĠIR Ġformat ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġfragments : ĠList < Fragment >, ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġgenerated Ġinput Ġobjects , Ġenums ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtypes : ĠSet < String >, ĊĠĠĠ Ġval Ġschema PackageName : ĠString ?, ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġmodule Ġname , Ġfor Ġdebug ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠmoduleName : ĠString , ĊĠĠĠ Ġval Ġgenerate Kotlin Models : ĠBoolean , ĊĠĠĠ Ġval Ġplugin Version : ĠString , ĊĠĠĠ Ġval Ġcustom Types Map : ĠMap < String , ĠString > Ċ ) Ġ{ ĊĊĠ Ġfun Ġwith Resolved Fragments ( project Dir : ĠFile ): ĠApollo Metadata Ġ{ ĊĠĠĠ Ġreturn Ġcopy ( ĊĠĠĠĠĠĠĠ Ġfragments Ġ= Ġfragments . map Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġlookup Ġthe Ġfile Ġin Ġthe Ġroot Project Ġif Ġit Ġexists ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( File ( it . filePath ). is Absolute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġalready Ġabsolute , Ġbuild Ġcache Ġwill Ġnot Ġwork ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġit ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġresolved Path Ġ= ĠFile ( project Dir , Ġit . filePath ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved Path . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġit . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath Ġ= Ġresolved Path . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġ// Ġdefault : Ġbest Ġeffort Ġmode , Ġthe Ġerror Ġwill Ġnot Ġbe Ġable Ġto Ġdisplay Ġthe Ġcontext ĊĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġfun Ġwith Relative Fragments ( root Project Dir : ĠFile ): ĠApollo Metadata Ġ{ ĊĠĠĠ Ġreturn Ġcopy ( ĊĠĠĠĠĠĠĠ Ġfragments Ġ= Ġfragments . map Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġabsolute Ġpaths Ġfrom Ġthe Ġartifacts Ġin Ġorder Ġto Ġnot Ġbreak Ġgradle Ġbuild Ġcache ĊĠĠĠĠĠĠĠĠĠ Ġval Ġrelative Path Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( it . filePath ). relative To ( root Project Dir . absolute File ). path ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" A pol lo : Ġ${ it . filePath } Ġand Ġ$ root Project Dir Ġdon 't Ġshare Ġthe Ġsame Ġroot , Ġbuild Ġcache Ġwill Ġnot Ġwork ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfallback Ġto Ġabsolute ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . filePath ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġit . copy ( filePath Ġ= Ġrelative Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġfun ĠwriteTo ( file : ĠFile ) Ġ{ ĊĠĠĠ Ġthis . toJson ( file ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun ĠList < A pol lo Metadata >. merge (): ĠApollo Metadata ? Ġ{ ĊĠĠĠĠĠ Ġif Ġ( isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// Ġensure Ġa Ġsingle Ġschema ĊĠĠĠĠĠ Ġval Ġroot Metadata List Ġ= Ġfilter Ġ{ Ġit . schema Ġ!= Ġnull Ġ} ĊĠĠĠĠĠ Ġcheck ( root Metadata List . size Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" A pol lo : ĠA Ġschema Ġis Ġdefined Ġin Ġmultiple Ġmodules : Ġ${ root Metadata List . map Ġ{ Ġit . moduleName Ġ}. join ToString (", Ġ") }. \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġonly Ġone Ġroot Ġmodule Ġdefining Ġthe Ġschema , Ġcheck Ġyour Ġdependencies ." ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcheck ( root Metadata List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" A pol lo : ĠCannot Ġfind Ġa Ġschema Ġin Ġparent Ġmodules . ĠS ear ched Ġin Ġ${ map Ġ{ Ġit . moduleName Ġ}. join ToString (", Ġ") }" ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġroot Metadata Ġ= Ġroot Metadata List . first () ĊĊĠĠĠĠĠ Ġ// Ġensure Ġthe Ġsame Ġschema PackageName ĊĠĠĠĠĠ Ġmap Ġ{ Ġit . schema PackageName Ġ}. filter NotNull (). distinct (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( it . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ" A pol lo : ĠAll Ġmodules Ġshould Ġhave Ġthe Ġsame Ġschema PackageName . ĠFound :" Ġ+ Ġit . join ToString (", Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// Ġensure Ġthe Ġsame Ġgenerate Kotlin Models ĊĠĠĠĠĠ Ġmap Ġ{ Ġit . generate Kotlin Models Ġ}. distinct (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( it . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ" A pol lo : ĠAll Ġmodules Ġshould Ġhave Ġthe Ġsame Ġgenerate Kotlin Models . ĠFound :" Ġ+ Ġit . join ToString (", Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// Ġensure Ġthe Ġsame Ġplugin Version ĊĠĠĠĠĠ Ġmap Ġ{ Ġit . plugin Version Ġ}. distinct (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( it . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ" A pol lo : ĠAll Ġmodules Ġshould Ġbe Ġgenerated Ġwith Ġthe Ġsame Ġap ollo Ġversion . ĠFound :" Ġ+ Ġit . join ToString (", Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// Ġno Ġneed Ġto Ġvalidate Ġdistinct Ġfragment Ġnames , Ġthis Ġwill Ġbe Ġdone Ġlater Ġwhen Ġaggreg ating Ġthe ĠF rag ments ĊĠĠĠĠĠ Ġreturn Ġroot Metadata . copy ( ĊĠĠĠĠĠĠĠĠĠ Ġfragments Ġ= Ġflat Map Ġ{ Ġit . fragments Ġ}, ĊĠĠĠĠĠĠĠĠĠ ĠmoduleName Ġ= Ġ"*", ĊĠĠĠĠĠĠĠĠĠ Ġtypes Ġ= Ġflat Map Ġ{ Ġit . types Ġ}. toSet (), ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread From ( file : ĠFile ): ĠApollo Metadata ? Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġfile . fromJson () ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ