@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 CHANGED
@@ -1,12 +1,11 @@
1
- /// <reference types="node" />
2
1
  import { Server } from 'node:http';
3
- import type { Request } from './request.js';
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: Record<string, unknown>, options: AppRenderOptions<RenderOptions>, cb: (err: unknown, html?: unknown) => void): void;
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":";AAAA,OAAO,EAAgB,MAAM,EAAE,MAAM,WAAW,CAAA;AAEhD,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC1F,OAAO,EAAE,MAAM,EAAkB,MAAM,kBAAkB,CAAA;AAIzD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAuBlD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,GAAG,CAAC,GAAG,SAAS,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;;IAC5G,UAAU,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAK;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAK;IACpC,cAAc,EAAE,OAAO,CAAA;IACvB,OAAO,EAAE,YAAY,CAAA;IACrB,QAAQ,EAAE,WAAW,CAAA;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAK;IAC5C,eAAe,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAA;IAC1E,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAElB,OAAO,GAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAM;IAgBlD;;;;OAIG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAMzE;;;OAGG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAMrD;;;;OAIG;IACH,OAAO,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO;IAIzD;;;OAGG;IACH,OAAO,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAMtD;;;;;;;;;;OAUG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,MAAM,CAAC,aAAa,SAAS,qBAAqB,GAAG,qBAAqB,EACxE,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,cAAc,CAAC,aAAa,CAAC,GAChC,IAAI;IAMP;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,SAAS,qBAAqB,GAAG,qBAAqB,EACxE,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,OAAO,EAAE,gBAAgB,CAAC,aAAa,CAAyC,EAChF,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,GACzC,IAAI;IA8CP,GAAG,CAAC,GAAG,IAAI,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI;IAiElD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAsBxB;;;;OAIG;IACH,OAAO,CAAC,aAAa,SAAS,qBAAqB,GAAG,qBAAqB,EACzE,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,IAAI,CAAC,EAAE,YAAY,GAClB,IAAI;IAyFP;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;CAG9D"}
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 { Request } from './request.js';
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
  */
@@ -1 +1 @@
1
- {"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,OAAO,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAkC7C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAElD;;GAEG;AACH,eAAO,MAAM,gBAAgB,6EACgD,GAAG,WACxE,OAAO,sCAAsC,YAAY,KAAG,IAsDjE,CAAA"}
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>;
@@ -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,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EACV,YAAY,EACZ,OAAO,IAAI,QAAQ,EACnB,YAAY,IAAI,aAAa,EAC7B,WAAW,IAAI,YAAY,EAC3B,UAAU,EACX,MAAM,kBAAkB,CAAA;AAEzB,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"}
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 { extname, resolve, dirname, basename, join } from "node:path";
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
- host = req.get("Host");
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] !== "." ? "." + this.defaultEngine : this.defaultEngine;
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 && stat.isFile()) {
139
+ if (stat == null ? void 0 : stat.isFile()) {
152
140
  return path;
153
141
  }
154
- path = join(dir, basename(file, ext), "index" + ext);
142
+ path = join(dir, basename(file, ext), `index${ext}`);
155
143
  stat = tryStat(path);
156
- if (stat && stat.isFile()) {
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 : "/" + 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["view"];
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 ? 'directories "' + view.root.slice(0, -1).join('", "') + '" or "' + view.root[view.root.length - 1] + '"' : 'directory "' + view.root + '"';
277
- const err = new Error('Failed to lookup view "' + name + '" in views ' + dirs);
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
- basePaths = [...base];
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
- pathArray.forEach((path) => {
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
- pathArray.forEach((path) => {
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
- return res2.sendStatus(400);
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
- req2.path = getPathname(req2.url);
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":"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"}
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 type { NextFunction } from '@tinyhttp/router';
2
- import type { Request } from './request.js';
3
- import type { Response } from './response.js';
4
- import type { App } from './app.js';
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
@@ -1 +1 @@
1
- {"version":3,"file":"onError.d.ts","sourceRoot":"","sources":["../src/onError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAEnC,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"}
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 type { ParsedUrlQuery } from 'node:querystring';
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 type { Middleware } from '@tinyhttp/router';
10
- import type { URLParams } from '@tinyhttp/req';
11
- import type { Socket } from 'node:net';
12
- import type { TLSSocket } from 'node:tls';
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, 'headers' | 'connection' | 'socket'>) => string | undefined;
17
- export declare const getIPs: (req: Pick<Request, 'headers' | 'connection' | 'socket'>) => string[] | undefined;
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;
@@ -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":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAGtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAGnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAQ5C,eAAO,MAAM,WAAW,QAAS,OAAO,KAAG,QAU1C,CAAA;AAED,eAAO,MAAM,WAAW,QAAS,OAAO,KAAG,MAAM,GAAG,SAWnD,CAAA;AAED,eAAO,MAAM,KAAK,QAAS,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC,KAAG,MAAM,GAAG,SAC5B,CAAA;AAE7D,eAAO,MAAM,MAAM,QAAS,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC,KAAG,MAAM,EAAE,GAAG,SACzD,CAAA;AAEnC,eAAO,MAAM,aAAa,QAAS,OAAO,+BAAwB,MAAM,EAQvE,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG;IACnD,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAEhD,YAAY,EAAE,SAAS,EAAE,CAAA;AAEzB,KAAK,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAA;AAEjD,MAAM,WAAW,OAAQ,SAAQ,eAAe;IAC9C,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,cAAc,CAAA;IACrB,MAAM,EAAE,SAAS,CAAA;IACjB,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,SAAS,GAAG,MAAM,CAAA;IAC1B,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,OAAO,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;IACtD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS,CAAA;IAC7E,OAAO,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,cAAc,CAAA;IAC/C,gBAAgB,EAAE,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,KAAK,cAAc,CAAA;IAC5D,eAAe,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,cAAc,CAAA;IAC1D,gBAAgB,EAAE,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,KAAK,cAAc,CAAA;IAC5D,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAA;IACnC,OAAO,CAAC,EAAE,GAAG,CAAA;IACb,aAAa,CAAC,EAAE,GAAG,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,GAAG,CAAC,EAAE,GAAG,CAAA;CACV"}
@@ -1,10 +1,10 @@
1
- /// <reference types="node" />
2
1
  import { ServerResponse } from 'node:http';
3
- import type { SerializeOptions } from '@tinyhttp/cookie';
4
- import { Request } from './request.js';
2
+ import { SerializeOptions } from '@tinyhttp/cookie';
3
+ import { DownloadOptions, FormatProps, ReadStreamOptions } from '@tinyhttp/res';
5
4
  import { App } from './app.js';
6
- import type { ReadStreamOptions, FormatProps, DownloadOptions } from '@tinyhttp/res';
7
- import type { AppRenderOptions, TemplateEngineOptions } from './types.js';
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>;
@@ -1 +1 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import type { Handler, NextFunction } from '@tinyhttp/router';
2
- import type { ErrorHandler } from './onError.js';
3
- import type { Request } from './request.js';
4
- import type { Response } from './response.js';
5
- import type { View } from './view.js';
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
- * Ported from https://github.com/expressjs/express/blob/master/lib/view.js
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
  *
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAWlE;;;;;;;;;;;;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"}
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.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.1",
37
- "@tinyhttp/cookie": "2.1.0",
38
- "@tinyhttp/proxy-addr": "2.1.2",
39
- "@tinyhttp/req": "2.2.1",
40
- "@tinyhttp/res": "2.2.1",
41
- "@tinyhttp/router": "2.2.1"
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",