spiceflow 1.1.2 → 1.1.4
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 +54 -23
- package/dist/benchmark.benchmark.d.ts +2 -0
- package/dist/benchmark.benchmark.d.ts.map +1 -0
- package/dist/benchmark.benchmark.js +13 -0
- package/dist/benchmark.benchmark.js.map +1 -0
- package/dist/context.d.ts +9 -26
- package/dist/context.d.ts.map +1 -1
- package/dist/cors.d.ts +22 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +76 -0
- package/dist/cors.js.map +1 -0
- package/dist/cors.test.d.ts +2 -0
- package/dist/cors.test.d.ts.map +1 -0
- package/dist/cors.test.js +39 -0
- package/dist/cors.test.js.map +1 -0
- package/dist/error.d.ts +0 -4
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +0 -7
- package/dist/error.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware.test.js +64 -0
- package/dist/middleware.test.js.map +1 -1
- package/dist/openapi.d.ts +1 -1
- package/dist/spiceflow.d.ts +5 -16
- package/dist/spiceflow.d.ts.map +1 -1
- package/dist/spiceflow.js +70 -55
- package/dist/spiceflow.js.map +1 -1
- package/dist/spiceflow.test.js +60 -4
- package/dist/spiceflow.test.js.map +1 -1
- package/dist/types.d.ts +23 -53
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +23 -1
- package/src/benchmark.benchmark.ts +16 -0
- package/src/context.ts +10 -28
- package/src/cors.test.ts +44 -0
- package/src/cors.ts +115 -0
- package/src/error.ts +0 -8
- package/src/index.ts +1 -0
- package/src/middleware.test.ts +68 -0
- package/src/spiceflow.test.ts +81 -4
- package/src/spiceflow.ts +83 -109
- package/src/types.test.ts +1 -0
- package/src/types.ts +30 -55
- package/dist/benchmark.test.d.ts +0 -2
- package/dist/benchmark.test.d.ts.map +0 -1
- package/dist/benchmark.test.js +0 -8
- package/dist/benchmark.test.js.map +0 -1
- package/src/benchmark.test.ts +0 -8
package/README.md
CHANGED
|
@@ -36,9 +36,7 @@ npm install spiceflow
|
|
|
36
36
|
```typescript
|
|
37
37
|
import { Spiceflow } from 'spiceflow'
|
|
38
38
|
|
|
39
|
-
const app = new Spiceflow()
|
|
40
|
-
|
|
41
|
-
app.get('/hello', () => 'Hello, World!')
|
|
39
|
+
const app = new Spiceflow().get('/hello', () => 'Hello, World!')
|
|
42
40
|
|
|
43
41
|
app.listen(3000)
|
|
44
42
|
```
|
|
@@ -58,18 +56,16 @@ app.get('/users/:id', ({ params }) => {
|
|
|
58
56
|
```typescript
|
|
59
57
|
import { z } from 'zod'
|
|
60
58
|
|
|
61
|
-
const userSchema = z.object({
|
|
62
|
-
name: z.string(),
|
|
63
|
-
email: z.string().email(),
|
|
64
|
-
})
|
|
65
|
-
|
|
66
59
|
app.post(
|
|
67
60
|
'/users',
|
|
68
61
|
({ body }) => {
|
|
69
62
|
return `Created user: ${body.name}`
|
|
70
63
|
},
|
|
71
64
|
{
|
|
72
|
-
body:
|
|
65
|
+
body: z.object({
|
|
66
|
+
name: z.string(),
|
|
67
|
+
email: z.string().email(),
|
|
68
|
+
}),
|
|
73
69
|
},
|
|
74
70
|
)
|
|
75
71
|
```
|
|
@@ -107,11 +103,9 @@ const { data: user } = await client.users.get({ params: { id: '123' } })
|
|
|
107
103
|
## Mounting Sub-Apps
|
|
108
104
|
|
|
109
105
|
```typescript
|
|
110
|
-
const usersApp = new Spiceflow()
|
|
111
|
-
usersApp.get('/', () => 'Users list')
|
|
112
|
-
|
|
113
106
|
const mainApp = new Spiceflow()
|
|
114
|
-
|
|
107
|
+
.post('/users', ({ body }) => `Created user: ${body.name}`)
|
|
108
|
+
.use(new Spiceflow().get('/', () => 'Users list'))
|
|
115
109
|
```
|
|
116
110
|
|
|
117
111
|
## Base Path
|
|
@@ -159,14 +153,51 @@ Middleware in Spiceflow can be used to modify the response before it's sent to t
|
|
|
159
153
|
Here's an example of how to modify the response using middleware:
|
|
160
154
|
|
|
161
155
|
```ts
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
response
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
})
|
|
156
|
+
|
|
157
|
+
new Spiceflow()
|
|
158
|
+
.use(async ({ request }, next) => {
|
|
159
|
+
const response = await next()
|
|
160
|
+
if (response) {
|
|
161
|
+
// Add a custom header to all responses
|
|
162
|
+
response.headers.set('X-Powered-By', 'Spiceflow')
|
|
163
|
+
}
|
|
164
|
+
return response
|
|
165
|
+
})
|
|
166
|
+
.get('/example', () => {
|
|
167
|
+
return { message: 'Hello, World!' }
|
|
168
|
+
})
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Generating OpenAPI Schema
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import { openapi } from 'spiceflow/openapi'
|
|
175
|
+
|
|
176
|
+
const app = new Spiceflow()
|
|
177
|
+
.use(openapi({ path: '/openapi.json' }))
|
|
178
|
+
.get('/hello', () => 'Hello, World!', {
|
|
179
|
+
query: z.object({
|
|
180
|
+
name: z.string(),
|
|
181
|
+
age: z.number(),
|
|
182
|
+
}),
|
|
183
|
+
response: z.string(),
|
|
184
|
+
})
|
|
185
|
+
.post('/user', {
|
|
186
|
+
body: z.object({
|
|
187
|
+
name: z.string(),
|
|
188
|
+
email: z.string().email(),
|
|
189
|
+
}),
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
const openapiSchema = await (
|
|
193
|
+
await app.handle(new Request('http://localhost:3000/openapi.json'))
|
|
194
|
+
).json()
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Adding CORS Headers
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
import { cors } from 'spiceflow/cors'
|
|
201
|
+
|
|
202
|
+
const app = new Spiceflow().use(cors()).get('/hello', () => 'Hello, World!')
|
|
172
203
|
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.benchmark.d.ts","sourceRoot":"","sources":["../src/benchmark.benchmark.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { bench } from 'vitest';
|
|
2
|
+
import { Spiceflow } from './spiceflow.js';
|
|
3
|
+
bench('Spiceflow basic routing', async () => {
|
|
4
|
+
const app = new Spiceflow();
|
|
5
|
+
app.get('/hello', () => {
|
|
6
|
+
return { message: 'Hello, World!' };
|
|
7
|
+
});
|
|
8
|
+
const request = new Request('http://localhost/hello');
|
|
9
|
+
for (let i = 0; i < 10000; i++) {
|
|
10
|
+
await app.handle(request);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=benchmark.benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.benchmark.js","sourceRoot":"","sources":["../src/benchmark.benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE9B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,KAAK,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;IAC3C,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAA;IAE3B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAA;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;AACF,CAAC,CAAC,CAAA"}
|
package/dist/context.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { redirect as Redirect } from './utils.js';
|
|
2
2
|
import type { RouteSchema, Prettify, ResolvePath, SingletonBase } from './types.js';
|
|
3
|
-
import {
|
|
3
|
+
import { SpiceflowRequest } from './spiceflow.js';
|
|
4
4
|
export type ErrorContext<in out Route extends RouteSchema = {}, in out Singleton extends SingletonBase = {
|
|
5
|
-
|
|
6
|
-
store: {};
|
|
5
|
+
state: {};
|
|
7
6
|
derive: {};
|
|
8
7
|
resolve: {};
|
|
9
8
|
}, Path extends string = ''> = Prettify<{
|
|
@@ -27,42 +26,26 @@ export type ErrorContext<in out Route extends RouteSchema = {}, in out Singleton
|
|
|
27
26
|
*
|
|
28
27
|
* @example '/id/:id'
|
|
29
28
|
*/
|
|
30
|
-
request:
|
|
31
|
-
|
|
29
|
+
request: SpiceflowRequest<Route['body']>;
|
|
30
|
+
state: Singleton['state'];
|
|
32
31
|
}>;
|
|
33
32
|
export type Context<in out Route extends RouteSchema = {}, in out Singleton extends SingletonBase = {
|
|
34
|
-
|
|
35
|
-
store: {};
|
|
33
|
+
state: {};
|
|
36
34
|
derive: {};
|
|
37
35
|
resolve: {};
|
|
38
36
|
}, Path extends string = ''> = Prettify<{
|
|
39
37
|
query: undefined extends Route['query'] ? Record<string, string | undefined> : Route['query'];
|
|
40
38
|
params: undefined extends Route['params'] ? Path extends `${string}/${':' | '*'}${string}` ? ResolvePath<Path> : never : Route['params'];
|
|
41
39
|
redirect: Redirect;
|
|
42
|
-
/**
|
|
43
|
-
* Path extracted from incoming URL
|
|
44
|
-
*
|
|
45
|
-
* Represent a value extracted from URL
|
|
46
|
-
*
|
|
47
|
-
* @example '/id/9'
|
|
48
|
-
*/
|
|
49
40
|
path: string;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
*
|
|
53
|
-
* Represent a path registered to a router, not a URL
|
|
54
|
-
*
|
|
55
|
-
* @example '/id/:id'
|
|
56
|
-
*/
|
|
57
|
-
request: TypedRequest<Route['body']>;
|
|
58
|
-
store: Singleton['store'];
|
|
41
|
+
request: SpiceflowRequest<Route['body']>;
|
|
42
|
+
state: Singleton['state'];
|
|
59
43
|
response?: Route['response'];
|
|
60
44
|
}>;
|
|
61
45
|
export type MiddlewareContext<in out Singleton extends SingletonBase = {
|
|
62
|
-
|
|
63
|
-
store: {};
|
|
46
|
+
state: {};
|
|
64
47
|
}> = Prettify<{
|
|
65
|
-
|
|
48
|
+
state: Singleton['state'];
|
|
66
49
|
request: Request;
|
|
67
50
|
path: string;
|
|
68
51
|
query?: Record<string, string | undefined>;
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGX,QAAQ,IAAI,QAAQ,EACpB,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EACX,WAAW,EACX,QAAQ,EACR,WAAW,EACX,aAAa,EAEb,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/cors.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { MiddlewareHandler } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Options for configuring CORS (Cross-Origin Resource Sharing) middleware.
|
|
4
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS MDN CORS documentation}
|
|
5
|
+
*/
|
|
6
|
+
type CORSOptions = {
|
|
7
|
+
/** Configures the Access-Control-Allow-Origin CORS header */
|
|
8
|
+
origin: string | string[];
|
|
9
|
+
/** Configures the Access-Control-Allow-Methods CORS header */
|
|
10
|
+
allowMethods?: string[];
|
|
11
|
+
/** Configures the Access-Control-Allow-Headers CORS header */
|
|
12
|
+
allowHeaders?: string[];
|
|
13
|
+
/** Configures the Access-Control-Max-Age CORS header */
|
|
14
|
+
maxAge?: number;
|
|
15
|
+
/** Configures the Access-Control-Allow-Credentials CORS header */
|
|
16
|
+
credentials?: boolean;
|
|
17
|
+
/** Configures the Access-Control-Expose-Headers CORS header */
|
|
18
|
+
exposeHeaders?: string[];
|
|
19
|
+
};
|
|
20
|
+
export declare const cors: (options?: CORSOptions) => MiddlewareHandler;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=cors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C;;;GAGG;AACH,KAAK,WAAW,GAAG;IAClB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACzB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,IAAI,aAAc,WAAW,KAAG,iBA8F5C,CAAA"}
|
package/dist/cors.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export const cors = (options) => {
|
|
2
|
+
const defaults = {
|
|
3
|
+
origin: '*',
|
|
4
|
+
allowMethods: ['GET', 'HEAD', 'PUT', 'POST', 'DELETE', 'PATCH'],
|
|
5
|
+
allowHeaders: [],
|
|
6
|
+
exposeHeaders: [],
|
|
7
|
+
};
|
|
8
|
+
const opts = Object.assign(Object.assign({}, defaults), options);
|
|
9
|
+
const findAllowOrigin = ((optsOrigin) => {
|
|
10
|
+
if (typeof optsOrigin === 'string') {
|
|
11
|
+
return () => optsOrigin;
|
|
12
|
+
}
|
|
13
|
+
else if (typeof optsOrigin === 'function') {
|
|
14
|
+
return optsOrigin;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
return (origin) => optsOrigin.includes(origin) ? origin : optsOrigin[0];
|
|
18
|
+
}
|
|
19
|
+
})(opts.origin);
|
|
20
|
+
return async function cors(c, next) {
|
|
21
|
+
var _a, _b;
|
|
22
|
+
let response = await next();
|
|
23
|
+
function set(key, value) {
|
|
24
|
+
response.headers.set(key, value);
|
|
25
|
+
}
|
|
26
|
+
const allowOrigin = findAllowOrigin(c.request.headers.get('origin') || '');
|
|
27
|
+
if (allowOrigin) {
|
|
28
|
+
set('Access-Control-Allow-Origin', allowOrigin);
|
|
29
|
+
}
|
|
30
|
+
// Suppose the server sends a response with an Access-Control-Allow-Origin value with an explicit origin (rather than the "*" wildcard).
|
|
31
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
|
|
32
|
+
if (opts.origin !== '*') {
|
|
33
|
+
const existingVary = c.request.headers.get('Vary');
|
|
34
|
+
if (existingVary) {
|
|
35
|
+
set('Vary', existingVary);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
set('Vary', 'Origin');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (opts.credentials) {
|
|
42
|
+
set('Access-Control-Allow-Credentials', 'true');
|
|
43
|
+
}
|
|
44
|
+
if ((_a = opts.exposeHeaders) === null || _a === void 0 ? void 0 : _a.length) {
|
|
45
|
+
set('Access-Control-Expose-Headers', opts.exposeHeaders.join(','));
|
|
46
|
+
}
|
|
47
|
+
if (c.request.method === 'OPTIONS') {
|
|
48
|
+
if (opts.maxAge != null) {
|
|
49
|
+
set('Access-Control-Max-Age', opts.maxAge.toString());
|
|
50
|
+
}
|
|
51
|
+
if ((_b = opts.allowMethods) === null || _b === void 0 ? void 0 : _b.length) {
|
|
52
|
+
set('Access-Control-Allow-Methods', opts.allowMethods.join(','));
|
|
53
|
+
}
|
|
54
|
+
let headers = opts.allowHeaders;
|
|
55
|
+
if (!(headers === null || headers === void 0 ? void 0 : headers.length)) {
|
|
56
|
+
const requestHeaders = c.request.headers.get('Access-Control-Request-Headers');
|
|
57
|
+
if (requestHeaders) {
|
|
58
|
+
headers = requestHeaders.split(/\s*,\s*/);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (headers === null || headers === void 0 ? void 0 : headers.length) {
|
|
62
|
+
set('Access-Control-Allow-Headers', headers.join(','));
|
|
63
|
+
c.request.headers.append('Vary', 'Access-Control-Request-Headers');
|
|
64
|
+
}
|
|
65
|
+
response.headers.delete('Content-Length');
|
|
66
|
+
response.headers.delete('Content-Type');
|
|
67
|
+
return new Response(null, {
|
|
68
|
+
headers: response.headers,
|
|
69
|
+
status: 204,
|
|
70
|
+
statusText: response.statusText,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return response;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=cors.js.map
|
package/dist/cors.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.test.d.ts","sourceRoot":"","sources":["../src/cors.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { cors } from './cors.js';
|
|
4
|
+
import { Spiceflow } from './spiceflow.js';
|
|
5
|
+
function request(path, method = 'GET') {
|
|
6
|
+
return new Request(`http://localhost/${path}`, {
|
|
7
|
+
method,
|
|
8
|
+
headers: {
|
|
9
|
+
Origin: 'http://example.com',
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
describe('cors middleware', () => {
|
|
14
|
+
const app = new Spiceflow()
|
|
15
|
+
.use(cors())
|
|
16
|
+
.get('/ids/:id', () => 'hi')
|
|
17
|
+
.post('/ids/:id', ({ params: { id } }) => id, {
|
|
18
|
+
params: z.object({ id: z.string() }),
|
|
19
|
+
});
|
|
20
|
+
test('GET request returns correct response and CORS headers', async () => {
|
|
21
|
+
const res = await app.handle(request('ids/xxx'));
|
|
22
|
+
expect(res.status).toBe(200);
|
|
23
|
+
expect(await res.json()).toBe('hi');
|
|
24
|
+
expect(res.headers.get('Access-Control-Allow-Origin')).toBe('*');
|
|
25
|
+
});
|
|
26
|
+
test('OPTIONS request returns correct CORS headers', async () => {
|
|
27
|
+
const res = await app.handle(request('ids/xxx', 'OPTIONS'));
|
|
28
|
+
expect(res.status).toBe(204);
|
|
29
|
+
expect(res.headers.get('Access-Control-Allow-Origin')).toBe('*');
|
|
30
|
+
expect(res.headers.get('Access-Control-Allow-Methods')).toBe('GET,HEAD,PUT,POST,DELETE,PATCH');
|
|
31
|
+
});
|
|
32
|
+
test('POST request respects CORS and returns correct response', async () => {
|
|
33
|
+
const res = await app.handle(request('ids/123', 'POST'));
|
|
34
|
+
expect(res.status).toBe(200);
|
|
35
|
+
expect(await res.json()).toBe('123');
|
|
36
|
+
expect(res.headers.get('Access-Control-Allow-Origin')).toBe('*');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=cors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.test.js","sourceRoot":"","sources":["../src/cors.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,SAAS,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;IACpC,OAAO,IAAI,OAAO,CAAC,oBAAoB,IAAI,EAAE,EAAE;QAC9C,MAAM;QACN,OAAO,EAAE;YACR,MAAM,EAAE,oBAAoB;SAC5B;KACD,CAAC,CAAA;AACH,CAAC;AACD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAChC,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE;SACzB,GAAG,CAAC,IAAI,EAAE,CAAC;SACX,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;SAC3B,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;KACpC,CAAC,CAAA;IAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;QAChD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;QAC3D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAChE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAC3D,gCAAgC,CAChC,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;QACxD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
package/dist/error.d.ts
CHANGED
|
@@ -7,10 +7,6 @@ export declare class ValidationError extends Error {
|
|
|
7
7
|
code: string;
|
|
8
8
|
status: number;
|
|
9
9
|
}
|
|
10
|
-
export declare class NotFoundError extends Error {
|
|
11
|
-
code: string;
|
|
12
|
-
status: number;
|
|
13
|
-
}
|
|
14
10
|
export declare class ParseError extends Error {
|
|
15
11
|
code: string;
|
|
16
12
|
status: number;
|
package/dist/error.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,UAAU,eAA+B,CAAA;AACtD,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAA;AAE1C,eAAO,MAAM,eAAe,eAA8B,CAAA;AAC1D,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAA;AAEpD,eAAO,MAAM,YAAY,SAA+C,CAAA;AAExE,qBAAa,eAAgB,SAAQ,KAAK;IACzC,IAAI,SAAe;IACnB,MAAM,SAAM;CACZ;AAED,qBAAa,UAAW,SAAQ,KAAK;IACpC,IAAI,SAAU;IACd,MAAM,SAAM;CACZ;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC7C,IAAI,SAA0B;IAC9B,MAAM,SAAM;CACZ"}
|
package/dist/error.js
CHANGED
|
@@ -18,13 +18,6 @@ export class ValidationError extends Error {
|
|
|
18
18
|
this.status = 422;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
export class NotFoundError extends Error {
|
|
22
|
-
constructor() {
|
|
23
|
-
super(...arguments);
|
|
24
|
-
this.code = 'NOT_FOUND';
|
|
25
|
-
this.status = 404;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
21
|
export class ParseError extends Error {
|
|
29
22
|
constructor() {
|
|
30
23
|
super(...arguments);
|
package/dist/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":";AAAA,8BAA8B;AAC9B,MAAM,GAAG;AACR,aAAa;AACb,OAAO,GAAG,KAAK,WAAW;IACzB,CAAC,CAAC,aAAa;QACb,GAAG,CAAC,GAAG;IACT,CAAC,CAAC,OAAO,OAAO,KAAK,WAAW;QAChC,CAAC,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG;QACd,CAAC,CAAC,SAAS,CAAA;AAEb,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAA;AAGtD,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAA;AAG1D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,QAAQ,mCAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,GAAG,CAAC,KAAK,YAAY,CAAA;AAExE,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAA1C;;QACC,SAAI,GAAG,YAAY,CAAA;QACnB,WAAM,GAAG,GAAG,CAAA;IACb,CAAC;CAAA;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IAArC;;QACC,SAAI,GAAG,OAAO,CAAA;QACd,WAAM,GAAG,GAAG,CAAA;IACb,CAAC;CAAA;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAA9C;;QACC,SAAI,GAAG,uBAAuB,CAAA;QAC9B,WAAM,GAAG,GAAG,CAAA;IACb,CAAC;CAAA"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA"}
|
package/dist/middleware.test.js
CHANGED
|
@@ -21,6 +21,22 @@ test('middleware with next changes the response', async () => {
|
|
|
21
21
|
expect(await res.json()).toEqual('hi');
|
|
22
22
|
expect(res.headers.get('x-test')).toBe('ok');
|
|
23
23
|
});
|
|
24
|
+
test('middleware next returns a response even for 404, if there are no routes', async () => {
|
|
25
|
+
const res = await new Spiceflow()
|
|
26
|
+
.use(async ({ request }, next) => {
|
|
27
|
+
expect(request.method).toBe('GET');
|
|
28
|
+
const res = await next();
|
|
29
|
+
expect(res).toBeInstanceOf(Response);
|
|
30
|
+
if (res) {
|
|
31
|
+
res.headers.set('x-test', 'ok');
|
|
32
|
+
}
|
|
33
|
+
return res;
|
|
34
|
+
})
|
|
35
|
+
.handle(new Request('http://localhost/non-existent', { method: 'GET' }));
|
|
36
|
+
expect(res.status).toBe(404);
|
|
37
|
+
expect(res.headers.get('x-test')).toBe('ok');
|
|
38
|
+
expect(await res.text()).toContain('Not Found');
|
|
39
|
+
});
|
|
24
40
|
test('middleware without next runs the next middleware and handler', async () => {
|
|
25
41
|
let middlewaresCalled = [];
|
|
26
42
|
const res = await new Spiceflow()
|
|
@@ -74,6 +90,27 @@ test('middleware stops other middlewares', async () => {
|
|
|
74
90
|
expect(middlewaresCalled).toEqual(['first']);
|
|
75
91
|
expect(await res.text()).toEqual('ok');
|
|
76
92
|
});
|
|
93
|
+
test('calling next and then returning a new response works', async () => {
|
|
94
|
+
let middlewaresCalled = [];
|
|
95
|
+
const res = await new Spiceflow()
|
|
96
|
+
.use(async (ctx, next) => {
|
|
97
|
+
middlewaresCalled.push('first');
|
|
98
|
+
await next();
|
|
99
|
+
return new Response('middleware response');
|
|
100
|
+
})
|
|
101
|
+
.use(async (ctx, next) => {
|
|
102
|
+
middlewaresCalled.push('second');
|
|
103
|
+
return next();
|
|
104
|
+
})
|
|
105
|
+
.get('/ids/:id', () => {
|
|
106
|
+
middlewaresCalled.push('handler');
|
|
107
|
+
return 'handler response';
|
|
108
|
+
})
|
|
109
|
+
.handle(new Request('http://localhost/ids/xxx', { method: 'GET' }));
|
|
110
|
+
expect(res.status).toBe(200);
|
|
111
|
+
expect(middlewaresCalled).toEqual(['first', 'second', 'handler']);
|
|
112
|
+
expect(await res.text()).toEqual('middleware response');
|
|
113
|
+
});
|
|
77
114
|
test('middleware changes handler response body', async () => {
|
|
78
115
|
let middlewaresCalled = [];
|
|
79
116
|
const res = await new Spiceflow()
|
|
@@ -96,4 +133,31 @@ test('middleware changes handler response body', async () => {
|
|
|
96
133
|
expect(middlewaresCalled).toEqual(['first', 'second']);
|
|
97
134
|
expect(await res.json()).toEqual('HELLO WORLD');
|
|
98
135
|
});
|
|
136
|
+
test('mutating response returned by next without returning it works', async () => {
|
|
137
|
+
let handlerCalledTimes = 0;
|
|
138
|
+
const res = await new Spiceflow()
|
|
139
|
+
.use(async (ctx, next) => {
|
|
140
|
+
const response = await next();
|
|
141
|
+
if (response) {
|
|
142
|
+
response.headers.set('X-Custom-Header', 'Modified');
|
|
143
|
+
}
|
|
144
|
+
// Not returning the response, letting it pass through
|
|
145
|
+
})
|
|
146
|
+
.use(async (ctx, next) => {
|
|
147
|
+
const response = await next();
|
|
148
|
+
if (response) {
|
|
149
|
+
response.headers.set('X-Another-Header', 'Added');
|
|
150
|
+
}
|
|
151
|
+
})
|
|
152
|
+
.get('/test', () => {
|
|
153
|
+
handlerCalledTimes++;
|
|
154
|
+
return 'hello world';
|
|
155
|
+
})
|
|
156
|
+
.handle(new Request('http://localhost/test'));
|
|
157
|
+
expect(res.status).toBe(200);
|
|
158
|
+
expect(handlerCalledTimes).toBe(1);
|
|
159
|
+
expect(await res.json()).toBe('hello world');
|
|
160
|
+
expect(res.headers.get('X-Custom-Header')).toBe('Modified');
|
|
161
|
+
expect(res.headers.get('X-Another-Header')).toBe('Added');
|
|
162
|
+
});
|
|
99
163
|
//# sourceMappingURL=middleware.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../src/middleware.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../src/middleware.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAY,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,EAAO,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;IAC5D,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE;SAC/B,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE;QAChC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,EAAE,CAAA;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAI,GAAG,EAAE,CAAC;YACT,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAChC,CAAC;QACD,OAAO,GAAG,CAAA;IACX,CAAC,CAAC;SACD,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;SAC3B,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;KACpC,CAAC;SACD,MAAM,CAAC,IAAI,OAAO,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AACF,IAAI,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;IAC1F,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE;SAC/B,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE;QAChC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,EAAE,CAAA;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAI,GAAG,EAAE,CAAC;YACT,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAChC,CAAC;QACD,OAAO,GAAG,CAAA;IACX,CAAC,CAAC;SACD,MAAM,CAAC,IAAI,OAAO,CAAC,+BAA+B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACzE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;AAChD,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;IAC/E,IAAI,iBAAiB,GAAG,EAAc,CAAA;IACtC,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE;SAC/B,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1B,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC,CAAC;SACD,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE;QAChC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAChC,MAAM,GAAG,GAAG,MAAM,IAAI,EAAE,CAAA;QACxB,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC7B,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAChC,CAAC;QACD,OAAO,GAAG,CAAA;IACX,CAAC,CAAC;SACD,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;SAE3B,MAAM,CAAC,IAAI,OAAO,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;IACtD,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AACF,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;IAC7C,IAAI,iBAAiB,GAAG,EAAc,CAAA;IACtC,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE;SAC/B,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1B,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC,CAAC;SACD,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE;QAChC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAChC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC,CAAC;SACD,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;SAE3B,MAAM,CAAC,IAAI,OAAO,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;IACtD,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AACvC,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;IACrD,IAAI,iBAAiB,GAAG,EAAc,CAAA;IACtC,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE;SAC/B,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1B,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC,CAAC;SACD,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1B,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACjC,CAAC,CAAC;SACD,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;SAE3B,MAAM,CAAC,IAAI,OAAO,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IAC5C,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AACvC,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;IACvE,IAAI,iBAAiB,GAAG,EAAc,CAAA;IACtC,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE;SAC/B,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,MAAM,IAAI,EAAE,CAAA;QACZ,OAAO,IAAI,QAAQ,CAAC,qBAAqB,CAAC,CAAA;IAC3C,CAAC,CAAC;SACD,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAChC,OAAO,IAAI,EAAE,CAAA;IACd,CAAC,CAAC;SACD,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE;QACrB,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACjC,OAAO,kBAAkB,CAAA;IAC1B,CAAC,CAAC;SAED,MAAM,CAAC,IAAI,OAAO,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;IACjE,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;AACxD,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;IAC3D,IAAI,iBAAiB,GAAG,EAAc,CAAA;IACtC,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE;SAC/B,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAA;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAClC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAA;QAClD,CAAC;QACD,OAAO,QAAQ,CAAA;IAChB,CAAC,CAAC;SACD,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAChC,OAAO,IAAI,EAAE,CAAA;IACd,CAAC,CAAC;SACD,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;SACjC,MAAM,CAAC,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAA;IAE9C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;IACtD,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;AAChD,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAChF,IAAI,kBAAkB,GAAG,CAAC,CAAA;IAC1B,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE;SAC/B,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAA;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAA;QACpD,CAAC;QACD,sDAAsD;IACvD,CAAC,CAAC;SACD,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAA;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;QAClD,CAAC;IACF,CAAC,CAAC;SACD,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,kBAAkB,EAAE,CAAA;QACpB,OAAO,aAAa,CAAA;IACrB,CAAC,CAAC;SACD,MAAM,CAAC,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAA;IAE9C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC5C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC3D,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAC1D,CAAC,CAAC,CAAA"}
|
package/dist/openapi.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ export declare const openapi: <Path extends string = "/openapi">({ path, documen
|
|
|
34
34
|
*/
|
|
35
35
|
documentation?: Omit<Partial<OpenAPIV3.Document>, "x-express-openapi-additional-middleware" | "x-express-openapi-validation-strict">;
|
|
36
36
|
}) => Spiceflow<"", true, {
|
|
37
|
-
|
|
37
|
+
state: {};
|
|
38
38
|
}, {
|
|
39
39
|
type: {};
|
|
40
40
|
error: {};
|
package/dist/spiceflow.d.ts
CHANGED
|
@@ -11,13 +11,9 @@ export type InternalRoute = {
|
|
|
11
11
|
validateBody?: ValidateFunction;
|
|
12
12
|
validateQuery?: ValidateFunction;
|
|
13
13
|
validateParams?: ValidateFunction;
|
|
14
|
-
prefix: string;
|
|
15
14
|
};
|
|
16
|
-
/**
|
|
17
|
-
* Router class
|
|
18
|
-
*/
|
|
19
15
|
export declare class Spiceflow<const in out BasePath extends string = '', const in out Scoped extends boolean = true, const in out Singleton extends SingletonBase = {
|
|
20
|
-
|
|
16
|
+
state: {};
|
|
21
17
|
}, const in out Definitions extends DefinitionBase = {
|
|
22
18
|
type: {};
|
|
23
19
|
error: {};
|
|
@@ -31,7 +27,7 @@ export declare class Spiceflow<const in out BasePath extends string = '', const
|
|
|
31
27
|
private middlewares;
|
|
32
28
|
private onErrorHandlers;
|
|
33
29
|
private routes;
|
|
34
|
-
private
|
|
30
|
+
private defaultState;
|
|
35
31
|
private topLevelApp?;
|
|
36
32
|
/** @internal */
|
|
37
33
|
prefix?: string;
|
|
@@ -46,12 +42,11 @@ export declare class Spiceflow<const in out BasePath extends string = '', const
|
|
|
46
42
|
validateBody?: ValidateFunction;
|
|
47
43
|
validateQuery?: ValidateFunction;
|
|
48
44
|
validateParams?: ValidateFunction;
|
|
49
|
-
prefix: string;
|
|
50
45
|
}[];
|
|
51
46
|
private add;
|
|
52
47
|
private match;
|
|
53
48
|
state<const Name extends string | number | symbol, Value>(name: Name, value: Value): Spiceflow<BasePath, Scoped, {
|
|
54
|
-
|
|
49
|
+
state: Reconcile<Singleton['state'], {
|
|
55
50
|
[name in Name]: Value;
|
|
56
51
|
}>;
|
|
57
52
|
}, Definitions, Metadata, Routes>;
|
|
@@ -139,15 +134,9 @@ export declare class Spiceflow<const in out BasePath extends string = '', const
|
|
|
139
134
|
private scoped?;
|
|
140
135
|
use<const NewSpiceflow extends AnySpiceflow>(instance: NewSpiceflow): IsAny<NewSpiceflow> extends true ? this : Spiceflow<BasePath, Scoped, Singleton, Definitions, Metadata, BasePath extends `` ? Routes & NewSpiceflow['_routes'] : Routes & CreateEden<BasePath, NewSpiceflow['_routes']>>;
|
|
141
136
|
use<const Schema extends RouteSchema>(handler: MaybeArray<MiddlewareHandler<Schema, {
|
|
142
|
-
|
|
137
|
+
state: Singleton['state'];
|
|
143
138
|
}>>): this;
|
|
144
139
|
onError<const Schema extends RouteSchema>(handler: MaybeArray<ErrorHandler<Definitions['error'], Schema, Singleton>>): this;
|
|
145
|
-
/**
|
|
146
|
-
* Pass a request through all matching route handles and return a response
|
|
147
|
-
* @param request The `Request`
|
|
148
|
-
* @param platform Platform specific context {@link Platform}
|
|
149
|
-
* @returns The final `Response`
|
|
150
|
-
*/
|
|
151
140
|
handle(request: Request): Promise<Response>;
|
|
152
141
|
private runErrorHandlers;
|
|
153
142
|
private getAppAndParents;
|
|
@@ -159,7 +148,7 @@ export declare class Spiceflow<const in out BasePath extends string = '', const
|
|
|
159
148
|
declare const METHODS: readonly ["ALL", "CONNECT", "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "TRACE"];
|
|
160
149
|
/** HTTP method string */
|
|
161
150
|
export type Method = (typeof METHODS)[number];
|
|
162
|
-
export declare class
|
|
151
|
+
export declare class SpiceflowRequest<T = any> extends Request {
|
|
163
152
|
validateBody?: ValidateFunction;
|
|
164
153
|
json(): Promise<T>;
|
|
165
154
|
}
|