|
1 | | -import { BuildEvent, Builder, BuilderConfiguration, BuilderContext, BuilderDescription } from '@angular-devkit/architect'; |
2 | | -import { NormalizedBrowserBuilderSchema } from '@angular-devkit/build-angular/src/browser/schema'; |
3 | | -import { DevServerBuilder, DevServerBuilderOptions } from '@angular-devkit/build-angular/src/dev-server'; |
4 | | -import { Path, virtualFs } from '@angular-devkit/core'; |
5 | | -import * as fs from 'fs'; |
6 | | -import { Observable, from, of } from 'rxjs'; |
7 | | -import { concatMap, tap } from 'rxjs/operators'; |
| 1 | +import { BuilderContext, BuilderOutput, createBuilder, targetFromTargetString } from '@angular-devkit/architect'; |
| 2 | +import { json } from '@angular-devkit/core'; |
8 | 3 |
|
9 | | -import { CordovaBuildBuilder, CordovaBuildBuilderSchema } from '../cordova-build'; |
| 4 | +import { prepareBrowserConfig } from '../utils'; |
10 | 5 |
|
11 | 6 | import { createConsoleLogServer } from './log-server'; |
12 | 7 | import { CordovaServeBuilderSchema } from './schema'; |
13 | 8 |
|
14 | | -export class CordovaServeBuilder implements Builder<CordovaServeBuilderSchema> { |
15 | | - constructor(public context: BuilderContext) {} |
| 9 | +export type CordovaDevServerBuilderOptions = CordovaServeBuilderSchema & json.JsonObject; |
16 | 10 |
|
17 | | - run(builderConfig: BuilderConfiguration<CordovaServeBuilderSchema>): Observable<BuildEvent> { |
18 | | - const { options: cordovaServeOptions } = builderConfig; |
19 | | - const { devServerTarget, port, host, ssl } = cordovaServeOptions; |
20 | | - const [ project, target, configuration ] = devServerTarget.split(':'); |
| 11 | +export async function serveCordova( |
| 12 | + options: CordovaServeBuilderSchema, |
| 13 | + context: BuilderContext |
| 14 | +): Promise<BuilderOutput> { |
| 15 | + return new Promise(async () => { |
| 16 | + context.reportStatus(`running cordova serve...`); |
| 17 | + const { devServerTarget, cordovaBuildTarget, port, host, ssl } = options; |
21 | 18 |
|
22 | | - const devServerTargetSpec = { project, target, configuration, overrides: { port, host, ssl } }; |
23 | | - const devServerBuilderConfig = this.context.architect.getBuilderConfiguration<DevServerBuilderOptions>(devServerTargetSpec); |
| 19 | + // Getting the original browser build options |
| 20 | + const cordovaBuildTargetSpec = targetFromTargetString(cordovaBuildTarget); |
| 21 | + const cordovaBuildTargetOptions = await context.getTargetOptions(cordovaBuildTargetSpec) as { browserTarget: string }; |
| 22 | + const browserBuildTargetSpec = targetFromTargetString(cordovaBuildTargetOptions.browserTarget); |
24 | 23 |
|
25 | | - let devServerDescription: BuilderDescription; |
26 | | - let cordovaBuildConfig: BuilderConfiguration<CordovaBuildBuilderSchema>; |
| 24 | + // What we actually need.... |
| 25 | + const browserBuildTargetOptions = await context.getTargetOptions(browserBuildTargetSpec); |
27 | 26 |
|
28 | | - return of(null).pipe( |
29 | | - concatMap(() => this.context.architect.getBuilderDescription(devServerBuilderConfig)), |
30 | | - tap(description => devServerDescription = description), |
31 | | - concatMap(() => this.context.architect.validateBuilderOptions(devServerBuilderConfig, devServerDescription)), |
32 | | - concatMap(() => this._getCordovaBuildConfig(cordovaServeOptions)), |
33 | | - tap(config => cordovaBuildConfig = config), |
34 | | - concatMap(() => of(new CordovaDevServerBuilder(this.context, cordovaBuildConfig.options))), |
35 | | - concatMap(builder => builder.run(devServerBuilderConfig)) |
36 | | - ); |
37 | | - } |
| 27 | + // Modifying those options to pass in cordova-speicfic stuff |
| 28 | + prepareBrowserConfig(options, browserBuildTargetOptions); |
38 | 29 |
|
39 | | - protected _getCordovaBuildConfig(cordovaServeOptions: CordovaServeBuilderSchema): Observable<BuilderConfiguration<CordovaBuildBuilderSchema>> { |
40 | | - const { |
41 | | - platform, |
42 | | - cordovaBasePath, |
43 | | - cordovaAssets, |
44 | | - cordovaMock, |
45 | | - consolelogs, |
46 | | - consolelogsPort, |
47 | | - sourceMap, |
48 | | - } = cordovaServeOptions; |
49 | | - |
50 | | - const [ project, target, configuration ] = cordovaServeOptions.cordovaBuildTarget.split(':'); |
51 | | - const cordovaBuildTargetSpec = { project, target, configuration, overrides: { platform, cordovaBasePath, cordovaAssets, cordovaMock, consolelogs, consolelogsPort, sourceMap } }; |
52 | | - const cordovaBuildTargetConfig = this.context.architect.getBuilderConfiguration<CordovaBuildBuilderSchema>(cordovaBuildTargetSpec); |
53 | | - |
54 | | - return this.context.architect.getBuilderDescription(cordovaBuildTargetConfig).pipe( |
55 | | - concatMap(cordovaBuildDescription => this.context.architect.validateBuilderOptions(cordovaBuildTargetConfig, cordovaBuildDescription)) |
56 | | - ); |
57 | | - } |
58 | | -} |
59 | | - |
60 | | -class CordovaDevServerBuilder extends DevServerBuilder { |
61 | | - constructor(context: BuilderContext, public cordovaBuildOptions: CordovaBuildBuilderSchema) { |
62 | | - super(context); |
63 | | - } |
64 | | - |
65 | | - run(builderConfig: BuilderConfiguration<DevServerBuilderOptions>): Observable<BuildEvent> { |
66 | | - if (this.cordovaBuildOptions.consolelogs && this.cordovaBuildOptions.consolelogsPort) { |
67 | | - return from(createConsoleLogServer(builderConfig.options.host, this.cordovaBuildOptions.consolelogsPort)) |
68 | | - .pipe(_ => super.run(builderConfig)); |
| 30 | + if (options.consolelogs && options.consolelogsPort) { |
| 31 | + await createConsoleLogServer(host, options.consolelogsPort); |
69 | 32 | } |
70 | | - return super.run(builderConfig); |
71 | | - } |
72 | 33 |
|
73 | | - buildWebpackConfig(root: Path, projectRoot: Path, host: virtualFs.Host<fs.Stats>, browserOptions: NormalizedBrowserBuilderSchema) { |
74 | | - const builder = new CordovaBuildBuilder(this.context); |
75 | | - builder.validateBuilderConfig(this.cordovaBuildOptions); |
76 | | - builder.prepareBrowserConfig(this.cordovaBuildOptions, browserOptions); |
| 34 | + const devServerTargetSpec = targetFromTargetString(devServerTarget); |
| 35 | + const devServerTargetOptions = await context.getTargetOptions(devServerTargetSpec); |
77 | 36 |
|
78 | | - return super.buildWebpackConfig(root, projectRoot, host, browserOptions); |
79 | | - } |
| 37 | + return context |
| 38 | + .scheduleTarget(devServerTargetSpec, { host, port, ssl }, devServerTargetOptions) |
| 39 | + .then(buildEvent => ({ ...buildEvent })); |
| 40 | + }); |
80 | 41 | } |
81 | | - |
82 | | -export default CordovaServeBuilder; |
| 42 | +export default createBuilder<CordovaDevServerBuilderOptions, any>(serveCordova); |
0 commit comments