next-connect
Version:
The method routing and middleware layer for Next.js (and many others)
87 lines (86 loc) • 2.86 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createRouter = exports.getPathname = exports.NodeRouter = void 0;
const router_js_1 = require("./router.cjs");
class NodeRouter {
constructor() {
this.router = new router_js_1.Router();
this.all = this.add.bind(this, "");
this.get = this.add.bind(this, "GET");
this.head = this.add.bind(this, "HEAD");
this.post = this.add.bind(this, "POST");
this.put = this.add.bind(this, "PUT");
this.patch = this.add.bind(this, "PATCH");
this.delete = this.add.bind(this, "DELETE");
}
add(method, route, ...fns) {
this.router.add(method, route, ...fns);
return this;
}
use(base, ...fns) {
if (typeof base === "function" || base instanceof NodeRouter) {
fns.unshift(base);
base = "/";
}
this.router.use(base, ...fns.map((fn) => (fn instanceof NodeRouter ? fn.router : fn)));
return this;
}
prepareRequest(req, res, findResult) {
req.params = {
...findResult.params,
...req.params, // original params will take precedence
};
}
clone() {
const r = new NodeRouter();
r.router = this.router.clone();
return r;
}
async run(req, res) {
const result = this.router.find(req.method, getPathname(req.url));
if (!result.fns.length)
return;
this.prepareRequest(req, res, result);
return router_js_1.Router.exec(result.fns, req, res);
}
handler(options = {}) {
const onNoMatch = options.onNoMatch || onnomatch;
const onError = options.onError || onerror;
return async (req, res) => {
const result = this.router.find(req.method, getPathname(req.url));
this.prepareRequest(req, res, result);
try {
if (result.fns.length === 0 || result.middleOnly) {
await onNoMatch(req, res);
}
else {
await router_js_1.Router.exec(result.fns, req, res);
}
}
catch (err) {
await onError(err, req, res);
}
};
}
}
exports.NodeRouter = NodeRouter;
function onnomatch(req, res) {
res.statusCode = 404;
res.end(req.method !== "HEAD"
? `Route ${req.method} ${req.url} not found`
: undefined);
}
function onerror(err, req, res) {
res.statusCode = 500;
console.error(err);
res.end("Internal Server Error");
}
function getPathname(url) {
const queryIdx = url.indexOf("?");
return queryIdx !== -1 ? url.substring(0, queryIdx) : url;
}
exports.getPathname = getPathname;
function createRouter() {
return new NodeRouter();
}
exports.createRouter = createRouter;