dx-server 0.5.8 → 0.5.9
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 +27 -31
- package/cjs/body.js +1 -1
- package/cjs/bodyHelpers.d.ts +4 -5
- package/cjs/bodyHelpers.js +6 -11
- package/cjs/router.d.ts +5 -16
- package/cjs/router.js +11 -40
- package/esm/body.js +1 -1
- package/esm/bodyHelpers.d.ts +4 -5
- package/esm/bodyHelpers.js +6 -8
- package/esm/router.d.ts +5 -16
- package/esm/router.js +11 -39
- package/package.json +4 -7
package/README.md
CHANGED
|
@@ -119,25 +119,23 @@ const serverChain = chain(
|
|
|
119
119
|
app.use('/public', express.static('public'))
|
|
120
120
|
}),
|
|
121
121
|
authContext.chain(), // chain context will set the context value to authContext.value in every request
|
|
122
|
-
router.post({// example of catching error for all /api/* routes
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}, {status: 500})
|
|
137
|
-
}
|
|
122
|
+
router.post('/api/*', async ({next}) => {// example of catching error for all /api/* routes
|
|
123
|
+
try {
|
|
124
|
+
await next()
|
|
125
|
+
} catch (e) {
|
|
126
|
+
if (e instanceof ServerError) setJson({// only app error message should be shown to user
|
|
127
|
+
error: e.message,
|
|
128
|
+
code: e.code,
|
|
129
|
+
}, {status: e.status})
|
|
130
|
+
else {// report system error
|
|
131
|
+
console.error(e)
|
|
132
|
+
setJson({
|
|
133
|
+
message: 'internal server error',
|
|
134
|
+
code: 'internal'
|
|
135
|
+
}, {status: 500})
|
|
138
136
|
}
|
|
139
137
|
}
|
|
140
|
-
}
|
|
138
|
+
}),
|
|
141
139
|
router.post({
|
|
142
140
|
'/api/sample-public-api'() { // sample POST router
|
|
143
141
|
setJson({name: 'joe'})
|
|
@@ -291,27 +289,25 @@ import {router} from 'dx-server'
|
|
|
291
289
|
|
|
292
290
|
`RouterOptions` is defined as follows:
|
|
293
291
|
```typescript
|
|
294
|
-
interface
|
|
295
|
-
end?: boolean // default true. match till end of string
|
|
296
|
-
strict?: boolean // default false. disallow trailing delimiter
|
|
297
|
-
sensitive?: boolean // default false
|
|
298
|
-
start?: boolean // default true. match from beginning of string
|
|
299
|
-
|
|
300
|
-
delimiter?: string // default '/#?'. delimiter for segments
|
|
301
|
-
endsWith?: string // default undefined. optional character that matches at the end of the string
|
|
302
|
-
encode?(value: string): string // default x => x. encode strings before inserting into RegExp
|
|
303
|
-
prefixes?: string // default `./`. List of characters to automatically consider prefixes when parsing.
|
|
304
|
-
}
|
|
305
|
-
interface RouterOptions extends RegexpToPathOptions {
|
|
292
|
+
interface RouterOptions {
|
|
306
293
|
prefix?: string
|
|
294
|
+
sensitive?: string
|
|
307
295
|
}
|
|
308
296
|
```
|
|
309
|
-
|
|
297
|
+
|
|
298
|
+
Patterns are matched using [URLPattern](https://developer.mozilla.org/en-US/docs/Web/API/URLPattern).
|
|
299
|
+
This does not always match the same as ExpressJS.
|
|
300
|
+
For example, to match any path prefixed with `/api/`, use `/api/*`.
|
|
301
|
+
Note the following:
|
|
302
|
+
- `''` matches nothing.
|
|
303
|
+
- `'/'` matches both https://example.com and https://example.com/.
|
|
304
|
+
- `'/foo'` matches https://example.com/foo but not https://example.com/foo/.
|
|
305
|
+
- `'/foo/'` matches https://example.com/foo/ but not https://example.com/foo.
|
|
310
306
|
|
|
311
307
|
`Route` is defined as follows:
|
|
312
308
|
```typescript
|
|
313
309
|
interface RouteContext {
|
|
314
|
-
matched:
|
|
310
|
+
matched: URLPatternResult // result returned from URLPattern.exec()
|
|
315
311
|
params: Record<string, string>
|
|
316
312
|
next(): any
|
|
317
313
|
}
|
package/cjs/body.js
CHANGED
|
@@ -11,4 +11,4 @@ exports.getUrlEncoded = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_
|
|
|
11
11
|
exports.getQuery = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.queryFromReq)((0, dx_js_1.getReq)(), options));
|
|
12
12
|
// to getFile use busboy
|
|
13
13
|
// https://github.com/mscdex/busboy
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUE2QztBQUM3QyxxREFReUI7QUFFWixRQUFBLFNBQVMsR0FBRyxJQUFBLHFCQUFhLEVBQUMsQ0FBQyxPQUFvQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDhCQUFhLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQ3JHLFFBQUEsT0FBTyxHQUFHLElBQUEscUJBQWEsRUFBQyxDQUFDLE9BQW9DLEVBQUUsRUFBRSxDQUFDLElBQUEsNEJBQVcsRUFBQyxJQUFBLGNBQU0sR0FBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7QUFDakcsUUFBQSxNQUFNLEdBQUcsSUFBQSxxQkFBYSxFQUFDLENBQUMsT0FBb0MsRUFBRSxFQUFFLENBQUMsSUFBQSwyQkFBVSxFQUFDLElBQUEsY0FBTSxHQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUMvRixRQUFBLE9BQU8sR0FBRyxJQUFBLHFCQUFhLEVBQUMsQ0FBQyxPQUFvQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDRCQUFXLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQ2pHLFFBQUEsYUFBYSxHQUFHLElBQUEscUJBQWEsRUFBQyxDQUFDLE9BQW9DLEVBQUUsRUFBRSxDQUFDLElBQUEsa0NBQWlCLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQzdHLFFBQUEsUUFBUSxHQUFHLElBQUEscUJBQWEsRUFBQyxDQUFDLE9BQW9DLEVBQUUsRUFBRSxDQUFDLElBQUEsNkJBQVksRUFBQyxJQUFBLGNBQU0sR0FBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7QUFFaEgsd0JBQXdCO0FBQ3hCLG1DQUFtQyJ9
|
package/cjs/bodyHelpers.d.ts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
3
|
import { IncomingMessage } from 'node:http';
|
|
4
|
-
import qs from 'qs';
|
|
5
4
|
export interface BufferBodyOptions {
|
|
6
5
|
bodyLimit: number;
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
urlEncodedParser?(search: string): any;
|
|
7
|
+
queryParser?(search: string): any;
|
|
9
8
|
}
|
|
10
9
|
export declare function setBufferBodyDefaultOptions(options: Partial<BufferBodyOptions>): void;
|
|
11
10
|
export declare function bufferFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<Buffer | undefined>;
|
|
12
11
|
export declare function jsonFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<any>;
|
|
13
12
|
export declare function rawFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<Buffer | undefined>;
|
|
14
13
|
export declare function textFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<string | undefined>;
|
|
15
|
-
export declare function urlEncodedFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<
|
|
14
|
+
export declare function urlEncodedFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<any>;
|
|
16
15
|
export declare function urlFromReq(req: IncomingMessage): URL;
|
|
17
|
-
export declare function queryFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>):
|
|
16
|
+
export declare function queryFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): any;
|
package/cjs/bodyHelpers.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.queryFromReq = exports.urlFromReq = exports.urlEncodedFromReq = exports.textFromReq = exports.rawFromReq = exports.jsonFromReq = exports.bufferFromReq = exports.setBufferBodyDefaultOptions = void 0;
|
|
7
4
|
const stream_js_1 = require("./stream.js");
|
|
8
5
|
const contentType_js_1 = require("./contentType.js");
|
|
9
|
-
|
|
6
|
+
function defaultQueryParser(search) {
|
|
7
|
+
return Object.fromEntries(new URLSearchParams(search)); // support both leading ? and not
|
|
8
|
+
}
|
|
10
9
|
let bodyDefaultOptions = { bodyLimit: 100 << 10 }; // 100kb
|
|
11
10
|
function setBufferBodyDefaultOptions(options) {
|
|
12
11
|
bodyDefaultOptions = { ...bodyDefaultOptions, ...options };
|
|
@@ -87,9 +86,7 @@ async function urlEncodedFromReq(req, options) {
|
|
|
87
86
|
return;
|
|
88
87
|
const buffer = await bufferFromReq(req, options);
|
|
89
88
|
if (buffer) {
|
|
90
|
-
|
|
91
|
-
const { simplifyUrlEncodedBody } = { ...bodyDefaultOptions, ...options };
|
|
92
|
-
return simplifyUrlEncodedBody ? Object.fromEntries(new URLSearchParams(str)) : qs_1.default.parse(str);
|
|
89
|
+
return (bodyDefaultOptions.urlEncodedParser ?? options?.urlEncodedParser ?? defaultQueryParser)(buffer.toString(charset));
|
|
93
90
|
}
|
|
94
91
|
}
|
|
95
92
|
exports.urlEncodedFromReq = urlEncodedFromReq;
|
|
@@ -98,9 +95,7 @@ function urlFromReq(req) {
|
|
|
98
95
|
}
|
|
99
96
|
exports.urlFromReq = urlFromReq;
|
|
100
97
|
function queryFromReq(req, options) {
|
|
101
|
-
|
|
102
|
-
const { simplifyQuery } = { ...bodyDefaultOptions, ...options };
|
|
103
|
-
return simplifyQuery ? Object.fromEntries(new URLSearchParams(query)) : qs_1.default.parse(query);
|
|
98
|
+
return (bodyDefaultOptions.urlEncodedParser ?? options?.urlEncodedParser ?? defaultQueryParser)(urlFromReq(req).searchParams.toString());
|
|
104
99
|
}
|
|
105
100
|
exports.queryFromReq = queryFromReq;
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keUhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYm9keUhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXdEO0FBQ3hELHFEQUFpRDtBQVFqRCxTQUFTLGtCQUFrQixDQUFDLE1BQWM7SUFDekMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsQ0FBQyxpQ0FBaUM7QUFDekYsQ0FBQztBQUVELElBQUksa0JBQWtCLEdBQXNCLEVBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUMsQ0FBQSxDQUFDLFFBQVE7QUFDM0UsU0FBZ0IsMkJBQTJCLENBQUMsT0FBbUM7SUFDOUUsa0JBQWtCLEdBQUcsRUFBQyxHQUFHLGtCQUFrQixFQUFFLEdBQUcsT0FBTyxFQUFDLENBQUE7QUFDekQsQ0FBQztBQUZELGtFQUVDO0FBRU0sS0FBSyxVQUFVLGFBQWEsQ0FBQyxHQUFvQixFQUFFLE9BQW9DO0lBQzdGLE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxFQUFDLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQTtJQUN2RDs7Ozs7T0FLRztJQUNGLCtGQUErRjtJQUNoRyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzdFLElBQ0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLFNBQVM7V0FDM0MsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1FBQzVCLE9BQU07SUFDUixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQTtJQUVsRixPQUFPO0lBQ1AsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFH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
|
package/cjs/router.d.ts
CHANGED
|
@@ -1,22 +1,11 @@
|
|
|
1
|
-
import type { Key } from 'path-to-regexp';
|
|
2
1
|
import { Chainable } from './dx.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
strict?: boolean;
|
|
2
|
+
import 'urlpattern-polyfill';
|
|
3
|
+
interface URLPatternOptions {
|
|
6
4
|
sensitive?: boolean;
|
|
7
|
-
start?: boolean;
|
|
8
|
-
delimiter?: string;
|
|
9
|
-
endsWith?: string;
|
|
10
|
-
encode?(value: string): string;
|
|
11
|
-
prefixes?: string;
|
|
12
5
|
}
|
|
13
|
-
export declare function matchPattern<Params extends Record<Key['name'], string>>(pathname: string, pattern: string, options?: RegexpToPathOptions): {
|
|
14
|
-
matched: any;
|
|
15
|
-
params: any;
|
|
16
|
-
} | undefined;
|
|
17
6
|
interface RouteContext {
|
|
18
|
-
matched:
|
|
19
|
-
params: Record<
|
|
7
|
+
matched: URLPatternResult;
|
|
8
|
+
params: Record<string, string>;
|
|
20
9
|
next(): any;
|
|
21
10
|
}
|
|
22
11
|
interface Route {
|
|
@@ -25,7 +14,7 @@ interface Route {
|
|
|
25
14
|
interface Routes {
|
|
26
15
|
[k: string]: Route;
|
|
27
16
|
}
|
|
28
|
-
interface RouterOptions extends
|
|
17
|
+
interface RouterOptions extends URLPatternOptions {
|
|
29
18
|
prefix?: string;
|
|
30
19
|
}
|
|
31
20
|
type Router = {
|
package/cjs/router.js
CHANGED
|
@@ -1,51 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.router =
|
|
4
|
-
const path_to_regexp_1 = require("path-to-regexp");
|
|
3
|
+
exports.router = void 0;
|
|
5
4
|
const dx_js_1 = require("./dx.js");
|
|
5
|
+
require("urlpattern-polyfill");
|
|
6
6
|
const bodyHelpers_js_1 = require("./bodyHelpers.js");
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const cacheKey = JSON.stringify(options);
|
|
12
|
-
const pathCache = cache[cacheKey] || (cache[cacheKey] = {});
|
|
13
|
-
if (pathCache[pattern])
|
|
14
|
-
return pathCache[pattern];
|
|
15
|
-
const keys = [];
|
|
16
|
-
const regexp = (0, path_to_regexp_1.pathToRegexp)(pattern, keys, options);
|
|
17
|
-
const result = {
|
|
18
|
-
regexp,
|
|
19
|
-
keys
|
|
20
|
-
};
|
|
21
|
-
if (cacheCount < cacheLimit) {
|
|
22
|
-
pathCache[pattern] = result;
|
|
23
|
-
cacheCount++;
|
|
24
|
-
}
|
|
25
|
-
return result;
|
|
26
|
-
}
|
|
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
|
|
27
11
|
function matchPattern(pathname, pattern, options) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
options.strict ??= false;
|
|
31
|
-
options.sensitive ??= false;
|
|
32
|
-
options.start ??= true;
|
|
33
|
-
if (!pattern && pattern !== '')
|
|
34
|
-
return;
|
|
35
|
-
const { regexp, keys } = compilePath(pattern, options);
|
|
36
|
-
const match = regexp.exec(pathname);
|
|
37
|
-
if (!match)
|
|
12
|
+
const matched = new URLPattern({ pathname: pattern }, undefined, options).exec({ pathname });
|
|
13
|
+
if (!matched)
|
|
38
14
|
return;
|
|
39
|
-
const [matched, ...values] = match;
|
|
40
15
|
return {
|
|
41
|
-
matched,
|
|
42
|
-
params:
|
|
43
|
-
acc[key.name] = values[index];
|
|
44
|
-
return acc;
|
|
45
|
-
}, {})
|
|
16
|
+
matched,
|
|
17
|
+
params: matched.pathname.groups
|
|
46
18
|
};
|
|
47
19
|
}
|
|
48
|
-
exports.matchPattern = matchPattern;
|
|
49
20
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
|
|
50
21
|
const allMethods = [
|
|
51
22
|
'get', 'head', 'post', 'put', 'delete', 'connect', 'options', 'trace', 'patch'
|
|
@@ -81,4 +52,4 @@ exports.router = {
|
|
|
81
52
|
};
|
|
82
53
|
for (const method of allMethods)
|
|
83
54
|
exports.router[method] = exports.router.method.bind(exports.router, method);
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBeUM7QUFFekMsK0JBQTRCO0FBQzVCLHFEQUEyQztBQU8zQyxxQkFBcUI7QUFDckIsZ0VBQWdFO0FBQ2hFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0UsU0FBUyxZQUFZLENBQ3BCLFFBQWdCLEVBQ2hCLE9BQWUsRUFDZixPQUEyQjtJQUUzQixNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQTtJQUN4RixJQUFJLENBQUMsT0FBTztRQUFFLE9BQU07SUFFcEIsT0FBTztRQUNOLE9BQU87UUFDUCxNQUFNLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFnQjtLQUN6QyxDQUFBO0FBQ0YsQ0FBQztBQWNELDREQUE0RDtBQUM1RCxNQUFNLFVBQVUsR0FBRztJQUNsQixLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU87Q0FDckUsQ0FBQTtBQStCVixTQUFTLFVBQVUsQ0FDbEIsTUFBMEIsRUFBRSw2QkFBNkI7QUFDekQsTUFBeUMsRUFDekMsRUFBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxLQUFtQixFQUFFO0lBRTdDLE9BQU8sSUFBSSxDQUFDLEVBQUU7UUFDYixNQUFNLEdBQUcsR0FBRyxJQUFBLGNBQU0sR0FBRSxDQUFBO1FBQ3BCLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO1FBQzlFLEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBQSwyQkFBVSxFQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLE1BQU0sR0FBRyxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNwRixJQUFJLEtBQUs7Z0JBQUUsT0FBTyxPQUFPLENBQUM7b0JBQ3pCLEdBQUcsS0FBSztvQkFDUixJQUFJO2lCQUNKLENBQUMsQ0FBQTtRQUNILENBQUM7UUFDRCxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2QsQ0FBQyxDQUFBO0FBQ0YsQ0FBQztBQUNZLFFBQUEsTUFBTSxHQUFXO0lBQzdCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNO1FBQ3ZCLE9BQU8sT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUTtZQUNuQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pELENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUNELEdBQUcsQ0FBQyxHQUFHLE1BQU07UUFDWixPQUFPLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVE7WUFDbkMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RCxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7Q0FDRCxDQUFBO0FBRUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxVQUFVO0lBQUUsY0FBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLGNBQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQU0sRUFBRSxNQUFNLENBQUMsQ0FBQSJ9
|
package/esm/body.js
CHANGED
|
@@ -8,4 +8,4 @@ export const getUrlEncoded = makeDxContext((options) => urlEncodedFromReq(getReq
|
|
|
8
8
|
export const getQuery = makeDxContext((options) => queryFromReq(getReq(), options));
|
|
9
9
|
// to getFile use busboy
|
|
10
10
|
// https://github.com/mscdex/busboy
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBQzdDLE9BQU8sRUFFTixhQUFhLEVBQ2IsV0FBVyxFQUNYLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixNQUFNLGtCQUFrQixDQUFBO0FBRXpCLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsQ0FBQyxPQUFvQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUNsSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLENBQUMsT0FBb0MsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7QUFDOUcsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxDQUFDLE9BQW9DLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQzVHLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQyxPQUFvQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUM5RyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLENBQUMsT0FBb0MsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUMxSCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsT0FBb0MsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7QUFFaEgsd0JBQXdCO0FBQ3hCLG1DQUFtQyJ9
|
package/esm/bodyHelpers.d.ts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
3
|
import { IncomingMessage } from 'node:http';
|
|
4
|
-
import qs from 'qs';
|
|
5
4
|
export interface BufferBodyOptions {
|
|
6
5
|
bodyLimit: number;
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
urlEncodedParser?(search: string): any;
|
|
7
|
+
queryParser?(search: string): any;
|
|
9
8
|
}
|
|
10
9
|
export declare function setBufferBodyDefaultOptions(options: Partial<BufferBodyOptions>): void;
|
|
11
10
|
export declare function bufferFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<Buffer | undefined>;
|
|
12
11
|
export declare function jsonFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<any>;
|
|
13
12
|
export declare function rawFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<Buffer | undefined>;
|
|
14
13
|
export declare function textFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<string | undefined>;
|
|
15
|
-
export declare function urlEncodedFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<
|
|
14
|
+
export declare function urlEncodedFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<any>;
|
|
16
15
|
export declare function urlFromReq(req: IncomingMessage): URL;
|
|
17
|
-
export declare function queryFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>):
|
|
16
|
+
export declare function queryFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): any;
|
package/esm/bodyHelpers.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { getContentStream, readStream } from './stream.js';
|
|
2
2
|
import { parseContentType } from './contentType.js';
|
|
3
|
-
|
|
3
|
+
function defaultQueryParser(search) {
|
|
4
|
+
return Object.fromEntries(new URLSearchParams(search)); // support both leading ? and not
|
|
5
|
+
}
|
|
4
6
|
let bodyDefaultOptions = { bodyLimit: 100 << 10 }; // 100kb
|
|
5
7
|
export function setBufferBodyDefaultOptions(options) {
|
|
6
8
|
bodyDefaultOptions = { ...bodyDefaultOptions, ...options };
|
|
@@ -76,17 +78,13 @@ export async function urlEncodedFromReq(req, options) {
|
|
|
76
78
|
return;
|
|
77
79
|
const buffer = await bufferFromReq(req, options);
|
|
78
80
|
if (buffer) {
|
|
79
|
-
|
|
80
|
-
const { simplifyUrlEncodedBody } = { ...bodyDefaultOptions, ...options };
|
|
81
|
-
return simplifyUrlEncodedBody ? Object.fromEntries(new URLSearchParams(str)) : qs.parse(str);
|
|
81
|
+
return (bodyDefaultOptions.urlEncodedParser ?? options?.urlEncodedParser ?? defaultQueryParser)(buffer.toString(charset));
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
export function urlFromReq(req) {
|
|
85
85
|
return new URL(req.url ?? '', 'https://example.com');
|
|
86
86
|
}
|
|
87
87
|
export function queryFromReq(req, options) {
|
|
88
|
-
|
|
89
|
-
const { simplifyQuery } = { ...bodyDefaultOptions, ...options };
|
|
90
|
-
return simplifyQuery ? Object.fromEntries(new URLSearchParams(query)) : qs.parse(query);
|
|
88
|
+
return (bodyDefaultOptions.urlEncodedParser ?? options?.urlEncodedParser ?? defaultQueryParser)(urlFromReq(req).searchParams.toString());
|
|
91
89
|
}
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keUhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYm9keUhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUN4RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQVFqRCxTQUFTLGtCQUFrQixDQUFDLE1BQWM7SUFDekMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsQ0FBQyxpQ0FBaUM7QUFDekYsQ0FBQztBQUVELElBQUksa0JBQWtCLEdBQXNCLEVBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUMsQ0FBQSxDQUFDLFFBQVE7QUFDM0UsTUFBTSxVQUFVLDJCQUEyQixDQUFDLE9BQW1DO0lBQzlFLGtCQUFrQixHQUFHLEVBQUMsR0FBRyxrQkFBa0IsRUFBRSxHQUFHLE9BQU8sRUFBQyxDQUFBO0FBQ3pELENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FBQyxHQUFvQixFQUFFLE9BQW9DO0lBQzdGLE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxFQUFDLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQTtJQUN2RDs7Ozs7T0FLRztJQUNGLCtGQUErRjtJQUNoRyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzdFLElBQ0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLFNBQVM7V0FDM0MsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1FBQzVCLE9BQU07SUFDUixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMs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
|
package/esm/router.d.ts
CHANGED
|
@@ -1,22 +1,11 @@
|
|
|
1
|
-
import type { Key } from 'path-to-regexp';
|
|
2
1
|
import { Chainable } from './dx.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
strict?: boolean;
|
|
2
|
+
import 'urlpattern-polyfill';
|
|
3
|
+
interface URLPatternOptions {
|
|
6
4
|
sensitive?: boolean;
|
|
7
|
-
start?: boolean;
|
|
8
|
-
delimiter?: string;
|
|
9
|
-
endsWith?: string;
|
|
10
|
-
encode?(value: string): string;
|
|
11
|
-
prefixes?: string;
|
|
12
5
|
}
|
|
13
|
-
export declare function matchPattern<Params extends Record<Key['name'], string>>(pathname: string, pattern: string, options?: RegexpToPathOptions): {
|
|
14
|
-
matched: any;
|
|
15
|
-
params: any;
|
|
16
|
-
} | undefined;
|
|
17
6
|
interface RouteContext {
|
|
18
|
-
matched:
|
|
19
|
-
params: Record<
|
|
7
|
+
matched: URLPatternResult;
|
|
8
|
+
params: Record<string, string>;
|
|
20
9
|
next(): any;
|
|
21
10
|
}
|
|
22
11
|
interface Route {
|
|
@@ -25,7 +14,7 @@ interface Route {
|
|
|
25
14
|
interface Routes {
|
|
26
15
|
[k: string]: Route;
|
|
27
16
|
}
|
|
28
|
-
interface RouterOptions extends
|
|
17
|
+
interface RouterOptions extends URLPatternOptions {
|
|
29
18
|
prefix?: string;
|
|
30
19
|
}
|
|
31
20
|
type Router = {
|
package/esm/router.js
CHANGED
|
@@ -1,45 +1,17 @@
|
|
|
1
|
-
import { pathToRegexp } from 'path-to-regexp';
|
|
2
1
|
import { getReq } from './dx.js';
|
|
2
|
+
import 'urlpattern-polyfill';
|
|
3
3
|
import { urlFromReq } from './bodyHelpers.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
if (
|
|
11
|
-
return pathCache[pattern];
|
|
12
|
-
const keys = [];
|
|
13
|
-
const regexp = pathToRegexp(pattern, keys, options);
|
|
14
|
-
const result = {
|
|
15
|
-
regexp,
|
|
16
|
-
keys
|
|
17
|
-
};
|
|
18
|
-
if (cacheCount < cacheLimit) {
|
|
19
|
-
pathCache[pattern] = result;
|
|
20
|
-
cacheCount++;
|
|
21
|
-
}
|
|
22
|
-
return result;
|
|
23
|
-
}
|
|
24
|
-
export function matchPattern(pathname, pattern, options) {
|
|
25
|
-
options = { ...options };
|
|
26
|
-
options.end ??= true;
|
|
27
|
-
options.strict ??= false;
|
|
28
|
-
options.sensitive ??= false;
|
|
29
|
-
options.start ??= true;
|
|
30
|
-
if (!pattern && pattern !== '')
|
|
31
|
-
return;
|
|
32
|
-
const { regexp, keys } = compilePath(pattern, options);
|
|
33
|
-
const match = regexp.exec(pathname);
|
|
34
|
-
if (!match)
|
|
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
|
+
function matchPattern(pathname, pattern, options) {
|
|
9
|
+
const matched = new URLPattern({ pathname: pattern }, undefined, options).exec({ pathname });
|
|
10
|
+
if (!matched)
|
|
35
11
|
return;
|
|
36
|
-
const [matched, ...values] = match;
|
|
37
12
|
return {
|
|
38
|
-
matched,
|
|
39
|
-
params:
|
|
40
|
-
acc[key.name] = values[index];
|
|
41
|
-
return acc;
|
|
42
|
-
}, {})
|
|
13
|
+
matched,
|
|
14
|
+
params: matched.pathname.groups
|
|
43
15
|
};
|
|
44
16
|
}
|
|
45
17
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
|
|
@@ -77,4 +49,4 @@ export const router = {
|
|
|
77
49
|
};
|
|
78
50
|
for (const method of allMethods)
|
|
79
51
|
router[method] = router.method.bind(router, method);
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksTUFBTSxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBRXpDLE9BQU8scUJBQXFCLENBQUE7QUFDNUIsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBTzNDLHFCQUFxQjtBQUNyQixnRUFBZ0U7QUFDaEUsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSxTQUFTLFlBQVksQ0FDcEIsUUFBZ0IsRUFDaEIsT0FBZSxFQUNmLE9BQTJCO0lBRTNCLE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFBO0lBQ3hGLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTTtJQUVwQixPQUFPO1FBQ04sT0FBTztRQUNQLE1BQU0sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQWdCO0tBQ3pDLENBQUE7QUFDRixDQUFDO0FBY0QsNERBQTREO0FBQzVELE1BQU0sVUFBVSxHQUFHO0lBQ2xCLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTztDQUNyRSxDQUFBO0FBK0JWLFNBQVMsVUFBVSxDQUNsQixNQUEwQixFQUFFLDZCQUE2QjtBQUN6RCxNQUF5QyxFQUN6QyxFQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxPQUFPLEtBQW1CLEVBQUU7SUFFN0MsT0FBTyxJQUFJLENBQUMsRUFBRTtRQUNiLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFBO1FBQ3BCLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO1FBQzlFLEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLE1BQU0sR0FBRyxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNwRixJQUFJLEtBQUs7Z0JBQUUsT0FBTyxPQUFPLENBQUM7b0JBQ3pCLEdBQUcsS0FBSztvQkFDUixJQUFJO2lCQUNKLENBQUMsQ0FBQTtRQUNILENBQUM7UUFDRCxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2QsQ0FBQyxDQUFBO0FBQ0YsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBVztJQUM3QixNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTTtRQUN2QixPQUFPLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVE7WUFDbkMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzVELENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxNQUFNO1FBQ1osT0FBTyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRO1lBQ25DLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0NBQ0QsQ0FBQTtBQUVELEtBQUssTUFBTSxNQUFNLElBQUksVUFBVTtJQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUEifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dx-server",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.9",
|
|
4
4
|
"main": "./cjs/index.js",
|
|
5
5
|
"homepage": "https://github.com/tranvansang/dx-server",
|
|
6
6
|
"repository": "https://github.com/tranvansang/dx-server",
|
|
@@ -29,16 +29,13 @@
|
|
|
29
29
|
},
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@types/node": "^20.12.
|
|
33
|
-
"@types/path-to-regexp": "^1.7.0",
|
|
34
|
-
"@types/qs": "^6.9.15",
|
|
32
|
+
"@types/node": "^20.12.8",
|
|
35
33
|
"@types/send": "^0.17.4",
|
|
36
34
|
"typescript": "^5.4.5"
|
|
37
35
|
},
|
|
38
36
|
"dependencies": {
|
|
39
37
|
"jdefer": "^0.0.14",
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"send": "^0.18.0"
|
|
38
|
+
"send": "^0.18.0",
|
|
39
|
+
"urlpattern-polyfill": "^10.0.0"
|
|
43
40
|
}
|
|
44
41
|
}
|