@mpen/routekit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +526 -0
  2. package/dist/bin.mjs +574 -0
  3. package/package.json +95 -0
  4. package/src/bin/gen-api-client.test.ts +70 -0
  5. package/src/bin/gen-api-client.ts +986 -0
  6. package/src/client/headers.ts +31 -0
  7. package/src/client/index.ts +8 -0
  8. package/src/client/promise.ts +11 -0
  9. package/src/client/react/index.test.tsx +266 -0
  10. package/src/client/react/index.ts +431 -0
  11. package/src/client/responses.test.ts +151 -0
  12. package/src/client/responses.ts +278 -0
  13. package/src/client/transport.ts +74 -0
  14. package/src/client/transports/body-codec.ts +61 -0
  15. package/src/client/transports/fetch.ts +113 -0
  16. package/src/client/tsconfig.json +9 -0
  17. package/src/client/types.ts +15 -0
  18. package/src/client/url.ts +31 -0
  19. package/src/index.ts +63 -0
  20. package/src/router/fetch-types.ts +13 -0
  21. package/src/router/handlers/index.ts +2 -0
  22. package/src/router/handlers/openapi/index.ts +2 -0
  23. package/src/router/handlers/openapi/openapi.ts +293 -0
  24. package/src/router/integration/zod-openapi.test.ts +74 -0
  25. package/src/router/lib/charset.test.ts +22 -0
  26. package/src/router/lib/charset.ts +133 -0
  27. package/src/router/lib/collections.ts +3 -0
  28. package/src/router/lib/format.test.ts +67 -0
  29. package/src/router/lib/format.ts +35 -0
  30. package/src/router/lib/host.ts +4 -0
  31. package/src/router/lib/json-schema.ts +6 -0
  32. package/src/router/lib/media-type.test.ts +122 -0
  33. package/src/router/lib/media-type.ts +289 -0
  34. package/src/router/lib/pathname.test.ts +18 -0
  35. package/src/router/lib/pathname.ts +19 -0
  36. package/src/router/lib/route-names.ts +70 -0
  37. package/src/router/lib/route-normalize.test.ts +36 -0
  38. package/src/router/lib/route-normalize.ts +67 -0
  39. package/src/router/lib/schema-merge.ts +56 -0
  40. package/src/router/middleware/accept-ctx.test.ts +33 -0
  41. package/src/router/middleware/accept-ctx.ts +12 -0
  42. package/src/router/middleware/body-limit.test.ts +112 -0
  43. package/src/router/middleware/body-limit.ts +121 -0
  44. package/src/router/middleware/content-type-context.ts +0 -0
  45. package/src/router/middleware/cors.test.ts +269 -0
  46. package/src/router/middleware/cors.ts +490 -0
  47. package/src/router/middleware/csrf.test.ts +106 -0
  48. package/src/router/middleware/csrf.ts +192 -0
  49. package/src/router/middleware/define.ts +249 -0
  50. package/src/router/middleware/index.ts +34 -0
  51. package/src/router/middleware/jsxhtml-response.ts +0 -0
  52. package/src/router/middleware/oas-swagger.ts +0 -0
  53. package/src/router/middleware/rate-limit.test.ts +886 -0
  54. package/src/router/middleware/rate-limit.ts +920 -0
  55. package/src/router/middleware/request-id-ctx.test.ts +183 -0
  56. package/src/router/middleware/request-id-ctx.ts +135 -0
  57. package/src/router/middleware/request-logger-format.test.ts +16 -0
  58. package/src/router/middleware/request-logger-format.ts +269 -0
  59. package/src/router/middleware/request-logger.test.ts +267 -0
  60. package/src/router/middleware/request-logger.ts +131 -0
  61. package/src/router/middleware/start-time-ctx.ts +5 -0
  62. package/src/router/request.ts +611 -0
  63. package/src/router/response/core.ts +181 -0
  64. package/src/router/response/directives.ts +233 -0
  65. package/src/router/response/formats/content/bodyless.ts +54 -0
  66. package/src/router/response/formats/content/content.ts +79 -0
  67. package/src/router/response/formats/content/index.ts +2 -0
  68. package/src/router/response/formats/json-rpc/index.ts +2 -0
  69. package/src/router/response/formats/problem/badRequest.ts +90 -0
  70. package/src/router/response/formats/problem/conflict.ts +90 -0
  71. package/src/router/response/formats/problem/created.ts +40 -0
  72. package/src/router/response/formats/problem/index.ts +27 -0
  73. package/src/router/response/formats/problem/notFound.ts +90 -0
  74. package/src/router/response/formats/problem/permissionDenied.ts +90 -0
  75. package/src/router/response/formats/problem/problem.test.ts +888 -0
  76. package/src/router/response/formats/problem/rateLimited.ts +90 -0
  77. package/src/router/response/formats/problem/responses.ts +219 -0
  78. package/src/router/response/formats/problem/root-errors.ts +48 -0
  79. package/src/router/response/formats/problem/sessionExpired.ts +90 -0
  80. package/src/router/response/formats/problem/types.ts +170 -0
  81. package/src/router/response/formats/problem/unauthenticated.ts +90 -0
  82. package/src/router/response/formats/problem/valibot.ts +410 -0
  83. package/src/router/response/formats/status/index.ts +1 -0
  84. package/src/router/response/formats/status/responses.ts +59 -0
  85. package/src/router/response/formats/status/status.test.ts +21 -0
  86. package/src/router/response/framers.ts +85 -0
  87. package/src/router/response/index.ts +28 -0
  88. package/src/router/response/openapi.test.ts +96 -0
  89. package/src/router/response/openapi.ts +1 -0
  90. package/src/router/response/serializers.ts +66 -0
  91. package/src/router/response/stream.ts +35 -0
  92. package/src/router/router.test.ts +1571 -0
  93. package/src/router/router.ts +1965 -0
  94. package/src/router/routes/index.ts +46 -0
  95. package/src/router/routes/valibot/index.ts +18 -0
  96. package/src/router/routes/valibot/valibot.ts +1393 -0
  97. package/src/router/routes/valibot.test.ts +286 -0
  98. package/src/router/routes/zod/index.ts +18 -0
  99. package/src/router/routes/zod/zod.ts +1318 -0
  100. package/src/router/routes/zod.test.ts +280 -0
  101. package/src/router/server-interface.ts +31 -0
  102. package/src/router/types.ts +657 -0
@@ -0,0 +1,70 @@
1
+ import { describe, expect, test } from 'bun:test'
2
+ import { $ } from 'bun'
3
+ import path from 'node:path'
4
+ import { fileURLToPath } from 'node:url'
5
+ import { main } from './gen-api-client'
6
+
7
+ const packageDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..')
8
+ const binPath = path.join(packageDir, 'src/bin/gen-api-client.ts')
9
+
10
+ async function generate(args: string[]): Promise<string> {
11
+ const result = await $`bun ${binPath} ${args}`.cwd(packageDir).quiet()
12
+ return result.stdout.toString()
13
+ }
14
+
15
+ describe(main.name, () => {
16
+ test('emits the rk-api-client format by default', async () => {
17
+ const output = await generate(['./examples/example3/server/router.ts'])
18
+
19
+ expect(output).toContain('export class ApiClient')
20
+ expect(output).not.toContain('createApiQueryHelpers')
21
+ expect(output).not.toContain('@tanstack/react-query')
22
+ })
23
+
24
+ test('emits tanstack query helpers for routekit problem responses', async () => {
25
+ const output = await generate([
26
+ './examples/react-todo-app/server/api-router.ts',
27
+ '--format=ts-query-rk-problem',
28
+ ])
29
+
30
+ expect(output).toContain(
31
+ "import { mutationOptions, queryOptions } from '@tanstack/react-query'",
32
+ )
33
+ expect(output).toContain('export function createApiQueryHelpers')
34
+ expect(output).not.toContain('export class ApiClient')
35
+ expect(output).toContain(
36
+ 'export type GetTodosListData = RoutekitProblemSuccessData<GetTodosListResponse200>',
37
+ )
38
+ expect(output).toContain(
39
+ 'export type GetTodosListProblem = GetTodosListResponse400 | GetTodosListResponse401 | GetTodosListResponse422',
40
+ )
41
+ expect(output).toContain(
42
+ 'export type GetTodosListError = RoutekitProblemError<GetTodosListProblem>',
43
+ )
44
+ expect(output).toContain('get: (query: GetTodosListQuery) => {')
45
+ expect(output).toContain('return queryOptions<GetTodosListData, GetTodosListError>({')
46
+ expect(output).toContain('post: () => {')
47
+ expect(output).toContain(
48
+ 'return mutationOptions<PostTodosCreateData, PostTodosCreateError, PostTodosCreateRequest>({',
49
+ )
50
+ expect(output).toContain(
51
+ 'mutationFn: (body: PostTodosCreateRequest): Promise<PostTodosCreateData> => {',
52
+ )
53
+ expect(output).toContain('export interface PatchTodosUpdateVariables')
54
+ expect(output).toContain(
55
+ 'path: PatchTodosUpdatePathParams | SinglePathParam<PatchTodosUpdatePathParams, "id">',
56
+ )
57
+ })
58
+
59
+ test('rejects unknown formats', async () => {
60
+ const result = await $`bun ${binPath} ./examples/example3/server/router.ts --format=unknown`
61
+ .cwd(packageDir)
62
+ .quiet()
63
+ .nothrow()
64
+
65
+ expect(result.exitCode).toBe(1)
66
+ expect(result.stderr.toString()).toContain(
67
+ 'Invalid --format value: "unknown". Expected one of: rk-api-client, ts-query-rk-problem',
68
+ )
69
+ })
70
+ })