private void MinifyJs(BundleContext context, BundleResponse response)
        {
            UglifyResult uglifyResult = new UglifyResult();

            response.Content = new StringBuilder(10000);
            foreach (BundleFile bundleFile in response.BundleFiles.Values)
            {
                try
                {
                    uglifyResult = Uglify.Js(bundleFile.Content.ToString(), ConfigureSettings(new CodeSettings()));
                    if (uglifyResult.HasErrors)
                    {
                        AddErrors(uglifyResult, context, response, bundleFile.PhysicalPath);
                    }
                    response.Content.Append(uglifyResult.Code);
                    if (!string.IsNullOrEmpty(uglifyResult.Code) && uglifyResult.Code.Length > 1)
                    {
                        char last = uglifyResult.Code[uglifyResult.Code.Length - 1];
                        if (!last.Equals('}') && !last.Equals(';'))
                        {
                            response.Content.Append(";");
                            AddErrors($"Javascript file is missing trailing ';'", $"Control and fix the missing ';'!", context, response, bundleFile.PhysicalPath);
                        }
                    }
                }
                catch (Exception ex)
                {
                    AddErrors(ex.Message, ex.StackTrace, context, response, bundleFile.PhysicalPath);
                    response.Content.Append(bundleFile.Content);//in case of an error append the non minified
                }
            }
            response.Content.Append(response.ContentRaw);
        }
示例#2
0
        protected void SetIdentifier(UglifyResult min)
        {
            SHA256 sha256     = SHA256.Create();
            var    hashResult = sha256.ComputeHash(Encoding.Unicode.GetBytes(min.Code));

            this.VersionIdentifier = Convert.ToBase64String(hashResult);
        }
示例#3
0
        private void ExecuteCruncher(ITaskItem scriptItem)
        {
            string script = File.ReadAllText(scriptItem.ItemSpec);

            CodeSettings codeSettings = new CodeSettings
            {
                StripDebugStatements         = false,
                OutputMode                   = OutputMode.SingleLine,
                IgnorePreprocessorDefines    = true,
                IgnoreConditionalCompilation = true,
                TermSemicolons               = true,
                NoAutoRenameList             = "$"
            };

            UglifyResult result = Uglify.Js(script, codeSettings);

            if (result.HasErrors)
            {
                foreach (UglifyError error in result.Errors)
                {
                    Log.LogError(error.Subcategory, error.ErrorCode, error.HelpKeyword, error.File, error.StartLine, error.StartColumn, error.EndLine, error.EndColumn, error.Message);
                }

                return;
            }

            File.WriteAllText(scriptItem.ItemSpec, result.Code);
        }
示例#4
0
        public override Task ExecuteAsync(IAssetContext config)
        {
            var content = new Dictionary <string, byte[]>();

            foreach (string key in config.Content.Keys)
            {
                if (key.EndsWith(".min.js"))
                {
                    continue;
                }

                string       input    = config.Content[key].AsString();
                UglifyResult result   = Uglify.Js(input, Settings);
                string       minified = result.Code;

                if (result.HasErrors)
                {
                    minified = $"/* {string.Join("\r\n", result.Errors)} */\r\n" + input;
                }

                content[key] = minified.AsByteArray();
            }

            config.Content = content;

            return(Task.CompletedTask);
        }
示例#5
0
        public StringBuilder Process(StringBuilder inputHtml, ILogger logger, BundleResponse response)
        {
            StringBuilder sb           = new StringBuilder(1000);
            UglifyResult  uglifyResult = new UglifyResult();

            try
            {
                uglifyResult = Uglify.Html(inputHtml.ToString(), ConfigureSettings(new HtmlSettings()));
                if (uglifyResult.HasErrors)
                {
                    foreach (UglifyError error in uglifyResult.Errors)
                    {
                        if (response != null)
                        {
                            response.TransformationErrors.Append($"Error message: {error.Message}<br />Error details: {error.ToString()}").Append("<br />");
                        }

                        logger.LogCritical($"Error message: {error.Message} {Environment.NewLine} Error details: {error.ToString()}", error);
                    }
                }
                sb.Append(uglifyResult.Code);
            }
            catch (Exception ex)
            {
                response.TransformationErrors.Append($"Error: {ex.Message}<br />Error details: {ex.StackTrace}").Append("<br />");
                logger.LogCritical($"Error: {ex.Message} {Environment.NewLine} Error details: {ex.StackTrace}", ex);
                throw;
            }
            return(sb);
        }
        public override async Task <IEnumerable <Asset> > TransformAsync(string extension, params Asset[] assets)
        {
            CodeSettings codeSettings = new CodeSettings()
            {
                AmdSupport                = true,
                ScriptVersion             = ScriptVersion.None,
                PreserveImportantComments = false
            };

            List <Asset> outputs = new List <Asset>();

            foreach (var asset in assets)
            {
                string code = await asset.ReadContentAsStringAsync();

                UglifyResult uglifyResult = Uglify.Js(code, codeSettings);

                if (uglifyResult.HasErrors)
                {
                    throw new AggregateException(uglifyResult.Errors.Select(x => new Exception(x.Message)));
                }

                Asset outputAsset = await asset.CloneWithContentAsync(uglifyResult.Code);

                outputs.Add(outputAsset);
            }
            return(outputs.AsEnumerable());
        }
示例#7
0
        /// <summary>
        /// Gets a code minification result from original minification result
        /// </summary>
        /// <param name="originalResult">Original minification result</param>
        /// <returns>Code minification result</returns>
        protected static CodeMinificationResult GetCodeMinificationResult(UglifyResult originalResult)
        {
            var errors   = new List <MinificationErrorInfo>();
            var warnings = new List <MinificationErrorInfo>();

            if (originalResult.HasErrors)
            {
                IList <UglifyError> originalErrors = originalResult.Errors;

                foreach (UglifyError originalError in originalErrors)
                {
                    var errorDetails = new MinificationErrorInfo(originalError.Message, originalError.StartLine,
                                                                 originalError.StartColumn, string.Empty);
                    if (originalError.IsError)
                    {
                        errors.Add(errorDetails);
                    }
                    else
                    {
                        warnings.Add(errorDetails);
                    }
                }
            }

            return(new CodeMinificationResult(originalResult.Code, errors, warnings));
        }
        protected override byte[] GenerateCode(string inputFileName, string inputFileContent)
        {
            var options = new ScssOptions();

            ScssResult   result   = Scss.ConvertFileToCss(inputFileName, options);
            UglifyResult minified = Uglify.Css(result.Css);

            return(Encoding.UTF8.GetBytes(minified.Code));
        }
示例#9
0
        public async Task <string> GetStyle()
        {
            string path = $"{environment.WebRootPath}{Path.DirectorySeparatorChar}style.css";
            string css  = await File.ReadAllTextAsync(path);

            UglifyResult result = Uglify.Css(css);

            return(result.Code);
        }
示例#10
0
 private static void CheckErrors(UglifyResult result)
 {
     if (result.HasErrors)
     {
         throw new NUglifyException(
                   $"There are some errors on uglifying the given source code!{Environment.NewLine}{result.Errors.Select(err => err.ToString()).JoinAsString(Environment.NewLine)}",
                   result.Errors
                   );
     }
 }
 private void AddErrors(UglifyResult uglifyResult, BundleContext context, BundleResponse response, string file)
 {
     if (uglifyResult.HasErrors)
     {
         foreach (UglifyError error in uglifyResult.Errors)
         {
             AddErrors(error.Message, error.ToString(), context, response, file);
         }
     }
 }
示例#12
0
        /// <summary>
        /// Produces a code minifiction of JS content by using the NUglify JS Minifier
        /// </summary>
        /// <param name="content">JS content</param>
        /// <param name="isInlineCode">Flag whether the content is inline code</param>
        /// <param name="encoding">Text encoding</param>
        /// <returns>Minification result</returns>
        public CodeMinificationResult Minify(string content, bool isInlineCode, Encoding encoding)
        {
            if (string.IsNullOrWhiteSpace(content))
            {
                return(new CodeMinificationResult(string.Empty));
            }

            CodeSettings originalJsSettings = isInlineCode ?
                                              _originalInlineJsSettings : _originalEmbeddedJsSettings;
            UglifyResult           originalResult = Uglify.Js(content, originalJsSettings);
            CodeMinificationResult result         = GetCodeMinificationResult(originalResult);

            return(result);
        }
        protected override byte[] GenerateCode(string inputFileName, string inputFileContent)
        {
            string       ext    = Path.GetExtension(inputFileName).ToLowerInvariant();
            UglifyResult result = Minify(inputFileName, inputFileContent);

            if (result.HasErrors)
            {
                return(Encoding.UTF8.GetBytes("// Source file contains errors"));
            }
            else
            {
                return(Encoding.UTF8.GetBytes(result.Code));
            }
        }
示例#14
0
        private static void AddNUglifyErrors(UglifyResult minifier, MinificationResult minResult)
        {
            foreach (var error in minifier.Errors)
            {
                var minError = new MinificationError
                {
                    FileName     = minResult.FileName,
                    Message      = error.Message,
                    LineNumber   = error.StartLine,
                    ColumnNumber = error.StartColumn
                };

                minResult.Errors.Add(minError);
            }
        }
示例#15
0
        private static void CheckErrors(UglifyResult result, string originalFileName)
        {
            if (result.HasErrors)
            {
                var errorMessage = "There are some errors on uglifying the given source code!";

                if (originalFileName != null)
                {
                    errorMessage += " Original file: " + originalFileName;
                }

                throw new NUglifyException(
                          $"{errorMessage}{Environment.NewLine}{result.Errors.Select(err => err.ToString()).JoinAsString(Environment.NewLine)}",
                          result.Errors
                          );
            }
        }
示例#16
0
        public static void RebuildBundle(IRequestHandler requestHandler, string bundleFilename)
        {
            try
            {
                dynamic bundle     = JsonConvert.DeserializeObject(File.ReadAllText(PathManager.GetBundlePath(requestHandler, bundleFilename)));
                string  outputFile = bundle.outputFile;
                IEnumerable <string> inputFiles = bundle.inputFiles.ToObject <IEnumerable <string> >();
                string       input  = BandleManager.ConcatFiles(requestHandler, inputFiles);
                UglifyResult result = outputFile.EndsWith(".css") ? Uglify.Css(input) : outputFile.EndsWith(".js") ? Uglify.Js(input) : default(UglifyResult);

                if (!result.HasErrors)
                {
                    File.WriteAllText(Path.Combine(PathManager.GetContentRootPath(requestHandler), outputFile), result.Code);
                }
            }

            catch { }
        }
        public override async Task <IEnumerable <Asset> > TransformAsync(string extension, params Asset[] assets)
        {
            CssSettings cssSettings = new CssSettings()
            {
                CommentMode = CssComment.None
            };

            if (0 < this.MinificationOptions.Substitutions.Count)
            {
                cssSettings.ReplacementTokensApplyDefaults(this.MinificationOptions.Substitutions);
            }

            CodeSettings codeSettings = new CodeSettings()
            {
                AmdSupport                = true,
                ScriptVersion             = ScriptVersion.None,
                PreserveImportantComments = false
            };

            List <Asset> outputs = new List <Asset>();

            foreach (var asset in assets)
            {
                string code = await asset.ReadContentAsStringAsync();

                UglifyResult uglifyResult = Uglify.Css(code, cssSettings, codeSettings);

                if (uglifyResult.HasErrors)
                {
                    throw new AggregateException(uglifyResult.Errors.Select(x => new Exception(x.Message)));
                }

                Asset outputAsset = await asset.CloneWithContentAsync(uglifyResult.Code);

                outputs.Add(outputAsset);
            }
            return(outputs.AsEnumerable());
        }
示例#18
0
        private async System.Threading.Tasks.Task TranspileAsync(string filePath)
        {
            await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

            DTE2 dte = await AsyncServiceProvider.GlobalProvider.GetServiceAsync <DTE, DTE2>();

            var options = new ScssOptions();

            options.IncludePaths.Add(Path.GetDirectoryName(filePath));
            ScssResult result = Scss.ConvertToCss(_doc.TextBuffer.CurrentSnapshot.GetText(), options);

            var cssPath = Path.ChangeExtension(filePath, ".css");

            dte.SourceControl.CheckOutItemSafely(cssPath);

            using (var writer = new StreamWriter(cssPath))
            {
                await writer.WriteAsync(result.Css);
            }

            ProjectItem scssItem = dte.Solution.FindProjectItem(filePath);
            ProjectItem cssItem  = dte.Solution.FindProjectItem(cssPath);

            if (cssItem != null || scssItem.TryAddNestedFile(cssPath, out cssItem))
            {
                UglifyResult minified = Uglify.Css(result.Css);
                var          minPath  = Path.ChangeExtension(cssPath, ".min.css");

                dte.SourceControl.CheckOutItemSafely(minPath);

                using (var writer = new StreamWriter(minPath))
                {
                    await writer.WriteAsync(minified.Code);
                }

                cssItem.TryAddNestedFile(minPath, out _);
            }
        }
        private void MinifyCss(BundleContext context, BundleResponse response)
        {
            UglifyResult uglifyResult = new UglifyResult();

            response.Content = new StringBuilder(10000);
            foreach (BundleFile bundleFile in response.BundleFiles.Values)
            {
                try
                {
                    uglifyResult = Uglify.Css(bundleFile.Content.ToString(), ConfigureSettings(new CssSettings()));
                    if (uglifyResult.HasErrors)
                    {
                        AddErrors(uglifyResult, context, response, bundleFile.PhysicalPath);
                    }
                    response.Content.Append(uglifyResult.Code);
                }
                catch (Exception ex)
                {
                    AddErrors(ex.Message, ex.StackTrace, context, response, bundleFile.PhysicalPath);
                    response.Content.Append(bundleFile.Content);//in case of an error append the non minified
                }
            }
        }
示例#20
0
        public string Process(string content, string filePath)
        {
            UglifyResult result = Uglify.Css(content, _settings);

            if (result.Errors.Count > 0)
            {
                var message =
                    result.HasErrors ?
                    $"Css minification of '{{FILEPATH}}' failed:{Environment.NewLine}{{REASON}}" :
                    $"Css minification of '{{FILEPATH}}' completed with warnings:{Environment.NewLine}{{REASON}}";

                _logger.LogWarning(message,
                                   filePath ?? "(content)",
                                   string.Join(Environment.NewLine, result.Errors));

                if (result.HasErrors)
                {
                    return(content);
                }
            }

            return(result.Code);
        }
示例#21
0
        public void Prepare()
        {
            var fullContent = string.Empty;

            foreach (var item in this.Pathes)
            {
                if (!File.Exists(item.Value) && BundleCollection.Instance.DontThrowOnMissingFile)
                {
                    continue;
                }


                var fContent = File.ReadAllText(item.Value);
                fContent     = Relocate(fContent, item.Key);
                fullContent += fContent;
            }

            this.minResult = MinFunc.Invoke(fullContent);
            var outPath = Path.Combine(BundleCollection.Instance.RootPath, this.BundlePath.Replace("~/", string.Empty));

            File.WriteAllText(outPath, minResult.Code);
            SetIdentifier(minResult);
        }
        /// <summary>
        /// Executes the processor on the specified configuration.
        /// </summary>
        public Task ExecuteAsync(IAssetContext context)
        {
            var           content      = new Dictionary <string, byte[]>();
            var           env          = (IHostingEnvironment)context.HttpContext.RequestServices.GetService(typeof(IHostingEnvironment));
            IFileProvider fileProvider = context.Asset.GetFileProvider(env);

            var builder = new StringBuilder();

            // Javascript module for Angular that uses templateCache
            builder.AppendFormat(@"angular.module('{0}',[]).run(['$templateCache',function($templateCache){{",
                                 _moduleName);
            foreach (string route in context.Content.Keys)
            {
                IFileInfo file      = fileProvider.GetFileInfo(route);
                string    inputFile = file.PhysicalPath;

                string       input    = context.Content[route].AsString().Replace("\r\n", "").Replace("'", "\\'");
                UglifyResult result   = Uglify.Html(input, Settings);
                string       minified = result.Code;

                if (result.HasErrors)
                {
                    minified = $"// {string.Join("\r\n", result.Errors)} ${input}";
                }

                builder.AppendFormat(@"$templateCache.put('{0}{1}','{2}');", _path, file.Name, minified);

                //content[route] = cx.AsByteArray();
            }
            builder.Append(@"}]);");
            string cx = builder.ToString();

            content.Add(Guid.NewGuid().ToString(), cx.AsByteArray());
            context.Content = content;

            return(Task.CompletedTask);
        }
示例#23
0
        private static void WriteMinFile(Bundle bundle, MinificationResult minResult, UglifyResult uglifyResult)
        {
            var minFile = GetMinFileName(minResult.FileName);

            minResult.MinifiedContent = uglifyResult.Code?.Trim();

            if (!uglifyResult.HasErrors)
            {
                bool containsChanges = FileHelpers.HasFileContentChanged(minFile, minResult.MinifiedContent);
                minResult.Changed |= containsChanges;
                OnBeforeWritingMinFile(minResult.FileName, minFile, bundle, containsChanges);

                if (containsChanges)
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(minFile));
                    File.WriteAllText(minFile, minResult.MinifiedContent, new UTF8Encoding(false));
                    OnAfterWritingMinFile(minResult.FileName, minFile, bundle, containsChanges);
                }
            }
            else
            {
                AddNUglifyErrors(uglifyResult, minResult);
            }
        }
示例#24
0
        public override string Compress(string source)
        {
            UglifyResult ugly = Uglify.Js(source);

            return(ProcessCompress(ugly));
        }
        private static string GenerateMinifierErrorsContent(string contentConcatedString, UglifyResult result)
        {
            var sbContent = new StringBuilder();

            sbContent.Append("/* ");
            sbContent.Append("An error occurred during minification, see errors below - returning concatenated content unminified.").Append("\r\n");
            foreach (var error in result.Errors)
            {
                sbContent.Append(error).Append("\r\n");
            }
            sbContent.Append(" */\r\n");
            sbContent.Append(contentConcatedString);
            return(sbContent.ToString());
        }