UNPKG

@rspack/cli

Version:
35 lines (34 loc) 1.83 kB
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 };