|
8 | 8 |
|
9 | 9 | import { BuilderContext, BuilderOutput, createBuilder, targetFromTargetString } from '@angular-devkit/architect';
|
10 | 10 | import { BrowserBuilderOptions } from '@angular-devkit/build-angular';
|
| 11 | +import { augmentAppWithServiceWorker } from '@angular-devkit/build-angular/src/utils/service-worker'; |
| 12 | +import { normalize, resolve as resolvePath } from '@angular-devkit/core'; |
| 13 | +import { NodeJsSyncHost } from '@angular-devkit/core/node'; |
11 | 14 | import { fork } from 'child_process';
|
12 | 15 | import * as fs from 'fs';
|
13 | 16 | import * as ora from 'ora';
|
@@ -109,6 +112,19 @@ async function _renderUniversal(
|
109 | 112 | browserOptions: BrowserBuilderOptions,
|
110 | 113 | numProcesses?: number,
|
111 | 114 | ): Promise<PrerenderBuilderOutput> {
|
| 115 | + const host = new NodeJsSyncHost(); |
| 116 | + const projectName = context.target && context.target.project; |
| 117 | + if (!projectName) { |
| 118 | + throw new Error('The builder requires a target.'); |
| 119 | + } |
| 120 | + |
| 121 | + const root = normalize(context.workspaceRoot); |
| 122 | + const projectMetadata = await context.getProjectMetadata(projectName); |
| 123 | + const projectRoot = resolvePath( |
| 124 | + root, |
| 125 | + normalize((projectMetadata.root as string) || ''), |
| 126 | + ); |
| 127 | + |
112 | 128 | // Users can specify a different base html file e.g. "src/home.html"
|
113 | 129 | const indexFile = getIndexOutputFile(browserOptions);
|
114 | 130 | // We need to render the routes for each locale from the browser output.
|
@@ -142,6 +158,26 @@ async function _renderUniversal(
|
142 | 158 | }
|
143 | 159 |
|
144 | 160 | spinner.succeed(`Prerendering routes to ${outputPath} complete.`);
|
| 161 | + |
| 162 | + if (browserOptions.serviceWorker) { |
| 163 | + spinner.start('Generating service worker...'); |
| 164 | + try { |
| 165 | + await augmentAppWithServiceWorker( |
| 166 | + host, |
| 167 | + root, |
| 168 | + projectRoot, |
| 169 | + normalize(outputPath), |
| 170 | + browserOptions.baseHref || '/', |
| 171 | + browserOptions.ngswConfigPath, |
| 172 | + ); |
| 173 | + } catch (error) { |
| 174 | + spinner.fail('Service worker generation failed.'); |
| 175 | + |
| 176 | + return { success: false, error: error.message }; |
| 177 | + } |
| 178 | + |
| 179 | + spinner.succeed('Service worker generation complete.'); |
| 180 | + } |
145 | 181 | }
|
146 | 182 |
|
147 | 183 | return browserResult;
|
|
0 commit comments