Skip to content
This repository was archived by the owner on Aug 7, 2021. It is now read-only.

Commit 4215f89

Browse files
committed
* Introduce new "before-preview-sync" hook
* Add event handler for "liveSyncStopped" event * Persist webpack process per platform Implements: #457
1 parent 0069177 commit 4215f89

6 files changed

+93
-39
lines changed

Diff for: lib/after-watch.js

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
const compiler = require('./compiler');
1+
const { stopWebpackCompiler } = require('./compiler');
2+
23
module.exports = function($logger) {
3-
const webpackProcess = compiler.getWebpackProcess();
4-
if (webpackProcess) {
5-
$logger.info("Stopping webpack watch");
6-
webpackProcess.kill("SIGINT");
7-
}
4+
$logger.info("Stopping webpack watch");
5+
stopWebpackCompiler();
86
}

Diff for: lib/before-cleanApp.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
const { cleanSnapshotArtefacts } = require("../snapshot/android/project-snapshot-generator");
22
const { isAndroid } = require("../projectHelpers");
3-
const { getWebpackProcess } = require("./compiler");
3+
const { getWebpackProcesses } = require("./compiler");
44

55
module.exports = function (hookArgs) {
66
return (args, originalMethod) => {
7-
const webpackProcess = getWebpackProcess();
8-
const promise = webpackProcess ? Promise.resolve() : originalMethod(...args);
7+
const platform = hookArgs.platformInfo.platform;
8+
const webpackProcesses = getWebpackProcesses();
9+
const promise = webpackProcesses[platform] ? Promise.resolve() : originalMethod(...args);
910
return promise.then(() => {
10-
if (isAndroid(hookArgs.platformInfo.platform)) {
11+
if (isAndroid(platform)) {
1112
cleanSnapshotArtefacts(hookArgs.platformInfo.projectData.projectDir);
1213
}
1314
});

Diff for: lib/before-preview-sync.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const { runWebpackCompiler } = require("./compiler");
2+
3+
module.exports = function($logger, $liveSyncService, hookArgs) {
4+
const { config } = hookArgs;
5+
const bundle = config && config.appFilesUpdaterOptions && config.appFilesUpdaterOptions.bundle;
6+
if (bundle) {
7+
const env = config.env || {};
8+
const platform = config.platform;
9+
const release = config && config.appFilesUpdaterOptions && config.appFilesUpdaterOptions.release;
10+
const compilerConfig = {
11+
env,
12+
platform,
13+
bundle,
14+
release,
15+
watch: true
16+
};
17+
18+
return runWebpackCompiler(compilerConfig, hookArgs.projectData, $logger, $liveSyncService, hookArgs);
19+
}
20+
}
21+

Diff for: lib/before-watch.js

+30-20
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,33 @@
1-
const { runWebpackCompiler } = require("./compiler");
1+
const { getWebpackProcesses, runWebpackCompiler, stopWebpackCompiler } = require("./compiler");
22

3-
module.exports = function ($logger, $liveSyncService, $options, hookArgs) {
4-
if (hookArgs.config) {
5-
const appFilesUpdaterOptions = hookArgs.config.appFilesUpdaterOptions;
6-
if (appFilesUpdaterOptions.bundle) {
7-
const platforms = hookArgs.config.platforms;
8-
return Promise.all(platforms.map(platform => {
9-
const env = hookArgs.config.env || {};
10-
env.hmr = !!$options.hmr;
11-
const config = {
12-
env,
13-
platform,
14-
bundle: appFilesUpdaterOptions.bundle,
15-
release: appFilesUpdaterOptions.release,
16-
watch: true
17-
};
3+
module.exports = function ($logger, $liveSyncService, $options, $devicesService, hookArgs) {
4+
if (hookArgs.config) {
5+
const appFilesUpdaterOptions = hookArgs.config.appFilesUpdaterOptions;
6+
if (appFilesUpdaterOptions.bundle) {
7+
$liveSyncService.on("liveSyncStopped", data => {
8+
const webpackProcesses = getWebpackProcesses();
9+
Object.keys(webpackProcesses).forEach(platform => {
10+
const devices = $devicesService.getDevicesForPlatform(platform);
11+
if (!devices || !devices.length) {
12+
stopWebpackCompiler(platform);
13+
}
14+
});
15+
});
1816

19-
return runWebpackCompiler(config, hookArgs.projectData, $logger, $liveSyncService, hookArgs);
20-
}));
21-
}
22-
}
17+
const platforms = hookArgs.config.platforms;
18+
return Promise.all(platforms.map(platform => {
19+
const env = hookArgs.config.env || {};
20+
env.hmr = !!$options.hmr;
21+
const config = {
22+
env,
23+
platform,
24+
bundle: appFilesUpdaterOptions.bundle,
25+
release: appFilesUpdaterOptions.release,
26+
watch: true
27+
};
28+
29+
return runWebpackCompiler(config, hookArgs.projectData, $logger, $liveSyncService, hookArgs);
30+
}));
31+
}
32+
}
2333
}

Diff for: lib/compiler.js

+28-9
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,17 @@ const { buildEnvData, debuggingEnabled } = require("./utils");
99

1010
let hasBeenInvoked = false;
1111

12-
let webpackProcess = null;
12+
let webpackProcesses = {};
1313
let hasLoggedSnapshotWarningMessage = false;
1414

15-
exports.getWebpackProcess = function getWebpackProcess() {
16-
return webpackProcess;
15+
exports.getWebpackProcesses = function getWebpackProcess() {
16+
return webpackProcesses;
1717
}
1818

1919
exports.runWebpackCompiler = function runWebpackCompiler(config, $projectData, $logger, $liveSyncService, hookArgs) {
2020
if (config.bundle) {
2121
return new Promise(function (resolveBase, rejectBase) {
22-
if (webpackProcess) {
22+
if (webpackProcesses[config.platform]) {
2323
return resolveBase();
2424
}
2525

@@ -77,22 +77,27 @@ exports.runWebpackCompiler = function runWebpackCompiler(config, $projectData, $
7777

7878
if (hookArgs.filesToSync && hookArgs.startSyncFilesTimeout) {
7979
hookArgs.filesToSync.push(...message.emittedFiles);
80-
hookArgs.startSyncFilesTimeout();
80+
hookArgs.startSyncFilesTimeout(platform);
81+
}
82+
83+
if (hookArgs.filesToSyncMap && hookArgs.startSyncFilesTimeout) {
84+
hookArgs.filesToSyncMap[platform] = message.emittedFiles;
85+
hookArgs.startSyncFilesTimeout(platform);
8186
}
8287
}
8388
}
8489

8590
if (config.watch) {
8691
childProcess.on("message", resolveOnWebpackCompilationComplete);
87-
if (webpackProcess) {
92+
if (webpackProcesses[platform]) {
8893
throw new Error("Webpack process already spawned.");
8994
}
90-
webpackProcess = childProcess;
95+
webpackProcesses[platform] = childProcess;
9196
}
9297

9398
childProcess.on("close", code => {
94-
if (webpackProcess == childProcess) {
95-
webpackProcess = null;
99+
if (webpackProcesses[platform] === childProcess) {
100+
delete webpackProcesses[platform];
96101
}
97102
if (code === 0) {
98103
resolve();
@@ -106,6 +111,14 @@ exports.runWebpackCompiler = function runWebpackCompiler(config, $projectData, $
106111
}
107112
}
108113

114+
exports.stopWebpackCompiler = function stopWebpackCompiler(platform) {
115+
if (platform) {
116+
stopWebpackForPlatform(platform);
117+
} else {
118+
Object.keys(webpackProcesses).forEach(platform => stopWebpackForPlatform(platform));
119+
}
120+
}
121+
109122
function buildEnvCommandLineParams(config, envData, $logger) {
110123
const envFlagNames = Object.keys(envData);
111124
const snapshotEnvIndex = envFlagNames.indexOf("snapshot");
@@ -136,3 +149,9 @@ function logSnapshotWarningMessage($logger) {
136149
}
137150
}
138151

152+
function stopWebpackForPlatform(platform) {
153+
const webpackProcess = webpackProcesses[platform];
154+
webpackProcess.kill("SIGINT");
155+
delete webpackProcesses[platform];
156+
}
157+

Diff for: package.json

+5
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@
4444
"type": "after-prepare",
4545
"script": "lib/after-prepare.js",
4646
"inject": true
47+
},
48+
{
49+
"type": "before-preview-sync",
50+
"script": "lib/before-preview-sync",
51+
"inject": true
4752
}
4853
]
4954
},

0 commit comments

Comments
 (0)