public void Build(string sourceRoot, string mapUrl, bool testProj = false) { _versionDirPrefix = ""; if (Project.OutputSubDir != null) { _versionDirPrefix = Project.OutputSubDir + "/"; } var root = Project.CommonSourceDirectory; if (root == null) { return; } var sourceMapBuilder = new SourceMapBuilder(); if (!testProj && Project.NoHtml) { sourceMapBuilder.AddText(GetInitG11nCode()); sourceMapBuilder.AddText(_tools.LoaderJs); sourceMapBuilder.AddText(GetGlobalDefines()); sourceMapBuilder.AddText(GetModuleMap()); } sourceMapBuilder.AddText(_tools.TsLibSource); var cssLink = ""; foreach (var source in BuildResult.Path2FileInfo) { if (source.Value.Type == FileCompilationType.JavaScriptAsset) { sourceMapBuilder.AddSource(source.Value.Output, source.Value.MapLink); } } foreach (var source in BuildResult.Path2FileInfo) { if (source.Value.Type == FileCompilationType.TypeScript || source.Value.Type == FileCompilationType.JavaScript) { if (source.Value.Output == null) { continue; // Skip d.ts } sourceMapBuilder.AddText( $"R('{PathUtils.Subtract(PathUtils.WithoutExtension(source.Key), root)}',function(require, module, exports, global){{"); sourceMapBuilder.AddSource(source.Value.Output, source.Value.MapLink); sourceMapBuilder.AddText("});"); } else if (source.Value.Type == FileCompilationType.Css) { string cssPath = source.Value.OutputUrl; FilesContent[cssPath] = source.Value.Output; cssLink += "<link rel=\"stylesheet\" href=\"" + cssPath + "\">"; } else if (source.Value.Type == FileCompilationType.Resource) { FilesContent[source.Value.OutputUrl] = source.Value.Owner.ByteContent; } } if (Project.SpriteGeneration) { _bundlePng = Project.BundlePngUrl; var bundlePngContent = Project.SpriteGenerator.BuildImage(false); if (bundlePngContent != null) { _bundlePngInfo = new List <float>(); foreach (var slice in bundlePngContent) { FilesContent[PathUtils.InjectQuality(_bundlePng, slice.Quality)] = slice.Content; _bundlePngInfo.Add(slice.Quality); } } else { _bundlePng = null; } } if (!testProj && Project.NoHtml) { sourceMapBuilder.AddText(RequireBobril()); sourceMapBuilder.AddText( $"R.r('{PathUtils.WithoutExtension(PathUtils.Subtract(Project.MainFile, root))}');"); } sourceMapBuilder.AddText("//# sourceMappingURL=" + mapUrl); _sourceMap = sourceMapBuilder.Build(root, sourceRoot); _sourceMapString = _sourceMap.ToString(); _bundleJs = sourceMapBuilder.Content(); if (!testProj && !Project.NoHtml && Project.ExampleSources.Count > 0) { if (Project.ExampleSources.Count == 1) { BuildFastBundlerIndexHtml( PathUtils.WithoutExtension(PathUtils.Subtract(Project.ExampleSources[0], root)), cssLink); } else { var htmlList = new List <string>(); foreach (var exampleSrc in Project.ExampleSources) { var moduleNameWOExt = PathUtils.WithoutExtension(PathUtils.Subtract(exampleSrc, root)); BuildFastBundlerIndexHtml(moduleNameWOExt, cssLink); var justName = PathUtils.SplitDirAndFile(moduleNameWOExt).Item2; FilesContent[justName + ".html"] = _indexHtml; htmlList.Add(justName); } BuildExampleListHtml(htmlList, cssLink); } } else if (testProj) { BuildFastBundlerTestHtml(Project.TestSources, root, cssLink); } else if (!Project.NoHtml) { BuildFastBundlerIndexHtml(PathUtils.WithoutExtension(PathUtils.Subtract(Project.MainFile, root)), cssLink); } if (testProj) { FilesContent["test.html"] = _indexHtml; FilesContent[_versionDirPrefix + "jasmine-core.js"] = _tools.JasmineCoreJs; FilesContent[_versionDirPrefix + "jasmine-boot.js"] = _tools.JasmineBootJs; FilesContent[_versionDirPrefix + "loader.js"] = _tools.LoaderJs; } else if (!Project.NoHtml) { FilesContent["index.html"] = _indexHtml; FilesContent[_versionDirPrefix + "loader.js"] = _tools.LoaderJs; if (Project.LiveReloadEnabled) { FilesContent[_versionDirPrefix + "liveReload.js"] = _tools.LiveReloadJs.Replace("##Idx##", (Project.LiveReloadIdx + 1).ToString()); } } FilesContent[_versionDirPrefix + PathUtils.WithoutExtension(mapUrl)] = _bundleJs; FilesContent[_versionDirPrefix + mapUrl] = _sourceMapString; BuildResult.SourceMap = _sourceMap; }
public void Build(string sourceRoot, bool testProj = false) { _versionDirPrefix = ""; if (Project.OutputSubDir != null) { _versionDirPrefix = Project.OutputSubDir + "/"; } var root = Project.CommonSourceDirectory; var incremental = BuildResult.Incremental; var start = DateTime.UtcNow; var sourceMapBuilder = new SourceMapBuilder(); if (Project.Localize) { if (!incremental) { sourceMapBuilder.AddText( $"function g11nPath(s){{return\"./{(Project.OutputSubDir != null ? (Project.OutputSubDir + "/") : "")}\"+s.toLowerCase()+\".js\"}};"); if (Project.DefaultLanguage != null) { sourceMapBuilder.AddText($"var g11nLoc=\"{Project.DefaultLanguage}\";"); } } } if (_bundlePng != null && !incremental) { sourceMapBuilder.AddText(GetInitSpriteCode()); } if (!incremental) { sourceMapBuilder.AddText(_tools.LoaderJs); if (Project.Defines != null) { sourceMapBuilder.AddText(GetGlobalDefines()); } sourceMapBuilder.AddText(GetModuleMap()); sourceMapBuilder.AddText(_tools.TsLibSource); } var cssLink = ""; var sortedResultSet = incremental ? BuildResult.RecompiledIncrementaly.OrderBy(f => f.Owner.FullPath).ToArray() : BuildResult.Path2FileInfo.Values.OrderBy(f => f.Owner.FullPath).ToArray(); if (!incremental) { foreach (var source in BuildResult.JavaScriptAssets) { sourceMapBuilder.AddSource(source.Output, source.MapLink); } } foreach (var source in sortedResultSet) { if (source.Type == FileCompilationType.TypeScript || source.Type == FileCompilationType.EsmJavaScript || source.Type == FileCompilationType.JavaScript) { if (source.Output == null) { continue; // Skip d.ts } sourceMapBuilder.AddText( $"R('{PathUtils.Subtract(PathUtils.WithoutExtension(source.Owner.FullPath), root)}',function(require, module, exports, global){{"); var adder = sourceMapBuilder.CreateSourceAdder(source.Output, source.MapLink); var sourceReplacer = new SourceReplacer(); Project.ApplySourceInfo(sourceReplacer, source.SourceInfo, BuildResult); sourceReplacer.Apply(adder); //sourceMapBuilder.AddSource(source.Output, source.MapLink); sourceMapBuilder.AddText("\n});"); } else if (source.Type == FileCompilationType.Json) { sourceMapBuilder.AddText( $"R('{PathUtils.Subtract(source.Owner.FullPath, root)}',"); sourceMapBuilder.AddText(source.Owner.Utf8Content); sourceMapBuilder.AddText(");"); } else if (source.Type == FileCompilationType.ImportedCss) { sourceMapBuilder.AddText( $"R('{PathUtils.Subtract(source.Owner.FullPath, root)}',function(){{}});"); string cssPath = BuildResult.ToOutputUrl(source); FilesContent.GetOrAddValueRef(cssPath) = source.Output; cssLink += "<link rel=\"stylesheet\" href=\"" + cssPath + "\">"; } else if (source.Type == FileCompilationType.Css) { string cssPath = BuildResult.ToOutputUrl(source); FilesContent.GetOrAddValueRef(cssPath) = source.Output; cssLink += "<link rel=\"stylesheet\" href=\"" + cssPath + "\">"; } else if (source.Type == FileCompilationType.Resource) { FilesContent.GetOrAddValueRef(BuildResult.ToOutputUrl(source)) = source.Owner.ByteContent; } } if (Project.SpriteGeneration) { _bundlePng = Project.BundlePngUrl; var bundlePngContent = Project.SpriteGenerator.BuildImage(false); if (bundlePngContent != null) { _bundlePngInfo = new List <float>(); foreach (var slice in bundlePngContent) { FilesContent.GetOrAddValueRef(PathUtils.InjectQuality(_bundlePng, slice.Quality)) = slice.Content; _bundlePngInfo.Add(slice.Quality); } } else { _bundlePng = null; } } if (!testProj && Project.NoHtml) { sourceMapBuilder.AddText(RequireBobril()); sourceMapBuilder.AddText( $"R.r('{PathUtils.WithoutExtension(PathUtils.Subtract(Project.MainFile, root))}');"); } if (Project.Localize) { Project.TranslationDb.BuildTranslationJs(_tools, FilesContent, Project.OutputSubDir); } if (incremental) { sourceMapBuilder.AddText("//# sourceMappingURL=bundle2.js.map"); _sourceMap2 = sourceMapBuilder.Build(root, sourceRoot); _sourceMap2String = _sourceMap2.ToString(); _bundle2Js = sourceMapBuilder.Content(); Project.Owner.Logger.Info("JS Bundle length: " + _bundleJs.Length + " SourceMap length: " + _sourceMapString.Length + " Delta: " + _bundle2Js.Length + " SM:" + _sourceMap2String.Length + " T:" + (DateTime.UtcNow - start).TotalMilliseconds.ToString("F0") + "ms"); } else { sourceMapBuilder.AddText("//# sourceMappingURL=bundle.js.map"); _sourceMap = sourceMapBuilder.Build(root, sourceRoot); _sourceMapString = _sourceMap.ToString(); _bundleJs = sourceMapBuilder.Content(); _sourceMap2 = null; _sourceMap2String = null; _bundle2Js = null; _cssLink = cssLink; Project.Owner.Logger.Info("JS Bundle length: " + _bundleJs.Length + " SourceMap length: " + _sourceMapString.Length + " T:" + (DateTime.UtcNow - start).TotalMilliseconds.ToString("F0") + "ms"); } FilesContent.GetOrAddValueRef(_versionDirPrefix + "bundle.js") = _bundleJs; FilesContent.GetOrAddValueRef(_versionDirPrefix + "bundle.js.map") = _sourceMapString; if (incremental) { FilesContent.GetOrAddValueRef(_versionDirPrefix + "bundle2.js") = _bundle2Js; FilesContent.GetOrAddValueRef(_versionDirPrefix + "bundle2.js.map") = _sourceMap2String; SourceMaps = new Dictionary <string, SourceMap> { { "bundle.js", _sourceMap }, { "bundle2.js", _sourceMap2 } }; } else { SourceMaps = new Dictionary <string, SourceMap> { { "bundle.js", _sourceMap } }; } }
public void Build(string sourceRoot, bool testProj = false, bool allowIncremental = true) { _versionDirPrefix = ""; var coverage = _project.CoverageEnabled; if (coverage) { allowIncremental = false; } if (_mainBuildResult.OutputSubDir != null) { _versionDirPrefix = _mainBuildResult.OutputSubDir + "/"; } var root = _mainBuildResult.CommonSourceDirectory; var incremental = _buildResult.Incremental && allowIncremental; var start = DateTime.UtcNow; var sourceMapBuilder = new SourceMapBuilder(); if (_project.Localize) { if (!incremental) { sourceMapBuilder.AddText( $"function g11nPath(s){{return\"./{_mainBuildResult.OutputSubDirPrefix}\"+s.toLowerCase()+\".js\"}};"); if (_project.DefaultLanguage != null) { sourceMapBuilder.AddText($"var g11nLoc=\"{_project.DefaultLanguage}\";"); } } } if (_project.SpriteGeneration) { _bundlePng = _project.BundlePngUrl; var bundlePngContent = _project.SpriteGenerator.BuildImage(false); if (bundlePngContent != null) { _bundlePngInfo = new List <float>(); foreach (var slice in bundlePngContent) { _mainBuildResult.FilesContent.GetOrAddValueRef( PathUtils.InjectQuality(_bundlePng, slice.Quality)) = slice.Content; _bundlePngInfo.Add(slice.Quality); } } else { _bundlePng = null; } } if (_bundlePng != null && !incremental) { sourceMapBuilder.AddText(_mainBuildResult.GenerateCodeForBobrilBPath(_bundlePng, _bundlePngInfo)); } if (!incremental) { sourceMapBuilder.AddText(_tools.LoaderJs); sourceMapBuilder.AddText(GetGlobalDefines()); sourceMapBuilder.AddText(GetModuleMap()); sourceMapBuilder.AddText(BundlerHelpers.JsHeaders(false)); } var cssLink = ""; var sortedResultSet = incremental ? _buildResult.RecompiledIncrementaly.OrderBy(f => f.Owner.FullPath).ToArray() : _buildResult.Path2FileInfo.Values.OrderBy(f => f.Owner.FullPath).ToArray(); if (!incremental) { foreach (var source in _buildResult.JavaScriptAssets) { sourceMapBuilder.AddSource(source.Output, source.MapLink); } } foreach (var source in sortedResultSet) { if (source.Type == FileCompilationType.TypeScript || source.Type == FileCompilationType.EsmJavaScript || source.Type == FileCompilationType.JavaScript) { if (source.Output == null) { continue; // Skip d.ts } sourceMapBuilder.AddText( $"R('{PathUtils.Subtract(PathUtils.WithoutExtension(source.Owner.FullPath), root)}',function(require, module, exports, global){{"); var adder = sourceMapBuilder.CreateSourceAdder(source.Output, source.MapLink); var sourceReplacer = new SourceReplacer(); _project.ApplySourceInfo(sourceReplacer, source.SourceInfo, _buildResult); sourceReplacer.Apply(adder); sourceMapBuilder.AddText("\n});"); } else if (source.Type == FileCompilationType.Json) { sourceMapBuilder.AddText( $"R('{PathUtils.Subtract(source.Owner.FullPath, root)}',"); sourceMapBuilder.AddText(source.Owner.Utf8Content); sourceMapBuilder.AddText(");"); } else if (source.Type == FileCompilationType.ImportedCss) { sourceMapBuilder.AddText( $"R('{PathUtils.Subtract(source.Owner.FullPath, root)}',function(){{}});"); string cssPath = _buildResult.ToOutputUrl(source); _mainBuildResult.FilesContent.GetOrAddValueRef(cssPath) = source.Output; cssLink += "<link rel=\"stylesheet\" href=\"" + cssPath + "\">"; } else if (source.Type == FileCompilationType.Css) { string cssPath = _buildResult.ToOutputUrl(source); _mainBuildResult.FilesContent.GetOrAddValueRef(cssPath) = source.Output; cssLink += "<link rel=\"stylesheet\" href=\"" + cssPath + "\">"; } else if (source.Type == FileCompilationType.Resource) { _mainBuildResult.FilesContent.GetOrAddValueRef(_buildResult.ToOutputUrl(source)) = source.Owner.ByteContent; } } if (!testProj && _project.NoHtml) { sourceMapBuilder.AddText(RequireBobril()); if (_project.MainFile != null) { sourceMapBuilder.AddText( $"R.r('./{PathUtils.WithoutExtension(PathUtils.Subtract(_project.MainFile, root))}');"); } } if (_project.Localize) { _project.TranslationDb.BuildTranslationJs(_tools, _mainBuildResult.FilesContent, _mainBuildResult.OutputSubDir); } if (incremental) { sourceMapBuilder.AddText("//# sourceMappingURL=bundle2.js.map"); _sourceMap2 = sourceMapBuilder.Build(root, sourceRoot); _sourceMap2String = _sourceMap2.ToString(); _bundle2Js = sourceMapBuilder.Content(); _project.Owner.Logger.Info("JS Bundle length: " + _bundleJs.Length + " SourceMap length: " + _sourceMapString.Length + " Delta: " + _bundle2Js.Length + " SM:" + _sourceMap2String.Length + " T:" + (DateTime.UtcNow - start).TotalMilliseconds.ToString("F0") + "ms"); } else { sourceMapBuilder.AddText("//# sourceMappingURL=" + PathUtils.GetFile(_buildResult.BundleJsUrl) + ".map"); if (coverage) { _sourceMap = sourceMapBuilder.Build(".", "."); _bundleJs = sourceMapBuilder.Content(); var toplevel = Parser.Parse(_bundleJs); _sourceMap.ResolveInAst(toplevel); var coverageInst = new CoverageInstrumentation(); coverageInst.RealPath = PathUtils.RealPath; _project.CoverageInstrumentation = coverageInst; toplevel = coverageInst.Instrument(toplevel); coverageInst.AddCountingHelpers(toplevel); coverageInst.CleanUp(new SourceReader(_project.Owner.DiskCache, _mainBuildResult.CommonSourceDirectory)); if (_project.MainFile != null) { MarkImportant(_project.MainFile, _buildResult, new HashSet <string>(), coverageInst); } sourceMapBuilder = new SourceMapBuilder(); toplevel.PrintToBuilder(sourceMapBuilder, new OutputOptions { Beautify = true }); sourceMapBuilder.AddText("//# sourceMappingURL=" + PathUtils.GetFile(_buildResult.BundleJsUrl) + ".map"); } _sourceMap = sourceMapBuilder.Build(root, sourceRoot); _bundleJs = sourceMapBuilder.Content(); _sourceMapString = _sourceMap.ToString(); _sourceMap2 = null; _sourceMap2String = null; _bundle2Js = null; _cssLink = cssLink; _project.Owner.Logger.Info("JS Bundle length: " + _bundleJs.Length + " SourceMap length: " + _sourceMapString.Length + " T:" + (DateTime.UtcNow - start).TotalMilliseconds.ToString("F0") + "ms"); } _mainBuildResult.FilesContent.GetOrAddValueRef(_buildResult.BundleJsUrl) = _bundleJs; _mainBuildResult.FilesContent.GetOrAddValueRef(_buildResult.BundleJsUrl + ".map") = _sourceMapString; if (incremental) { _mainBuildResult.FilesContent.GetOrAddValueRef(_versionDirPrefix + "bundle2.js") = _bundle2Js; _mainBuildResult.FilesContent.GetOrAddValueRef(_versionDirPrefix + "bundle2.js.map") = _sourceMap2String; SourceMaps = new Dictionary <string, SourceMap> { { PathUtils.GetFile(_buildResult.BundleJsUrl), _sourceMap }, { "bundle2.js", _sourceMap2 } }; } else { SourceMaps = new Dictionary <string, SourceMap> { { PathUtils.GetFile(_buildResult.BundleJsUrl), _sourceMap } }; } if (_project.SubProjects != null) { var newSubBundlers = new RefDictionary <string, FastBundleBundler>(); foreach (var(projPath, subProject) in _project.SubProjects.OrderBy(a => a.Value?.Variant == "serviceworker")) { if (subProject == null) { continue; } if (_subBundlers == null || !_subBundlers.TryGetValue(projPath, out var subBundler)) { subBundler = new FastBundleBundler(_tools, _mainBuildResult, subProject, _buildResult.SubBuildResults.GetOrFakeValueRef(projPath)); } newSubBundlers.GetOrAddValueRef(projPath) = subBundler; subBundler.Build(sourceRoot, false, false); } _subBundlers = newSubBundlers; } else { _subBundlers = null; } }
public void Build(string sourceRoot, bool testProj = false, bool allowIncremental = true) { _versionDirPrefix = ""; var coverage = _project.CoverageEnabled; if (coverage) { allowIncremental = false; } if (_mainBuildResult.OutputSubDir != null) { _versionDirPrefix = _mainBuildResult.OutputSubDir + "/"; } var root = _mainBuildResult.CommonSourceDirectory; var incremental = _buildResult.Incremental && allowIncremental; var start = DateTime.UtcNow; var sourceMapBuilder = new SourceMapBuilder(); if (_project.Localize) { if (!incremental) { sourceMapBuilder.AddText( $"function g11nPath(s){{return\"./{_mainBuildResult.OutputSubDirPrefix}\"+s.toLowerCase()+\".js\"}};"); if (_project.DefaultLanguage != null) { sourceMapBuilder.AddText($"var g11nLoc=\"{_project.DefaultLanguage}\";"); } } } if (_project.SpriteGeneration) { _bundlePng = _project.BundlePngUrl; var bundlePngContent = _project.SpriteGenerator.BuildImage(false); if (bundlePngContent != null) { _bundlePngInfo = new List <float>(); foreach (var slice in bundlePngContent) { _mainBuildResult.FilesContent.GetOrAddValueRef( PathUtils.InjectQuality(_bundlePng, slice.Quality)) = slice.Content; _bundlePngInfo.Add(slice.Quality); } } else { _bundlePng = null; } } if (_bundlePng != null && !incremental) { sourceMapBuilder.AddText(_mainBuildResult.GenerateCodeForBobrilBPath(_bundlePng, _bundlePngInfo)); } if (!incremental) { sourceMapBuilder.AddText(_tools.LoaderJs); sourceMapBuilder.AddText(GetGlobalDefines()); sourceMapBuilder.AddText(GetModuleMap()); sourceMapBuilder.AddText(BundlerHelpers.JsHeaders(false)); } var cssLink = ""; var sortedResultSet = incremental ? _buildResult.RecompiledIncrementally.OrderBy(f => f.Owner.FullPath).ToArray() : _buildResult.Path2FileInfo.Values.OrderBy(f => f.Owner.FullPath).ToArray(); if (!incremental) { foreach (var source in _buildResult.JavaScriptAssets) { sourceMapBuilder.AddSource(source.Output, source.MapLink); } } foreach (var source in sortedResultSet) { if (source.Type is FileCompilationType.TypeScript or FileCompilationType.EsmJavaScript or FileCompilationType.JavaScript) { if (source.Output == null) { continue; // Skip d.ts } var moduleName = source.Owner !.FullPath; if (source.Type is FileCompilationType.TypeScript or FileCompilationType.EsmJavaScript or FileCompilationType.JavaScript) { moduleName = PathUtils.WithoutExtension(moduleName); } sourceMapBuilder.AddText( $"R('{PathUtils.Subtract(moduleName, root!)}',function(require, module, exports, global){{"); var adder = sourceMapBuilder.CreateSourceAdder(source.Output, source.MapLink); var sourceReplacer = new SourceReplacer(); _project.ApplySourceInfo(sourceReplacer, source.SourceInfo, _buildResult); sourceReplacer.Apply(adder); sourceMapBuilder.AddText("\n});"); }