@lovrozagar/honey 0.1.0 → 0.2.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 (263) hide show
  1. package/README.md +1596 -6
  2. package/dist/accepts.d.ts +6 -0
  3. package/dist/accepts.d.ts.map +1 -0
  4. package/dist/body-limit.d.ts +22 -0
  5. package/dist/body-limit.d.ts.map +1 -0
  6. package/dist/build/index.d.ts +42 -0
  7. package/dist/build/index.d.ts.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/client/error.d.ts +14 -0
  11. package/dist/client/error.d.ts.map +1 -0
  12. package/dist/client/http.d.ts +88 -0
  13. package/dist/client/http.d.ts.map +1 -0
  14. package/dist/client/index.d.ts +22 -0
  15. package/dist/client/index.d.ts.map +1 -0
  16. package/dist/client/sdk.d.ts +34 -0
  17. package/dist/client/sdk.d.ts.map +1 -0
  18. package/dist/client/sse.d.ts +10 -0
  19. package/dist/client/sse.d.ts.map +1 -0
  20. package/dist/client/types.d.ts +124 -0
  21. package/dist/client/types.d.ts.map +1 -0
  22. package/dist/client/ws.d.ts +15 -0
  23. package/dist/client/ws.d.ts.map +1 -0
  24. package/dist/client-mcp/server.d.ts +10 -0
  25. package/dist/client-mcp/server.d.ts.map +1 -0
  26. package/dist/client-mcp/types.d.ts +16 -0
  27. package/dist/client-mcp/types.d.ts.map +1 -0
  28. package/dist/cloudflare/realtime.d.ts +30 -0
  29. package/dist/cloudflare/realtime.d.ts.map +1 -0
  30. package/dist/codegen-go-cli.d.ts +22 -0
  31. package/dist/codegen-go-cli.d.ts.map +1 -0
  32. package/dist/codegen-go.d.ts +29 -0
  33. package/dist/codegen-go.d.ts.map +1 -0
  34. package/dist/codegen-hash.d.ts +3 -0
  35. package/dist/codegen-hash.d.ts.map +1 -0
  36. package/dist/codegen-ir.d.ts +123 -0
  37. package/dist/codegen-ir.d.ts.map +1 -0
  38. package/dist/codegen-loaders.d.ts +12 -0
  39. package/dist/codegen-loaders.d.ts.map +1 -0
  40. package/dist/codegen-mcp.d.ts +13 -0
  41. package/dist/codegen-mcp.d.ts.map +1 -0
  42. package/dist/codegen-python.d.ts +21 -0
  43. package/dist/codegen-python.d.ts.map +1 -0
  44. package/dist/codegen-rust.d.ts +18 -0
  45. package/dist/codegen-rust.d.ts.map +1 -0
  46. package/dist/codegen-sanitize.d.ts +3 -0
  47. package/dist/codegen-sanitize.d.ts.map +1 -0
  48. package/dist/codegen-schema-naming.d.ts +22 -0
  49. package/dist/codegen-schema-naming.d.ts.map +1 -0
  50. package/dist/codegen.d.ts +178 -0
  51. package/dist/codegen.d.ts.map +1 -0
  52. package/dist/context.d.ts +56 -0
  53. package/dist/context.d.ts.map +1 -0
  54. package/dist/cookie-sign.d.ts +3 -0
  55. package/dist/cookie-sign.d.ts.map +1 -0
  56. package/dist/cookie.d.ts +12 -0
  57. package/dist/cookie.d.ts.map +1 -0
  58. package/dist/cors.d.ts +13 -0
  59. package/dist/cors.d.ts.map +1 -0
  60. package/dist/crypto.d.ts +2 -0
  61. package/dist/crypto.d.ts.map +1 -0
  62. package/dist/csrf.d.ts +9 -0
  63. package/dist/csrf.d.ts.map +1 -0
  64. package/dist/curl-logger.d.ts +33 -0
  65. package/dist/curl-logger.d.ts.map +1 -0
  66. package/dist/detect-runtime.d.ts +16 -0
  67. package/dist/detect-runtime.d.ts.map +1 -0
  68. package/dist/error.d.ts +21 -0
  69. package/dist/error.d.ts.map +1 -0
  70. package/dist/errors.d.ts +40 -0
  71. package/dist/errors.d.ts.map +1 -0
  72. package/dist/etag.d.ts +9 -0
  73. package/dist/etag.d.ts.map +1 -0
  74. package/dist/feature-load.d.ts +3 -0
  75. package/dist/feature-load.d.ts.map +1 -0
  76. package/dist/go-type-emitter.d.ts +33 -0
  77. package/dist/go-type-emitter.d.ts.map +1 -0
  78. package/dist/honey-response.d.ts +82 -0
  79. package/dist/honey-response.d.ts.map +1 -0
  80. package/dist/i18n-slot.d.ts +7 -0
  81. package/dist/i18n-slot.d.ts.map +1 -0
  82. package/dist/i18n.d.ts +26 -0
  83. package/dist/i18n.d.ts.map +1 -0
  84. package/dist/index.d.ts +470 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/init.d.ts +7 -0
  87. package/dist/init.d.ts.map +1 -0
  88. package/dist/input.d.ts +6 -0
  89. package/dist/input.d.ts.map +1 -0
  90. package/dist/ip-restrict.d.ts +12 -0
  91. package/dist/ip-restrict.d.ts.map +1 -0
  92. package/dist/logger.d.ts +45 -0
  93. package/dist/logger.d.ts.map +1 -0
  94. package/dist/meta-spec.d.ts +81 -0
  95. package/dist/meta-spec.d.ts.map +1 -0
  96. package/dist/middleware.d.ts +60 -0
  97. package/dist/middleware.d.ts.map +1 -0
  98. package/dist/node-request.d.ts +59 -0
  99. package/dist/node-request.d.ts.map +1 -0
  100. package/dist/node.d.ts +13 -0
  101. package/dist/node.d.ts.map +1 -0
  102. package/dist/openapi/register.d.ts +3 -0
  103. package/dist/openapi/register.d.ts.map +1 -0
  104. package/dist/openapi/scalar.d.ts +12 -0
  105. package/dist/openapi/scalar.d.ts.map +1 -0
  106. package/dist/openapi/spec-factory.d.ts +31 -0
  107. package/dist/openapi/spec-factory.d.ts.map +1 -0
  108. package/dist/openapi/spec.d.ts +19 -0
  109. package/dist/openapi/spec.d.ts.map +1 -0
  110. package/dist/openapi/swagger.d.ts +12 -0
  111. package/dist/openapi/swagger.d.ts.map +1 -0
  112. package/dist/plugin.d.ts +167 -0
  113. package/dist/plugin.d.ts.map +1 -0
  114. package/dist/powered-by.d.ts +7 -0
  115. package/dist/powered-by.d.ts.map +1 -0
  116. package/dist/pretty-json.d.ts +10 -0
  117. package/dist/pretty-json.d.ts.map +1 -0
  118. package/dist/proxy.d.ts +51 -0
  119. package/dist/proxy.d.ts.map +1 -0
  120. package/dist/python-type-emitter.d.ts +11 -0
  121. package/dist/python-type-emitter.d.ts.map +1 -0
  122. package/dist/realtime/buffer.d.ts +18 -0
  123. package/dist/realtime/buffer.d.ts.map +1 -0
  124. package/dist/realtime/bus.d.ts +11 -0
  125. package/dist/realtime/bus.d.ts.map +1 -0
  126. package/dist/realtime/longpoll.d.ts +23 -0
  127. package/dist/realtime/longpoll.d.ts.map +1 -0
  128. package/dist/realtime/protocol.d.ts +50 -0
  129. package/dist/realtime/protocol.d.ts.map +1 -0
  130. package/dist/realtime/route.d.ts +42 -0
  131. package/dist/realtime/route.d.ts.map +1 -0
  132. package/dist/realtime/runtime.d.ts +74 -0
  133. package/dist/realtime/runtime.d.ts.map +1 -0
  134. package/dist/request-id.d.ts +12 -0
  135. package/dist/request-id.d.ts.map +1 -0
  136. package/dist/request-to-curl.d.ts +9 -0
  137. package/dist/request-to-curl.d.ts.map +1 -0
  138. package/dist/response.d.ts +57 -0
  139. package/dist/response.d.ts.map +1 -0
  140. package/dist/rust-type-emitter.d.ts +32 -0
  141. package/dist/rust-type-emitter.d.ts.map +1 -0
  142. package/dist/secure-headers.d.ts +16 -0
  143. package/dist/secure-headers.d.ts.map +1 -0
  144. package/dist/serve-register.d.ts +2 -0
  145. package/dist/serve-register.d.ts.map +1 -0
  146. package/dist/serve-slot.d.ts +6 -0
  147. package/dist/serve-slot.d.ts.map +1 -0
  148. package/dist/serve.d.ts +21 -0
  149. package/dist/serve.d.ts.map +1 -0
  150. package/dist/server-timing.d.ts +9 -0
  151. package/dist/server-timing.d.ts.map +1 -0
  152. package/dist/static.d.ts +12 -0
  153. package/dist/static.d.ts.map +1 -0
  154. package/dist/telemetry/otel.d.ts +59 -0
  155. package/dist/telemetry/otel.d.ts.map +1 -0
  156. package/dist/testing.d.ts +24 -0
  157. package/dist/testing.d.ts.map +1 -0
  158. package/dist/timeout.d.ts +7 -0
  159. package/dist/timeout.d.ts.map +1 -0
  160. package/dist/tree.d.ts +90 -0
  161. package/dist/tree.d.ts.map +1 -0
  162. package/dist/ts-type-emitter.d.ts +4 -0
  163. package/dist/ts-type-emitter.d.ts.map +1 -0
  164. package/dist/type-emitter.d.ts +8 -0
  165. package/dist/type-emitter.d.ts.map +1 -0
  166. package/dist/type-extractor.d.ts +39 -0
  167. package/dist/type-extractor.d.ts.map +1 -0
  168. package/dist/types.d.ts +451 -0
  169. package/dist/types.d.ts.map +1 -0
  170. package/dist/validation.d.ts +18 -0
  171. package/dist/validation.d.ts.map +1 -0
  172. package/dist/ws/bun.d.ts +28 -0
  173. package/dist/ws/bun.d.ts.map +1 -0
  174. package/dist/ws/cloudflare.d.ts +55 -0
  175. package/dist/ws/cloudflare.d.ts.map +1 -0
  176. package/dist/ws/deno.d.ts +13 -0
  177. package/dist/ws/deno.d.ts.map +1 -0
  178. package/dist/ws/node.d.ts +10 -0
  179. package/dist/ws/node.d.ts.map +1 -0
  180. package/dist/yaml.d.ts +4 -0
  181. package/dist/yaml.d.ts.map +1 -0
  182. package/docs/api-ref/go.md +82 -82
  183. package/docs/api-ref/python.md +82 -82
  184. package/docs/api-ref/rust.md +82 -82
  185. package/docs/api-ref/typescript.md +82 -82
  186. package/docs/invalidate-spec.md +13 -13
  187. package/docs/meta-spec.md +513 -0
  188. package/docs/packaging.md +85 -0
  189. package/docs/sdk.md +87 -73
  190. package/package.json +195 -51
  191. package/src/body-limit.ts +2 -1
  192. package/src/build/index.ts +2 -9
  193. package/src/cli.ts +2 -3
  194. package/src/client/http.ts +204 -223
  195. package/src/client/index.ts +6 -14
  196. package/src/client/sdk.ts +24 -17
  197. package/src/client/types.ts +4 -9
  198. package/src/client/ws.ts +3 -5
  199. package/src/client-mcp/server.ts +1 -4
  200. package/src/cloudflare/realtime.ts +8 -10
  201. package/src/codegen-go-cli.ts +74 -67
  202. package/src/codegen-go.ts +71 -51
  203. package/src/codegen-ir.ts +16 -27
  204. package/src/codegen-loaders.ts +5 -8
  205. package/src/codegen-mcp.ts +9 -27
  206. package/src/codegen-python.ts +47 -27
  207. package/src/codegen-rust.ts +110 -66
  208. package/src/codegen-sanitize.ts +1 -7
  209. package/src/codegen-schema-naming.ts +8 -2
  210. package/src/codegen.ts +299 -196
  211. package/src/context.ts +91 -95
  212. package/src/cookie-sign.ts +5 -13
  213. package/src/cookie.ts +1 -2
  214. package/src/cors.ts +4 -6
  215. package/src/crypto.ts +1 -4
  216. package/src/csrf.ts +3 -3
  217. package/src/curl-logger.ts +14 -32
  218. package/src/detect-runtime.ts +1 -3
  219. package/src/errors.ts +1 -3
  220. package/src/etag.ts +3 -4
  221. package/src/go-type-emitter.ts +45 -40
  222. package/src/honey-response.ts +1 -3
  223. package/src/i18n.ts +3 -12
  224. package/src/index.ts +1168 -1412
  225. package/src/ip-restrict.ts +2 -1
  226. package/src/logger.ts +13 -13
  227. package/src/meta-spec.ts +0 -0
  228. package/src/middleware.ts +111 -79
  229. package/src/node-request.ts +2 -1
  230. package/src/node.ts +9 -10
  231. package/src/openapi/register.ts +1 -2
  232. package/src/openapi/scalar.ts +9 -9
  233. package/src/openapi/spec-factory.ts +2 -2
  234. package/src/openapi/spec.ts +26 -19
  235. package/src/openapi/swagger.ts +9 -9
  236. package/src/plugin.ts +226 -256
  237. package/src/powered-by.ts +2 -1
  238. package/src/pretty-json.ts +2 -1
  239. package/src/proxy.ts +1 -3
  240. package/src/python-type-emitter.ts +37 -12
  241. package/src/realtime/route.ts +1 -1
  242. package/src/realtime/runtime.ts +9 -12
  243. package/src/request-id.ts +3 -4
  244. package/src/request-to-curl.ts +1 -4
  245. package/src/response.ts +150 -199
  246. package/src/rust-type-emitter.ts +66 -25
  247. package/src/secure-headers.ts +2 -1
  248. package/src/serve.ts +3 -12
  249. package/src/server-timing.ts +2 -1
  250. package/src/static.ts +3 -4
  251. package/src/telemetry/otel.ts +1 -6
  252. package/src/testing.ts +2 -11
  253. package/src/timeout.ts +2 -1
  254. package/src/tree.ts +12 -27
  255. package/src/ts-type-emitter.ts +71 -15
  256. package/src/type-emitter.ts +226 -237
  257. package/src/type-extractor.ts +260 -334
  258. package/src/types.ts +168 -68
  259. package/src/validation.ts +7 -30
  260. package/src/ws/bun.ts +2 -9
  261. package/src/ws/cloudflare.ts +13 -16
  262. package/src/ws/deno.ts +31 -40
  263. package/src/ws/node.ts +4 -19
package/src/powered-by.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { namedMiddleware } from "./middleware.ts"
1
2
  import type { MiddlewareFn } from "./middleware.ts"
2
3
 
3
4
  type PoweredByOptions = {
@@ -13,5 +14,5 @@ export function poweredBy(options?: PoweredByOptions): MiddlewareFn<{}, {}> {
13
14
  return response
14
15
  }
15
16
 
16
- return mw
17
+ return namedMiddleware("poweredBy", mw)
17
18
  }
@@ -1,3 +1,4 @@
1
+ import { namedMiddleware } from "./middleware.ts"
1
2
  import { replaceResponse } from "./honey-response.ts"
2
3
  import type { MiddlewareFn } from "./middleware.ts"
3
4
 
@@ -35,5 +36,5 @@ export function prettyJson(options?: PrettyJsonOptions): MiddlewareFn<{ req: Req
35
36
  })
36
37
  }
37
38
 
38
- return mw
39
+ return namedMiddleware("prettyJson", mw)
39
40
  }
package/src/proxy.ts CHANGED
@@ -57,9 +57,7 @@ export type ProxyConfig<TCtx> = {
57
57
  * compatibility with { path, req }. At runtime ctx is always HoneyContext
58
58
  * which has both fields — we access them via property access on the object.
59
59
  */
60
- export function createProxyHandler<TCtx>(
61
- config: ProxyConfig<TCtx>,
62
- ): (ctx: TCtx) => Promise<Response> {
60
+ export function createProxyHandler<TCtx>(config: ProxyConfig<TCtx>): (ctx: TCtx) => Promise<Response> {
63
61
  const timeoutOpt = config.timeout ?? 30_000
64
62
 
65
63
  return async (ctx: TCtx) => {
@@ -2,11 +2,41 @@ import { schemaToIR } from "./codegen-ir.ts"
2
2
  import type { IRField, IRSchema } from "./codegen-ir.ts"
3
3
 
4
4
  const PY_RESERVED = new Set([
5
- "False", "None", "True", "and", "as", "assert", "async", "await",
6
- "break", "class", "continue", "def", "del", "elif", "else", "except",
7
- "finally", "for", "from", "global", "if", "import", "in", "is",
8
- "lambda", "nonlocal", "not", "or", "pass", "raise", "return", "try",
9
- "while", "with", "yield",
5
+ "False",
6
+ "None",
7
+ "True",
8
+ "and",
9
+ "as",
10
+ "assert",
11
+ "async",
12
+ "await",
13
+ "break",
14
+ "class",
15
+ "continue",
16
+ "def",
17
+ "del",
18
+ "elif",
19
+ "else",
20
+ "except",
21
+ "finally",
22
+ "for",
23
+ "from",
24
+ "global",
25
+ "if",
26
+ "import",
27
+ "in",
28
+ "is",
29
+ "lambda",
30
+ "nonlocal",
31
+ "not",
32
+ "or",
33
+ "pass",
34
+ "raise",
35
+ "return",
36
+ "try",
37
+ "while",
38
+ "with",
39
+ "yield",
10
40
  ])
11
41
 
12
42
  /** Suffix reserved words with `_` per PEP 8 convention. */
@@ -32,9 +62,7 @@ function formatConstPy(v: string | number | boolean): string {
32
62
 
33
63
  function emitScalarPy(ir: Extract<IRSchema, { kind: "scalar" }>): string {
34
64
  if (ir.enum) {
35
- const members = ir.enum
36
- .map((v) => (typeof v === "string" ? JSON.stringify(v) : String(v)))
37
- .join(", ")
65
+ const members = ir.enum.map((v) => (typeof v === "string" ? JSON.stringify(v) : String(v))).join(", ")
38
66
  return `Literal[${members}]`
39
67
  }
40
68
  return primitiveToPy(ir.type)
@@ -135,10 +163,7 @@ export function irToPython(ir: IRSchema, depth = 0): string {
135
163
  }
136
164
 
137
165
  /** Thin shim — delegates to irToPython(schemaToIR(schema), depth). */
138
- export function jsonSchemaToPy(
139
- schema: Record<string, unknown> | undefined,
140
- depth = 0,
141
- ): string {
166
+ export function jsonSchemaToPy(schema: Record<string, unknown> | undefined, depth = 0): string {
142
167
  if (!schema || depth > 8) return "Any"
143
168
  return irToPython(schemaToIR(schema), depth)
144
169
  }
@@ -91,7 +91,7 @@ export function createConnContext(opts: {
91
91
 
92
92
  Object.defineProperty(conn, "on", {
93
93
  enumerable: true,
94
- value(event: "message" | "close", handler: ((...args: unknown[]) => void)) {
94
+ value(event: "message" | "close", handler: (...args: unknown[]) => void) {
95
95
  if (event === "message") {
96
96
  handlers.message = handler as (payload: unknown) => void
97
97
  } else {
@@ -153,10 +153,7 @@ export function createKeepaliveLoop(opts: {
153
153
 
154
154
  const DEFAULT_FALLBACK_TIMEOUT = 3000
155
155
 
156
- export function createFallbackChain(opts: {
157
- transports: TransportAdapter[]
158
- timeout?: number
159
- }): {
156
+ export function createFallbackChain(opts: { transports: TransportAdapter[]; timeout?: number }): {
160
157
  connect(url: string, transportOpts: TransportOpts): Promise<{ conn: TransportConnection; transport: Transport }>
161
158
  readonly provenTransport: Transport | null
162
159
  } {
@@ -222,7 +219,6 @@ export function createFallbackChain(opts: {
222
219
  transportOpts: TransportOpts,
223
220
  transports: TransportAdapter[],
224
221
  ): Promise<{ conn: TransportConnection; transport: Transport }> {
225
-
226
222
  /* If we have a proven transport, try it first (it's at a specific index) */
227
223
  if (proven !== null) {
228
224
  /* proven refers to index position — try that adapter directly */
@@ -280,10 +276,7 @@ export type ResumableConnectionOpts = {
280
276
  keepaliveInterval?: number
281
277
  }
282
278
 
283
- type QueueEntry =
284
- | { type: "value"; value: unknown }
285
- | { type: "done" }
286
- | { type: "error"; error: unknown }
279
+ type QueueEntry = { type: "value"; value: unknown } | { type: "done" } | { type: "error"; error: unknown }
287
280
 
288
281
  export function createResumableConnection(opts: ResumableConnectionOpts): {
289
282
  readonly state: ConnectionState
@@ -350,9 +343,13 @@ export function createResumableConnection(opts: ResumableConnectionOpts): {
350
343
 
351
344
  /* Listen for abort signal */
352
345
  if (opts.signal && !opts.signal.aborted) {
353
- opts.signal.addEventListener("abort", () => {
354
- handleAbort()
355
- }, { once: true })
346
+ opts.signal.addEventListener(
347
+ "abort",
348
+ () => {
349
+ handleAbort()
350
+ },
351
+ { once: true },
352
+ )
356
353
  }
357
354
 
358
355
  function startConnection(): void {
package/src/request-id.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { namedMiddleware } from "./middleware.ts"
1
2
  import type { MiddlewareFn } from "./middleware.ts"
2
3
 
3
4
  type RequestIdOptions = {
@@ -5,9 +6,7 @@ type RequestIdOptions = {
5
6
  header?: string
6
7
  }
7
8
 
8
- export function requestId(
9
- options?: RequestIdOptions,
10
- ): MiddlewareFn<{ req: Request }, { requestId: string }> {
9
+ export function requestId(options?: RequestIdOptions): MiddlewareFn<{ req: Request }, { requestId: string }> {
11
10
  const headerName = options?.header ?? "x-request-id"
12
11
  const generate = options?.generator ?? (() => crypto.randomUUID())
13
12
 
@@ -19,5 +18,5 @@ export function requestId(
19
18
  return response
20
19
  }
21
20
 
22
- return mw
21
+ return namedMiddleware("requestId", mw)
23
22
  }
@@ -10,10 +10,7 @@ function shellEscape(value: string): string {
10
10
  * Convert a native Request into a curl command string.
11
11
  * The request is cloned so reading the body does not consume the original stream.
12
12
  */
13
- export async function requestToCurl(
14
- request: Request,
15
- options?: RequestToCurlOptions,
16
- ): Promise<string> {
13
+ export async function requestToCurl(request: Request, options?: RequestToCurlOptions): Promise<string> {
17
14
  const clonedRequest = request.clone()
18
15
  const parts: string[] = [`curl -X ${clonedRequest.method}`]
19
16