@tinyhttp/app 2.2.2 → 2.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts +7 -8
- package/dist/app.d.ts.map +1 -1
- package/dist/extend.d.ts +4 -3
- package/dist/extend.d.ts.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -65
- package/dist/index.js.map +1 -1
- package/dist/onError.d.ts +5 -4
- package/dist/onError.d.ts.map +1 -1
- package/dist/request.d.ts +8 -11
- package/dist/request.d.ts.map +1 -1
- package/dist/response.d.ts +5 -5
- package/dist/response.d.ts.map +1 -1
- package/dist/types.d.ts +6 -5
- package/dist/view.d.ts +2 -9
- package/dist/view.d.ts.map +1 -1
- package/package.json +7 -7
package/dist/app.d.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
1
|
import { Server } from 'node:http';
|
|
3
|
-
import
|
|
4
|
-
import type { Response } from './response.js';
|
|
5
|
-
import type { ErrorHandler } from './onError.js';
|
|
6
|
-
import type { Middleware, Handler, NextFunction, UseMethodParams } from '@tinyhttp/router';
|
|
7
|
-
import { Router } from '@tinyhttp/router';
|
|
8
|
-
import { AppConstructor, AppRenderOptions, AppSettings, TemplateEngine } from './types.js';
|
|
2
|
+
import { Handler, Middleware, NextFunction, UseMethodParams, Router } from '@tinyhttp/router';
|
|
9
3
|
import { TemplateEngineOptions } from './index.js';
|
|
4
|
+
import { ErrorHandler } from './onError.js';
|
|
5
|
+
import { Request } from './request.js';
|
|
6
|
+
import { Response } from './response.js';
|
|
7
|
+
import { AppConstructor, AppRenderOptions, AppSettings, TemplateEngine } from './types.js';
|
|
8
|
+
|
|
10
9
|
/**
|
|
11
10
|
* `App` class - the starting point of tinyhttp app.
|
|
12
11
|
*
|
|
@@ -86,7 +85,7 @@ export declare class App<Req extends Request = Request, Res extends Response = R
|
|
|
86
85
|
* @param options Template engine options
|
|
87
86
|
* @param cb Callback that consumes error and html
|
|
88
87
|
*/
|
|
89
|
-
render<RenderOptions extends TemplateEngineOptions = TemplateEngineOptions>(name: string, data
|
|
88
|
+
render<RenderOptions extends TemplateEngineOptions = TemplateEngineOptions>(name: string, data?: Record<string, unknown>, options?: AppRenderOptions<RenderOptions>, cb?: (err: unknown, html?: unknown) => void): void;
|
|
90
89
|
use(...args: UseMethodParams<Req, Res, App>): this;
|
|
91
90
|
route(path: string): App;
|
|
92
91
|
/**
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/extend.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { NextFunction } from '@tinyhttp/router';
|
|
3
|
-
import type { Response } from './response.js';
|
|
1
|
+
import { NextFunction } from '@tinyhttp/router';
|
|
4
2
|
import { App } from './app.js';
|
|
3
|
+
import { Request } from './request.js';
|
|
4
|
+
import { Response } from './response.js';
|
|
5
5
|
import { TemplateEngineOptions } from './types.js';
|
|
6
|
+
|
|
6
7
|
/**
|
|
7
8
|
* Extends Request and Response objects with custom properties and methods
|
|
8
9
|
*/
|
package/dist/extend.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,cAAc,CAAA;AAE1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEvD;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC1B,aAAa,SAAS,qBAAqB,+BAA+B,GAAG,WACxE,OAAO,OAAO,QAAQ,CAAC,aAAa,CAAC,QAAQ,YAAY,KAAG,IAsDjE,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { Middleware, NextFunction, AsyncHandler as RAsyncHandler, Handler as RHandler, SyncHandler as RSyncHandler } from '@tinyhttp/router';
|
|
2
|
+
import { Request } from './request.js';
|
|
3
|
+
import { Response } from './response.js';
|
|
1
4
|
export { App } from './app.js';
|
|
2
5
|
export * from './request.js';
|
|
3
6
|
export * from './response.js';
|
|
@@ -5,9 +8,6 @@ export { extendMiddleware } from './extend.js';
|
|
|
5
8
|
export { onErrorHandler, type ErrorHandler } from './onError.js';
|
|
6
9
|
export { View } from './view.js';
|
|
7
10
|
export type { AppSettings, TemplateEngineOptions, TemplateEngine, AppConstructor } from './types.js';
|
|
8
|
-
import type { Request } from './request.js';
|
|
9
|
-
import type { Response } from './response.js';
|
|
10
|
-
import type { NextFunction, Handler as RHandler, AsyncHandler as RAsyncHandler, SyncHandler as RSyncHandler, Middleware } from '@tinyhttp/router';
|
|
11
11
|
export type Handler = RHandler<Request, Response>;
|
|
12
12
|
export type AsyncHandler = RAsyncHandler<Request, Response>;
|
|
13
13
|
export type SyncHandler = RSyncHandler<Request, Response>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEpG,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEpG,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,YAAY,IAAI,aAAa,EAC7B,OAAO,IAAI,QAAQ,EACnB,WAAW,IAAI,YAAY,EAC5B,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACjD,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AAC3D,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACzD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,33 +1,29 @@
|
|
|
1
1
|
import { STATUS_CODES, createServer } from "node:http";
|
|
2
|
-
import { proxyaddr, all, compile } from "@tinyhttp/proxy-addr";
|
|
3
|
-
import { isIP } from "node:net";
|
|
4
2
|
import { getRequestHeader, getQueryParams, getRangeFromHeader, getAccepts, getAcceptsCharsets, getAcceptsEncodings, getAcceptsLanguages, checkIfXMLHttpRequest, getFreshOrStale, getPathname, getURLParams } from "@tinyhttp/req";
|
|
5
3
|
import { getURLParams as getURLParams2 } from "@tinyhttp/req";
|
|
6
4
|
import { Router, pushMiddleware } from "@tinyhttp/router";
|
|
7
|
-
import { getResponseHeader, setHeader, send, json, status, sendStatus, sendFile, setContentType, setLocationHeader, setLinksHeader, setVaryHeader, setCookie, clearCookie, formatResponse, redirect, attachment, download, append } from "@tinyhttp/res";
|
|
8
5
|
import { parse } from "regexparam";
|
|
9
|
-
import {
|
|
6
|
+
import { getResponseHeader, setHeader, send, json, status, sendStatus, sendFile, setContentType, setLocationHeader, setLinksHeader, setVaryHeader, setCookie, clearCookie, formatResponse, redirect, attachment, download, append } from "@tinyhttp/res";
|
|
7
|
+
import { proxyaddr, all, compile } from "@tinyhttp/proxy-addr";
|
|
8
|
+
import { isIP } from "node:net";
|
|
10
9
|
import { statSync } from "node:fs";
|
|
10
|
+
import { extname, resolve, dirname, basename, join } from "node:path";
|
|
11
11
|
const trustRemoteAddress = ({ socket }) => {
|
|
12
12
|
const val = socket.remoteAddress;
|
|
13
|
-
if (typeof val === "string")
|
|
14
|
-
return compile(val.split(",").map((x) => x.trim()));
|
|
13
|
+
if (typeof val === "string") return compile(val.split(",").map((x) => x.trim()));
|
|
15
14
|
return compile(val || []);
|
|
16
15
|
};
|
|
17
16
|
const getProtocol = (req) => {
|
|
18
17
|
const proto = `http${req.secure ? "s" : ""}`;
|
|
19
|
-
if (!trustRemoteAddress(req))
|
|
20
|
-
return proto;
|
|
18
|
+
if (!trustRemoteAddress(req)) return proto;
|
|
21
19
|
const header = req.headers["X-Forwarded-Proto"] || proto;
|
|
22
20
|
const index = header.indexOf(",");
|
|
23
21
|
return index !== -1 ? header.substring(0, index).trim() : header.trim();
|
|
24
22
|
};
|
|
25
23
|
const getHostname = (req) => {
|
|
26
24
|
let host = req.get("X-Forwarded-Host");
|
|
27
|
-
if (!host || !trustRemoteAddress(req))
|
|
28
|
-
|
|
29
|
-
if (!host)
|
|
30
|
-
return;
|
|
25
|
+
if (!host || !trustRemoteAddress(req)) host = req.get("Host");
|
|
26
|
+
if (!host) return;
|
|
31
27
|
const index = host.indexOf(":", host[0] === "[" ? host.indexOf("]") + 1 : 0);
|
|
32
28
|
return index !== -1 ? host.substring(0, index) : host;
|
|
33
29
|
};
|
|
@@ -35,28 +31,13 @@ const getIP = (req) => proxyaddr(req, trustRemoteAddress(req)).replace(/^.*:/, "
|
|
|
35
31
|
const getIPs = (req) => all(req, trustRemoteAddress(req));
|
|
36
32
|
const getSubdomains = (req, subdomainOffset = 2) => {
|
|
37
33
|
const hostname = getHostname(req);
|
|
38
|
-
if (!hostname)
|
|
39
|
-
return [];
|
|
34
|
+
if (!hostname) return [];
|
|
40
35
|
const subdomains = isIP(hostname) ? [hostname] : hostname.split(".").reverse();
|
|
41
36
|
return subdomains.slice(subdomainOffset);
|
|
42
37
|
};
|
|
43
|
-
const onErrorHandler = function(err, _req, res) {
|
|
44
|
-
if (this.onError === onErrorHandler && this.parent)
|
|
45
|
-
return this.parent.onError(err, _req, res);
|
|
46
|
-
if (err instanceof Error)
|
|
47
|
-
console.error(err);
|
|
48
|
-
const code = err.code in STATUS_CODES ? err.code : err.status;
|
|
49
|
-
if (typeof err === "string" || Buffer.isBuffer(err))
|
|
50
|
-
res.writeHead(500).end(err);
|
|
51
|
-
else if (code in STATUS_CODES)
|
|
52
|
-
res.writeHead(code).end(STATUS_CODES[code]);
|
|
53
|
-
else
|
|
54
|
-
res.writeHead(500).end(err.message);
|
|
55
|
-
};
|
|
56
38
|
const renderTemplate = (_req, res, app) => (file, data, options) => {
|
|
57
39
|
app.render(file, data ? { ...res.locals, ...data } : res.locals, options, (err, html) => {
|
|
58
|
-
if (err)
|
|
59
|
-
throw err;
|
|
40
|
+
if (err) throw err;
|
|
60
41
|
res.send(html);
|
|
61
42
|
});
|
|
62
43
|
return res;
|
|
@@ -107,6 +88,14 @@ const extendMiddleware = (app) => (req, res, next) => {
|
|
|
107
88
|
req.stale = !req.fresh;
|
|
108
89
|
next();
|
|
109
90
|
};
|
|
91
|
+
const onErrorHandler = function(err, _req, res) {
|
|
92
|
+
if (this.onError === onErrorHandler && this.parent) return this.parent.onError(err, _req, res);
|
|
93
|
+
if (err instanceof Error) console.error(err);
|
|
94
|
+
const code = err.code in STATUS_CODES ? err.code : err.status;
|
|
95
|
+
if (typeof err === "string" || Buffer.isBuffer(err)) res.writeHead(500).end(err);
|
|
96
|
+
else if (code in STATUS_CODES) res.writeHead(code).end(STATUS_CODES[code]);
|
|
97
|
+
else res.writeHead(500).end(err.message);
|
|
98
|
+
};
|
|
110
99
|
function tryStat(path) {
|
|
111
100
|
try {
|
|
112
101
|
return statSync(path);
|
|
@@ -124,11 +113,10 @@ class View {
|
|
|
124
113
|
throw new Error("No default engine was specified and no extension was provided.");
|
|
125
114
|
let fileName = name;
|
|
126
115
|
if (!this.ext) {
|
|
127
|
-
this.ext = this.defaultEngine[0] !== "." ?
|
|
116
|
+
this.ext = this.defaultEngine[0] !== "." ? `.${this.defaultEngine}` : this.defaultEngine;
|
|
128
117
|
fileName += this.ext;
|
|
129
118
|
}
|
|
130
|
-
if (!opts.engines[this.ext])
|
|
131
|
-
throw new Error(`No engine was found for ${this.ext}`);
|
|
119
|
+
if (!opts.engines[this.ext]) throw new Error(`No engine was found for ${this.ext}`);
|
|
132
120
|
this.engine = opts.engines[this.ext];
|
|
133
121
|
this.path = this.#lookup(fileName);
|
|
134
122
|
}
|
|
@@ -148,12 +136,12 @@ class View {
|
|
|
148
136
|
const ext = this.ext;
|
|
149
137
|
let path = join(dir, file);
|
|
150
138
|
let stat = tryStat(path);
|
|
151
|
-
if (stat
|
|
139
|
+
if (stat == null ? void 0 : stat.isFile()) {
|
|
152
140
|
return path;
|
|
153
141
|
}
|
|
154
|
-
path = join(dir, basename(file, ext),
|
|
142
|
+
path = join(dir, basename(file, ext), `index${ext}`);
|
|
155
143
|
stat = tryStat(path);
|
|
156
|
-
if (stat
|
|
144
|
+
if (stat == null ? void 0 : stat.isFile()) {
|
|
157
145
|
return path;
|
|
158
146
|
}
|
|
159
147
|
}
|
|
@@ -161,14 +149,13 @@ class View {
|
|
|
161
149
|
this.engine(this.path, data, options, cb);
|
|
162
150
|
}
|
|
163
151
|
}
|
|
164
|
-
const lead = (x) => x.charCodeAt(0) === 47 ? x :
|
|
152
|
+
const lead = (x) => x.charCodeAt(0) === 47 ? x : `/${x}`;
|
|
165
153
|
const mount = (fn) => fn instanceof App ? fn.attach : fn;
|
|
166
154
|
const applyHandler = (h) => async (req, res, next) => {
|
|
167
155
|
try {
|
|
168
156
|
if (h[Symbol.toStringTag] === "AsyncFunction") {
|
|
169
157
|
await h(req, res, next);
|
|
170
|
-
} else
|
|
171
|
-
h(req, res, next);
|
|
158
|
+
} else h(req, res, next);
|
|
172
159
|
} catch (e) {
|
|
173
160
|
next(e);
|
|
174
161
|
}
|
|
@@ -253,28 +240,27 @@ class App extends Router {
|
|
|
253
240
|
* @param options Template engine options
|
|
254
241
|
* @param cb Callback that consumes error and html
|
|
255
242
|
*/
|
|
256
|
-
render(name, data = {}, options = {}, cb) {
|
|
243
|
+
render(name, data = {}, options = {}, cb = () => {
|
|
244
|
+
}) {
|
|
257
245
|
let view;
|
|
258
246
|
const { _locals, ...opts } = options;
|
|
259
247
|
let locals = this.locals;
|
|
260
|
-
if (_locals)
|
|
261
|
-
locals = { ...locals, ..._locals };
|
|
248
|
+
if (_locals) locals = { ...locals, ..._locals };
|
|
262
249
|
locals = { ...locals, ...data };
|
|
263
|
-
if (opts.cache == null)
|
|
264
|
-
opts.cache = this.enabled("view cache");
|
|
250
|
+
if (opts.cache == null) opts.cache = this.enabled("view cache");
|
|
265
251
|
if (opts.cache) {
|
|
266
252
|
view = this.cache[name];
|
|
267
253
|
}
|
|
268
254
|
if (!view) {
|
|
269
|
-
const View2 = this.settings
|
|
255
|
+
const View2 = this.settings.view;
|
|
270
256
|
view = new View2(name, {
|
|
271
257
|
defaultEngine: this.settings["view engine"],
|
|
272
258
|
root: this.settings.views,
|
|
273
259
|
engines: this.engines
|
|
274
260
|
});
|
|
275
261
|
if (!view.path) {
|
|
276
|
-
const dirs = Array.isArray(view.root) && view.root.length > 1 ?
|
|
277
|
-
const err = new Error(
|
|
262
|
+
const dirs = Array.isArray(view.root) && view.root.length > 1 ? `directories "${view.root.slice(0, -1).join('", "')}" or "${view.root[view.root.length - 1]}"` : `directory "${view.root}"`;
|
|
263
|
+
const err = new Error(`Failed to lookup view "${name}" in views ${dirs}`);
|
|
278
264
|
return cb(err);
|
|
279
265
|
}
|
|
280
266
|
if (opts.cache) {
|
|
@@ -288,6 +274,7 @@ class App extends Router {
|
|
|
288
274
|
}
|
|
289
275
|
}
|
|
290
276
|
use(...args) {
|
|
277
|
+
var _a;
|
|
291
278
|
const base = args[0];
|
|
292
279
|
const fns = args.slice(1).flat();
|
|
293
280
|
let pathArray = [];
|
|
@@ -295,10 +282,8 @@ class App extends Router {
|
|
|
295
282
|
fns.unshift(base);
|
|
296
283
|
} else {
|
|
297
284
|
let basePaths = [];
|
|
298
|
-
if (Array.isArray(base))
|
|
299
|
-
|
|
300
|
-
else if (typeof base === "string")
|
|
301
|
-
basePaths = [base];
|
|
285
|
+
if (Array.isArray(base)) basePaths = [...base];
|
|
286
|
+
else if (typeof base === "string") basePaths = [base];
|
|
302
287
|
basePaths = basePaths.filter((element) => {
|
|
303
288
|
if (typeof element === "string") {
|
|
304
289
|
pathArray.push(element);
|
|
@@ -313,16 +298,15 @@ class App extends Router {
|
|
|
313
298
|
let regex;
|
|
314
299
|
for (const fn of fns) {
|
|
315
300
|
if (fn instanceof App) {
|
|
316
|
-
|
|
301
|
+
for (const path of pathArray) {
|
|
317
302
|
regex = parse(path, true);
|
|
318
303
|
fn.mountpath = mountpath;
|
|
319
304
|
this.apps[path] = fn;
|
|
320
305
|
fn.parent = this;
|
|
321
|
-
}
|
|
306
|
+
}
|
|
322
307
|
}
|
|
323
308
|
}
|
|
324
|
-
|
|
325
|
-
var _a;
|
|
309
|
+
for (const path of pathArray) {
|
|
326
310
|
const handlerPaths = [];
|
|
327
311
|
const handlerFunctions = [];
|
|
328
312
|
const handlerPathBase = path === "/" ? "" : lead(path);
|
|
@@ -345,7 +329,7 @@ class App extends Router {
|
|
|
345
329
|
handlers: handlerFunctions.slice(1).map(mount),
|
|
346
330
|
fullPaths: handlerPaths
|
|
347
331
|
});
|
|
348
|
-
}
|
|
332
|
+
}
|
|
349
333
|
return this;
|
|
350
334
|
}
|
|
351
335
|
route(path) {
|
|
@@ -368,8 +352,7 @@ class App extends Router {
|
|
|
368
352
|
*/
|
|
369
353
|
handler(req, res, next) {
|
|
370
354
|
const { xPoweredBy } = this.settings;
|
|
371
|
-
if (xPoweredBy)
|
|
372
|
-
res.setHeader("X-Powered-By", typeof xPoweredBy === "string" ? xPoweredBy : "tinyhttp");
|
|
355
|
+
if (xPoweredBy) res.setHeader("X-Powered-By", typeof xPoweredBy === "string" ? xPoweredBy : "tinyhttp");
|
|
373
356
|
const exts = this.applyExtensions || extendMiddleware(this);
|
|
374
357
|
req.originalUrl = req.url || req.originalUrl;
|
|
375
358
|
const pathname = getPathname(req.originalUrl);
|
|
@@ -408,10 +391,8 @@ class App extends Router {
|
|
|
408
391
|
params = regex ? getURLParams(regex, pathname) : {};
|
|
409
392
|
} catch (e) {
|
|
410
393
|
console.error(e);
|
|
411
|
-
if (e instanceof URIError)
|
|
412
|
-
|
|
413
|
-
else
|
|
414
|
-
throw e;
|
|
394
|
+
if (e instanceof URIError) return res2.sendStatus(400);
|
|
395
|
+
throw e;
|
|
415
396
|
}
|
|
416
397
|
let prefix = path;
|
|
417
398
|
if (regex) {
|
|
@@ -427,10 +408,8 @@ class App extends Router {
|
|
|
427
408
|
if (mw2.type === "mw") {
|
|
428
409
|
req2.url = lead(req2.originalUrl.substring(prefix.length));
|
|
429
410
|
}
|
|
430
|
-
if (!req2.path)
|
|
431
|
-
|
|
432
|
-
if ((_a = this.settings) == null ? void 0 : _a.enableReqRoute)
|
|
433
|
-
req2.route = mw2;
|
|
411
|
+
if (!req2.path) req2.path = getPathname(req2.url);
|
|
412
|
+
if ((_a = this.settings) == null ? void 0 : _a.enableReqRoute) req2.route = mw2;
|
|
434
413
|
await applyHandler(handler)(req2, res2, next2);
|
|
435
414
|
};
|
|
436
415
|
let idx = 0;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/request.ts","../src/onError.ts","../src/response.ts","../src/extend.ts","../src/view.ts","../src/app.ts"],"sourcesContent":["import { IncomingMessage } from 'node:http'\nimport type { ParsedUrlQuery } from 'node:querystring'\n\nimport { Options, Ranges } from 'header-range-parser'\nimport { proxyaddr as proxyAddr, all, compile } from '@tinyhttp/proxy-addr'\n\nimport { App } from './app.js'\nimport type { Middleware } from '@tinyhttp/router'\n\nimport type { URLParams } from '@tinyhttp/req'\nimport { isIP } from 'node:net'\nimport type { Socket } from 'node:net'\nimport type { TLSSocket } from 'node:tls'\n\nexport { getURLParams } from '@tinyhttp/req'\n\nconst trustRemoteAddress = ({ socket }: Pick<Request, 'headers' | 'socket'>) => {\n const val = socket.remoteAddress\n if (typeof val === 'string') return compile(val.split(',').map((x) => x.trim()))\n return compile(val || [])\n}\n\nexport const getProtocol = (req: Request): Protocol => {\n const proto = `http${req.secure ? 's' : ''}`\n\n if (!trustRemoteAddress(req)) return proto\n\n const header = (req.headers['X-Forwarded-Proto'] as string) || proto\n\n const index = header.indexOf(',')\n\n return index !== -1 ? header.substring(0, index).trim() : header.trim()\n}\n\nexport const getHostname = (req: Request): string | undefined => {\n let host: string = req.get('X-Forwarded-Host') as string\n\n if (!host || !trustRemoteAddress(req)) host = req.get('Host') as string\n\n if (!host) return\n\n // IPv6 literal support\n const index = host.indexOf(':', host[0] === '[' ? host.indexOf(']') + 1 : 0)\n\n return index !== -1 ? host.substring(0, index) : host\n}\n\nexport const getIP = (req: Pick<Request, 'headers' | 'connection' | 'socket'>): string | undefined =>\n proxyAddr(req, trustRemoteAddress(req)).replace(/^.*:/, '') // striping the redundant prefix addeded by OS to IPv4 address\n\nexport const getIPs = (req: Pick<Request, 'headers' | 'connection' | 'socket'>): string[] | undefined =>\n all(req, trustRemoteAddress(req))\n\nexport const getSubdomains = (req: Request, subdomainOffset = 2): string[] => {\n const hostname = getHostname(req)\n\n if (!hostname) return []\n\n const subdomains = isIP(hostname) ? [hostname] : hostname.split('.').reverse()\n\n return subdomains.slice(subdomainOffset)\n}\n\nexport type Connection = IncomingMessage['socket'] & {\n encrypted: boolean\n}\n\nexport type Protocol = 'http' | 'https' | string\n\nexport type { URLParams }\n\ntype AcceptsReturns = string | boolean | string[]\n\nexport interface Request extends IncomingMessage {\n originalUrl: string\n path: string\n url: string\n query: ParsedUrlQuery\n params: URLParams\n connection: Connection\n socket: TLSSocket | Socket\n route?: Middleware\n protocol: Protocol\n secure: boolean\n xhr: boolean\n hostname?: string\n ip?: string\n ips?: string[]\n subdomains?: string[]\n get: (header: string) => string | string[] | undefined\n range: (size: number, options?: Options) => -1 | -2 | -3 | Ranges | undefined\n accepts: (...types: string[]) => AcceptsReturns\n acceptsEncodings: (...encodings: string[]) => AcceptsReturns\n acceptsCharsets: (...charsets: string[]) => AcceptsReturns\n acceptsLanguages: (...languages: string[]) => AcceptsReturns\n is: (...types: string[]) => boolean\n cookies?: any\n signedCookies?: any\n secret?: string | string[]\n fresh?: boolean\n stale?: boolean\n body?: any\n app?: App\n}\n","import type { NextFunction } from '@tinyhttp/router'\nimport { STATUS_CODES } from 'node:http'\nimport type { Request } from './request.js'\nimport type { Response } from './response.js'\nimport type { App } from './app.js'\n\nexport type ErrorHandler = (this: App, err: any, req: Request, res: Response, next?: NextFunction) => void\n\nexport const onErrorHandler: ErrorHandler = function (this: App, err: any, _req: Request, res: Response) {\n if (this.onError === onErrorHandler && this.parent) return this.parent.onError(err, _req, res)\n\n if (err instanceof Error) console.error(err)\n\n const code = err.code in STATUS_CODES ? err.code : err.status\n\n if (typeof err === 'string' || Buffer.isBuffer(err)) res.writeHead(500).end(err)\n else if (code in STATUS_CODES) res.writeHead(code).end(STATUS_CODES[code])\n else res.writeHead(500).end(err.message)\n}\n","import { ServerResponse } from 'node:http'\nimport type { SerializeOptions } from '@tinyhttp/cookie'\nimport { Request } from './request.js'\nimport { App } from './app.js'\nimport type { ReadStreamOptions, FormatProps, DownloadOptions } from '@tinyhttp/res'\nimport type { AppRenderOptions, TemplateEngineOptions } from './types.js'\n\nexport const renderTemplate =\n <O extends TemplateEngineOptions = TemplateEngineOptions>(_req: Request, res: Response, app: App) =>\n (file: string, data?: Record<string, unknown>, options?: AppRenderOptions<O>): Response => {\n app.render(file, data ? { ...res.locals, ...data } : res.locals, options, (err: unknown, html: unknown) => {\n if (err) throw err\n res.send(html)\n })\n return res\n }\n\nexport interface Response<B = unknown> extends ServerResponse {\n header(field: string | Record<string, unknown>, val?: string | any[]): Response<B>\n set(field: string | Record<string, unknown>, val?: string | any[]): Response<B>\n get(field: string): string | number | string[]\n send(body: B): Response<B>\n sendFile(path: string, options?: ReadStreamOptions, cb?: (err?: unknown) => void): Response<B>\n json(body: B): Response<B>\n status(status: number): Response<B>\n sendStatus(statusCode: number): Response<B>\n cookie(\n name: string,\n value: string | Record<string, unknown>,\n options?: SerializeOptions & Partial<{ signed: boolean }>\n ): Response<B>\n clearCookie(name: string, options?: SerializeOptions): Response<B>\n location(url: string): Response<B>\n links(links: { [key: string]: string }): Response<B>\n render<O extends TemplateEngineOptions = TemplateEngineOptions>(\n file: string,\n data?: Record<string, any>,\n options?: AppRenderOptions<O>\n ): Response<B>\n vary(field: string): Response<B>\n format(obj: FormatProps): Response<B>\n redirect(url: string, status?: number): Response<B>\n type(type: string): Response<B>\n download(path: string, filename: string, options?: DownloadOptions, cb?: (err?: unknown) => void): Response<B>\n attachment(filename?: string): Response<B>\n app?: App\n locals: Record<string, any>\n /**\n * Send JSON response with JSONP callback support.\n *\n * To enable this method, install the `@tinyhttp/jsonp` package and attach the method to `res.jsonp` property.\n *\n * @param obj Response object\n */\n jsonp(obj: any): Response<B>\n\n append(field: string, value: any): Response<B>\n}\n","import { getSubdomains, Request } from './request.js'\nimport type { NextFunction } from '@tinyhttp/router'\nimport type { Response } from './response.js'\nimport {\n getFreshOrStale,\n getRangeFromHeader,\n getRequestHeader,\n checkIfXMLHttpRequest,\n getQueryParams,\n getAccepts,\n getAcceptsCharsets,\n getAcceptsEncodings,\n getAcceptsLanguages\n} from '@tinyhttp/req'\nimport { getProtocol, getHostname, getIP, getIPs } from './request.js'\nimport {\n send,\n json,\n status,\n setCookie,\n clearCookie,\n setHeader,\n getResponseHeader,\n setLocationHeader,\n setLinksHeader,\n sendStatus,\n setVaryHeader,\n sendFile,\n formatResponse,\n redirect,\n setContentType,\n attachment,\n download,\n append\n} from '@tinyhttp/res'\nimport { renderTemplate } from './response.js'\nimport { App } from './app.js'\nimport { TemplateEngineOptions } from './types.js'\n\n/**\n * Extends Request and Response objects with custom properties and methods\n */\nexport const extendMiddleware =\n <EngineOptions extends TemplateEngineOptions = TemplateEngineOptions>(app: App) =>\n (req: Request, res: Response<EngineOptions>, next: NextFunction): void => {\n const { settings } = app\n\n res.get = getResponseHeader(res)\n req.get = getRequestHeader(req)\n\n if (settings?.bindAppToReqRes) {\n req.app = app\n res.app = app\n }\n\n if (settings?.networkExtensions) {\n req.protocol = getProtocol(req)\n req.secure = req.protocol === 'https'\n req.hostname = getHostname(req)\n req.subdomains = getSubdomains(req, settings.subdomainOffset)\n req.ip = getIP(req)\n req.ips = getIPs(req)\n }\n\n req.query = getQueryParams(req.url)\n\n req.range = getRangeFromHeader(req)\n req.accepts = getAccepts(req)\n req.acceptsCharsets = getAcceptsCharsets(req)\n req.acceptsEncodings = getAcceptsEncodings(req)\n req.acceptsLanguages = getAcceptsLanguages(req)\n\n req.xhr = checkIfXMLHttpRequest(req)\n\n res.header = res.set = setHeader<Response>(res)\n res.send = send<Request, Response>(req, res)\n res.json = json<Response>(res)\n res.status = status<Response>(res)\n res.sendStatus = sendStatus<Request, Response>(req, res)\n res.sendFile = sendFile<Request, Response>(req, res)\n res.type = setContentType<Response>(res)\n res.location = setLocationHeader<Request, Response>(req, res)\n res.links = setLinksHeader<Response>(res)\n res.vary = setVaryHeader<Response>(res)\n res.cookie = setCookie<Request, Response>(req, res)\n res.clearCookie = clearCookie<Request, Response>(req, res)\n res.render = renderTemplate(req, res, app)\n res.format = formatResponse(req, res, next)\n res.redirect = redirect(req, res, next)\n res.attachment = attachment<Response>(res)\n res.download = download<Request, Response>(req, res)\n res.append = append<Response>(res)\n res.locals = res.locals || Object.create(null)\n\n Object.defineProperty(req, 'fresh', { get: getFreshOrStale.bind(null, req, res), configurable: true })\n req.stale = !req.fresh\n\n next()\n }\n","/*!\n * Ported from https://github.com/expressjs/express/blob/master/lib/view.js\n * express\n * Copyright(c) 2009-2013 TJ Holowaychuk\n * Copyright(c) 2013 Roman Shtylman\n * Copyright(c) 2014-2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\nimport { extname, resolve, dirname, basename, join } from 'node:path'\nimport { TemplateEngineOptions, TemplateEngine } from './types.js'\nimport { statSync } from 'node:fs'\n\nfunction tryStat(path: string) {\n try {\n return statSync(path)\n } catch (e) {\n return undefined\n }\n}\n\n/**\n * Initialize a new `View` with the given `name`.\n *\n * Options:\n *\n * - `defaultEngine` the default template engine name\n * - `engines` template engine require() cache\n * - `root` root path for view lookup\n *\n * @param name\n * @param options\n * @public\n */\n\nexport class View<RenderOptions extends TemplateEngineOptions = TemplateEngineOptions> {\n ext: string\n defaultEngine: string\n name: string\n engine: TemplateEngine<RenderOptions>\n path: string\n root: string | string[]\n constructor(\n name: string,\n opts: Partial<{\n defaultEngine: string\n root: string | string[]\n engines: Record<string, TemplateEngine<RenderOptions>>\n }> = {}\n ) {\n this.ext = extname(name)\n this.name = name\n this.root = opts.root\n this.defaultEngine = opts.defaultEngine\n\n if (!this.ext && !this.defaultEngine)\n throw new Error('No default engine was specified and no extension was provided.')\n\n let fileName = name\n\n if (!this.ext) {\n // get extension from default engine name\n this.ext = this.defaultEngine[0] !== '.' ? '.' + this.defaultEngine : this.defaultEngine\n\n fileName += this.ext\n }\n\n if (!opts.engines[this.ext]) throw new Error(`No engine was found for ${this.ext}`)\n\n this.engine = opts.engines[this.ext]\n this.path = this.#lookup(fileName)\n }\n #lookup(name: string) {\n let path: string\n const roots = [].concat(this.root)\n\n for (let i = 0; i < roots.length && !path; i++) {\n const root = roots[i]\n // resolve the path\n const loc = resolve(root, name)\n const dir = dirname(loc)\n const file = basename(loc)\n\n // resolve the file\n path = this.#resolve(dir, file)\n }\n\n return path\n }\n #resolve(dir: string, file: string) {\n const ext = this.ext\n\n // <path>.<ext>\n let path = join(dir, file)\n let stat = tryStat(path)\n\n if (stat && stat.isFile()) {\n return path\n }\n\n // <path>/index.<ext>\n path = join(dir, basename(file, ext), 'index' + ext)\n stat = tryStat(path)\n\n if (stat && stat.isFile()) {\n return path\n }\n }\n render(options: RenderOptions, data: Record<string, unknown>, cb: (err: Error | null, html: unknown) => void) {\n this.engine(this.path, data, options, cb)\n }\n}\n","import { createServer, Server } from 'node:http'\nimport { getURLParams } from './request.js'\nimport type { Request, URLParams } from './request.js'\nimport type { Response } from './response.js'\nimport type { ErrorHandler } from './onError.js'\nimport { onErrorHandler } from './onError.js'\nimport type { Middleware, Handler, NextFunction, UseMethodParams } from '@tinyhttp/router'\nimport { Router, pushMiddleware } from '@tinyhttp/router'\nimport { extendMiddleware } from './extend.js'\nimport { parse as rg } from 'regexparam'\nimport { getPathname } from '@tinyhttp/req'\nimport { AppConstructor, AppRenderOptions, AppSettings, TemplateEngine } from './types.js'\nimport { TemplateEngineOptions } from './index.js'\nimport { View } from './view.js'\n\n/**\n * Add leading slash if not present (e.g. path -> /path, /path -> /path)\n * @param x\n */\nconst lead = (x: string) => (x.charCodeAt(0) === 47 ? x : '/' + x)\n\nconst mount = (fn: App | Handler) => (fn instanceof App ? fn.attach : fn)\n\nconst applyHandler =\n <Req, Res>(h: Handler<Req, Res>) =>\n async (req: Req, res: Res, next?: NextFunction) => {\n try {\n if (h[Symbol.toStringTag] === 'AsyncFunction') {\n await h(req, res, next)\n } else h(req, res, next)\n } catch (e) {\n next(e)\n }\n }\n\n/**\n * `App` class - the starting point of tinyhttp app.\n *\n * With the `App` you can:\n * * use routing methods and `.use(...)`\n * * set no match (404) and error (500) handlers\n * * configure template engines\n * * store data in locals\n * * listen the http server on a specified port\n *\n * In case you use TypeScript, you can pass custom types to this class because it is also a generic class.\n *\n * Example:\n *\n * ```ts\n * interface CoolReq extends Request {\n * genericsAreDope: boolean\n * }\n *\n * const app = App<any, CoolReq, Response>()\n * ```\n */\nexport class App<Req extends Request = Request, Res extends Response = Response> extends Router<App, Req, Res> {\n middleware: Middleware<Req, Res>[] = []\n locals: Record<string, unknown> = {}\n noMatchHandler: Handler\n onError: ErrorHandler\n settings: AppSettings\n engines: Record<string, TemplateEngine> = {}\n applyExtensions: (req: Request, res: Response, next: NextFunction) => void\n attach: (req: Req, res: Res) => void\n cache: Record<string, unknown>\n\n constructor(options: AppConstructor<Req, Res> = {}) {\n super()\n this.onError = options?.onError || onErrorHandler\n this.noMatchHandler = options?.noMatchHandler || this.onError.bind(this, { code: 404 })\n this.settings = {\n view: View,\n xPoweredBy: true,\n views: `${process.cwd()}/views`,\n 'view cache': process.env.NODE_ENV === 'production',\n ...options.settings\n }\n this.applyExtensions = options?.applyExtensions\n this.attach = (req, res) => setImmediate(this.handler.bind(this, req, res, undefined), req, res)\n this.cache = {}\n }\n\n /**\n * Set app setting\n * @param setting setting name\n * @param value setting value\n */\n set<K extends keyof AppSettings>(setting: K, value: AppSettings[K]): this {\n this.settings[setting] = value\n\n return this\n }\n\n /**\n * Enable app setting\n * @param setting Setting name\n */\n enable<K extends keyof AppSettings>(setting: K): this {\n this.settings[setting] = true as AppSettings[K]\n\n return this\n }\n\n /**\n * Check if setting is enabled\n * @param setting Setting name\n * @returns\n */\n enabled<K extends keyof AppSettings>(setting: K): boolean {\n return Boolean(this.settings[setting])\n }\n\n /**\n * Disable app setting\n * @param setting Setting name\n */\n disable<K extends keyof AppSettings>(setting: K): this {\n this.settings[setting] = false as AppSettings[K]\n\n return this\n }\n\n /**\n * Return the app's absolute pathname\n * based on the parent(s) that have\n * mounted it.\n *\n * For example if the application was\n * mounted as `\"/admin\"`, which itself\n * was mounted as `\"/blog\"` then the\n * return value would be `\"/blog/admin\"`.\n *\n */\n path(): string {\n return this.parent ? this.parent.path() + this.mountpath : ''\n }\n\n /**\n * Register a template engine with extension\n */\n engine<RenderOptions extends TemplateEngineOptions = TemplateEngineOptions>(\n ext: string,\n fn: TemplateEngine<RenderOptions>\n ): this {\n this.engines[ext[0] === '.' ? ext : `.${ext}`] = fn\n\n return this\n }\n\n /**\n * Render a template\n * @param file What to render\n * @param data data that is passed to a template\n * @param options Template engine options\n * @param cb Callback that consumes error and html\n */\n render<RenderOptions extends TemplateEngineOptions = TemplateEngineOptions>(\n name: string,\n data: Record<string, unknown> = {},\n options: AppRenderOptions<RenderOptions> = {} as AppRenderOptions<RenderOptions>,\n cb: (err: unknown, html?: unknown) => void\n ): void {\n let view: View | undefined\n\n const { _locals, ...opts } = options\n\n let locals = this.locals\n\n if (_locals) locals = { ...locals, ..._locals }\n\n locals = { ...locals, ...data }\n\n if (opts.cache == null) (opts.cache as boolean) = this.enabled('view cache')\n\n if (opts.cache) {\n view = this.cache[name] as View\n }\n\n if (!view) {\n const View = this.settings['view']\n view = new View(name, {\n defaultEngine: this.settings['view engine'],\n root: this.settings.views,\n engines: this.engines\n })\n\n if (!view.path) {\n const dirs =\n Array.isArray(view.root) && view.root.length > 1\n ? 'directories \"' + view.root.slice(0, -1).join('\", \"') + '\" or \"' + view.root[view.root.length - 1] + '\"'\n : 'directory \"' + view.root + '\"'\n const err = new Error('Failed to lookup view \"' + name + '\" in views ' + dirs)\n\n return cb(err)\n }\n\n if (opts.cache) {\n this.cache[name] = view\n }\n }\n\n try {\n view.render(opts, locals, cb)\n } catch (err) {\n cb(err)\n }\n }\n use(...args: UseMethodParams<Req, Res, App>): this {\n const base = args[0]\n\n const fns = args.slice(1).flat()\n\n let pathArray = []\n if (typeof base === 'function' || base instanceof App) {\n fns.unshift(base)\n } else {\n // if base is not an array of paths, then convert it to an array.\n let basePaths = []\n if (Array.isArray(base)) basePaths = [...base]\n else if (typeof base === 'string') basePaths = [base]\n\n basePaths = basePaths.filter((element) => {\n if (typeof element === 'string') {\n pathArray.push(element)\n return false\n }\n return true\n })\n fns.unshift(...basePaths)\n }\n pathArray = pathArray.length ? pathArray.map((path) => lead(path)) : ['/']\n\n const mountpath = pathArray.join(', ')\n let regex: { keys: string[]; pattern: RegExp }\n\n for (const fn of fns) {\n if (fn instanceof App) {\n pathArray.forEach((path) => {\n regex = rg(path, true)\n fn.mountpath = mountpath\n this.apps[path] = fn\n fn.parent = this\n })\n }\n }\n pathArray.forEach((path) => {\n const handlerPaths = []\n const handlerFunctions = []\n const handlerPathBase = path === '/' ? '' : lead(path)\n for (const fn of fns) {\n if (fn instanceof App && fn.middleware?.length) {\n for (const mw of fn.middleware) {\n handlerPaths.push(handlerPathBase + lead(mw.path))\n handlerFunctions.push(fn)\n }\n } else {\n handlerPaths.push('')\n handlerFunctions.push(fn)\n }\n }\n pushMiddleware(this.middleware)({\n path,\n regex,\n type: 'mw',\n handler: mount(handlerFunctions[0] as Handler),\n handlers: handlerFunctions.slice(1).map(mount),\n fullPaths: handlerPaths\n })\n })\n return this\n }\n\n route(path: string): App {\n const app = new App({ settings: this.settings })\n\n this.use(path, app)\n\n return app\n }\n\n #find(url: string): Middleware<Req, Res>[] {\n return this.middleware.filter((m) => {\n m.regex = m.regex || rg(m.path, m.type === 'mw')\n\n let fullPathRegex: { keys: string[]; pattern: RegExp }\n\n m.fullPath && typeof m.fullPath === 'string'\n ? (fullPathRegex = rg(m.fullPath, m.type === 'mw'))\n : (fullPathRegex = null)\n\n return m.regex.pattern.test(url) && (m.type === 'mw' && fullPathRegex ? fullPathRegex.pattern.test(url) : true)\n })\n }\n\n /**\n * Extends Req / Res objects, pushes 404 and 500 handlers, dispatches middleware\n * @param req Req object\n * @param res Res object\n */\n handler<RenderOptions extends TemplateEngineOptions = TemplateEngineOptions>(\n req: Req,\n res: Res,\n next?: NextFunction\n ): void {\n /* Set X-Powered-By header */\n const { xPoweredBy } = this.settings\n if (xPoweredBy) res.setHeader('X-Powered-By', typeof xPoweredBy === 'string' ? xPoweredBy : 'tinyhttp')\n\n const exts = this.applyExtensions || extendMiddleware<RenderOptions>(this)\n\n req.originalUrl = req.url || req.originalUrl\n\n const pathname = getPathname(req.originalUrl)\n\n const matched = this.#find(pathname)\n\n const mw: Middleware[] = [\n {\n handler: exts,\n type: 'mw',\n path: '/'\n },\n ...matched.filter((x) => req.method === 'HEAD' || (x.method ? x.method === req.method : true))\n ]\n\n if (matched[0] != null) {\n mw.push({\n type: 'mw',\n handler: (req, res, next) => {\n if (req.method === 'HEAD') {\n res.statusCode = 204\n return res.end('')\n }\n next()\n },\n path: '/'\n })\n }\n\n mw.push({\n handler: this.noMatchHandler,\n type: 'mw',\n path: '/'\n })\n\n const handle = (mw: Middleware) => async (req: Req, res: Res, next?: NextFunction) => {\n const { path, handler, regex } = mw\n\n let params: URLParams\n\n try {\n params = regex ? getURLParams(regex, pathname) : {}\n } catch (e) {\n console.error(e)\n if (e instanceof URIError) return res.sendStatus(400) // Handle malformed URI\n else throw e\n }\n\n // Warning: users should not use :wild as a pattern\n let prefix = path\n if (regex) {\n for (const key of regex.keys) {\n if (key === 'wild') {\n prefix = prefix.replace('*', params.wild)\n } else {\n prefix = prefix.replace(`:${key}`, params[key])\n }\n }\n }\n\n req.params = { ...req.params, ...params }\n\n if (mw.type === 'mw') {\n req.url = lead(req.originalUrl.substring(prefix.length))\n }\n\n if (!req.path) req.path = getPathname(req.url)\n\n if (this.settings?.enableReqRoute) req.route = mw\n\n await applyHandler<Req, Res>(handler as unknown as Handler<Req, Res>)(req, res, next)\n }\n\n let idx = 0\n\n const loop = () => res.writableEnded || (idx < mw.length && handle(mw[idx++])(req, res, next))\n\n next = next || ((err) => (err ? this.onError(err, req, res) : loop()))\n\n loop()\n }\n\n /**\n * Creates HTTP server and dispatches middleware\n * @param port server listening port\n * @param Server callback after server starts listening\n * @param host server listening host\n */\n listen(port?: number, cb?: () => void, host?: string): Server {\n return createServer().on('request', this.attach).listen(port, host, cb)\n }\n}\n"],"names":["proxyAddr","View","rg","req","res","next","mw"],"mappings":";;;;;;;;;;AAgBA,MAAM,qBAAqB,CAAC,EAAE,aAAkD;AAC9E,QAAM,MAAM,OAAO;AACnB,MAAI,OAAO,QAAQ;AAAiB,WAAA,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACxE,SAAA,QAAQ,OAAO,CAAA,CAAE;AAC1B;AAEa,MAAA,cAAc,CAAC,QAA2B;AACrD,QAAM,QAAQ,OAAO,IAAI,SAAS,MAAM,EAAE;AAEtC,MAAA,CAAC,mBAAmB,GAAG;AAAU,WAAA;AAErC,QAAM,SAAU,IAAI,QAAQ,mBAAmB,KAAgB;AAEzD,QAAA,QAAQ,OAAO,QAAQ,GAAG;AAEzB,SAAA,UAAU,KAAK,OAAO,UAAU,GAAG,KAAK,EAAE,KAAA,IAAS,OAAO,KAAK;AACxE;AAEa,MAAA,cAAc,CAAC,QAAqC;AAC3D,MAAA,OAAe,IAAI,IAAI,kBAAkB;AAE7C,MAAI,CAAC,QAAQ,CAAC,mBAAmB,GAAG;AAAU,WAAA,IAAI,IAAI,MAAM;AAE5D,MAAI,CAAC;AAAM;AAGX,QAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,CAAC,MAAM,MAAM,KAAK,QAAQ,GAAG,IAAI,IAAI,CAAC;AAE3E,SAAO,UAAU,KAAK,KAAK,UAAU,GAAG,KAAK,IAAI;AACnD;AAEa,MAAA,QAAQ,CAAC,QACpBA,UAAU,KAAK,mBAAmB,GAAG,CAAC,EAAE,QAAQ,QAAQ,EAAE;AAErD,MAAM,SAAS,CAAC,QACrB,IAAI,KAAK,mBAAmB,GAAG,CAAC;AAE3B,MAAM,gBAAgB,CAAC,KAAc,kBAAkB,MAAgB;AACtE,QAAA,WAAW,YAAY,GAAG;AAEhC,MAAI,CAAC;AAAU,WAAO;AAEhB,QAAA,aAAa,KAAK,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,QAAQ;AAEtE,SAAA,WAAW,MAAM,eAAe;AACzC;ACrDO,MAAM,iBAA+B,SAAqB,KAAU,MAAe,KAAe;AACnG,MAAA,KAAK,YAAY,kBAAkB,KAAK;AAAQ,WAAO,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AAE7F,MAAI,eAAe;AAAO,YAAQ,MAAM,GAAG;AAE3C,QAAM,OAAO,IAAI,QAAQ,eAAe,IAAI,OAAO,IAAI;AAEvD,MAAI,OAAO,QAAQ,YAAY,OAAO,SAAS,GAAG;AAAG,QAAI,UAAU,GAAG,EAAE,IAAI,GAAG;AAAA,WACtE,QAAQ;AAAc,QAAI,UAAU,IAAI,EAAE,IAAI,aAAa,IAAI,CAAC;AAAA;AACpE,QAAI,UAAU,GAAG,EAAE,IAAI,IAAI,OAAO;AACzC;ACXa,MAAA,iBACX,CAA0D,MAAe,KAAe,QACxF,CAAC,MAAc,MAAgC,YAA4C;AACzF,MAAI,OAAO,MAAM,OAAO,EAAE,GAAG,IAAI,QAAQ,GAAG,SAAS,IAAI,QAAQ,SAAS,CAAC,KAAc,SAAkB;AACrG,QAAA;AAAW,YAAA;AACf,QAAI,KAAK,IAAI;AAAA,EAAA,CACd;AACM,SAAA;AACT;AC2BK,MAAM,mBACX,CAAsE,QACtE,CAAC,KAAc,KAA8B,SAA6B;AAClE,QAAA,EAAE,SAAa,IAAA;AAEjB,MAAA,MAAM,kBAAkB,GAAG;AAC3B,MAAA,MAAM,iBAAiB,GAAG;AAE9B,MAAI,qCAAU,iBAAiB;AAC7B,QAAI,MAAM;AACV,QAAI,MAAM;AAAA,EACZ;AAEA,MAAI,qCAAU,mBAAmB;AAC3B,QAAA,WAAW,YAAY,GAAG;AAC1B,QAAA,SAAS,IAAI,aAAa;AAC1B,QAAA,WAAW,YAAY,GAAG;AAC9B,QAAI,aAAa,cAAc,KAAK,SAAS,eAAe;AACxD,QAAA,KAAK,MAAM,GAAG;AACd,QAAA,MAAM,OAAO,GAAG;AAAA,EACtB;AAEI,MAAA,QAAQ,eAAe,IAAI,GAAG;AAE9B,MAAA,QAAQ,mBAAmB,GAAG;AAC9B,MAAA,UAAU,WAAW,GAAG;AACxB,MAAA,kBAAkB,mBAAmB,GAAG;AACxC,MAAA,mBAAmB,oBAAoB,GAAG;AAC1C,MAAA,mBAAmB,oBAAoB,GAAG;AAE1C,MAAA,MAAM,sBAAsB,GAAG;AAEnC,MAAI,SAAS,IAAI,MAAM,UAAoB,GAAG;AAC1C,MAAA,OAAO,KAAwB,KAAK,GAAG;AACvC,MAAA,OAAO,KAAe,GAAG;AACzB,MAAA,SAAS,OAAiB,GAAG;AAC7B,MAAA,aAAa,WAA8B,KAAK,GAAG;AACnD,MAAA,WAAW,SAA4B,KAAK,GAAG;AAC/C,MAAA,OAAO,eAAyB,GAAG;AACnC,MAAA,WAAW,kBAAqC,KAAK,GAAG;AACxD,MAAA,QAAQ,eAAyB,GAAG;AACpC,MAAA,OAAO,cAAwB,GAAG;AAClC,MAAA,SAAS,UAA6B,KAAK,GAAG;AAC9C,MAAA,cAAc,YAA+B,KAAK,GAAG;AACzD,MAAI,SAAS,eAAe,KAAK,KAAK,GAAG;AACzC,MAAI,SAAS,eAAe,KAAK,KAAK,IAAI;AAC1C,MAAI,WAAW,SAAS,KAAK,KAAK,IAAI;AAClC,MAAA,aAAa,WAAqB,GAAG;AACrC,MAAA,WAAW,SAA4B,KAAK,GAAG;AAC/C,MAAA,SAAS,OAAiB,GAAG;AACjC,MAAI,SAAS,IAAI,UAAU,uBAAO,OAAO,IAAI;AAE7C,SAAO,eAAe,KAAK,SAAS,EAAE,KAAK,gBAAgB,KAAK,MAAM,KAAK,GAAG,GAAG,cAAc,KAAM,CAAA;AACjG,MAAA,QAAQ,CAAC,IAAI;AAEZ;AACP;ACrFF,SAAS,QAAQ,MAAc;AACzB,MAAA;AACF,WAAO,SAAS,IAAI;AAAA,WACb,GAAG;AACH,WAAA;AAAA,EACT;AACF;AAgBO,MAAM,KAA0E;AAAA,EAOrF,YACE,MACA,OAIK,IACL;AACK,SAAA,MAAM,QAAQ,IAAI;AACvB,SAAK,OAAO;AACZ,SAAK,OAAO,KAAK;AACjB,SAAK,gBAAgB,KAAK;AAE1B,QAAI,CAAC,KAAK,OAAO,CAAC,KAAK;AACf,YAAA,IAAI,MAAM,gEAAgE;AAElF,QAAI,WAAW;AAEX,QAAA,CAAC,KAAK,KAAK;AAER,WAAA,MAAM,KAAK,cAAc,CAAC,MAAM,MAAM,MAAM,KAAK,gBAAgB,KAAK;AAE3E,kBAAY,KAAK;AAAA,IACnB;AAEA,QAAI,CAAC,KAAK,QAAQ,KAAK,GAAG;AAAG,YAAM,IAAI,MAAM,2BAA2B,KAAK,GAAG,EAAE;AAElF,SAAK,SAAS,KAAK,QAAQ,KAAK,GAAG;AAC9B,SAAA,OAAO,KAAK,QAAQ,QAAQ;AAAA,EACnC;AAAA,EACA,QAAQ,MAAc;AAChB,QAAA;AACJ,UAAM,QAAQ,CAAG,EAAA,OAAO,KAAK,IAAI;AAEjC,aAAS,IAAI,GAAG,IAAI,MAAM,UAAU,CAAC,MAAM,KAAK;AACxC,YAAA,OAAO,MAAM,CAAC;AAEd,YAAA,MAAM,QAAQ,MAAM,IAAI;AACxB,YAAA,MAAM,QAAQ,GAAG;AACjB,YAAA,OAAO,SAAS,GAAG;AAGlB,aAAA,KAAK,SAAS,KAAK,IAAI;AAAA,IAChC;AAEO,WAAA;AAAA,EACT;AAAA,EACA,SAAS,KAAa,MAAc;AAClC,UAAM,MAAM,KAAK;AAGb,QAAA,OAAO,KAAK,KAAK,IAAI;AACrB,QAAA,OAAO,QAAQ,IAAI;AAEnB,QAAA,QAAQ,KAAK,UAAU;AAClB,aAAA;AAAA,IACT;AAGA,WAAO,KAAK,KAAK,SAAS,MAAM,GAAG,GAAG,UAAU,GAAG;AACnD,WAAO,QAAQ,IAAI;AAEf,QAAA,QAAQ,KAAK,UAAU;AAClB,aAAA;AAAA,IACT;AAAA,EACF;AAAA,EACA,OAAO,SAAwB,MAA+B,IAAgD;AAC5G,SAAK,OAAO,KAAK,MAAM,MAAM,SAAS,EAAE;AAAA,EAC1C;AACF;AC5FA,MAAM,OAAO,CAAC,MAAe,EAAE,WAAW,CAAC,MAAM,KAAK,IAAI,MAAM;AAEhE,MAAM,QAAQ,CAAC,OAAuB,cAAc,MAAM,GAAG,SAAS;AAEtE,MAAM,eACJ,CAAW,MACX,OAAO,KAAU,KAAU,SAAwB;AAC7C,MAAA;AACF,QAAI,EAAE,OAAO,WAAW,MAAM,iBAAiB;AACvC,YAAA,EAAE,KAAK,KAAK,IAAI;AAAA,IACxB;AAAS,QAAA,KAAK,KAAK,IAAI;AAAA,WAChB,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF;AAwBK,MAAM,YAA4E,OAAsB;AAAA,EAW7G,YAAY,UAAoC,IAAI;AAC5C;AAXR,SAAA,aAAqC;AACrC,SAAA,SAAkC;AAIlC,SAAA,UAA0C;AAOnC,SAAA,WAAU,mCAAS,YAAW;AAC9B,SAAA,kBAAiB,mCAAS,mBAAkB,KAAK,QAAQ,KAAK,MAAM,EAAE,MAAM,IAAK,CAAA;AACtF,SAAK,WAAW;AAAA,MACd,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,OAAO,GAAG,QAAQ,IAAA,CAAK;AAAA,MACvB,cAAc,QAAQ,IAAI,aAAa;AAAA,MACvC,GAAG,QAAQ;AAAA,IAAA;AAEb,SAAK,kBAAkB,mCAAS;AAChC,SAAK,SAAS,CAAC,KAAK,QAAQ,aAAa,KAAK,QAAQ,KAAK,MAAM,KAAK,KAAK,MAAS,GAAG,KAAK,GAAG;AAC/F,SAAK,QAAQ;EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAiC,SAAY,OAA6B;AACnE,SAAA,SAAS,OAAO,IAAI;AAElB,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAoC,SAAkB;AAC/C,SAAA,SAAS,OAAO,IAAI;AAElB,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAqC,SAAqB;AACxD,WAAO,QAAQ,KAAK,SAAS,OAAO,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAqC,SAAkB;AAChD,SAAA,SAAS,OAAO,IAAI;AAElB,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAe;AACb,WAAO,KAAK,SAAS,KAAK,OAAO,SAAS,KAAK,YAAY;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,OACE,KACA,IACM;AACD,SAAA,QAAQ,IAAI,CAAC,MAAM,MAAM,MAAM,IAAI,GAAG,EAAE,IAAI;AAE1C,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OACE,MACA,OAAgC,IAChC,UAA2C,IAC3C,IACM;AACF,QAAA;AAEJ,UAAM,EAAE,SAAS,GAAG,KAAA,IAAS;AAE7B,QAAI,SAAS,KAAK;AAEd,QAAA;AAAS,eAAS,EAAE,GAAG,QAAQ,GAAG,QAAQ;AAE9C,aAAS,EAAE,GAAG,QAAQ,GAAG,KAAK;AAE9B,QAAI,KAAK,SAAS;AAAO,WAAK,QAAoB,KAAK,QAAQ,YAAY;AAE3E,QAAI,KAAK,OAAO;AACP,aAAA,KAAK,MAAM,IAAI;AAAA,IACxB;AAEA,QAAI,CAAC,MAAM;AACHC,YAAAA,QAAO,KAAK,SAAS,MAAM;AAC1B,aAAA,IAAIA,MAAK,MAAM;AAAA,QACpB,eAAe,KAAK,SAAS,aAAa;AAAA,QAC1C,MAAM,KAAK,SAAS;AAAA,QACpB,SAAS,KAAK;AAAA,MAAA,CACf;AAEG,UAAA,CAAC,KAAK,MAAM;AACd,cAAM,OACJ,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,IAC3C,kBAAkB,KAAK,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,MAAM,IAAI,WAAW,KAAK,KAAK,KAAK,KAAK,SAAS,CAAC,IAAI,MACrG,gBAAgB,KAAK,OAAO;AAClC,cAAM,MAAM,IAAI,MAAM,4BAA4B,OAAO,gBAAgB,IAAI;AAE7E,eAAO,GAAG,GAAG;AAAA,MACf;AAEA,UAAI,KAAK,OAAO;AACT,aAAA,MAAM,IAAI,IAAI;AAAA,MACrB;AAAA,IACF;AAEI,QAAA;AACG,WAAA,OAAO,MAAM,QAAQ,EAAE;AAAA,aACrB,KAAK;AACZ,SAAG,GAAG;AAAA,IACR;AAAA,EACF;AAAA,EACA,OAAO,MAA4C;AAC3C,UAAA,OAAO,KAAK,CAAC;AAEnB,UAAM,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK;AAE/B,QAAI,YAAY,CAAA;AAChB,QAAI,OAAO,SAAS,cAAc,gBAAgB,KAAK;AACrD,UAAI,QAAQ,IAAI;AAAA,IAAA,OACX;AAEL,UAAI,YAAY,CAAA;AACZ,UAAA,MAAM,QAAQ,IAAI;AAAe,oBAAA,CAAC,GAAG,IAAI;AAAA,eACpC,OAAO,SAAS;AAAU,oBAAY,CAAC,IAAI;AAExC,kBAAA,UAAU,OAAO,CAAC,YAAY;AACpC,YAAA,OAAO,YAAY,UAAU;AAC/B,oBAAU,KAAK,OAAO;AACf,iBAAA;AAAA,QACT;AACO,eAAA;AAAA,MAAA,CACR;AACG,UAAA,QAAQ,GAAG,SAAS;AAAA,IAC1B;AACY,gBAAA,UAAU,SAAS,UAAU,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG;AAEnE,UAAA,YAAY,UAAU,KAAK,IAAI;AACjC,QAAA;AAEJ,eAAW,MAAM,KAAK;AACpB,UAAI,cAAc,KAAK;AACX,kBAAA,QAAQ,CAAC,SAAS;AAClB,kBAAAC,MAAG,MAAM,IAAI;AACrB,aAAG,YAAY;AACV,eAAA,KAAK,IAAI,IAAI;AAClB,aAAG,SAAS;AAAA,QAAA,CACb;AAAA,MACH;AAAA,IACF;AACU,cAAA,QAAQ,CAAC,SAAS;;AAC1B,YAAM,eAAe,CAAA;AACrB,YAAM,mBAAmB,CAAA;AACzB,YAAM,kBAAkB,SAAS,MAAM,KAAK,KAAK,IAAI;AACrD,iBAAW,MAAM,KAAK;AACpB,YAAI,cAAc,SAAO,QAAG,eAAH,mBAAe,SAAQ;AACnC,qBAAA,MAAM,GAAG,YAAY;AAC9B,yBAAa,KAAK,kBAAkB,KAAK,GAAG,IAAI,CAAC;AACjD,6BAAiB,KAAK,EAAE;AAAA,UAC1B;AAAA,QAAA,OACK;AACL,uBAAa,KAAK,EAAE;AACpB,2BAAiB,KAAK,EAAE;AAAA,QAC1B;AAAA,MACF;AACe,qBAAA,KAAK,UAAU,EAAE;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,SAAS,MAAM,iBAAiB,CAAC,CAAY;AAAA,QAC7C,UAAU,iBAAiB,MAAM,CAAC,EAAE,IAAI,KAAK;AAAA,QAC7C,WAAW;AAAA,MAAA,CACZ;AAAA,IAAA,CACF;AACM,WAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAmB;AACvB,UAAM,MAAM,IAAI,IAAI,EAAE,UAAU,KAAK,UAAU;AAE1C,SAAA,IAAI,MAAM,GAAG;AAEX,WAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAqC;AACzC,WAAO,KAAK,WAAW,OAAO,CAAC,MAAM;AACjC,QAAA,QAAQ,EAAE,SAASA,MAAG,EAAE,MAAM,EAAE,SAAS,IAAI;AAE3C,UAAA;AAEJ,QAAE,YAAY,OAAO,EAAE,aAAa,WAC/B,gBAAgBA,MAAG,EAAE,UAAU,EAAE,SAAS,IAAI,IAC9C,gBAAgB;AAErB,aAAO,EAAE,MAAM,QAAQ,KAAK,GAAG,MAAM,EAAE,SAAS,QAAQ,gBAAgB,cAAc,QAAQ,KAAK,GAAG,IAAI;AAAA,IAAA,CAC3G;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QACE,KACA,KACA,MACM;AAEA,UAAA,EAAE,WAAW,IAAI,KAAK;AACxB,QAAA;AAAY,UAAI,UAAU,gBAAgB,OAAO,eAAe,WAAW,aAAa,UAAU;AAEtG,UAAM,OAAO,KAAK,mBAAmB,iBAAgC,IAAI;AAErE,QAAA,cAAc,IAAI,OAAO,IAAI;AAE3B,UAAA,WAAW,YAAY,IAAI,WAAW;AAEtC,UAAA,UAAU,KAAK,MAAM,QAAQ;AAEnC,UAAM,KAAmB;AAAA,MACvB;AAAA,QACE,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA,GAAG,QAAQ,OAAO,CAAC,MAAM,IAAI,WAAW,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,SAAS,KAAK;AAAA,IAAA;AAG3F,QAAA,QAAQ,CAAC,KAAK,MAAM;AACtB,SAAG,KAAK;AAAA,QACN,MAAM;AAAA,QACN,SAAS,CAACC,MAAKC,MAAKC,UAAS;AACvBF,cAAAA,KAAI,WAAW,QAAQ;AACzBC,iBAAI,aAAa;AACVA,mBAAAA,KAAI,IAAI,EAAE;AAAA,UACnB;AACAC;QACF;AAAA,QACA,MAAM;AAAA,MAAA,CACP;AAAA,IACH;AAEA,OAAG,KAAK;AAAA,MACN,SAAS,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,IAAA,CACP;AAED,UAAM,SAAS,CAACC,QAAmB,OAAOH,MAAUC,MAAUC,UAAwB;;AACpF,YAAM,EAAE,MAAM,SAAS,MAAA,IAAUC;AAE7B,UAAA;AAEA,UAAA;AACF,iBAAS,QAAQ,aAAa,OAAO,QAAQ,IAAI,CAAA;AAAA,eAC1C,GAAG;AACV,gBAAQ,MAAM,CAAC;AACf,YAAI,aAAa;AAAiBF,iBAAAA,KAAI,WAAW,GAAG;AAAA;AACzC,gBAAA;AAAA,MACb;AAGA,UAAI,SAAS;AACb,UAAI,OAAO;AACE,mBAAA,OAAO,MAAM,MAAM;AAC5B,cAAI,QAAQ,QAAQ;AAClB,qBAAS,OAAO,QAAQ,KAAK,OAAO,IAAI;AAAA,UAAA,OACnC;AACL,qBAAS,OAAO,QAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAEAD,WAAI,SAAS,EAAE,GAAGA,KAAI,QAAQ,GAAG;AAE7BG,UAAAA,IAAG,SAAS,MAAM;AACpBH,aAAI,MAAM,KAAKA,KAAI,YAAY,UAAU,OAAO,MAAM,CAAC;AAAA,MACzD;AAEA,UAAI,CAACA,KAAI;AAAMA,aAAI,OAAO,YAAYA,KAAI,GAAG;AAE7C,WAAI,UAAK,aAAL,mBAAe;AAAgBA,aAAI,QAAQG;AAE/C,YAAM,aAAuB,OAAuC,EAAEH,MAAKC,MAAKC,KAAI;AAAA,IAAA;AAGtF,QAAI,MAAM;AAEV,UAAM,OAAO,MAAM,IAAI,iBAAkB,MAAM,GAAG,UAAU,OAAO,GAAG,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI;AAErF,WAAA,SAAS,CAAC,QAAS,MAAM,KAAK,QAAQ,KAAK,KAAK,GAAG,IAAI,KAAK;AAE9D;EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAe,IAAiB,MAAuB;AACrD,WAAA,aAAe,EAAA,GAAG,WAAW,KAAK,MAAM,EAAE,OAAO,MAAM,MAAM,EAAE;AAAA,EACxE;AACF;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/request.ts","../src/response.ts","../src/extend.ts","../src/onError.ts","../src/view.ts","../src/app.ts"],"sourcesContent":["import type { IncomingMessage } from 'node:http'\nimport type { ParsedUrlQuery } from 'node:querystring'\n\nimport { all, compile, proxyaddr as proxyAddr } from '@tinyhttp/proxy-addr'\nimport type { Options, Ranges } from 'header-range-parser'\n\nimport type { Middleware } from '@tinyhttp/router'\nimport type { App } from './app.js'\n\nimport { isIP } from 'node:net'\nimport type { Socket } from 'node:net'\nimport type { TLSSocket } from 'node:tls'\nimport type { URLParams } from '@tinyhttp/req'\n\nexport { getURLParams } from '@tinyhttp/req'\n\nconst trustRemoteAddress = ({ socket }: Pick<Request, 'headers' | 'socket'>) => {\n const val = socket.remoteAddress\n if (typeof val === 'string') return compile(val.split(',').map((x) => x.trim()))\n return compile(val || [])\n}\n\nexport const getProtocol = (req: Request): Protocol => {\n const proto = `http${req.secure ? 's' : ''}`\n\n if (!trustRemoteAddress(req)) return proto\n\n const header = (req.headers['X-Forwarded-Proto'] as string) || proto\n\n const index = header.indexOf(',')\n\n return index !== -1 ? header.substring(0, index).trim() : header.trim()\n}\n\nexport const getHostname = (req: Request): string | undefined => {\n let host: string = req.get('X-Forwarded-Host') as string\n\n if (!host || !trustRemoteAddress(req)) host = req.get('Host') as string\n\n if (!host) return\n\n // IPv6 literal support\n const index = host.indexOf(':', host[0] === '[' ? host.indexOf(']') + 1 : 0)\n\n return index !== -1 ? host.substring(0, index) : host\n}\n\nexport const getIP = (req: Pick<Request, 'headers' | 'connection' | 'socket'>): string | undefined =>\n proxyAddr(req, trustRemoteAddress(req)).replace(/^.*:/, '') // striping the redundant prefix addeded by OS to IPv4 address\n\nexport const getIPs = (req: Pick<Request, 'headers' | 'connection' | 'socket'>): string[] | undefined =>\n all(req, trustRemoteAddress(req))\n\nexport const getSubdomains = (req: Request, subdomainOffset = 2): string[] => {\n const hostname = getHostname(req)\n\n if (!hostname) return []\n\n const subdomains = isIP(hostname) ? [hostname] : hostname.split('.').reverse()\n\n return subdomains.slice(subdomainOffset)\n}\n\nexport type Connection = IncomingMessage['socket'] & {\n encrypted: boolean\n}\n\nexport type Protocol = 'http' | 'https' | string\n\nexport type { URLParams }\n\ntype AcceptsReturns = string | boolean | string[]\n\nexport interface Request extends IncomingMessage {\n originalUrl: string\n path: string\n url: string\n query: ParsedUrlQuery\n params: URLParams\n connection: Connection\n socket: TLSSocket | Socket\n route?: Middleware\n protocol: Protocol\n secure: boolean\n xhr: boolean\n hostname?: string\n ip?: string\n ips?: string[]\n subdomains?: string[]\n get: (header: string) => string | string[] | undefined\n range: (size: number, options?: Options) => -1 | -2 | -3 | Ranges | undefined\n accepts: (...types: string[]) => AcceptsReturns\n acceptsEncodings: (...encodings: string[]) => AcceptsReturns\n acceptsCharsets: (...charsets: string[]) => AcceptsReturns\n acceptsLanguages: (...languages: string[]) => AcceptsReturns\n is: (...types: string[]) => boolean\n cookies?: any\n signedCookies?: any\n secret?: string | string[]\n fresh?: boolean\n stale?: boolean\n body?: any\n app?: App\n}\n","import type { ServerResponse } from 'node:http'\nimport type { SerializeOptions } from '@tinyhttp/cookie'\nimport type { DownloadOptions, FormatProps, ReadStreamOptions } from '@tinyhttp/res'\nimport type { App } from './app.js'\nimport type { Request } from './request.js'\nimport type { AppRenderOptions, TemplateEngineOptions } from './types.js'\n\nexport const renderTemplate =\n <O extends TemplateEngineOptions = TemplateEngineOptions>(_req: Request, res: Response, app: App) =>\n (file: string, data?: Record<string, unknown>, options?: AppRenderOptions<O>): Response => {\n app.render(file, data ? { ...res.locals, ...data } : res.locals, options, (err: unknown, html: unknown) => {\n if (err) throw err\n res.send(html)\n })\n return res\n }\n\nexport interface Response<B = unknown> extends ServerResponse {\n header(field: string | Record<string, unknown>, val?: string | any[]): Response<B>\n set(field: string | Record<string, unknown>, val?: string | any[]): Response<B>\n get(field: string): string | number | string[]\n send(body: B): Response<B>\n sendFile(path: string, options?: ReadStreamOptions, cb?: (err?: unknown) => void): Response<B>\n json(body: B): Response<B>\n status(status: number): Response<B>\n sendStatus(statusCode: number): Response<B>\n cookie(\n name: string,\n value: string | Record<string, unknown>,\n options?: SerializeOptions & Partial<{ signed: boolean }>\n ): Response<B>\n clearCookie(name: string, options?: SerializeOptions): Response<B>\n location(url: string): Response<B>\n links(links: { [key: string]: string }): Response<B>\n render<O extends TemplateEngineOptions = TemplateEngineOptions>(\n file: string,\n data?: Record<string, any>,\n options?: AppRenderOptions<O>\n ): Response<B>\n vary(field: string): Response<B>\n format(obj: FormatProps): Response<B>\n redirect(url: string, status?: number): Response<B>\n type(type: string): Response<B>\n download(path: string, filename: string, options?: DownloadOptions, cb?: (err?: unknown) => void): Response<B>\n attachment(filename?: string): Response<B>\n app?: App\n locals: Record<string, any>\n /**\n * Send JSON response with JSONP callback support.\n *\n * To enable this method, install the `@tinyhttp/jsonp` package and attach the method to `res.jsonp` property.\n *\n * @param obj Response object\n */\n jsonp(obj: any): Response<B>\n\n append(field: string, value: any): Response<B>\n}\n","import {\n checkIfXMLHttpRequest,\n getAccepts,\n getAcceptsCharsets,\n getAcceptsEncodings,\n getAcceptsLanguages,\n getFreshOrStale,\n getQueryParams,\n getRangeFromHeader,\n getRequestHeader\n} from '@tinyhttp/req'\nimport {\n append,\n attachment,\n clearCookie,\n download,\n formatResponse,\n getResponseHeader,\n json,\n redirect,\n send,\n sendFile,\n sendStatus,\n setContentType,\n setCookie,\n setHeader,\n setLinksHeader,\n setLocationHeader,\n setVaryHeader,\n status\n} from '@tinyhttp/res'\nimport type { NextFunction } from '@tinyhttp/router'\nimport type { App } from './app.js'\nimport { type Request, getSubdomains } from './request.js'\nimport { getHostname, getIP, getIPs, getProtocol } from './request.js'\nimport type { Response } from './response.js'\nimport { renderTemplate } from './response.js'\nimport type { TemplateEngineOptions } from './types.js'\n\n/**\n * Extends Request and Response objects with custom properties and methods\n */\nexport const extendMiddleware =\n <EngineOptions extends TemplateEngineOptions = TemplateEngineOptions>(app: App) =>\n (req: Request, res: Response<EngineOptions>, next: NextFunction): void => {\n const { settings } = app\n\n res.get = getResponseHeader(res)\n req.get = getRequestHeader(req)\n\n if (settings?.bindAppToReqRes) {\n req.app = app\n res.app = app\n }\n\n if (settings?.networkExtensions) {\n req.protocol = getProtocol(req)\n req.secure = req.protocol === 'https'\n req.hostname = getHostname(req)\n req.subdomains = getSubdomains(req, settings.subdomainOffset)\n req.ip = getIP(req)\n req.ips = getIPs(req)\n }\n\n req.query = getQueryParams(req.url)\n\n req.range = getRangeFromHeader(req)\n req.accepts = getAccepts(req)\n req.acceptsCharsets = getAcceptsCharsets(req)\n req.acceptsEncodings = getAcceptsEncodings(req)\n req.acceptsLanguages = getAcceptsLanguages(req)\n\n req.xhr = checkIfXMLHttpRequest(req)\n\n res.header = res.set = setHeader<Response>(res)\n res.send = send<Request, Response>(req, res)\n res.json = json<Response>(res)\n res.status = status<Response>(res)\n res.sendStatus = sendStatus<Request, Response>(req, res)\n res.sendFile = sendFile<Request, Response>(req, res)\n res.type = setContentType<Response>(res)\n res.location = setLocationHeader<Request, Response>(req, res)\n res.links = setLinksHeader<Response>(res)\n res.vary = setVaryHeader<Response>(res)\n res.cookie = setCookie<Request, Response>(req, res)\n res.clearCookie = clearCookie<Request, Response>(req, res)\n res.render = renderTemplate(req, res, app)\n res.format = formatResponse(req, res, next)\n res.redirect = redirect(req, res, next)\n res.attachment = attachment<Response>(res)\n res.download = download<Request, Response>(req, res)\n res.append = append<Response>(res)\n res.locals = res.locals || Object.create(null)\n\n Object.defineProperty(req, 'fresh', { get: getFreshOrStale.bind(null, req, res), configurable: true })\n req.stale = !req.fresh\n\n next()\n }\n","import { STATUS_CODES } from 'node:http'\nimport type { NextFunction } from '@tinyhttp/router'\nimport type { App } from './app.js'\nimport type { Request } from './request.js'\nimport type { Response } from './response.js'\n\nexport type ErrorHandler = (this: App, err: any, req: Request, res: Response, next?: NextFunction) => void\n\nexport const onErrorHandler: ErrorHandler = function (this: App, err: any, _req: Request, res: Response) {\n if (this.onError === onErrorHandler && this.parent) return this.parent.onError(err, _req, res)\n\n if (err instanceof Error) console.error(err)\n\n const code = err.code in STATUS_CODES ? err.code : err.status\n\n if (typeof err === 'string' || Buffer.isBuffer(err)) res.writeHead(500).end(err)\n else if (code in STATUS_CODES) res.writeHead(code).end(STATUS_CODES[code])\n else res.writeHead(500).end(err.message)\n}\n","/*!\n * Ported from https://github.com/expressjs/express/blob/master/lib/view.js\n * express\n * Copyright(c) 2009-2013 TJ Holowaychuk\n * Copyright(c) 2013 Roman Shtylman\n * Copyright(c) 2014-2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\nimport { statSync } from 'node:fs'\nimport { basename, dirname, extname, join, resolve } from 'node:path'\nimport type { TemplateEngine, TemplateEngineOptions } from './types.js'\n\nfunction tryStat(path: string) {\n try {\n return statSync(path)\n } catch (e) {\n return undefined\n }\n}\n\n/**\n * Initialize a new `View` with the given `name`.\n *\n * Options:\n *\n * - `defaultEngine` the default template engine name\n * - `engines` template engine require() cache\n * - `root` root path for view lookup\n *\n * @param name\n * @param options\n * @public\n */\n\nexport class View<RenderOptions extends TemplateEngineOptions = TemplateEngineOptions> {\n ext: string\n defaultEngine: string\n name: string\n engine: TemplateEngine<RenderOptions>\n path: string\n root: string | string[]\n constructor(\n name: string,\n opts: Partial<{\n defaultEngine: string\n root: string | string[]\n engines: Record<string, TemplateEngine<RenderOptions>>\n }> = {}\n ) {\n this.ext = extname(name)\n this.name = name\n this.root = opts.root\n this.defaultEngine = opts.defaultEngine\n\n if (!this.ext && !this.defaultEngine)\n throw new Error('No default engine was specified and no extension was provided.')\n\n let fileName = name\n\n if (!this.ext) {\n // get extension from default engine name\n this.ext = this.defaultEngine[0] !== '.' ? `.${this.defaultEngine}` : this.defaultEngine\n\n fileName += this.ext\n }\n\n if (!opts.engines[this.ext]) throw new Error(`No engine was found for ${this.ext}`)\n\n this.engine = opts.engines[this.ext]\n this.path = this.#lookup(fileName)\n }\n #lookup(name: string) {\n let path: string\n const roots = [].concat(this.root)\n\n for (let i = 0; i < roots.length && !path; i++) {\n const root = roots[i]\n // resolve the path\n const loc = resolve(root, name)\n const dir = dirname(loc)\n const file = basename(loc)\n\n // resolve the file\n path = this.#resolve(dir, file)\n }\n\n return path\n }\n #resolve(dir: string, file: string) {\n const ext = this.ext\n\n // <path>.<ext>\n let path = join(dir, file)\n let stat = tryStat(path)\n\n if (stat?.isFile()) {\n return path\n }\n\n // <path>/index.<ext>\n path = join(dir, basename(file, ext), `index${ext}`)\n stat = tryStat(path)\n\n if (stat?.isFile()) {\n return path\n }\n }\n render(options: RenderOptions, data: Record<string, unknown>, cb: (err: Error | null, html: unknown) => void) {\n this.engine(this.path, data, options, cb)\n }\n}\n","import { type Server, createServer } from 'node:http'\nimport { getPathname } from '@tinyhttp/req'\nimport type { Handler, Middleware, NextFunction, UseMethodParams } from '@tinyhttp/router'\nimport { Router, pushMiddleware } from '@tinyhttp/router'\nimport { parse as rg } from 'regexparam'\nimport { extendMiddleware } from './extend.js'\nimport type { TemplateEngineOptions } from './index.js'\nimport type { ErrorHandler } from './onError.js'\nimport { onErrorHandler } from './onError.js'\nimport { getURLParams } from './request.js'\nimport type { Request, URLParams } from './request.js'\nimport type { Response } from './response.js'\nimport type { AppConstructor, AppRenderOptions, AppSettings, TemplateEngine } from './types.js'\nimport { View } from './view.js'\n\n/**\n * Add leading slash if not present (e.g. path -> /path, /path -> /path)\n * @param x\n */\nconst lead = (x: string) => (x.charCodeAt(0) === 47 ? x : `/${x}`)\n\nconst mount = (fn: App | Handler) => (fn instanceof App ? fn.attach : fn)\n\nconst applyHandler =\n <Req, Res>(h: Handler<Req, Res>) =>\n async (req: Req, res: Res, next?: NextFunction) => {\n try {\n if (h[Symbol.toStringTag] === 'AsyncFunction') {\n await h(req, res, next)\n } else h(req, res, next)\n } catch (e) {\n next(e)\n }\n }\n\n/**\n * `App` class - the starting point of tinyhttp app.\n *\n * With the `App` you can:\n * * use routing methods and `.use(...)`\n * * set no match (404) and error (500) handlers\n * * configure template engines\n * * store data in locals\n * * listen the http server on a specified port\n *\n * In case you use TypeScript, you can pass custom types to this class because it is also a generic class.\n *\n * Example:\n *\n * ```ts\n * interface CoolReq extends Request {\n * genericsAreDope: boolean\n * }\n *\n * const app = App<any, CoolReq, Response>()\n * ```\n */\nexport class App<Req extends Request = Request, Res extends Response = Response> extends Router<App, Req, Res> {\n middleware: Middleware<Req, Res>[] = []\n locals: Record<string, unknown> = {}\n noMatchHandler: Handler\n onError: ErrorHandler\n settings: AppSettings\n engines: Record<string, TemplateEngine> = {}\n applyExtensions: (req: Request, res: Response, next: NextFunction) => void\n attach: (req: Req, res: Res) => void\n cache: Record<string, unknown>\n\n constructor(options: AppConstructor<Req, Res> = {}) {\n super()\n this.onError = options?.onError || onErrorHandler\n this.noMatchHandler = options?.noMatchHandler || this.onError.bind(this, { code: 404 })\n this.settings = {\n view: View,\n xPoweredBy: true,\n views: `${process.cwd()}/views`,\n 'view cache': process.env.NODE_ENV === 'production',\n ...options.settings\n }\n this.applyExtensions = options?.applyExtensions\n this.attach = (req, res) => setImmediate(this.handler.bind(this, req, res, undefined), req, res)\n this.cache = {}\n }\n\n /**\n * Set app setting\n * @param setting setting name\n * @param value setting value\n */\n set<K extends keyof AppSettings>(setting: K, value: AppSettings[K]): this {\n this.settings[setting] = value\n\n return this\n }\n\n /**\n * Enable app setting\n * @param setting Setting name\n */\n enable<K extends keyof AppSettings>(setting: K): this {\n this.settings[setting] = true as AppSettings[K]\n\n return this\n }\n\n /**\n * Check if setting is enabled\n * @param setting Setting name\n * @returns\n */\n enabled<K extends keyof AppSettings>(setting: K): boolean {\n return Boolean(this.settings[setting])\n }\n\n /**\n * Disable app setting\n * @param setting Setting name\n */\n disable<K extends keyof AppSettings>(setting: K): this {\n this.settings[setting] = false as AppSettings[K]\n\n return this\n }\n\n /**\n * Return the app's absolute pathname\n * based on the parent(s) that have\n * mounted it.\n *\n * For example if the application was\n * mounted as `\"/admin\"`, which itself\n * was mounted as `\"/blog\"` then the\n * return value would be `\"/blog/admin\"`.\n *\n */\n path(): string {\n return this.parent ? this.parent.path() + this.mountpath : ''\n }\n\n /**\n * Register a template engine with extension\n */\n engine<RenderOptions extends TemplateEngineOptions = TemplateEngineOptions>(\n ext: string,\n fn: TemplateEngine<RenderOptions>\n ): this {\n this.engines[ext[0] === '.' ? ext : `.${ext}`] = fn\n\n return this\n }\n\n /**\n * Render a template\n * @param file What to render\n * @param data data that is passed to a template\n * @param options Template engine options\n * @param cb Callback that consumes error and html\n */\n render<RenderOptions extends TemplateEngineOptions = TemplateEngineOptions>(\n name: string,\n data: Record<string, unknown> = {},\n options: AppRenderOptions<RenderOptions> = {} as AppRenderOptions<RenderOptions>,\n cb: (err: unknown, html?: unknown) => void = () => {}\n ): void {\n let view: View | undefined\n\n const { _locals, ...opts } = options\n\n let locals = this.locals\n\n if (_locals) locals = { ...locals, ..._locals }\n\n locals = { ...locals, ...data }\n\n if (opts.cache == null) (opts.cache as boolean) = this.enabled('view cache')\n\n if (opts.cache) {\n view = this.cache[name] as View\n }\n\n if (!view) {\n const View = this.settings.view\n view = new View(name, {\n defaultEngine: this.settings['view engine'],\n root: this.settings.views,\n engines: this.engines\n })\n\n if (!view.path) {\n const dirs =\n Array.isArray(view.root) && view.root.length > 1\n ? `directories \"${view.root.slice(0, -1).join('\", \"')}\" or \"${view.root[view.root.length - 1]}\"`\n : `directory \"${view.root}\"`\n const err = new Error(`Failed to lookup view \"${name}\" in views ${dirs}`)\n\n return cb(err)\n }\n\n if (opts.cache) {\n this.cache[name] = view\n }\n }\n\n try {\n view.render(opts, locals, cb)\n } catch (err) {\n cb(err)\n }\n }\n use(...args: UseMethodParams<Req, Res, App>): this {\n const base = args[0]\n\n const fns = args.slice(1).flat()\n\n let pathArray = []\n if (typeof base === 'function' || base instanceof App) {\n fns.unshift(base)\n } else {\n // if base is not an array of paths, then convert it to an array.\n let basePaths = []\n if (Array.isArray(base)) basePaths = [...base]\n else if (typeof base === 'string') basePaths = [base]\n\n basePaths = basePaths.filter((element) => {\n if (typeof element === 'string') {\n pathArray.push(element)\n return false\n }\n return true\n })\n fns.unshift(...basePaths)\n }\n pathArray = pathArray.length ? pathArray.map((path) => lead(path)) : ['/']\n\n const mountpath = pathArray.join(', ')\n let regex: { keys: string[]; pattern: RegExp }\n\n for (const fn of fns) {\n if (fn instanceof App) {\n for (const path of pathArray) {\n regex = rg(path, true)\n fn.mountpath = mountpath\n this.apps[path] = fn\n fn.parent = this\n }\n }\n }\n for (const path of pathArray) {\n const handlerPaths = []\n const handlerFunctions = []\n const handlerPathBase = path === '/' ? '' : lead(path)\n for (const fn of fns) {\n if (fn instanceof App && fn.middleware?.length) {\n for (const mw of fn.middleware) {\n handlerPaths.push(handlerPathBase + lead(mw.path))\n handlerFunctions.push(fn)\n }\n } else {\n handlerPaths.push('')\n handlerFunctions.push(fn)\n }\n }\n pushMiddleware(this.middleware)({\n path,\n regex,\n type: 'mw',\n handler: mount(handlerFunctions[0] as Handler),\n handlers: handlerFunctions.slice(1).map(mount),\n fullPaths: handlerPaths\n })\n }\n\n return this\n }\n\n route(path: string): App {\n const app = new App({ settings: this.settings })\n\n this.use(path, app)\n\n return app\n }\n\n #find(url: string): Middleware<Req, Res>[] {\n return this.middleware.filter((m) => {\n m.regex = m.regex || rg(m.path, m.type === 'mw')\n\n let fullPathRegex: { keys: string[]; pattern: RegExp }\n\n m.fullPath && typeof m.fullPath === 'string'\n ? (fullPathRegex = rg(m.fullPath, m.type === 'mw'))\n : (fullPathRegex = null)\n\n return m.regex.pattern.test(url) && (m.type === 'mw' && fullPathRegex ? fullPathRegex.pattern.test(url) : true)\n })\n }\n\n /**\n * Extends Req / Res objects, pushes 404 and 500 handlers, dispatches middleware\n * @param req Req object\n * @param res Res object\n */\n handler<RenderOptions extends TemplateEngineOptions = TemplateEngineOptions>(\n req: Req,\n res: Res,\n next?: NextFunction\n ): void {\n /* Set X-Powered-By header */\n const { xPoweredBy } = this.settings\n if (xPoweredBy) res.setHeader('X-Powered-By', typeof xPoweredBy === 'string' ? xPoweredBy : 'tinyhttp')\n\n const exts = this.applyExtensions || extendMiddleware<RenderOptions>(this)\n\n req.originalUrl = req.url || req.originalUrl\n\n const pathname = getPathname(req.originalUrl)\n\n const matched = this.#find(pathname)\n\n const mw: Middleware[] = [\n {\n handler: exts,\n type: 'mw',\n path: '/'\n },\n ...matched.filter((x) => req.method === 'HEAD' || (x.method ? x.method === req.method : true))\n ]\n\n if (matched[0] != null) {\n mw.push({\n type: 'mw',\n handler: (req, res, next) => {\n if (req.method === 'HEAD') {\n res.statusCode = 204\n return res.end('')\n }\n next()\n },\n path: '/'\n })\n }\n\n mw.push({\n handler: this.noMatchHandler,\n type: 'mw',\n path: '/'\n })\n\n const handle = (mw: Middleware) => async (req: Req, res: Res, next?: NextFunction) => {\n const { path, handler, regex } = mw\n\n let params: URLParams\n\n try {\n params = regex ? getURLParams(regex, pathname) : {}\n } catch (e) {\n console.error(e)\n if (e instanceof URIError) return res.sendStatus(400)\n throw e\n }\n\n // Warning: users should not use :wild as a pattern\n let prefix = path\n if (regex) {\n for (const key of regex.keys as string[]) {\n if (key === 'wild') {\n prefix = prefix.replace('*', params.wild)\n } else {\n prefix = prefix.replace(`:${key}`, params[key])\n }\n }\n }\n\n req.params = { ...req.params, ...params }\n\n if (mw.type === 'mw') {\n req.url = lead(req.originalUrl.substring(prefix.length))\n }\n\n if (!req.path) req.path = getPathname(req.url)\n\n if (this.settings?.enableReqRoute) req.route = mw\n\n await applyHandler<Req, Res>(handler as unknown as Handler<Req, Res>)(req, res, next)\n }\n\n let idx = 0\n\n const loop = () => res.writableEnded || (idx < mw.length && handle(mw[idx++])(req, res, next))\n\n next = next || ((err) => (err ? this.onError(err, req, res) : loop()))\n\n loop()\n }\n\n /**\n * Creates HTTP server and dispatches middleware\n * @param port server listening port\n * @param Server callback after server starts listening\n * @param host server listening host\n */\n listen(port?: number, cb?: () => void, host?: string): Server {\n return createServer().on('request', this.attach).listen(port, host, cb)\n }\n}\n"],"names":["proxyAddr","View","rg","req","res","next","mw"],"mappings":"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"}
|
package/dist/onError.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
1
|
+
import { NextFunction } from '@tinyhttp/router';
|
|
2
|
+
import { App } from './app.js';
|
|
3
|
+
import { Request } from './request.js';
|
|
4
|
+
import { Response } from './response.js';
|
|
5
|
+
|
|
5
6
|
export type ErrorHandler = (this: App, err: any, req: Request, res: Response, next?: NextFunction) => void;
|
|
6
7
|
export declare const onErrorHandler: ErrorHandler;
|
|
7
8
|
//# sourceMappingURL=onError.d.ts.map
|
package/dist/onError.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onError.d.ts","sourceRoot":"","sources":["../src/onError.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"onError.d.ts","sourceRoot":"","sources":["../src/onError.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,YAAY,KAAK,IAAI,CAAA;AAE1G,eAAO,MAAM,cAAc,EAAE,YAU5B,CAAA"}
|
package/dist/request.d.ts
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
/// <reference types="node" />
|
|
4
|
-
/// <reference types="node" />
|
|
5
1
|
import { IncomingMessage } from 'node:http';
|
|
6
|
-
import
|
|
2
|
+
import { ParsedUrlQuery } from 'node:querystring';
|
|
7
3
|
import { Options, Ranges } from 'header-range-parser';
|
|
4
|
+
import { Middleware } from '@tinyhttp/router';
|
|
8
5
|
import { App } from './app.js';
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
|
|
6
|
+
import { Socket } from 'node:net';
|
|
7
|
+
import { TLSSocket } from 'node:tls';
|
|
8
|
+
import { URLParams } from '@tinyhttp/req';
|
|
9
|
+
|
|
13
10
|
export { getURLParams } from '@tinyhttp/req';
|
|
14
11
|
export declare const getProtocol: (req: Request) => Protocol;
|
|
15
12
|
export declare const getHostname: (req: Request) => string | undefined;
|
|
16
|
-
export declare const getIP: (req: Pick<Request,
|
|
17
|
-
export declare const getIPs: (req: Pick<Request,
|
|
13
|
+
export declare const getIP: (req: Pick<Request, "headers" | "connection" | "socket">) => string | undefined;
|
|
14
|
+
export declare const getIPs: (req: Pick<Request, "headers" | "connection" | "socket">) => string[] | undefined;
|
|
18
15
|
export declare const getSubdomains: (req: Request, subdomainOffset?: number) => string[];
|
|
19
16
|
export type Connection = IncomingMessage['socket'] & {
|
|
20
17
|
encrypted: boolean;
|
package/dist/request.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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"}
|
package/dist/response.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
1
|
import { ServerResponse } from 'node:http';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
2
|
+
import { SerializeOptions } from '@tinyhttp/cookie';
|
|
3
|
+
import { DownloadOptions, FormatProps, ReadStreamOptions } from '@tinyhttp/res';
|
|
5
4
|
import { App } from './app.js';
|
|
6
|
-
import
|
|
7
|
-
import
|
|
5
|
+
import { Request } from './request.js';
|
|
6
|
+
import { AppRenderOptions, TemplateEngineOptions } from './types.js';
|
|
7
|
+
|
|
8
8
|
export declare const renderTemplate: <O extends TemplateEngineOptions = TemplateEngineOptions>(_req: Request, res: Response, app: App) => (file: string, data?: Record<string, unknown>, options?: AppRenderOptions<O>) => Response;
|
|
9
9
|
export interface Response<B = unknown> extends ServerResponse {
|
|
10
10
|
header(field: string | Record<string, unknown>, val?: string | any[]): Response<B>;
|
package/dist/response.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACpF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEzE,eAAO,MAAM,cAAc,GACxB,CAAC,SAAS,qBAAqB,gCAAgC,OAAO,OAAO,QAAQ,OAAO,GAAG,YACzF,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAG,QAM9E,CAAA;AAEH,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,cAAc;IAC3D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAClF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC/E,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC9F,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACnC,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC3C,MAAM,CACJ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,GACxD,QAAQ,CAAC,CAAC,CAAC,CAAA;IACd,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAClE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAClC,KAAK,CAAC,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACpD,MAAM,CAAC,CAAC,SAAS,qBAAqB,GAAG,qBAAqB,EAC5D,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC5B,QAAQ,CAAC,CAAC,CAAC,CAAA;IACd,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAChC,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACnD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC9G,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC1C,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC3B;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAE5B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;CAC/C"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
1
|
+
import { Handler, NextFunction } from '@tinyhttp/router';
|
|
2
|
+
import { ErrorHandler } from './onError.js';
|
|
3
|
+
import { Request } from './request.js';
|
|
4
|
+
import { Response } from './response.js';
|
|
5
|
+
import { View } from './view.js';
|
|
6
|
+
|
|
6
7
|
/**
|
|
7
8
|
* tinyhttp App has a few settings for toggling features
|
|
8
9
|
*/
|
package/dist/view.d.ts
CHANGED
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* express
|
|
4
|
-
* Copyright(c) 2009-2013 TJ Holowaychuk
|
|
5
|
-
* Copyright(c) 2013 Roman Shtylman
|
|
6
|
-
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
|
7
|
-
* MIT Licensed
|
|
8
|
-
*/
|
|
9
|
-
import { TemplateEngineOptions, TemplateEngine } from './types.js';
|
|
1
|
+
import { TemplateEngine, TemplateEngineOptions } from './types.js';
|
|
2
|
+
|
|
10
3
|
/**
|
|
11
4
|
* Initialize a new `View` with the given `name`.
|
|
12
5
|
*
|
package/dist/view.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAUvE;;;;;;;;;;;;GAYG;AAEH,qBAAa,IAAI,CAAC,aAAa,SAAS,qBAAqB,GAAG,qBAAqB;;IACnF,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,CAAA;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;gBAErB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,OAAO,CAAC;QACZ,aAAa,EAAE,MAAM,CAAA;QACrB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;QACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC,CAAA;KACvD,CAAM;IA4DT,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI;CAG7G"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tinyhttp/app",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.4",
|
|
4
4
|
"description": "0-legacy, tiny & fast web framework as a replacement of Express",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://tinyhttp.v1rtl.site",
|
|
@@ -33,12 +33,12 @@
|
|
|
33
33
|
"license": "MIT",
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"header-range-parser": "1.1.3",
|
|
36
|
-
"regexparam": "^2.0.
|
|
37
|
-
"@tinyhttp/cookie": "2.1.
|
|
38
|
-
"@tinyhttp/proxy-addr": "2.1.
|
|
39
|
-
"@tinyhttp/req": "2.2.
|
|
40
|
-
"@tinyhttp/res": "2.2.
|
|
41
|
-
"@tinyhttp/router": "2.2.
|
|
36
|
+
"regexparam": "^2.0.2",
|
|
37
|
+
"@tinyhttp/cookie": "2.1.1",
|
|
38
|
+
"@tinyhttp/proxy-addr": "2.1.4",
|
|
39
|
+
"@tinyhttp/req": "2.2.3",
|
|
40
|
+
"@tinyhttp/res": "2.2.3",
|
|
41
|
+
"@tinyhttp/router": "2.2.2"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
44
|
"dev": "vite",
|