/// <summary> /// Get the output file for the include. /// </summary> /// <returns>The output file for the include.</returns> public string GetOutputFile() { if (File == null) { throw new ArgumentNullException("File"); } else if (File == string.Empty) { throw new ArgumentOutOfRangeException("File", "Value cannot be empty."); } if (string.IsNullOrWhiteSpace(OutputFile)) { string inputFile = File; if (FileExtension.IsMinified(inputFile)) { return(inputFile); } else { if (FileExtension.IsLess(inputFile)) { inputFile += ".css"; } else if (FileExtension.IsJsHtml(inputFile)) { inputFile += ".js"; } return(IncludeFileRegex.Replace(inputFile, @"${Name}.min${TypeExt}")); } } else { if (Path.IsPathRooted(OutputFile)) { return(OutputFile); } else { return(Path.Combine(Path.GetDirectoryName(Path.GetFullPath(File)), OutputFile)); } } }
private void Transform(IncludeState include) { if (include == null) { throw new System.ArgumentNullException("include"); } try { if (include.Transformed) { // IF we've already transformed this file // THEN bail return; } LogInfo("Ensuring the include \"{0}\" is up-to-date.", include.File.FullName); // what are the input files var inputFiles = new List <FileInfo>(); inputFiles.Add(include.File); inputFiles.AddRange(include.Imports.Select(s => new FileInfo(s))); // what is the most recent last write time utc var inputMostRecentLastWriteTimeUtc = inputFiles.Select(f => f.LastWriteTimeUtc) // add the frappe lib as a last write utc source so the // output will be updated when frappe is published to fix // bugs and improve the output .Concat(new[] { ExecutingAssemblyFile.LastWriteTimeUtc }) .OrderByDescending(d => d) .First(); FileInfo inputFile = include.File; if (FileExtension.IsLess(include.File.FullName)) { // IF it's a less file // THEN we need to create the css output file inputFile = new FileInfo(include.File.FullName + ".css"); if (!inputFile.Exists || inputFile.Length == 0 || inputFile.LastWriteTimeUtc < inputMostRecentLastWriteTimeUtc) { // IF the input file doesn't exist // OR the file is older than any of the inputs // THEN re-compile the less file LogInfo("The css output \"{0}\" for less include \"{1}\" does not exist or is out-of-date.", inputFile, include.File.FullName); // compile the less file this.CompileLess(include.File.FullName, inputFile.FullName); // refresh the input file inputFile.Refresh(); // set the file last write time to match the inputs since it's generated based on them inputFile.LastWriteTimeUtc = inputMostRecentLastWriteTimeUtc; LogInfo("The css output \"{0}\" for less include \"{1}\" has been updated.", inputFile, include.File.FullName); } } else if (FileExtension.IsJsHtml(include.File.FullName)) { // remove the .html from the file name so it becomes name.js inputFile = new FileInfo(include.File.FullName + ".js"); if (!inputFile.Exists || inputFile.Length == 0 || inputFile.LastWriteTimeUtc < inputMostRecentLastWriteTimeUtc) { // IF the input file doesn't exist // OR the file is older than any of the inputs // THEN re-compile the less file LogInfo("The javascript output \"{0}\" for js.html include \"{1}\" does not exist or is out-of-date.", inputFile, include.File.FullName); // compile the js.html file this.CompileJsHtml(include.File.FullName, inputFile.FullName); // refresh the input file inputFile.Refresh(); // set the file last write time to match the inputs since it's generated based on them inputFile.LastWriteTimeUtc = inputMostRecentLastWriteTimeUtc; LogInfo("The javascript output \"{0}\" for js.html include \"{1}\" has been updated.", inputFile, include.File.FullName); } } // do they exist and are they up-to-date relative to the outputs? var outputFile = include.OutputFile; // tranform the include if (!outputFile.Exists || outputFile.Length == 0 || outputFile.LastWriteTimeUtc < inputFile.LastWriteTimeUtc) { // IF the output file does NOT exist // OR the output file is out-of-date // THEN rebuild the output file LogInfo("The minified output \"{0}\" for include \"{1}\" does not exist or is out-of-date.", outputFile, inputFile); if (FileExtension.IsCss(inputFile.FullName)) { MinifyCss(inputFile.FullName, outputFile.FullName); } else if (FileExtension.IsJavaScript(inputFile.FullName)) { MinifyJavaScript(inputFile.FullName, outputFile.FullName); } else { throw new NotImplementedException(string.Format("Transformation of file has not been implemented. File: {0}", inputFile.FullName)); } // update the output file outputFile.Refresh(); // set the file last write time to match the input since it's generated based on it outputFile.LastWriteTimeUtc = inputMostRecentLastWriteTimeUtc; LogInfo("The minified output \"{0}\" for include \"{1}\" has been updated.", outputFile, inputFile); } // update the state include.Transformed = true; include.OutputFile = outputFile; } catch (Exception ex) { throw new ApplicationException(string.Format("An error occurred trying to transform bundle include. Include File: {0}", include.File), ex); } }