public override string Minify(string input) { if (!input.StartsWith("(() =>")) { Func <string, string> convertToRuntimeSource = source => { var index = source.LastIndexOf("/"); if (index != -1) { source = source.Remove(1, index); } return(source); }; input = RegexReplacer.Replace(input, @"import (.*) from ([^\r\n;]*)", match => { var imported = match.Groups[1].Value.Replace(" as ", ":"); var source = convertToRuntimeSource(match.Groups[2].Value); return($"const {imported} = resources.import({source})"); }); input = RegexReplacer.Replace(input, @" import\((.*)\)", match => { var source = convertToRuntimeSource(match.Groups[1].Value); return($" resources.importAsync({source})"); }); input = @"(() => { return (settings, resources) => { " + input.Replace("export default ", "return ").Replace("export ", "") + @" }; })();"; } // Console.WriteLine(input); return(new Regex(@"\\n( )+([<`])").Replace(new UglifyJs().Run(input), @"\n$2")); }
public override string Minify(string input) { if (!input.StartsWith("(() =>")) { Func <string, string> convertToRuntimeSource = source => { var index = source.LastIndexOf("/"); if (index != -1) { source = source.Remove(1, index); } return(source); }; input = RegexReplacer.Replace(input, @"import (.*) from ([^\r\n;]*)", match => { var imported = match.Groups[1].Value.Replace(" as ", ":"); var source = convertToRuntimeSource(match.Groups[2].Value); return($"const {imported} = resources.import({source})"); }); input = RegexReplacer.Replace(input, @" import\((.*)\)", match => { var source = convertToRuntimeSource(match.Groups[1].Value); return($" resources.importAsync({source})"); }); var exportMatches = new Regex(@"export[\s]+[a-zA-Z]+[\s]+([\w]+)").Matches(input); if (exportMatches.Count > 0) { var exports = exportMatches .Select(m => m.Groups[1].Value) .Aggregate((acc, m) => acc + ", " + m); if (!input.Contains("export default ")) { input += $"return {{ export: {{ {exports} }} }}"; // Console.WriteLine("Auto export: " + $"return {{ export: {{ {exports} }} }}"); } // TODO: insert exports into existing block // else if (input.Contains("export default ") && input.Contains("")) } input = @"(() => { return (settings, resources) => { " + input.Replace("export default ", "return ").Replace("export ", "") + @" }; })();"; } // Console.WriteLine(input); return(new Regex(@"\\n( )+([<`])").Replace(new UglifyJs().Run(input), @"\n$2")); }
public ProjectBuilder BuildClient() { var source = File.ReadAllText("src/client/bilibili-evolved.js"); source = RegexReplacer.Replace(source, @"import (.*) from [""'](.*)[""']", match => { var module = File.ReadAllText("src/client/" + match.Groups[2].Value.Replace("./", "") + ".js").Replace("export ", ""); return(module); }); File.WriteAllText(SourcePath, source); Source = File.ReadAllText(SourcePath); WriteSuccess("Client Build complete."); return(this); }
public ProjectBuilder BuildTypeScripts() { var tsc = new BabelCompiler(); var uglifyJs = new JavascriptMinifier(); var files = ResourceMinifier.GetFiles(file => file.Extension == ".ts" && !file.Name.EndsWith(".d.ts") ); using (var cache = new BuildCache()) { var changedFiles = files.Where(file => !cache.Contains(file)).ToArray(); if (changedFiles.Any()) { string getOutputCacheFilename(string f) { return(".ts-output/" + f .Replace(".ts", ".js") .Replace($"src{Path.DirectorySeparatorChar}", "")); } changedFiles.ForEach(file => { cache.AddCache(file); WriteInfo($"TypeScript build: {file}"); }); WriteInfo(tsc.Run("").Trim()); Parallel.ForEach(changedFiles .Where(f => !f.EndsWith(".vue.ts")), f => { // var tsc = new BabelSingleCompiler(file); // var js = tsc.Run(File.ReadAllText(file)); // File.WriteAllText(getOutputCacheFilename(file), js); var file = getOutputCacheFilename(f); var text = RegexReplacer.Replace(File.ReadAllText(file), @"import\(\(\(\)\s*=>\s*(.*)\)\(\)\)", match => { return($"import({match.Groups[1].Value})"); }); var min = uglifyJs.Minify(text); var minFile = ResourceMinifier.GetMinimizedFileName(file); File.WriteAllText(minFile, min); UpdateCachedMinFile(minFile); // WriteHint($"\t=> {minFile}"); }); } cache.SaveCache(); } WriteSuccess("TypeScript build complete."); return(this); }