UNPKG

vite-plugin-react-server

Version:
107 lines (104 loc) 13.8 kB
/** * 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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