예제 #1
0
        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"));
        }
예제 #2
0
        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"));
        }
예제 #3
0
        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);
        }