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>
82 lines
2.4 KiB
TypeScript
82 lines
2.4 KiB
TypeScript
import { type Plugin } from 'vite';
|
|
import { BatchFunctionRunner } from 'nx/src/command-line/watch/watch';
|
|
import { exec, type ChildProcess } from 'child_process';
|
|
import {
|
|
daemonClient,
|
|
type UnregisterCallback,
|
|
} from 'nx/src/daemon/client/client';
|
|
import { output } from 'nx/src/utils/output';
|
|
|
|
export interface NxViteBuildCoordinationPluginOptions {
|
|
buildCommand: string;
|
|
}
|
|
export function nxViteBuildCoordinationPlugin(
|
|
options: NxViteBuildCoordinationPluginOptions
|
|
): Plugin {
|
|
let activeBuildProcess: ChildProcess | undefined;
|
|
let unregisterFileWatcher: UnregisterCallback | undefined;
|
|
|
|
async function buildChangedProjects() {
|
|
await new Promise<void>((res) => {
|
|
activeBuildProcess = exec(options.buildCommand);
|
|
activeBuildProcess.stdout.pipe(process.stdout);
|
|
activeBuildProcess.stderr.pipe(process.stderr);
|
|
activeBuildProcess.on('exit', () => {
|
|
res();
|
|
});
|
|
activeBuildProcess.on('error', () => {
|
|
res();
|
|
});
|
|
});
|
|
activeBuildProcess = undefined;
|
|
}
|
|
|
|
function createFileWatcher() {
|
|
const runner = new BatchFunctionRunner(() => buildChangedProjects());
|
|
return daemonClient.registerFileWatcher(
|
|
{ watchProjects: 'all' },
|
|
(err, { changedProjects, changedFiles }) => {
|
|
if (err === 'closed') {
|
|
output.error({
|
|
title: 'Watch connection closed',
|
|
bodyLines: [
|
|
'The daemon had closed the connection to this watch process.',
|
|
'Please restart your watch command.',
|
|
],
|
|
});
|
|
process.exit(1);
|
|
}
|
|
|
|
if (activeBuildProcess) {
|
|
activeBuildProcess.kill(2);
|
|
activeBuildProcess = undefined;
|
|
}
|
|
|
|
runner.enqueue(changedProjects, changedFiles);
|
|
}
|
|
);
|
|
}
|
|
|
|
let firstBuildStart = true;
|
|
|
|
return {
|
|
name: 'nx-vite-build-coordination-plugin',
|
|
async buildStart() {
|
|
if (firstBuildStart) {
|
|
firstBuildStart = false;
|
|
await buildChangedProjects();
|
|
if (daemonClient.enabled()) {
|
|
unregisterFileWatcher = await createFileWatcher();
|
|
process.on('exit', () => unregisterFileWatcher());
|
|
process.on('SIGINT', () => process.exit());
|
|
} else {
|
|
output.warn({
|
|
title:
|
|
'Nx Daemon is not enabled. Projects will not be rebuilt when files change.',
|
|
});
|
|
}
|
|
}
|
|
},
|
|
};
|
|
}
|