vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
89 lines (86 loc) • 12.7 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { getEnvValue } from '../env/getEnvKey.js';
import { hydrateUserOptions } from '../helpers/hydrateUserOptions.js';
import { sendMessage } from '../worker/sendMessage.js';
import { DEFAULT_CONFIG } from '../config/defaults.js';
let loaderPort;
let resolvedConfig;
let userOptions;
let envPrefix = DEFAULT_CONFIG.ENV_PREFIX;
async function initialize(data) {
loaderPort = data.port;
resolvedConfig = data.resolvedConfig;
envPrefix = Array.isArray(resolvedConfig?.envPrefix) ? resolvedConfig?.envPrefix[0] : resolvedConfig?.envPrefix || DEFAULT_CONFIG.ENV_PREFIX;
const resolvedUserOptions = hydrateUserOptions(data.userOptions);
if (resolvedUserOptions.type === "error") {
if (loaderPort) {
sendMessage(
{
type: "ERROR",
id: "env-loader",
error: resolvedUserOptions.error
},
loaderPort
);
}
throw resolvedUserOptions.error;
}
userOptions = resolvedUserOptions.userOptions;
data.port.postMessage({
type: "INITIALIZED_ENV_LOADER",
id: data.id,
env: {}
});
}
const load = async (url, context, nextLoad) => {
const result = await nextLoad(url, context);
if (result.format !== "module") {
return result;
}
if (url.startsWith("node:") || url.includes("/.")) {
return result;
}
let sourceStr;
if (typeof result.source === "string") {
sourceStr = result.source;
} else if (result.source instanceof Uint8Array || Buffer.isBuffer(result.source)) {
sourceStr = result.source.toString("utf-8");
} else {
console.warn(
`[env-loader] Unexpected source type: ${typeof result.source}`
);
return result;
}
const envObject = {
MODE: getEnvValue("MODE", envPrefix) || resolvedConfig?.mode || "development",
BASE_URL: getEnvValue("BASE_URL", envPrefix) || resolvedConfig?.base || "/",
PROD: getEnvValue("PROD", envPrefix) === "true" || getEnvValue("PROD", envPrefix) === "1" || resolvedConfig?.isProduction || false,
DEV: getEnvValue("DEV", envPrefix) === "true" || getEnvValue("DEV", envPrefix) === "1" || !resolvedConfig?.isProduction || true,
SSR: getEnvValue("SSR", envPrefix) === "true" || getEnvValue("SSR", envPrefix) === "1" || true,
PUBLIC_ORIGIN: getEnvValue("PUBLIC_ORIGIN", envPrefix) || userOptions?.publicOrigin || "",
// Include additional environment variables from Vite's define
...Object.fromEntries(
Object.entries(resolvedConfig?.define || {}).filter(([key]) => key.startsWith("import.meta.env.")).map(([key, value]) => [
key.replace("import.meta.env.", ""),
JSON.parse(value)
])
)
};
let newSource = sourceStr;
if (newSource.includes("import.meta.env")) {
newSource = `Object.defineProperty(import.meta, "env", { value: ${JSON.stringify(
envObject
)}, writable: false, configurable: false });
${newSource}`;
}
return {
...result,
source: newSource
};
};
export { initialize, load, loaderPort };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LWxvYWRlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2xvYWRlci9lbnYtbG9hZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTG9hZEhvb2sgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZVBvcnQgfSBmcm9tIFwibm9kZTp3b3JrZXJfdGhyZWFkc1wiO1xuaW1wb3J0IHR5cGUge1xuICBSZXNvbHZlZFVzZXJPcHRpb25zLFxuICBTZXJpYWxpemVkUmVzb2x2ZWRDb25maWcsXG4gIFNlcmlhbGl6ZWRVc2VyT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJzY1dvcmtlcklucHV0TWVzc2FnZSB9IGZyb20gXCIuLi93b3JrZXIvcnNjL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBnZXRFbnZWYWx1ZSB9IGZyb20gXCIuLi9lbnYvZ2V0RW52S2V5LmpzXCI7XG5pbXBvcnQgeyBoeWRyYXRlVXNlck9wdGlvbnMgfSBmcm9tIFwiLi4vaGVscGVycy9oeWRyYXRlVXNlck9wdGlvbnMuanNcIjtcbmltcG9ydCB7IHNlbmRNZXNzYWdlIH0gZnJvbSBcIi4uL3dvcmtlci9zZW5kTWVzc2FnZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFcnJvck1lc3NhZ2UgfSBmcm9tIFwiLi4vd29ya2VyL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJRyB9IGZyb20gXCIuLi9jb25maWcvZGVmYXVsdHMuanNcIjtcblxuZXhwb3J0IGxldCBsb2FkZXJQb3J0OiBNZXNzYWdlUG9ydCB8IHVuZGVmaW5lZDtcbmxldCByZXNvbHZlZENvbmZpZzogU2VyaWFsaXplZFJlc29sdmVkQ29uZmlnIHwgdW5kZWZpbmVkO1xubGV0IHVzZXJPcHRpb25zOiBSZXNvbHZlZFVzZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xubGV0IGVudlByZWZpeDogc3RyaW5nID0gREVGQVVMVF9DT05GSUcuRU5WX1BSRUZJWDtcblxuLy8gSW5pdGlhbGl6ZSBob29rXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZShkYXRhOiB7XG4gIGlkOiBzdHJpbmc7XG4gIHBvcnQ6IE1lc3NhZ2VQb3J0O1xuICByZXNvbHZlZENvbmZpZzogU2VyaWFsaXplZFJlc29sdmVkQ29uZmlnO1xuICB1c2VyT3B0aW9uczogU2VyaWFsaXplZFVzZXJPcHRpb25zO1xufSkge1xuICBsb2FkZXJQb3J0ID0gZGF0YS5wb3J0O1xuICByZXNvbHZlZENvbmZpZyA9IGRhdGEucmVzb2x2ZWRDb25maWc7XG4gIFxuICAvLyBFeHRyYWN0IGVudlByZWZpeCBmcm9tIHJlc29sdmVkIGNvbmZpZ1xuICBlbnZQcmVmaXggPSBBcnJheS5pc0FycmF5KHJlc29sdmVkQ29uZmlnPy5lbnZQcmVmaXgpXG4gICAgPyByZXNvbHZlZENvbmZpZz8uZW52UHJlZml4WzBdXG4gICAgOiByZXNvbHZlZENvbmZpZz8uZW52UHJlZml4IHx8IERFRkFVTFRfQ09ORklHLkVOVl9QUkVGSVg7XG5cbiAgLy8gSHlkcmF0ZSB1c2VyIG9wdGlvbnNcbiAgY29uc3QgcmVzb2x2ZWRVc2VyT3B0aW9ucyA9IGh5ZHJhdGVVc2VyT3B0aW9ucyhkYXRhLnVzZXJPcHRpb25zKTtcbiAgaWYgKHJlc29sdmVkVXNlck9wdGlvbnMudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgaWYgKGxvYWRlclBvcnQpIHtcbiAgICAgIHNlbmRNZXNzYWdlKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJFUlJPUlwiLFxuICAgICAgICAgIGlkOiBcImVudi1sb2FkZXJcIixcbiAgICAgICAgICBlcnJvcjogcmVzb2x2ZWRVc2VyT3B0aW9ucy5lcnJvcixcbiAgICAgICAgfSBzYXRpc2ZpZXMgRXJyb3JNZXNzYWdlLFxuICAgICAgICBsb2FkZXJQb3J0XG4gICAgICApO1xuICAgIH1cbiAgICB0aHJvdyByZXNvbHZlZFVzZXJPcHRpb25zLmVycm9yO1xuICB9XG5cbiAgdXNlck9wdGlvbnMgPSByZXNvbHZlZFVzZXJPcHRpb25zLnVzZXJPcHRpb25zO1xuXG4gIGRhdGEucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgdHlwZTogXCJJTklUSUFMSVpFRF9FTlZfTE9BREVSXCIsXG4gICAgaWQ6IGRhdGEuaWQsXG4gICAgZW52OiB7fSxcbiAgfSBzYXRpc2ZpZXMgUnNjV29ya2VySW5wdXRNZXNzYWdlKTtcbn1cblxuLy8gTG9hZCBob29rXG5leHBvcnQgY29uc3QgbG9hZDogTG9hZEhvb2sgPSBhc3luYyAoXG4gIHVybCxcbiAgY29udGV4dCxcbiAgbmV4dExvYWRcbikgPT4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBuZXh0TG9hZCh1cmwsIGNvbnRleHQpO1xuXG4gIC8vIFNraXAgaWYgbm90IGEgbW9kdWxlXG4gIGlmIChyZXN1bHQuZm9ybWF0ICE9PSBcIm1vZHVsZVwiKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIFNraXAgbm9kZSBpbnRlcm5hbHMgYW5kIGhpZGRlbiBmaWxlc1xuICBpZiAodXJsLnN0YXJ0c1dpdGgoXCJub2RlOlwiKSB8fCB1cmwuaW5jbHVkZXMoXCIvLlwiKSkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBDb252ZXJ0IHNvdXJjZSB0byBzdHJpbmcgaWYgaXQncyBhIEJ1ZmZlciBvciBVaW50OEFycmF5XG4gIGxldCBzb3VyY2VTdHI6IHN0cmluZztcbiAgaWYgKHR5cGVvZiByZXN1bHQuc291cmNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgc291cmNlU3RyID0gcmVzdWx0LnNvdXJjZTtcbiAgfSBlbHNlIGlmIChcbiAgICByZXN1bHQuc291cmNlIGluc3RhbmNlb2YgVWludDhBcnJheSB8fFxuICAgIEJ1ZmZlci5pc0J1ZmZlcihyZXN1bHQuc291cmNlKVxuICApIHtcbiAgICBzb3VyY2VTdHIgPSByZXN1bHQuc291cmNlLnRvU3RyaW5nKFwidXRmLThcIik7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFtlbnYtbG9hZGVyXSBVbmV4cGVjdGVkIHNvdXJjZSB0eXBlOiAke3R5cGVvZiByZXN1bHQuc291cmNlfWBcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBDcmVhdGUgdGhlIGVudiBvYmplY3QgdXNpbmcgb3VyIGR5bmFtaWMgcHJlZml4IHN5c3RlbVxuICBjb25zdCBlbnZPYmplY3QgPSB7XG4gICAgTU9ERTogZ2V0RW52VmFsdWUoXCJNT0RFXCIsIGVudlByZWZpeCkgfHwgcmVzb2x2ZWRDb25maWc/Lm1vZGUgfHwgXCJkZXZlbG9wbWVudFwiLFxuICAgIEJBU0VfVVJMOiBnZXRFbnZWYWx1ZShcIkJBU0VfVVJMXCIsIGVudlByZWZpeCkgfHwgcmVzb2x2ZWRDb25maWc/LmJhc2UgfHwgXCIvXCIsXG4gICAgUFJPRDogZ2V0RW52VmFsdWUoXCJQUk9EXCIsIGVudlByZWZpeCkgPT09IFwidHJ1ZVwiIHx8IFxuICAgICAgICAgIGdldEVudlZhbHVlKFwiUFJPRFwiLCBlbnZQcmVmaXgpID09PSBcIjFcIiB8fCBcbiAgICAgICAgICByZXNvbHZlZENvbmZpZz8uaXNQcm9kdWN0aW9uIHx8IGZhbHNlLFxuICAgIERFVjogZ2V0RW52VmFsdWUoXCJERVZcIiwgZW52UHJlZml4KSA9PT0gXCJ0cnVlXCIgfHwgXG4gICAgICAgICBnZXRFbnZWYWx1ZShcIkRFVlwiLCBlbnZQcmVmaXgpID09PSBcIjFcIiB8fCBcbiAgICAgICAgICEocmVzb2x2ZWRDb25maWc/LmlzUHJvZHVjdGlvbikgfHwgdHJ1ZSxcbiAgICBTU1I6IGdldEVudlZhbHVlKFwiU1NSXCIsIGVudlByZWZpeCkgPT09IFwidHJ1ZVwiIHx8IFxuICAgICAgICAgZ2V0RW52VmFsdWUoXCJTU1JcIiwgZW52UHJlZml4KSA9PT0gXCIxXCIgfHwgXG4gICAgICAgICB0cnVlLFxuICAgIFBVQkxJQ19PUklHSU46IGdldEVudlZhbHVlKFwiUFVCTElDX09SSUdJTlwiLCBlbnZQcmVmaXgpIHx8IFxuICAgICAgICAgICAgICAgICAgIHVzZXJPcHRpb25zPy5wdWJsaWNPcmlnaW4gfHwgXCJcIixcbiAgICBcbiAgICAvLyBJbmNsdWRlIGFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gVml0ZSdzIGRlZmluZVxuICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJlc29sdmVkQ29uZmlnPy5kZWZpbmUgfHwge30pXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkuc3RhcnRzV2l0aChcImltcG9ydC5tZXRhLmVudi5cIikpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAgICAgIGtleS5yZXBsYWNlKFwiaW1wb3J0Lm1ldGEuZW52LlwiLCBcIlwiKSxcbiAgICAgICAgICBKU09OLnBhcnNlKHZhbHVlIGFzIHN0cmluZyksXG4gICAgICAgIF0pXG4gICAgKSxcbiAgfTtcblxuICAvLyBSZXBsYWNlIGVudmlyb25tZW50IHZhcmlhYmxlIHJlZmVyZW5jZXMgaW4gdGhlIHNvdXJjZVxuICBsZXQgbmV3U291cmNlID0gc291cmNlU3RyO1xuXG4gIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gaGFuZGxlIGltcG9ydC5tZXRhLmVudlxuICBpZiAobmV3U291cmNlLmluY2x1ZGVzKFwiaW1wb3J0Lm1ldGEuZW52XCIpKSB7XG4gICAgbmV3U291cmNlID0gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbXBvcnQubWV0YSwgXCJlbnZcIiwgeyB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgIGVudk9iamVjdFxuICAgICl9LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UgfSk7XFxuJHtuZXdTb3VyY2V9YDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVzdWx0LFxuICAgIHNvdXJjZTogbmV3U291cmNlLFxuICB9O1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7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