@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
@@ -2,17 +2,36 @@ import { schemaToIR } from "./codegen-ir.ts"
2
2
  import type { IRSchema } from "./codegen-ir.ts"
3
3
 
4
4
  export const GO_KEYWORDS = new Set([
5
- "break", "case", "chan", "const", "continue", "default", "defer",
6
- "else", "fallthrough", "for", "func", "go", "goto", "if", "import",
7
- "interface", "map", "package", "range", "return", "select", "struct",
8
- "switch", "type", "var",
5
+ "break",
6
+ "case",
7
+ "chan",
8
+ "const",
9
+ "continue",
10
+ "default",
11
+ "defer",
12
+ "else",
13
+ "fallthrough",
14
+ "for",
15
+ "func",
16
+ "go",
17
+ "goto",
18
+ "if",
19
+ "import",
20
+ "interface",
21
+ "map",
22
+ "package",
23
+ "range",
24
+ "return",
25
+ "select",
26
+ "struct",
27
+ "switch",
28
+ "type",
29
+ "var",
9
30
  ])
10
31
 
11
32
  /** Converts a string to PascalCase from kebab-case, snake_case, dotted, or camelCase. */
12
33
  export function goPascal(name: string): string {
13
- return name
14
- .replace(/[-_.](.)/g, (_, c: string) => c.toUpperCase())
15
- .replace(/^(.)/, (_, c: string) => c.toUpperCase())
34
+ return name.replace(/[-_.](.)/g, (_, c: string) => c.toUpperCase()).replace(/^(.)/, (_, c: string) => c.toUpperCase())
16
35
  }
17
36
 
18
37
  /**
@@ -101,11 +120,16 @@ function renderHoistedIntEnum(typeName: string, enumVals: unknown[]): string {
101
120
 
102
121
  function primitiveFor(t: string | undefined): string | null {
103
122
  switch (t) {
104
- case "string": return "string"
105
- case "integer": return "int64"
106
- case "number": return "float64"
107
- case "boolean": return "bool"
108
- default: return null
123
+ case "string":
124
+ return "string"
125
+ case "integer":
126
+ return "int64"
127
+ case "number":
128
+ return "float64"
129
+ case "boolean":
130
+ return "bool"
131
+ default:
132
+ return null
109
133
  }
110
134
  }
111
135
 
@@ -140,7 +164,8 @@ export function irRenderUse(ir: IRSchema, ctx: RenderUseCtx, depth = 0): string
140
164
  innerStr.startsWith("*") ||
141
165
  innerStr.startsWith("[]") ||
142
166
  innerStr.startsWith("map[")
143
- ) return innerStr
167
+ )
168
+ return innerStr
144
169
  return `*${innerStr}`
145
170
  }
146
171
 
@@ -209,11 +234,7 @@ export function irRenderUse(ir: IRSchema, ctx: RenderUseCtx, depth = 0): string
209
234
  }
210
235
  }
211
236
 
212
- function irRenderAnonStruct(
213
- ir: Extract<IRSchema, { kind: "object" }>,
214
- ctx: RenderUseCtx,
215
- depth: number,
216
- ): string {
237
+ function irRenderAnonStruct(ir: Extract<IRSchema, { kind: "object" }>, ctx: RenderUseCtx, depth: number): string {
217
238
  const sorted = ir.fields.slice().sort((a, b) => a.name.localeCompare(b.name))
218
239
  const lines: string[] = []
219
240
  lines.push(`struct {`)
@@ -228,10 +249,7 @@ function irRenderAnonStruct(
228
249
  parentName: childParent,
229
250
  }
230
251
  const fieldType = irRenderUse(field.schema, childCtx, depth + 1)
231
- const alreadyNilable =
232
- fieldType.startsWith("*") ||
233
- fieldType.startsWith("[]") ||
234
- fieldType.startsWith("map[")
252
+ const alreadyNilable = fieldType.startsWith("*") || fieldType.startsWith("[]") || fieldType.startsWith("map[")
235
253
  const finalType = !field.required && !alreadyNilable ? `*${fieldType}` : fieldType
236
254
  const tag = goTag(field.name, !field.required)
237
255
  lines.push(`\t${fieldGoName} ${finalType} ${tag}`)
@@ -264,10 +282,7 @@ export function irRenderTopLevel(
264
282
  const rawType = raw?.type as string | undefined
265
283
  const base = rawType ? (primitiveFor(rawType) ?? "string") : constBaseType(ir.value)
266
284
  const val = typeof ir.value === "string" ? JSON.stringify(ir.value) : String(ir.value)
267
- return [
268
- `type ${typeName} ${base}`,
269
- `const ${typeName}Value ${typeName} = ${val}`,
270
- ].join("\n")
285
+ return [`type ${typeName} ${base}`, `const ${typeName}Value ${typeName} = ${val}`].join("\n")
271
286
  }
272
287
 
273
288
  if (ir.kind === "allOf") {
@@ -288,8 +303,7 @@ export function irRenderTopLevel(
288
303
  fieldName: field.name,
289
304
  parentName: typeName,
290
305
  })
291
- const alreadyNilable =
292
- ft.startsWith("*") || ft.startsWith("[]") || ft.startsWith("map[")
306
+ const alreadyNilable = ft.startsWith("*") || ft.startsWith("[]") || ft.startsWith("map[")
293
307
  const finalType = !field.required && !alreadyNilable ? `*${ft}` : ft
294
308
  l.push(`\t${fieldGoName} ${finalType} ${goTag(field.name, !field.required)}`)
295
309
  }
@@ -337,8 +351,7 @@ export function irRenderTopLevel(
337
351
  fieldName: field.name,
338
352
  parentName: typeName,
339
353
  })
340
- const alreadyNilable =
341
- ft.startsWith("*") || ft.startsWith("[]") || ft.startsWith("map[")
354
+ const alreadyNilable = ft.startsWith("*") || ft.startsWith("[]") || ft.startsWith("map[")
342
355
  let finalType = !field.required && !alreadyNilable ? `*${ft}` : ft
343
356
  /* self-ref → pointer (circular) */
344
357
  if (circularRefs.has(ft.replace(/^\*/, "")) && !finalType.startsWith("*")) {
@@ -387,18 +400,10 @@ export function irRenderTopLevel(
387
400
  return `type ${typeName} = ${aliased}`
388
401
  }
389
402
 
390
- export function renderUse(
391
- schema: Record<string, unknown> | undefined,
392
- ctx: RenderUseCtx,
393
- ): string {
403
+ export function renderUse(schema: Record<string, unknown> | undefined, ctx: RenderUseCtx): string {
394
404
  return irRenderUse(schemaToIR(schema), ctx, ctx.depth ?? 0)
395
405
  }
396
406
 
397
- export function renderTopLevel(
398
- name: string,
399
- schema: Record<string, unknown>,
400
- decls: Map<string, string>,
401
- ): string {
407
+ export function renderTopLevel(name: string, schema: Record<string, unknown>, decls: Map<string, string>): string {
402
408
  return irRenderTopLevel(name, schemaToIR(schema), decls, schema)
403
409
  }
404
-
@@ -306,9 +306,7 @@ export function replaceResponse(
306
306
  })
307
307
  }
308
308
 
309
- function headersToInit(
310
- headers: Headers | HoneyOutHeaders | Record<string, string | string[]>,
311
- ): HeadersInit {
309
+ function headersToInit(headers: Headers | HoneyOutHeaders | Record<string, string | string[]>): HeadersInit {
312
310
  if (headers instanceof HoneyOutHeaders) return headers.toRecord() as HeadersInit
313
311
  if (headers instanceof Headers) return headers
314
312
  return headers as HeadersInit
package/src/i18n.ts CHANGED
@@ -148,11 +148,7 @@ function tokenize(message: string): ParsedToken[] {
148
148
  return tokens
149
149
  }
150
150
 
151
- function resolveToken(
152
- token: ParsedToken,
153
- values: Record<string, unknown>,
154
- locale?: string,
155
- ): string {
151
+ function resolveToken(token: ParsedToken, values: Record<string, unknown>, locale?: string): string {
156
152
  if (typeof token === "string") return token
157
153
 
158
154
  if (token.type === "simple") {
@@ -177,8 +173,7 @@ function resolveToken(
177
173
  const num = Number(val ?? 0)
178
174
  const exactKey = `=${num}`
179
175
  const category = getPluralCategory(num)
180
- const template =
181
- token.branches[exactKey] ?? token.branches[category] ?? token.branches["other"] ?? ""
176
+ const template = token.branches[exactKey] ?? token.branches[category] ?? token.branches["other"] ?? ""
182
177
  const resolved = template.replace(/#/g, String(num))
183
178
  return interpolate(resolved, values, locale)
184
179
  }
@@ -193,11 +188,7 @@ function resolveToken(
193
188
  * ICU MessageFormat interpolation.
194
189
  * Supports: {var}, {var, plural, one{...} other{...}}, {var, select, ...}, {var, number}
195
190
  */
196
- export function interpolate(
197
- template: string,
198
- vars: Record<string, unknown>,
199
- locale?: string,
200
- ): string {
191
+ export function interpolate(template: string, vars: Record<string, unknown>, locale?: string): string {
201
192
  if (!template) return template
202
193
  const tokens = tokenize(template)
203
194
  return tokens.map((t) => resolveToken(t, vars, locale)).join("")