@netlify/vite-plugin
Version:
Vite plugin with a local emulation of the Netlify environment
79 lines (76 loc) • 2.78 kB
JavaScript
// 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
};