UNPKG

@netlify/vite-plugin

Version:

Vite plugin with a local emulation of the Netlify environment

79 lines (76 loc) 2.78 kB
// src/main.ts import process from "process"; import { NetlifyDev } from "@netlify/dev"; import { fromWebResponse, netlifyCommand } from "@netlify/dev-utils"; // src/lib/logger.ts import { netlifyBanner } from "@netlify/dev-utils"; var createLoggerFromViteLogger = (viteLogger) => ({ error: (msg) => viteLogger.error(msg ?? "", { timestamp: true, environment: netlifyBanner }), log: (msg) => viteLogger.info(msg ?? "", { timestamp: true, environment: netlifyBanner }), warn: (msg) => viteLogger.warn(msg ?? "", { timestamp: true, environment: netlifyBanner }) }); // src/main.ts function netlify(options = {}) { if (process.env.NETLIFY_DEV) { return []; } const plugin = { name: "vite-plugin-netlify", async configureServer(viteDevServer) { if (!viteDevServer.httpServer) { return; } const logger = createLoggerFromViteLogger(viteDevServer.config.logger); const { blobs, edgeFunctions, functions, images, middleware = true, redirects, staticFiles } = options; const netlifyDev = new NetlifyDev({ blobs, edgeFunctions, functions, images, logger, redirects, serverAddress: null, staticFiles: { ...staticFiles, directories: [viteDevServer.config.root, viteDevServer.config.publicDir] }, projectRoot: viteDevServer.config.root }); await netlifyDev.start(); viteDevServer.httpServer.once("close", () => { netlifyDev.stop(); }); logger.log("Environment loaded"); if (middleware) { viteDevServer.middlewares.use(async function netlifyPreMiddleware(nodeReq, nodeRes, next) { const headers = {}; const result = await netlifyDev.handleAndIntrospectNodeRequest(nodeReq, { headersCollector: (key, value) => { headers[key] = value; }, serverAddress: `http://localhost:${nodeReq.socket.localPort}` }); const isStaticFile = result?.type === "static"; if (result && !isStaticFile) { fromWebResponse(result.response, nodeRes); return; } for (const key in headers) { nodeRes.setHeader(key, headers[key]); } next(); }); logger.log(`Middleware loaded. Emulating features: ${netlifyDev.getEnabledFeatures().join(", ")}.`); } if (!netlifyDev.siteIsLinked) { logger.log( `\u{1F4AD} Linking this project to a Netlify site lets you deploy your site, use any environment variables defined on your team and site and much more. Run ${netlifyCommand("npx netlify init")} to get started.` ); } } }; return [plugin]; } export { netlify as default };