vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
74 lines (71 loc) • 10.5 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import 'node:stream';
import { parseServerActionRequest, resolveServerAction, loadServerAction, executeServerAction, sendServerActionResponse, handleServerActionError } from './handleServerActionHelper.js';
export { createServerActionResponse, parseServerActionRequestBody, setupServerActionHeaders } from './handleServerActionHelper.js';
async function handleServerAction(req, res, options) {
const { projectRoot, verbose = false, logger, ssrLoadModule } = options;
try {
if (verbose) {
logger?.info("[handleServerAction:server] Processing server action request");
}
const { id, args } = await parseServerActionRequest(
req,
verbose,
logger
);
const { fullPath, exportName } = resolveServerAction(
id,
projectRoot,
verbose,
logger
);
if (!ssrLoadModule) {
throw new Error("ssrLoadModule is required for server action execution");
}
const action = await loadServerAction(
fullPath,
exportName,
ssrLoadModule,
verbose,
logger
);
const result = await executeServerAction(
action,
args,
verbose,
logger
);
sendServerActionResponse(
res,
result,
verbose,
logger
);
if (verbose) {
logger?.info("[handleServerAction:server] Server action completed successfully");
}
} catch (error) {
handleServerActionError(error, res, logger);
}
}
async function handleServerActionWithViteServer(req, res, server, handlerOptions) {
const serverEnv = server.environments["server"];
let ssrLoadModule;
if (serverEnv && "runner" in serverEnv && serverEnv.runner) {
ssrLoadModule = (url) => serverEnv.runner.import(url);
} else {
ssrLoadModule = server.ssrLoadModule;
}
return handleServerAction(req, res, {
projectRoot: handlerOptions.projectRoot,
verbose: handlerOptions.verbose,
logger: server.config.customLogger || server.config.logger,
ssrLoadModule
});
}
export { handleServerAction, handleServerActionWithViteServer, parseServerActionRequest };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlU2VydmVyQWN0aW9uLnNlcnZlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2hlbHBlcnMvaGFuZGxlU2VydmVyQWN0aW9uLnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvZ2dlciwgVml0ZURldlNlcnZlciB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgdHlwZSB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgeyBsb2dFcnJvciwgdG9FcnJvciB9IGZyb20gXCIuLi9lcnJvci9pbmRleC5qc1wiO1xuaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB0eXBlIHtcbiAgU2VydmVyQWN0aW9uSGFuZGxlck9wdGlvbnMsXG59IGZyb20gXCIuL2hhbmRsZVNlcnZlckFjdGlvbkhlbHBlci5qc1wiO1xuaW1wb3J0IHtcbiAgcGFyc2VTZXJ2ZXJBY3Rpb25SZXF1ZXN0IGFzIHBhcnNlU2VydmVyQWN0aW9uUmVxdWVzdEhlbHBlcixcbiAgY3JlYXRlU2VydmVyQWN0aW9uUmVzcG9uc2UsXG4gIHJlc29sdmVTZXJ2ZXJBY3Rpb24sXG4gIGxvYWRTZXJ2ZXJBY3Rpb24sXG4gIGV4ZWN1dGVTZXJ2ZXJBY3Rpb24sXG4gIHNlbmRTZXJ2ZXJBY3Rpb25SZXNwb25zZSxcbiAgaGFuZGxlU2VydmVyQWN0aW9uRXJyb3IgYXMgaGFuZGxlU2VydmVyQWN0aW9uRXJyb3JIZWxwZXIsXG59IGZyb20gXCIuL2hhbmRsZVNlcnZlckFjdGlvbkhlbHBlci5qc1wiO1xuXG4vLyBVc2Ugc2hhcmVkIGhlbHBlciBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGxvZ2ljXG5cbi8vIFVzZSBzaGFyZWQgaGVscGVyIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgbG9naWNcblxuLyoqXG4gKiBDcmVhdGVzIGEgcGFzcy10aHJvdWdoIHN0cmVhbSBmb3Igc2VydmVyIGFjdGlvbiByZXNwb25zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXJ2ZXJBY3Rpb25TdHJlYW0ocmVzOiBTZXJ2ZXJSZXNwb25zZSk6IFBhc3NUaHJvdWdoIHtcbiAgY29uc3QgcGFzc1Rocm91Z2ggPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgcGFzc1Rocm91Z2gucGlwZShyZXMsIHsgZW5kOiB0cnVlIH0pO1xuICBwYXNzVGhyb3VnaC5vbignZW5kJywgKCkgPT4ge1xuICAgIHJlcy5lbmQoKTtcbiAgfSk7XG4gIHJldHVybiBwYXNzVGhyb3VnaDtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGVycm9ycyBpbiBzZXJ2ZXIgYWN0aW9uIHByb2Nlc3NpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVTZXJ2ZXJBY3Rpb25FcnJvcihlcnJvcjogdW5rbm93biwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgbG9nZ2VyPzogTG9nZ2VyKSB7XG4gIGNvbnN0IGVyciA9IHRvRXJyb3IoZXJyb3IpO1xuICBsb2dFcnJvcihlcnIsIGxvZ2dlcik7XG4gIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICByZXMuZW5kKEpTT04uc3RyaW5naWZ5KGNyZWF0ZVNlcnZlckFjdGlvblJlc3BvbnNlKHVuZGVmaW5lZCwgZXJyLm1lc3NhZ2UpKSk7XG59XG5cbi8qKlxuICogU2VydmVyLXNpZGUgc2VydmVyIGFjdGlvbiBoYW5kbGVyIHRoYXQgdXNlcyBzc3JMb2FkTW9kdWxlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVTZXJ2ZXJBY3Rpb24oXG4gIHJlcTogSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IFNlcnZlclJlc3BvbnNlLFxuICBvcHRpb25zOiBTZXJ2ZXJBY3Rpb25IYW5kbGVyT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJvamVjdFJvb3QsIHZlcmJvc2UgPSBmYWxzZSwgbG9nZ2VyLCBzc3JMb2FkTW9kdWxlIH0gPSBvcHRpb25zO1xuXG4gIHRyeSB7XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlcj8uaW5mbyhcIltoYW5kbGVTZXJ2ZXJBY3Rpb246c2VydmVyXSBQcm9jZXNzaW5nIHNlcnZlciBhY3Rpb24gcmVxdWVzdFwiKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgc2VydmVyIGFjdGlvbiByZXF1ZXN0XG4gICAgY29uc3QgeyBpZCwgYXJncyB9ID0gYXdhaXQgcGFyc2VTZXJ2ZXJBY3Rpb25SZXF1ZXN0SGVscGVyKFxuICAgICAgcmVxLFxuICAgICAgdmVyYm9zZSxcbiAgICAgIGxvZ2dlclxuICAgICk7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBzZXJ2ZXIgYWN0aW9uXG4gICAgY29uc3QgeyBmdWxsUGF0aCwgZXhwb3J0TmFtZSB9ID0gcmVzb2x2ZVNlcnZlckFjdGlvbihcbiAgICAgIGlkLFxuICAgICAgcHJvamVjdFJvb3QsXG4gICAgICB2ZXJib3NlLFxuICAgICAgbG9nZ2VyXG4gICAgKTtcblxuICAgIC8vIExvYWQgdGhlIHNlcnZlciBhY3Rpb24gKGlmIHNzckxvYWRNb2R1bGUgaXMgcHJvdmlkZWQpXG4gICAgaWYgKCFzc3JMb2FkTW9kdWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzc3JMb2FkTW9kdWxlIGlzIHJlcXVpcmVkIGZvciBzZXJ2ZXIgYWN0aW9uIGV4ZWN1dGlvblwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSBhd2FpdCBsb2FkU2VydmVyQWN0aW9uKFxuICAgICAgZnVsbFBhdGgsXG4gICAgICBleHBvcnROYW1lLFxuICAgICAgc3NyTG9hZE1vZHVsZSxcbiAgICAgIHZlcmJvc2UsXG4gICAgICBsb2dnZXJcbiAgICApO1xuXG4gICAgLy8gRXhlY3V0ZSB0aGUgc2VydmVyIGFjdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVTZXJ2ZXJBY3Rpb24oXG4gICAgICBhY3Rpb24sXG4gICAgICBhcmdzLFxuICAgICAgdmVyYm9zZSxcbiAgICAgIGxvZ2dlclxuICAgICk7XG5cbiAgICAvLyBTZW5kIHRoZSByZXNwb25zZVxuICAgIHNlbmRTZXJ2ZXJBY3Rpb25SZXNwb25zZShcbiAgICAgIHJlcyxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHZlcmJvc2UsXG4gICAgICBsb2dnZXJcbiAgICApO1xuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlcj8uaW5mbyhcIltoYW5kbGVTZXJ2ZXJBY3Rpb246c2VydmVyXSBTZXJ2ZXIgYWN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcIik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGhhbmRsZVNlcnZlckFjdGlvbkVycm9ySGVscGVyKGVycm9yLCByZXMsIGxvZ2dlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBWaXRlRGV2U2VydmVyLXNwZWNpZmljIHdyYXBwZXIgZm9yIHRoZSBzZXJ2ZXIgaGFuZGxlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU2VydmVyQWN0aW9uV2l0aFZpdGVTZXJ2ZXIoXG4gIHJlcTogSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IFNlcnZlclJlc3BvbnNlLFxuICBzZXJ2ZXI6IFZpdGVEZXZTZXJ2ZXIsXG4gIGhhbmRsZXJPcHRpb25zOiB7XG4gICAgdmVyYm9zZT86IGJvb2xlYW47XG4gICAgcHJvamVjdFJvb3Q6IHN0cmluZztcbiAgfVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFVzZSBzZXJ2ZXIgZW52aXJvbm1lbnQgcnVubmVyIGZvciBwcm9wZXIgcmVhY3Qtc2VydmVyIGNvbmRpdGlvbiBoYW5kbGluZ1xuICAvLyBUaGlzIGVuc3VyZXMgY2xpZW50IGNvbXBvbmVudHMgYXJlIHRyYW5zZm9ybWVkIHRvIHJlZ2lzdGVyQ2xpZW50UmVmZXJlbmNlXG4gIGNvbnN0IHNlcnZlckVudiA9IHNlcnZlci5lbnZpcm9ubWVudHNbJ3NlcnZlciddO1xuICBsZXQgc3NyTG9hZE1vZHVsZTogKHVybDogc3RyaW5nKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgXG4gIGlmIChzZXJ2ZXJFbnYgJiYgJ3J1bm5lcicgaW4gc2VydmVyRW52ICYmIHNlcnZlckVudi5ydW5uZXIpIHtcbiAgICAvLyBWaXRlIDYgRW52aXJvbm1lbnQgQVBJOiB1c2Ugc2VydmVyIGVudmlyb25tZW50IHJ1bm5lciBmb3IgUlNDXG4gICAgc3NyTG9hZE1vZHVsZSA9ICh1cmw6IHN0cmluZykgPT4gXG4gICAgICAoc2VydmVyRW52LnJ1bm5lciBhcyB7IGltcG9ydDogKHVybDogc3RyaW5nKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9KS5pbXBvcnQodXJsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjayB0byBzc3JMb2FkTW9kdWxlIChzaG91bGQgbm90IGhhcHBlbiBpbiBWaXRlIDYrKVxuICAgIHNzckxvYWRNb2R1bGUgPSBzZXJ2ZXIuc3NyTG9hZE1vZHVsZTtcbiAgfVxuICBcbiAgcmV0dXJuIGhhbmRsZVNlcnZlckFjdGlvbihyZXEsIHJlcywge1xuICAgIHByb2plY3RSb290OiBoYW5kbGVyT3B0aW9ucy5wcm9qZWN0Um9vdCxcbiAgICB2ZXJib3NlOiBoYW5kbGVyT3B0aW9ucy52ZXJib3NlLFxuICAgIGxvZ2dlcjogc2VydmVyLmNvbmZpZy5jdXN0b21Mb2dnZXIgfHwgc2VydmVyLmNvbmZpZy5sb2dnZXIsXG4gICAgc3NyTG9hZE1vZHVsZSxcbiAgfSk7XG59XG5cbi8vIFJlLWV4cG9ydCBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgZW50cnkgcG9pbnRcbmV4cG9ydCB7IFxuICBwYXJzZVNlcnZlckFjdGlvblJlcXVlc3QsXG4gIHBhcnNlU2VydmVyQWN0aW9uUmVxdWVzdEJvZHksXG4gIGNyZWF0ZVNlcnZlckFjdGlvblJlc3BvbnNlLCBcbiAgc2V0dXBTZXJ2ZXJBY3Rpb25IZWFkZXJzIFxufSBmcm9tIFwiLi9oYW5kbGVTZXJ2ZXJBY3Rpb25IZWxwZXIuanNcIjtcblxuZXhwb3J0IHR5cGUgeyBTZXJ2ZXJBY3Rpb25SZXF1ZXN0LCBTZXJ2ZXJBY3Rpb25IYW5kbGVyT3B0aW9ucyB9IGZyb20gXCIuL2hhbmRsZVNlcnZlckFjdGlvbkhlbHBlci5qc1wiO1xuIl0sIm5hbWVzIjpbInBhcnNlU2VydmVyQWN0aW9uUmVxdWVzdEhlbHBlciIsImhhbmRsZVNlcnZlckFjdGlvbkVycm9ySGVscGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUE4Q0EsZUFBc0Isa0JBQUEsQ0FDcEIsR0FDQSxFQUFBLEdBQUEsRUFDQSxPQUNlLEVBQUE7QUFDZixFQUFBLE1BQU0sRUFBRSxXQUFhLEVBQUEsT0FBQSxHQUFVLEtBQU8sRUFBQSxNQUFBLEVBQVEsZUFBa0IsR0FBQSxPQUFBO0FBRWhFLEVBQUksSUFBQTtBQUNGLElBQUEsSUFBSSxPQUFTLEVBQUE7QUFDWCxNQUFBLE1BQUEsRUFBUSxLQUFLLDhEQUE4RCxDQUFBO0FBQUE7QUFJN0UsSUFBQSxNQUFNLEVBQUUsRUFBQSxFQUFJLElBQUssRUFBQSxHQUFJLE1BQU1BLHdCQUFBO0FBQUEsTUFDekIsR0FBQTtBQUFBLE1BQ0EsT0FBQTtBQUFBLE1BQ0E7QUFBQSxLQUNGO0FBR0EsSUFBTSxNQUFBLEVBQUUsUUFBVSxFQUFBLFVBQUEsRUFBZSxHQUFBLG1CQUFBO0FBQUEsTUFDL0IsRUFBQTtBQUFBLE1BQ0EsV0FBQTtBQUFBLE1BQ0EsT0FBQTtBQUFBLE1BQ0E7QUFBQSxLQUNGO0FBR0EsSUFBQSxJQUFJLENBQUMsYUFBZSxFQUFBO0FBQ2xCLE1BQU0sTUFBQSxJQUFJLE1BQU0sdURBQXVELENBQUE7QUFBQTtBQUd6RSxJQUFBLE1BQU0sU0FBUyxNQUFNLGdCQUFBO0FBQUEsTUFDbkIsUUFBQTtBQUFBLE1BQ0EsVUFBQTtBQUFBLE1BQ0EsYUFBQTtBQUFBLE1BQ0EsT0FBQTtBQUFBLE1BQ0E7QUFBQSxLQUNGO0FBR0EsSUFBQSxNQUFNLFNBQVMsTUFBTSxtQkFBQTtBQUFBLE1BQ25CLE1BQUE7QUFBQSxNQUNBLElBQUE7QUFBQSxNQUNBLE9BQUE7QUFBQSxNQUNBO0FBQUEsS0FDRjtBQUdBLElBQUEsd0JBQUE7QUFBQSxNQUNFLEdBQUE7QUFBQSxNQUNBLE1BQUE7QUFBQSxNQUNBLE9BQUE7QUFBQSxNQUNBO0FBQUEsS0FDRjtBQUVBLElBQUEsSUFBSSxPQUFTLEVBQUE7QUFDWCxNQUFBLE1BQUEsRUFBUSxLQUFLLGtFQUFrRSxDQUFBO0FBQUE7QUFDakYsV0FDTyxLQUFnQixFQUFBO0FBQ3ZCLElBQThCQyx1QkFBQSxDQUFBLEtBQUEsRUFBTyxLQUFLLE1BQU0sQ0FBQTtBQUFBO0FBRXBEO0FBS0EsZUFBc0IsZ0NBQ3BCLENBQUEsR0FBQSxFQUNBLEdBQ0EsRUFBQSxNQUFBLEVBQ0EsY0FJZSxFQUFBO0FBR2YsRUFBTSxNQUFBLFNBQUEsR0FBWSxNQUFPLENBQUEsWUFBQSxDQUFhLFFBQVEsQ0FBQTtBQUM5QyxFQUFJLElBQUEsYUFBQTtBQUVKLEVBQUEsSUFBSSxTQUFhLElBQUEsUUFBQSxJQUFZLFNBQWEsSUFBQSxTQUFBLENBQVUsTUFBUSxFQUFBO0FBRTFELElBQUEsYUFBQSxHQUFnQixDQUFDLEdBQUEsS0FDZCxTQUFVLENBQUEsTUFBQSxDQUF5RSxPQUFPLEdBQUcsQ0FBQTtBQUFBLEdBQzNGLE1BQUE7QUFFTCxJQUFBLGFBQUEsR0FBZ0IsTUFBTyxDQUFBLGFBQUE7QUFBQTtBQUd6QixFQUFPLE9BQUEsa0JBQUEsQ0FBbUIsS0FBSyxHQUFLLEVBQUE7QUFBQSxJQUNsQyxhQUFhLGNBQWUsQ0FBQSxXQUFBO0FBQUEsSUFDNUIsU0FBUyxjQUFlLENBQUEsT0FBQTtBQUFBLElBQ3hCLE1BQVEsRUFBQSxNQUFBLENBQU8sTUFBTyxDQUFBLFlBQUEsSUFBZ0IsT0FBTyxNQUFPLENBQUEsTUFBQTtBQUFBLElBQ3BEO0FBQUEsR0FDRCxDQUFBO0FBQ0g7Ozs7In0=