// Builds a project to the provided file system, package, etc public async Task <BuildResult> BuildAsync() { var ct = new CancellationTokenSource(); var sw = Stopwatch.StartNew(); bool compiledTs = false; foreach (var file in package) { var format = FormatHelper.GetFormat(file); if (format == "scss") { using (var compiledCss = await CompileCssAsync(file).ConfigureAwait(false)) { var compiledName = file.Key.Replace(".scss", ".css"); if (compiledCss == null) { log.Info($"Skipped '{compiledName}' (is partial)"); continue; } log.Info($"Compiled '{compiledName}'"); var blob = new Blob(compiledName, compiledCss, new BlobProperties { ContentType = "text/css" }); await bucket.PutAsync(blob).ConfigureAwait(false); } } else if (format == "ts") { if (!compiledTs) { log.Info("Building TypeScript"); // This will copy over the typescript files await tsProject.BuildAsync(ct.Token).ConfigureAwait(false); compiledTs = true; } var compiledName = file.Key.Replace(".ts", ".js"); var outputPath = basePath + compiledName; var fileStream = File.Open(outputPath, FileMode.Open, FileAccess.Read); var blob = new Blob(compiledName, fileStream, new BlobProperties { ContentType = "application/javascript" }); log.Info($"Compiled '{compiledName}'"); await bucket.PutAsync(blob).ConfigureAwait(false); } else if (FormatHelper.IsStaticFormat(format)) { var blob = new Blob( key: file.Key, stream: await file.ToMemoryStreamAsync().ConfigureAwait(false) ); // include content type? await bucket.PutAsync(blob).ConfigureAwait(false); } } return(new BuildResult(BuildStatus.Completed, sw.Elapsed)); }
public async Task <WebLibrary> DeployAsync(IPackage package, RevisionSource source, int publisherId) { #region Preconditions if (package == null) { throw new ArgumentNullException(nameof(package)); } #endregion var metadata = GetMetadata(package); var version = metadata.Version; // var existing = await registry.GetAsync(registry.Lookup(metadata.Name), metadata.Version); // if (existing != null) throw new PublishingConflict(existing); var mainPath = metadata.Main; var bowerFile = package.Find("bower.json"); if (bowerFile != null) { try { var bowerFileStream = await bowerFile.OpenAsync().ConfigureAwait(false); var bower = PackageMetadata.Parse(bowerFileStream); if (bower.Main != null) { mainPath = bower.Main; } } catch { } } if (mainPath == null) { throw new Exception("A main property found in package.json or bower.json."); } var mainFile = package.Find(mainPath); if (mainFile == null) { throw new Exception($"The main file '{mainPath}' was not found"); } var mainText = await mainFile.ReadAllTextAsync().ConfigureAwait(false); if (mainText.Length == 0) { throw new Exception($"{mainPath} is empty"); } var mainBlobStream = new MemoryStream(Encoding.UTF8.GetBytes(mainText)); var mainName = mainPath.Split('/').Last(); if (!mainName.EndsWith(".js")) { throw new Exception($"Must end with js. was {mainName}"); } var mainBlob = new Blob( key: $"libs/{metadata.Name}/{version}/{mainName}", stream: mainBlobStream, properties: new BlobProperties { ContentType = "application/javascript" } ); var mainHash = Hash.ComputeSHA256(mainBlobStream); // Push to CDN await bucket.PutAsync(mainBlob).ConfigureAwait(false); if (metadata.Files != null) { // TODO: Copy over everything from files[] (excluding main) foreach (var fileName in metadata.Files) { var fn = fileName; if (fn.StartsWith("./")) { fn = fileName.Substring(2); } if (fn == mainPath) { continue; } var asset = package.Find(fn); var format = asset.Key.Split('.').Last(); var n = asset.Key.Split('/').Last(); var ms = new MemoryStream(); using (var data = await asset.OpenAsync().ConfigureAwait(false)) { data.CopyTo(ms); ms.Position = 0; } var blob = new Blob( key: $"libs/{metadata.Name}/{version}/{n}", stream: ms, properties: new BlobProperties { ContentType = GetMime(format) } ); await bucket.PutAsync(blob).ConfigureAwait(false); } } var release = new WebLibrary(metadata.Name, version) { MainName = mainName, MainSha256 = mainHash, Source = source.ToString() }; return(release); }