vite-plugin-server-actions
Version:
Server actions for Vite - call backend functions directly from your frontend with automatic API generation, TypeScript support, and zero configuration
90 lines (79 loc) ⢠2.48 kB
JavaScript
import util from "util";
import { createValidationMiddleware } from "./validation.js";
/**
* Built-in logging middleware for server actions
* Logs the action being triggered and the request body with syntax highlighting
*/
export function loggingMiddleware(req, res, next) {
const timestamp = new Date().toISOString();
const method = req.method;
const url = req.url;
// Extract action name from URL (format: /api/module_name/functionName)
const urlParts = url.split("/");
const functionName = urlParts[urlParts.length - 1];
const moduleName = urlParts[urlParts.length - 2];
// Log action trigger
console.log(`\n[${timestamp}] š Server Action Triggered`);
console.log(`āā Module: ${moduleName}`);
console.log(`āā Function: ${functionName}`);
console.log(`āā Method: ${method}`);
console.log(`āā Endpoint: ${url}`);
// Log request body with syntax highlighting
if (req.body && Object.keys(req.body).length > 0) {
console.log("\nš¦ Request Body:");
// Use util.inspect for colored output
console.log(
util.inspect(req.body, {
colors: true,
depth: null,
compact: false,
}),
);
} else {
console.log("\nš¦ Request Body: (empty)");
}
// Track response time
const startTime = Date.now();
// Override res.json to log response
const originalJson = res.json.bind(res);
res.json = function (data) {
const duration = Date.now() - startTime;
console.log(`\nā
Response sent in ${duration}ms`);
if (data) {
console.log("š¤ Response data:");
console.log(
util.inspect(data, {
colors: true,
depth: null,
compact: false,
maxArrayLength: 10, // Limit array output
}),
);
}
console.log("ā".repeat(50));
return originalJson(data);
};
// Handle errors
const originalStatus = res.status.bind(res);
res.status = function (statusCode) {
if (statusCode >= 400) {
const duration = Date.now() - startTime;
console.log(`\nā Error response (${statusCode}) sent in ${duration}ms`);
}
return originalStatus(statusCode);
};
next();
}
/**
* Create validation middleware with custom options
* @param {object} options - Validation options
* @returns {function} Validation middleware
*/
export function createValidationMiddlewareWithOptions(options = {}) {
return createValidationMiddleware(options);
}
// Export a namespace for all built-in middleware
export const middleware = {
logging: loggingMiddleware,
validation: createValidationMiddleware,
};