dx-server 0.0.8 → 0.1.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 CHANGED
@@ -18,7 +18,7 @@ import chain from 'jchain'
18
18
  import {
19
19
  makeContext, requestContext, responseContext,
20
20
 
21
- expressContext,
21
+ dxContext,
22
22
  setHtml,
23
23
  setJson,
24
24
  setText,
@@ -34,9 +34,9 @@ import {
34
34
  textBodyContext,
35
35
  urlencodedBodyContext,
36
36
 
37
- router,
38
- expressApp, expressRouter, chainExpressMiddlewares,
37
+ router
39
38
  } from 'dx-server'
39
+ import {expressApp, expressRouter, chainExpressMiddlewares} from 'dx-server/express'
40
40
  import express from 'express'
41
41
  import morgan from 'morgan'
42
42
 
@@ -66,7 +66,7 @@ const requireAuth = () => {
66
66
  }
67
67
 
68
68
  const serverChain = chain(
69
- expressContext.chain({jsonBeautify: true}), // allows to use setHtml, setJson, setRaw, setBuffer, setFile, setRedirect, etc.
69
+ dxContext.chain({jsonBeautify: true}), // allows to use setHtml, setJson, setRaw, setBuffer, setFile, setRedirect, etc.
70
70
  bufferBodyContext.chain(), // use raw buffer body as Buffer use bufferBodyContext.value. This is required for jsonBodyContext, urlencodedBodyContext, textBodyContext, rawBodyContext
71
71
  jsonBodyContext.chain(), // to get body parsed as json use jsonBodyContext.value. Only available if content-type is application/json
72
72
  urlencodedBodyContext.chain(), // to get body parsed as urlencoded use urlencodedBodyContext.value. Only available if content-type is application/x-www-form-urlencoded
package/cjs/dx.d.ts ADDED
@@ -0,0 +1,81 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ import { Readable } from 'node:stream';
4
+ export declare const dxContext: {
5
+ readonly value: {
6
+ charset?: BufferEncoding | undefined;
7
+ jsonBeautify?: boolean | undefined;
8
+ disableEtag?: boolean | undefined;
9
+ } & ({
10
+ type: 'text';
11
+ data: string;
12
+ } | {
13
+ type: 'html';
14
+ data: string;
15
+ } | {
16
+ type: 'buffer';
17
+ data: Buffer;
18
+ } | {
19
+ type: 'json';
20
+ data: any;
21
+ } | {
22
+ type: 'redirect';
23
+ data: string;
24
+ } | {
25
+ type: 'nodeStream';
26
+ data: Readable;
27
+ } | {
28
+ type: 'webStream';
29
+ data: ReadableStream;
30
+ });
31
+ chain(params_0?: {
32
+ jsonBeautify?: boolean | undefined;
33
+ disableEtag?: boolean | undefined;
34
+ } | undefined): <V>(next: () => V) => Promise<any>;
35
+ with(value: {
36
+ charset?: BufferEncoding | undefined;
37
+ jsonBeautify?: boolean | undefined;
38
+ disableEtag?: boolean | undefined;
39
+ } & ({
40
+ type: 'text';
41
+ data: string;
42
+ } | {
43
+ type: 'html';
44
+ data: string;
45
+ } | {
46
+ type: 'buffer';
47
+ data: Buffer;
48
+ } | {
49
+ type: 'json';
50
+ data: any;
51
+ } | {
52
+ type: 'redirect';
53
+ data: string;
54
+ } | {
55
+ type: 'nodeStream';
56
+ data: Readable;
57
+ } | {
58
+ type: 'webStream';
59
+ data: ReadableStream;
60
+ })): <V_1>(next: () => V_1) => Promise<any>;
61
+ };
62
+ export declare function setText(text: string, { status }?: {
63
+ status?: number;
64
+ }): void;
65
+ export declare function setHtml(html: string, opts?: {
66
+ status?: number;
67
+ }): void;
68
+ export declare function setBuffer(buffer: Buffer, { status }?: {
69
+ status?: number;
70
+ }): void;
71
+ export declare function setNodeStream(stream: Readable, { status }?: {
72
+ status?: number;
73
+ }): void;
74
+ export declare function setWebStream(stream: ReadableStream, { status }?: {
75
+ status?: number;
76
+ }): void;
77
+ export declare function setJson(json: any, { status, beautify }?: {
78
+ status?: number;
79
+ beautify?: boolean;
80
+ }): void;
81
+ export declare function setRedirect(url: string, status: 301 | 302): void;
package/cjs/dx.js ADDED
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setRedirect = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setBuffer = exports.setHtml = exports.setText = exports.dxContext = void 0;
7
+ const jdefer_1 = __importDefault(require("jdefer"));
8
+ const node_util_1 = require("node:util");
9
+ const etag_js_1 = require("./etag.js");
10
+ const context_js_1 = require("./context.js");
11
+ const node_stream_1 = require("node:stream");
12
+ exports.dxContext = (0, context_js_1.makeContext)(async ({ jsonBeautify, disableEtag } = {}) => {
13
+ return {
14
+ jsonBeautify,
15
+ disableEtag,
16
+ };
17
+ }, async (ret, { type, data, charset, jsonBeautify, disableEtag }) => {
18
+ const res = context_js_1.responseContext.value;
19
+ const setContentType = (contentType) => {
20
+ if (res.headersSent || res.getHeader('content-type'))
21
+ return;
22
+ res.setHeader('content-type', `${contentType}${charset ? `; charset=${charset}` : ''}`);
23
+ };
24
+ let bufferOrStream;
25
+ switch (type) {
26
+ case 'text':
27
+ setContentType('text/plain');
28
+ case 'html':
29
+ setContentType('text/html');
30
+ // shared with text
31
+ bufferOrStream = Buffer.from(data, charset);
32
+ break;
33
+ case 'buffer':
34
+ setContentType('application/octet-stream');
35
+ bufferOrStream = data;
36
+ break;
37
+ case 'nodeStream':
38
+ setContentType('application/octet-stream');
39
+ bufferOrStream = data;
40
+ break;
41
+ case 'webStream':
42
+ setContentType('application/octet-stream');
43
+ bufferOrStream = node_stream_1.Readable.fromWeb(data);
44
+ break;
45
+ case 'json':
46
+ setContentType('application/json');
47
+ bufferOrStream = Buffer.from(jsonBeautify ? JSON.stringify(data, null, 2) : JSON.stringify(data), charset);
48
+ break;
49
+ case 'redirect':
50
+ res.setHeader('location', data);
51
+ bufferOrStream = Buffer.from('', charset);
52
+ break;
53
+ case undefined:
54
+ // skip response. Some middleware may handle it outside the chain. For example, express middleware
55
+ return ret;
56
+ default:
57
+ if (!res.getHeader('content-type'))
58
+ res.setHeader('content-type', 'text/plain');
59
+ throw new Error(`unsupported response type ${type}`);
60
+ }
61
+ const req = context_js_1.requestContext.value;
62
+ if (res.headersSent) {
63
+ if (res.writableFinished) {
64
+ // skipped: response is already finished
65
+ }
66
+ else if (res.writableEnded) {
67
+ const defer = (0, jdefer_1.default)();
68
+ res.addListener('finish', defer.resolve);
69
+ await defer.promise;
70
+ // skipped: response is already ended
71
+ // chunk is not fully flushed yet
72
+ }
73
+ else
74
+ await (0, node_util_1.promisify)(res.end.bind(res))(undefined); // to be consistent, we end the response immediately
75
+ }
76
+ else {
77
+ // https://github.com/expressjs/express/blob/980d881e3b023db079de60477a2588a91f046ca5/lib/response.js#L210
78
+ if (res.statusCode === 204) { // No Content
79
+ res.removeHeader('content-type');
80
+ res.removeHeader('content-length');
81
+ res.removeHeader('transfer-encoding');
82
+ // write nothing
83
+ }
84
+ if (res.statusCode === 205) { // reset content. Tell client to clear the form, etc.
85
+ res.setHeader('content-length', 0);
86
+ res.removeHeader('transfer-encoding');
87
+ }
88
+ else if (req.method === 'HEAD') {
89
+ // write nothing
90
+ }
91
+ else {
92
+ if (Buffer.isBuffer(bufferOrStream)) {
93
+ // support: 304 (etag), zipping, file etag and last modified
94
+ res.setHeader('content-length', bufferOrStream.length);
95
+ if (!disableEtag) {
96
+ const etag = (0, etag_js_1.entityTag)(bufferOrStream);
97
+ const lastModified = res.getHeader('last-modified');
98
+ res.setHeader('ETag', etag);
99
+ if ((0, etag_js_1.isFreshETag)(req, etag)) {
100
+ res.removeHeader('content-type');
101
+ res.removeHeader('content-length');
102
+ res.removeHeader('transfer-encoding');
103
+ res.statusCode = 304;
104
+ // write nothing
105
+ }
106
+ else
107
+ res.write(bufferOrStream);
108
+ }
109
+ else
110
+ res.write(bufferOrStream);
111
+ }
112
+ else {
113
+ bufferOrStream.pipe(res);
114
+ }
115
+ // fixme: not support content-encoding (gzip, deflate, br) for now
116
+ }
117
+ await (0, node_util_1.promisify)(res.end.bind(res))(undefined); // some express middleware, such as express-session, requires explicitly passing chunk
118
+ }
119
+ return ret;
120
+ });
121
+ // todo: support setFile (with stream or with buffer)
122
+ function setText(text, { status } = {}) {
123
+ const response = context_js_1.responseContext.value;
124
+ const express = exports.dxContext.value;
125
+ if (status)
126
+ response.statusCode = status;
127
+ express.data = text;
128
+ express.type = 'text';
129
+ }
130
+ exports.setText = setText;
131
+ function setHtml(html, opts = {}) {
132
+ setText(html, opts);
133
+ const express = exports.dxContext.value;
134
+ express.type = 'html';
135
+ }
136
+ exports.setHtml = setHtml;
137
+ function setBuffer(buffer, { status } = {}) {
138
+ const response = context_js_1.responseContext.value;
139
+ const express = exports.dxContext.value;
140
+ if (status)
141
+ response.statusCode = status;
142
+ express.data = buffer;
143
+ express.type = 'buffer';
144
+ }
145
+ exports.setBuffer = setBuffer;
146
+ function setNodeStream(stream, { status } = {}) {
147
+ const response = context_js_1.responseContext.value;
148
+ const express = exports.dxContext.value;
149
+ if (status)
150
+ response.statusCode = status;
151
+ express.data = stream;
152
+ express.type = 'nodeStream';
153
+ }
154
+ exports.setNodeStream = setNodeStream;
155
+ function setWebStream(stream, { status } = {}) {
156
+ const response = context_js_1.responseContext.value;
157
+ const express = exports.dxContext.value;
158
+ if (status)
159
+ response.statusCode = status;
160
+ express.data = stream;
161
+ express.type = 'webStream';
162
+ }
163
+ exports.setWebStream = setWebStream;
164
+ function setJson(json, { status, beautify } = {}) {
165
+ const response = context_js_1.responseContext.value;
166
+ if (status)
167
+ response.statusCode = status;
168
+ const express = exports.dxContext.value;
169
+ express.data = json;
170
+ express.type = 'json';
171
+ if (beautify !== undefined)
172
+ express.jsonBeautify = beautify;
173
+ }
174
+ exports.setJson = setJson;
175
+ function setRedirect(url, status) {
176
+ const response = context_js_1.responseContext.value;
177
+ const express = exports.dxContext.value;
178
+ response.statusCode = status;
179
+ express.data = url;
180
+ express.type = 'redirect';
181
+ }
182
+ exports.setRedirect = setRedirect;
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQThCO0FBQzlCLHlDQUFtQztBQUNuQyx1Q0FBZ0Q7QUFDaEQsNkNBQXlFO0FBQ3pFLDZDQUFvQztBQUV2QixRQUFBLFNBQVMsR0FBRyxJQUFBLHdCQUFXLEVBQUMsS0FBSyxFQUN6QyxFQUFDLFlBQVksRUFBRSxXQUFXLEtBR3RCLEVBQUUsRUFDTCxFQUFFO0lBQ0gsT0FBTztRQUNOLFlBQVk7UUFDWixXQUFXO0tBbUNWLENBQUE7QUFDSCxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUMsRUFBRSxFQUFFO0lBQ2xFLE1BQU0sR0FBRyxHQUFHLDRCQUFlLENBQUMsS0FBSyxDQUFBO0lBQ2pDLE1BQU0sY0FBYyxHQUFHLENBQUMsV0FBbUIsRUFBRSxFQUFFO1FBQzlDLElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUFFLE9BQU07UUFDNUQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsR0FBRyxXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3hGLENBQUMsQ0FBQTtJQUNELElBQUksY0FBYyxDQUFBO0lBRWxCLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDZCxLQUFLLE1BQU07WUFDVixjQUFjLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDN0IsS0FBSyxNQUFNO1lBQ1YsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQzNCLG1CQUFtQjtZQUNuQixjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFD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
package/cjs/express.d.ts CHANGED
@@ -1,81 +1,4 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- /// <reference types="node" resolution-mode="require"/>
3
- import { Readable } from 'node:stream';
4
- export declare const expressContext: {
5
- readonly value: {
6
- charset?: BufferEncoding | undefined;
7
- jsonBeautify?: boolean | undefined;
8
- disableEtag?: boolean | undefined;
9
- } & ({
10
- type: 'text';
11
- data: string;
12
- } | {
13
- type: 'html';
14
- data: string;
15
- } | {
16
- type: 'buffer';
17
- data: Buffer;
18
- } | {
19
- type: 'json';
20
- data: any;
21
- } | {
22
- type: 'redirect';
23
- data: string;
24
- } | {
25
- type: 'nodeStream';
26
- data: Readable;
27
- } | {
28
- type: 'webStream';
29
- data: ReadableStream;
30
- });
31
- chain(params_0?: {
32
- jsonBeautify?: boolean | undefined;
33
- disableEtag?: boolean | undefined;
34
- } | undefined): <V>(next: () => V) => Promise<any>;
35
- with(value: {
36
- charset?: BufferEncoding | undefined;
37
- jsonBeautify?: boolean | undefined;
38
- disableEtag?: boolean | undefined;
39
- } & ({
40
- type: 'text';
41
- data: string;
42
- } | {
43
- type: 'html';
44
- data: string;
45
- } | {
46
- type: 'buffer';
47
- data: Buffer;
48
- } | {
49
- type: 'json';
50
- data: any;
51
- } | {
52
- type: 'redirect';
53
- data: string;
54
- } | {
55
- type: 'nodeStream';
56
- data: Readable;
57
- } | {
58
- type: 'webStream';
59
- data: ReadableStream;
60
- })): <V_1>(next: () => V_1) => Promise<any>;
61
- };
62
- export declare function setText(text: string, { status }?: {
63
- status?: number;
64
- }): void;
65
- export declare function setHtml(html: string, opts?: {
66
- status?: number;
67
- }): void;
68
- export declare function setBuffer(buffer: Buffer, { status }?: {
69
- status?: number;
70
- }): void;
71
- export declare function setNodeStream(stream: Readable, { status }?: {
72
- status?: number;
73
- }): void;
74
- export declare function setWebStream(stream: ReadableStream, { status }?: {
75
- status?: number;
76
- }): void;
77
- export declare function setJson(json: any, { status, beautify }?: {
78
- status?: number;
79
- beautify?: boolean;
80
- }): void;
81
- export declare function setRedirect(url: string, status: 301 | 302): void;
1
+ import { type Express, type Request, type Response, type Router } from 'express';
2
+ export declare const expressApp: (setup: (app: Express) => any) => Promise<(next: any) => Promise<void>>;
3
+ export declare const expressRouter: (setup: (router: Router) => any) => Promise<(next: any) => Promise<void>>;
4
+ export declare const chainExpressMiddlewares: (...middlewares: ((req: Request, res: Response, next: () => any) => any)[]) => Promise<(next: any) => Promise<void>>;
package/cjs/express.js CHANGED
@@ -3,181 +3,42 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.setRedirect = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setBuffer = exports.setHtml = exports.setText = exports.expressContext = void 0;
7
- const jdefer_1 = __importDefault(require("jdefer"));
8
- const node_util_1 = require("node:util");
9
- const etag_js_1 = require("./etag.js");
6
+ exports.chainExpressMiddlewares = exports.expressRouter = exports.expressApp = void 0;
7
+ const express_1 = __importDefault(require("express"));
10
8
  const context_js_1 = require("./context.js");
11
- const node_stream_1 = require("node:stream");
12
- exports.expressContext = (0, context_js_1.makeContext)(async ({ jsonBeautify, disableEtag } = {}) => {
13
- return {
14
- jsonBeautify,
15
- disableEtag,
9
+ const jdefer_1 = __importDefault(require("jdefer"));
10
+ const expressApp = async (setup) => {
11
+ const symbol = Symbol('expressApp');
12
+ const app = (0, express_1.default)();
13
+ await setup(app);
14
+ app.use((req, _res, _next) => req[symbol].resolve());
15
+ app.use((err, req, _res, _next) => req[symbol].reject(err));
16
+ return async (next) => {
17
+ const req = context_js_1.requestContext.value;
18
+ const defer = (0, jdefer_1.default)();
19
+ req[symbol] = defer;
20
+ app(req, context_js_1.responseContext.value);
21
+ await defer.promise;
22
+ await next();
16
23
  };
17
- }, async (ret, { type, data, charset, jsonBeautify, disableEtag }) => {
18
- const res = context_js_1.responseContext.value;
19
- const setContentType = (contentType) => {
20
- if (res.headersSent || res.getHeader('content-type'))
21
- return;
22
- res.setHeader('content-type', `${contentType}${charset ? `; charset=${charset}` : ''}`);
24
+ };
25
+ exports.expressApp = expressApp;
26
+ const expressRouter = async (setup) => {
27
+ const symbol = Symbol('expressRouter');
28
+ const router = express_1.default.Router();
29
+ await setup(router);
30
+ router.use((req, _res, _next) => req[symbol].resolve());
31
+ router.use((err, req, _res, _next) => req[symbol].reject(err));
32
+ return async (next) => {
33
+ const req = context_js_1.requestContext.value;
34
+ const defer = (0, jdefer_1.default)();
35
+ req[symbol] = defer;
36
+ router(req, context_js_1.responseContext.value);
37
+ await defer.promise;
38
+ await next();
23
39
  };
24
- let bufferOrStream;
25
- switch (type) {
26
- case 'text':
27
- setContentType('text/plain');
28
- case 'html':
29
- setContentType('text/html');
30
- // shared with text
31
- bufferOrStream = Buffer.from(data, charset);
32
- break;
33
- case 'buffer':
34
- setContentType('application/octet-stream');
35
- bufferOrStream = data;
36
- break;
37
- case 'nodeStream':
38
- setContentType('application/octet-stream');
39
- bufferOrStream = data;
40
- break;
41
- case 'webStream':
42
- setContentType('application/octet-stream');
43
- bufferOrStream = node_stream_1.Readable.fromWeb(data);
44
- break;
45
- case 'json':
46
- setContentType('application/json');
47
- bufferOrStream = Buffer.from(jsonBeautify ? JSON.stringify(data, null, 2) : JSON.stringify(data), charset);
48
- break;
49
- case 'redirect':
50
- res.setHeader('location', data);
51
- bufferOrStream = Buffer.from('', charset);
52
- break;
53
- case undefined:
54
- // skip response. Some middleware may handle it outside the chain. For example, express middleware
55
- return ret;
56
- default:
57
- if (!res.getHeader('content-type'))
58
- res.setHeader('content-type', 'text/plain');
59
- throw new Error(`unsupported response type ${type}`);
60
- }
61
- const req = context_js_1.requestContext.value;
62
- if (res.headersSent) {
63
- if (res.writableFinished) {
64
- // skipped: response is already finished
65
- }
66
- else if (res.writableEnded) {
67
- const defer = (0, jdefer_1.default)();
68
- res.addListener('finish', defer.resolve);
69
- await defer.promise;
70
- // skipped: response is already ended
71
- // chunk is not fully flushed yet
72
- }
73
- else
74
- await (0, node_util_1.promisify)(res.end.bind(res))(undefined); // to be consistent, we end the response immediately
75
- }
76
- else {
77
- // https://github.com/expressjs/express/blob/980d881e3b023db079de60477a2588a91f046ca5/lib/response.js#L210
78
- if (res.statusCode === 204) { // No Content
79
- res.removeHeader('content-type');
80
- res.removeHeader('content-length');
81
- res.removeHeader('transfer-encoding');
82
- // write nothing
83
- }
84
- if (res.statusCode === 205) { // reset content. Tell client to clear the form, etc.
85
- res.setHeader('content-length', 0);
86
- res.removeHeader('transfer-encoding');
87
- }
88
- else if (req.method === 'HEAD') {
89
- // write nothing
90
- }
91
- else {
92
- if (Buffer.isBuffer(bufferOrStream)) {
93
- // support: 304 (etag), zipping, file etag and last modified
94
- res.setHeader('content-length', bufferOrStream.length);
95
- if (!disableEtag) {
96
- const etag = (0, etag_js_1.entityTag)(bufferOrStream);
97
- const lastModified = res.getHeader('last-modified');
98
- res.setHeader('ETag', etag);
99
- if ((0, etag_js_1.isFreshETag)(req, etag)) {
100
- res.removeHeader('content-type');
101
- res.removeHeader('content-length');
102
- res.removeHeader('transfer-encoding');
103
- res.statusCode = 304;
104
- // write nothing
105
- }
106
- else
107
- res.write(bufferOrStream);
108
- }
109
- else
110
- res.write(bufferOrStream);
111
- }
112
- else {
113
- bufferOrStream.pipe(res);
114
- }
115
- // fixme: not support content-encoding (gzip, deflate, br) for now
116
- }
117
- await (0, node_util_1.promisify)(res.end.bind(res))(undefined); // some express middleware, such as express-session, requires explicitly passing chunk
118
- }
119
- return ret;
120
- });
121
- // todo: support setFile (with stream or with buffer)
122
- function setText(text, { status } = {}) {
123
- const response = context_js_1.responseContext.value;
124
- const express = exports.expressContext.value;
125
- if (status)
126
- response.statusCode = status;
127
- express.data = text;
128
- express.type = 'text';
129
- }
130
- exports.setText = setText;
131
- function setHtml(html, opts = {}) {
132
- setText(html, opts);
133
- const express = exports.expressContext.value;
134
- express.type = 'html';
135
- }
136
- exports.setHtml = setHtml;
137
- function setBuffer(buffer, { status } = {}) {
138
- const response = context_js_1.responseContext.value;
139
- const express = exports.expressContext.value;
140
- if (status)
141
- response.statusCode = status;
142
- express.data = buffer;
143
- express.type = 'buffer';
144
- }
145
- exports.setBuffer = setBuffer;
146
- function setNodeStream(stream, { status } = {}) {
147
- const response = context_js_1.responseContext.value;
148
- const express = exports.expressContext.value;
149
- if (status)
150
- response.statusCode = status;
151
- express.data = stream;
152
- express.type = 'nodeStream';
153
- }
154
- exports.setNodeStream = setNodeStream;
155
- function setWebStream(stream, { status } = {}) {
156
- const response = context_js_1.responseContext.value;
157
- const express = exports.expressContext.value;
158
- if (status)
159
- response.statusCode = status;
160
- express.data = stream;
161
- express.type = 'webStream';
162
- }
163
- exports.setWebStream = setWebStream;
164
- function setJson(json, { status, beautify } = {}) {
165
- const response = context_js_1.responseContext.value;
166
- if (status)
167
- response.statusCode = status;
168
- const express = exports.expressContext.value;
169
- express.data = json;
170
- express.type = 'json';
171
- if (beautify !== undefined)
172
- express.jsonBeautify = beautify;
173
- }
174
- exports.setJson = setJson;
175
- function setRedirect(url, status) {
176
- const response = context_js_1.responseContext.value;
177
- const express = exports.expressContext.value;
178
- response.statusCode = status;
179
- express.data = url;
180
- express.type = 'redirect';
181
- }
182
- exports.setRedirect = setRedirect;
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHByZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE4QjtBQUM5Qix5Q0FBbUM7QUFDbkMsdUNBQWdEO0FBQ2hELDZDQUF5RTtBQUN6RSw2Q0FBb0M7QUFFdkIsUUFBQSxjQUFjLEdBQUcsSUFBQSx3QkFBVyxFQUFDLEtBQUssRUFDOUMsRUFBQyxZQUFZLEVBQUUsV0FBVyxLQUd0QixFQUFFLEVBQ0wsRUFBRTtJQUNILE9BQU87UUFDTixZQUFZO1FBQ1osV0FBVztLQW1DVixDQUFBO0FBQ0gsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFDLEVBQUUsRUFBRTtJQUNsRSxNQUFNLEdBQUcsR0FBRyw0QkFBZSxDQUFDLEtBQUssQ0FBQTtJQUNqQyxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRTtRQUM5QyxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFBRSxPQUFNO1FBQzVELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN4RixDQUFDLENBQUE7SUFDRCxJQUFJLGNBQWMsQ0FBQTtJQUVsQixRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2QsS0FBSyxNQUFNO1lBQ1YsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzdCLEtBQUssTUFBTTtZQUNWLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUMzQixtQkFBbUI7WUFDbkIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FB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
40
+ };
41
+ exports.expressRouter = expressRouter;
42
+ const chainExpressMiddlewares = (...middlewares) => (0, exports.expressRouter)(router => router.use(...middlewares));
43
+ exports.chainExpressMiddlewares = chainExpressMiddlewares;
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHByZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHNEQUF1RjtBQUN2Riw2Q0FBNEQ7QUFDNUQsb0RBQThCO0FBRXZCLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxLQUE0QixFQUFFLEVBQUU7SUFDaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRW5DLE1BQU0sR0FBRyxHQUFHLElBQUEsaUJBQU8sR0FBRSxDQUFBO0lBQ3JCLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDcEQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzNELE9BQU8sS0FBSyxFQUFDLElBQUksRUFBQyxFQUFFO1FBQ25CLE1BQU0sR0FBRyxHQUFHLDJCQUFjLENBQUMsS0FBSyxDQUFBO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUEsZ0JBQVMsR0FBRSxDQUFBO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUE7UUFDbkIsR0FBRyxDQUFDLEdBQUcsRUFBRSw0QkFBZSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQy9CLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQTtRQUNuQixNQUFNLElBQUksRUFBRSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0FBQ0YsQ0FBQyxDQUFBO0FBZlksUUFBQSxVQUFVLGNBZXRCO0FBRU0sTUFBTSxhQUFhLEdBQUcsS0FBSyxFQUFFLEtBQThCLEVBQUUsRUFBRTtJQUNyRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUE7SUFFdEMsTUFBTSxNQUFNLEdBQUcsaUJBQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUMvQixNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNuQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUM5RCxPQUFPLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtRQUNuQixNQUFNLEdBQUcsR0FBRywyQkFBYyxDQUFDLEtBQUssQ0FBQTtRQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFBLGdCQUFTLEdBQUUsQ0FBQTtRQUN6QixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFBO1FBQ25CLE1BQU0sQ0FBQyxHQUFHLEVBQUUsNEJBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNsQyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUE7UUFDbkIsTUFBTSxJQUFJLEVBQUUsQ0FBQTtJQUNiLENBQUMsQ0FBQTtBQUNGLENBQUMsQ0FBQTtBQWZZLFFBQUEsYUFBYSxpQkFlekI7QUFFTSxNQUFNLHVCQUF1QixHQUFHLENBQ3RDLEdBQUcsV0FBeUUsRUFDM0UsRUFBRSxDQUFDLElBQUEscUJBQWEsRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFBO0FBRjNDLFFBQUEsdUJBQXVCLDJCQUVvQiJ9
package/cjs/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  export { makeContext, requestContext, responseContext } from './context.js';
2
- export { expressContext, setHtml, setJson, setBuffer, setRedirect, setText } from './express.js';
2
+ export { dxContext, setHtml, setJson, setBuffer, setRedirect, setText } from './dx.js';
3
3
  export { bufferBodyContext, jsonBodyContext, queryContext, rawBodyContext, textBodyContext, urlencodedBodyContext } from './body.js';
4
4
  export { router } from './route.js';
5
- export { expressApp, expressRouter, chainExpressMiddlewares } from './expressApp.js';