vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
107 lines (104 loc) • 13.8 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { parentPort } from 'node:worker_threads';
import { join } from 'node:path';
import { hydrateUserOptions } from '../helpers/hydrateUserOptions.js';
import { createReactLoader } from 'react-server-loader/loader';
import { createLogger } from 'vite';
import { createDefaultModuleID } from '../config/createModuleID.js';
let initialized = false;
let userOptions;
let loaderPort;
let resolvedConfig;
let logger;
let verbose = false;
let load = async (url, context, nextLoad) => nextLoad(url, context);
let resolveHook = async (specifier, context, nextResolve) => nextResolve(specifier, context);
function initialize(data) {
const {
id,
port,
userOptions: serializedUserOptions,
resolvedConfig: serializedResolvedConfig
} = data;
verbose = serializedUserOptions?.verbose ?? false;
logger = createLogger(serializedResolvedConfig?.logLevel ?? "info", {
prefix: id
});
resolvedConfig = serializedResolvedConfig;
if (verbose) {
logger.info(`Initializing with options: ${id}`);
}
loaderPort = port;
const resolvedUserOptions = hydrateUserOptions(serializedUserOptions);
if (resolvedUserOptions.type === "error") {
throw resolvedUserOptions.error;
}
userOptions = resolvedUserOptions.userOptions;
if (typeof userOptions.moduleID !== "function") {
const buildConfigEnv = resolvedConfig?.configEnv ?? { command: "build"};
userOptions.moduleID = createDefaultModuleID(
{
moduleBase: userOptions.moduleBase,
moduleBasePath: userOptions.moduleBasePath,
autoDiscover: userOptions.autoDiscover,
build: userOptions.build,
dev: userOptions.dev,
moduleBaseURL: userOptions.moduleBaseURL,
projectRoot: userOptions.projectRoot
},
buildConfigEnv
);
}
const { load: rslLoad, resolve: rslResolve } = createReactLoader({
loader: userOptions.loader,
verbose,
logger,
moduleID: (filePath) => {
let moduleID = filePath;
let finalID = filePath;
if (userOptions?.normalizer) {
const [, value] = userOptions.normalizer(filePath);
moduleID = join(userOptions.moduleBasePath, value);
finalID = userOptions.moduleID?.(moduleID) || moduleID;
}
return finalID;
},
onTransform: ({ filePath, transformedId, source }) => {
if (loaderPort) {
loaderPort.postMessage({
type: "SERVER_MODULE",
id: transformedId,
url: filePath,
source
});
}
}
});
load = rslLoad;
resolveHook = rslResolve;
if (!initialized && loaderPort) {
loaderPort.postMessage({
type: "INITIALIZED_REACT_LOADER",
id
});
}
initialized = true;
}
const loadHook = async (url, context, nextLoad) => {
if (!initialized) {
initialize({
id: "react-loader",
port: parentPort,
userOptions: {},
resolvedConfig: {}
});
}
return load(url, context, nextLoad);
};
const resolve = async (specifier, context, nextResolve) => resolveHook(specifier, context, nextResolve);
export { initialize, loadHook as load, loadHook, resolve };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtbG9hZGVyLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vbG9hZGVyL3JlYWN0LWxvYWRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB2cHJzLXNpZGUgYWRhcHRlciBmb3IgdGhlIFJlYWN0LVJTQyBOb2RlIEVTTSBsb2FkZXIuIFRoZSBhY3R1YWxcbi8vIGxvYWQvcmVzb2x2ZSBob29rcyBsaXZlIGluIHJlYWN0LXNlcnZlci1sb2FkZXIvbG9hZGVyIOKAlCB0aGlzIGZpbGVcbi8vIHRocmVhZHMgdnBycydzIHdvcmtlciBjb250ZXh0IChwYXJlbnQgTWVzc2FnZVBvcnQsIHNlcmlhbGl6ZWQgdXNlclxuLy8gb3B0aW9ucywgdGhlIGBjcmVhdGVEZWZhdWx0TW9kdWxlSURgIHBvbGljeSkgaW50byByc2wncyBmYWN0b3J5IGFuZFxuLy8gcHVibGlzaGVzIHRoZSByZXN1bHRpbmcgaG9va3MgdG8gdGhlIHdvcmtlciBib290c3RyYXAgcGF0aC5cblxuaW1wb3J0IHR5cGUge1xuICBSZXNvbHZlZFVzZXJPcHRpb25zLFxuICBTZXJpYWxpemVkUmVzb2x2ZWRDb25maWcsXG4gIFNlcmlhbGl6ZWRVc2VyT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1vZHVsZUluZm8gfSBmcm9tIFwicm9sbHVwXCI7XG5pbXBvcnQgeyBwYXJlbnRQb3J0IH0gZnJvbSBcIm5vZGU6d29ya2VyX3RocmVhZHNcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZVBvcnQgfSBmcm9tIFwibm9kZTp3b3JrZXJfdGhyZWFkc1wiO1xuaW1wb3J0IHR5cGUge1xuICBJbml0aWFsaXplZFJlYWN0TG9hZGVyTWVzc2FnZSxcbiAgU2VydmVyTW9kdWxlTWVzc2FnZSxcbn0gZnJvbSBcIi4uL3dvcmtlci9yc2MvdHlwZXMuanNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBoeWRyYXRlVXNlck9wdGlvbnMgfSBmcm9tIFwiLi4vaGVscGVycy9oeWRyYXRlVXNlck9wdGlvbnMuanNcIjtcbmltcG9ydCB0eXBlIHsgTG9hZEhvb2ssIFJlc29sdmVIb29rIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBjcmVhdGVSZWFjdExvYWRlciB9IGZyb20gXCJyZWFjdC1zZXJ2ZXItbG9hZGVyL2xvYWRlclwiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCB0eXBlIExvZ2dlciB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgeyBjcmVhdGVEZWZhdWx0TW9kdWxlSUQgfSBmcm9tIFwiLi4vY29uZmlnL2NyZWF0ZU1vZHVsZUlELmpzXCI7XG5cbmV4cG9ydCB0eXBlIExvYWRlck9wdGlvbnMgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHJlc29sdmVEZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuICBmb3JtYXQ/OiBzdHJpbmc7XG4gIGNvbmRpdGlvbnM/OiBzdHJpbmdbXTtcbiAgaW1wb3J0QXNzZXJ0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpbXBvcnRBdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHNvdXJjZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgTG9hZGVyRnVuY3Rpb24gPSAob3B0aW9uczogTG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxNb2R1bGVJbmZvPjtcblxubGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5sZXQgdXNlck9wdGlvbnM6IFJlc29sdmVkVXNlck9wdGlvbnM7XG5sZXQgbG9hZGVyUG9ydDogTWVzc2FnZVBvcnQgfCBudWxsO1xubGV0IHJlc29sdmVkQ29uZmlnOiBTZXJpYWxpemVkUmVzb2x2ZWRDb25maWc7XG5sZXQgbG9nZ2VyOiBMb2dnZXI7XG5sZXQgdmVyYm9zZSA9IGZhbHNlO1xubGV0IGxvYWQ6IExvYWRIb29rID0gYXN5bmMgKHVybCwgY29udGV4dCwgbmV4dExvYWQpID0+IG5leHRMb2FkKHVybCwgY29udGV4dCk7XG5sZXQgcmVzb2x2ZUhvb2s6IFJlc29sdmVIb29rID0gYXN5bmMgKHNwZWNpZmllciwgY29udGV4dCwgbmV4dFJlc29sdmUpID0+XG4gIG5leHRSZXNvbHZlKHNwZWNpZmllciwgY29udGV4dCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplKGRhdGE6IHtcbiAgaWQ6IHN0cmluZztcbiAgcG9ydDogTWVzc2FnZVBvcnQ7XG4gIHVzZXJPcHRpb25zOiBTZXJpYWxpemVkVXNlck9wdGlvbnM7XG4gIHJlc29sdmVkQ29uZmlnOiBTZXJpYWxpemVkUmVzb2x2ZWRDb25maWc7XG59KSB7XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICBwb3J0LFxuICAgIHVzZXJPcHRpb25zOiBzZXJpYWxpemVkVXNlck9wdGlvbnMsXG4gICAgcmVzb2x2ZWRDb25maWc6IHNlcmlhbGl6ZWRSZXNvbHZlZENvbmZpZyxcbiAgfSA9IGRhdGE7XG5cbiAgdmVyYm9zZSA9IHNlcmlhbGl6ZWRVc2VyT3B0aW9ucz8udmVyYm9zZSA/PyBmYWxzZTtcbiAgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHNlcmlhbGl6ZWRSZXNvbHZlZENvbmZpZz8ubG9nTGV2ZWwgPz8gXCJpbmZvXCIsIHtcbiAgICBwcmVmaXg6IGlkLFxuICB9KTtcbiAgcmVzb2x2ZWRDb25maWcgPSBzZXJpYWxpemVkUmVzb2x2ZWRDb25maWc7XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBsb2dnZXIuaW5mbyhgSW5pdGlhbGl6aW5nIHdpdGggb3B0aW9uczogJHtpZH1gKTtcbiAgfVxuICBsb2FkZXJQb3J0ID0gcG9ydDtcblxuICBjb25zdCByZXNvbHZlZFVzZXJPcHRpb25zID0gaHlkcmF0ZVVzZXJPcHRpb25zKHNlcmlhbGl6ZWRVc2VyT3B0aW9ucyk7XG4gIGlmIChyZXNvbHZlZFVzZXJPcHRpb25zLnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgIHRocm93IHJlc29sdmVkVXNlck9wdGlvbnMuZXJyb3I7XG4gIH1cbiAgdXNlck9wdGlvbnMgPSByZXNvbHZlZFVzZXJPcHRpb25zLnVzZXJPcHRpb25zO1xuXG4gIC8vIE1hdGVyaWFsaXNlIHZwcnMncyBkZWZhdWx0IG1vZHVsZUlEIHBvbGljeSBpZiB0aGUgdXNlciBkaWRuJ3Qgc3VwcGx5XG4gIC8vIG9uZS4gRG9uZSBoZXJlIGF0IGluaXQgdGltZSBzbyByc2wncyBsb2FkZXIgY2FuIHJlYWNoIGZvciBhIHN0YWJsZVxuICAvLyByZWZlcmVuY2UgcGVyIGNhbGwgd2l0aG91dCByZWNyZWF0aW5nIGl0LlxuICBpZiAodHlwZW9mIHVzZXJPcHRpb25zLm1vZHVsZUlEICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBidWlsZENvbmZpZ0VudiA9XG4gICAgICByZXNvbHZlZENvbmZpZz8uY29uZmlnRW52ID8/IHsgY29tbWFuZDogXCJidWlsZFwiLCBtb2RlOiBcInByb2R1Y3Rpb25cIiB9O1xuICAgIHVzZXJPcHRpb25zLm1vZHVsZUlEID0gY3JlYXRlRGVmYXVsdE1vZHVsZUlEKFxuICAgICAge1xuICAgICAgICBtb2R1bGVCYXNlOiB1c2VyT3B0aW9ucy5tb2R1bGVCYXNlLFxuICAgICAgICBtb2R1bGVCYXNlUGF0aDogdXNlck9wdGlvbnMubW9kdWxlQmFzZVBhdGgsXG4gICAgICAgIGF1dG9EaXNjb3ZlcjogdXNlck9wdGlvbnMuYXV0b0Rpc2NvdmVyLFxuICAgICAgICBidWlsZDogdXNlck9wdGlvbnMuYnVpbGQsXG4gICAgICAgIGRldjogdXNlck9wdGlvbnMuZGV2LFxuICAgICAgICBtb2R1bGVCYXNlVVJMOiB1c2VyT3B0aW9ucy5tb2R1bGVCYXNlVVJMLFxuICAgICAgICBwcm9qZWN0Um9vdDogdXNlck9wdGlvbnMucHJvamVjdFJvb3QsXG4gICAgICB9LFxuICAgICAgYnVpbGRDb25maWdFbnZcbiAgICApO1xuICB9XG5cbiAgY29uc3QgeyBsb2FkOiByc2xMb2FkLCByZXNvbHZlOiByc2xSZXNvbHZlIH0gPSBjcmVhdGVSZWFjdExvYWRlcih7XG4gICAgbG9hZGVyOiB1c2VyT3B0aW9ucy5sb2FkZXIsXG4gICAgdmVyYm9zZSxcbiAgICBsb2dnZXIsXG4gICAgbW9kdWxlSUQ6IChmaWxlUGF0aCkgPT4ge1xuICAgICAgbGV0IG1vZHVsZUlEID0gZmlsZVBhdGg7XG4gICAgICBsZXQgZmluYWxJRCA9IGZpbGVQYXRoO1xuICAgICAgaWYgKHVzZXJPcHRpb25zPy5ub3JtYWxpemVyKSB7XG4gICAgICAgIGNvbnN0IFssIHZhbHVlXSA9IHVzZXJPcHRpb25zLm5vcm1hbGl6ZXIoZmlsZVBhdGgpO1xuICAgICAgICBtb2R1bGVJRCA9IGpvaW4odXNlck9wdGlvbnMubW9kdWxlQmFzZVBhdGgsIHZhbHVlKTtcbiAgICAgICAgZmluYWxJRCA9IHVzZXJPcHRpb25zLm1vZHVsZUlEPy4obW9kdWxlSUQpIHx8IG1vZHVsZUlEO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbmFsSUQ7XG4gICAgfSxcbiAgICBvblRyYW5zZm9ybTogKHsgZmlsZVBhdGgsIHRyYW5zZm9ybWVkSWQsIHNvdXJjZSB9KSA9PiB7XG4gICAgICBpZiAobG9hZGVyUG9ydCkge1xuICAgICAgICBsb2FkZXJQb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICB0eXBlOiBcIlNFUlZFUl9NT0RVTEVcIixcbiAgICAgICAgICBpZDogdHJhbnNmb3JtZWRJZCxcbiAgICAgICAgICB1cmw6IGZpbGVQYXRoLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgU2VydmVyTW9kdWxlTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG5cbiAgbG9hZCA9IHJzbExvYWQ7XG4gIHJlc29sdmVIb29rID0gcnNsUmVzb2x2ZTtcblxuICBpZiAoIWluaXRpYWxpemVkICYmIGxvYWRlclBvcnQpIHtcbiAgICBsb2FkZXJQb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiSU5JVElBTElaRURfUkVBQ1RfTE9BREVSXCIsXG4gICAgICBpZCxcbiAgICB9IHNhdGlzZmllcyBJbml0aWFsaXplZFJlYWN0TG9hZGVyTWVzc2FnZSk7XG4gIH1cbiAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xufVxuXG4vLyBNb2R1bGUtbGV2ZWwgbG9hZC9yZXNvbHZlIGhvb2tzIGZvciB0aGUgd29ya2VyIGJvb3RzdHJhcCBwYXRoLiBUaGV5XG4vLyBmb3J3YXJkIHRvIHdoYXRldmVyIHJzbCdzIGZhY3RvcnkgcHJvZHVjZWQgYXQgaW5pdCB0aW1lOyBpZiBpbml0IHdhc1xuLy8gc2tpcHBlZCAodW5leHBlY3RlZCkgdGhleSBmYWxsIGJhY2sgdG8gYSBwYXNzLXRocm91Z2ggdGhhdCBsZXRzIHRoZVxuLy8gdW5kZXJseWluZyBsb2FkZXIgY2hhaW4gaGFuZGxlIHRoZSBVUkwgdW50b3VjaGVkLlxuXG5leHBvcnQgY29uc3QgbG9hZEhvb2s6IExvYWRIb29rID0gYXN5bmMgKHVybCwgY29udGV4dCwgbmV4dExvYWQpID0+IHtcbiAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgIGluaXRpYWxpemUoe1xuICAgICAgaWQ6IFwicmVhY3QtbG9hZGVyXCIsXG4gICAgICBwb3J0OiBwYXJlbnRQb3J0ISxcbiAgICAgIHVzZXJPcHRpb25zOiB7fSBhcyBTZXJpYWxpemVkVXNlck9wdGlvbnMsXG4gICAgICByZXNvbHZlZENvbmZpZzoge30gYXMgU2VyaWFsaXplZFJlc29sdmVkQ29uZmlnLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBsb2FkKHVybCwgY29udGV4dCwgbmV4dExvYWQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc29sdmU6IFJlc29sdmVIb29rID0gYXN5bmMgKHNwZWNpZmllciwgY29udGV4dCwgbmV4dFJlc29sdmUpID0+XG4gIHJlc29sdmVIb29rKHNwZWNpZmllciwgY29udGV4dCwgbmV4dFJlc29sdmUpO1xuXG5leHBvcnQgeyBsb2FkSG9vayBhcyBsb2FkIH07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBcUNBLElBQUksV0FBYyxHQUFBLEtBQUE7QUFDbEIsSUFBSSxX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