@mpen/routekit 0.1.0 → 0.1.2
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/dist/bin.d.mts +4 -0
- package/dist/client/react.d.mts +178 -0
- package/dist/client/react.mjs +142 -0
- package/dist/client.d.mts +433 -0
- package/dist/client.mjs +264 -0
- package/dist/content-BuDOmhH_.mjs +102 -0
- package/dist/core-CzUCxvGk.d.mts +140 -0
- package/dist/core-DbmQauwS.mjs +81 -0
- package/dist/handlers.d.mts +72 -0
- package/dist/handlers.mjs +153 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.mjs +1152 -0
- package/dist/middleware.d.mts +388 -0
- package/dist/middleware.mjs +1222 -0
- package/dist/request-Dn0zc-xm.mjs +1025 -0
- package/dist/response/content.d.mts +79 -0
- package/dist/response/content.mjs +2 -0
- package/dist/response/json-rpc.d.mts +1 -0
- package/dist/response/json-rpc.mjs +1 -0
- package/dist/response/problem/valibot.d.mts +230 -0
- package/dist/response/problem/valibot.mjs +258 -0
- package/dist/response/problem.d.mts +415 -0
- package/dist/response/problem.mjs +183 -0
- package/dist/response/status.d.mts +45 -0
- package/dist/response/status.mjs +2 -0
- package/dist/responses-B379Ep9Y.d.mts +296 -0
- package/dist/responses-BpVrgeYi.mjs +101 -0
- package/dist/router-Cwb7ak0J.d.mts +1819 -0
- package/dist/routes.d.mts +282 -0
- package/dist/routes.mjs +311 -0
- package/dist/status-C-8mw-FB.mjs +59 -0
- package/dist/valibot-D7liFYyB.d.mts +290 -0
- package/dist/valibot-Du97X-TS.mjs +326 -0
- package/package.json +8 -2
- package/src/bin/gen-api-client.test.ts +0 -70
- package/src/bin/gen-api-client.ts +0 -986
- package/src/client/headers.ts +0 -31
- package/src/client/index.ts +0 -8
- package/src/client/promise.ts +0 -11
- package/src/client/react/index.test.tsx +0 -266
- package/src/client/react/index.ts +0 -431
- package/src/client/responses.test.ts +0 -151
- package/src/client/responses.ts +0 -278
- package/src/client/transport.ts +0 -74
- package/src/client/transports/body-codec.ts +0 -61
- package/src/client/transports/fetch.ts +0 -113
- package/src/client/tsconfig.json +0 -9
- package/src/client/types.ts +0 -15
- package/src/client/url.ts +0 -31
- package/src/index.ts +0 -63
- package/src/router/fetch-types.ts +0 -13
- package/src/router/handlers/index.ts +0 -2
- package/src/router/handlers/openapi/index.ts +0 -2
- package/src/router/handlers/openapi/openapi.ts +0 -293
- package/src/router/integration/zod-openapi.test.ts +0 -74
- package/src/router/lib/charset.test.ts +0 -22
- package/src/router/lib/charset.ts +0 -133
- package/src/router/lib/collections.ts +0 -3
- package/src/router/lib/format.test.ts +0 -67
- package/src/router/lib/format.ts +0 -35
- package/src/router/lib/host.ts +0 -4
- package/src/router/lib/json-schema.ts +0 -6
- package/src/router/lib/media-type.test.ts +0 -122
- package/src/router/lib/media-type.ts +0 -289
- package/src/router/lib/pathname.test.ts +0 -18
- package/src/router/lib/pathname.ts +0 -19
- package/src/router/lib/route-names.ts +0 -70
- package/src/router/lib/route-normalize.test.ts +0 -36
- package/src/router/lib/route-normalize.ts +0 -67
- package/src/router/lib/schema-merge.ts +0 -56
- package/src/router/middleware/accept-ctx.test.ts +0 -33
- package/src/router/middleware/accept-ctx.ts +0 -12
- package/src/router/middleware/body-limit.test.ts +0 -112
- package/src/router/middleware/body-limit.ts +0 -121
- package/src/router/middleware/content-type-context.ts +0 -0
- package/src/router/middleware/cors.test.ts +0 -269
- package/src/router/middleware/cors.ts +0 -490
- package/src/router/middleware/csrf.test.ts +0 -106
- package/src/router/middleware/csrf.ts +0 -192
- package/src/router/middleware/define.ts +0 -249
- package/src/router/middleware/index.ts +0 -34
- package/src/router/middleware/jsxhtml-response.ts +0 -0
- package/src/router/middleware/oas-swagger.ts +0 -0
- package/src/router/middleware/rate-limit.test.ts +0 -886
- package/src/router/middleware/rate-limit.ts +0 -920
- package/src/router/middleware/request-id-ctx.test.ts +0 -183
- package/src/router/middleware/request-id-ctx.ts +0 -135
- package/src/router/middleware/request-logger-format.test.ts +0 -16
- package/src/router/middleware/request-logger-format.ts +0 -269
- package/src/router/middleware/request-logger.test.ts +0 -267
- package/src/router/middleware/request-logger.ts +0 -131
- package/src/router/middleware/start-time-ctx.ts +0 -5
- package/src/router/request.ts +0 -611
- package/src/router/response/core.ts +0 -181
- package/src/router/response/directives.ts +0 -233
- package/src/router/response/formats/content/bodyless.ts +0 -54
- package/src/router/response/formats/content/content.ts +0 -79
- package/src/router/response/formats/content/index.ts +0 -2
- package/src/router/response/formats/json-rpc/index.ts +0 -2
- package/src/router/response/formats/problem/badRequest.ts +0 -90
- package/src/router/response/formats/problem/conflict.ts +0 -90
- package/src/router/response/formats/problem/created.ts +0 -40
- package/src/router/response/formats/problem/index.ts +0 -27
- package/src/router/response/formats/problem/notFound.ts +0 -90
- package/src/router/response/formats/problem/permissionDenied.ts +0 -90
- package/src/router/response/formats/problem/problem.test.ts +0 -888
- package/src/router/response/formats/problem/rateLimited.ts +0 -90
- package/src/router/response/formats/problem/responses.ts +0 -219
- package/src/router/response/formats/problem/root-errors.ts +0 -48
- package/src/router/response/formats/problem/sessionExpired.ts +0 -90
- package/src/router/response/formats/problem/types.ts +0 -170
- package/src/router/response/formats/problem/unauthenticated.ts +0 -90
- package/src/router/response/formats/problem/valibot.ts +0 -410
- package/src/router/response/formats/status/index.ts +0 -1
- package/src/router/response/formats/status/responses.ts +0 -59
- package/src/router/response/formats/status/status.test.ts +0 -21
- package/src/router/response/framers.ts +0 -85
- package/src/router/response/index.ts +0 -28
- package/src/router/response/openapi.test.ts +0 -96
- package/src/router/response/openapi.ts +0 -1
- package/src/router/response/serializers.ts +0 -66
- package/src/router/response/stream.ts +0 -35
- package/src/router/router.test.ts +0 -1571
- package/src/router/router.ts +0 -1965
- package/src/router/routes/index.ts +0 -46
- package/src/router/routes/valibot/index.ts +0 -18
- package/src/router/routes/valibot/valibot.ts +0 -1393
- package/src/router/routes/valibot.test.ts +0 -286
- package/src/router/routes/zod/index.ts +0 -18
- package/src/router/routes/zod/zod.ts +0 -1318
- package/src/router/routes/zod.test.ts +0 -280
- package/src/router/server-interface.ts +0 -31
- package/src/router/types.ts +0 -657
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env -S bun test
|
|
2
|
-
import { describe, expect, it } from 'bun:test'
|
|
3
|
-
import { HttpMethod } from '@mpen/http'
|
|
4
|
-
import { Router } from '../router'
|
|
5
|
-
import { openapi } from '../handlers/openapi'
|
|
6
|
-
|
|
7
|
-
describe('openapi', () => {
|
|
8
|
-
it('builds OpenAPI paths from route schemas and metadata', async () => {
|
|
9
|
-
const router = new Router()
|
|
10
|
-
router.add({
|
|
11
|
-
path: '/users/:id',
|
|
12
|
-
method: HttpMethod.GET,
|
|
13
|
-
schema: {
|
|
14
|
-
request: {
|
|
15
|
-
path: {
|
|
16
|
-
type: 'object',
|
|
17
|
-
properties: {
|
|
18
|
-
id: { type: 'string' },
|
|
19
|
-
},
|
|
20
|
-
required: ['id'],
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
response: {
|
|
24
|
-
body: {
|
|
25
|
-
200: {
|
|
26
|
-
type: 'object',
|
|
27
|
-
properties: {
|
|
28
|
-
id: { type: 'string' },
|
|
29
|
-
email: { type: 'string', format: 'email' },
|
|
30
|
-
},
|
|
31
|
-
required: ['id', 'email'],
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
meta: {
|
|
37
|
-
openapi: {
|
|
38
|
-
summary: 'Get user',
|
|
39
|
-
responses: {
|
|
40
|
-
404: { description: 'Not found' },
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
handler: () => new Response('ok'),
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
router.add({
|
|
48
|
-
path: '/swagger.json',
|
|
49
|
-
method: HttpMethod.GET,
|
|
50
|
-
handler: openapi({
|
|
51
|
-
info: {
|
|
52
|
-
title: 'Example API',
|
|
53
|
-
version: '1.0.0',
|
|
54
|
-
description: 'Demo API',
|
|
55
|
-
},
|
|
56
|
-
servers: [{ url: 'https://api.example.com' }],
|
|
57
|
-
components: {
|
|
58
|
-
schemas: {
|
|
59
|
-
User: {
|
|
60
|
-
type: 'object',
|
|
61
|
-
required: ['id', 'email'],
|
|
62
|
-
properties: {
|
|
63
|
-
id: { type: 'string' },
|
|
64
|
-
email: { type: 'string', format: 'email' },
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
},
|
|
69
|
-
security: [{ bearerAuth: [] }],
|
|
70
|
-
}),
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
const response = await router.fetch(new Request('https://example.com/swagger.json'))
|
|
74
|
-
const document = (await response.json()) as any
|
|
75
|
-
|
|
76
|
-
expect(document.openapi).toBe('3.0.3')
|
|
77
|
-
expect(document.info).toEqual({
|
|
78
|
-
title: 'Example API',
|
|
79
|
-
version: '1.0.0',
|
|
80
|
-
description: 'Demo API',
|
|
81
|
-
})
|
|
82
|
-
expect(document.servers).toEqual([{ url: 'https://api.example.com' }])
|
|
83
|
-
expect(document.paths['/users/{id}'].get.summary).toBe('Get user')
|
|
84
|
-
expect(document.paths['/users/{id}'].get.responses['200'].description).toBe('OK')
|
|
85
|
-
expect(document.paths['/users/{id}'].get.parameters).toEqual([
|
|
86
|
-
{
|
|
87
|
-
name: 'id',
|
|
88
|
-
in: 'path',
|
|
89
|
-
required: true,
|
|
90
|
-
schema: { type: 'string' },
|
|
91
|
-
},
|
|
92
|
-
])
|
|
93
|
-
expect(document.components.schemas.User.properties.email.format).toBe('email')
|
|
94
|
-
expect(document.security).toEqual([{ bearerAuth: [] }])
|
|
95
|
-
})
|
|
96
|
-
})
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '../handlers/openapi/openapi'
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { CommonContentTypes } from '@mpen/http'
|
|
2
|
-
import type { RouterBodyInit } from '../fetch-types'
|
|
3
|
-
|
|
4
|
-
type MaybePromise<T> = T | Promise<T>
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Serializer used by the router when a logical response has no explicit `Content-Type`.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```ts
|
|
11
|
-
* const json = jsonResponseBodySerializer()
|
|
12
|
-
* ```
|
|
13
|
-
*/
|
|
14
|
-
export interface ResponseBodySerializer<T = unknown> {
|
|
15
|
-
/**
|
|
16
|
-
* Media types this serializer can produce. Entries may include an Accept-style
|
|
17
|
-
* `q` parameter for server-side preference during content negotiation.
|
|
18
|
-
*/
|
|
19
|
-
mediaTypes: readonly string[]
|
|
20
|
-
/**
|
|
21
|
-
* Return `true` when this serializer can encode the provided value.
|
|
22
|
-
*
|
|
23
|
-
* @param value - Logical response body to inspect.
|
|
24
|
-
* @returns Whether `value` can be serialized by this serializer.
|
|
25
|
-
*/
|
|
26
|
-
canSerialize?(value: unknown): value is T
|
|
27
|
-
/**
|
|
28
|
-
* Encode a logical response body into a native Fetch response body.
|
|
29
|
-
*
|
|
30
|
-
* @param value - Logical response body to encode.
|
|
31
|
-
* @returns Native response body data.
|
|
32
|
-
*/
|
|
33
|
-
serialize(value: T): MaybePromise<RouterBodyInit | null>
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Create the default JSON response body serializer.
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```ts
|
|
41
|
-
* const router = new Router().setResponseBodySerializers([jsonResponseBodySerializer()])
|
|
42
|
-
* ```
|
|
43
|
-
*
|
|
44
|
-
* @returns Serializer for `application/json`.
|
|
45
|
-
*/
|
|
46
|
-
export function jsonResponseBodySerializer(): ResponseBodySerializer<unknown> {
|
|
47
|
-
return {
|
|
48
|
-
mediaTypes: [CommonContentTypes.JSON],
|
|
49
|
-
canSerialize: (_value): _value is unknown => true,
|
|
50
|
-
serialize: (value) => (value === undefined ? null : JSON.stringify(value)),
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Create the default response body serializer list.
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* ```ts
|
|
59
|
-
* const serializers = defaultResponseBodySerializers()
|
|
60
|
-
* ```
|
|
61
|
-
*
|
|
62
|
-
* @returns Default response body serializers.
|
|
63
|
-
*/
|
|
64
|
-
export function defaultResponseBodySerializers(): ResponseBodySerializer[] {
|
|
65
|
-
return [jsonResponseBodySerializer()]
|
|
66
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
export function createStartStream<R = any>(
|
|
2
|
-
fn: (controller: ReadableStreamDefaultController<R>) => void | Promise<void>,
|
|
3
|
-
) {
|
|
4
|
-
return new ReadableStream({
|
|
5
|
-
start(controller) {
|
|
6
|
-
fn(controller)
|
|
7
|
-
},
|
|
8
|
-
})
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
interface StreamWriter<R = any> {
|
|
12
|
-
write(chunk: R): void
|
|
13
|
-
// error(e?: any): void
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function createAsyncStream<R = any>(
|
|
17
|
-
fn: (controller: StreamWriter<R>) => void | Promise<void>,
|
|
18
|
-
) {
|
|
19
|
-
return new ReadableStream({
|
|
20
|
-
start(controller) {
|
|
21
|
-
const writer: StreamWriter<R> = {
|
|
22
|
-
write: controller.enqueue.bind(controller),
|
|
23
|
-
// error: controller.error.bind(controller),
|
|
24
|
-
}
|
|
25
|
-
Promise.try(fn, writer).then(
|
|
26
|
-
() => {
|
|
27
|
-
controller.close()
|
|
28
|
-
},
|
|
29
|
-
(err) => {
|
|
30
|
-
controller.error(err)
|
|
31
|
-
},
|
|
32
|
-
)
|
|
33
|
-
},
|
|
34
|
-
})
|
|
35
|
-
}
|