diff --git a/packages/core/core/src/ReporterRunner.js b/packages/core/core/src/ReporterRunner.js index 9b07912bb7e..a4887b98e6e 100644 --- a/packages/core/core/src/ReporterRunner.js +++ b/packages/core/core/src/ReporterRunner.js @@ -28,6 +28,8 @@ type Opts = {| workerFarm: WorkerFarm, |}; +const instances: Set = new Set(); + export default class ReporterRunner { workerFarm: WorkerFarm; config: ParcelConfig; @@ -44,6 +46,7 @@ export default class ReporterRunner { logger.onLog(event => this.report(event)); bus.on('reporterEvent', this.eventHandler); + instances.add(this); if (this.options.shouldPatchConsole) { patchConsole(); @@ -107,6 +110,7 @@ export default class ReporterRunner { dispose() { bus.off('reporterEvent', this.eventHandler); + instances.delete(this); } } @@ -130,6 +134,6 @@ export function reportWorker(workerApi: WorkerApi, event: ReporterEvent) { bus.emit('reporterEvent', event); } -export function report(event: ReporterEvent) { - bus.emit('reporterEvent', event); +export async function report(event: ReporterEvent): Promise { + await Promise.all([...instances].map(instance => instance.report(event))); } diff --git a/packages/core/core/src/requests/ParcelBuildRequest.js b/packages/core/core/src/requests/ParcelBuildRequest.js index f6ffe91676d..bf1fa9a80ad 100644 --- a/packages/core/core/src/requests/ParcelBuildRequest.js +++ b/packages/core/core/src/requests/ParcelBuildRequest.js @@ -14,6 +14,10 @@ import createWriteBundlesRequest from './WriteBundlesRequest'; import {assertSignalNotAborted} from '../utils'; import dumpGraphToGraphViz from '../dumpGraphToGraphViz'; import {bundleGraphEdgeTypes} from '../BundleGraph'; +import {report} from '../ReporterRunner'; +import IBundleGraph from '../public/BundleGraph'; +import {NamedBundle} from '../public/Bundle'; +import {assetFromValue} from '../public/Asset'; type ParcelBuildRequestInput = {| optionsRef: SharedReference, @@ -68,6 +72,23 @@ async function run({input, api, options}: RunInput) { // $FlowFixMe Added in Flow 0.121.0 upgrade in #4381 (Windows only) dumpGraphToGraphViz(bundleGraph._graph, 'BundleGraph', bundleGraphEdgeTypes); + await report({ + type: 'buildProgress', + phase: 'bundled', + bundleGraph: new IBundleGraph( + bundleGraph, + (bundle, bundleGraph, options) => + NamedBundle.get(bundle, bundleGraph, options), + options, + ), + changedAssets: new Map( + Array.from(changedAssets).map(([id, asset]) => [ + id, + assetFromValue(asset, options), + ]), + ), + }); + let writeBundlesRequest = createWriteBundlesRequest({ bundleGraph, optionsRef, diff --git a/packages/core/core/src/types.js b/packages/core/core/src/types.js index 474ae5ba9cf..64b43c26c5b 100644 --- a/packages/core/core/src/types.js +++ b/packages/core/core/src/types.js @@ -529,4 +529,4 @@ export type ValidationOpts = {| configCachePath: string, |}; -export type ReportFn = (event: ReporterEvent) => void; +export type ReportFn = (event: ReporterEvent) => void | Promise; diff --git a/packages/core/types/index.js b/packages/core/types/index.js index b33e362d816..fdf87c57816 100644 --- a/packages/core/types/index.js +++ b/packages/core/types/index.js @@ -1765,6 +1765,13 @@ export type BundlingProgressEvent = {| +phase: 'bundling', |}; +export type BundledProgressEvent = {| + +type: 'buildProgress', + +phase: 'bundled', + +bundleGraph: BundleGraph, + +changedAssets: Map, +|}; + /** * A new Bundle is being packaged. * @section reporter @@ -1792,6 +1799,7 @@ export type BuildProgressEvent = | ResolvingProgressEvent | TransformingProgressEvent | BundlingProgressEvent + | BundledProgressEvent | PackagingProgressEvent | OptimizingProgressEvent; diff --git a/packages/reporters/dev-server/src/HMRServer.js b/packages/reporters/dev-server/src/HMRServer.js index 94c296aee7e..de9528df5e3 100644 --- a/packages/reporters/dev-server/src/HMRServer.js +++ b/packages/reporters/dev-server/src/HMRServer.js @@ -1,12 +1,12 @@ // @flow import type { - BuildSuccessEvent, - Dependency, - PluginOptions, + Asset, BundleGraph, + Dependency, + NamedBundle, PackagedBundle, - Asset, + PluginOptions, } from '@parcel/types'; import type {Diagnostic} from '@parcel/diagnostic'; import type {AnsiDiagnosticResult} from '@parcel/utils'; @@ -60,7 +60,8 @@ export default class HMRServer { wss: WebSocket.Server; unresolvedError: HMRMessage | null = null; options: HMRServerOptions; - bundleGraph: BundleGraph | null = null; + bundleGraph: BundleGraph | BundleGraph | null = + null; stopServer: ?() => Promise; constructor(options: HMRServerOptions) { @@ -149,7 +150,11 @@ export default class HMRServer { this.broadcast(this.unresolvedError); } - async emitUpdate(event: BuildSuccessEvent) { + async emitUpdate(event: { + +bundleGraph: BundleGraph | BundleGraph, + +changedAssets: Map, + ... + }) { this.unresolvedError = null; this.bundleGraph = event.bundleGraph; diff --git a/packages/reporters/dev-server/src/ServerReporter.js b/packages/reporters/dev-server/src/ServerReporter.js index 1d436f084c3..7809e11829c 100644 --- a/packages/reporters/dev-server/src/ServerReporter.js +++ b/packages/reporters/dev-server/src/ServerReporter.js @@ -89,6 +89,11 @@ export default (new Reporter({ server.buildStart(); } break; + case 'buildProgress': + if (event.phase === 'bundled' && hmrServer) { + await hmrServer.emitUpdate(event); + } + break; case 'buildSuccess': if (serveOptions) { if (!server) { @@ -100,9 +105,6 @@ export default (new Reporter({ server.buildSuccess(event.bundleGraph, event.requestBundle); } - if (hmrServer) { - hmrServer.emitUpdate(event); - } break; case 'buildFailure': // On buildFailure watchStart sometimes has not been called yet