33using System . IO ;
44using System . Linq ;
55using System . Net . WebSockets ;
6+ using System . Reflection ;
67using System . Runtime . Loader ;
78using System . Text ;
89using System . Text . RegularExpressions ;
@@ -23,7 +24,7 @@ public class RuntimeComponentsGenerator
2324 {
2425 public IServiceCollection _serviceCollection { get ; set ; }
2526 public Generator _generator { get ; set ; }
26- public string _fileSystemPath { get ; set ; } = Directory . GetCurrentDirectory ( ) ;
27+ public string _fileSystemPath { get ; set ; } = Directory . GetParent ( Directory . GetCurrentDirectory ( ) ) . GetDirectories ( "Client" ) . Single ( ) . ToString ( ) ;
2728 public WebSocket _webSocket { get ; set ; }
2829 public FileSystemWatcher _watcher { get ; set ; }
2930 public string _CurrentRoute { get ; set ; } = "/" ;
@@ -47,7 +48,14 @@ public string FirstTimeRender()
4748 {
4849 var html = RenderRazorFileToHtml ( "index" ) ; // Todo handle case : if there is not index.razor file in project
4950 var wrapedhtml = WrapHostTemplate ( html ) ;
50- File . WriteAllText ( "wwwroot/preview.html" , wrapedhtml ) ;
51+
52+ var wwwroots = Directory . GetDirectories ( _fileSystemPath , "wwwroot" , SearchOption . AllDirectories ) ;
53+
54+ wwwroots = wwwroots . Where ( x => ! x . Contains ( "bin" ) ) . ToArray ( ) ;
55+
56+ var previewFile = Path . Combine ( wwwroots . Single ( ) , "preview.html" ) ;
57+
58+ File . WriteAllText ( previewFile , wrapedhtml ) ;
5159 return wrapedhtml ;
5260 }
5361 catch ( Exception ex )
@@ -63,35 +71,35 @@ public void AttachWebsocket(WebSocket webSocket)
6371 private List < string > GetAllFileNames ( )
6472 {
6573 var razorFiles = Directory . GetFiles ( _fileSystemPath , "*.razor" , SearchOption . AllDirectories ) . ToList ( ) ;
66- var item1 = razorFiles . SingleOrDefault ( item => item . Contains ( "_Imports.razor" ) ) ;
67- razorFiles . Remove ( item1 ) ;
74+ // var item1 = razorFiles.SingleOrDefault(item => item.Contains("_Imports.razor"));
75+ // razorFiles.Remove(item1);
6876 return razorFiles ;
6977 }
7078 private static List < ( string FilePath , string Content ) > ReadAllFiles ( List < string > razorFiles )
7179 {
7280 var files = razorFiles . Select ( item => ( FilePath : "/" + Path . GetFileName ( item ) , Content : File . ReadAllText ( item ) ) ) . ToList ( ) ;
73- var razorImportsFile = ( "/_Imports.razor" , @"
74- @using System.Net.Http
75- @using Microsoft.AspNetCore.Authorization
76- @using Microsoft.AspNetCore.Components.Authorization
77- @using Microsoft.AspNetCore.Components.Forms
78- @using Microsoft.AspNetCore.Components.Routing
79- @using Microsoft.AspNetCore.Components.Web
80- @using Microsoft.JSInterop
81- @using Test
82- @namespace Test
83- " ) ; // Todo handle better way _Imports.razor file.
84- files . Insert ( 0 , razorImportsFile ) ;
81+ // var razorImportsFile = ("/_Imports.razor", @"
82+ // @using System.Net.Http
83+ // @using Microsoft.AspNetCore.Authorization
84+ // @using Microsoft.AspNetCore.Components.Authorization
85+ // @using Microsoft.AspNetCore.Components.Forms
86+ // @using Microsoft.AspNetCore.Components.Routing
87+ // @using Microsoft.AspNetCore.Components.Web
88+ // @using Microsoft.JSInterop
89+ // @using Test
90+ // @namespace Test
91+ // "); // Todo handle better way _Imports.razor file.
92+ // files.Insert(0, razorImportsFile);
8593
8694 //hack for to get dependencies from Test
87- var appRazorItem = files . SingleOrDefault ( item => item . FilePath . Contains ( "App.razor" ) ) ;
88-
89- if ( appRazorItem != default )
90- {
91- var fixedAPPcontent = appRazorItem . Content . Replace ( "@typeof(" , "@typeof(Test." ) . Replace ( "Program" , "Counter" ) ; //Todo change name "Counter" to dynamic type from Test Assemebly
92- files . Remove ( appRazorItem ) ;
93- files . Add ( ( appRazorItem . FilePath , fixedAPPcontent ) ) ;
94- }
95+ // var appRazorItem = files.SingleOrDefault(item => item.FilePath.Contains("App.razor"));
96+ //
97+ // if (appRazorItem != default)
98+ // {
99+ // var fixedAPPcontent = appRazorItem.Content.Replace("@typeof(", "@typeof(Test.").Replace("Program", "Counter"); //Todo change name "Counter" to dynamic type from Test Assemebly
100+ // files.Remove(appRazorItem);
101+ // files.Add((appRazorItem.FilePath, fixedAPPcontent));
102+ // }
95103
96104 return files ;
97105 }
@@ -209,7 +217,9 @@ public string Between(string STR, string FirstString, string LastString)
209217 }
210218 private string WrapHostTemplate ( string html ) //Todo make cached templete if its slow.
211219 {
212- var hostFile = Directory . GetFiles ( _fileSystemPath , "_Host.cshtml" , SearchOption . AllDirectories ) . ToList ( ) . FirstOrDefault ( ) ;
220+ var dir = Directory . GetParent ( _fileSystemPath ) . Parent . FullName ;
221+
222+ var hostFile = Directory . GetFiles ( dir , "_Host.cshtml" , SearchOption . AllDirectories ) . ToList ( ) . FirstOrDefault ( ) ;
213223 var hostFileContent = File . ReadAllText ( hostFile ) ;
214224 var script = GetWebsocketScriptCode ( ) ;
215225 //var app = Between(hostFile, "<App>", "</App>");
@@ -257,8 +267,10 @@ public IComponent Compile(IEnumerable<SyntaxTree> syntaxTrees, string asseblyNam
257267
258268 try
259269 {
260- var type = asm . GetExportedTypes ( ) . SingleOrDefault ( item => item . Name == "App" ) ; //TODO make more posibilities returning not only APP component, because somtimes its harder to setup routes in runtime.
261- var instance = ( IComponent ) Activator . CreateInstance ( type ) ;
270+ var appType = ExportedTypesBreadthFirstSearch ( asm ) . Single ( x => x . Name == "App" ) ;
271+
272+ var instance = ( IComponent ) Activator . CreateInstance ( appType ) ;
273+
262274 return instance ;
263275 }
264276 catch ( Exception )
@@ -268,5 +280,29 @@ public IComponent Compile(IEnumerable<SyntaxTree> syntaxTrees, string asseblyNam
268280
269281 }
270282 }
283+
284+ private IEnumerable < Type > ExportedTypesBreadthFirstSearch ( Assembly entryAssembly )
285+ {
286+ var queue = new Queue < Assembly > ( ) ;
287+
288+ queue . Enqueue ( entryAssembly ) ;
289+ var seen = new HashSet < string > ( ) ;
290+
291+ while ( queue . TryDequeue ( out var a ) )
292+ {
293+ if ( ! seen . Add ( a . GetName ( ) . Name ) )
294+ continue ;
295+
296+ foreach ( var type in a . ExportedTypes )
297+ yield return type ;
298+
299+ foreach ( var refName in a . GetReferencedAssemblies ( ) )
300+ {
301+ var refAssembly = Assembly . Load ( refName ) ;
302+
303+ queue . Enqueue ( refAssembly ) ;
304+ }
305+ }
306+ }
271307 }
272308}
0 commit comments