dx-server 0.7.1 → 0.8.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/README.md +7 -2
- package/cjs/dx.js +2 -9
- package/cjs/router.d.ts +43 -0
- package/cjs/router.js +9 -22
- package/cjs/static.d.ts +1 -3
- package/cjs/static.js +5 -5
- package/esm/dx.js +2 -9
- package/esm/router.d.ts +43 -0
- package/esm/router.js +8 -20
- package/esm/static.d.ts +1 -3
- package/esm/static.js +5 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -48,7 +48,7 @@ import {fileURLToPath} from 'node:url'
|
|
|
48
48
|
|
|
49
49
|
new Server().on('request', (req, res) => chain(
|
|
50
50
|
dxServer(req, res),
|
|
51
|
-
chainStatic('
|
|
51
|
+
chainStatic('/*', {root: resolve(dirname(fileURLToPath(import.meta.url)), 'public')}),
|
|
52
52
|
() => setHtml('not found', {status: 404}),
|
|
53
53
|
)()
|
|
54
54
|
).listen(3000, () => console.log('server is listening at 3000'))
|
|
@@ -281,7 +281,12 @@ import {resolve, dirname} from 'node:path'
|
|
|
281
281
|
import {fileURLToPath} from 'node:url'
|
|
282
282
|
|
|
283
283
|
chain(
|
|
284
|
-
chainStatic('/assets', {
|
|
284
|
+
chainStatic('/assets/*', {
|
|
285
|
+
root: resolve(dirname(fileURLToPath(import.meta.url)), 'public'),
|
|
286
|
+
getPathname(matched) {
|
|
287
|
+
return new URL(getReq().url, 'http://localhost').pathname.slice('/assets'.length)
|
|
288
|
+
},
|
|
289
|
+
}),
|
|
285
290
|
)
|
|
286
291
|
```
|
|
287
292
|
|
package/cjs/dx.js
CHANGED
|
@@ -7,14 +7,7 @@ function makeDxContext(maker) {
|
|
|
7
7
|
const promiseSymbol = Symbol('promise');
|
|
8
8
|
const valueSymbol = Symbol('value');
|
|
9
9
|
// wrap in an async function to ensure the maker is called only once
|
|
10
|
-
const context = (...params) => getReq()[promiseSymbol] ??= (async () =>
|
|
11
|
-
try {
|
|
12
|
-
return getReq()[valueSymbol] = await maker(...params);
|
|
13
|
-
}
|
|
14
|
-
catch (e) {
|
|
15
|
-
throw e;
|
|
16
|
-
}
|
|
17
|
-
})();
|
|
10
|
+
const context = (...params) => getReq()[promiseSymbol] ??= (async () => getReq()[valueSymbol] = await maker(...params))();
|
|
18
11
|
Object.defineProperty(context, 'value', {
|
|
19
12
|
get() { return getReq()[valueSymbol]; },
|
|
20
13
|
set(value) {
|
|
@@ -130,4 +123,4 @@ exports.setRedirect = setRedirect;
|
|
|
130
123
|
// https://github.com/jshttp/content-disposition/blob/1037e24e4790273da96645ad250061f39e77968c/index.js#L186
|
|
131
124
|
// because in most applications, users can specify a simple filename which usually doesn't need to be validated.
|
|
132
125
|
// we leave setDownload() implementation for users, for now.
|
|
133
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsdURBQWtEO0FBQ2xELGlEQUF1RDtBQXVCdkQsU0FBZ0IsYUFBYSxDQUszQixLQUErQjtJQUNoQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDdkMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ25DLG9FQUFvRTtJQUNwRSxNQUFNLE9BQU8sR0FBZ0MsQ0FBQyxHQUFHLE1BQWMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQzlKLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRTtRQUN2QyxHQUFHLEtBQUksT0FBTyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQSxDQUFBLENBQUM7UUFDcEMsR0FBRyxDQUFDLEtBQUs7WUFDUixNQUFNLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2hELE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtRQUM5QixDQUFDO0tBQ0QsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7UUFDM0MsTUFBTSxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQTtRQUN4QixPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2QsQ0FBQyxDQUFBO0lBQ0QsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFD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
|
package/cjs/router.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Chainable } from './dx.js';
|
|
2
|
+
import 'urlpattern-polyfill';
|
|
3
|
+
interface URLPatternOptions {
|
|
4
|
+
}
|
|
5
|
+
interface RouteContext {
|
|
6
|
+
matched: URLPatternResult;
|
|
7
|
+
next(): any;
|
|
8
|
+
}
|
|
9
|
+
interface Route {
|
|
10
|
+
(context: RouteContext): any;
|
|
11
|
+
}
|
|
12
|
+
interface Routes {
|
|
13
|
+
[k: string]: Route;
|
|
14
|
+
}
|
|
15
|
+
interface RouterOptions extends URLPatternOptions {
|
|
16
|
+
prefix?: string;
|
|
17
|
+
}
|
|
18
|
+
type Router = {
|
|
19
|
+
patch(routes: Routes, options?: RouterOptions): Chainable;
|
|
20
|
+
patch(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
21
|
+
trace(routes: Routes, options?: RouterOptions): Chainable;
|
|
22
|
+
trace(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
23
|
+
options(routes: Routes, options?: RouterOptions): Chainable;
|
|
24
|
+
options(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
25
|
+
connect(routes: Routes, options?: RouterOptions): Chainable;
|
|
26
|
+
connect(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
27
|
+
delete(routes: Routes, options?: RouterOptions): Chainable;
|
|
28
|
+
delete(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
29
|
+
put(routes: Routes, options?: RouterOptions): Chainable;
|
|
30
|
+
put(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
31
|
+
post(routes: Routes, options?: RouterOptions): Chainable;
|
|
32
|
+
post(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
33
|
+
head(routes: Routes, options?: RouterOptions): Chainable;
|
|
34
|
+
head(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
35
|
+
get(routes: Routes, options?: RouterOptions): Chainable;
|
|
36
|
+
get(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
37
|
+
all(routes: Routes, options?: RouterOptions): Chainable;
|
|
38
|
+
all(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
39
|
+
method(method: string, routes: Routes, options?: RouterOptions): Chainable;
|
|
40
|
+
method(method: string, pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
41
|
+
};
|
|
42
|
+
export declare const router: Router;
|
|
43
|
+
export {};
|
package/cjs/router.js
CHANGED
|
@@ -1,23 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.router =
|
|
3
|
+
exports.router = void 0;
|
|
4
4
|
const dx_js_1 = require("./dx.js");
|
|
5
5
|
require("urlpattern-polyfill");
|
|
6
6
|
const bodyHelpers_js_1 = require("./bodyHelpers.js");
|
|
7
|
-
// '' matches nothing
|
|
8
|
-
// '/' matches both https://example.com and https://example.com/
|
|
9
|
-
// '/foo' matches https://example.com/foo but not https://example.com/foo/
|
|
10
|
-
// '/foo/' matches https://example.com/foo/ but not https://example.com/foo
|
|
11
|
-
function matchPattern(pathname, pattern) {
|
|
12
|
-
const matched = new URLPattern({ pathname: pattern }).exec({ pathname });
|
|
13
|
-
if (!matched)
|
|
14
|
-
return;
|
|
15
|
-
return {
|
|
16
|
-
matched,
|
|
17
|
-
params: matched.pathname.groups
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
exports.matchPattern = matchPattern;
|
|
21
7
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
|
|
22
8
|
const allMethods = [
|
|
23
9
|
'get', 'head', 'post', 'put', 'delete', 'connect', 'options', 'trace', 'patch'
|
|
@@ -29,12 +15,13 @@ routes, { prefix = '', ...options } = {}) {
|
|
|
29
15
|
if (method !== undefined && req.method !== method.toUpperCase())
|
|
30
16
|
return next();
|
|
31
17
|
for (const [pattern, handler] of routes) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
18
|
+
// '' matches nothing
|
|
19
|
+
// '/' matches both https://example.com and https://example.com/
|
|
20
|
+
// '/foo' matches https://example.com/foo but not https://example.com/foo/
|
|
21
|
+
// '/foo/' matches https://example.com/foo/ but not https://example.com/foo
|
|
22
|
+
const matched = new URLPattern({ pathname: `${prefix}${pattern}` }).exec({ pathname: (0, bodyHelpers_js_1.urlFromReq)(req).pathname });
|
|
23
|
+
if (matched)
|
|
24
|
+
return handler({ matched, next });
|
|
38
25
|
}
|
|
39
26
|
return next();
|
|
40
27
|
};
|
|
@@ -53,4 +40,4 @@ exports.router = {
|
|
|
53
40
|
};
|
|
54
41
|
for (const method of allMethods)
|
|
55
42
|
exports.router[method] = exports.router.method.bind(exports.router, method);
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBeUM7QUFFekMsK0JBQTRCO0FBQzVCLHFEQUEyQztBQWtCM0MsNERBQTREO0FBQzVELE1BQU0sVUFBVSxHQUFHO0lBQ2xCLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTztDQUNyRSxDQUFBO0FBK0JWLFNBQVMsVUFBVSxDQUNsQixNQUEwQixFQUFFLDZCQUE2QjtBQUN6RCxNQUF5QyxFQUN6QyxFQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxPQUFPLEtBQW1CLEVBQUU7SUFFN0MsT0FBTyxJQUFJLENBQUMsRUFBRTtRQUNiLE1BQU0sR0FBRyxHQUFHLElBQUEsY0FBTSxHQUFFLENBQUE7UUFDcEIsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUFFLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFDOUUsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzVDLHFCQUFxQjtZQUNyQixnRUFBZ0U7WUFDaEUsMEVBQTBFO1lBQzFFLDJFQUEyRTtZQUN4RSxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFDLFFBQVEsRUFBRSxHQUFHLE1BQU0sR0FBRyxPQUFPLEVBQUUsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFFLElBQUEsMkJBQVUsRUFBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFBO1lBQzVHLElBQUksT0FBTztnQkFBRSxPQUFPLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2QsQ0FBQyxDQUFBO0FBQ0YsQ0FBQztBQUNZLFFBQUEsTUFBTSxHQUFXO0lBQzdCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNO1FBQ3ZCLE9BQU8sT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUTtZQUNuQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pELENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUNELEdBQUcsQ0FBQyxHQUFHLE1BQU07UUFDWixPQUFPLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVE7WUFDbkMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RCxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7Q0FDRCxDQUFBO0FBRUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxVQUFVO0lBQUUsY0FBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLGNBQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQU0sRUFBRSxNQUFNLENBQUMsQ0FBQSJ9
|
package/cjs/static.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
1
|
import { Chainable } from './dx.js';
|
|
3
2
|
import { SendOptions } from 'send';
|
|
4
|
-
import { IncomingMessage } from 'node:http';
|
|
5
3
|
export declare function chainStatic(pattern: string, { getPathname, ...options }: SendOptions & {
|
|
6
|
-
getPathname
|
|
4
|
+
getPathname?(matched: URLPatternResult): string;
|
|
7
5
|
}): Chainable;
|
package/cjs/static.js
CHANGED
|
@@ -4,17 +4,17 @@ exports.chainStatic = void 0;
|
|
|
4
4
|
const dx_js_1 = require("./dx.js");
|
|
5
5
|
const bodyHelpers_js_1 = require("./bodyHelpers.js");
|
|
6
6
|
const staticHelpers_js_1 = require("./staticHelpers.js");
|
|
7
|
-
const router_js_1 = require("./router.js");
|
|
8
7
|
function chainStatic(pattern, { getPathname, ...options }) {
|
|
9
8
|
return async (next) => {
|
|
10
9
|
const req = (0, dx_js_1.getReq)();
|
|
11
10
|
if (req.method !== 'GET' && req.method !== 'HEAD')
|
|
12
11
|
return next();
|
|
13
|
-
const
|
|
14
|
-
|
|
12
|
+
const { pathname } = (0, bodyHelpers_js_1.urlFromReq)(req);
|
|
13
|
+
const matched = new URLPattern({ pathname: pattern }).exec({ pathname });
|
|
14
|
+
if (!matched)
|
|
15
15
|
return next();
|
|
16
16
|
try {
|
|
17
|
-
await (0, staticHelpers_js_1.sendFile)(req, (0, dx_js_1.getRes)(), getPathname?.(
|
|
17
|
+
await (0, staticHelpers_js_1.sendFile)(req, (0, dx_js_1.getRes)(), getPathname?.(matched) ?? pathname, options, next);
|
|
18
18
|
}
|
|
19
19
|
catch (err) {
|
|
20
20
|
return next(err);
|
|
@@ -24,4 +24,4 @@ function chainStatic(pattern, { getPathname, ...options }) {
|
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
26
|
exports.chainStatic = chainStatic;
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YXRpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBaUQ7QUFFakQscURBQTJDO0FBQzNDLHlEQUEyQztBQUUzQyxTQUFnQixXQUFXLENBQzFCLE9BQWUsRUFDZixFQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sRUFHdkI7SUFFRCxPQUFPLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtRQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFBLGNBQU0sR0FBRSxDQUFBO1FBQ3BCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNO1lBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUVoRSxNQUFNLEVBQUMsUUFBUSxFQUFDLEdBQUcsSUFBQSwyQkFBVSxFQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUNwRSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFFM0IsSUFBSSxDQUFDO1lBQ0osTUFBTSxJQUFBLDJCQUFRLEVBQ2QsR0FBRyxFQUNILElBQUEsY0FBTSxHQUFFLEVBQ1IsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksUUFBUSxFQUNsQyxPQUFPLEVBQ1AsSUFBSSxDQUNKLENBQUE7UUFDRCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNkLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2hCLDJDQUEyQztZQUMzQyxZQUFZO1FBQ2IsQ0FBQztJQUNGLENBQUMsQ0FBQTtBQUNGLENBQUM7QUE3QkQsa0NBNkJDIn0=
|
package/esm/dx.js
CHANGED
|
@@ -4,14 +4,7 @@ export function makeDxContext(maker) {
|
|
|
4
4
|
const promiseSymbol = Symbol('promise');
|
|
5
5
|
const valueSymbol = Symbol('value');
|
|
6
6
|
// wrap in an async function to ensure the maker is called only once
|
|
7
|
-
const context = (...params) => getReq()[promiseSymbol] ??= (async () =>
|
|
8
|
-
try {
|
|
9
|
-
return getReq()[valueSymbol] = await maker(...params);
|
|
10
|
-
}
|
|
11
|
-
catch (e) {
|
|
12
|
-
throw e;
|
|
13
|
-
}
|
|
14
|
-
})();
|
|
7
|
+
const context = (...params) => getReq()[promiseSymbol] ??= (async () => getReq()[valueSymbol] = await maker(...params))();
|
|
15
8
|
Object.defineProperty(context, 'value', {
|
|
16
9
|
get() { return getReq()[valueSymbol]; },
|
|
17
10
|
set(value) {
|
|
@@ -115,4 +108,4 @@ export function setRedirect(url, status) {
|
|
|
115
108
|
// https://github.com/jshttp/content-disposition/blob/1037e24e4790273da96645ad250061f39e77968c/index.js#L186
|
|
116
109
|
// because in most applications, users can specify a simple filename which usually doesn't need to be validated.
|
|
117
110
|
// we leave setDownload() implementation for users, for now.
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDbEQsT0FBTyxFQUFpQixRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQXVCdkQsTUFBTSxVQUFVLGFBQWEsQ0FLM0IsS0FBK0I7SUFDaEMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3ZDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNuQyxvRUFBb0U7SUFDcEUsTUFBTSxPQUFPLEdBQWdDLENBQUMsR0FBRyxNQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUM5SixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUU7UUFDdkMsR0FBRyxLQUFJLE9BQU8sTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUEsQ0FBQSxDQUFDO1FBQ3BDLEdBQUcsQ0FBQyxLQUFLO1lBQ1IsTUFBTSxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNoRCxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUE7UUFDOUIsQ0FBQztLQUNELENBQUMsQ0FBQTtJQUNGLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxFQUFFO1FBQzNDLE1BQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUE7UUFDeEIs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
|
package/esm/router.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Chainable } from './dx.js';
|
|
2
|
+
import 'urlpattern-polyfill';
|
|
3
|
+
interface URLPatternOptions {
|
|
4
|
+
}
|
|
5
|
+
interface RouteContext {
|
|
6
|
+
matched: URLPatternResult;
|
|
7
|
+
next(): any;
|
|
8
|
+
}
|
|
9
|
+
interface Route {
|
|
10
|
+
(context: RouteContext): any;
|
|
11
|
+
}
|
|
12
|
+
interface Routes {
|
|
13
|
+
[k: string]: Route;
|
|
14
|
+
}
|
|
15
|
+
interface RouterOptions extends URLPatternOptions {
|
|
16
|
+
prefix?: string;
|
|
17
|
+
}
|
|
18
|
+
type Router = {
|
|
19
|
+
patch(routes: Routes, options?: RouterOptions): Chainable;
|
|
20
|
+
patch(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
21
|
+
trace(routes: Routes, options?: RouterOptions): Chainable;
|
|
22
|
+
trace(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
23
|
+
options(routes: Routes, options?: RouterOptions): Chainable;
|
|
24
|
+
options(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
25
|
+
connect(routes: Routes, options?: RouterOptions): Chainable;
|
|
26
|
+
connect(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
27
|
+
delete(routes: Routes, options?: RouterOptions): Chainable;
|
|
28
|
+
delete(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
29
|
+
put(routes: Routes, options?: RouterOptions): Chainable;
|
|
30
|
+
put(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
31
|
+
post(routes: Routes, options?: RouterOptions): Chainable;
|
|
32
|
+
post(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
33
|
+
head(routes: Routes, options?: RouterOptions): Chainable;
|
|
34
|
+
head(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
35
|
+
get(routes: Routes, options?: RouterOptions): Chainable;
|
|
36
|
+
get(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
37
|
+
all(routes: Routes, options?: RouterOptions): Chainable;
|
|
38
|
+
all(pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
39
|
+
method(method: string, routes: Routes, options?: RouterOptions): Chainable;
|
|
40
|
+
method(method: string, pattern: string, route: Route, options?: RouterOptions): Chainable;
|
|
41
|
+
};
|
|
42
|
+
export declare const router: Router;
|
|
43
|
+
export {};
|
package/esm/router.js
CHANGED
|
@@ -1,19 +1,6 @@
|
|
|
1
1
|
import { getReq } from './dx.js';
|
|
2
2
|
import 'urlpattern-polyfill';
|
|
3
3
|
import { urlFromReq } from './bodyHelpers.js';
|
|
4
|
-
// '' matches nothing
|
|
5
|
-
// '/' matches both https://example.com and https://example.com/
|
|
6
|
-
// '/foo' matches https://example.com/foo but not https://example.com/foo/
|
|
7
|
-
// '/foo/' matches https://example.com/foo/ but not https://example.com/foo
|
|
8
|
-
export function matchPattern(pathname, pattern) {
|
|
9
|
-
const matched = new URLPattern({ pathname: pattern }).exec({ pathname });
|
|
10
|
-
if (!matched)
|
|
11
|
-
return;
|
|
12
|
-
return {
|
|
13
|
-
matched,
|
|
14
|
-
params: matched.pathname.groups
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
4
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
|
|
18
5
|
const allMethods = [
|
|
19
6
|
'get', 'head', 'post', 'put', 'delete', 'connect', 'options', 'trace', 'patch'
|
|
@@ -25,12 +12,13 @@ routes, { prefix = '', ...options } = {}) {
|
|
|
25
12
|
if (method !== undefined && req.method !== method.toUpperCase())
|
|
26
13
|
return next();
|
|
27
14
|
for (const [pattern, handler] of routes) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
15
|
+
// '' matches nothing
|
|
16
|
+
// '/' matches both https://example.com and https://example.com/
|
|
17
|
+
// '/foo' matches https://example.com/foo but not https://example.com/foo/
|
|
18
|
+
// '/foo/' matches https://example.com/foo/ but not https://example.com/foo
|
|
19
|
+
const matched = new URLPattern({ pathname: `${prefix}${pattern}` }).exec({ pathname: urlFromReq(req).pathname });
|
|
20
|
+
if (matched)
|
|
21
|
+
return handler({ matched, next });
|
|
34
22
|
}
|
|
35
23
|
return next();
|
|
36
24
|
};
|
|
@@ -49,4 +37,4 @@ export const router = {
|
|
|
49
37
|
};
|
|
50
38
|
for (const method of allMethods)
|
|
51
39
|
router[method] = router.method.bind(router, method);
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksTUFBTSxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBRXpDLE9BQU8scUJBQXFCLENBQUE7QUFDNUIsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBa0IzQyw0REFBNEQ7QUFDNUQsTUFBTSxVQUFVLEdBQUc7SUFDbEIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPO0NBQ3JFLENBQUE7QUErQlYsU0FBUyxVQUFVLENBQ2xCLE1BQTBCLEVBQUUsNkJBQTZCO0FBQ3pELE1BQXlDLEVBQ3pDLEVBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLE9BQU8sS0FBbUIsRUFBRTtJQUU3QyxPQUFPLElBQUksQ0FBQyxFQUFFO1FBQ2IsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUE7UUFDcEIsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUFFLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFDOUUsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzVDLHFCQUFxQjtZQUNyQixnRUFBZ0U7WUFDaEUsMEVBQTBFO1lBQzFFLDJFQUEyRTtZQUN4RSxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFDLFFBQVEsRUFBRSxHQUFHLE1BQU0sR0FBRyxPQUFPLEVBQUUsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFBO1lBQzVHLElBQUksT0FBTztnQkFBRSxPQUFPLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2QsQ0FBQyxDQUFBO0FBQ0YsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBVztJQUM3QixNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTTtRQUN2QixPQUFPLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVE7WUFDbkMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzVELENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxNQUFNO1FBQ1osT0FBTyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRO1lBQ25DLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0NBQ0QsQ0FBQTtBQUVELEtBQUssTUFBTSxNQUFNLElBQUksVUFBVTtJQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUEifQ==
|
package/esm/static.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
1
|
import { Chainable } from './dx.js';
|
|
3
2
|
import { SendOptions } from 'send';
|
|
4
|
-
import { IncomingMessage } from 'node:http';
|
|
5
3
|
export declare function chainStatic(pattern: string, { getPathname, ...options }: SendOptions & {
|
|
6
|
-
getPathname
|
|
4
|
+
getPathname?(matched: URLPatternResult): string;
|
|
7
5
|
}): Chainable;
|
package/esm/static.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { getReq, getRes } from './dx.js';
|
|
2
2
|
import { urlFromReq } from './bodyHelpers.js';
|
|
3
3
|
import { sendFile } from './staticHelpers.js';
|
|
4
|
-
import { matchPattern } from './router.js';
|
|
5
4
|
export function chainStatic(pattern, { getPathname, ...options }) {
|
|
6
5
|
return async (next) => {
|
|
7
6
|
const req = getReq();
|
|
8
7
|
if (req.method !== 'GET' && req.method !== 'HEAD')
|
|
9
8
|
return next();
|
|
10
|
-
const
|
|
11
|
-
|
|
9
|
+
const { pathname } = urlFromReq(req);
|
|
10
|
+
const matched = new URLPattern({ pathname: pattern }).exec({ pathname });
|
|
11
|
+
if (!matched)
|
|
12
12
|
return next();
|
|
13
13
|
try {
|
|
14
|
-
await sendFile(req, getRes(), getPathname?.(
|
|
14
|
+
await sendFile(req, getRes(), getPathname?.(matched) ?? pathname, options, next);
|
|
15
15
|
}
|
|
16
16
|
catch (err) {
|
|
17
17
|
return next(err);
|
|
@@ -20,4 +20,4 @@ export function chainStatic(pattern, { getPathname, ...options }) {
|
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YXRpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksTUFBTSxFQUFFLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUVqRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDM0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBRTNDLE1BQU0sVUFBVSxXQUFXLENBQzFCLE9BQWUsRUFDZixFQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sRUFHdkI7SUFFRCxPQUFPLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtRQUNuQixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQTtRQUNwQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTTtZQUFFLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFFaEUsTUFBTSxFQUFDLFFBQVEsRUFBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUE7UUFDcEUsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO1FBRTNCLElBQUksQ0FBQztZQUNKLE1BQU0sUUFBUSxDQUNkLEdBQUcsRUFDSCxNQUFNLEVBQUUsRUFDUixXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLEVBQ2xDLE9BQU8sRUFDUCxJQUFJLENBQ0osQ0FBQTtRQUNELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDaEIsMkNBQTJDO1lBQzNDLFlBQVk7UUFDYixDQUFDO0lBQ0YsQ0FBQyxDQUFBO0FBQ0YsQ0FBQyJ9
|