@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
@@ -0,0 +1,45 @@
1
+ /**
2
+ * beignet/core/client/base
3
+ *
4
+ * Base HTTP client for making contract-based requests
5
+ */
6
+
7
+ export { SchemaValidationError } from "../errors";
8
+ export type {
9
+ AnyContractError,
10
+ ClientContractError,
11
+ ContractErrorSource,
12
+ ContractErrorWithCode,
13
+ ContractErrorWithSource,
14
+ ContractErrorWithStatus,
15
+ HttpContractError,
16
+ InferEndpointContractError,
17
+ InferEndpointErrorCode,
18
+ NetworkContractError,
19
+ ResponseContractError,
20
+ } from "./client";
21
+ export {
22
+ Client,
23
+ ContractError,
24
+ createClient,
25
+ Endpoint,
26
+ isContractError,
27
+ } from "./client";
28
+ export type {
29
+ CallArgs,
30
+ ClientConfig,
31
+ EndpointCallArgs,
32
+ EndpointErrorResult,
33
+ EndpointResult,
34
+ EndpointSuccessResult,
35
+ InferBody,
36
+ InferEndpointErrorResponse,
37
+ InferEndpointErrorResponseByStatus,
38
+ InferEndpointErrorStatus,
39
+ InferErrorResponse,
40
+ InferErrorResponseByStatus,
41
+ InferHeaders,
42
+ InferPathParams,
43
+ InferQuery,
44
+ InferSuccessResponse,
45
+ } from "./types";
@@ -0,0 +1,305 @@
1
+ import type {
2
+ BodyHttpMethod,
3
+ HttpContractConfig,
4
+ InferHeaderSchemaInput,
5
+ InferInput,
6
+ InferOutput,
7
+ StandardSchema,
8
+ StandardSchemaV1,
9
+ } from "../contracts";
10
+ import type { ErrorResponseBody } from "../errors";
11
+
12
+ /**
13
+ * Client configuration
14
+ */
15
+ export type ClientConfig<TProvidedHeaders extends string = never> = {
16
+ baseUrl?: string;
17
+ headers?: () => Promise<Record<string, string>> | Record<string, string>;
18
+ providedHeaders?: readonly TProvidedHeaders[];
19
+ fetch?: typeof fetch;
20
+ /** Enable client-side input validation for path, query, and body. Default: false. */
21
+ validate?: boolean;
22
+ };
23
+
24
+ type PathParamPrimitive = string | number | boolean;
25
+
26
+ type UnsupportedPathParamName<Name extends string> = Name extends ""
27
+ ? true
28
+ : Name extends `...${string}`
29
+ ? true
30
+ : Name extends `[${string}`
31
+ ? true
32
+ : Name extends `${string}.${string}`
33
+ ? true
34
+ : false;
35
+
36
+ type SegmentPathParam<Segment extends string> = Segment extends `:${infer Name}`
37
+ ? UnsupportedPathParamName<Name> extends true
38
+ ? never
39
+ : Name
40
+ : Segment extends `[${infer Name}]`
41
+ ? UnsupportedPathParamName<Name> extends true
42
+ ? never
43
+ : Name
44
+ : never;
45
+
46
+ type PathParamNames<TPath extends string> = string extends TPath
47
+ ? never
48
+ : TPath extends `${infer Segment}/${infer Rest}`
49
+ ? SegmentPathParam<Segment> | PathParamNames<Rest>
50
+ : SegmentPathParam<TPath>;
51
+
52
+ type InferPathParamsFromTemplate<TPath extends string> = [
53
+ PathParamNames<TPath>,
54
+ ] extends [never]
55
+ ? undefined
56
+ : { [K in PathParamNames<TPath>]: PathParamPrimitive };
57
+
58
+ /**
59
+ * Infer path params from contract
60
+ */
61
+ export type InferPathParams<TContract extends HttpContractConfig> =
62
+ TContract["pathParams"] extends StandardSchemaV1
63
+ ? InferInput<TContract["pathParams"]>
64
+ : InferPathParamsFromTemplate<TContract["path"]>;
65
+
66
+ /**
67
+ * Infer query params from contract
68
+ */
69
+ export type InferQuery<TContract extends HttpContractConfig> =
70
+ TContract["query"] extends StandardSchemaV1
71
+ ? InferInput<TContract["query"]>
72
+ : undefined;
73
+
74
+ export type InferHeaders<TContract extends HttpContractConfig> =
75
+ InferHeaderSchemaInput<
76
+ Exclude<TContract["headers"], undefined>
77
+ > extends undefined
78
+ ? undefined
79
+ : InferHeaderSchemaInput<Exclude<TContract["headers"], undefined>>;
80
+
81
+ /**
82
+ * Infer body from contract
83
+ */
84
+ export type InferBody<TContract extends HttpContractConfig> =
85
+ TContract["method"] extends BodyHttpMethod
86
+ ? TContract["body"] extends StandardSchemaV1
87
+ ? InferInput<TContract["body"]>
88
+ : undefined
89
+ : undefined;
90
+
91
+ /**
92
+ * Any 2xx HTTP success status code (200–299).
93
+ */
94
+ type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
95
+ type ToNumber<S extends string> = S extends `${infer N extends number}`
96
+ ? N
97
+ : never;
98
+ type Any2xxCode = ToNumber<`2${Digit}${Digit}`>;
99
+ type NumericKey<K> = K extends number
100
+ ? K
101
+ : K extends `${infer N extends number}`
102
+ ? N
103
+ : never;
104
+
105
+ /**
106
+ * Find all 2xx status keys from a responses record
107
+ */
108
+ type Any2xxKey<T extends object> = {
109
+ [K in keyof T]: NumericKey<K> extends Any2xxCode ? K : never;
110
+ }[keyof T];
111
+
112
+ /**
113
+ * Find all non-2xx status keys from a responses record
114
+ */
115
+ type AnyErrorKey<T extends object> = {
116
+ [K in keyof T]: NumericKey<K> extends Any2xxCode ? never : K;
117
+ }[keyof T];
118
+
119
+ type ResponseForStatus<
120
+ TResponses extends object,
121
+ TStatus extends number,
122
+ > = TStatus extends keyof TResponses
123
+ ? TResponses[TStatus]
124
+ : `${TStatus}` extends keyof TResponses
125
+ ? TResponses[`${TStatus}`]
126
+ : never;
127
+
128
+ /**
129
+ * Infer a single response type from a schema or null
130
+ */
131
+ type InferResponseType<T> = T extends null
132
+ ? undefined
133
+ : T extends StandardSchemaV1
134
+ ? InferOutput<T>
135
+ : unknown;
136
+
137
+ /**
138
+ * Infer success response from contract (union of all 2xx response types)
139
+ */
140
+ export type InferSuccessResponse<TContract extends HttpContractConfig> =
141
+ TContract["responses"] extends Partial<Record<number, StandardSchema | null>>
142
+ ? Any2xxKey<TContract["responses"]> extends infer K
143
+ ? K extends keyof TContract["responses"]
144
+ ? InferResponseType<TContract["responses"][K]>
145
+ : unknown
146
+ : unknown
147
+ : unknown;
148
+
149
+ /**
150
+ * Infer error response from contract (union of all non-2xx response types)
151
+ */
152
+ export type InferErrorResponse<TContract extends HttpContractConfig> =
153
+ TContract["responses"] extends Partial<Record<number, StandardSchema | null>>
154
+ ? AnyErrorKey<TContract["responses"]> extends infer K
155
+ ? K extends keyof TContract["responses"]
156
+ ? InferResponseType<TContract["responses"][K]>
157
+ : unknown
158
+ : unknown
159
+ : unknown;
160
+
161
+ /**
162
+ * Infer declared non-2xx status codes from a contract.
163
+ */
164
+ export type InferEndpointErrorStatus<TContract extends HttpContractConfig> =
165
+ TContract["responses"] extends Partial<Record<number, StandardSchema | null>>
166
+ ? NumericKey<AnyErrorKey<TContract["responses"]>>
167
+ : never;
168
+
169
+ /**
170
+ * Infer a declared non-2xx response body for a specific status.
171
+ */
172
+ export type InferErrorResponseByStatus<
173
+ TContract extends HttpContractConfig,
174
+ TStatus extends number,
175
+ > =
176
+ TContract["responses"] extends Partial<Record<number, StandardSchema | null>>
177
+ ? InferResponseType<ResponseForStatus<TContract["responses"], TStatus>>
178
+ : unknown;
179
+
180
+ /**
181
+ * Error bodies a Beignet client can receive for a specific status.
182
+ */
183
+ export type InferEndpointErrorResponseByStatus<
184
+ TContract extends HttpContractConfig,
185
+ TStatus extends number,
186
+ > =
187
+ | InferErrorResponseByStatus<TContract, TStatus>
188
+ | ErrorResponseBody
189
+ | string
190
+ | undefined;
191
+
192
+ /**
193
+ * Error bodies a Beignet client can receive for an endpoint.
194
+ *
195
+ * Declared route-owned errors come from the contract. Framework-owned errors
196
+ * use the standard envelope. Transport escape hatches may return text or no body.
197
+ */
198
+ export type InferEndpointErrorResponse<TContract extends HttpContractConfig> =
199
+ | InferErrorResponse<TContract>
200
+ | ErrorResponseBody
201
+ | string
202
+ | undefined;
203
+
204
+ export type EndpointSuccessResult<TContract extends HttpContractConfig> = {
205
+ ok: true;
206
+ status: number;
207
+ data: InferSuccessResponse<TContract>;
208
+ response: Response;
209
+ };
210
+
211
+ export type EndpointErrorResult<TError> = {
212
+ ok: false;
213
+ status?: number;
214
+ error: TError;
215
+ response?: Response;
216
+ };
217
+
218
+ export type EndpointResult<TContract extends HttpContractConfig, TError> =
219
+ | EndpointSuccessResult<TContract>
220
+ | EndpointErrorResult<TError>;
221
+
222
+ /**
223
+ * Call arguments for an endpoint
224
+ */
225
+ type RequestArg<
226
+ Name extends "path" | "query" | "body",
227
+ Value,
228
+ > = Value extends undefined
229
+ ? { [K in Name]?: undefined }
230
+ : undefined extends Value
231
+ ? { [K in Name]?: Value }
232
+ : { [K in Name]: Value };
233
+
234
+ type PathArgs<TContract extends HttpContractConfig> = RequestArg<
235
+ "path",
236
+ InferPathParams<TContract>
237
+ >;
238
+
239
+ type QueryArgs<TContract extends HttpContractConfig> = RequestArg<
240
+ "query",
241
+ InferQuery<TContract>
242
+ >;
243
+
244
+ type BodyArgs<TContract extends HttpContractConfig> = RequestArg<
245
+ "body",
246
+ InferBody<TContract>
247
+ >;
248
+
249
+ type ProvidedHeaderKeys<THeaders, TProvidedHeaders extends string> = Extract<
250
+ keyof THeaders,
251
+ TProvidedHeaders
252
+ >;
253
+
254
+ type ApplyProvidedHeaders<THeaders, TProvidedHeaders extends string> = Omit<
255
+ THeaders,
256
+ ProvidedHeaderKeys<THeaders, TProvidedHeaders>
257
+ > &
258
+ Partial<Pick<THeaders, ProvidedHeaderKeys<THeaders, TProvidedHeaders>>>;
259
+
260
+ type HeaderInput<
261
+ TContract extends HttpContractConfig,
262
+ TProvidedHeaders extends string,
263
+ > =
264
+ InferHeaders<TContract> extends undefined
265
+ ? Record<string, string>
266
+ : ApplyProvidedHeaders<InferHeaders<TContract>, TProvidedHeaders>;
267
+
268
+ type HeadersArgs<
269
+ TContract extends HttpContractConfig,
270
+ TProvidedHeaders extends string,
271
+ > =
272
+ InferHeaders<TContract> extends undefined
273
+ ? { headers?: Record<string, string> }
274
+ : HasRequiredKeys<HeaderInput<TContract, TProvidedHeaders>> extends never
275
+ ? { headers?: HeaderInput<TContract, TProvidedHeaders> }
276
+ : { headers: HeaderInput<TContract, TProvidedHeaders> };
277
+
278
+ export type EndpointCallArgs<
279
+ TContract extends HttpContractConfig,
280
+ TProvidedHeaders extends string = never,
281
+ > = PathArgs<TContract> &
282
+ QueryArgs<TContract> &
283
+ BodyArgs<TContract> & {
284
+ /**
285
+ * Escape hatch for non-JSON request bodies such as FormData, Blob,
286
+ * ArrayBuffer, ReadableStream, or pre-serialized text.
287
+ *
288
+ * Use `body` for contract-validated JSON requests. `rawBody` is sent as-is
289
+ * and is not validated or JSON-serialized.
290
+ */
291
+ rawBody?: TContract["method"] extends BodyHttpMethod ? BodyInit : never;
292
+ signal?: AbortSignal;
293
+ } & HeadersArgs<TContract, TProvidedHeaders>;
294
+
295
+ type HasRequiredKeys<T> = {
296
+ [K in keyof T]-?: Record<string, never> extends Pick<T, K> ? never : K;
297
+ }[keyof T];
298
+
299
+ export type CallArgs<
300
+ TContract extends HttpContractConfig,
301
+ TProvidedHeaders extends string = never,
302
+ > =
303
+ HasRequiredKeys<EndpointCallArgs<TContract, TProvidedHeaders>> extends never
304
+ ? [args?: EndpointCallArgs<TContract, TProvidedHeaders>]
305
+ : [args: EndpointCallArgs<TContract, TProvidedHeaders>];