@ailura/nestjs-hono-adapter 1.0.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/LICENSE +21 -0
- package/README.md +411 -0
- package/dist/body.d.ts +35 -0
- package/dist/body.d.ts.map +1 -0
- package/dist/body.js +180 -0
- package/dist/body.js.map +1 -0
- package/dist/bridge.d.ts +64 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +168 -0
- package/dist/bridge.js.map +1 -0
- package/dist/closing.d.ts +13 -0
- package/dist/closing.d.ts.map +1 -0
- package/dist/closing.js +30 -0
- package/dist/closing.js.map +1 -0
- package/dist/context.d.ts +22 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/cors-middleware.d.ts +64 -0
- package/dist/cors-middleware.d.ts.map +1 -0
- package/dist/cors-middleware.js +211 -0
- package/dist/cors-middleware.js.map +1 -0
- package/dist/handler-bridge.d.ts +51 -0
- package/dist/handler-bridge.d.ts.map +1 -0
- package/dist/handler-bridge.js +122 -0
- package/dist/handler-bridge.js.map +1 -0
- package/dist/hono-lifecycle.d.ts +90 -0
- package/dist/hono-lifecycle.d.ts.map +1 -0
- package/dist/hono-lifecycle.js +169 -0
- package/dist/hono-lifecycle.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/path.d.ts +3 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +144 -0
- package/dist/path.js.map +1 -0
- package/dist/query.d.ts +19 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +238 -0
- package/dist/query.js.map +1 -0
- package/dist/response-helpers.d.ts +16 -0
- package/dist/response-helpers.d.ts.map +1 -0
- package/dist/response-helpers.js +45 -0
- package/dist/response-helpers.js.map +1 -0
- package/dist/response-writer.d.ts +28 -0
- package/dist/response-writer.d.ts.map +1 -0
- package/dist/response-writer.js +52 -0
- package/dist/response-writer.js.map +1 -0
- package/dist/route-adapter.d.ts +53 -0
- package/dist/route-adapter.d.ts.map +1 -0
- package/dist/route-adapter.js +141 -0
- package/dist/route-adapter.js.map +1 -0
- package/dist/server-adapter.d.ts +106 -0
- package/dist/server-adapter.d.ts.map +1 -0
- package/dist/server-adapter.js +153 -0
- package/dist/server-adapter.js.map +1 -0
- package/dist/sse.d.ts +67 -0
- package/dist/sse.d.ts.map +1 -0
- package/dist/sse.js +211 -0
- package/dist/sse.js.map +1 -0
- package/dist/static-assets.d.ts +39 -0
- package/dist/static-assets.d.ts.map +1 -0
- package/dist/static-assets.js +155 -0
- package/dist/static-assets.js.map +1 -0
- package/dist/version-filter.d.ts +24 -0
- package/dist/version-filter.d.ts.map +1 -0
- package/dist/version-filter.js +107 -0
- package/dist/version-filter.js.map +1 -0
- package/dist/versioned-route.d.ts +21 -0
- package/dist/versioned-route.d.ts.map +1 -0
- package/dist/versioned-route.js +15 -0
- package/dist/versioned-route.js.map +1 -0
- package/dist/views.d.ts +42 -0
- package/dist/views.d.ts.map +1 -0
- package/dist/views.js +110 -0
- package/dist/views.js.map +1 -0
- package/dist/ws-adapter.d.ts +81 -0
- package/dist/ws-adapter.d.ts.map +1 -0
- package/dist/ws-adapter.js +214 -0
- package/dist/ws-adapter.js.map +1 -0
- package/dist/ws-client.d.ts +68 -0
- package/dist/ws-client.d.ts.map +1 -0
- package/dist/ws-client.js +135 -0
- package/dist/ws-client.js.map +1 -0
- package/dist/ws-server.d.ts +23 -0
- package/dist/ws-server.d.ts.map +1 -0
- package/dist/ws-server.js +37 -0
- package/dist/ws-server.js.map +1 -0
- package/dist/ws.d.ts +14 -0
- package/dist/ws.d.ts.map +1 -0
- package/dist/ws.js +12 -0
- package/dist/ws.js.map +1 -0
- package/package.json +99 -0
- package/src/body.ts +251 -0
- package/src/bridge.ts +308 -0
- package/src/closing.ts +38 -0
- package/src/context.ts +25 -0
- package/src/cors-middleware.ts +347 -0
- package/src/handler-bridge.ts +226 -0
- package/src/hono-lifecycle.ts +259 -0
- package/src/index.ts +27 -0
- package/src/path.ts +169 -0
- package/src/query.ts +304 -0
- package/src/response-helpers.ts +60 -0
- package/src/response-writer.ts +100 -0
- package/src/route-adapter.ts +261 -0
- package/src/server-adapter.ts +294 -0
- package/src/sse.ts +274 -0
- package/src/static-assets.ts +247 -0
- package/src/version-filter.ts +170 -0
- package/src/versioned-route.ts +30 -0
- package/src/views.ts +188 -0
- package/src/ws-adapter.ts +329 -0
- package/src/ws-client.ts +190 -0
- package/src/ws-server.ts +40 -0
- package/src/ws.ts +13 -0
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A query string parsed into the shape a controller receives:
|
|
3
|
+
* every leaf is a string, and a name that appears more than
|
|
4
|
+
* once or uses brackets becomes a list or a nested object.
|
|
5
|
+
*/
|
|
6
|
+
type ParsedQuery = Record<string, unknown>;
|
|
7
|
+
/**
|
|
8
|
+
* Parses a query string, with or without its leading `?`.
|
|
9
|
+
*
|
|
10
|
+
* Repeated names become lists, `name[]` appends, `name[0]`
|
|
11
|
+
* indexes and `name[child]` nests; anything else is a string.
|
|
12
|
+
* The grammar is the one the platform parsers accept, which is
|
|
13
|
+
* what a controller written against Express or Fastify expects
|
|
14
|
+
* to read.
|
|
15
|
+
*/
|
|
16
|
+
declare function parseQuery(source: string): ParsedQuery;
|
|
17
|
+
export { parseQuery };
|
|
18
|
+
export type { ParsedQuery };
|
|
19
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA4R3C;;;;;;;;GAQG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAE/C;AAED,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/query.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Names that reach the prototype chain. A parser that writes
|
|
3
|
+
* them hands a caller control over every object in the process,
|
|
4
|
+
* so they are dropped instead.
|
|
5
|
+
*/
|
|
6
|
+
const FORBIDDEN_NAMES = new Set([
|
|
7
|
+
'__proto__',
|
|
8
|
+
'constructor',
|
|
9
|
+
'prototype',
|
|
10
|
+
]);
|
|
11
|
+
const INDEX = /^\d+$/u;
|
|
12
|
+
const BRACKETS = /\[(?<name>[^\]]*)\]/gu;
|
|
13
|
+
const MISSING = -1;
|
|
14
|
+
function isRecord(value) {
|
|
15
|
+
return (typeof value === 'object' &&
|
|
16
|
+
value !== null &&
|
|
17
|
+
!Array.isArray(value));
|
|
18
|
+
}
|
|
19
|
+
function asRecord(value) {
|
|
20
|
+
if (isRecord(value)) {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
function asList(value) {
|
|
26
|
+
if (Array.isArray(value)) {
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Says whether the next segment builds a list: `[]` appends,
|
|
33
|
+
* and a number indexes.
|
|
34
|
+
*/
|
|
35
|
+
function isListStep(name) {
|
|
36
|
+
return name === '' || INDEX.test(name);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Decodes one side of a pair. A sequence that is not valid
|
|
40
|
+
* percent-encoding is kept as it arrived, which is what the
|
|
41
|
+
* platform parsers do rather than refusing the request.
|
|
42
|
+
*/
|
|
43
|
+
function decode(value) {
|
|
44
|
+
const spaced = value.replaceAll('+', ' ');
|
|
45
|
+
try {
|
|
46
|
+
return decodeURIComponent(spaced);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return spaced;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Splits `filter[name][]` into `['filter', 'name', '']`. A name
|
|
54
|
+
* without brackets is its own single segment.
|
|
55
|
+
*/
|
|
56
|
+
function toNames(name) {
|
|
57
|
+
const first = name.indexOf('[');
|
|
58
|
+
if (first === MISSING) {
|
|
59
|
+
return [name];
|
|
60
|
+
}
|
|
61
|
+
const names = [name.slice(0, first)];
|
|
62
|
+
for (const match of name.slice(first).matchAll(BRACKETS)) {
|
|
63
|
+
const groups = match.groups ?? {};
|
|
64
|
+
names.push(groups.name ?? '');
|
|
65
|
+
}
|
|
66
|
+
return names;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Adds a value to a name that may already hold one. The second
|
|
70
|
+
* value turns the entry into a list, which is how a repeated
|
|
71
|
+
* name is read.
|
|
72
|
+
*/
|
|
73
|
+
function repeated(current, value) {
|
|
74
|
+
if (current === undefined) {
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
if (Array.isArray(current)) {
|
|
78
|
+
current.push(value);
|
|
79
|
+
return current;
|
|
80
|
+
}
|
|
81
|
+
return [current, value];
|
|
82
|
+
}
|
|
83
|
+
function sidesOf(pair) {
|
|
84
|
+
const separator = pair.indexOf('=');
|
|
85
|
+
if (separator === MISSING) {
|
|
86
|
+
return [pair, ''];
|
|
87
|
+
}
|
|
88
|
+
return [pair.slice(0, separator), pair.slice(separator + 1)];
|
|
89
|
+
}
|
|
90
|
+
function withoutQuestionMark(source) {
|
|
91
|
+
if (source.startsWith('?')) {
|
|
92
|
+
return source.slice(1);
|
|
93
|
+
}
|
|
94
|
+
return source;
|
|
95
|
+
}
|
|
96
|
+
function accepts(names) {
|
|
97
|
+
if (names.length === 0) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
return !names.some((segment) => FORBIDDEN_NAMES.has(segment));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Builds the tree one pair at a time.
|
|
104
|
+
*
|
|
105
|
+
* A step whose next name is `[]` or a number builds a list, and
|
|
106
|
+
* every other step builds an object; the methods below are
|
|
107
|
+
* split along that decision so each one stays readable on its
|
|
108
|
+
* own.
|
|
109
|
+
*/
|
|
110
|
+
class QueryBuilder {
|
|
111
|
+
constructor() {
|
|
112
|
+
this.query = {};
|
|
113
|
+
}
|
|
114
|
+
parse(source) {
|
|
115
|
+
for (const pair of withoutQuestionMark(source).split('&')) {
|
|
116
|
+
this.addPair(pair);
|
|
117
|
+
}
|
|
118
|
+
return this.query;
|
|
119
|
+
}
|
|
120
|
+
addPair(pair) {
|
|
121
|
+
if (pair === '') {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const [name, value] = sidesOf(pair);
|
|
125
|
+
const names = toNames(decode(name));
|
|
126
|
+
if (!accepts(names)) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
this.assign(this.query, { names, value: decode(value) });
|
|
130
|
+
}
|
|
131
|
+
assign(container, target) {
|
|
132
|
+
const [name, ...rest] = target.names;
|
|
133
|
+
if (name === undefined) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (rest.length === 0) {
|
|
137
|
+
container[name] = repeated(container[name], target.value);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
this.assignDeeper(container, name, {
|
|
141
|
+
names: rest,
|
|
142
|
+
value: target.value,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
assignDeeper(container, name, target) {
|
|
146
|
+
const [next] = target.names;
|
|
147
|
+
if (isListStep(next ?? '')) {
|
|
148
|
+
this.assignList(container, name, target);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
this.assignRecord(container, name, target);
|
|
152
|
+
}
|
|
153
|
+
assignList(container, name, target) {
|
|
154
|
+
const list = asList(container[name]);
|
|
155
|
+
container[name] = list;
|
|
156
|
+
this.intoList(list, target);
|
|
157
|
+
}
|
|
158
|
+
assignRecord(container, name, target) {
|
|
159
|
+
const existing = container[name];
|
|
160
|
+
if (Array.isArray(existing)) {
|
|
161
|
+
const nested = {};
|
|
162
|
+
existing.push(nested);
|
|
163
|
+
this.assign(nested, target);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
container[name] = this.toRecord(existing, target);
|
|
167
|
+
}
|
|
168
|
+
intoList(list, target) {
|
|
169
|
+
const [name, ...rest] = target.names;
|
|
170
|
+
if (name === undefined) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const nested = { names: rest, value: target.value };
|
|
174
|
+
if (name === '') {
|
|
175
|
+
this.addElement(list, nested);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
this.addIndex(list, name, nested);
|
|
179
|
+
}
|
|
180
|
+
addIndex(list, name, target) {
|
|
181
|
+
const index = Number(name);
|
|
182
|
+
if (!Number.isSafeInteger(index) || index < 0) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
this.addAt(list, index, target);
|
|
186
|
+
}
|
|
187
|
+
addElement(list, target) {
|
|
188
|
+
const [next] = target.names;
|
|
189
|
+
if (next === undefined) {
|
|
190
|
+
list.push(target.value);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (isListStep(next)) {
|
|
194
|
+
const nested = [];
|
|
195
|
+
list.push(nested);
|
|
196
|
+
this.intoList(nested, target);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
list.push(this.toRecord(undefined, target));
|
|
200
|
+
}
|
|
201
|
+
addAt(list, index, target) {
|
|
202
|
+
const existing = list[index];
|
|
203
|
+
if (target.names.length === 0) {
|
|
204
|
+
list[index] = repeated(existing, target.value);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const [next] = target.names;
|
|
208
|
+
if (isListStep(next ?? '')) {
|
|
209
|
+
list[index] = this.toList(existing, target);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
list[index] = this.toRecord(existing, target);
|
|
213
|
+
}
|
|
214
|
+
toList(existing, target) {
|
|
215
|
+
const nested = asList(existing);
|
|
216
|
+
this.intoList(nested, target);
|
|
217
|
+
return nested;
|
|
218
|
+
}
|
|
219
|
+
toRecord(existing, target) {
|
|
220
|
+
const nested = asRecord(existing);
|
|
221
|
+
this.assign(nested, target);
|
|
222
|
+
return nested;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Parses a query string, with or without its leading `?`.
|
|
227
|
+
*
|
|
228
|
+
* Repeated names become lists, `name[]` appends, `name[0]`
|
|
229
|
+
* indexes and `name[child]` nests; anything else is a string.
|
|
230
|
+
* The grammar is the one the platform parsers accept, which is
|
|
231
|
+
* what a controller written against Express or Fastify expects
|
|
232
|
+
* to read.
|
|
233
|
+
*/
|
|
234
|
+
function parseQuery(source) {
|
|
235
|
+
return new QueryBuilder().parse(source);
|
|
236
|
+
}
|
|
237
|
+
export { parseQuery };
|
|
238
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { NestContext } from './context.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Makes the Hono response helpers finalize the context.
|
|
4
|
+
*
|
|
5
|
+
* A handler that answers through `@Res()` calls one of these
|
|
6
|
+
* helpers instead of returning a value, and Nest then skips its
|
|
7
|
+
* own reply path. Hono only finalizes a context when `res` is
|
|
8
|
+
* assigned, and the helpers do not assign it, so the answer
|
|
9
|
+
* would be dropped and the client would read an empty response.
|
|
10
|
+
* Wrapping them on the instance — Hono's helpers are own
|
|
11
|
+
* properties, not prototype methods — keeps the imperative
|
|
12
|
+
* style working without taking the response away from Hono.
|
|
13
|
+
*/
|
|
14
|
+
declare function finalizeOnResponse(context: NestContext): void;
|
|
15
|
+
export { finalizeOnResponse };
|
|
16
|
+
//# sourceMappingURL=response-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-helpers.d.ts","sourceRoot":"","sources":["../src/response-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAwChD;;;;;;;;;;;GAWG;AACH,iBAAS,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAKtD;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** The Hono helpers that write the answer for a request. */
|
|
2
|
+
const RESPONSE_HELPERS = [
|
|
3
|
+
'body',
|
|
4
|
+
'html',
|
|
5
|
+
'json',
|
|
6
|
+
'newResponse',
|
|
7
|
+
'notFound',
|
|
8
|
+
'redirect',
|
|
9
|
+
'text',
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* Wraps one helper so that the response it built becomes the
|
|
13
|
+
* response of the context.
|
|
14
|
+
*/
|
|
15
|
+
function wrapHelper(carrier, name, context) {
|
|
16
|
+
const helper = carrier[name];
|
|
17
|
+
if (typeof helper !== 'function') {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
carrier[name] = (...args) => {
|
|
21
|
+
const response = helper.apply(context, args);
|
|
22
|
+
context.res = response;
|
|
23
|
+
return response;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Makes the Hono response helpers finalize the context.
|
|
28
|
+
*
|
|
29
|
+
* A handler that answers through `@Res()` calls one of these
|
|
30
|
+
* helpers instead of returning a value, and Nest then skips its
|
|
31
|
+
* own reply path. Hono only finalizes a context when `res` is
|
|
32
|
+
* assigned, and the helpers do not assign it, so the answer
|
|
33
|
+
* would be dropped and the client would read an empty response.
|
|
34
|
+
* Wrapping them on the instance — Hono's helpers are own
|
|
35
|
+
* properties, not prototype methods — keeps the imperative
|
|
36
|
+
* style working without taking the response away from Hono.
|
|
37
|
+
*/
|
|
38
|
+
function finalizeOnResponse(context) {
|
|
39
|
+
const carrier = context;
|
|
40
|
+
for (const name of RESPONSE_HELPERS) {
|
|
41
|
+
wrapHelper(carrier, name, context);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export { finalizeOnResponse };
|
|
45
|
+
//# sourceMappingURL=response-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-helpers.js","sourceRoot":"","sources":["../src/response-helpers.ts"],"names":[],"mappings":"AAEA,4DAA4D;AAC5D,MAAM,gBAAgB,GAAG;IACvB,MAAM;IACN,MAAM;IACN,MAAM;IACN,aAAa;IACb,UAAU;IACV,UAAU;IACV,MAAM;CACE,CAAC;AASX;;;GAGG;AACH,SAAS,UAAU,CACjB,OAA8B,EAC9B,IAAuC,EACvC,OAAoB;IAEpB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAa,EAAY,EAAE;QAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,GAAG,QAAQ,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,kBAAkB,CAAC,OAAoB;IAC9C,MAAM,OAAO,GAAG,OAA2C,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { NestContext } from './context.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Writes what Nest answers onto the context of the request.
|
|
4
|
+
*
|
|
5
|
+
* A Hono context doubles as the response object, so a value is
|
|
6
|
+
* turned into a Web response and stored on it. A status set
|
|
7
|
+
* through `@HttpCode()` or `@Res()` is remembered per request,
|
|
8
|
+
* because the adapter is asked for it after the handler ran.
|
|
9
|
+
*/
|
|
10
|
+
declare class ResponseWriter {
|
|
11
|
+
private readonly pendingStatus;
|
|
12
|
+
status(response: NestContext, statusCode: number): void;
|
|
13
|
+
/**
|
|
14
|
+
* The status Nest asked for, before any body was written. An
|
|
15
|
+
* event stream needs it while the handler still runs.
|
|
16
|
+
*/
|
|
17
|
+
statusOf(response: NestContext): number | undefined;
|
|
18
|
+
reply(response: NestContext, body: unknown, statusCode?: number): void;
|
|
19
|
+
end(response: NestContext, message?: string): void;
|
|
20
|
+
redirect(response: NestContext, statusCode: number, url: string): void;
|
|
21
|
+
setHeader(response: NestContext, name: string, value: string): void;
|
|
22
|
+
getHeader(response: NestContext, name: string): string | undefined;
|
|
23
|
+
appendHeader(response: NestContext, name: string, value: string): void;
|
|
24
|
+
isHeadersSent(response: NestContext): boolean;
|
|
25
|
+
private resolve;
|
|
26
|
+
}
|
|
27
|
+
export { ResponseWriter };
|
|
28
|
+
//# sourceMappingURL=response-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-writer.d.ts","sourceRoot":"","sources":["../src/response-writer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;;;;GAOG;AACH,cAAM,cAAc;IAClB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAG1B;IAEG,MAAM,CACX,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,MAAM,GACjB,IAAI,CAEN;IAED;;;OAGG;IACI,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAEzD;IAEM,KAAK,CACV,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,OAAO,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAMN;IAEM,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAMxD;IAEM,QAAQ,CACb,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,GACV,IAAI,CAON;IAEM,SAAS,CACd,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,IAAI,CAEN;IAEM,SAAS,CACd,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAEpB;IAEM,YAAY,CACjB,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,IAAI,CAEN;IAEM,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAEnD;IAED,OAAO,CAAC,OAAO;CAGhB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { HttpStatus } from '@nestjs/common';
|
|
2
|
+
import { buildResponse } from './bridge.js';
|
|
3
|
+
/**
|
|
4
|
+
* Writes what Nest answers onto the context of the request.
|
|
5
|
+
*
|
|
6
|
+
* A Hono context doubles as the response object, so a value is
|
|
7
|
+
* turned into a Web response and stored on it. A status set
|
|
8
|
+
* through `@HttpCode()` or `@Res()` is remembered per request,
|
|
9
|
+
* because the adapter is asked for it after the handler ran.
|
|
10
|
+
*/
|
|
11
|
+
class ResponseWriter {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.pendingStatus = new WeakMap();
|
|
14
|
+
}
|
|
15
|
+
status(response, statusCode) {
|
|
16
|
+
this.pendingStatus.set(response, statusCode);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The status Nest asked for, before any body was written. An
|
|
20
|
+
* event stream needs it while the handler still runs.
|
|
21
|
+
*/
|
|
22
|
+
statusOf(response) {
|
|
23
|
+
return this.pendingStatus.get(response);
|
|
24
|
+
}
|
|
25
|
+
reply(response, body, statusCode) {
|
|
26
|
+
response.res = buildResponse(response, body, statusCode ?? this.resolve(response));
|
|
27
|
+
}
|
|
28
|
+
end(response, message) {
|
|
29
|
+
response.res = buildResponse(response, message, this.resolve(response));
|
|
30
|
+
}
|
|
31
|
+
redirect(response, statusCode, url) {
|
|
32
|
+
response.header('Location', url);
|
|
33
|
+
response.res = buildResponse(response, undefined, statusCode);
|
|
34
|
+
}
|
|
35
|
+
setHeader(response, name, value) {
|
|
36
|
+
response.header(name, value);
|
|
37
|
+
}
|
|
38
|
+
getHeader(response, name) {
|
|
39
|
+
return response.res.headers.get(name) ?? undefined;
|
|
40
|
+
}
|
|
41
|
+
appendHeader(response, name, value) {
|
|
42
|
+
response.header(name, value, { append: true });
|
|
43
|
+
}
|
|
44
|
+
isHeadersSent(response) {
|
|
45
|
+
return response.finalized;
|
|
46
|
+
}
|
|
47
|
+
resolve(response) {
|
|
48
|
+
return this.pendingStatus.get(response) ?? HttpStatus.OK;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export { ResponseWriter };
|
|
52
|
+
//# sourceMappingURL=response-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-writer.js","sourceRoot":"","sources":["../src/response-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C;;;;;;;GAOG;AACH,MAAM,cAAc;IAApB;QACmB,kBAAa,GAAG,IAAI,OAAO,EAGzC,CAAC;IAgFN,CAAC;IA9EQ,MAAM,CACX,QAAqB,EACrB,UAAkB;QAElB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,QAAqB;QACnC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAEM,KAAK,CACV,QAAqB,EACrB,IAAa,EACb,UAAmB;QAEnB,QAAQ,CAAC,GAAG,GAAG,aAAa,CAC1B,QAAQ,EACR,IAAI,EACJ,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CACrC,CAAC;IACJ,CAAC;IAEM,GAAG,CAAC,QAAqB,EAAE,OAAgB;QAChD,QAAQ,CAAC,GAAG,GAAG,aAAa,CAC1B,QAAQ,EACR,OAAO,EACP,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CACvB,CAAC;IACJ,CAAC;IAEM,QAAQ,CACb,QAAqB,EACrB,UAAkB,EAClB,GAAW;QAEX,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACjC,QAAQ,CAAC,GAAG,GAAG,aAAa,CAC1B,QAAQ,EACR,SAAS,EACT,UAAU,CACX,CAAC;IACJ,CAAC;IAEM,SAAS,CACd,QAAqB,EACrB,IAAY,EACZ,KAAa;QAEb,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAEM,SAAS,CACd,QAAqB,EACrB,IAAY;QAEZ,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;IACrD,CAAC;IAEM,YAAY,CACjB,QAAqB,EACrB,IAAY,EACZ,KAAa;QAEb,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAEM,aAAa,CAAC,QAAqB;QACxC,OAAO,QAAQ,CAAC,SAAS,CAAC;IAC5B,CAAC;IAEO,OAAO,CAAC,QAAqB;QACnC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC;IAC3D,CAAC;CACF;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ServerType } from '@hono/node-server';
|
|
2
|
+
import { RequestMethod } from '@nestjs/common';
|
|
3
|
+
import type { VersioningOptions } from '@nestjs/common';
|
|
4
|
+
import { AbstractHttpAdapter } from '@nestjs/core';
|
|
5
|
+
import type { NestHandler, NestRequest } from './bridge.ts';
|
|
6
|
+
import type { NestContext } from './context.ts';
|
|
7
|
+
import type { VersionValue } from './version-filter.ts';
|
|
8
|
+
import type { VersionedRoute } from './versioned-route.ts';
|
|
9
|
+
/**
|
|
10
|
+
* Method registered for a route that answers every verb, and
|
|
11
|
+
* for middleware, which Nest mounts without one.
|
|
12
|
+
*/
|
|
13
|
+
declare const ALL_METHOD = "ALL";
|
|
14
|
+
/** Either a route path, or the handler to mount at the root. */
|
|
15
|
+
type RouteTarget = string | NestHandler;
|
|
16
|
+
/**
|
|
17
|
+
* The routing half of the Nest adapter contract: every verb a
|
|
18
|
+
* route can be mapped to, the middleware factory and version
|
|
19
|
+
* filtering. The concrete adapter supplies the registration, so
|
|
20
|
+
* this half never touches Hono itself.
|
|
21
|
+
*/
|
|
22
|
+
declare abstract class RouteAdapter extends AbstractHttpAdapter<ServerType, NestRequest, NestContext> {
|
|
23
|
+
/** Registers one route with the underlying framework. */
|
|
24
|
+
protected abstract register(method: string, path: string, handler: NestHandler): void;
|
|
25
|
+
get(target: RouteTarget, handler?: NestHandler): void;
|
|
26
|
+
post(target: RouteTarget, handler?: NestHandler): void;
|
|
27
|
+
put(target: RouteTarget, handler?: NestHandler): void;
|
|
28
|
+
patch(target: RouteTarget, handler?: NestHandler): void;
|
|
29
|
+
delete(target: RouteTarget, handler?: NestHandler): void;
|
|
30
|
+
options(target: RouteTarget, handler?: NestHandler): void;
|
|
31
|
+
head(target: RouteTarget, handler?: NestHandler): void;
|
|
32
|
+
all(target: RouteTarget, handler?: NestHandler): void;
|
|
33
|
+
search(target: RouteTarget, handler?: NestHandler): void;
|
|
34
|
+
query(target: RouteTarget, handler?: NestHandler): void;
|
|
35
|
+
propfind(target: RouteTarget, handler?: NestHandler): void;
|
|
36
|
+
proppatch(target: RouteTarget, handler?: NestHandler): void;
|
|
37
|
+
mkcol(target: RouteTarget, handler?: NestHandler): void;
|
|
38
|
+
copy(target: RouteTarget, handler?: NestHandler): void;
|
|
39
|
+
move(target: RouteTarget, handler?: NestHandler): void;
|
|
40
|
+
lock(target: RouteTarget, handler?: NestHandler): void;
|
|
41
|
+
unlock(target: RouteTarget, handler?: NestHandler): void;
|
|
42
|
+
/**
|
|
43
|
+
* Mounts global middleware. Nest calls this with a handler,
|
|
44
|
+
* or with a path and a handler, and both answer every
|
|
45
|
+
* method.
|
|
46
|
+
*/
|
|
47
|
+
use(...args: unknown[]): void;
|
|
48
|
+
createMiddlewareFactory(requestMethod: RequestMethod): (path: string, callback: unknown) => void;
|
|
49
|
+
applyVersionFilter(handler: NestHandler, version: VersionValue, versioningOptions: VersioningOptions): VersionedRoute;
|
|
50
|
+
private route;
|
|
51
|
+
}
|
|
52
|
+
export { ALL_METHOD, RouteAdapter };
|
|
53
|
+
//# sourceMappingURL=route-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-adapter.d.ts","sourceRoot":"","sources":["../src/route-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { RequestMethod } from '@nestjs/common';
|
|
2
|
+
import { AbstractHttpAdapter } from '@nestjs/core';
|
|
3
|
+
import { createVersionFilter } from './version-filter.js';
|
|
4
|
+
import { asVersionedRoute } from './versioned-route.js';
|
|
5
|
+
/**
|
|
6
|
+
* Nest's verb enum mapped onto HTTP method names, for the one
|
|
7
|
+
* place that receives the enum rather than the name.
|
|
8
|
+
*/
|
|
9
|
+
const METHOD_BY_REQUEST_METHOD = {
|
|
10
|
+
[RequestMethod.GET]: 'GET',
|
|
11
|
+
[RequestMethod.POST]: 'POST',
|
|
12
|
+
[RequestMethod.PUT]: 'PUT',
|
|
13
|
+
[RequestMethod.DELETE]: 'DELETE',
|
|
14
|
+
[RequestMethod.PATCH]: 'PATCH',
|
|
15
|
+
[RequestMethod.ALL]: 'ALL',
|
|
16
|
+
[RequestMethod.OPTIONS]: 'OPTIONS',
|
|
17
|
+
[RequestMethod.HEAD]: 'HEAD',
|
|
18
|
+
[RequestMethod.SEARCH]: 'SEARCH',
|
|
19
|
+
[RequestMethod.PROPFIND]: 'PROPFIND',
|
|
20
|
+
[RequestMethod.PROPPATCH]: 'PROPPATCH',
|
|
21
|
+
[RequestMethod.MKCOL]: 'MKCOL',
|
|
22
|
+
[RequestMethod.COPY]: 'COPY',
|
|
23
|
+
[RequestMethod.MOVE]: 'MOVE',
|
|
24
|
+
[RequestMethod.LOCK]: 'LOCK',
|
|
25
|
+
[RequestMethod.UNLOCK]: 'UNLOCK',
|
|
26
|
+
[RequestMethod.QUERY]: 'QUERY',
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Method registered for a route that answers every verb, and
|
|
30
|
+
* for middleware, which Nest mounts without one.
|
|
31
|
+
*/
|
|
32
|
+
const ALL_METHOD = 'ALL';
|
|
33
|
+
/** Path a handler is mounted at when Nest passes it without one. */
|
|
34
|
+
const ROOT_PATH = '/';
|
|
35
|
+
function isHandler(value) {
|
|
36
|
+
return typeof value === 'function';
|
|
37
|
+
}
|
|
38
|
+
function resolveRoute(target, handler) {
|
|
39
|
+
if (typeof target === 'function') {
|
|
40
|
+
return [ROOT_PATH, target];
|
|
41
|
+
}
|
|
42
|
+
if (handler === undefined) {
|
|
43
|
+
throw new TypeError('A route registered with a path also needs a handler.');
|
|
44
|
+
}
|
|
45
|
+
return [target, handler];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The routing half of the Nest adapter contract: every verb a
|
|
49
|
+
* route can be mapped to, the middleware factory and version
|
|
50
|
+
* filtering. The concrete adapter supplies the registration, so
|
|
51
|
+
* this half never touches Hono itself.
|
|
52
|
+
*/
|
|
53
|
+
class RouteAdapter extends AbstractHttpAdapter {
|
|
54
|
+
get(target, handler) {
|
|
55
|
+
this.route('GET', target, handler);
|
|
56
|
+
}
|
|
57
|
+
post(target, handler) {
|
|
58
|
+
this.route('POST', target, handler);
|
|
59
|
+
}
|
|
60
|
+
put(target, handler) {
|
|
61
|
+
this.route('PUT', target, handler);
|
|
62
|
+
}
|
|
63
|
+
patch(target, handler) {
|
|
64
|
+
this.route('PATCH', target, handler);
|
|
65
|
+
}
|
|
66
|
+
delete(target, handler) {
|
|
67
|
+
this.route('DELETE', target, handler);
|
|
68
|
+
}
|
|
69
|
+
options(target, handler) {
|
|
70
|
+
this.route('OPTIONS', target, handler);
|
|
71
|
+
}
|
|
72
|
+
head(target, handler) {
|
|
73
|
+
this.route('HEAD', target, handler);
|
|
74
|
+
}
|
|
75
|
+
all(target, handler) {
|
|
76
|
+
this.route(ALL_METHOD, target, handler);
|
|
77
|
+
}
|
|
78
|
+
search(target, handler) {
|
|
79
|
+
this.route('SEARCH', target, handler);
|
|
80
|
+
}
|
|
81
|
+
query(target, handler) {
|
|
82
|
+
this.route('QUERY', target, handler);
|
|
83
|
+
}
|
|
84
|
+
propfind(target, handler) {
|
|
85
|
+
this.route('PROPFIND', target, handler);
|
|
86
|
+
}
|
|
87
|
+
proppatch(target, handler) {
|
|
88
|
+
this.route('PROPPATCH', target, handler);
|
|
89
|
+
}
|
|
90
|
+
mkcol(target, handler) {
|
|
91
|
+
this.route('MKCOL', target, handler);
|
|
92
|
+
}
|
|
93
|
+
copy(target, handler) {
|
|
94
|
+
this.route('COPY', target, handler);
|
|
95
|
+
}
|
|
96
|
+
move(target, handler) {
|
|
97
|
+
this.route('MOVE', target, handler);
|
|
98
|
+
}
|
|
99
|
+
lock(target, handler) {
|
|
100
|
+
this.route('LOCK', target, handler);
|
|
101
|
+
}
|
|
102
|
+
unlock(target, handler) {
|
|
103
|
+
this.route('UNLOCK', target, handler);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Mounts global middleware. Nest calls this with a handler,
|
|
107
|
+
* or with a path and a handler, and both answer every
|
|
108
|
+
* method.
|
|
109
|
+
*/
|
|
110
|
+
use(...args) {
|
|
111
|
+
const [first, second] = args;
|
|
112
|
+
if (isHandler(first) && second === undefined) {
|
|
113
|
+
this.route(ALL_METHOD, first);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (typeof first === 'string' && isHandler(second)) {
|
|
117
|
+
this.route(ALL_METHOD, first, second);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
throw new TypeError('Middleware is mounted as a handler, or as a path and a ' +
|
|
121
|
+
'handler.');
|
|
122
|
+
}
|
|
123
|
+
createMiddlewareFactory(requestMethod) {
|
|
124
|
+
const method = METHOD_BY_REQUEST_METHOD[requestMethod] ?? ALL_METHOD;
|
|
125
|
+
return (path, callback) => {
|
|
126
|
+
if (!isHandler(callback)) {
|
|
127
|
+
throw new TypeError('Nest middleware must be registered as a function.');
|
|
128
|
+
}
|
|
129
|
+
this.route(method, path, callback);
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
applyVersionFilter(handler, version, versioningOptions) {
|
|
133
|
+
return asVersionedRoute(createVersionFilter(handler, version, versioningOptions));
|
|
134
|
+
}
|
|
135
|
+
route(method, target, handler) {
|
|
136
|
+
const [path, routeHandler] = resolveRoute(target, handler);
|
|
137
|
+
this.register(method, path, routeHandler);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export { ALL_METHOD, RouteAdapter };
|
|
141
|
+
//# sourceMappingURL=route-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-adapter.js","sourceRoot":"","sources":["../src/route-adapter.ts"],"names":[],"mappings":"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"}
|