Skip to content

Commit

Permalink
refactor(@angular-devkit/build-angular): remove RxJs usage from `writ…
Browse files Browse the repository at this point in the history
…eIndexHtml`
  • Loading branch information
alan-agius4 authored and filipesilva committed Oct 9, 2020
1 parent 4a746f5 commit 84b63e5
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 74 deletions.
54 changes: 14 additions & 40 deletions packages/angular_devkit/build_angular/src/browser/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
*/
import { BuilderContext, BuilderOutput, createBuilder } from '@angular-devkit/architect';
import { EmittedFiles, WebpackLoggingCallback, runWebpack } from '@angular-devkit/build-webpack';
import { getSystemPath, join, json, normalize, resolve, tags, virtualFs } from '@angular-devkit/core';
import { getSystemPath, json, normalize, resolve, tags, virtualFs } from '@angular-devkit/core';
import { NodeJsSyncHost } from '@angular-devkit/core/node';
import * as fs from 'fs';
import * as ora from 'ora';
Expand Down Expand Up @@ -726,18 +726,23 @@ export function buildWebpackBrowser(

try {
if (options.index) {
await generateIndex(
outputPath,
options,
root,
await writeIndexHtml({
host,
outputPath: path.join(outputPath, getIndexOutputFile(options)),
indexPath: path.join(context.workspaceRoot, getIndexInputFile(options)),
files,
noModuleFiles,
moduleFiles,
transforms.indexHtml,
baseHref: localeBaseHref || options.baseHref,
deployUrl: options.deployUrl,
sri: options.subresourceIntegrity,
scripts: options.scripts,
styles: options.styles,
postTransform: transforms.indexHtml,
crossOrigin: options.crossOrigin,
// i18nLocale is used when Ivy is disabled
locale || options.i18nLocale,
localeBaseHref || options.baseHref,
);
lang: locale || options.i18nLocale,
});
}

if (options.serviceWorker) {
Expand Down Expand Up @@ -772,37 +777,6 @@ export function buildWebpackBrowser(
);
}

function generateIndex(
baseOutputPath: string,
options: BrowserBuilderSchema,
root: string,
files: EmittedFiles[] | undefined,
noModuleFiles: EmittedFiles[] | undefined,
moduleFiles: EmittedFiles[] | undefined,
transformer?: IndexHtmlTransform,
locale?: string,
baseHref?: string,
): Promise<void> {
const host = new NodeJsSyncHost();

return writeIndexHtml({
host,
outputPath: join(normalize(baseOutputPath), getIndexOutputFile(options)),
indexPath: join(normalize(root), getIndexInputFile(options)),
files,
noModuleFiles,
moduleFiles,
baseHref,
deployUrl: options.deployUrl,
sri: options.subresourceIntegrity,
scripts: options.scripts,
styles: options.styles,
postTransform: transformer,
crossOrigin: options.crossOrigin,
lang: locale,
}).toPromise();
}

function mapErrorToMessage(error: unknown): string | undefined {
if (error instanceof Error) {
return error.message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@
*/

import { EmittedFiles } from '@angular-devkit/build-webpack';
import { Path, dirname, getSystemPath, join, virtualFs } from '@angular-devkit/core';
import { Observable, of } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
import { normalize, virtualFs } from '@angular-devkit/core';
import { dirname, join } from 'path';
import { ExtraEntryPoint } from '../../browser/schema';
import { generateEntryPoints } from '../package-chunk-sort';
import { stripBom } from '../strip-bom';
Expand All @@ -19,8 +18,8 @@ type ExtensionFilter = '.js' | '.css';

export interface WriteIndexHtmlOptions {
host: virtualFs.Host;
outputPath: Path;
indexPath: Path;
outputPath: string;
indexPath: string;
files?: EmittedFiles[];
noModuleFiles?: EmittedFiles[];
moduleFiles?: EmittedFiles[];
Expand All @@ -36,7 +35,7 @@ export interface WriteIndexHtmlOptions {

export type IndexHtmlTransform = (content: string) => Promise<string>;

export function writeIndexHtml({
export async function writeIndexHtml({
host,
outputPath,
indexPath,
Expand All @@ -51,34 +50,30 @@ export function writeIndexHtml({
postTransform,
crossOrigin,
lang,
}: WriteIndexHtmlOptions): Observable<void> {
return host.read(indexPath).pipe(
map(content => stripBom(virtualFs.fileBufferToString(content))),
switchMap(content =>
augmentIndexHtml({
input: getSystemPath(outputPath),
inputContent: content,
baseHref,
deployUrl,
crossOrigin,
sri,
entrypoints: generateEntryPoints({ scripts, styles }),
files: filterAndMapBuildFiles(files, ['.js', '.css']),
noModuleFiles: filterAndMapBuildFiles(noModuleFiles, '.js'),
moduleFiles: filterAndMapBuildFiles(moduleFiles, '.js'),
loadOutputFile: async filePath => {
return host
.read(join(dirname(outputPath), filePath))
.pipe(map(data => virtualFs.fileBufferToString(data)))
.toPromise();
},
lang: lang,
}),
),
switchMap(content => (postTransform ? postTransform(content) : of(content))),
map(content => virtualFs.stringToFileBuffer(content)),
switchMap(content => host.write(outputPath, content)),
);
}: WriteIndexHtmlOptions): Promise<void> {
const readFile = async (filePath: string) =>
virtualFs.fileBufferToString(await host.read(normalize(filePath)).toPromise());

let content = await augmentIndexHtml({
input: outputPath,
inputContent: stripBom(await readFile(indexPath)),
baseHref,
deployUrl,
crossOrigin,
sri,
lang,
entrypoints: generateEntryPoints({ scripts, styles }),
files: filterAndMapBuildFiles(files, ['.js', '.css']),
noModuleFiles: filterAndMapBuildFiles(noModuleFiles, '.js'),
moduleFiles: filterAndMapBuildFiles(moduleFiles, '.js'),
loadOutputFile: filePath => readFile(join(dirname(outputPath), filePath)),
});

if (postTransform) {
content = await postTransform(content);
}

await host.write(normalize(outputPath), virtualFs.stringToFileBuffer(content)).toPromise();
}

function filterAndMapBuildFiles(
Expand Down

0 comments on commit 84b63e5

Please sign in to comment.