This pull request is trying to add wasm32-wasi target support for the nx/native To test the build, you can run the following commands: - `rustup target add wasm32-wasip1-threads` - `pnpm exec napi build --release --platform --package-json-path packages/nx/package.json --manifest-path packages/nx/Cargo.toml --js ./native-bindings.js -o packages/nx/src/native --target wasm32-wasip1-threads` And the wasm file will be built at packages/nx/src/native/nx.wasm32-wasi.wasm Blocked by: - Support @napi-rs/cli 3.0 Cammisuli/monodon#48 - https://github.com/napi-rs/napi-rs/issues/2009 The pseudo_terminal mod is excluded on the wasm32 targets, which is as expected. The watch mod is excluded because of the upstream `watchexec` deps introduced by ignore-files don't support the wasi target at this moment (but we can improve it). ## Related Issues Fixes https://github.com/nrwl/nx/issues/21860 Fixes https://github.com/nrwl/nx/issues/23821 --------- Co-authored-by: FrozenPandaz <jasonjean1993@gmail.com>
104 lines
2.9 KiB
TypeScript
104 lines
2.9 KiB
TypeScript
import { exec } from 'child_process';
|
|
import type { Compiler } from 'webpack';
|
|
import { daemonClient, isDaemonEnabled } from 'nx/src/daemon/client/client';
|
|
import { BatchFunctionRunner } from 'nx/src/command-line/watch/watch';
|
|
import { output } from 'nx/src/utils/output';
|
|
|
|
export class WebpackNxBuildCoordinationPlugin {
|
|
private currentlyRunning: 'none' | 'nx-build' | 'webpack-build' = 'none';
|
|
private buildCmdProcess: ReturnType<typeof exec> | null = null;
|
|
|
|
constructor(private readonly buildCmd: string, skipInitialBuild?: boolean) {
|
|
if (!skipInitialBuild) {
|
|
this.buildChangedProjects();
|
|
}
|
|
if (isDaemonEnabled()) {
|
|
this.startWatchingBuildableLibs();
|
|
} else {
|
|
output.warn({
|
|
title:
|
|
'Nx Daemon is not enabled. Buildable libs will not be rebuilt on file changes.',
|
|
});
|
|
}
|
|
}
|
|
|
|
apply(compiler: Compiler) {
|
|
compiler.hooks.beforeCompile.tapPromise(
|
|
'IncrementalDevServerPlugin',
|
|
async () => {
|
|
while (this.currentlyRunning === 'nx-build') {
|
|
await sleep(50);
|
|
}
|
|
this.currentlyRunning = 'webpack-build';
|
|
}
|
|
);
|
|
compiler.hooks.done.tapPromise('IncrementalDevServerPlugin', async () => {
|
|
this.currentlyRunning = 'none';
|
|
});
|
|
}
|
|
|
|
async startWatchingBuildableLibs() {
|
|
const unregisterFileWatcher = await this.createFileWatcher();
|
|
|
|
process.on('exit', () => {
|
|
unregisterFileWatcher();
|
|
});
|
|
}
|
|
|
|
async buildChangedProjects() {
|
|
while (this.currentlyRunning === 'webpack-build') {
|
|
await sleep(50);
|
|
}
|
|
this.currentlyRunning = 'nx-build';
|
|
try {
|
|
return await new Promise<void>((res) => {
|
|
this.buildCmdProcess = exec(this.buildCmd);
|
|
|
|
this.buildCmdProcess.stdout.pipe(process.stdout);
|
|
this.buildCmdProcess.stderr.pipe(process.stderr);
|
|
this.buildCmdProcess.on('exit', () => {
|
|
res();
|
|
});
|
|
this.buildCmdProcess.on('error', () => {
|
|
res();
|
|
});
|
|
});
|
|
} finally {
|
|
this.currentlyRunning = 'none';
|
|
this.buildCmdProcess = null;
|
|
}
|
|
}
|
|
|
|
private createFileWatcher() {
|
|
const runner = new BatchFunctionRunner(() => this.buildChangedProjects());
|
|
return daemonClient.registerFileWatcher(
|
|
{
|
|
watchProjects: 'all',
|
|
},
|
|
(err, { changedProjects, changedFiles }) => {
|
|
if (err === 'closed') {
|
|
output.error({
|
|
title: 'Watch connection closed',
|
|
bodyLines: [
|
|
'The daemon has closed the connection to this watch process.',
|
|
'Please restart your watch command.',
|
|
],
|
|
});
|
|
process.exit(1);
|
|
}
|
|
|
|
if (this.buildCmdProcess) {
|
|
this.buildCmdProcess.kill(2);
|
|
this.buildCmdProcess = null;
|
|
}
|
|
// Queue a build
|
|
runner.enqueue(changedProjects, changedFiles);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
function sleep(time: number) {
|
|
return new Promise((resolve) => setTimeout(resolve, time));
|
|
}
|