@beignet/core 0.0.1

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 (331) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +288 -0
  3. package/dist/application/index.d.ts +260 -0
  4. package/dist/application/index.d.ts.map +1 -0
  5. package/dist/application/index.js +324 -0
  6. package/dist/application/index.js.map +1 -0
  7. package/dist/client/client.d.ts +241 -0
  8. package/dist/client/client.d.ts.map +1 -0
  9. package/dist/client/client.js +531 -0
  10. package/dist/client/client.js.map +1 -0
  11. package/dist/client/index.d.ts +10 -0
  12. package/dist/client/index.d.ts.map +1 -0
  13. package/dist/client/index.js +8 -0
  14. package/dist/client/index.js.map +1 -0
  15. package/dist/client/types.d.ts +139 -0
  16. package/dist/client/types.d.ts.map +1 -0
  17. package/dist/client/types.js +2 -0
  18. package/dist/client/types.js.map +1 -0
  19. package/dist/config/index.d.ts +122 -0
  20. package/dist/config/index.d.ts.map +1 -0
  21. package/dist/config/index.js +216 -0
  22. package/dist/config/index.js.map +1 -0
  23. package/dist/contracts/contract-builder.d.ts +121 -0
  24. package/dist/contracts/contract-builder.d.ts.map +1 -0
  25. package/dist/contracts/contract-builder.js +346 -0
  26. package/dist/contracts/contract-builder.js.map +1 -0
  27. package/dist/contracts/contract-group.d.ts +106 -0
  28. package/dist/contracts/contract-group.d.ts.map +1 -0
  29. package/dist/contracts/contract-group.js +240 -0
  30. package/dist/contracts/contract-group.js.map +1 -0
  31. package/dist/contracts/contract-like.d.ts +21 -0
  32. package/dist/contracts/contract-like.d.ts.map +1 -0
  33. package/dist/contracts/contract-like.js +9 -0
  34. package/dist/contracts/contract-like.js.map +1 -0
  35. package/dist/contracts/index.d.ts +15 -0
  36. package/dist/contracts/index.d.ts.map +1 -0
  37. package/dist/contracts/index.js +11 -0
  38. package/dist/contracts/index.js.map +1 -0
  39. package/dist/contracts/openapi-meta.d.ts +23 -0
  40. package/dist/contracts/openapi-meta.d.ts.map +1 -0
  41. package/dist/contracts/openapi-meta.js +2 -0
  42. package/dist/contracts/openapi-meta.js.map +1 -0
  43. package/dist/contracts/path-template.d.ts +17 -0
  44. package/dist/contracts/path-template.d.ts.map +1 -0
  45. package/dist/contracts/path-template.js +50 -0
  46. package/dist/contracts/path-template.js.map +1 -0
  47. package/dist/contracts/rate-limit.d.ts +50 -0
  48. package/dist/contracts/rate-limit.d.ts.map +1 -0
  49. package/dist/contracts/rate-limit.js +2 -0
  50. package/dist/contracts/rate-limit.js.map +1 -0
  51. package/dist/contracts/types.d.ts +97 -0
  52. package/dist/contracts/types.d.ts.map +1 -0
  53. package/dist/contracts/types.js +54 -0
  54. package/dist/contracts/types.js.map +1 -0
  55. package/dist/contracts/utils.d.ts +3 -0
  56. package/dist/contracts/utils.d.ts.map +1 -0
  57. package/dist/contracts/utils.js +44 -0
  58. package/dist/contracts/utils.js.map +1 -0
  59. package/dist/domain/entity.d.ts +87 -0
  60. package/dist/domain/entity.d.ts.map +1 -0
  61. package/dist/domain/entity.js +155 -0
  62. package/dist/domain/entity.js.map +1 -0
  63. package/dist/domain/events.d.ts +41 -0
  64. package/dist/domain/events.d.ts.map +1 -0
  65. package/dist/domain/events.js +21 -0
  66. package/dist/domain/events.js.map +1 -0
  67. package/dist/domain/index.d.ts +14 -0
  68. package/dist/domain/index.d.ts.map +1 -0
  69. package/dist/domain/index.js +14 -0
  70. package/dist/domain/index.js.map +1 -0
  71. package/dist/domain/value-object.d.ts +60 -0
  72. package/dist/domain/value-object.d.ts.map +1 -0
  73. package/dist/domain/value-object.js +87 -0
  74. package/dist/domain/value-object.js.map +1 -0
  75. package/dist/errors/catalog.d.ts +71 -0
  76. package/dist/errors/catalog.d.ts.map +1 -0
  77. package/dist/errors/catalog.js +71 -0
  78. package/dist/errors/catalog.js.map +1 -0
  79. package/dist/errors/http.d.ts +77 -0
  80. package/dist/errors/http.d.ts.map +1 -0
  81. package/dist/errors/http.js +74 -0
  82. package/dist/errors/http.js.map +1 -0
  83. package/dist/errors/index.d.ts +10 -0
  84. package/dist/errors/index.d.ts.map +1 -0
  85. package/dist/errors/index.js +14 -0
  86. package/dist/errors/index.js.map +1 -0
  87. package/dist/errors/response.d.ts +26 -0
  88. package/dist/errors/response.d.ts.map +1 -0
  89. package/dist/errors/response.js +34 -0
  90. package/dist/errors/response.js.map +1 -0
  91. package/dist/errors/validation.d.ts +18 -0
  92. package/dist/errors/validation.d.ts.map +1 -0
  93. package/dist/errors/validation.js +21 -0
  94. package/dist/errors/validation.js.map +1 -0
  95. package/dist/events/index.d.ts +58 -0
  96. package/dist/events/index.d.ts.map +1 -0
  97. package/dist/events/index.js +102 -0
  98. package/dist/events/index.js.map +1 -0
  99. package/dist/jobs/index.d.ts +56 -0
  100. package/dist/jobs/index.d.ts.map +1 -0
  101. package/dist/jobs/index.js +89 -0
  102. package/dist/jobs/index.js.map +1 -0
  103. package/dist/mail/index.d.ts +75 -0
  104. package/dist/mail/index.d.ts.map +1 -0
  105. package/dist/mail/index.js +84 -0
  106. package/dist/mail/index.js.map +1 -0
  107. package/dist/openapi/index.d.ts +207 -0
  108. package/dist/openapi/index.d.ts.map +1 -0
  109. package/dist/openapi/index.js +449 -0
  110. package/dist/openapi/index.js.map +1 -0
  111. package/dist/openapi/schema-introspector.d.ts +38 -0
  112. package/dist/openapi/schema-introspector.d.ts.map +1 -0
  113. package/dist/openapi/schema-introspector.js +67 -0
  114. package/dist/openapi/schema-introspector.js.map +1 -0
  115. package/dist/ports/audit.d.ts +58 -0
  116. package/dist/ports/audit.d.ts.map +1 -0
  117. package/dist/ports/audit.js +74 -0
  118. package/dist/ports/audit.js.map +1 -0
  119. package/dist/ports/auth.d.ts +23 -0
  120. package/dist/ports/auth.d.ts.map +1 -0
  121. package/dist/ports/auth.js +31 -0
  122. package/dist/ports/auth.js.map +1 -0
  123. package/dist/ports/builder.d.ts +61 -0
  124. package/dist/ports/builder.d.ts.map +1 -0
  125. package/dist/ports/builder.js +48 -0
  126. package/dist/ports/builder.js.map +1 -0
  127. package/dist/ports/cache.d.ts +15 -0
  128. package/dist/ports/cache.d.ts.map +1 -0
  129. package/dist/ports/cache.js +57 -0
  130. package/dist/ports/cache.js.map +1 -0
  131. package/dist/ports/clock.d.ts +10 -0
  132. package/dist/ports/clock.d.ts.map +1 -0
  133. package/dist/ports/clock.js +21 -0
  134. package/dist/ports/clock.js.map +1 -0
  135. package/dist/ports/events.d.ts +71 -0
  136. package/dist/ports/events.d.ts.map +1 -0
  137. package/dist/ports/events.js +2 -0
  138. package/dist/ports/events.js.map +1 -0
  139. package/dist/ports/id-generator.d.ts +12 -0
  140. package/dist/ports/id-generator.d.ts.map +1 -0
  141. package/dist/ports/id-generator.js +22 -0
  142. package/dist/ports/id-generator.js.map +1 -0
  143. package/dist/ports/index.d.ts +98 -0
  144. package/dist/ports/index.d.ts.map +1 -0
  145. package/dist/ports/index.js +67 -0
  146. package/dist/ports/index.js.map +1 -0
  147. package/dist/ports/logger.d.ts +22 -0
  148. package/dist/ports/logger.d.ts.map +1 -0
  149. package/dist/ports/logger.js +34 -0
  150. package/dist/ports/logger.js.map +1 -0
  151. package/dist/ports/mailer.d.ts +6 -0
  152. package/dist/ports/mailer.d.ts.map +1 -0
  153. package/dist/ports/mailer.js +2 -0
  154. package/dist/ports/mailer.js.map +1 -0
  155. package/dist/ports/policy.d.ts +53 -0
  156. package/dist/ports/policy.d.ts.map +1 -0
  157. package/dist/ports/policy.js +81 -0
  158. package/dist/ports/policy.js.map +1 -0
  159. package/dist/ports/rate-limit.d.ts +41 -0
  160. package/dist/ports/rate-limit.d.ts.map +1 -0
  161. package/dist/ports/rate-limit.js +37 -0
  162. package/dist/ports/rate-limit.js.map +1 -0
  163. package/dist/ports/redaction.d.ts +26 -0
  164. package/dist/ports/redaction.d.ts.map +1 -0
  165. package/dist/ports/redaction.js +126 -0
  166. package/dist/ports/redaction.js.map +1 -0
  167. package/dist/ports/schedules.d.ts +9 -0
  168. package/dist/ports/schedules.d.ts.map +1 -0
  169. package/dist/ports/schedules.js +2 -0
  170. package/dist/ports/schedules.js.map +1 -0
  171. package/dist/ports/storage.d.ts +47 -0
  172. package/dist/ports/storage.d.ts.map +1 -0
  173. package/dist/ports/storage.js +185 -0
  174. package/dist/ports/storage.js.map +1 -0
  175. package/dist/ports/testing.d.ts +73 -0
  176. package/dist/ports/testing.d.ts.map +1 -0
  177. package/dist/ports/testing.js +105 -0
  178. package/dist/ports/testing.js.map +1 -0
  179. package/dist/ports/unit-of-work.d.ts +56 -0
  180. package/dist/ports/unit-of-work.d.ts.map +1 -0
  181. package/dist/ports/unit-of-work.js +64 -0
  182. package/dist/ports/unit-of-work.js.map +1 -0
  183. package/dist/providers/index.d.ts +8 -0
  184. package/dist/providers/index.d.ts.map +1 -0
  185. package/dist/providers/index.js +8 -0
  186. package/dist/providers/index.js.map +1 -0
  187. package/dist/providers/instrumentation.d.ts +91 -0
  188. package/dist/providers/instrumentation.d.ts.map +1 -0
  189. package/dist/providers/instrumentation.js +93 -0
  190. package/dist/providers/instrumentation.js.map +1 -0
  191. package/dist/providers/provider.d.ts +146 -0
  192. package/dist/providers/provider.d.ts.map +1 -0
  193. package/dist/providers/provider.js +31 -0
  194. package/dist/providers/provider.js.map +1 -0
  195. package/dist/schedules/index.d.ts +105 -0
  196. package/dist/schedules/index.d.ts.map +1 -0
  197. package/dist/schedules/index.js +178 -0
  198. package/dist/schedules/index.js.map +1 -0
  199. package/dist/server/contract-like.d.ts +5 -0
  200. package/dist/server/contract-like.d.ts.map +1 -0
  201. package/dist/server/contract-like.js +5 -0
  202. package/dist/server/contract-like.js.map +1 -0
  203. package/dist/server/health.d.ts +41 -0
  204. package/dist/server/health.d.ts.map +1 -0
  205. package/dist/server/health.js +46 -0
  206. package/dist/server/health.js.map +1 -0
  207. package/dist/server/hooks/auth.d.ts +42 -0
  208. package/dist/server/hooks/auth.d.ts.map +1 -0
  209. package/dist/server/hooks/auth.js +61 -0
  210. package/dist/server/hooks/auth.js.map +1 -0
  211. package/dist/server/hooks/cors.d.ts +13 -0
  212. package/dist/server/hooks/cors.d.ts.map +1 -0
  213. package/dist/server/hooks/cors.js +70 -0
  214. package/dist/server/hooks/cors.js.map +1 -0
  215. package/dist/server/hooks/errors.d.ts +66 -0
  216. package/dist/server/hooks/errors.d.ts.map +1 -0
  217. package/dist/server/hooks/errors.js +83 -0
  218. package/dist/server/hooks/errors.js.map +1 -0
  219. package/dist/server/hooks/index.d.ts +12 -0
  220. package/dist/server/hooks/index.d.ts.map +1 -0
  221. package/dist/server/hooks/index.js +12 -0
  222. package/dist/server/hooks/index.js.map +1 -0
  223. package/dist/server/hooks/logging.d.ts +33 -0
  224. package/dist/server/hooks/logging.d.ts.map +1 -0
  225. package/dist/server/hooks/logging.js +90 -0
  226. package/dist/server/hooks/logging.js.map +1 -0
  227. package/dist/server/hooks/rate-limit.d.ts +29 -0
  228. package/dist/server/hooks/rate-limit.d.ts.map +1 -0
  229. package/dist/server/hooks/rate-limit.js +93 -0
  230. package/dist/server/hooks/rate-limit.js.map +1 -0
  231. package/dist/server/hooks/utils.d.ts +9 -0
  232. package/dist/server/hooks/utils.d.ts.map +1 -0
  233. package/dist/server/hooks/utils.js +16 -0
  234. package/dist/server/hooks/utils.js.map +1 -0
  235. package/dist/server/hooks.d.ts +2 -0
  236. package/dist/server/hooks.d.ts.map +1 -0
  237. package/dist/server/hooks.js +2 -0
  238. package/dist/server/hooks.js.map +1 -0
  239. package/dist/server/http.d.ts +124 -0
  240. package/dist/server/http.d.ts.map +1 -0
  241. package/dist/server/http.js +2 -0
  242. package/dist/server/http.js.map +1 -0
  243. package/dist/server/index.d.ts +19 -0
  244. package/dist/server/index.d.ts.map +1 -0
  245. package/dist/server/index.js +15 -0
  246. package/dist/server/index.js.map +1 -0
  247. package/dist/server/openapi.d.ts +32 -0
  248. package/dist/server/openapi.d.ts.map +1 -0
  249. package/dist/server/openapi.js +43 -0
  250. package/dist/server/openapi.js.map +1 -0
  251. package/dist/server/providers/index.d.ts +4 -0
  252. package/dist/server/providers/index.d.ts.map +1 -0
  253. package/dist/server/providers/index.js +4 -0
  254. package/dist/server/providers/index.js.map +1 -0
  255. package/dist/server/providers/loadProviderConfig.d.ts +7 -0
  256. package/dist/server/providers/loadProviderConfig.d.ts.map +1 -0
  257. package/dist/server/providers/loadProviderConfig.js +42 -0
  258. package/dist/server/providers/loadProviderConfig.js.map +1 -0
  259. package/dist/server/server.d.ts +86 -0
  260. package/dist/server/server.d.ts.map +1 -0
  261. package/dist/server/server.js +1031 -0
  262. package/dist/server/server.js.map +1 -0
  263. package/dist/server/types.d.ts +3 -0
  264. package/dist/server/types.d.ts.map +1 -0
  265. package/dist/server/types.js +3 -0
  266. package/dist/server/types.js.map +1 -0
  267. package/package.json +129 -0
  268. package/src/application/index.ts +747 -0
  269. package/src/client/client.ts +1105 -0
  270. package/src/client/index.ts +45 -0
  271. package/src/client/types.ts +305 -0
  272. package/src/config/index.ts +497 -0
  273. package/src/contracts/contract-builder.ts +583 -0
  274. package/src/contracts/contract-group.ts +502 -0
  275. package/src/contracts/contract-like.ts +29 -0
  276. package/src/contracts/index.ts +53 -0
  277. package/src/contracts/openapi-meta.ts +22 -0
  278. package/src/contracts/path-template.ts +91 -0
  279. package/src/contracts/rate-limit.ts +50 -0
  280. package/src/contracts/types.ts +207 -0
  281. package/src/contracts/utils.ts +56 -0
  282. package/src/domain/entity.ts +256 -0
  283. package/src/domain/events.ts +52 -0
  284. package/src/domain/index.ts +18 -0
  285. package/src/domain/value-object.ts +135 -0
  286. package/src/errors/catalog.ts +149 -0
  287. package/src/errors/http.ts +80 -0
  288. package/src/errors/index.ts +28 -0
  289. package/src/errors/response.ts +54 -0
  290. package/src/errors/validation.ts +35 -0
  291. package/src/events/index.ts +246 -0
  292. package/src/jobs/index.ts +211 -0
  293. package/src/mail/index.ts +177 -0
  294. package/src/openapi/index.ts +865 -0
  295. package/src/openapi/schema-introspector.ts +107 -0
  296. package/src/ports/audit.ts +176 -0
  297. package/src/ports/auth.ts +76 -0
  298. package/src/ports/builder.ts +97 -0
  299. package/src/ports/cache.ts +94 -0
  300. package/src/ports/clock.ts +34 -0
  301. package/src/ports/events.ts +100 -0
  302. package/src/ports/id-generator.ts +36 -0
  303. package/src/ports/index.ts +221 -0
  304. package/src/ports/logger.ts +67 -0
  305. package/src/ports/policy.ts +242 -0
  306. package/src/ports/rate-limit.ts +91 -0
  307. package/src/ports/redaction.ts +199 -0
  308. package/src/ports/storage.ts +282 -0
  309. package/src/ports/testing.ts +234 -0
  310. package/src/ports/unit-of-work.ts +134 -0
  311. package/src/providers/index.ts +40 -0
  312. package/src/providers/instrumentation.ts +248 -0
  313. package/src/providers/provider.ts +191 -0
  314. package/src/schedules/index.ts +442 -0
  315. package/src/server/contract-like.ts +8 -0
  316. package/src/server/health.ts +82 -0
  317. package/src/server/hooks/auth.ts +147 -0
  318. package/src/server/hooks/cors.ts +87 -0
  319. package/src/server/hooks/errors.ts +126 -0
  320. package/src/server/hooks/index.ts +43 -0
  321. package/src/server/hooks/logging.ts +121 -0
  322. package/src/server/hooks/rate-limit.ts +171 -0
  323. package/src/server/hooks/utils.ts +16 -0
  324. package/src/server/hooks.ts +1 -0
  325. package/src/server/http.ts +189 -0
  326. package/src/server/index.ts +35 -0
  327. package/src/server/openapi.ts +72 -0
  328. package/src/server/providers/index.ts +3 -0
  329. package/src/server/providers/loadProviderConfig.ts +72 -0
  330. package/src/server/server.ts +1521 -0
  331. package/src/server/types.ts +2 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # @beignet/core
2
+
3
+ ## 0.0.1
4
+
5
+ - Initial Beignet release under the `@beignet` npm scope.
package/README.md ADDED
@@ -0,0 +1,288 @@
1
+ # @beignet/core
2
+
3
+ > Core framework primitives for Beignet
4
+
5
+ This package provides Beignet's framework primitives: contracts, server runtime,
6
+ typed client, use cases, ports, domain helpers, app errors, config, events,
7
+ mail, schedules, and OpenAPI generation.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install @beignet/core
13
+
14
+ # Use with your preferred Standard Schema library
15
+ npm install zod
16
+ # or
17
+ npm install valibot
18
+ # or
19
+ npm install arktype
20
+ ```
21
+
22
+
23
+ ## TypeScript requirements
24
+
25
+ This package requires TypeScript 5.0 or higher for proper type inference.
26
+
27
+ ## Subpaths
28
+
29
+ Install `@beignet/core` once, then import the framework area you need. The
30
+ package intentionally has no root entrypoint; use explicit subpaths so imports
31
+ name the framework area they depend on.
32
+
33
+ | Import path | Responsibility |
34
+ | --- | --- |
35
+ | `@beignet/core/application` | Use case builder and test helpers |
36
+ | `@beignet/core/client` | Typed HTTP client |
37
+ | `@beignet/core/config` | Environment config validation |
38
+ | `@beignet/core/contracts` | HTTP contract builders, types, path helpers, and contract metadata |
39
+ | `@beignet/core/domain` | Entities, value objects, and domain events |
40
+ | `@beignet/core/errors` | Error catalogs and response helpers |
41
+ | `@beignet/core/events` | Events and listeners |
42
+ | `@beignet/core/jobs` | Job definitions and inline job dispatch |
43
+ | `@beignet/core/mail` | Mail port and memory mailer |
44
+ | `@beignet/core/openapi` | OpenAPI generation |
45
+ | `@beignet/core/ports` | App-facing ports, auth, audit, policies, cache, storage, logging, and redaction |
46
+ | `@beignet/core/ports/testing` | Port and policy test helpers |
47
+ | `@beignet/core/providers` | Provider lifecycle and instrumentation primitives |
48
+ | `@beignet/core/schedules` | Scheduled task primitives |
49
+ | `@beignet/core/server` | Framework-agnostic server runtime and hook helpers |
50
+
51
+ ## Key concepts
52
+
53
+ ### Contract
54
+
55
+ A **contract** is the single source of truth for an API endpoint. It describes:
56
+
57
+ - HTTP method and path (with path parameters)
58
+ - Path parameters, query parameters, request headers, and request body schemas
59
+ - Response schemas (per status code, including error responses)
60
+ - Metadata for auth, rate limiting, idempotency, etc.
61
+
62
+ ### Contract group
63
+
64
+ A **contract group** allows you to share configuration across related endpoints, such as a common namespace, authentication requirements, and shared response schemas.
65
+
66
+ ## Usage
67
+
68
+ ### Defining contracts
69
+
70
+ ```ts
71
+ import { z } from "zod";
72
+ import { createContractGroup } from "@beignet/core/contracts";
73
+
74
+ // Create a contract group for related endpoints
75
+ const todos = createContractGroup()
76
+ .namespace("todos")
77
+ .prefix("/api/todos")
78
+ .meta({ auth: "required" })
79
+ .headers(z.object({
80
+ authorization: z.string().startsWith("Bearer "),
81
+ }));
82
+
83
+ // Define schemas
84
+ const TodoSchema = z.object({
85
+ id: z.string(),
86
+ title: z.string(),
87
+ completed: z.boolean(),
88
+ });
89
+
90
+ const CreateTodoRequest = z.object({
91
+ title: z.string().min(1),
92
+ completed: z.boolean().optional(),
93
+ });
94
+
95
+ // Define contracts
96
+ export const getTodo = todos
97
+ .get("/:id")
98
+ .pathParams(z.object({ id: z.string() }))
99
+ .responses({ 200: TodoSchema })
100
+ .errors({
101
+ TodoNotFound: {
102
+ code: "TODO_NOT_FOUND",
103
+ status: 404,
104
+ message: "Todo not found",
105
+ details: z.object({ id: z.string() }),
106
+ },
107
+ });
108
+
109
+ export const createTodo = todos
110
+ .post("/")
111
+ .body(CreateTodoRequest)
112
+ .responses({ 201: TodoSchema });
113
+
114
+ export const listTodos = todos
115
+ .get("/")
116
+ .query(z.object({
117
+ completed: z.boolean().optional(),
118
+ limit: z.coerce.number().optional(),
119
+ }))
120
+ .responses({ 200: z.array(TodoSchema) });
121
+ ```
122
+
123
+ Clients and OpenAPI generation infer required path argument keys from literal
124
+ path templates. Use `.pathParams(...)` when you want runtime validation,
125
+ coercion, richer OpenAPI schemas, or parameter descriptions.
126
+
127
+ Use `.headers(...)` for request headers that are part of the endpoint contract. Declare header keys in lowercase; server and client runtime matching is case-insensitive.
128
+
129
+ Request bodies are supported for `POST`, `PUT`, and `PATCH` contracts only.
130
+
131
+ If you do not pass `name`, Beignet generates one from the HTTP method and full path:
132
+
133
+ ```ts
134
+ createContract({ method: "GET", path: "/users/:id" }).name;
135
+ // "getUsersById"
136
+
137
+ createContract({ method: "POST", path: "/api/todos" }).name;
138
+ // "createTodos"
139
+ ```
140
+
141
+ Auto-generated names ignore a leading `/api` segment, include path parameters as `By...`, and are used as defaults in places like React Query keys and OpenAPI `operationId`s. Pass `name` explicitly when you need a custom stable identifier.
142
+
143
+ ### Path prefixes
144
+
145
+ Use `.prefix(...)` on a contract group to compose shared URL path segments without repeating them on every route:
146
+
147
+ ```ts
148
+ const api = createContractGroup().prefix("/api/v1");
149
+
150
+ const todos = api
151
+ .namespace("todos")
152
+ .prefix("/todos");
153
+
154
+ export const listTodos = todos.get("/");
155
+ // GET /api/v1/todos
156
+
157
+ export const getTodo = todos.get("/:id");
158
+ // GET /api/v1/todos/:id
159
+ ```
160
+
161
+ Prefixes compose immutably and normalize boundary slashes. `namespace()` controls
162
+ resource identity for contract names, OpenAPI tags, and client cache grouping;
163
+ `prefix()` only controls URL paths.
164
+
165
+ ### Contract metadata
166
+
167
+ Use metadata to drive cross-cutting concerns like authentication, rate limiting, and idempotency:
168
+
169
+ ```ts
170
+ const sendMessage = messages
171
+ .post("/api/messages")
172
+ .body(SendMessageRequest)
173
+ .responses({ 201: SendMessageResponse })
174
+ .meta({
175
+ auth: "required",
176
+ idempotency: {
177
+ enabled: true,
178
+ header: "Idempotency-Key",
179
+ windowSeconds: 300,
180
+ },
181
+ rateLimit: {
182
+ max: 60,
183
+ windowSec: 60,
184
+ scope: "user",
185
+ },
186
+ });
187
+ ```
188
+
189
+ ### OpenAPI metadata
190
+
191
+ Add OpenAPI-specific metadata for documentation using the `.openapi()` method:
192
+
193
+ ```ts
194
+ export const getTodo = todos
195
+ .get("/api/todos/:id")
196
+ .pathParams(z.object({ id: z.string() }))
197
+ .responses({ 200: TodoSchema })
198
+ .openapi({
199
+ summary: "Get a todo by ID",
200
+ description: "Retrieves a single todo item by its unique identifier",
201
+ tags: ["todos"],
202
+ deprecated: false,
203
+ operationId: "getTodoById",
204
+ externalDocs: {
205
+ url: "https://docs.example.com/todos",
206
+ description: "Todo documentation",
207
+ },
208
+ security: [{ bearerAuth: [] }],
209
+ });
210
+ ```
211
+
212
+ ### Schema introspection
213
+
214
+ Contracts expose their schemas for runtime introspection:
215
+
216
+ ```ts
217
+ getTodo.schema.pathParams; // Path parameter schema
218
+ getTodo.schema.query; // Query parameter schema
219
+ getTodo.schema.body; // Request body schema
220
+ getTodo.schema.responses; // Response schemas by status code
221
+ getTodo.path; // "/api/todos/:id"
222
+ getTodo.pathTemplate; // "/api/todos/:id" (alias)
223
+ getTodo.method; // "GET"
224
+ getTodo.metadata; // { auth: "required", ... }
225
+ ```
226
+
227
+ ## API reference
228
+
229
+ ### `createContractGroup()`
230
+
231
+ Creates a new contract group for defining related endpoints.
232
+
233
+ ```ts
234
+ const group = createContractGroup()
235
+ .namespace("myNamespace") // Optional resource namespace
236
+ .prefix("/api/v1") // Optional URL path prefix
237
+ .meta({ auth: "required" }) // Shared metadata
238
+ .headers(AuthHeaders) // Shared request headers
239
+ .errors({ // Shared catalog errors
240
+ TenantSuspended: errors.TenantSuspended,
241
+ });
242
+ ```
243
+
244
+ Any non-empty response map is treated as a response contract. Include
245
+ successful statuses such as `200` or `201` alongside custom error statuses; use
246
+ `responses: {}` only when you want to skip response validation. Prefer
247
+ `.errors(...)` for expected business failures that should use Beignet's
248
+ standard error envelope.
249
+
250
+ ### Contract builder methods
251
+
252
+ | Method | Description |
253
+ |--------|-------------|
254
+ | `.get(path)` | Define a GET endpoint |
255
+ | `.post(path)` | Define a POST endpoint |
256
+ | `.put(path)` | Define a PUT endpoint |
257
+ | `.patch(path)` | Define a PATCH endpoint |
258
+ | `.delete(path)` | Define a DELETE endpoint |
259
+ | `.pathParams(schema)` | Define path parameter schema |
260
+ | `.query(schema)` | Define query parameter schema |
261
+ | `.headers(schema)` | Define request header schema |
262
+ | `.body(schema)` | Define request body schema |
263
+ | `.responses({ ... })` | Define or merge response schemas by status code |
264
+ | `.errors({ ... })` | Declare route-owned catalog errors using Beignet's standard error envelope |
265
+ | `.meta(metadata)` | Add custom metadata |
266
+ | `.openapi(options)` | Add OpenAPI metadata (summary, tags, etc.) |
267
+
268
+ ## Standard Schema support
269
+
270
+ This package works with any [Standard Schema](https://github.com/standard-schema/standard-schema) compatible library:
271
+
272
+ - **Zod** - Most popular, excellent TypeScript inference
273
+ - **Valibot** - Lightweight alternative to Zod
274
+ - **ArkType** - High-performance runtime validation
275
+
276
+ OpenAPI generation currently requires Zod schemas, even though core contracts can use any Standard Schema-compatible library.
277
+
278
+ ## Related packages
279
+
280
+ - [`@beignet/next`](https://beignet.dev/server) - Next.js server adapter
281
+ - [`@beignet/react-query`](https://beignet.dev/react-query) - TanStack Query integration
282
+ - [`@beignet/react-hook-form`](https://beignet.dev/react-hook-form) - React Hook Form integration
283
+ - [`@beignet/nuqs`](https://beignet.dev/nuqs) - URL query state integration with nuqs
284
+ - [`@beignet/devtools`](https://beignet.dev/devtools) - Local request, provider, and audit timeline
285
+
286
+ ## License
287
+
288
+ MIT
@@ -0,0 +1,260 @@
1
+ import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+ /**
3
+ * Any Standard Schema validator type
4
+ */
5
+ export type StandardSchema = StandardSchemaV1<unknown, unknown>;
6
+ /**
7
+ * Infer the output type from a Standard Schema
8
+ */
9
+ export type InferOutput<T extends StandardSchemaV1> = StandardSchemaV1.InferOutput<T>;
10
+ /**
11
+ * Infer the input type accepted by a Standard Schema
12
+ */
13
+ export type InferInput<T extends StandardSchemaV1> = StandardSchemaV1.InferInput<T>;
14
+ type SchemaOutput<T> = T extends StandardSchemaV1 ? InferOutput<T> : never;
15
+ export type UseCaseValidationPhase = "input" | "output";
16
+ /**
17
+ * Error thrown when a use case input or output fails schema validation.
18
+ */
19
+ export declare class UseCaseValidationError extends Error {
20
+ readonly name = "UseCaseValidationError";
21
+ readonly useCaseName: string;
22
+ readonly phase: UseCaseValidationPhase;
23
+ readonly issues: readonly StandardSchemaV1.Issue[];
24
+ constructor(args: {
25
+ useCaseName: string;
26
+ phase: UseCaseValidationPhase;
27
+ issues: readonly StandardSchemaV1.Issue[];
28
+ });
29
+ }
30
+ /**
31
+ * Error thrown when a use case tries to emit an event it did not declare with
32
+ * `.emits(...)`.
33
+ */
34
+ export declare class UseCaseEventDeclarationError extends Error {
35
+ readonly name = "UseCaseEventDeclarationError";
36
+ readonly useCaseName: string;
37
+ readonly eventName: string;
38
+ readonly declaredEventNames: readonly string[];
39
+ constructor(args: {
40
+ useCaseName: string;
41
+ eventName: string;
42
+ declaredEventNames: readonly string[];
43
+ });
44
+ }
45
+ /**
46
+ * Error thrown when a use-case event helper fails to validate an event payload
47
+ * before recording or publishing it.
48
+ */
49
+ export declare class UseCaseEventValidationError extends Error {
50
+ readonly name = "UseCaseEventValidationError";
51
+ readonly useCaseName: string;
52
+ readonly eventName: string;
53
+ readonly issues: readonly StandardSchemaV1.Issue[];
54
+ constructor(args: {
55
+ useCaseName: string;
56
+ eventName: string;
57
+ issues: readonly StandardSchemaV1.Issue[];
58
+ });
59
+ }
60
+ /**
61
+ * Represents a domain event definition (from @beignet/core/domain or compatible).
62
+ * This is a minimal interface to avoid hard dependency on @beignet/core/domain.
63
+ */
64
+ export interface DomainEventLike {
65
+ name: string;
66
+ payload: StandardSchema;
67
+ }
68
+ /**
69
+ * Infer the output payload type from a use-case event definition.
70
+ */
71
+ export type InferUseCaseEventPayload<E extends DomainEventLike> = E["payload"] extends StandardSchemaV1<unknown, infer Output> ? Output : never;
72
+ /**
73
+ * Minimal recorder shape accepted by use-case event helpers.
74
+ */
75
+ export interface UseCaseEventRecorderTarget {
76
+ record<E extends DomainEventLike>(event: E, payload: InferUseCaseEventPayload<E>): void;
77
+ }
78
+ /**
79
+ * Minimal event-bus shape accepted by use-case event helpers.
80
+ */
81
+ export interface UseCaseEventBusTarget {
82
+ publish<E extends DomainEventLike>(event: E, payload: InferUseCaseEventPayload<E>): Promise<void> | void;
83
+ }
84
+ /**
85
+ * Event helper scoped to the events declared by a use case.
86
+ */
87
+ export interface UseCaseEventHelpers<Emits extends readonly DomainEventLike[]> {
88
+ /**
89
+ * The exact event definitions declared with `.emits(...)`.
90
+ */
91
+ readonly declared: Emits;
92
+ /**
93
+ * Return whether an event is declared by this use case.
94
+ */
95
+ isDeclared(event: DomainEventLike): boolean;
96
+ /**
97
+ * Throw if an event is not declared by this use case.
98
+ */
99
+ assertDeclared(event: DomainEventLike): void;
100
+ /**
101
+ * Validate and record a declared event into a transaction-scoped recorder.
102
+ */
103
+ record<E extends Emits[number]>(recorder: UseCaseEventRecorderTarget, event: E, payload: InferUseCaseEventPayload<E>): Promise<void>;
104
+ /**
105
+ * Validate and publish a declared event directly through an event bus.
106
+ */
107
+ publish<E extends Emits[number]>(eventBus: UseCaseEventBusTarget, event: E, payload: InferUseCaseEventPayload<E>): Promise<void>;
108
+ }
109
+ /**
110
+ * Use case kind - distinguishes commands (write/side-effect) from queries (read-only)
111
+ */
112
+ export type UseCaseKind = "command" | "query";
113
+ /**
114
+ * Use case definition - the final form consumed by server adapters
115
+ */
116
+ export interface UseCaseDef<Ctx, Name extends string, Kind extends UseCaseKind, InputSchema extends StandardSchemaV1, OutputSchema extends StandardSchemaV1, Emits extends readonly DomainEventLike[] = readonly []> {
117
+ name: Name;
118
+ kind: Kind;
119
+ /** Input schema, suitable for reuse in HTTP contracts and forms. */
120
+ inputSchema: InputSchema;
121
+ /** Output schema, suitable for reuse in HTTP contracts and clients. */
122
+ outputSchema: OutputSchema;
123
+ emits: Emits;
124
+ run: (args: {
125
+ ctx: Ctx;
126
+ input: InferInput<InputSchema>;
127
+ }) => Promise<InferOutput<OutputSchema>>;
128
+ }
129
+ /**
130
+ * Event passed to the onRun hook for instrumentation
131
+ */
132
+ export interface UseCaseRunEvent<Ctx> {
133
+ name: string;
134
+ kind: UseCaseKind;
135
+ phase: "start" | "end" | "error";
136
+ durationMs?: number;
137
+ error?: unknown;
138
+ ctx: Ctx;
139
+ }
140
+ /**
141
+ * Options for createUseCase
142
+ */
143
+ export interface CreateUseCaseOptions<Ctx> {
144
+ /**
145
+ * Optional instrumentation hook called on use case start, end, and error.
146
+ */
147
+ onRun?: (event: UseCaseRunEvent<Ctx>) => void;
148
+ /**
149
+ * Enable or disable schema validation for use case boundaries.
150
+ *
151
+ * Defaults to validating both input and output. Pass `false` to opt out, or
152
+ * configure phases independently with `{ input: boolean, output: boolean }`.
153
+ */
154
+ validate?: boolean | {
155
+ input?: boolean;
156
+ output?: boolean;
157
+ };
158
+ }
159
+ type ValidationOptions = {
160
+ input: boolean;
161
+ output: boolean;
162
+ };
163
+ /**
164
+ * Internal configuration for the use case builder
165
+ */
166
+ interface UseCaseBuilderConfig<Name extends string, Kind extends UseCaseKind, InputSchema extends StandardSchemaV1 | undefined, OutputSchema extends StandardSchemaV1 | undefined, Emits extends readonly DomainEventLike[]> {
167
+ name: Name;
168
+ kind: Kind;
169
+ input?: InputSchema;
170
+ output?: OutputSchema;
171
+ emits: Emits;
172
+ }
173
+ /**
174
+ * Fluent builder for creating use cases
175
+ */
176
+ declare class UseCaseBuilder<Ctx, Name extends string, Kind extends UseCaseKind, InputSchema extends StandardSchemaV1 | undefined, OutputSchema extends StandardSchemaV1 | undefined, Emits extends readonly DomainEventLike[] = readonly []> {
177
+ private readonly config;
178
+ private readonly onRun?;
179
+ private readonly validation;
180
+ constructor(config: UseCaseBuilderConfig<Name, Kind, InputSchema, OutputSchema, Emits>, onRun?: ((event: UseCaseRunEvent<Ctx>) => void) | undefined, validation?: ValidationOptions);
181
+ /**
182
+ * Define the input schema for this use case
183
+ */
184
+ input<I extends StandardSchemaV1>(schema: I): UseCaseBuilder<Ctx, Name, Kind, I, OutputSchema, Emits>;
185
+ /**
186
+ * Define the output schema for this use case
187
+ */
188
+ output<O extends StandardSchemaV1>(schema: O): UseCaseBuilder<Ctx, Name, Kind, InputSchema, O, Emits>;
189
+ /**
190
+ * Define the domain events that this use case may emit.
191
+ */
192
+ emits<E extends readonly DomainEventLike[]>(events: E): UseCaseBuilder<Ctx, Name, Kind, InputSchema, OutputSchema, E>;
193
+ /**
194
+ * Define the run function and finalize the use case definition
195
+ */
196
+ run(fn: InputSchema extends StandardSchemaV1 ? OutputSchema extends StandardSchemaV1 ? (args: {
197
+ ctx: Ctx;
198
+ input: SchemaOutput<InputSchema>;
199
+ events: UseCaseEventHelpers<Emits>;
200
+ }) => Promise<SchemaOutput<OutputSchema>> | SchemaOutput<OutputSchema> : never : never): InputSchema extends StandardSchemaV1 ? OutputSchema extends StandardSchemaV1 ? UseCaseDef<Ctx, Name, Kind, InputSchema, OutputSchema, Emits> : never : never;
201
+ }
202
+ /**
203
+ * Root builder returned by createUseCase.
204
+ */
205
+ export interface UseCaseBuilderRoot<Ctx> {
206
+ /**
207
+ * Create a command use case (write/side-effect path)
208
+ */
209
+ command<Name extends string>(name: Name): UseCaseBuilder<Ctx, Name, "command", undefined, undefined, readonly []>;
210
+ /**
211
+ * Create a query use case (read-only path)
212
+ */
213
+ query<Name extends string>(name: Name): UseCaseBuilder<Ctx, Name, "query", undefined, undefined, readonly []>;
214
+ }
215
+ export type UseCaseContext<TUseCase> = TUseCase extends {
216
+ run: (args: {
217
+ ctx: infer Ctx;
218
+ input: infer _Input;
219
+ }) => Promise<infer _Output>;
220
+ } ? Ctx : never;
221
+ export type UseCaseInput<TUseCase> = TUseCase extends {
222
+ run: (args: {
223
+ ctx: infer _Ctx;
224
+ input: infer Input;
225
+ }) => Promise<infer _Output>;
226
+ } ? Input : never;
227
+ export type UseCaseOutput<TUseCase> = TUseCase extends {
228
+ run: (args: {
229
+ ctx: infer _Ctx;
230
+ input: infer _Input;
231
+ }) => Promise<infer Output>;
232
+ } ? Output : never;
233
+ type MaybePromise<T> = T | Promise<T>;
234
+ export interface UseCaseTester<Ctx> {
235
+ /**
236
+ * Create a fresh test context.
237
+ */
238
+ ctx(): Promise<Ctx>;
239
+ /**
240
+ * Run a use case with a typed input and either a fresh or explicit context.
241
+ */
242
+ run<Input, Output>(useCase: {
243
+ run(args: {
244
+ ctx: Ctx;
245
+ input: Input;
246
+ }): Promise<Output>;
247
+ }, input: Input, options?: {
248
+ ctx?: Ctx;
249
+ }): Promise<Output>;
250
+ }
251
+ /**
252
+ * Create a small test harness for use cases.
253
+ *
254
+ * Pass a context factory when tests mutate ports or state. Pass a fixed context
255
+ * for simple, immutable tests.
256
+ */
257
+ export declare function createUseCaseTester<Ctx>(createContext: Ctx | (() => MaybePromise<Ctx>)): UseCaseTester<Ctx>;
258
+ export declare function createUseCase<Ctx>(options?: CreateUseCaseOptions<Ctx>): UseCaseBuilderRoot<Ctx>;
259
+ export {};
260
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"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"}