@rspack/cli
Version:
CLI for rspack
35 lines (34 loc) • 1.83 kB
JavaScript
import node_fs from "node:fs";
import node_path from "node:path";
import { rspack } from "@rspack/core";
const DEFAULT_RUST_TRACE_LAYER = 'logger';
const DEFAULT_RUST_TRACE_LOGGER_OUTPUT = 'rspack.log';
const DEFAULT_RUST_TRACE_PERFETTO_OUTPUT = 'rspack.pftrace';
function isTerminalTraceOutput(output) {
return 'stdout' === output || 'stderr' === output;
}
async function applyProfile(filterValue, traceLayer = DEFAULT_RUST_TRACE_LAYER, traceOutput) {
const { asyncExitHook } = await import("./exit-hook.js");
if ('logger' !== traceLayer && 'perfetto' !== traceLayer) throw new Error(`unsupported trace layer: ${traceLayer}`);
if (traceOutput && 'perfetto' === traceLayer && isTerminalTraceOutput(traceOutput)) throw new Error('RSPACK_TRACE_OUTPUT=stdout|stderr is only supported for the logger trace layer. The perfetto trace layer requires a file path.');
const timestamp = Date.now();
const defaultOutputDir = node_path.resolve(`.rspack-profile-${timestamp}-${process.pid}`);
if (traceOutput) {
if (!isTerminalTraceOutput(traceOutput)) traceOutput = node_path.resolve(defaultOutputDir, traceOutput);
} else {
const defaultRustTraceOutput = 'perfetto' === traceLayer ? DEFAULT_RUST_TRACE_PERFETTO_OUTPUT : DEFAULT_RUST_TRACE_LOGGER_OUTPUT;
traceOutput = node_path.resolve(defaultOutputDir, defaultRustTraceOutput);
}
if (!isTerminalTraceOutput(traceOutput)) await ensureFileDir(traceOutput);
await rspack.experiments.globalTrace.register(filterValue, traceLayer, traceOutput);
asyncExitHook(rspack.experiments.globalTrace.cleanup, {
wait: 500
});
}
async function ensureFileDir(outputFilePath) {
const dir = node_path.dirname(outputFilePath);
await node_fs.promises.mkdir(dir, {
recursive: true
});
}
export { applyProfile };