protected virtual void WrapToAMD(StringBuilder moduleOutput, Module module, IEmitterOutput output) { var str = moduleOutput.ToString(); moduleOutput.Length = 0; WriteIndent(moduleOutput, InitialLevel); moduleOutput.Append(JS.Funcs.DEFINE + "("); if (!module.NoName) { moduleOutput.Append(ToJavaScript(module.OriginalName)); moduleOutput.Append(", "); } var enabledDependecies = GetEnabledDependecies(module, output); if (enabledDependecies.Count > 0) { moduleOutput.Append("["); enabledDependecies.Each(md => { moduleOutput.Append(ToJavaScript(md.DependencyName)); moduleOutput.Append(", "); }); moduleOutput.Remove(moduleOutput.Length - 2, 2); // remove trailing comma moduleOutput.Append("], "); } moduleOutput.Append("function ("); if (enabledDependecies.Count > 0) { enabledDependecies.Each(md => { moduleOutput.Append(md.VariableName.IsNotEmpty() ? md.VariableName : md.DependencyName); moduleOutput.Append(", "); }); moduleOutput.Remove(moduleOutput.Length - 2, 2); // remove trailing comma } WriteNewLine(moduleOutput, ") {"); WriteIndent(moduleOutput, InitialLevel); WriteNewLine(moduleOutput, INDENT + "var " + module.Name + " = { };"); moduleOutput.Append(str); if (!str.Trim().EndsWith(NEW_LINE)) { WriteNewLine(moduleOutput); } WriteIndent(moduleOutput, InitialLevel); WriteNewLine(moduleOutput, INDENT + "H5.init();"); WriteIndent(moduleOutput, InitialLevel); WriteNewLine(moduleOutput, INDENT + "return " + module.Name + ";"); WriteIndent(moduleOutput, InitialLevel); WriteNewLine(moduleOutput, "});"); }
private void OutputBottom(IEmitterOutput output, StringBuilder tmp) { if (output.BottomOutput.Length > 0) { WriteNewLine(tmp); tmp.Append(output.BottomOutput.ToString()); } }
private void OutputTop(IEmitterOutput output, StringBuilder tmp) { if (output.TopOutput.Length > 0) { tmp.Append(output.TopOutput.ToString()); WriteNewLine(tmp); } }
private List <IPluginDependency> GetEnabledDependecies(Module module, IEmitterOutput output) { var dependencies = output.ModuleDependencies; var loader = this.AssemblyInfo.Loader; if (dependencies.ContainsKey(module.Name) && dependencies[module.Name].Count > 0) { return(dependencies[module.Name].Where(d => !loader.IsManual(d.DependencyName)).ToList()); } return(new List <IPluginDependency>()); }
protected virtual void WrapToES6(StringBuilder moduleOutput, Module module, IEmitterOutput output) { var str = moduleOutput.ToString(); moduleOutput.Length = 0; moduleOutput.Append(Emitter.INDENT); this.WriteNewLine(moduleOutput, "(function () {"); moduleOutput.Append(Emitter.INDENT); this.WriteIndent(moduleOutput, this.InitialLevel); this.WriteNewLine(moduleOutput, "var " + module.Name + " = { };"); var enabledDependecies = this.GetEnabledDependecies(module, output); if (enabledDependecies.Count > 0) { enabledDependecies.Each(md => { moduleOutput.Append(Emitter.INDENT); this.WriteIndent(moduleOutput, this.InitialLevel); this.WriteNewLine(moduleOutput, "import " + (md.VariableName.IsNotEmpty() ? md.VariableName : md.DependencyName) + " from " + this.ToJavaScript(md.DependencyName) + ";"); }); } moduleOutput.Append(str); if (!str.Trim().EndsWith(Emitter.NEW_LINE)) { this.WriteNewLine(moduleOutput); } this.WriteIndent(moduleOutput, this.InitialLevel); this.WriteNewLine(moduleOutput, Emitter.INDENT + "export {" + module.Name + "};"); this.WriteIndent(moduleOutput, this.InitialLevel); moduleOutput.Append("}) ("); this.WriteNewLine(moduleOutput, ");"); }
protected virtual StringBuilder GetOutputForType(ITypeInfo typeInfo, string name, bool isMeta = false) { Module module = null; if (typeInfo != null && typeInfo.Module != null) { module = typeInfo.Module; } else if (this.Emitter.AssemblyInfo.Module != null) { module = this.Emitter.AssemblyInfo.Module; } var fileName = typeInfo != null ? typeInfo.FileName : name; if (fileName.IsEmpty() && this.Emitter.AssemblyInfo.OutputBy != OutputBy.Project) { switch (this.Emitter.AssemblyInfo.OutputBy) { case OutputBy.ClassPath: fileName = typeInfo.Type.FullName; break; case OutputBy.Class: fileName = this.GetIteractiveClassPath(typeInfo); break; case OutputBy.Module: fileName = module != null ? module.Name : null; break; case OutputBy.NamespacePath: case OutputBy.Namespace: fileName = typeInfo.GetNamespace(this.Emitter); break; default: break; } var isPathRelated = this.Emitter.AssemblyInfo.OutputBy == OutputBy.ClassPath || this.Emitter.AssemblyInfo.OutputBy == OutputBy.NamespacePath; if (fileName.IsNotEmpty() && isPathRelated) { fileName = fileName.Replace('.', System.IO.Path.DirectorySeparatorChar); if (this.Emitter.AssemblyInfo.StartIndexInName > 0) { fileName = fileName.Substring(this.Emitter.AssemblyInfo.StartIndexInName); } } } if (fileName.IsEmpty() && this.Emitter.AssemblyInfo.FileName != null) { fileName = this.Emitter.AssemblyInfo.FileName; } if (fileName.IsEmpty() && this.Emitter.Translator.ProjectProperties.AssemblyName != null) { fileName = this.Emitter.Translator.ProjectProperties.AssemblyName; } if (fileName.IsEmpty()) { fileName = AssemblyInfo.DEFAULT_FILENAME; } // Apply lowerCamelCase to filename if set up in bridge.json (or left default) if (this.Emitter.AssemblyInfo.FileNameCasing == FileNameCaseConvert.CamelCase) { var sepList = new string[] { ".", System.IO.Path.DirectorySeparatorChar.ToString(), "\\", "/" }; // Populate list only with needed separators, as usually we will never have all four of them var neededSepList = new List <string>(); foreach (var separator in sepList) { if (fileName.Contains(separator.ToString()) && !neededSepList.Contains(separator)) { neededSepList.Add(separator); } } // now, separating the filename string only by the used separators, apply lowerCamelCase if (neededSepList.Count > 0) { foreach (var separator in neededSepList) { var stringList = new List <string>(); foreach (var str in fileName.Split(separator[0])) { stringList.Add(str.ToLowerCamelCase()); } fileName = stringList.Join(separator); } } else { fileName = fileName.ToLowerCamelCase(); } } // Append '.js' extension to file name at translator.Outputs level: this aids in code grouping on files // when filesystem is not case sensitive. if (!FileHelper.IsJS(fileName)) { fileName += Contract.Constants.Files.Extensions.JS; } switch (this.Emitter.AssemblyInfo.FileNameCasing) { case FileNameCaseConvert.Lowercase: fileName = fileName.ToLower(); break; default: var lcFileName = fileName.ToLower(); // Find a file name that matches (case-insensitive) and use it as file name (if found) // The used file name will use the same casing of the existing one. foreach (var existingFile in this.Emitter.Outputs.Keys) { if (lcFileName == existingFile.ToLower()) { fileName = existingFile; } } break; } IEmitterOutput output = null; if (this.Emitter.Outputs.ContainsKey(fileName)) { output = this.Emitter.Outputs[fileName]; } else { output = new EmitterOutput(fileName) { IsMetadata = isMeta }; this.Emitter.Outputs.Add(fileName, output); } this.Emitter.EmitterOutput = output; if (module == null) { if (output.NonModuleDependencies == null) { output.NonModuleDependencies = new List <IPluginDependency>(); } this.Emitter.CurrentDependencies = output.NonModuleDependencies; return(output.NonModuletOutput); } if (module.Name == "") { module.Name = Bridge.Translator.AssemblyInfo.DEFAULT_FILENAME; } if (output.ModuleOutput.ContainsKey(module)) { this.Emitter.CurrentDependencies = output.ModuleDependencies[module.Name]; return(output.ModuleOutput[module]); } StringBuilder moduleOutput = new StringBuilder(); output.ModuleOutput.Add(module, moduleOutput); var dependencies = new List <IPluginDependency>(); output.ModuleDependencies.Add(module.Name, dependencies); if (typeInfo != null && typeInfo.Dependencies.Count > 0) { dependencies.AddRange(typeInfo.Dependencies); } this.Emitter.CurrentDependencies = dependencies; return(moduleOutput); }
protected virtual void WrapToUMD(StringBuilder moduleOutput, Module module, IEmitterOutput output) { var str = moduleOutput.ToString(); moduleOutput.Length = 0; this.WriteIndent(moduleOutput, 1); this.WriteNewLine(moduleOutput, "(function (root, factory) {"); this.WriteIndent(moduleOutput, 2); this.WriteNewLine(moduleOutput, "if (typeof define === 'function' && define.amd) {"); this.WriteIndent(moduleOutput, 3); moduleOutput.Append(JS.Funcs.DEFINE + "("); if (!module.NoName) { moduleOutput.Append(this.ToJavaScript(module.OriginalName)); moduleOutput.Append(", "); } var enabledDependecies = this.GetEnabledDependecies(module, output); if (enabledDependecies.Count > 0) { moduleOutput.Append("["); enabledDependecies.Each(md => { moduleOutput.Append(this.ToJavaScript(md.DependencyName)); moduleOutput.Append(", "); }); moduleOutput.Remove(moduleOutput.Length - 2, 2); // remove trailing comma moduleOutput.Append("], "); } this.WriteNewLine(moduleOutput, "factory);"); this.WriteIndent(moduleOutput, 2); this.WriteNewLine(moduleOutput, "} else if (typeof module === 'object' && module.exports) {"); this.WriteIndent(moduleOutput, 3); moduleOutput.Append("module.exports = factory("); if (enabledDependecies.Count > 0) { enabledDependecies.Each(md => { moduleOutput.Append("require(" + this.ToJavaScript(md.DependencyName) + "), "); }); moduleOutput.Remove(moduleOutput.Length - 2, 2); } this.WriteNewLine(moduleOutput, ");"); this.WriteIndent(moduleOutput, 2); this.WriteNewLine(moduleOutput, "} else {"); this.WriteIndent(moduleOutput, 3); moduleOutput.Append("root." + module.Name + " = factory("); if (enabledDependecies.Count > 0) { enabledDependecies.Each(md => { moduleOutput.Append("root." + md.DependencyName + ", "); }); moduleOutput.Remove(moduleOutput.Length - 2, 2); // remove trailing comma } this.WriteNewLine(moduleOutput, ");"); this.WriteIndent(moduleOutput, 2); this.WriteNewLine(moduleOutput, "}"); this.WriteIndent(moduleOutput, 1); moduleOutput.Append("}(this, function ("); if (enabledDependecies.Count > 0) { enabledDependecies.Each(md => { moduleOutput.Append(md.VariableName ?? md.DependencyName); moduleOutput.Append(", "); }); moduleOutput.Remove(moduleOutput.Length - 2, 2); // remove trailing comma } moduleOutput.Append(") {"); this.WriteNewLine(moduleOutput); this.WriteIndent(moduleOutput, 2); this.WriteNewLine(moduleOutput, "var " + module.Name + " = { };"); moduleOutput.Append(str); if (!str.Trim().EndsWith(Emitter.NEW_LINE)) { this.WriteNewLine(moduleOutput); } this.WriteIndent(moduleOutput, 2); this.WriteNewLine(moduleOutput, "return " + module.Name + ";"); this.WriteIndent(moduleOutput, 1); this.WriteNewLine(moduleOutput, "}));"); }
protected virtual void WrapToCommonJS(StringBuilder moduleOutput, Module module, IEmitterOutput output) { var str = moduleOutput.ToString(); moduleOutput.Length = 0; moduleOutput.Append(Emitter.INDENT); moduleOutput.Append("(function ("); var enabledDependecies = this.GetEnabledDependecies(module, output); if (enabledDependecies.Count > 0) { enabledDependecies.Each(md => { moduleOutput.Append(md.VariableName.IsNotEmpty() ? md.VariableName : md.DependencyName); moduleOutput.Append(", "); }); moduleOutput.Remove(moduleOutput.Length - 2, 2); // remove trailing comma } this.WriteNewLine(moduleOutput, ") {"); moduleOutput.Append(Emitter.INDENT); this.WriteIndent(moduleOutput, this.InitialLevel); this.WriteNewLine(moduleOutput, "var " + module.Name + " = { };"); moduleOutput.Append(str); if (!str.Trim().EndsWith(Emitter.NEW_LINE)) { this.WriteNewLine(moduleOutput); } this.WriteIndent(moduleOutput, this.InitialLevel); this.WriteNewLine(moduleOutput, Emitter.INDENT + "module.exports." + module.Name + " = " + module.Name + ";"); this.WriteIndent(moduleOutput, this.InitialLevel); moduleOutput.Append("}) ("); if (enabledDependecies.Count > 0) { enabledDependecies.Each(md => { moduleOutput.Append("require(" + this.ToJavaScript(md.DependencyName) + "), "); }); moduleOutput.Remove(moduleOutput.Length - 2, 2); // remove trailing comma } this.WriteNewLine(moduleOutput, ");"); }
private int AddDependencies(int level, IEmitterOutput output, StringBuilder tmp, StringBuilder endOutput) { var loader = AssemblyInfo.Loader; var dependencies = output.NonModuleDependencies; if (dependencies != null && dependencies.Count > 0) { var disabledDependecies = dependencies.Where(d => loader.IsManual(d.DependencyName)).ToList(); dependencies = dependencies.Where(d => !loader.IsManual(d.DependencyName)).ToList(); if (disabledDependecies.Count > 0 && !loader.SkipManualVariables) { WriteIndent(tmp, level); Write(tmp, "var "); for (int i = 0; i < disabledDependecies.Count; i++) { var d = disabledDependecies[i]; if (i != 0) { WriteIndent(tmp, level + 1); } Write(tmp, d.VariableName.IsNotEmpty() ? d.VariableName : d.DependencyName); Write(tmp, i == (disabledDependecies.Count - 1) ? ";" : ","); WriteNewLine(tmp); } WriteNewLine(tmp); } var type = loader.Type; var amd = dependencies.Where(d => d.Type == ModuleType.AMD || ((d.Type == null || d.Type == ModuleType.UMD) && type == ModuleLoaderType.AMD)).ToList(); var cjs = dependencies.Where(d => d.Type == ModuleType.CommonJS || ((d.Type == null || d.Type == ModuleType.UMD) && type == ModuleLoaderType.CommonJS)).ToList(); var es6 = dependencies.Where(d => d.Type == ModuleType.ES6 || (d.Type == null && type == ModuleLoaderType.ES6)).ToList(); if (amd.Count > 0) { WriteIndent(tmp, level); tmp.Append(loader.FunctionName ?? "require"); tmp.Append("(["); amd.Each(md => { tmp.Append(ToJavaScript(md.DependencyName)); tmp.Append(", "); }); tmp.Remove(tmp.Length - 2, 2); // remove trailing comma tmp.Append("], function ("); amd.Each(md => { tmp.Append(md.VariableName.IsNotEmpty() ? md.VariableName : md.DependencyName); tmp.Append(", "); }); tmp.Remove(tmp.Length - 2, 2); // remove trailing comma WriteNewLine(tmp, ") {"); WriteIndent(endOutput, level); WriteNewLine(endOutput, JS.Types.H5.INIT + "();"); WriteIndent(endOutput, level); WriteNewLine(endOutput, "});"); level++; } if (cjs.Count > 0) { cjs.Each(md => { WriteIndent(tmp, level); tmp.AppendFormat("var {0} = require(\"{1}\");", md.VariableName.IsNotEmpty() ? md.VariableName : md.DependencyName, md.DependencyName); WriteNewLine(tmp); }); if (es6.Count == 0) { WriteNewLine(tmp); } } if (es6.Count > 0) { es6.Each(md => { WriteIndent(tmp, level); WriteNewLine(tmp, "import " + (md.VariableName.IsNotEmpty() ? md.VariableName : md.DependencyName) + " from " + ToJavaScript(md.DependencyName) + ";"); }); WriteNewLine(tmp); } } return(level); }
private bool OutputNonModule(bool disableAsm, string fileName, IEmitterOutput output, bool isJs, StringBuilder tmp) { bool metaDataWritten = false; var level = InitialLevel; StringBuilder endOutput = new StringBuilder(); if (output.NonModuletOutput.Length > 0 || output.ModuleOutput.Count > 0) { if (isJs) { if (!disableAsm) { string asmName = AssemblyInfo.Assembly.FullName ?? Translator.ProjectProperties.AssemblyName; OutputAssemblyComment(tmp); tmp.Append(JS.Types.H5.ASSEMBLY + "("); tmp.AppendFormat("\"{0}\"", asmName); tmp.Append(","); if (!metaDataWritten && (MetaDataOutputName == null || fileName == MetaDataOutputName)) { var res = GetIncludedResources(); if (res != null) { tmp.Append(" "); tmp.Append(res); tmp.Append(","); } metaDataWritten = true; } tmp.Append(" "); tmp.Append("function ($asm, globals) {"); WriteNewLine(tmp); WriteIndent(tmp, level); tmp.Append(GetOutputHeader()); WriteNewLine(tmp); WriteNewLine(tmp); } level = AddDependencies(level, output, tmp, endOutput); } var code = output.NonModuletOutput.ToString(); if (code.Length > 0) { tmp.Append(level > InitialLevel ? INDENT + code.Replace(NEW_LINE, NEW_LINE + INDENT) : code); } if (endOutput.Length > 0) { tmp.Append(endOutput.ToString()); } if (output.ModuleOutput.Any()) { if (code.Length > 0) { WriteNewLine(tmp); } foreach (var moduleOutput in output.ModuleOutput) { WriteNewLine(tmp, moduleOutput.Value.ToString()); } } if (isJs && !disableAsm) { tmp.Append("});"); WriteNewLine(tmp); } } return(metaDataWritten); }