UNPKG

next-connect

Version:

The method routing and middleware layer for Next.js (and many others)

87 lines (86 loc) 2.86 kB
"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;