Example #1
0
        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, "});");
        }
Example #2
0
 private void OutputBottom(IEmitterOutput output, StringBuilder tmp)
 {
     if (output.BottomOutput.Length > 0)
     {
         WriteNewLine(tmp);
         tmp.Append(output.BottomOutput.ToString());
     }
 }
Example #3
0
 private void OutputTop(IEmitterOutput output, StringBuilder tmp)
 {
     if (output.TopOutput.Length > 0)
     {
         tmp.Append(output.TopOutput.ToString());
         WriteNewLine(tmp);
     }
 }
Example #4
0
        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>());
        }
Example #5
0
        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, ");");
        }
Example #6
0
        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);
        }
Example #7
0
        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, "}));");
        }
Example #8
0
        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, ");");
        }
Example #9
0
        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);
        }
Example #10
0
        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);
        }