dx-server 0.5.5 → 0.5.7
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 +91 -24
- package/cjs/dx.d.ts +1 -1
- package/cjs/dxHelpers.js +9 -7
- package/cjs/express.js +1 -1
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +3 -3
- package/cjs/{route.d.ts → router.d.ts} +9 -6
- package/cjs/router.js +84 -0
- package/esm/dx.d.ts +1 -1
- package/esm/dxHelpers.js +9 -7
- package/esm/express.js +1 -1
- package/esm/index.d.ts +1 -1
- package/esm/index.js +2 -2
- package/esm/{route.d.ts → router.d.ts} +9 -6
- package/esm/router.js +80 -0
- package/package.json +1 -1
- package/cjs/route.js +0 -87
- package/esm/route.js +0 -83
package/README.md
CHANGED
|
@@ -42,22 +42,12 @@ File server:
|
|
|
42
42
|
```javascript
|
|
43
43
|
import {Server} from 'node:http'
|
|
44
44
|
import chain from 'jchain'
|
|
45
|
-
import dxServer, {chainStatic,
|
|
45
|
+
import dxServer, {chainStatic, setHtml} from 'dx-server'
|
|
46
46
|
import {resolve, dirname} from 'node:path'
|
|
47
47
|
import {fileURLToPath} from 'node:url'
|
|
48
48
|
|
|
49
49
|
new Server().on('request', (req, res) => chain(
|
|
50
50
|
dxServer(req, res),
|
|
51
|
-
async next => {
|
|
52
|
-
try {
|
|
53
|
-
getRes().setHeader('Cache-Control', 'no-cache')
|
|
54
|
-
console.log(getReq().method, getReq().url)
|
|
55
|
-
await next()
|
|
56
|
-
} catch (e) {
|
|
57
|
-
console.error(e)
|
|
58
|
-
setHtml('internal server error', {status: 500})
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
51
|
chainStatic('/', {root: resolve(dirname(fileURLToPath(import.meta.url)), 'public')}),
|
|
62
52
|
() => setHtml('not found', {status: 404}),
|
|
63
53
|
)()
|
|
@@ -157,14 +147,8 @@ const serverChain = chain(
|
|
|
157
147
|
setJson({name: authContext.value.name})
|
|
158
148
|
},
|
|
159
149
|
}),
|
|
160
|
-
router.get(
|
|
161
|
-
|
|
162
|
-
setHtml('ok')
|
|
163
|
-
},
|
|
164
|
-
'/health'() {
|
|
165
|
-
setHtml('ok')
|
|
166
|
-
}
|
|
167
|
-
}),
|
|
150
|
+
router.get('/', () => setHtml('ok')), // router.method() accepts 2 formats
|
|
151
|
+
router.get('/health', () => setText('ok')),
|
|
168
152
|
() => { // not found router
|
|
169
153
|
throw new ServerError('not found', 404, 'not_found')
|
|
170
154
|
},
|
|
@@ -189,7 +173,7 @@ console.log('server is listening at 3000')
|
|
|
189
173
|
|
|
190
174
|
## Note:
|
|
191
175
|
|
|
192
|
-
`getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery` are all
|
|
176
|
+
`getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery` are all asynchronous functions.
|
|
193
177
|
The associated results are calculated in the first time they are called and cached for subsequent calls.
|
|
194
178
|
|
|
195
179
|
If you want to get these values synchronously, chain it, like follows:
|
|
@@ -247,20 +231,26 @@ import {
|
|
|
247
231
|
} from 'dx-server/helpers'
|
|
248
232
|
```
|
|
249
233
|
|
|
234
|
+
## Basic
|
|
235
|
+
```javascript
|
|
236
|
+
import dxServer, {
|
|
237
|
+
getReq, getRes, getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery,
|
|
238
|
+
setHtml, setJson, setText, setBuffer, setRedirect, setNodeStream, setWebStream, setFile,
|
|
239
|
+
makeDxContext
|
|
240
|
+
} from 'dx-server'
|
|
241
|
+
```
|
|
242
|
+
|
|
250
243
|
- `getReq()`, `getRes()`: get request and response objects from anywhere.
|
|
251
244
|
|
|
252
245
|
- `getBuffer()`, `getJson()`, `getRaw()`, `getText()`, `getUrlEncoded()`, `getQuery()`: get parsed request body, raw body, text body, url encoded body, query string from anywhere.
|
|
253
246
|
These are DX context object, can be used as follows:
|
|
254
247
|
- `const json = await getJson()`: lazily load the context, once loaded, it is cached for subsequent calls.
|
|
248
|
+
No chaining is required.
|
|
255
249
|
- Chain it to get the value synchronously: `chain(getJson.chain(), next => console.log(getJson.value))`. Note that the value is calculated in every request.
|
|
256
250
|
- `makeDxContext(fn)`: create a DX context object.
|
|
257
251
|
|
|
258
252
|
- `setHtml`, `setJson`, `setText`, `setBuffer`, `setRedirect`, `setNodeStream`, `setWebStream`, `setFile`: set response body.
|
|
259
253
|
|
|
260
|
-
- `router.get`, `router.post`, `router.put`, `router.delete`, `router.patch`, `router.head`, `router.options`, `router.connect`, `router.trace`: create router.
|
|
261
|
-
- `router.method(methods, routes, options)`: create router with custom methods.
|
|
262
|
-
- `router.all(routes, options)`: create router for all methods.
|
|
263
|
-
|
|
264
254
|
- `connectMiddlewares(...middlewares)`: connect middlewares. For example:
|
|
265
255
|
```javascript
|
|
266
256
|
import {connectMiddlewares} from 'dx-server'
|
|
@@ -283,3 +273,80 @@ chain(
|
|
|
283
273
|
chainStatic('/assets', {root: resolve(dirname(fileURLToPath(import.meta.url)), 'public')})
|
|
284
274
|
)
|
|
285
275
|
```
|
|
276
|
+
|
|
277
|
+
## Routing
|
|
278
|
+
```javascript
|
|
279
|
+
import {router} from 'dx-server'
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
- `router.get`, `router.post`, `router.put`, `router.delete`, `router.patch`, `router.head`, `router.options`, `router.connect`, `router.trace`: create router.
|
|
283
|
+
These functions accept 2 formats:
|
|
284
|
+
- `router.get(routes: {[pattern: string]: Route}, options: RouterOptions)`: create multiple routes.
|
|
285
|
+
- `router.get(pattern: string, handler: Route, options: RouterOptions)`: create route for GET method.
|
|
286
|
+
|
|
287
|
+
- `router.all(...)`: same as `router.get()` but for any method.
|
|
288
|
+
- `router.method()`: create router with custom method. Similar to `router.get()`, this function accepts 2 formats.
|
|
289
|
+
- `router.method(method: string, routes: {[pattern: string]: Route}, options: RouterOptions)`: create multiple routes.
|
|
290
|
+
- `router.method(method: string, pattern: string, handler: Route, options: RouterOptions)`: create route for `method` method.
|
|
291
|
+
|
|
292
|
+
`RouterOptions` is defined as follows:
|
|
293
|
+
```typescript
|
|
294
|
+
interface RegexpToPathOptions {
|
|
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 {
|
|
306
|
+
prefix?: string
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
`options: RegexpToPathOptions` (except `prefix` key) is directly passed to [path-to-regexp](https://www.npmjs.com/package/path-to-regexp) package.
|
|
310
|
+
|
|
311
|
+
`Route` is defined as follows:
|
|
312
|
+
```typescript
|
|
313
|
+
interface RouteContext {
|
|
314
|
+
matched: string
|
|
315
|
+
params: Record<string, string>
|
|
316
|
+
next(): any
|
|
317
|
+
}
|
|
318
|
+
type Route = (context: RouteContext) => any
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
## Helpers
|
|
322
|
+
```javascript
|
|
323
|
+
import {
|
|
324
|
+
setBufferBodyDefaultOptions,
|
|
325
|
+
bufferFromReq, jsonFromReq, rawFromReq, textFromReq, urlEncodedFromReq, queryFromReq,
|
|
326
|
+
} from 'dx-server/helpers'
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
Helpers are all pure functions, and do not rely on any context.
|
|
330
|
+
These functions are independent of the context and can be used anywhere, even outside of this package.
|
|
331
|
+
They require request and response objects to be passed.
|
|
332
|
+
|
|
333
|
+
## ExpressJS
|
|
334
|
+
```javascript
|
|
335
|
+
import {expressApp, expressRouter} from 'dx-server/express' // requires express installed
|
|
336
|
+
|
|
337
|
+
chain(
|
|
338
|
+
await expressApp(app => {// any express feature can be used. This requires express installed, with for e.g., `yarn add express`
|
|
339
|
+
app.set('trust proxy', true)
|
|
340
|
+
if (process.env.NODE_ENV !== 'production') app.set('json spaces', 2)
|
|
341
|
+
app.use('/public', express.static('public'))
|
|
342
|
+
}),
|
|
343
|
+
expressRouter(router => {
|
|
344
|
+
router.use(cors())
|
|
345
|
+
}),
|
|
346
|
+
)
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## Other functionalities
|
|
350
|
+
- Download file: set the [Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) header.
|
|
351
|
+
- Upload file: recommend [busboy](https://www.npmjs.com/package/busboy) package.
|
|
352
|
+
- Cookie: recommend [cookie](https://www.npmjs.com/package/cookie) package.
|
package/cjs/dx.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ export declare function setJson(json: any, { status }?: {
|
|
|
34
34
|
}): void;
|
|
35
35
|
export declare function setRedirect(url: string, status: 301 | 302): void;
|
|
36
36
|
interface Context<T, Params extends any[], R = any, Next = (...np: any[]) => any> {
|
|
37
|
-
value: T
|
|
37
|
+
value: Awaited<T>;
|
|
38
38
|
chain(...params: Params): Chainable<Params, R, Next>;
|
|
39
39
|
(...params: Params): Promise<T>;
|
|
40
40
|
}
|
package/cjs/dxHelpers.js
CHANGED
|
@@ -23,25 +23,27 @@ async function writeRes(req, res, { type, data, charset, jsonBeautify, disableEt
|
|
|
23
23
|
case 'html':
|
|
24
24
|
setContentType('text/html');
|
|
25
25
|
// shared with text
|
|
26
|
-
bufferOrStream = Buffer.from(data, charset);
|
|
26
|
+
bufferOrStream = Buffer.from(data ?? '', charset);
|
|
27
27
|
break;
|
|
28
28
|
case 'buffer':
|
|
29
29
|
setContentType('application/octet-stream');
|
|
30
|
-
bufferOrStream = data;
|
|
30
|
+
bufferOrStream = data ?? Buffer.from('', charset);
|
|
31
31
|
break;
|
|
32
32
|
case 'nodeStream':
|
|
33
33
|
setContentType('application/octet-stream');
|
|
34
|
-
bufferOrStream = data;
|
|
34
|
+
bufferOrStream = data ?? Buffer.from('', charset);
|
|
35
35
|
break;
|
|
36
36
|
case 'webStream':
|
|
37
37
|
setContentType('application/octet-stream');
|
|
38
|
-
bufferOrStream = node_stream_1.Readable.fromWeb(data);
|
|
38
|
+
bufferOrStream = node_stream_1.Readable.fromWeb(data ?? new ReadableStream());
|
|
39
39
|
break;
|
|
40
40
|
case 'json':
|
|
41
41
|
setContentType('application/json');
|
|
42
|
-
bufferOrStream =
|
|
42
|
+
bufferOrStream = data === undefined
|
|
43
|
+
? Buffer.from('', charset)
|
|
44
|
+
: Buffer.from(jsonBeautify ? JSON.stringify(data, null, 2) : JSON.stringify(data), charset);
|
|
43
45
|
break;
|
|
44
|
-
case 'redirect':
|
|
46
|
+
case 'redirect': // https://stackoverflow.com/a/8059718/1398479
|
|
45
47
|
res.setHeader('location', data);
|
|
46
48
|
bufferOrStream = Buffer.from('', charset);
|
|
47
49
|
break;
|
|
@@ -115,4 +117,4 @@ async function writeRes(req, res, { type, data, charset, jsonBeautify, disableEt
|
|
|
115
117
|
}
|
|
116
118
|
}
|
|
117
119
|
exports.writeRes = writeRes;
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHhIZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2R4SGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSw2Q0FBb0M7QUFDcEMsb0RBQThCO0FBQzlCLHlDQUFtQztBQUNuQyx1Q0FBZ0Q7QUFFaEQseURBQTJDO0FBQzNDLG1DQUE4QjtBQStDdkIsS0FBSyxVQUFVLFFBQVEsQ0FBQyxHQUFvQixFQUFFLEdBQW1CLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBWTtJQUM3SSxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRTtRQUM5QyxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFBRSxPQUFNO1FBQzVELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN4RixDQUFDLENBQUE7SUFDRCxJQUFJLGNBQWMsQ0FBQTtJQUVsQixRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2QsS0FBSyxNQUFNO1lBQ1YsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzdCLEtBQUssTUFBTTtZQUNWLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUMzQixtQkFBbUI7WUFDbkIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNqRCxNQUFLO1FBQ04sS0FBSyxRQUFRO1lBQ1osY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUE7WUFDMUMsY0FBYyxHQUFHLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMs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
|
package/cjs/express.js
CHANGED
|
@@ -38,4 +38,4 @@ async function expressRouter(setup) {
|
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
40
|
exports.expressRouter = expressRouter;
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHByZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHNEQUEwRDtBQUMxRCxvREFBOEI7QUFDOUIsbUNBQXNDO0FBRS9CLEtBQUssVUFBVSxVQUFVLENBQUMsS0FBNEI7SUFDNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRW5DLE1BQU0sR0FBRyxHQUFHLElBQUEsaUJBQU8sR0FBRSxDQUFBO0lBQ3JCLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDcEQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzNELE9BQU8sS0FBSyxFQUFDLElBQUksRUFBQyxFQUFFO1FBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUEsZ0JBQVMsR0FBRSxDQUFBO1FBQ3pCLElBQUEsY0FBTSxHQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFBO1FBQ3hCLEdBQUcsQ0FBQyxJQUFBLGNBQU0sR0FBRSxFQUFFLElBQUEsY0FBTSxHQUFFLENBQUMsQ0FBQTtRQUN2QixNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUE7UUFDbkIsTUFBTSxJQUFJLEVBQUUsQ0FBQTtJQUNiLENBQUMsQ0FBQTtBQUNGLENBQUM7QUFkRCxnQ0FjQztBQUVELDRDQUE0QztBQUNyQyxLQUFLLFVBQVUsYUFBYSxDQUFDLEtBQThCO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUV0QyxNQUFNLE1BQU0sR0FBRyxpQkFBTyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQy9CLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ25CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDdkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzlELE9BQU8sS0FBSyxFQUFDLElBQUksRUFBQyxFQUFFO1FBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUEsZ0JBQVMsR0FBRSxDQUFBO1FBQ3pCLElBQUEsY0FBTSxHQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFBO1FBQ3hCLE1BQU0sQ0FBQyxJQUFBLGNBQU0sR0FBRSxFQUFFLElBQUEsY0FBTSxHQUFFLENBQUMsQ0FBQTtRQUMxQixNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUEsQ0FBQyxzRUFBc0U7UUFDMUYsTUFBTSxJQUFJLEVBQUUsQ0FBQTtJQUNiLENBQUMsQ0FBQTtBQUNGLENBQUM7QUFkRCxzQ0FjQyJ9
|
package/cjs/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { getReq, getRes, setHtml, setNodeStream, setWebStream, setJson, setBuffer, setRedirect, setText, setFile, makeDxContext, } from './dx.js';
|
|
2
2
|
import { dxServer } from './dx.js';
|
|
3
3
|
export { getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery, } from './body.js';
|
|
4
|
-
export { router } from './
|
|
4
|
+
export { router } from './router.js';
|
|
5
5
|
export { connectMiddlewares } from './connect.js';
|
|
6
6
|
export { chainStatic } from './static.js';
|
|
7
7
|
export default dxServer;
|
package/cjs/index.js
CHANGED
|
@@ -21,11 +21,11 @@ Object.defineProperty(exports, "getRaw", { enumerable: true, get: function () {
|
|
|
21
21
|
Object.defineProperty(exports, "getText", { enumerable: true, get: function () { return body_js_1.getText; } });
|
|
22
22
|
Object.defineProperty(exports, "getUrlEncoded", { enumerable: true, get: function () { return body_js_1.getUrlEncoded; } });
|
|
23
23
|
Object.defineProperty(exports, "getQuery", { enumerable: true, get: function () { return body_js_1.getQuery; } });
|
|
24
|
-
var
|
|
25
|
-
Object.defineProperty(exports, "router", { enumerable: true, get: function () { return
|
|
24
|
+
var router_js_1 = require("./router.js");
|
|
25
|
+
Object.defineProperty(exports, "router", { enumerable: true, get: function () { return router_js_1.router; } });
|
|
26
26
|
var connect_js_1 = require("./connect.js");
|
|
27
27
|
Object.defineProperty(exports, "connectMiddlewares", { enumerable: true, get: function () { return connect_js_1.connectMiddlewares; } });
|
|
28
28
|
var static_js_1 = require("./static.js");
|
|
29
29
|
Object.defineProperty(exports, "chainStatic", { enumerable: true, get: function () { return static_js_1.chainStatic; } });
|
|
30
30
|
exports.default = dx_js_2.dxServer;
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBWWdCO0FBWGYsK0ZBQUEsTUFBTSxPQUFBO0FBQ04sK0ZBQUEsTUFBTSxPQUFBO0FBQ04sZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asc0dBQUEsYUFBYSxPQUFBO0FBQ2IscUdBQUEsWUFBWSxPQUFBO0FBQ1osZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asa0dBQUEsU0FBUyxPQUFBO0FBQ1Qsb0dBQUEsV0FBVyxPQUFBO0FBQ1gsZ0dBQUEsT0FBTyxPQUFBO0FBQ1AsZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asc0dBQUEsYUFBYSxPQUFBO0FBRWQsbUNBQWdDO0FBQ2hDLHFDQU9rQjtBQU5qQixvR0FBQSxTQUFTLE9BQUE7QUFDVCxrR0FBQSxPQUFPLE9BQUE7QUFDUCxpR0FBQSxNQUFNLE9BQUE7QUFDTixrR0FBQSxPQUFPLE9BQUE7QUFDUCx3R0FBQSxhQUFhLE9BQUE7QUFDYixtR0FBQSxRQUFRLE9BQUE7QUFFVCx5Q0FBa0M7QUFBMUIsbUdBQUEsTUFBTSxPQUFBO0FBQ2QsMkNBQStDO0FBQXZDLGdIQUFBLGtCQUFrQixPQUFBO0FBQzFCLHlDQUF1QztBQUEvQix3R0FBQSxXQUFXLE9BQUE7QUFFbkIsa0JBQWUsZ0JBQVEsQ0FBQSJ9
|
|
@@ -16,21 +16,24 @@ export declare function matchPattern<Params extends Record<Key['name'], string>>
|
|
|
16
16
|
} | undefined;
|
|
17
17
|
interface RouteContext {
|
|
18
18
|
matched: string;
|
|
19
|
-
next(): any;
|
|
20
19
|
params: Record<Key['name'], string>;
|
|
20
|
+
next(): any;
|
|
21
|
+
}
|
|
22
|
+
interface Route {
|
|
23
|
+
(context: RouteContext): any;
|
|
21
24
|
}
|
|
22
|
-
interface
|
|
23
|
-
[k: string]:
|
|
25
|
+
interface Routes {
|
|
26
|
+
[k: string]: Route;
|
|
24
27
|
}
|
|
25
28
|
interface RouterOptions extends RegexpToPathOptions {
|
|
26
29
|
prefix?: string;
|
|
27
30
|
}
|
|
28
31
|
declare const allMethods: readonly ["get", "head", "post", "put", "delete", "connect", "options", "trace", "patch"];
|
|
29
32
|
type IRouter = {
|
|
30
|
-
[K in typeof allMethods[number]]: (
|
|
33
|
+
[K in typeof allMethods[number]]: ((routes: Routes, options?: RouterOptions) => Chainable) | ((pattern: string, route: Route, options?: RouterOptions) => Chainable);
|
|
31
34
|
} & {
|
|
32
|
-
all(
|
|
33
|
-
method(method: string,
|
|
35
|
+
all: ((routes: Routes, options?: RouterOptions) => Chainable) | ((pattern: string, route: Route, options?: RouterOptions) => Chainable);
|
|
36
|
+
method: ((method: string, routes: Routes, options?: RouterOptions) => Chainable) | ((method: string, pattern: string, route: Route, options?: RouterOptions) => Chainable);
|
|
34
37
|
};
|
|
35
38
|
export declare const router: IRouter;
|
|
36
39
|
export {};
|
package/cjs/router.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.router = exports.matchPattern = void 0;
|
|
4
|
+
const path_to_regexp_1 = require("path-to-regexp");
|
|
5
|
+
const dx_js_1 = require("./dx.js");
|
|
6
|
+
const bodyHelpers_js_1 = require("./bodyHelpers.js");
|
|
7
|
+
const cache = {};
|
|
8
|
+
const cacheLimit = 10000;
|
|
9
|
+
let cacheCount = 0;
|
|
10
|
+
function compilePath(pattern, options) {
|
|
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
|
+
}
|
|
27
|
+
function matchPattern(pathname, pattern, options) {
|
|
28
|
+
options = { ...options };
|
|
29
|
+
options.end ??= true;
|
|
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)
|
|
38
|
+
return;
|
|
39
|
+
const [matched, ...values] = match;
|
|
40
|
+
return {
|
|
41
|
+
matched, // the matched portion of the URL
|
|
42
|
+
params: keys.reduce((acc, key, index) => {
|
|
43
|
+
acc[key.name] = values[index];
|
|
44
|
+
return acc;
|
|
45
|
+
}, {})
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
exports.matchPattern = matchPattern;
|
|
49
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
|
|
50
|
+
const allMethods = [
|
|
51
|
+
'get', 'head', 'post', 'put', 'delete', 'connect', 'options', 'trace', 'patch'
|
|
52
|
+
];
|
|
53
|
+
function makeRouter(method, // undefined means any method
|
|
54
|
+
routes, { prefix = '', ...options } = {}) {
|
|
55
|
+
return next => {
|
|
56
|
+
const req = (0, dx_js_1.getReq)();
|
|
57
|
+
if (method !== undefined && req.method !== method.toUpperCase())
|
|
58
|
+
return next();
|
|
59
|
+
for (const [pattern, handler] of routes) {
|
|
60
|
+
const match = matchPattern((0, bodyHelpers_js_1.urlFromReq)(req).pathname, `${prefix}${pattern}`, options);
|
|
61
|
+
if (match)
|
|
62
|
+
return handler({
|
|
63
|
+
...match,
|
|
64
|
+
next,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return next();
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
exports.router = {
|
|
71
|
+
method(method, ...params) {
|
|
72
|
+
return typeof params[0] === 'string'
|
|
73
|
+
? makeRouter(method, [[params[0], params[1]]], params[2])
|
|
74
|
+
: makeRouter(method, Object.entries(params[0]), params[1]);
|
|
75
|
+
},
|
|
76
|
+
all(...params) {
|
|
77
|
+
return typeof params[0] === 'string'
|
|
78
|
+
? makeRouter(undefined, [[params[0], params[1]]], params[2])
|
|
79
|
+
: makeRouter(undefined, Object.entries(params[0]), params[1]);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
for (const method of allMethods)
|
|
83
|
+
exports.router[method] = exports.router.method.bind(exports.router, method);
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxtREFBMkM7QUFDM0MsbUNBQXlDO0FBQ3pDLHFEQUEyQztBQUUzQyxNQUFNLEtBQUssR0FBd0IsRUFBRSxDQUFBO0FBQ3JDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQTtBQUN4QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUE7QUFjbEIsU0FBUyxXQUFXLENBQUMsT0FBZSxFQUFFLE9BQTRCO0lBQ2pFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQzNELElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRWpELE1BQU0sSUFBSSxHQUFVLEVBQUUsQ0FBQTtJQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFBLDZCQUFZLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNuRCxNQUFNLE1BQU0sR0FBRztRQUNkLE1BQU07UUFDTixJQUFJO0tBQ0osQ0FBQTtJQUVELElBQUksVUFBVSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdCLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUE7UUFDM0IsVUFBVSxFQUFFLENBQUE7SUFDYixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUMzQixRQUFnQixFQUNoQixPQUFlLEVBQ2YsT0FBNkI7SUFFN0IsT0FBTyxHQUFHLEVBQUMsR0FBRyxPQUFPLEVBQUMsQ0FBQTtJQUN0QixPQUFPLENBQUMsR0FBRyxLQUFLLElBQUks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
|
package/esm/dx.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ export declare function setJson(json: any, { status }?: {
|
|
|
34
34
|
}): void;
|
|
35
35
|
export declare function setRedirect(url: string, status: 301 | 302): void;
|
|
36
36
|
interface Context<T, Params extends any[], R = any, Next = (...np: any[]) => any> {
|
|
37
|
-
value: T
|
|
37
|
+
value: Awaited<T>;
|
|
38
38
|
chain(...params: Params): Chainable<Params, R, Next>;
|
|
39
39
|
(...params: Params): Promise<T>;
|
|
40
40
|
}
|
package/esm/dxHelpers.js
CHANGED
|
@@ -17,25 +17,27 @@ export async function writeRes(req, res, { type, data, charset, jsonBeautify, di
|
|
|
17
17
|
case 'html':
|
|
18
18
|
setContentType('text/html');
|
|
19
19
|
// shared with text
|
|
20
|
-
bufferOrStream = Buffer.from(data, charset);
|
|
20
|
+
bufferOrStream = Buffer.from(data ?? '', charset);
|
|
21
21
|
break;
|
|
22
22
|
case 'buffer':
|
|
23
23
|
setContentType('application/octet-stream');
|
|
24
|
-
bufferOrStream = data;
|
|
24
|
+
bufferOrStream = data ?? Buffer.from('', charset);
|
|
25
25
|
break;
|
|
26
26
|
case 'nodeStream':
|
|
27
27
|
setContentType('application/octet-stream');
|
|
28
|
-
bufferOrStream = data;
|
|
28
|
+
bufferOrStream = data ?? Buffer.from('', charset);
|
|
29
29
|
break;
|
|
30
30
|
case 'webStream':
|
|
31
31
|
setContentType('application/octet-stream');
|
|
32
|
-
bufferOrStream = Readable.fromWeb(data);
|
|
32
|
+
bufferOrStream = Readable.fromWeb(data ?? new ReadableStream());
|
|
33
33
|
break;
|
|
34
34
|
case 'json':
|
|
35
35
|
setContentType('application/json');
|
|
36
|
-
bufferOrStream =
|
|
36
|
+
bufferOrStream = data === undefined
|
|
37
|
+
? Buffer.from('', charset)
|
|
38
|
+
: Buffer.from(jsonBeautify ? JSON.stringify(data, null, 2) : JSON.stringify(data), charset);
|
|
37
39
|
break;
|
|
38
|
-
case 'redirect':
|
|
40
|
+
case 'redirect': // https://stackoverflow.com/a/8059718/1398479
|
|
39
41
|
res.setHeader('location', data);
|
|
40
42
|
bufferOrStream = Buffer.from('', charset);
|
|
41
43
|
break;
|
|
@@ -108,4 +110,4 @@ export async function writeRes(req, res, { type, data, charset, jsonBeautify, di
|
|
|
108
110
|
await promisify(res.end.bind(res))(undefined); // some express middleware, such as express-session, requires explicitly passing chunk
|
|
109
111
|
}
|
|
110
112
|
}
|
|
111
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHhIZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2R4SGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sU0FBUyxNQUFNLFFBQVEsQ0FBQTtBQUM5QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBRWhELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMzQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBK0M5QixNQUFNLENBQUMsS0FBSyxVQUFVLFFBQVEsQ0FBQyxHQUFvQixFQUFFLEdBQW1CLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBWTtJQUM3SSxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRTtRQUM5QyxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFBRSxPQUFNO1FBQzVELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN4RixDQUFDLENBQUE7SUFDRCxJQUFJLGNBQWMsQ0FBQTtJQUVsQixRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2QsS0FBSyxNQUFNO1lBQ1YsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzdCLEtBQUssTUFBTTtZQUNWLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUMzQixtQkFBbUI7WUFDbkIsY0FBYyxHQUFHLE1BQU0s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
|
package/esm/express.js
CHANGED
|
@@ -30,4 +30,4 @@ export async function expressRouter(setup) {
|
|
|
30
30
|
await next();
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHByZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sT0FBb0MsTUFBTSxTQUFTLENBQUE7QUFDMUQsT0FBTyxTQUFTLE1BQU0sUUFBUSxDQUFBO0FBQzlCLE9BQU8sRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBRXRDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsVUFBVSxDQUFDLEtBQTRCO0lBQzVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUVuQyxNQUFNLEdBQUcsR0FBRyxPQUFPLEVBQUUsQ0FBQTtJQUNyQixNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNoQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ3BELEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMzRCxPQUFPLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtRQUNuQixNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQTtRQUN6QixNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUE7UUFDeEIsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDdkIsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFBO1FBQ25CLE1BQU0sSUFBSSxFQUFFLENBQUE7SUFDYixDQUFDLENBQUE7QUFDRixDQUFDO0FBRUQsNENBQTRDO0FBQzVDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUFDLEtBQThCO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUV0QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDL0IsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUN2RCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDOUQsT0FBTyxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7UUFDbkIsTUFBTSxLQUFLLEdBQUcsU0FBUyxFQUFFLENBQUE7UUFDekIsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFBO1FBQ3hCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQzFCLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQSxDQUFDLHNFQUFzRTtRQUMxRixNQUFNLElBQUksRUFBRSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0FBQ0YsQ0FBQyJ9
|
package/esm/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { getReq, getRes, setHtml, setNodeStream, setWebStream, setJson, setBuffer, setRedirect, setText, setFile, makeDxContext, } from './dx.js';
|
|
2
2
|
import { dxServer } from './dx.js';
|
|
3
3
|
export { getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery, } from './body.js';
|
|
4
|
-
export { router } from './
|
|
4
|
+
export { router } from './router.js';
|
|
5
5
|
export { connectMiddlewares } from './connect.js';
|
|
6
6
|
export { chainStatic } from './static.js';
|
|
7
7
|
export default dxServer;
|
package/esm/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { getReq, getRes, setHtml, setNodeStream, setWebStream, setJson, setBuffer, setRedirect, setText, setFile, makeDxContext, } from './dx.js';
|
|
2
2
|
import { dxServer } from './dx.js';
|
|
3
3
|
export { getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery, } from './body.js';
|
|
4
|
-
export { router } from './
|
|
4
|
+
export { router } from './router.js';
|
|
5
5
|
export { connectMiddlewares } from './connect.js';
|
|
6
6
|
export { chainStatic } from './static.js';
|
|
7
7
|
export default dxServer;
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sT0FBTyxFQUNQLGFBQWEsRUFDYixZQUFZLEVBQ1osT0FBTyxFQUNQLFNBQVMsRUFDVCxXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxhQUFhLEdBQ2IsTUFBTSxTQUFTLENBQUE7QUFDaEIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoQyxPQUFPLEVBQ04sU0FBUyxFQUNULE9BQU8sRUFDUCxNQUFNLEVBQ04sT0FBTyxFQUNQLGFBQWEsRUFDYixRQUFRLEdBQ1IsTUFBTSxXQUFXLENBQUE7QUFDbEIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUNsQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDL0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUV2QyxlQUFlLFFBQVEsQ0FBQSJ9
|
|
@@ -16,21 +16,24 @@ export declare function matchPattern<Params extends Record<Key['name'], string>>
|
|
|
16
16
|
} | undefined;
|
|
17
17
|
interface RouteContext {
|
|
18
18
|
matched: string;
|
|
19
|
-
next(): any;
|
|
20
19
|
params: Record<Key['name'], string>;
|
|
20
|
+
next(): any;
|
|
21
|
+
}
|
|
22
|
+
interface Route {
|
|
23
|
+
(context: RouteContext): any;
|
|
21
24
|
}
|
|
22
|
-
interface
|
|
23
|
-
[k: string]:
|
|
25
|
+
interface Routes {
|
|
26
|
+
[k: string]: Route;
|
|
24
27
|
}
|
|
25
28
|
interface RouterOptions extends RegexpToPathOptions {
|
|
26
29
|
prefix?: string;
|
|
27
30
|
}
|
|
28
31
|
declare const allMethods: readonly ["get", "head", "post", "put", "delete", "connect", "options", "trace", "patch"];
|
|
29
32
|
type IRouter = {
|
|
30
|
-
[K in typeof allMethods[number]]: (
|
|
33
|
+
[K in typeof allMethods[number]]: ((routes: Routes, options?: RouterOptions) => Chainable) | ((pattern: string, route: Route, options?: RouterOptions) => Chainable);
|
|
31
34
|
} & {
|
|
32
|
-
all(
|
|
33
|
-
method(method: string,
|
|
35
|
+
all: ((routes: Routes, options?: RouterOptions) => Chainable) | ((pattern: string, route: Route, options?: RouterOptions) => Chainable);
|
|
36
|
+
method: ((method: string, routes: Routes, options?: RouterOptions) => Chainable) | ((method: string, pattern: string, route: Route, options?: RouterOptions) => Chainable);
|
|
34
37
|
};
|
|
35
38
|
export declare const router: IRouter;
|
|
36
39
|
export {};
|
package/esm/router.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { pathToRegexp } from 'path-to-regexp';
|
|
2
|
+
import { getReq } from './dx.js';
|
|
3
|
+
import { urlFromReq } from './bodyHelpers.js';
|
|
4
|
+
const cache = {};
|
|
5
|
+
const cacheLimit = 10000;
|
|
6
|
+
let cacheCount = 0;
|
|
7
|
+
function compilePath(pattern, options) {
|
|
8
|
+
const cacheKey = JSON.stringify(options);
|
|
9
|
+
const pathCache = cache[cacheKey] || (cache[cacheKey] = {});
|
|
10
|
+
if (pathCache[pattern])
|
|
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)
|
|
35
|
+
return;
|
|
36
|
+
const [matched, ...values] = match;
|
|
37
|
+
return {
|
|
38
|
+
matched, // the matched portion of the URL
|
|
39
|
+
params: keys.reduce((acc, key, index) => {
|
|
40
|
+
acc[key.name] = values[index];
|
|
41
|
+
return acc;
|
|
42
|
+
}, {})
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
|
|
46
|
+
const allMethods = [
|
|
47
|
+
'get', 'head', 'post', 'put', 'delete', 'connect', 'options', 'trace', 'patch'
|
|
48
|
+
];
|
|
49
|
+
function makeRouter(method, // undefined means any method
|
|
50
|
+
routes, { prefix = '', ...options } = {}) {
|
|
51
|
+
return next => {
|
|
52
|
+
const req = getReq();
|
|
53
|
+
if (method !== undefined && req.method !== method.toUpperCase())
|
|
54
|
+
return next();
|
|
55
|
+
for (const [pattern, handler] of routes) {
|
|
56
|
+
const match = matchPattern(urlFromReq(req).pathname, `${prefix}${pattern}`, options);
|
|
57
|
+
if (match)
|
|
58
|
+
return handler({
|
|
59
|
+
...match,
|
|
60
|
+
next,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return next();
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export const router = {
|
|
67
|
+
method(method, ...params) {
|
|
68
|
+
return typeof params[0] === 'string'
|
|
69
|
+
? makeRouter(method, [[params[0], params[1]]], params[2])
|
|
70
|
+
: makeRouter(method, Object.entries(params[0]), params[1]);
|
|
71
|
+
},
|
|
72
|
+
all(...params) {
|
|
73
|
+
return typeof params[0] === 'string'
|
|
74
|
+
? makeRouter(undefined, [[params[0], params[1]]], params[2])
|
|
75
|
+
: makeRouter(undefined, Object.entries(params[0]), params[1]);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
for (const method of allMethods)
|
|
79
|
+
router[method] = router.method.bind(router, method);
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUE7QUFDM0MsT0FBTyxFQUFZLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUN6QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFFM0MsTUFBTSxLQUFLLEdBQXdCLEVBQUUsQ0FBQTtBQUNyQyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUE7QUFDeEIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFBO0FBY2xCLFNBQVMsV0FBVyxDQUFDLE9BQWUsRUFBRSxPQUE0QjtJQUNqRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUMzRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVqRCxNQUFNLElBQUksR0FBVSxFQUFFLENBQUE7SUFDdEIsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbkQsTUFBTSxNQUFNLEdBQUc7UUFDZCxNQUFNO1FBQ04sSUFBSTtLQUNKLENBQUE7SUFFRCxJQUFJLFVBQVUsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM3QixTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFBO1FBQzNCLFVBQVUsRUFBRSxDQUFBO0lBQ2IsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFBO0FBQ2QsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQzNCLFFBQWdCLEVBQ2hCLE9BQWUs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
|
package/package.json
CHANGED
package/cjs/route.js
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.router = exports.matchPattern = void 0;
|
|
4
|
-
const path_to_regexp_1 = require("path-to-regexp");
|
|
5
|
-
const dx_js_1 = require("./dx.js");
|
|
6
|
-
const bodyHelpers_js_1 = require("./bodyHelpers.js");
|
|
7
|
-
const cache = {};
|
|
8
|
-
const cacheLimit = 10000;
|
|
9
|
-
let cacheCount = 0;
|
|
10
|
-
function compilePath(path, options) {
|
|
11
|
-
const cacheKey = JSON.stringify(options);
|
|
12
|
-
const pathCache = cache[cacheKey] || (cache[cacheKey] = {});
|
|
13
|
-
if (pathCache[path])
|
|
14
|
-
return pathCache[path];
|
|
15
|
-
const keys = [];
|
|
16
|
-
const regexp = (0, path_to_regexp_1.pathToRegexp)(path, keys, options);
|
|
17
|
-
const result = {
|
|
18
|
-
regexp,
|
|
19
|
-
keys
|
|
20
|
-
};
|
|
21
|
-
if (cacheCount < cacheLimit) {
|
|
22
|
-
pathCache[path] = result;
|
|
23
|
-
cacheCount++;
|
|
24
|
-
}
|
|
25
|
-
return result;
|
|
26
|
-
}
|
|
27
|
-
function matchPattern(pathname, pattern, options) {
|
|
28
|
-
options = { ...options };
|
|
29
|
-
options.end ??= true;
|
|
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)
|
|
38
|
-
return;
|
|
39
|
-
const [matched, ...values] = match;
|
|
40
|
-
return {
|
|
41
|
-
matched, // the matched portion of the URL
|
|
42
|
-
params: keys.reduce((acc, key, index) => {
|
|
43
|
-
acc[key.name] = values[index];
|
|
44
|
-
return acc;
|
|
45
|
-
}, {})
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
exports.matchPattern = matchPattern;
|
|
49
|
-
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
|
|
50
|
-
const allMethods = [
|
|
51
|
-
'get', 'head', 'post', 'put', 'delete', 'connect', 'options', 'trace', 'patch'
|
|
52
|
-
];
|
|
53
|
-
exports.router = {
|
|
54
|
-
method(method, router, { prefix = '', ...options } = {}) {
|
|
55
|
-
return next => {
|
|
56
|
-
const req = (0, dx_js_1.getReq)();
|
|
57
|
-
if (req.method !== method.toUpperCase())
|
|
58
|
-
return next();
|
|
59
|
-
for (const [pattern, handler] of Object.entries(router)) {
|
|
60
|
-
const match = matchPattern((0, bodyHelpers_js_1.urlFromReq)(req).pathname, `${prefix}${pattern}`, options);
|
|
61
|
-
if (match)
|
|
62
|
-
return handler({
|
|
63
|
-
...match,
|
|
64
|
-
next,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
return next();
|
|
68
|
-
};
|
|
69
|
-
},
|
|
70
|
-
all(router, { prefix = '', ...options } = {}) {
|
|
71
|
-
return next => {
|
|
72
|
-
const req = (0, dx_js_1.getReq)();
|
|
73
|
-
for (const [pattern, handler] of Object.entries(router)) {
|
|
74
|
-
const match = matchPattern((0, bodyHelpers_js_1.urlFromReq)(req).pathname, `${prefix}${pattern}`, options);
|
|
75
|
-
if (match)
|
|
76
|
-
return handler({
|
|
77
|
-
...match,
|
|
78
|
-
next,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
return next();
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
for (const method of allMethods)
|
|
86
|
-
exports.router[method] = exports.router.method.bind(exports.router, method);
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQTJDO0FBQzNDLG1DQUF5QztBQUN6QyxxREFBMkM7QUFFM0MsTUFBTSxLQUFLLEdBQXdCLEVBQUUsQ0FBQTtBQUNyQyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUE7QUFDeEIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFBO0FBY2xCLFNBQVMsV0FBVyxDQUFDLElBQVksRUFBRSxPQUE0QjtJQUM5RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUMzRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUUzQyxNQUFNLElBQUksR0FBVSxFQUFFLENBQUE7SUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBQSw2QkFBWSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDaEQsTUFBTSxNQUFNLEdBQUc7UUFDZCxNQUFNO1FBQ04sSUFBSTtLQUNKLENBQUE7SUFFRCxJQUFJLFVBQVUsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM3QixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFBO1FBQ3hCLFVBQVUsRUFBRSxDQUFBO0lBQ2IsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFBO0FBQ2QsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FDM0IsUUFBZ0IsRUFDaEIsT0FBZSxFQUNmLE9BQTZCO0lBRTdCLE9BQU8sR0FBRyxFQUFDLEdBQUcsT0FBTyxFQUFDLENBQUE7SUFDdEIsT0FBTyxDQUFDLEdBQUcsS0FBSyxJQUFJLENB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
|
package/esm/route.js
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { pathToRegexp } from 'path-to-regexp';
|
|
2
|
-
import { getReq } from './dx.js';
|
|
3
|
-
import { urlFromReq } from './bodyHelpers.js';
|
|
4
|
-
const cache = {};
|
|
5
|
-
const cacheLimit = 10000;
|
|
6
|
-
let cacheCount = 0;
|
|
7
|
-
function compilePath(path, options) {
|
|
8
|
-
const cacheKey = JSON.stringify(options);
|
|
9
|
-
const pathCache = cache[cacheKey] || (cache[cacheKey] = {});
|
|
10
|
-
if (pathCache[path])
|
|
11
|
-
return pathCache[path];
|
|
12
|
-
const keys = [];
|
|
13
|
-
const regexp = pathToRegexp(path, keys, options);
|
|
14
|
-
const result = {
|
|
15
|
-
regexp,
|
|
16
|
-
keys
|
|
17
|
-
};
|
|
18
|
-
if (cacheCount < cacheLimit) {
|
|
19
|
-
pathCache[path] = 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)
|
|
35
|
-
return;
|
|
36
|
-
const [matched, ...values] = match;
|
|
37
|
-
return {
|
|
38
|
-
matched, // the matched portion of the URL
|
|
39
|
-
params: keys.reduce((acc, key, index) => {
|
|
40
|
-
acc[key.name] = values[index];
|
|
41
|
-
return acc;
|
|
42
|
-
}, {})
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
|
|
46
|
-
const allMethods = [
|
|
47
|
-
'get', 'head', 'post', 'put', 'delete', 'connect', 'options', 'trace', 'patch'
|
|
48
|
-
];
|
|
49
|
-
export const router = {
|
|
50
|
-
method(method, router, { prefix = '', ...options } = {}) {
|
|
51
|
-
return next => {
|
|
52
|
-
const req = getReq();
|
|
53
|
-
if (req.method !== method.toUpperCase())
|
|
54
|
-
return next();
|
|
55
|
-
for (const [pattern, handler] of Object.entries(router)) {
|
|
56
|
-
const match = matchPattern(urlFromReq(req).pathname, `${prefix}${pattern}`, options);
|
|
57
|
-
if (match)
|
|
58
|
-
return handler({
|
|
59
|
-
...match,
|
|
60
|
-
next,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
return next();
|
|
64
|
-
};
|
|
65
|
-
},
|
|
66
|
-
all(router, { prefix = '', ...options } = {}) {
|
|
67
|
-
return next => {
|
|
68
|
-
const req = getReq();
|
|
69
|
-
for (const [pattern, handler] of Object.entries(router)) {
|
|
70
|
-
const match = matchPattern(urlFromReq(req).pathname, `${prefix}${pattern}`, options);
|
|
71
|
-
if (match)
|
|
72
|
-
return handler({
|
|
73
|
-
...match,
|
|
74
|
-
next,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
return next();
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
for (const method of allMethods)
|
|
82
|
-
router[method] = router.method.bind(router, method);
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQzNDLE9BQU8sRUFBWSxNQUFNLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDekMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRTNDLE1BQU0sS0FBSyxHQUF3QixFQUFFLENBQUE7QUFDckMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFBO0FBQ3hCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQTtBQWNsQixTQUFTLFdBQVcsQ0FBQyxJQUFZLEVBQUUsT0FBNEI7SUFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDM0QsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFM0MsTUFBTSxJQUFJLEdBQVUsRUFBRSxDQUFBO0lBQ3RCLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2hELE1BQU0sTUFBTSxHQUFHO1FBQ2QsTUFBTTtRQUNOLElBQUk7S0FDSixDQUFBO0lBRUQsSUFBSSxVQUFVLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDN0IsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQTtRQUN4QixVQUFVLEVBQUUsQ0FBQTtJQUNiLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQTtBQUNkLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUMzQixRQUFnQixFQUNoQixPQUFlLEVB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
|