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.
Files changed (52) hide show
  1. package/README.md +54 -23
  2. package/dist/benchmark.benchmark.d.ts +2 -0
  3. package/dist/benchmark.benchmark.d.ts.map +1 -0
  4. package/dist/benchmark.benchmark.js +13 -0
  5. package/dist/benchmark.benchmark.js.map +1 -0
  6. package/dist/context.d.ts +9 -26
  7. package/dist/context.d.ts.map +1 -1
  8. package/dist/cors.d.ts +22 -0
  9. package/dist/cors.d.ts.map +1 -0
  10. package/dist/cors.js +76 -0
  11. package/dist/cors.js.map +1 -0
  12. package/dist/cors.test.d.ts +2 -0
  13. package/dist/cors.test.d.ts.map +1 -0
  14. package/dist/cors.test.js +39 -0
  15. package/dist/cors.test.js.map +1 -0
  16. package/dist/error.d.ts +0 -4
  17. package/dist/error.d.ts.map +1 -1
  18. package/dist/error.js +0 -7
  19. package/dist/error.js.map +1 -1
  20. package/dist/index.d.ts +1 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/middleware.test.js +64 -0
  25. package/dist/middleware.test.js.map +1 -1
  26. package/dist/openapi.d.ts +1 -1
  27. package/dist/spiceflow.d.ts +5 -16
  28. package/dist/spiceflow.d.ts.map +1 -1
  29. package/dist/spiceflow.js +70 -55
  30. package/dist/spiceflow.js.map +1 -1
  31. package/dist/spiceflow.test.js +60 -4
  32. package/dist/spiceflow.test.js.map +1 -1
  33. package/dist/types.d.ts +23 -53
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/types.js.map +1 -1
  36. package/package.json +23 -1
  37. package/src/benchmark.benchmark.ts +16 -0
  38. package/src/context.ts +10 -28
  39. package/src/cors.test.ts +44 -0
  40. package/src/cors.ts +115 -0
  41. package/src/error.ts +0 -8
  42. package/src/index.ts +1 -0
  43. package/src/middleware.test.ts +68 -0
  44. package/src/spiceflow.test.ts +81 -4
  45. package/src/spiceflow.ts +83 -109
  46. package/src/types.test.ts +1 -0
  47. package/src/types.ts +30 -55
  48. package/dist/benchmark.test.d.ts +0 -2
  49. package/dist/benchmark.test.d.ts.map +0 -1
  50. package/dist/benchmark.test.js +0 -8
  51. package/dist/benchmark.test.js.map +0 -1
  52. 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: userSchema,
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
- mainApp.use('/users', usersApp)
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
- app.use(async ({}, next) => {
163
- const response = await next()
164
- if (response) {
165
- // Add a custom header to all responses
166
- response.headers.set('X-Powered-By', 'Spiceflow')
167
- }
168
- return response
169
- }).get('/example', () => {
170
- return { message: 'Hello, World!' }
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=benchmark.benchmark.d.ts.map
@@ -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 { TypedRequest } from './spiceflow.js';
3
+ import { SpiceflowRequest } from './spiceflow.js';
4
4
  export type ErrorContext<in out Route extends RouteSchema = {}, in out Singleton extends SingletonBase = {
5
- decorator: {};
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: TypedRequest<Route['body']>;
31
- store: Singleton['store'];
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
- decorator: {};
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
- * Path as registered to router
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
- decorator: {};
63
- store: {};
46
+ state: {};
64
47
  }> = Prettify<{
65
- store: Singleton['store'];
48
+ state: Singleton['state'];
66
49
  request: Request;
67
50
  path: string;
68
51
  query?: Record<string, string | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cors.test.d.ts.map
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAYA,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,aAAc,SAAQ,KAAK;IACvC,IAAI,SAAc;IAClB,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"}
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":";AAEA,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,aAAc,SAAQ,KAAK;IAAxC;;QACC,SAAI,GAAG,WAAW,CAAA;QAClB,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"}
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
@@ -1,2 +1,3 @@
1
1
  export { Spiceflow, AnySpiceflow } from './spiceflow.js';
2
+ export { InternalServerError, ParseError, ValidationError } from './error.js';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -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
@@ -1,2 +1,3 @@
1
1
  export { Spiceflow } from './spiceflow.js';
2
+ export { InternalServerError, ParseError, ValidationError } from './error.js';
2
3
  //# sourceMappingURL=index.js.map
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"}
@@ -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":"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"}
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
- store: {};
37
+ state: {};
38
38
  }, {
39
39
  type: {};
40
40
  error: {};
@@ -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
- store: {};
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 defaultStore;
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
- store: Reconcile<Singleton['store'], {
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
- store: Singleton['store'];
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 TypedRequest<T = any> extends Request {
151
+ export declare class SpiceflowRequest<T = any> extends Request {
163
152
  validateBody?: ValidateFunction;
164
153
  json(): Promise<T>;
165
154
  }