@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/app.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- import { Server } from 'node:http';
2
- import { Handler, Middleware, NextFunction, UseMethodParams, Router } from '@tinyhttp/router';
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
-
1
+ import { type Server } from 'node:http';
2
+ import type { Handler, Middleware, NextFunction, UseMethodParams } from '@tinyhttp/router';
3
+ import { Router } from '@tinyhttp/router';
4
+ import type { TemplateEngineOptions } from './index.js';
5
+ import type { ErrorHandler } from './onError.js';
6
+ import type { Request } from './request.js';
7
+ import type { Response } from './response.js';
8
+ import type { AppConstructor, AppRenderOptions, AppSettings, TemplateEngine } from './types.js';
9
9
  /**
10
10
  * `App` class - the starting point of tinyhttp app.
11
11
  *
@@ -36,7 +36,7 @@ export declare class App<Req extends Request = Request, Res extends Response = R
36
36
  onError: ErrorHandler;
37
37
  settings: AppSettings;
38
38
  engines: Record<string, TemplateEngine>;
39
- applyExtensions: (req: Request, res: Response, next: NextFunction) => void;
39
+ applyExtensions?: Handler;
40
40
  attach: (req: Req, res: Res, next?: NextFunction) => void;
41
41
  cache: Record<string, unknown>;
42
42
  constructor(options?: AppConstructor<Req, Res>);
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
package/dist/app.js ADDED
@@ -0,0 +1,377 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _App_instances, _App_find;
7
+ import { createServer } from 'node:http';
8
+ import { getPathname } from '@tinyhttp/req';
9
+ import { Router, pushMiddleware } from '@tinyhttp/router';
10
+ import { parse as rg } from 'regexparam';
11
+ import { extendMiddleware } from './extend.js';
12
+ import { onErrorHandler } from './onError.js';
13
+ import { getURLParams } from './request.js';
14
+ import { View } from './view.js';
15
+ /**
16
+ * Add leading slash if not present (e.g. path -> /path, /path -> /path)
17
+ * @param x
18
+ */
19
+ const lead = (x) => (x.charCodeAt(0) === 47 ? x : `/${x}`);
20
+ const trail = (x) => (x.charCodeAt(x.length - 1) === 47 ? x.substring(0, x.length - 1) : x);
21
+ const mount = (fn) => (fn instanceof App ? fn.attach : fn);
22
+ const applyHandler = (h) => async (req, res, next) => {
23
+ try {
24
+ if (h[Symbol.toStringTag] === 'AsyncFunction') {
25
+ await h(req, res, next);
26
+ }
27
+ else
28
+ h(req, res, next);
29
+ }
30
+ catch (e) {
31
+ next(e);
32
+ }
33
+ };
34
+ /**
35
+ * `App` class - the starting point of tinyhttp app.
36
+ *
37
+ * With the `App` you can:
38
+ * * use routing methods and `.use(...)`
39
+ * * set no match (404) and error (500) handlers
40
+ * * configure template engines
41
+ * * store data in locals
42
+ * * listen the http server on a specified port
43
+ *
44
+ * In case you use TypeScript, you can pass custom types to this class because it is also a generic class.
45
+ *
46
+ * Example:
47
+ *
48
+ * ```ts
49
+ * interface CoolReq extends Request {
50
+ * genericsAreDope: boolean
51
+ * }
52
+ *
53
+ * const app = App<any, CoolReq, Response>()
54
+ * ```
55
+ */
56
+ export class App extends Router {
57
+ constructor(options = {}) {
58
+ super();
59
+ _App_instances.add(this);
60
+ this.middleware = [];
61
+ this.locals = {};
62
+ this.engines = {};
63
+ this.onError = (options === null || options === void 0 ? void 0 : options.onError) || onErrorHandler;
64
+ // @ts-expect-error typescript is not smart enough to understand "this" ts(2345)
65
+ this.noMatchHandler = (options === null || options === void 0 ? void 0 : options.noMatchHandler) || this.onError.bind(this, { code: 404 });
66
+ this.settings = {
67
+ view: View,
68
+ xPoweredBy: true,
69
+ views: `${process.cwd()}/views`,
70
+ 'view cache': process.env.NODE_ENV === 'production',
71
+ 'trust proxy': 0,
72
+ ...options.settings
73
+ };
74
+ if (options.applyExtensions)
75
+ this.applyExtensions = options === null || options === void 0 ? void 0 : options.applyExtensions;
76
+ const boundHandler = this.handler.bind(this);
77
+ this.attach = (req, res, next) => setImmediate(boundHandler, req, res, next);
78
+ this.cache = {};
79
+ }
80
+ /**
81
+ * Set app setting
82
+ * @param setting setting name
83
+ * @param value setting value
84
+ */
85
+ set(setting, value) {
86
+ this.settings[setting] = value;
87
+ return this;
88
+ }
89
+ /**
90
+ * Enable app setting
91
+ * @param setting Setting name
92
+ */
93
+ enable(setting) {
94
+ this.settings[setting] = true;
95
+ return this;
96
+ }
97
+ /**
98
+ * Check if setting is enabled
99
+ * @param setting Setting name
100
+ * @returns
101
+ */
102
+ enabled(setting) {
103
+ return Boolean(this.settings[setting]);
104
+ }
105
+ /**
106
+ * Disable app setting
107
+ * @param setting Setting name
108
+ */
109
+ disable(setting) {
110
+ this.settings[setting] = false;
111
+ return this;
112
+ }
113
+ /**
114
+ * Return the app's absolute pathname
115
+ * based on the parent(s) that have
116
+ * mounted it.
117
+ *
118
+ * For example if the application was
119
+ * mounted as `"/admin"`, which itself
120
+ * was mounted as `"/blog"` then the
121
+ * return value would be `"/blog/admin"`.
122
+ *
123
+ */
124
+ path() {
125
+ return this.parent ? this.parent.path() + this.mountpath : '';
126
+ }
127
+ /**
128
+ * Register a template engine with extension
129
+ */
130
+ engine(ext, fn) {
131
+ this.engines[ext[0] === '.' ? ext : `.${ext}`] = fn;
132
+ return this;
133
+ }
134
+ /**
135
+ * Render a template
136
+ * @param name What to render
137
+ * @param data data that is passed to a template
138
+ * @param options Template engine options
139
+ * @param cb Callback that consumes error and html
140
+ */
141
+ render(name, data = {}, options = {}, cb = () => { }) {
142
+ let view;
143
+ const { _locals, ...opts } = options;
144
+ let locals = this.locals;
145
+ if (_locals)
146
+ locals = { ...locals, ..._locals };
147
+ locals = { ...locals, ...data };
148
+ if (opts.cache == null)
149
+ opts.cache = this.enabled('view cache');
150
+ if (opts.cache) {
151
+ view = this.cache[name];
152
+ }
153
+ if (!view) {
154
+ const View = this.settings.view;
155
+ view = new View(name, {
156
+ defaultEngine: this.settings['view engine'],
157
+ root: this.settings.views,
158
+ engines: this.engines
159
+ });
160
+ if (!view.path) {
161
+ const dirs = Array.isArray(view.root) && view.root.length > 1
162
+ ? `directories "${view.root.slice(0, -1).join('", "')}" or "${view.root[view.root.length - 1]}"`
163
+ : `directory "${view.root}"`;
164
+ const err = new Error(`Failed to lookup view "${name}" in views ${dirs}`);
165
+ return cb(err);
166
+ }
167
+ if (opts.cache) {
168
+ this.cache[name] = view;
169
+ }
170
+ }
171
+ try {
172
+ view.render(opts, locals, cb);
173
+ }
174
+ catch (err) {
175
+ cb(err);
176
+ }
177
+ }
178
+ use(...args) {
179
+ var _a;
180
+ const base = args[0];
181
+ const fns = args.slice(1).flat();
182
+ let pathArray = [];
183
+ if (typeof base === 'function' || base instanceof App) {
184
+ fns.unshift(base);
185
+ }
186
+ else {
187
+ // if base is not an array of paths, then convert it to an array.
188
+ let basePaths = [];
189
+ if (Array.isArray(base))
190
+ basePaths = base;
191
+ else if (typeof base === 'string')
192
+ basePaths = [base];
193
+ basePaths = basePaths.filter((element) => {
194
+ if (typeof element === 'string') {
195
+ pathArray.push(element);
196
+ return false;
197
+ }
198
+ return true;
199
+ });
200
+ fns.unshift(...basePaths);
201
+ }
202
+ pathArray = pathArray.length ? pathArray.map((path) => lead(path)) : ['/'];
203
+ const mountpath = pathArray.join(', ');
204
+ let regex;
205
+ for (const fn of fns) {
206
+ if (fn instanceof App) {
207
+ for (const path of pathArray) {
208
+ regex = rg(path, true);
209
+ fn.mountpath = mountpath;
210
+ this.apps[path] = fn;
211
+ // @ts-expect-error typescript is not smart enough to understand "this" ts(2345)
212
+ fn.parent = this;
213
+ }
214
+ }
215
+ }
216
+ for (const path of pathArray) {
217
+ const handlerPaths = [];
218
+ const handlerFunctions = [];
219
+ const handlerPathBase = path === '/' ? '' : lead(path);
220
+ for (const fn of fns) {
221
+ if (fn instanceof App && ((_a = fn.middleware) === null || _a === void 0 ? void 0 : _a.length)) {
222
+ for (const mw of fn.middleware) {
223
+ handlerPaths.push(handlerPathBase + lead(mw.path));
224
+ handlerFunctions.push(fn);
225
+ }
226
+ }
227
+ else {
228
+ handlerPaths.push('');
229
+ handlerFunctions.push(fn);
230
+ }
231
+ }
232
+ pushMiddleware(this.middleware)({
233
+ path,
234
+ regex,
235
+ type: 'mw',
236
+ handler: mount(handlerFunctions[0]),
237
+ handlers: handlerFunctions.slice(1).map(mount),
238
+ fullPaths: handlerPaths
239
+ });
240
+ }
241
+ return this;
242
+ }
243
+ route(path) {
244
+ const app = new App({ settings: this.settings });
245
+ this.use(path, app);
246
+ return app;
247
+ }
248
+ /**
249
+ * Extends Req / Res objects, pushes 404 and 500 handlers, dispatches middleware
250
+ * @param req Req object
251
+ * @param res Res object
252
+ * @param next 'Next' function
253
+ */
254
+ handler(req, res, next) {
255
+ /* Set X-Powered-By header */
256
+ const { xPoweredBy } = this.settings;
257
+ if (xPoweredBy)
258
+ res.setHeader('X-Powered-By', typeof xPoweredBy === 'string' ? xPoweredBy : 'tinyhttp');
259
+ // @ts-expect-error typescript is not smart enough to understand "this" ts(2345)
260
+ const exts = this.applyExtensions || extendMiddleware(this);
261
+ let mw = [
262
+ {
263
+ handler: exts,
264
+ type: 'mw',
265
+ path: '/'
266
+ }
267
+ ];
268
+ req.baseUrl = '';
269
+ const handle = (mw, pathname) => async (req, res, next) => {
270
+ var _a;
271
+ const { path, handler, regex } = mw;
272
+ let params;
273
+ try {
274
+ params = regex ? getURLParams(regex, pathname) : {};
275
+ }
276
+ catch (e) {
277
+ console.error(e);
278
+ if (e instanceof URIError)
279
+ return res.sendStatus(400);
280
+ throw e;
281
+ }
282
+ // Warning: users should not use :wild as a pattern
283
+ let prefix = path;
284
+ if (regex) {
285
+ for (const key of regex.keys) {
286
+ if (key === 'wild') {
287
+ prefix = prefix.replace('*', params.wild);
288
+ }
289
+ else {
290
+ prefix = prefix.replace(`:${key}`, params[key]);
291
+ }
292
+ }
293
+ }
294
+ req.params = { ...req.params, ...params };
295
+ if (mw.type === 'mw') {
296
+ req.url = lead(req.originalUrl.substring(prefix.length));
297
+ req.baseUrl = trail(req.originalUrl.substring(0, prefix.length));
298
+ }
299
+ if (!req.path)
300
+ req.path = pathname;
301
+ if ((_a = this.settings) === null || _a === void 0 ? void 0 : _a.enableReqRoute)
302
+ req.route = mw;
303
+ await applyHandler(handler)(req, res, next);
304
+ };
305
+ let idx = 0;
306
+ const loop = () => {
307
+ req.originalUrl = req.baseUrl + req.url;
308
+ const pathname = getPathname(req.url);
309
+ const matched = __classPrivateFieldGet(this, _App_instances, "m", _App_find).call(this, pathname).filter((x) => (req.method === 'HEAD' || (x.method ? x.method === req.method : true)) && !mw.includes(x));
310
+ if (matched.length && matched[0] !== null) {
311
+ if (idx !== 0) {
312
+ idx = mw.length;
313
+ req.params = {};
314
+ }
315
+ mw = [
316
+ ...mw,
317
+ ...matched,
318
+ {
319
+ type: 'mw',
320
+ handler: (req, res, next) => {
321
+ if (req.method === 'HEAD') {
322
+ res.statusCode = 204;
323
+ return res.end('');
324
+ }
325
+ next();
326
+ },
327
+ path: '/'
328
+ }
329
+ ];
330
+ }
331
+ else if (this.parent == null) {
332
+ mw.push({
333
+ handler: this.noMatchHandler,
334
+ type: 'route',
335
+ path: '/'
336
+ });
337
+ }
338
+ void handle(mw[idx++], pathname)(req, res, next);
339
+ };
340
+ const parentNext = next;
341
+ next = (err) => {
342
+ if (err != null) {
343
+ // @ts-expect-error The 'this' context of type 'this' is not assignable to method's 'this' of type 'App<Request, Response<unknown>>' ts(2345)
344
+ return this.onError(err, req, res);
345
+ }
346
+ if (res.writableEnded)
347
+ return;
348
+ if (idx >= mw.length) {
349
+ if (parentNext != null)
350
+ parentNext();
351
+ return;
352
+ }
353
+ loop();
354
+ };
355
+ loop();
356
+ }
357
+ /**
358
+ * Creates HTTP server and dispatches middleware
359
+ * @param port server listening port
360
+ * @param cb callback to be invoked after server starts listening
361
+ * @param host server listening host
362
+ */
363
+ listen(port, cb, host) {
364
+ return createServer().on('request', this.attach).listen(port, host, cb);
365
+ }
366
+ }
367
+ _App_instances = new WeakSet(), _App_find = function _App_find(url) {
368
+ return this.middleware.filter((m) => {
369
+ m.regex = m.regex || rg(m.path, m.type === 'mw');
370
+ let fullPathRegex;
371
+ m.fullPath && typeof m.fullPath === 'string'
372
+ ? (fullPathRegex = rg(m.fullPath, m.type === 'mw'))
373
+ : (fullPathRegex = null);
374
+ return m.regex.pattern.test(url) && (m.type === 'mw' && fullPathRegex ? fullPathRegex.pattern.test(url) : true);
375
+ });
376
+ };
377
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
package/dist/extend.d.ts CHANGED
@@ -1,11 +1,8 @@
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
- import { TemplateEngineOptions } from './types.js';
6
-
1
+ import type { App } from './app.js';
2
+ import type { Handler } from './index.js';
3
+ import type { TemplateEngineOptions } from './types.js';
7
4
  /**
8
5
  * Extends Request and Response objects with custom properties and methods
9
6
  */
10
- export declare const extendMiddleware: <EngineOptions extends TemplateEngineOptions = TemplateEngineOptions>(app: App) => (req: Request, res: Response<EngineOptions>, next: NextFunction) => void;
7
+ export declare const extendMiddleware: <EngineOptions extends TemplateEngineOptions = TemplateEngineOptions>(app: App) => Handler;
11
8
  //# sourceMappingURL=extend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"AAgCA,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,IA4DjE,CAAA"}
1
+ {"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAKzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEvD;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,aAAa,SAAS,qBAAqB,+BAA+B,GAAG,KA8DtG,OAAO,CAAA"}
package/dist/extend.js ADDED
@@ -0,0 +1,63 @@
1
+ import { compile } from '@tinyhttp/proxy-addr';
2
+ import { checkIfXMLHttpRequest, getAccepts, getAcceptsCharsets, getAcceptsEncodings, getAcceptsLanguages, getFreshOrStale, getQueryParams, getRangeFromHeader, getRequestHeader } from '@tinyhttp/req';
3
+ import { append, attachment, clearCookie, download, formatResponse, getResponseHeader, json, redirect, send, sendFile, sendStatus, setContentType, setCookie, setHeader, setLinksHeader, setLocationHeader, setVaryHeader, status } from '@tinyhttp/res';
4
+ import { getSubdomains } from './request.js';
5
+ import { getHost, getIP, getIPs, getProtocol } from './request.js';
6
+ import { renderTemplate } from './response.js';
7
+ /**
8
+ * Extends Request and Response objects with custom properties and methods
9
+ */
10
+ export const extendMiddleware = (app) => ((req, res, next) => {
11
+ const { settings } = app;
12
+ res.get = getResponseHeader(res);
13
+ req.get = getRequestHeader(req);
14
+ if (settings === null || settings === void 0 ? void 0 : settings.bindAppToReqRes) {
15
+ req.app = app;
16
+ res.app = app;
17
+ }
18
+ if (settings === null || settings === void 0 ? void 0 : settings.networkExtensions) {
19
+ let trust = settings === null || settings === void 0 ? void 0 : settings['trust proxy'];
20
+ if (typeof trust !== 'function') {
21
+ trust = compile(trust);
22
+ settings['trust proxy'] = trust;
23
+ }
24
+ req.protocol = getProtocol(req, trust);
25
+ req.secure = req.protocol === 'https';
26
+ const host = getHost(req, trust);
27
+ req.hostname = host === null || host === void 0 ? void 0 : host.hostname;
28
+ req.port = host === null || host === void 0 ? void 0 : host.port;
29
+ req.subdomains = getSubdomains(req, trust, settings.subdomainOffset);
30
+ req.ip = getIP(req, trust);
31
+ req.ips = getIPs(req, trust);
32
+ }
33
+ req.query = getQueryParams(req.url);
34
+ req.range = getRangeFromHeader(req);
35
+ req.accepts = getAccepts(req);
36
+ req.acceptsCharsets = getAcceptsCharsets(req);
37
+ req.acceptsEncodings = getAcceptsEncodings(req);
38
+ req.acceptsLanguages = getAcceptsLanguages(req);
39
+ req.xhr = checkIfXMLHttpRequest(req);
40
+ res.header = res.set = setHeader(res);
41
+ res.send = send(req, res);
42
+ res.json = json(res);
43
+ res.status = status(res);
44
+ res.sendStatus = sendStatus(req, res);
45
+ res.sendFile = sendFile(req, res);
46
+ res.type = setContentType(res);
47
+ res.location = setLocationHeader(req, res);
48
+ res.links = setLinksHeader(res);
49
+ res.vary = setVaryHeader(res);
50
+ res.cookie = setCookie(req, res);
51
+ res.clearCookie = clearCookie(req, res);
52
+ res.render = renderTemplate(req, res, app);
53
+ res.format = formatResponse(req, res, next);
54
+ res.redirect = redirect(req, res, next);
55
+ res.attachment = attachment(res);
56
+ res.download = download(req, res);
57
+ res.append = append(res);
58
+ res.locals = res.locals || Object.create(null);
59
+ Object.defineProperty(req, 'fresh', { get: getFreshOrStale.bind(null, req, res), configurable: true });
60
+ req.stale = !req.fresh;
61
+ next();
62
+ });
63
+ //# sourceMappingURL=extend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extend.js","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,3 @@
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';
4
1
  export { App } from './app.js';
5
2
  export * from './request.js';
6
3
  export * from './response.js';
@@ -8,6 +5,9 @@ export { extendMiddleware } from './extend.js';
8
5
  export { onErrorHandler, type ErrorHandler } from './onError.js';
9
6
  export { View } from './view.js';
10
7
  export type { AppSettings, TemplateEngineOptions, TemplateEngine, AppConstructor } from './types.js';
8
+ import type { Middleware, NextFunction, AsyncHandler as RAsyncHandler, Handler as RHandler, SyncHandler as RSyncHandler } from '@tinyhttp/router';
9
+ import type { Request } from './request.js';
10
+ import type { Response } from './response.js';
11
11
  export type Handler = RHandler<Request, Response>;
12
12
  export type AsyncHandler = RAsyncHandler<Request, Response>;
13
13
  export type SyncHandler = RSyncHandler<Request, Response>;