UNPKG

vite-plugin-react-server

Version:
89 lines (86 loc) 12.7 kB
/** * 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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