using System; using System.Collections.Generic; using System.Collections.Concurrent; using System.IO; using System.Security.Cryptography; using System.Text; using System.Linq; using System.Threading.Tasks; using System.Diagnostics; namespace BilibiliEvolved.Build.Watcher { public class VueTypeScriptWatcher : Watcher { public VueTypeScriptWatcher() : base($".ts-output") { GenericFilter = "*.vue.js"; } private Dictionary> waitRequests = new Dictionary>(); public Task WaitForBuild(string path) { var tcs = new TaskCompletionSource(); // Console.WriteLine($"add request: {path}"); waitRequests[path] = tcs; return tcs.Task; } protected override void OnFileChanged(FileSystemEventArgs e) { var originalFilename = Path.ChangeExtension(e.FullPath, ".ts").Replace(WatcherPath, "src"); // Console.WriteLine($"test filename: {originalFilename}"); if (waitRequests.ContainsKey(originalFilename)) { // Console.WriteLine($"set result for: {originalFilename}"); waitRequests[originalFilename].SetResult(File.ReadAllText(e.FullPath)); if (File.Exists(originalFilename)) { File.Delete(originalFilename); } waitRequests.Remove(originalFilename); } } } public class VueWatcher : Watcher { private VueTypeScriptWatcher tsWatcher = new VueTypeScriptWatcher(); public VueWatcher() : base($"src{Path.DirectorySeparatorChar}") { GenericFilter = "*.vue"; } public override void Start(ProjectBuilder builder) { tsWatcher.Start(builder); base.Start(builder); } public override void Stop() { base.Stop(); tsWatcher.Stop(); } protected override void OnFileChanged(FileSystemEventArgs e) { builder.WriteInfo($"[Vue] {e.Name} changed."); var source = File.ReadAllText(e.FullPath); var vueFile = new VueFile(source); var compiledText = new StringBuilder(""); BuildTemplate(e.FullPath, vueFile, compiledText); BuildStyle(e.FullPath, vueFile, compiledText); BuildScript(e.FullPath, vueFile, compiledText); var minFile = $"min{Path.DirectorySeparatorChar + Path.GetFileName(e.FullPath)}.min.js"; var minifier = new JavascriptMinifier(); File.WriteAllText(minFile, minifier.Minify(compiledText.ToString())); builder.UpdateCachedMinFile(minFile); cache.AddCache(e.FullPath); cache.SaveCache(); } private void BuildTemplate(string path, VueFile vueFile, StringBuilder compiledText) { if (vueFile.Tamplate is null) { throw new VueBuildException($"{path}: Missing "); } else { var uglifyHtml = new UglifyHtml(); if (vueFile.TamplateLang == "html") { compiledText.Append($"const template = /*html*/`{uglifyHtml.Run(vueFile.Tamplate)}`;"); } else { throw new VueBuildException($"{path}: Unsupported