private void Minify(string jsPath) { string minifiedPath = null; if (jsPath.EndsWith(".js", StringComparison.OrdinalIgnoreCase) == false) { minifiedPath = jsPath + ".min"; } else { minifiedPath = jsPath.Substring(0, jsPath.Length - 3) + ".min.js"; } var mapPath = jsPath.Replace(".js", ".min.js") + ".map"; StreamWriter mapWriter = null; V3SourceMap sourceMap = null; try { var settings = new CodeSettings(); //try //{ //Be aware that the text encoding should be UTF-8 with no Byte-Order Mark (BOM) written at the beginning. //V3 source map files that include a BOM will not be read by Chrome mapWriter = new StreamWriter(mapPath, false, new System.Text.UTF8Encoding(false)); sourceMap = new V3SourceMap(mapWriter); sourceMap.StartPackage(minifiedPath, mapPath); // the first argument specifies "file" field in map file. // the second arugment specifies "//# sourceMappingURL=" in the output (minified js) settings.SymbolsMap = sourceMap; //} //catch (Exception ex) //{ //} settings.TermSemicolons = true; Minifier minifier = new Minifier(); minifier.FileName = jsPath; var content = minifier.MinifyJavaScript(File.ReadAllText(jsPath), settings); using (StreamWriter sw = new StreamWriter(minifiedPath)) { sw.Write(content); } } finally { if (sourceMap != null) { sourceMap.EndPackage(); sourceMap.Dispose(); } mapWriter?.Dispose(); } }
public void SourceMapForMultipleFiles() { var assetBuilder = new StringBuilder(); var assets = new[] { "SourceMapForMultipleFiles1.js", "SourceMapForMultipleFiles2.js", "SourceMapForMultipleFiles3.js" }; var currentPath = AppDomain.CurrentDomain.BaseDirectory; foreach (var asset in assets) { assetBuilder.AppendLine("///#source 1 1 " + asset); var path = Path.Combine(currentPath, "TestData\\JS\\Input\\SourceMap\\" + asset); assetBuilder.AppendLine(File.ReadAllText(path)); } var stringBuilder = new StringBuilder(); using (var textWriter = new StringWriter(stringBuilder)) { var sourceMap = new V3SourceMap(textWriter); sourceMap.StartPackage("infile.js", "SourceMapForMultipleFiles.js.map"); var uglifyResult = Uglify.Js(assetBuilder.ToString(), "SourceMapForMultipleFiles.js", new CodeSettings { SymbolsMap = sourceMap, SourceMode = JavaScriptSourceMode.Program, MinifyCode = true, OutputMode = OutputMode.SingleLine, StripDebugStatements = false, LineTerminator = "\r\n" }); sourceMap.EndPackage(); sourceMap.Dispose(); var code = uglifyResult.Code; Assert.AreEqual(File.ReadAllText(Path.Combine(currentPath, "TestData\\JS\\Expected\\SourceMap\\SourceMapForMultipleFiles.js")), code); var builder = stringBuilder.ToString(); Assert.AreEqual(File.ReadAllText(Path.Combine(currentPath, "TestData\\JS\\Expected\\SourceMap\\SourceMapForMultipleFiles.js.map")), builder); } }
public void Dispose() { _wrapped.Dispose(); }
public override IEnumerable<PvcCore.PvcStream> Execute(IEnumerable<PvcCore.PvcStream> inputStreams) { var resultStreams = new List<PvcStream>(); SwitchParser switchParser = null; if (!String.IsNullOrEmpty(this.commandLineSwitches)) { switchParser = new SwitchParser(); switchParser.Parse(this.commandLineSwitches); } foreach (var inputStream in inputStreams) { var dirName = Path.GetDirectoryName(inputStream.StreamName); var fileName = Path.GetFileNameWithoutExtension(inputStream.StreamName) + ".min" + Path.GetExtension(inputStream.StreamName); var resultName = Path.Combine(dirName, fileName); var fileContent = new StreamReader(inputStream).ReadToEnd(); var minifier = new Minifier(); var sourceStream = new MemoryStream(); var outputWriter = new StreamWriter(sourceStream); if (inputStream.StreamName.EndsWith(".js")) { // Currently AjaxMin only supports JS source maps if (this.generateSourceMaps) { var resultMapName = resultName + ".map"; var utf8 = new UTF8Encoding(false); var mapStream = new MemoryStream(); var mapWriter = new SourcemapStreamWriter(mapStream, utf8); var sourceMap = new V3SourceMap(mapWriter); if (sourceMap != null) { if (switchParser == null) { switchParser = new SwitchParser(); } switchParser.JSSettings.SymbolsMap = sourceMap; switchParser.JSSettings.TermSemicolons = true; sourceMap.StartPackage(resultName, resultMapName); outputWriter.Write(minifier.MinifyJavaScript(fileContent, switchParser.JSSettings)); sourceMap.EndPackage(); sourceMap.EndFile(outputWriter, "\r\n"); sourceMap.Dispose(); mapWriter.Flush(); resultStreams.Add(new PvcStream(() => mapStream).As(resultMapName)); } } else { CodeSettings settings = new CodeSettings(); if (switchParser != null) settings = switchParser.JSSettings; outputWriter.Write(minifier.MinifyJavaScript(fileContent, settings)); } } else { CssSettings settings = new CssSettings(); if (switchParser != null) settings = switchParser.CssSettings; outputWriter.Write(minifier.MinifyStyleSheet(fileContent, settings)); } foreach (var error in minifier.ErrorList) { Console.Error.WriteLine(error.ToString()); } outputWriter.Flush(); resultStreams.Add(new PvcStream(() => sourceStream).As(resultName)); } return resultStreams; }
public override IEnumerable <PvcCore.PvcStream> Execute(IEnumerable <PvcCore.PvcStream> inputStreams) { var resultStreams = new List <PvcStream>(); SwitchParser switchParser = null; if (!String.IsNullOrEmpty(this.commandLineSwitches)) { switchParser = new SwitchParser(); switchParser.Parse(this.commandLineSwitches); } foreach (var inputStream in inputStreams) { var dirName = Path.GetDirectoryName(inputStream.StreamName); var fileName = Path.GetFileNameWithoutExtension(inputStream.StreamName) + ".min" + Path.GetExtension(inputStream.StreamName); var resultName = Path.Combine(dirName, fileName); var fileContent = new StreamReader(inputStream).ReadToEnd(); var minifier = new Minifier(); var sourceStream = new MemoryStream(); var outputWriter = new StreamWriter(sourceStream); if (inputStream.StreamName.EndsWith(".js")) { // Currently AjaxMin only supports JS source maps if (this.generateSourceMaps) { var resultMapName = resultName + ".map"; var utf8 = new UTF8Encoding(false); var mapStream = new MemoryStream(); var mapWriter = new SourcemapStreamWriter(mapStream, utf8); var sourceMap = new V3SourceMap(mapWriter); if (sourceMap != null) { if (switchParser == null) { switchParser = new SwitchParser(); } switchParser.JSSettings.SymbolsMap = sourceMap; switchParser.JSSettings.TermSemicolons = true; sourceMap.StartPackage(resultName, resultMapName); outputWriter.Write(minifier.MinifyJavaScript(fileContent, switchParser.JSSettings)); sourceMap.EndPackage(); sourceMap.EndFile(outputWriter, "\r\n"); sourceMap.Dispose(); mapWriter.Flush(); resultStreams.Add(new PvcStream(() => mapStream).As(resultMapName)); } } else { CodeSettings settings = new CodeSettings(); if (switchParser != null) { settings = switchParser.JSSettings; } outputWriter.Write(minifier.MinifyJavaScript(fileContent, settings)); } } else { CssSettings settings = new CssSettings(); if (switchParser != null) { settings = switchParser.CssSettings; } outputWriter.Write(minifier.MinifyStyleSheet(fileContent, settings)); } foreach (var error in minifier.ErrorList) { Console.Error.WriteLine(error.ToString()); } outputWriter.Flush(); resultStreams.Add(new PvcStream(() => sourceStream).As(resultName)); } return(resultStreams); }