@tinyhttp/app 2.3.1 → 2.4.0

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/index.js CHANGED
@@ -1,464 +1,7 @@
1
- import { STATUS_CODES, createServer } from "node:http";
2
- import { getRequestHeader, getQueryParams, getRangeFromHeader, getAccepts, getAcceptsCharsets, getAcceptsEncodings, getAcceptsLanguages, checkIfXMLHttpRequest, getFreshOrStale, getPathname, getURLParams } from "@tinyhttp/req";
3
- import { getURLParams as getURLParams2 } from "@tinyhttp/req";
4
- import { Router, pushMiddleware } from "@tinyhttp/router";
5
- import { parse } from "regexparam";
6
- import { proxyaddr, all, compile } from "@tinyhttp/proxy-addr";
7
- import { getResponseHeader, setHeader, send, json, status, sendStatus, sendFile, setContentType, setLocationHeader, setLinksHeader, setVaryHeader, setCookie, clearCookie, formatResponse, redirect, attachment, download, append } from "@tinyhttp/res";
8
- import { isIP } from "node:net";
9
- import { statSync } from "node:fs";
10
- import { extname, resolve, dirname, basename, join } from "node:path";
11
- const trustRemoteAddress = ({ socket }, trust) => {
12
- const val = socket.remoteAddress;
13
- if (typeof trust !== "function") trust = compile(trust);
14
- return trust(val, 0);
15
- };
16
- const getProtocol = (req, trust) => {
17
- const proto = `http${req.secure ? "s" : ""}`;
18
- if (!trustRemoteAddress(req, trust)) return proto;
19
- const header = req.headers["X-Forwarded-Proto"] || proto;
20
- const index = header.indexOf(",");
21
- return index !== -1 ? header.substring(0, index).trim() : header.trim();
22
- };
23
- const getHostname = (req, trust) => {
24
- let host = req.get("X-Forwarded-Host");
25
- if (!host || !trustRemoteAddress(req, trust)) host = req.get("Host");
26
- if (!host) return;
27
- const index = host.indexOf(":", host[0] === "[" ? host.indexOf("]") + 1 : 0);
28
- return index !== -1 ? host.substring(0, index) : host;
29
- };
30
- const getIP = (req, trust) => proxyaddr(req, trust).replace(/^.*:/, "");
31
- const getIPs = (req, trust) => all(req, trust);
32
- const getSubdomains = (req, trust, subdomainOffset = 2) => {
33
- const hostname = getHostname(req, trust);
34
- if (!hostname) return [];
35
- const subdomains = isIP(hostname) ? [hostname] : hostname.split(".").reverse();
36
- return subdomains.slice(subdomainOffset);
37
- };
38
- const renderTemplate = (_req, res, app) => (file, data, options) => {
39
- app.render(file, data ? { ...res.locals, ...data } : res.locals, options, (err, html) => {
40
- if (err) throw err;
41
- res.send(html);
42
- });
43
- return res;
44
- };
45
- const extendMiddleware = (app) => (req, res, next) => {
46
- const { settings } = app;
47
- res.get = getResponseHeader(res);
48
- req.get = getRequestHeader(req);
49
- if (settings == null ? void 0 : settings.bindAppToReqRes) {
50
- req.app = app;
51
- res.app = app;
52
- }
53
- let trust = settings == null ? void 0 : settings["trust proxy"];
54
- if (typeof trust !== "function") {
55
- trust = compile(trust);
56
- settings["trust proxy"] = trust;
57
- }
58
- if (settings == null ? void 0 : settings.networkExtensions) {
59
- req.protocol = getProtocol(req, trust);
60
- req.secure = req.protocol === "https";
61
- req.hostname = getHostname(req, trust);
62
- req.subdomains = getSubdomains(req, trust, settings.subdomainOffset);
63
- req.ip = getIP(req, trust);
64
- req.ips = getIPs(req, trust);
65
- }
66
- req.query = getQueryParams(req.url);
67
- req.range = getRangeFromHeader(req);
68
- req.accepts = getAccepts(req);
69
- req.acceptsCharsets = getAcceptsCharsets(req);
70
- req.acceptsEncodings = getAcceptsEncodings(req);
71
- req.acceptsLanguages = getAcceptsLanguages(req);
72
- req.xhr = checkIfXMLHttpRequest(req);
73
- res.header = res.set = setHeader(res);
74
- res.send = send(req, res);
75
- res.json = json(res);
76
- res.status = status(res);
77
- res.sendStatus = sendStatus(req, res);
78
- res.sendFile = sendFile(req, res);
79
- res.type = setContentType(res);
80
- res.location = setLocationHeader(req, res);
81
- res.links = setLinksHeader(res);
82
- res.vary = setVaryHeader(res);
83
- res.cookie = setCookie(req, res);
84
- res.clearCookie = clearCookie(req, res);
85
- res.render = renderTemplate(req, res, app);
86
- res.format = formatResponse(req, res, next);
87
- res.redirect = redirect(req, res, next);
88
- res.attachment = attachment(res);
89
- res.download = download(req, res);
90
- res.append = append(res);
91
- res.locals = res.locals || /* @__PURE__ */ Object.create(null);
92
- Object.defineProperty(req, "fresh", { get: getFreshOrStale.bind(null, req, res), configurable: true });
93
- req.stale = !req.fresh;
94
- next();
95
- };
96
- const onErrorHandler = function(err, _req, res) {
97
- if (this.onError === onErrorHandler && this.parent) return this.parent.onError(err, _req, res);
98
- if (err instanceof Error) console.error(err);
99
- const code = err.code in STATUS_CODES ? err.code : err.status;
100
- if (typeof err === "string" || Buffer.isBuffer(err)) res.writeHead(500).end(err);
101
- else if (code in STATUS_CODES) res.writeHead(code).end(STATUS_CODES[code]);
102
- else res.writeHead(500).end(err.message);
103
- };
104
- function tryStat(path) {
105
- try {
106
- return statSync(path);
107
- } catch (e) {
108
- return void 0;
109
- }
110
- }
111
- class View {
112
- constructor(name, opts = {}) {
113
- this.ext = extname(name);
114
- this.name = name;
115
- this.root = opts.root;
116
- this.defaultEngine = opts.defaultEngine;
117
- if (!this.ext && !this.defaultEngine)
118
- throw new Error("No default engine was specified and no extension was provided.");
119
- let fileName = name;
120
- if (!this.ext) {
121
- this.ext = this.defaultEngine[0] !== "." ? `.${this.defaultEngine}` : this.defaultEngine;
122
- fileName += this.ext;
123
- }
124
- if (!opts.engines[this.ext]) throw new Error(`No engine was found for ${this.ext}`);
125
- this.engine = opts.engines[this.ext];
126
- this.path = this.#lookup(fileName);
127
- }
128
- #lookup(name) {
129
- let path;
130
- const roots = [].concat(this.root);
131
- for (let i = 0; i < roots.length && !path; i++) {
132
- const root = roots[i];
133
- const loc = resolve(root, name);
134
- const dir = dirname(loc);
135
- const file = basename(loc);
136
- path = this.#resolve(dir, file);
137
- }
138
- return path;
139
- }
140
- #resolve(dir, file) {
141
- const ext = this.ext;
142
- let path = join(dir, file);
143
- let stat = tryStat(path);
144
- if (stat == null ? void 0 : stat.isFile()) {
145
- return path;
146
- }
147
- path = join(dir, basename(file, ext), `index${ext}`);
148
- stat = tryStat(path);
149
- if (stat == null ? void 0 : stat.isFile()) {
150
- return path;
151
- }
152
- }
153
- render(options, data, cb) {
154
- this.engine(this.path, data, options, cb);
155
- }
156
- }
157
- const lead = (x) => x.charCodeAt(0) === 47 ? x : `/${x}`;
158
- const mount = (fn) => fn instanceof App ? fn.attach : fn;
159
- const applyHandler = (h) => async (req, res, next) => {
160
- try {
161
- if (h[Symbol.toStringTag] === "AsyncFunction") {
162
- await h(req, res, next);
163
- } else h(req, res, next);
164
- } catch (e) {
165
- next(e);
166
- }
167
- };
168
- class App extends Router {
169
- constructor(options = {}) {
170
- super();
171
- this.middleware = [];
172
- this.locals = {};
173
- this.engines = {};
174
- this.onError = (options == null ? void 0 : options.onError) || onErrorHandler;
175
- this.noMatchHandler = (options == null ? void 0 : options.noMatchHandler) || this.onError.bind(this, { code: 404 });
176
- this.settings = {
177
- view: View,
178
- xPoweredBy: true,
179
- views: `${process.cwd()}/views`,
180
- "view cache": process.env.NODE_ENV === "production",
181
- "trust proxy": 0,
182
- ...options.settings
183
- };
184
- this.applyExtensions = options == null ? void 0 : options.applyExtensions;
185
- const boundHandler = this.handler.bind(this);
186
- this.attach = (req, res, next) => setImmediate(boundHandler, req, res, next);
187
- this.cache = {};
188
- }
189
- /**
190
- * Set app setting
191
- * @param setting setting name
192
- * @param value setting value
193
- */
194
- set(setting, value) {
195
- this.settings[setting] = value;
196
- return this;
197
- }
198
- /**
199
- * Enable app setting
200
- * @param setting Setting name
201
- */
202
- enable(setting) {
203
- this.settings[setting] = true;
204
- return this;
205
- }
206
- /**
207
- * Check if setting is enabled
208
- * @param setting Setting name
209
- * @returns
210
- */
211
- enabled(setting) {
212
- return Boolean(this.settings[setting]);
213
- }
214
- /**
215
- * Disable app setting
216
- * @param setting Setting name
217
- */
218
- disable(setting) {
219
- this.settings[setting] = false;
220
- return this;
221
- }
222
- /**
223
- * Return the app's absolute pathname
224
- * based on the parent(s) that have
225
- * mounted it.
226
- *
227
- * For example if the application was
228
- * mounted as `"/admin"`, which itself
229
- * was mounted as `"/blog"` then the
230
- * return value would be `"/blog/admin"`.
231
- *
232
- */
233
- path() {
234
- return this.parent ? this.parent.path() + this.mountpath : "";
235
- }
236
- /**
237
- * Register a template engine with extension
238
- */
239
- engine(ext, fn) {
240
- this.engines[ext[0] === "." ? ext : `.${ext}`] = fn;
241
- return this;
242
- }
243
- /**
244
- * Render a template
245
- * @param name What to render
246
- * @param data data that is passed to a template
247
- * @param options Template engine options
248
- * @param cb Callback that consumes error and html
249
- */
250
- render(name, data = {}, options = {}, cb = () => {
251
- }) {
252
- let view;
253
- const { _locals, ...opts } = options;
254
- let locals = this.locals;
255
- if (_locals) locals = { ...locals, ..._locals };
256
- locals = { ...locals, ...data };
257
- if (opts.cache == null) opts.cache = this.enabled("view cache");
258
- if (opts.cache) {
259
- view = this.cache[name];
260
- }
261
- if (!view) {
262
- const View2 = this.settings.view;
263
- view = new View2(name, {
264
- defaultEngine: this.settings["view engine"],
265
- root: this.settings.views,
266
- engines: this.engines
267
- });
268
- if (!view.path) {
269
- 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}"`;
270
- const err = new Error(`Failed to lookup view "${name}" in views ${dirs}`);
271
- return cb(err);
272
- }
273
- if (opts.cache) {
274
- this.cache[name] = view;
275
- }
276
- }
277
- try {
278
- view.render(opts, locals, cb);
279
- } catch (err) {
280
- cb(err);
281
- }
282
- }
283
- use(...args) {
284
- var _a;
285
- const base = args[0];
286
- const fns = args.slice(1).flat();
287
- let pathArray = [];
288
- if (typeof base === "function" || base instanceof App) {
289
- fns.unshift(base);
290
- } else {
291
- let basePaths = [];
292
- if (Array.isArray(base)) basePaths = [...base];
293
- else if (typeof base === "string") basePaths = [base];
294
- basePaths = basePaths.filter((element) => {
295
- if (typeof element === "string") {
296
- pathArray.push(element);
297
- return false;
298
- }
299
- return true;
300
- });
301
- fns.unshift(...basePaths);
302
- }
303
- pathArray = pathArray.length ? pathArray.map((path) => lead(path)) : ["/"];
304
- const mountpath = pathArray.join(", ");
305
- let regex;
306
- for (const fn of fns) {
307
- if (fn instanceof App) {
308
- for (const path of pathArray) {
309
- regex = parse(path, true);
310
- fn.mountpath = mountpath;
311
- this.apps[path] = fn;
312
- fn.parent = this;
313
- }
314
- }
315
- }
316
- for (const path of pathArray) {
317
- const handlerPaths = [];
318
- const handlerFunctions = [];
319
- const handlerPathBase = path === "/" ? "" : lead(path);
320
- for (const fn of fns) {
321
- if (fn instanceof App && ((_a = fn.middleware) == null ? void 0 : _a.length)) {
322
- for (const mw of fn.middleware) {
323
- handlerPaths.push(handlerPathBase + lead(mw.path));
324
- handlerFunctions.push(fn);
325
- }
326
- } else {
327
- handlerPaths.push("");
328
- handlerFunctions.push(fn);
329
- }
330
- }
331
- pushMiddleware(this.middleware)({
332
- path,
333
- regex,
334
- type: "mw",
335
- handler: mount(handlerFunctions[0]),
336
- handlers: handlerFunctions.slice(1).map(mount),
337
- fullPaths: handlerPaths
338
- });
339
- }
340
- return this;
341
- }
342
- route(path) {
343
- const app = new App({ settings: this.settings });
344
- this.use(path, app);
345
- return app;
346
- }
347
- #find(url) {
348
- return this.middleware.filter((m) => {
349
- m.regex = m.regex || parse(m.path, m.type === "mw");
350
- let fullPathRegex;
351
- m.fullPath && typeof m.fullPath === "string" ? fullPathRegex = parse(m.fullPath, m.type === "mw") : fullPathRegex = null;
352
- return m.regex.pattern.test(url) && (m.type === "mw" && fullPathRegex ? fullPathRegex.pattern.test(url) : true);
353
- });
354
- }
355
- /**
356
- * Extends Req / Res objects, pushes 404 and 500 handlers, dispatches middleware
357
- * @param req Req object
358
- * @param res Res object
359
- * @param next 'Next' function
360
- */
361
- handler(req, res, next) {
362
- const { xPoweredBy } = this.settings;
363
- if (xPoweredBy) res.setHeader("X-Powered-By", typeof xPoweredBy === "string" ? xPoweredBy : "tinyhttp");
364
- const exts = this.applyExtensions || extendMiddleware(this);
365
- req.originalUrl = req.url || req.originalUrl;
366
- const pathname = getPathname(req.originalUrl);
367
- const matched = this.#find(pathname);
368
- const mw = [
369
- {
370
- handler: exts,
371
- type: "mw",
372
- path: "/"
373
- },
374
- ...matched.filter((x) => req.method === "HEAD" || (x.method ? x.method === req.method : true))
375
- ];
376
- if (matched[0] != null) {
377
- mw.push({
378
- type: "mw",
379
- handler: (req2, res2, next2) => {
380
- if (req2.method === "HEAD") {
381
- res2.statusCode = 204;
382
- return res2.end("");
383
- }
384
- next2();
385
- },
386
- path: "/"
387
- });
388
- }
389
- if (this.parent == null) {
390
- mw.push({
391
- handler: this.noMatchHandler,
392
- type: "mw",
393
- path: "/"
394
- });
395
- }
396
- const handle = (mw2) => async (req2, res2, next2) => {
397
- var _a;
398
- const { path, handler, regex } = mw2;
399
- let params;
400
- try {
401
- params = regex ? getURLParams(regex, pathname) : {};
402
- } catch (e) {
403
- console.error(e);
404
- if (e instanceof URIError) return res2.sendStatus(400);
405
- throw e;
406
- }
407
- let prefix = path;
408
- if (regex) {
409
- for (const key of regex.keys) {
410
- if (key === "wild") {
411
- prefix = prefix.replace("*", params.wild);
412
- } else {
413
- prefix = prefix.replace(`:${key}`, params[key]);
414
- }
415
- }
416
- }
417
- req2.params = { ...req2.params, ...params };
418
- if (mw2.type === "mw") {
419
- req2.url = lead(req2.originalUrl.substring(prefix.length));
420
- }
421
- if (!req2.path) req2.path = getPathname(req2.url);
422
- if ((_a = this.settings) == null ? void 0 : _a.enableReqRoute) req2.route = mw2;
423
- await applyHandler(handler)(req2, res2, next2);
424
- };
425
- let idx = 0;
426
- const loop = () => void handle(mw[idx++])(req, res, next);
427
- const parentNext = next;
428
- next = (err) => {
429
- if (err != null) {
430
- return this.onError(err, req, res);
431
- }
432
- if (res.writableEnded) return;
433
- if (idx >= mw.length) {
434
- if (parentNext != null) parentNext();
435
- return;
436
- }
437
- loop();
438
- };
439
- loop();
440
- }
441
- /**
442
- * Creates HTTP server and dispatches middleware
443
- * @param port server listening port
444
- * @param cb callback to be invoked after server starts listening
445
- * @param host server listening host
446
- */
447
- listen(port, cb, host) {
448
- return createServer().on("request", this.attach).listen(port, host, cb);
449
- }
450
- }
451
- export {
452
- App,
453
- View,
454
- extendMiddleware,
455
- getHostname,
456
- getIP,
457
- getIPs,
458
- getProtocol,
459
- getSubdomains,
460
- getURLParams2 as getURLParams,
461
- onErrorHandler,
462
- renderTemplate
463
- };
464
- //# sourceMappingURL=index.js.map
1
+ export { App } from './app.js';
2
+ export * from './request.js';
3
+ export * from './response.js';
4
+ export { extendMiddleware } from './extend.js';
5
+ export { onErrorHandler } from './onError.js';
6
+ export { View } from './view.js';
7
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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 { type Trust, 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'>, trust: Trust): boolean => {\n const val = socket.remoteAddress\n if (typeof trust !== 'function') trust = compile(trust)\n return trust(val, 0)\n}\n\nexport const getProtocol = (req: Request, trust: Trust): Protocol => {\n const proto = `http${req.secure ? 's' : ''}`\n\n if (!trustRemoteAddress(req, trust)) 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, trust: Trust): string | undefined => {\n let host: string = req.get('X-Forwarded-Host') as string\n\n if (!host || !trustRemoteAddress(req, trust)) 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'>, trust: Trust): string | undefined =>\n proxyAddr(req, trust).replace(/^.*:/, '') // striping the redundant prefix addeded by OS to IPv4 address\n\nexport const getIPs = (req: Pick<Request, 'headers' | 'connection' | 'socket'>, trust: Trust): string[] | undefined =>\n all(req, trust)\n\nexport const getSubdomains = (req: Request, trust: Trust, subdomainOffset = 2): string[] => {\n const hostname = getHostname(req, trust)\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 { compile } from '@tinyhttp/proxy-addr'\nimport {\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 let trust = settings?.['trust proxy']\n if (typeof trust !== 'function') {\n trust = compile(trust)\n settings['trust proxy'] = trust\n }\n\n if (settings?.networkExtensions) {\n req.protocol = getProtocol(req, trust)\n req.secure = req.protocol === 'https'\n req.hostname = getHostname(req, trust)\n req.subdomains = getSubdomains(req, trust, settings.subdomainOffset)\n req.ip = getIP(req, trust)\n req.ips = getIPs(req, trust)\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, next?: NextFunction) => 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 'trust proxy': 0,\n ...options.settings\n }\n this.applyExtensions = options?.applyExtensions\n const boundHandler = this.handler.bind(this)\n this.attach = (req, res, next?: NextFunction) => setImmediate(boundHandler, req, res, next)\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 name 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 * @param next 'Next' function\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 if (this.parent == null) {\n mw.push({\n handler: this.noMatchHandler,\n type: 'mw',\n path: '/'\n })\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 = (): void => void handle(mw[idx++])(req, res, next)\n\n const parentNext = next\n next = (err) => {\n if (err != null) {\n return this.onError(err, req, res)\n }\n\n if (res.writableEnded) return\n if (idx >= mw.length) {\n if (parentNext != null) parentNext()\n return\n }\n\n loop()\n }\n\n loop()\n }\n\n /**\n * Creates HTTP server and dispatches middleware\n * @param port server listening port\n * @param cb callback to be invoked 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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"}
1
+ {"version":3,"file":"index.js","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,EAAqB,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA"}
package/dist/onError.d.ts CHANGED
@@ -1,8 +1,7 @@
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
-
1
+ import type { NextFunction } from '@tinyhttp/router';
2
+ import type { App } from './app.js';
3
+ import type { Request } from './request.js';
4
+ import type { Response } from './response.js';
6
5
  export type ErrorHandler = (this: App, err: any, req: Request, res: Response, next?: NextFunction) => void;
7
6
  export declare const onErrorHandler: ErrorHandler;
8
7
  //# sourceMappingURL=onError.d.ts.map
@@ -0,0 +1,15 @@
1
+ import { STATUS_CODES } from 'node:http';
2
+ export const onErrorHandler = function (err, _req, res) {
3
+ if (this.onError === onErrorHandler && this.parent)
4
+ return this.parent.onError(err, _req, res);
5
+ if (err instanceof Error)
6
+ console.error(err);
7
+ const code = err.code in STATUS_CODES ? err.code : err.status;
8
+ if (typeof err === 'string' || Buffer.isBuffer(err))
9
+ res.writeHead(500).end(err);
10
+ else if (code in STATUS_CODES)
11
+ res.writeHead(code).end(STATUS_CODES[code]);
12
+ else
13
+ res.writeHead(500).end(err.message);
14
+ };
15
+ //# sourceMappingURL=onError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onError.js","sourceRoot":"","sources":["../src/onError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAQxC,MAAM,CAAC,MAAM,cAAc,GAAiB,UAAqB,GAAQ,EAAE,IAAa,EAAE,GAAa;IACrG,IAAI,IAAI,CAAC,OAAO,KAAK,cAAc,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IAE9F,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE5C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAA;IAE7D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;SAC3E,IAAI,IAAI,IAAI,YAAY;QAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;;QACrE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAC1C,CAAC,CAAA"}
package/dist/request.d.ts CHANGED
@@ -1,16 +1,19 @@
1
- import { IncomingMessage } from 'node:http';
2
- import { ParsedUrlQuery } from 'node:querystring';
3
- import { Trust } from '@tinyhttp/proxy-addr';
4
- import { Options, Ranges } from 'header-range-parser';
5
- import { Middleware } from '@tinyhttp/router';
6
- import { App } from './app.js';
7
- import { Socket } from 'node:net';
8
- import { TLSSocket } from 'node:tls';
9
- import { URLParams } from '@tinyhttp/req';
10
-
1
+ import type { IncomingHttpHeaders, IncomingMessage } from 'node:http';
2
+ import type { ParsedUrlQuery } from 'node:querystring';
3
+ import { type Trust } from '@tinyhttp/proxy-addr';
4
+ import type { Options, Ranges } from 'header-range-parser';
5
+ import type { Middleware } from '@tinyhttp/router';
6
+ import type { App } from './app.js';
7
+ import type { Socket } from 'node:net';
8
+ import type { TLSSocket } from 'node:tls';
9
+ import type { URLParams } from '@tinyhttp/req';
11
10
  export { getURLParams } from '@tinyhttp/req';
11
+ export type Host = {
12
+ hostname: string;
13
+ port?: number;
14
+ };
12
15
  export declare const getProtocol: (req: Request, trust: Trust) => Protocol;
13
- export declare const getHostname: (req: Request, trust: Trust) => string | undefined;
16
+ export declare const getHost: (req: Request, trust: Trust) => Host | undefined;
14
17
  export declare const getIP: (req: Pick<Request, "headers" | "connection" | "socket">, trust: Trust) => string | undefined;
15
18
  export declare const getIPs: (req: Pick<Request, "headers" | "connection" | "socket">, trust: Trust) => string[] | undefined;
16
19
  export declare const getSubdomains: (req: Request, trust: Trust, subdomainOffset?: number) => string[];
@@ -24,6 +27,7 @@ export interface Request extends IncomingMessage {
24
27
  originalUrl: string;
25
28
  path: string;
26
29
  url: string;
30
+ baseUrl: string;
27
31
  query: ParsedUrlQuery;
28
32
  params: URLParams;
29
33
  connection: Connection;
@@ -33,10 +37,11 @@ export interface Request extends IncomingMessage {
33
37
  secure: boolean;
34
38
  xhr: boolean;
35
39
  hostname?: string;
40
+ port?: number;
36
41
  ip?: string;
37
42
  ips?: string[];
38
43
  subdomains?: string[];
39
- get: (header: string) => string | string[] | undefined;
44
+ get: <HeaderName extends string>(header: HeaderName) => IncomingHttpHeaders[HeaderName];
40
45
  range: (size: number, options?: Options) => -1 | -2 | -3 | Ranges | undefined;
41
46
  accepts: (...types: string[]) => AcceptsReturns;
42
47
  acceptsEncodings: (...encodings: string[]) => AcceptsReturns;
@@ -1 +1 @@
1
- {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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"}