silgi 0.43.28 → 0.50.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 (478) hide show
  1. package/README.md +103 -1
  2. package/dist/_virtual/_rolldown/runtime.mjs +5 -0
  3. package/dist/adapters/_fetch-adapter.d.mts +18 -0
  4. package/dist/adapters/_fetch-adapter.mjs +53 -0
  5. package/dist/adapters/astro.d.mts +15 -0
  6. package/dist/adapters/astro.mjs +31 -0
  7. package/dist/adapters/aws-lambda.d.mts +42 -0
  8. package/dist/adapters/aws-lambda.mjs +92 -0
  9. package/dist/adapters/express.d.mts +16 -0
  10. package/dist/adapters/express.mjs +110 -0
  11. package/dist/adapters/message-port.d.mts +42 -0
  12. package/dist/adapters/message-port.mjs +132 -0
  13. package/dist/adapters/nestjs.d.mts +25 -0
  14. package/dist/adapters/nestjs.mjs +83 -0
  15. package/dist/adapters/nextjs.d.mts +14 -0
  16. package/dist/adapters/nextjs.mjs +29 -0
  17. package/dist/adapters/peer.d.mts +27 -0
  18. package/dist/adapters/peer.mjs +36 -0
  19. package/dist/adapters/remix.d.mts +15 -0
  20. package/dist/adapters/remix.mjs +30 -0
  21. package/dist/adapters/solidstart.d.mts +12 -0
  22. package/dist/adapters/solidstart.mjs +29 -0
  23. package/dist/adapters/sveltekit.d.mts +14 -0
  24. package/dist/adapters/sveltekit.mjs +30 -0
  25. package/dist/broker/index.d.mts +62 -0
  26. package/dist/broker/index.mjs +153 -0
  27. package/dist/broker/nats.d.mts +33 -0
  28. package/dist/broker/nats.mjs +31 -0
  29. package/dist/broker/redis.d.mts +51 -0
  30. package/dist/broker/redis.mjs +92 -0
  31. package/dist/builder.d.mts +55 -0
  32. package/dist/builder.mjs +70 -0
  33. package/dist/callable.d.mts +19 -0
  34. package/dist/callable.mjs +42 -0
  35. package/dist/caller.mjs +90 -0
  36. package/dist/client/adapters/fetch/index.d.mts +15 -0
  37. package/dist/client/adapters/fetch/index.mjs +57 -0
  38. package/dist/client/adapters/ofetch/index.d.mts +55 -0
  39. package/dist/client/adapters/ofetch/index.mjs +91 -0
  40. package/dist/client/adapters/websocket/index.d.mts +20 -0
  41. package/dist/client/adapters/websocket/index.mjs +101 -0
  42. package/dist/client/client.d.mts +37 -0
  43. package/dist/client/client.mjs +80 -0
  44. package/dist/client/consume.d.mts +50 -0
  45. package/dist/client/consume.mjs +66 -0
  46. package/dist/client/dynamic-link.d.mts +16 -0
  47. package/dist/client/dynamic-link.mjs +19 -0
  48. package/dist/client/index.d.mts +6 -0
  49. package/dist/client/index.mjs +5 -0
  50. package/dist/client/interceptor.d.mts +31 -0
  51. package/dist/client/interceptor.mjs +34 -0
  52. package/dist/client/openapi.d.mts +29 -0
  53. package/dist/client/openapi.mjs +89 -0
  54. package/dist/client/plugins/batch.d.mts +26 -0
  55. package/dist/client/plugins/batch.mjs +64 -0
  56. package/dist/client/plugins/circuit-breaker.d.mts +24 -0
  57. package/dist/client/plugins/circuit-breaker.mjs +60 -0
  58. package/dist/client/plugins/csrf.d.mts +13 -0
  59. package/dist/client/plugins/csrf.mjs +20 -0
  60. package/dist/client/plugins/dedupe.d.mts +10 -0
  61. package/dist/client/plugins/dedupe.mjs +28 -0
  62. package/dist/client/plugins/index.d.mts +8 -0
  63. package/dist/client/plugins/index.mjs +8 -0
  64. package/dist/client/plugins/otel.d.mts +12 -0
  65. package/dist/client/plugins/otel.mjs +27 -0
  66. package/dist/client/plugins/retry.d.mts +34 -0
  67. package/dist/client/plugins/retry.mjs +79 -0
  68. package/dist/client/plugins/timeout.d.mts +10 -0
  69. package/dist/client/plugins/timeout.mjs +14 -0
  70. package/dist/client/server.d.mts +16 -0
  71. package/dist/client/server.mjs +59 -0
  72. package/dist/client/types.d.mts +29 -0
  73. package/dist/codec/devalue.d.mts +21 -0
  74. package/dist/codec/devalue.mjs +33 -0
  75. package/dist/codec/msgpack.d.mts +18 -0
  76. package/dist/codec/msgpack.mjs +45 -0
  77. package/dist/codec/sanitize.mjs +38 -0
  78. package/dist/codegen/emitters.d.mts +51 -0
  79. package/dist/codegen/emitters.mjs +143 -0
  80. package/dist/codegen/generate.d.mts +25 -0
  81. package/dist/codegen/generate.mjs +224 -0
  82. package/dist/codegen/index.d.mts +44 -0
  83. package/dist/codegen/index.mjs +103 -0
  84. package/dist/codegen/parse.d.mts +124 -0
  85. package/dist/codegen/parse.mjs +135 -0
  86. package/dist/codegen/preserve.d.mts +21 -0
  87. package/dist/codegen/preserve.mjs +62 -0
  88. package/dist/codegen/schema-to-code.d.mts +57 -0
  89. package/dist/codegen/schema-to-code.mjs +167 -0
  90. package/dist/compile.d.mts +46 -0
  91. package/dist/compile.mjs +332 -0
  92. package/dist/core/codec.mjs +67 -0
  93. package/dist/core/context-bridge.mjs +11 -0
  94. package/dist/core/dispatch.mjs +62 -0
  95. package/dist/core/error.d.mts +99 -60
  96. package/dist/core/error.mjs +125 -92
  97. package/dist/core/handler.d.mts +6 -0
  98. package/dist/core/handler.mjs +153 -0
  99. package/dist/core/input.mjs +49 -0
  100. package/dist/core/iterator.d.mts +17 -0
  101. package/dist/core/iterator.mjs +79 -0
  102. package/dist/core/router-utils.mjs +22 -0
  103. package/dist/core/schema.d.mts +20 -0
  104. package/dist/core/schema.mjs +33 -0
  105. package/dist/core/serve.d.mts +51 -0
  106. package/dist/core/serve.mjs +76 -0
  107. package/dist/core/sse.d.mts +18 -0
  108. package/dist/core/sse.mjs +110 -0
  109. package/dist/core/storage.d.mts +17 -4
  110. package/dist/core/storage.mjs +60 -13
  111. package/dist/core/task.d.mts +62 -0
  112. package/dist/core/task.mjs +165 -0
  113. package/dist/core/trace-map.d.mts +13 -0
  114. package/dist/core/trace-map.mjs +13 -0
  115. package/dist/core/url.mjs +28 -0
  116. package/dist/core/utils.mjs +24 -0
  117. package/dist/index.d.mts +17 -21
  118. package/dist/index.mjs +14 -22
  119. package/dist/integrations/ai/index.d.mts +25 -0
  120. package/dist/integrations/ai/index.mjs +117 -0
  121. package/dist/integrations/better-auth/index.d.mts +41 -0
  122. package/dist/integrations/better-auth/index.mjs +331 -0
  123. package/dist/integrations/drizzle/index.d.mts +27 -0
  124. package/dist/integrations/drizzle/index.mjs +285 -0
  125. package/dist/integrations/hey-api/index.d.mts +2 -0
  126. package/dist/integrations/hey-api/index.mjs +2 -0
  127. package/dist/integrations/hey-api/to-client.d.mts +20 -0
  128. package/dist/integrations/hey-api/to-client.mjs +39 -0
  129. package/dist/integrations/pinia-colada/general-utils.d.mts +13 -0
  130. package/dist/integrations/pinia-colada/general-utils.mjs +9 -0
  131. package/dist/integrations/pinia-colada/index.d.mts +6 -0
  132. package/dist/integrations/pinia-colada/index.mjs +5 -0
  133. package/dist/integrations/pinia-colada/key.d.mts +11 -0
  134. package/dist/integrations/pinia-colada/key.mjs +11 -0
  135. package/dist/integrations/pinia-colada/procedure-utils.d.mts +25 -0
  136. package/dist/integrations/pinia-colada/procedure-utils.mjs +33 -0
  137. package/dist/integrations/pinia-colada/router-utils.d.mts +17 -0
  138. package/dist/integrations/pinia-colada/router-utils.mjs +30 -0
  139. package/dist/integrations/pinia-colada/types.d.mts +25 -0
  140. package/dist/integrations/react/index.d.mts +83 -0
  141. package/dist/integrations/react/index.mjs +196 -0
  142. package/dist/integrations/tanstack-query/index.d.mts +120 -0
  143. package/dist/integrations/tanstack-query/index.mjs +100 -0
  144. package/dist/integrations/tanstack-query/ssr.d.mts +60 -0
  145. package/dist/integrations/tanstack-query/ssr.mjs +102 -0
  146. package/dist/integrations/zod/converter.d.mts +75 -0
  147. package/dist/integrations/zod/converter.mjs +345 -0
  148. package/dist/integrations/zod/index.d.mts +2 -0
  149. package/dist/integrations/zod/index.mjs +2 -0
  150. package/dist/lazy.d.mts +22 -0
  151. package/dist/lazy.mjs +34 -0
  152. package/dist/lifecycle.d.mts +36 -0
  153. package/dist/lifecycle.mjs +46 -0
  154. package/dist/map-input.d.mts +17 -0
  155. package/dist/map-input.mjs +47 -0
  156. package/dist/plugins/analytics/accumulator.d.mts +24 -0
  157. package/dist/plugins/analytics/accumulator.mjs +91 -0
  158. package/dist/plugins/analytics/alerts.d.mts +59 -0
  159. package/dist/plugins/analytics/alerts.mjs +140 -0
  160. package/dist/plugins/analytics/collector.d.mts +38 -0
  161. package/dist/plugins/analytics/collector.mjs +275 -0
  162. package/dist/plugins/analytics/cost.d.mts +61 -0
  163. package/dist/plugins/analytics/cost.mjs +97 -0
  164. package/dist/plugins/analytics/export.d.mts +7 -0
  165. package/dist/plugins/analytics/export.mjs +86 -0
  166. package/dist/plugins/analytics/normalize.mjs +144 -0
  167. package/dist/plugins/analytics/query.mjs +164 -0
  168. package/dist/plugins/analytics/request-id.mjs +34 -0
  169. package/dist/plugins/analytics/routes.d.mts +11 -0
  170. package/dist/plugins/analytics/routes.mjs +211 -0
  171. package/dist/plugins/analytics/sse.d.mts +31 -0
  172. package/dist/plugins/analytics/sse.mjs +74 -0
  173. package/dist/plugins/analytics/store.mjs +103 -0
  174. package/dist/plugins/analytics/timeseries.d.mts +50 -0
  175. package/dist/plugins/analytics/timeseries.mjs +169 -0
  176. package/dist/plugins/analytics/trace.d.mts +48 -0
  177. package/dist/plugins/analytics/trace.mjs +83 -0
  178. package/dist/plugins/analytics/types.d.mts +145 -0
  179. package/dist/plugins/analytics/types.mjs +40 -0
  180. package/dist/plugins/analytics/utils.d.mts +4 -0
  181. package/dist/plugins/analytics/utils.mjs +56 -0
  182. package/dist/plugins/analytics.d.mts +18 -0
  183. package/dist/plugins/analytics.mjs +188 -0
  184. package/dist/plugins/batch-server.d.mts +20 -0
  185. package/dist/plugins/batch-server.mjs +91 -0
  186. package/dist/plugins/body-limit.d.mts +19 -0
  187. package/dist/plugins/body-limit.mjs +49 -0
  188. package/dist/plugins/cache.d.mts +170 -0
  189. package/dist/plugins/cache.mjs +212 -0
  190. package/dist/plugins/coerce.d.mts +24 -0
  191. package/dist/plugins/coerce.mjs +70 -0
  192. package/dist/plugins/cookies.d.mts +14 -0
  193. package/dist/plugins/cookies.mjs +48 -0
  194. package/dist/plugins/cors.d.mts +43 -0
  195. package/dist/plugins/cors.mjs +62 -0
  196. package/dist/plugins/file-upload.d.mts +38 -0
  197. package/dist/plugins/file-upload.mjs +102 -0
  198. package/dist/plugins/index.d.mts +18 -0
  199. package/dist/plugins/index.mjs +17 -0
  200. package/dist/plugins/otel.d.mts +35 -0
  201. package/dist/plugins/otel.mjs +40 -0
  202. package/dist/plugins/pino.d.mts +60 -0
  203. package/dist/plugins/pino.mjs +42 -0
  204. package/dist/plugins/pubsub.d.mts +50 -0
  205. package/dist/plugins/pubsub.mjs +53 -0
  206. package/dist/plugins/ratelimit.d.mts +53 -0
  207. package/dist/plugins/ratelimit.mjs +92 -0
  208. package/dist/plugins/signing.d.mts +41 -0
  209. package/dist/plugins/signing.mjs +118 -0
  210. package/dist/plugins/strict-get.d.mts +10 -0
  211. package/dist/plugins/strict-get.mjs +33 -0
  212. package/dist/scalar.d.mts +49 -0
  213. package/dist/scalar.mjs +311 -0
  214. package/dist/silgi.d.mts +144 -0
  215. package/dist/silgi.mjs +164 -0
  216. package/dist/trpc-interop.d.mts +22 -0
  217. package/dist/trpc-interop.mjs +68 -0
  218. package/dist/types.d.mts +108 -0
  219. package/dist/ws.d.mts +88 -0
  220. package/dist/ws.mjs +205 -0
  221. package/lib/dashboard/index.html +120 -0
  222. package/lib/ocache.d.mts +1 -0
  223. package/lib/ocache.mjs +1 -0
  224. package/lib/ofetch.d.mts +1 -0
  225. package/lib/ofetch.mjs +1 -0
  226. package/lib/srvx.d.mts +1 -0
  227. package/lib/srvx.mjs +1 -0
  228. package/lib/unstorage.d.mts +1 -0
  229. package/lib/unstorage.mjs +1 -0
  230. package/package.json +314 -150
  231. package/dist/build.d.mts +0 -3
  232. package/dist/build.mjs +0 -4
  233. package/dist/cli/build/build.mjs +0 -15
  234. package/dist/cli/build/dev.d.mts +0 -10
  235. package/dist/cli/build/dev.mjs +0 -91
  236. package/dist/cli/build/prepare.d.mts +0 -6
  237. package/dist/cli/build/prepare.mjs +0 -15
  238. package/dist/cli/commands/commands.mjs +0 -90
  239. package/dist/cli/commands/env.mjs +0 -53
  240. package/dist/cli/commands/init.mjs +0 -84
  241. package/dist/cli/commands/install.mjs +0 -52
  242. package/dist/cli/commands/prepare.mjs +0 -65
  243. package/dist/cli/commands/reset.mjs +0 -46
  244. package/dist/cli/commands/run.mjs +0 -31
  245. package/dist/cli/commands/watch.mjs +0 -153
  246. package/dist/cli/config/defaults.mjs +0 -117
  247. package/dist/cli/config/index.d.mts +0 -3
  248. package/dist/cli/config/index.mjs +0 -4
  249. package/dist/cli/config/loader.d.mts +0 -6
  250. package/dist/cli/config/loader.mjs +0 -71
  251. package/dist/cli/config/resolvers/compatibility.mjs +0 -71
  252. package/dist/cli/config/resolvers/imports.mjs +0 -35
  253. package/dist/cli/config/resolvers/paths.mjs +0 -98
  254. package/dist/cli/config/resolvers/storage.mjs +0 -23
  255. package/dist/cli/config/resolvers/url.mjs +0 -9
  256. package/dist/cli/config/types.d.mts +0 -14
  257. package/dist/cli/config/types.mjs +0 -147
  258. package/dist/cli/core/apiful.mjs +0 -36
  259. package/dist/cli/core/devServer.mjs +0 -10
  260. package/dist/cli/core/env.mjs +0 -68
  261. package/dist/cli/core/installPackage.mjs +0 -60
  262. package/dist/cli/core/runtimeConfig.mjs +0 -70
  263. package/dist/cli/core/scan.mjs +0 -35
  264. package/dist/cli/core/silgi.mjs +0 -111
  265. package/dist/cli/framework/emptyFramework.mjs +0 -7
  266. package/dist/cli/framework/h3.mjs +0 -55
  267. package/dist/cli/framework/index.mjs +0 -15
  268. package/dist/cli/framework/nitro.mjs +0 -24
  269. package/dist/cli/framework/nuxt.mjs +0 -10
  270. package/dist/cli/index.d.mts +0 -1
  271. package/dist/cli/index.mjs +0 -29
  272. package/dist/cli/module/exportScan.mjs +0 -180
  273. package/dist/cli/module/install.mjs +0 -49
  274. package/dist/cli/module/scan.mjs +0 -193
  275. package/dist/cli/scan/prepareCommands.mjs +0 -40
  276. package/dist/cli/scan/prepareConfigs.mjs +0 -33
  277. package/dist/cli/scan/prepareCoreFile.mjs +0 -118
  278. package/dist/cli/scan/prepareScanFile.mjs +0 -59
  279. package/dist/cli/scan/prepareSchema.mjs +0 -128
  280. package/dist/cli/scan/scanExportFile.mjs +0 -288
  281. package/dist/cli/scan/writeCoreFile.mjs +0 -22
  282. package/dist/cli/scan/writeTypesAndFiles.mjs +0 -72
  283. package/dist/cli/utils/cancel.mjs +0 -14
  284. package/dist/cli/utils/common.mjs +0 -15
  285. package/dist/cli/utils/compatibility.mjs +0 -33
  286. package/dist/cli/utils/debug.mjs +0 -11
  287. package/dist/cli/utils/ignore.mjs +0 -56
  288. package/dist/cli/utils/processManager.mjs +0 -170
  289. package/dist/cli/utils/readScanFile.mjs +0 -58
  290. package/dist/cli/utils/storage.mjs +0 -23
  291. package/dist/core/context.d.mts +0 -30
  292. package/dist/core/context.mjs +0 -32
  293. package/dist/core/createSilgi.d.mts +0 -6
  294. package/dist/core/createSilgi.mjs +0 -153
  295. package/dist/core/event.d.mts +0 -26
  296. package/dist/core/event.mjs +0 -44
  297. package/dist/core/index.d.mts +0 -25
  298. package/dist/core/index.mjs +0 -30
  299. package/dist/core/orchestrate.mjs +0 -115
  300. package/dist/core/response.d.mts +0 -20
  301. package/dist/core/response.mjs +0 -105
  302. package/dist/core/silgi.d.mts +0 -19
  303. package/dist/core/silgi.mjs +0 -141
  304. package/dist/core/silgiApp.d.mts +0 -9
  305. package/dist/core/silgiApp.mjs +0 -23
  306. package/dist/core/unctx.d.mts +0 -21
  307. package/dist/core/unctx.mjs +0 -35
  308. package/dist/core/utils/event-stream.d.mts +0 -53
  309. package/dist/core/utils/event-stream.mjs +0 -38
  310. package/dist/core/utils/event.d.mts +0 -8
  311. package/dist/core/utils/event.mjs +0 -12
  312. package/dist/core/utils/internal/event-stream.d.mts +0 -45
  313. package/dist/core/utils/internal/event-stream.mjs +0 -137
  314. package/dist/core/utils/internal/obj.mjs +0 -9
  315. package/dist/core/utils/internal/object.mjs +0 -29
  316. package/dist/core/utils/internal/query.mjs +0 -73
  317. package/dist/core/utils/internal/req.mjs +0 -35
  318. package/dist/core/utils/merge.d.mts +0 -14
  319. package/dist/core/utils/merge.mjs +0 -27
  320. package/dist/core/utils/middleware.d.mts +0 -14
  321. package/dist/core/utils/middleware.mjs +0 -12
  322. package/dist/core/utils/request.mjs +0 -35
  323. package/dist/core/utils/resolver.d.mts +0 -7
  324. package/dist/core/utils/resolver.mjs +0 -29
  325. package/dist/core/utils/runtime.d.mts +0 -7
  326. package/dist/core/utils/runtime.mjs +0 -20
  327. package/dist/core/utils/sanitize.mjs +0 -22
  328. package/dist/core/utils/schema.d.mts +0 -34
  329. package/dist/core/utils/schema.mjs +0 -33
  330. package/dist/core/utils/service.d.mts +0 -13
  331. package/dist/core/utils/service.mjs +0 -19
  332. package/dist/core/utils/shared.d.mts +0 -6
  333. package/dist/core/utils/shared.mjs +0 -7
  334. package/dist/core/utils/storage.d.mts +0 -24
  335. package/dist/core/utils/storage.mjs +0 -54
  336. package/dist/kit/add/add-commands.d.mts +0 -6
  337. package/dist/kit/add/add-commands.mjs +0 -12
  338. package/dist/kit/add/add-core-file.d.mts +0 -9
  339. package/dist/kit/add/add-core-file.mjs +0 -11
  340. package/dist/kit/add/add-imports.d.mts +0 -14
  341. package/dist/kit/add/add-imports.mjs +0 -56
  342. package/dist/kit/add/add-npm.d.mts +0 -14
  343. package/dist/kit/add/add-npm.mjs +0 -23
  344. package/dist/kit/define.d.mts +0 -28
  345. package/dist/kit/define.mjs +0 -25
  346. package/dist/kit/errors.d.mts +0 -6
  347. package/dist/kit/errors.mjs +0 -11
  348. package/dist/kit/esm.d.mts +0 -11
  349. package/dist/kit/esm.mjs +0 -21
  350. package/dist/kit/fs.d.mts +0 -4
  351. package/dist/kit/fs.mjs +0 -13
  352. package/dist/kit/function-utils.d.mts +0 -27
  353. package/dist/kit/function-utils.mjs +0 -75
  354. package/dist/kit/gen.d.mts +0 -5
  355. package/dist/kit/gen.mjs +0 -26
  356. package/dist/kit/hash.d.mts +0 -4
  357. package/dist/kit/hash.mjs +0 -10
  358. package/dist/kit/index.d.mts +0 -22
  359. package/dist/kit/index.mjs +0 -23
  360. package/dist/kit/isFramework.d.mts +0 -6
  361. package/dist/kit/isFramework.mjs +0 -21
  362. package/dist/kit/logger.d.mts +0 -6
  363. package/dist/kit/logger.mjs +0 -10
  364. package/dist/kit/migration.d.mts +0 -113
  365. package/dist/kit/migration.mjs +0 -301
  366. package/dist/kit/module.d.mts +0 -14
  367. package/dist/kit/module.mjs +0 -53
  368. package/dist/kit/path.d.mts +0 -7
  369. package/dist/kit/path.mjs +0 -26
  370. package/dist/kit/preset.d.mts +0 -8
  371. package/dist/kit/preset.mjs +0 -11
  372. package/dist/kit/resolve.d.mts +0 -37
  373. package/dist/kit/resolve.mjs +0 -82
  374. package/dist/kit/template.d.mts +0 -19
  375. package/dist/kit/template.mjs +0 -91
  376. package/dist/kit/useRequest.d.mts +0 -19
  377. package/dist/kit/useRequest.mjs +0 -63
  378. package/dist/kit/utils.d.mts +0 -34
  379. package/dist/kit/utils.mjs +0 -91
  380. package/dist/package.mjs +0 -176
  381. package/dist/presets/_all.gen.d.mts +0 -6
  382. package/dist/presets/_all.gen.mjs +0 -18
  383. package/dist/presets/_resolve.d.mts +0 -12
  384. package/dist/presets/_resolve.mjs +0 -57
  385. package/dist/presets/_types.gen.d.mts +0 -8
  386. package/dist/presets/_types.gen.mjs +0 -5
  387. package/dist/presets/h3/preset.d.mts +0 -6
  388. package/dist/presets/h3/preset.mjs +0 -35
  389. package/dist/presets/hono/preset.d.mts +0 -6
  390. package/dist/presets/hono/preset.mjs +0 -30
  391. package/dist/presets/index.d.mts +0 -3
  392. package/dist/presets/index.mjs +0 -3
  393. package/dist/presets/nitro/preset.d.mts +0 -6
  394. package/dist/presets/nitro/preset.mjs +0 -37
  395. package/dist/presets/npmpackage/preset.d.mts +0 -6
  396. package/dist/presets/npmpackage/preset.mjs +0 -29
  397. package/dist/presets/nuxt/preset.d.mts +0 -6
  398. package/dist/presets/nuxt/preset.mjs +0 -41
  399. package/dist/runtime/index.d.mts +0 -4
  400. package/dist/runtime/index.mjs +0 -5
  401. package/dist/runtime/internal/config.d.mts +0 -11
  402. package/dist/runtime/internal/config.mjs +0 -97
  403. package/dist/runtime/internal/debug.d.mts +0 -6
  404. package/dist/runtime/internal/debug.mjs +0 -11
  405. package/dist/runtime/internal/defu.d.mts +0 -4
  406. package/dist/runtime/internal/defu.mjs +0 -9
  407. package/dist/runtime/internal/index.d.mts +0 -7
  408. package/dist/runtime/internal/index.mjs +0 -8
  409. package/dist/runtime/internal/nitro.d.mts +0 -6
  410. package/dist/runtime/internal/nitro.mjs +0 -36
  411. package/dist/runtime/internal/nuxt.d.mts +0 -12
  412. package/dist/runtime/internal/nuxt.mjs +0 -16
  413. package/dist/runtime/internal/ofetch.d.mts +0 -8
  414. package/dist/runtime/internal/ofetch.mjs +0 -39
  415. package/dist/runtime/internal/plugin.d.mts +0 -7
  416. package/dist/runtime/internal/plugin.mjs +0 -8
  417. package/dist/types/cliConfig.d.mts +0 -288
  418. package/dist/types/cliConfig.mjs +0 -0
  419. package/dist/types/cliHooks.d.mts +0 -142
  420. package/dist/types/cliHooks.mjs +0 -0
  421. package/dist/types/compatibility.d.mts +0 -13
  422. package/dist/types/compatibility.mjs +0 -0
  423. package/dist/types/config.d.mts +0 -46
  424. package/dist/types/config.mjs +0 -0
  425. package/dist/types/dotenv.d.mts +0 -29
  426. package/dist/types/dotenv.mjs +0 -0
  427. package/dist/types/event.d.mts +0 -63
  428. package/dist/types/event.mjs +0 -0
  429. package/dist/types/global.d.mts +0 -24
  430. package/dist/types/global.mjs +0 -0
  431. package/dist/types/helper.d.mts +0 -25
  432. package/dist/types/helper.mjs +0 -0
  433. package/dist/types/hooks.d.mts +0 -37
  434. package/dist/types/hooks.mjs +0 -0
  435. package/dist/types/index.d.mts +0 -26
  436. package/dist/types/index.mjs +0 -0
  437. package/dist/types/kits.d.mts +0 -32
  438. package/dist/types/kits.mjs +0 -0
  439. package/dist/types/middleware.d.mts +0 -31
  440. package/dist/types/middleware.mjs +0 -0
  441. package/dist/types/module.d.mts +0 -102
  442. package/dist/types/module.mjs +0 -0
  443. package/dist/types/preset.d.mts +0 -20
  444. package/dist/types/preset.mjs +0 -0
  445. package/dist/types/route.d.mts +0 -59
  446. package/dist/types/route.mjs +0 -0
  447. package/dist/types/runtime/index.d.mts +0 -5
  448. package/dist/types/runtime/index.mjs +0 -0
  449. package/dist/types/runtime/nuxt.d.mts +0 -13
  450. package/dist/types/runtime/nuxt.mjs +0 -0
  451. package/dist/types/runtime/ofetch.d.mts +0 -14
  452. package/dist/types/runtime/ofetch.mjs +0 -0
  453. package/dist/types/runtime/plugin.d.mts +0 -8
  454. package/dist/types/runtime/plugin.mjs +0 -0
  455. package/dist/types/runtime/silgi.d.mts +0 -11
  456. package/dist/types/runtime/silgi.mjs +0 -0
  457. package/dist/types/schema.d.mts +0 -86
  458. package/dist/types/schema.mjs +0 -0
  459. package/dist/types/service.d.mts +0 -102
  460. package/dist/types/service.mjs +0 -0
  461. package/dist/types/shared.d.mts +0 -19
  462. package/dist/types/shared.mjs +0 -0
  463. package/dist/types/silgi.d.mts +0 -71
  464. package/dist/types/silgi.mjs +0 -0
  465. package/dist/types/silgiCLI.d.mts +0 -118
  466. package/dist/types/silgiCLI.mjs +0 -0
  467. package/dist/types/standard-schema.d.mts +0 -61
  468. package/dist/types/standard-schema.mjs +0 -0
  469. package/dist/types/storage.d.mts +0 -30
  470. package/dist/types/storage.mjs +0 -0
  471. package/dist/types/tree-kill.d.mts +0 -18
  472. package/dist/types/tree-kill.mjs +0 -0
  473. package/lib/config.d.mts +0 -7
  474. package/lib/config.mjs +0 -5
  475. package/lib/meta.d.mts +0 -4
  476. package/lib/meta.mjs +0 -6
  477. package/lib/runtime-meta.d.mts +0 -4
  478. package/lib/runtime-meta.mjs +0 -32
@@ -0,0 +1,40 @@
1
+ //#region src/plugins/analytics/types.ts
2
+ /**
3
+ * Analytics type definitions and RingBuffer data structure.
4
+ */
5
+ var RingBuffer = class {
6
+ #data;
7
+ #size;
8
+ #head = 0;
9
+ #count = 0;
10
+ constructor(size) {
11
+ this.#data = new Float64Array(size);
12
+ this.#size = size;
13
+ }
14
+ push(value) {
15
+ this.#data[this.#head] = value;
16
+ this.#head = (this.#head + 1) % this.#size;
17
+ if (this.#count < this.#size) this.#count++;
18
+ }
19
+ percentile(p) {
20
+ if (this.#count === 0) return 0;
21
+ const arr = new Float64Array(this.#count);
22
+ if (this.#count < this.#size) arr.set(this.#data.subarray(0, this.#count));
23
+ else arr.set(this.#data);
24
+ arr.sort();
25
+ const idx = Math.ceil(p / 100 * this.#count) - 1;
26
+ return arr[Math.max(0, idx)];
27
+ }
28
+ avg() {
29
+ if (this.#count === 0) return 0;
30
+ let sum = 0;
31
+ const n = this.#count;
32
+ for (let i = 0; i < n; i++) sum += this.#data[i];
33
+ return sum / n;
34
+ }
35
+ get count() {
36
+ return this.#count;
37
+ }
38
+ };
39
+ //#endregion
40
+ export { RingBuffer };
@@ -0,0 +1,4 @@
1
+ //#region src/plugins/analytics/utils.d.ts
2
+ declare function sanitizeHeaders(headers: Headers): Record<string, string>;
3
+ //#endregion
4
+ export { sanitizeHeaders };
@@ -0,0 +1,56 @@
1
+ //#region src/plugins/analytics/utils.ts
2
+ /**
3
+ * Shared utilities for the analytics subsystem.
4
+ *
5
+ * Helpers: rounding, header redaction, path matching, JSON safety.
6
+ */
7
+ const REDACTED = "[REDACTED]";
8
+ const SENSITIVE_HEADER_KEYS = new Set([
9
+ "authorization",
10
+ "cookie",
11
+ "set-cookie",
12
+ "x-api-key",
13
+ "x-auth-token",
14
+ "proxy-authorization"
15
+ ]);
16
+ function shouldRedactSensitiveData() {
17
+ return process.env.NODE_ENV === "production";
18
+ }
19
+ function redactHeaderValue(key, value) {
20
+ return shouldRedactSensitiveData() && SENSITIVE_HEADER_KEYS.has(key.toLowerCase()) ? REDACTED : value;
21
+ }
22
+ function round(n) {
23
+ return Math.round(n * 100) / 100;
24
+ }
25
+ function safeStringify(v) {
26
+ try {
27
+ return JSON.stringify(v, null, 2);
28
+ } catch {
29
+ return String(v);
30
+ }
31
+ }
32
+ function sanitizeHeaders(headers) {
33
+ const result = {};
34
+ headers.forEach((value, key) => {
35
+ result[key] = redactHeaderValue(key, value);
36
+ });
37
+ return result;
38
+ }
39
+ function matchesPathPrefix(pathname, prefixes) {
40
+ const normalized = pathname.startsWith("/") ? pathname.slice(1) : pathname;
41
+ for (const prefix of prefixes) if (normalized === prefix || normalized.startsWith(prefix + "/")) return true;
42
+ return false;
43
+ }
44
+ function isTrackedRequestPath(pathname) {
45
+ const normalized = pathname.startsWith("/") ? pathname.slice(1) : pathname;
46
+ return normalized === "api" || normalized.startsWith("api/") || normalized === "graphql" || normalized.startsWith("graphql/");
47
+ }
48
+ function isAnalyticsPath(pathname) {
49
+ return pathname === "api/analytics" || pathname.startsWith("api/analytics/");
50
+ }
51
+ /** Helper to safely cast unknown to Record. */
52
+ function asRecord(value) {
53
+ return value && typeof value === "object" ? value : null;
54
+ }
55
+ //#endregion
56
+ export { asRecord, isAnalyticsPath, isTrackedRequestPath, matchesPathPrefix, redactHeaderValue, round, safeStringify, sanitizeHeaders };
@@ -0,0 +1,18 @@
1
+ import { AnalyticsOptions, AnalyticsSnapshot, ErrorEntry, ProcedureCall, ProcedureSnapshot, RequestEntry, SpanKind, TaskExecution, TaskSnapshot, TraceSpan } from "./analytics/types.mjs";
2
+ import { AnalyticsCollector } from "./analytics/collector.mjs";
3
+ import { RequestTrace, trace } from "./analytics/trace.mjs";
4
+ import { analyticsAuthResponse, analyticsHTML, checkAnalyticsAuth, serveAnalyticsRoute } from "./analytics/routes.mjs";
5
+ import { errorToMarkdown, requestToMarkdown } from "./analytics/export.mjs";
6
+ import { sanitizeHeaders } from "./analytics/utils.mjs";
7
+ import { RequestAccumulator } from "./analytics/accumulator.mjs";
8
+ import { analyticsTraceMap } from "../core/trace-map.mjs";
9
+ import { FetchHandler } from "../core/handler.mjs";
10
+
11
+ //#region src/plugins/analytics.d.ts
12
+ /**
13
+ * Wrap a fetch handler with analytics collection.
14
+ * Intercepts analytics dashboard routes and instruments every request.
15
+ */
16
+ declare function wrapWithAnalytics(handler: FetchHandler, options?: AnalyticsOptions): FetchHandler;
17
+ //#endregion
18
+ export { AnalyticsCollector, type AnalyticsOptions, type AnalyticsSnapshot, type ErrorEntry, type ProcedureCall, type ProcedureSnapshot, RequestAccumulator, type RequestEntry, RequestTrace, type SpanKind, type TaskExecution, type TaskSnapshot, type TraceSpan, analyticsAuthResponse, analyticsHTML, analyticsTraceMap, checkAnalyticsAuth, errorToMarkdown, requestToMarkdown, sanitizeHeaders, serveAnalyticsRoute, trace, wrapWithAnalytics };
@@ -0,0 +1,188 @@
1
+ import { ValidationError } from "../core/schema.mjs";
2
+ import { SilgiError, toSilgiError } from "../core/error.mjs";
3
+ import { analyticsTraceMap } from "../core/trace-map.mjs";
4
+ import { parseUrlPathname } from "../core/url.mjs";
5
+ import { generateRequestId } from "./analytics/request-id.mjs";
6
+ import { isAnalyticsPath, isTrackedRequestPath, round, sanitizeHeaders } from "./analytics/utils.mjs";
7
+ import { RequestAccumulator } from "./analytics/accumulator.mjs";
8
+ import { AnalyticsCollector } from "./analytics/collector.mjs";
9
+ import { errorToMarkdown, requestToMarkdown } from "./analytics/export.mjs";
10
+ import { analyticsAuthResponse, analyticsHTML, checkAnalyticsAuth, serveAnalyticsRoute } from "./analytics/routes.mjs";
11
+ import { RequestTrace, trace } from "./analytics/trace.mjs";
12
+ //#region src/plugins/analytics.ts
13
+ /**
14
+ * Built-in analytics plugin — zero-dependency monitoring with deep error tracing.
15
+ *
16
+ * This module is the public entry point. Implementation lives in ./analytics/.
17
+ *
18
+ * - Per-procedure metrics (count, errors, latency percentiles) via ring buffers
19
+ * - Full error log with input, headers, stack trace, custom spans
20
+ * - `trace()` helper for measuring DB queries, API calls, etc.
21
+ * - HTTP-level request tracking with procedure grouping (batch support)
22
+ * - Unique request IDs via `x-request-id` response header
23
+ *
24
+ * Dashboard at /api/analytics, JSON API at /api/analytics/stats, errors at /api/analytics/errors.
25
+ */
26
+ async function captureResponseBody(response) {
27
+ const lowered = (response.headers.get("content-type") ?? "").toLowerCase();
28
+ if (!response.body || lowered.includes("text/event-stream") || lowered.includes("application/octet-stream")) return { output: null };
29
+ try {
30
+ const text = await response.clone().text();
31
+ if (!text) return { output: null };
32
+ let output = text;
33
+ if (lowered.includes("application/json") || lowered.includes("+json")) try {
34
+ output = JSON.parse(text);
35
+ } catch {
36
+ output = text;
37
+ }
38
+ if (response.status < 400) return { output };
39
+ if (output && typeof output === "object") {
40
+ const record = output;
41
+ const message = typeof record.message === "string" ? record.message : null;
42
+ const code = typeof record.code === "string" ? record.code : null;
43
+ if (message && code) return {
44
+ output,
45
+ error: `${code}: ${message}`
46
+ };
47
+ if (message) return {
48
+ output,
49
+ error: message
50
+ };
51
+ }
52
+ return {
53
+ output,
54
+ error: typeof output === "string" ? output : JSON.stringify(output)
55
+ };
56
+ } catch {
57
+ return { output: null };
58
+ }
59
+ }
60
+ function extractResponseError(output, status, fallback) {
61
+ if (output && typeof output === "object") {
62
+ const record = output;
63
+ const code = typeof record.code === "string" ? record.code : null;
64
+ const message = typeof record.message === "string" ? record.message : null;
65
+ if (code && message) return {
66
+ code,
67
+ message
68
+ };
69
+ if (message) return {
70
+ code: `HTTP_${status}`,
71
+ message
72
+ };
73
+ }
74
+ if (fallback) return {
75
+ code: `HTTP_${status}`,
76
+ message: fallback
77
+ };
78
+ return {
79
+ code: `HTTP_${status}`,
80
+ message: `Request failed with status ${status}`
81
+ };
82
+ }
83
+ /**
84
+ * Wrap a fetch handler with analytics collection.
85
+ * Intercepts analytics dashboard routes and instruments every request.
86
+ */
87
+ function wrapWithAnalytics(handler, options = {}) {
88
+ const collector = new AnalyticsCollector(options);
89
+ const dashboardHtml = analyticsHTML();
90
+ const auth = options.auth;
91
+ import("../core/task.mjs").then(({ setTaskAnalytics }) => {
92
+ setTaskAnalytics((entry) => collector.recordTask({
93
+ ...entry,
94
+ spans: entry.spans ?? []
95
+ }));
96
+ });
97
+ return async (request) => {
98
+ const pathname = parseUrlPathname(request.url);
99
+ if (isAnalyticsPath(pathname)) {
100
+ if (auth) {
101
+ const authResult = checkAnalyticsAuth(request, auth);
102
+ if (!(authResult instanceof Promise ? await authResult : authResult)) return analyticsAuthResponse(pathname);
103
+ }
104
+ return serveAnalyticsRoute(pathname, request, collector, dashboardHtml);
105
+ }
106
+ if (!isTrackedRequestPath(pathname) || collector.isIgnored(pathname)) return handler(request);
107
+ const incomingTraceId = request.headers.get("x-trace-id");
108
+ const parentRequestId = request.headers.get("x-parent-request-id");
109
+ const traceId = incomingTraceId || generateRequestId();
110
+ const acc = new RequestAccumulator(request, collector, traceId, parentRequestId ?? void 0);
111
+ const reqTrace = new RequestTrace();
112
+ const t0 = performance.now();
113
+ analyticsTraceMap.set(request, reqTrace);
114
+ let response;
115
+ try {
116
+ response = await handler(request);
117
+ const durationMs = round(performance.now() - t0);
118
+ const captured = await captureResponseBody(response);
119
+ const procedureInput = reqTrace.procedureInput ?? null;
120
+ const procedureOutput = reqTrace.procedureOutput ?? captured.output;
121
+ const procedureSpans = reqTrace.spans ?? [];
122
+ collector.record(pathname, durationMs);
123
+ acc.addProcedure({
124
+ procedure: pathname,
125
+ durationMs,
126
+ status: response.status,
127
+ input: procedureInput,
128
+ output: procedureOutput,
129
+ spans: procedureSpans,
130
+ error: captured.error
131
+ });
132
+ if (response.status >= 400) {
133
+ const { code, message } = extractResponseError(procedureOutput, response.status, captured.error);
134
+ collector.recordError(pathname, durationMs, message);
135
+ collector.recordDetailedError({
136
+ requestId: acc.requestId,
137
+ timestamp: Date.now(),
138
+ procedure: pathname,
139
+ error: message,
140
+ code,
141
+ status: response.status,
142
+ stack: "",
143
+ input: procedureInput,
144
+ headers: sanitizeHeaders(request.headers),
145
+ durationMs,
146
+ spans: procedureSpans
147
+ });
148
+ }
149
+ } catch (error) {
150
+ const durationMs = round(performance.now() - t0);
151
+ const errorMsg = error instanceof Error ? error.message : String(error);
152
+ const isValidation = error instanceof ValidationError;
153
+ const silgiErr = isValidation ? null : error instanceof SilgiError ? error : toSilgiError(error);
154
+ const errStatus = isValidation ? 400 : silgiErr?.status ?? 500;
155
+ collector.recordError(pathname, durationMs, errorMsg);
156
+ collector.recordDetailedError({
157
+ requestId: acc.requestId,
158
+ timestamp: Date.now(),
159
+ procedure: pathname,
160
+ error: errorMsg,
161
+ code: isValidation ? "BAD_REQUEST" : silgiErr?.code ?? "INTERNAL_SERVER_ERROR",
162
+ status: errStatus,
163
+ stack: error instanceof Error ? (error.stack ?? "").slice(0, 2048) : "",
164
+ input: null,
165
+ headers: sanitizeHeaders(request.headers),
166
+ durationMs,
167
+ spans: reqTrace.spans ?? []
168
+ });
169
+ throw error;
170
+ } finally {
171
+ analyticsTraceMap.delete(request);
172
+ }
173
+ const headers = new Headers(response.headers);
174
+ headers.set("x-request-id", acc.requestId);
175
+ headers.set("x-trace-id", traceId);
176
+ const cookie = acc.getSessionCookie();
177
+ if (cookie) headers.append("set-cookie", cookie);
178
+ const injected = new Response(response.body, {
179
+ status: response.status,
180
+ statusText: response.statusText,
181
+ headers
182
+ });
183
+ acc.flushWithResponse(injected);
184
+ return injected;
185
+ };
186
+ }
187
+ //#endregion
188
+ export { AnalyticsCollector, RequestAccumulator, RequestTrace, analyticsAuthResponse, analyticsHTML, analyticsTraceMap, checkAnalyticsAuth, errorToMarkdown, requestToMarkdown, sanitizeHeaders, serveAnalyticsRoute, trace, wrapWithAnalytics };
@@ -0,0 +1,20 @@
1
+ import { RouterDef } from "../types.mjs";
2
+
3
+ //#region src/plugins/batch-server.d.ts
4
+ interface BatchHandlerOptions<TCtx extends Record<string, unknown>> {
5
+ /** Context factory — called once per batch request */
6
+ context: (req: Request) => TCtx | Promise<TCtx>;
7
+ /** Maximum number of calls in a single batch. Default: 50 */
8
+ maxBatchSize?: number;
9
+ }
10
+ /**
11
+ * Create a Fetch API handler that processes batched RPC calls.
12
+ *
13
+ * Expects a POST with JSON body: `[{ path, input }, ...]`
14
+ * Returns: `[{ data } | { error }, ...]`
15
+ *
16
+ * All calls in a batch share the same context (computed once).
17
+ */
18
+ declare function createBatchHandler<TCtx extends Record<string, unknown>>(router: RouterDef, options: BatchHandlerOptions<TCtx>): (request: Request) => Promise<Response>;
19
+ //#endregion
20
+ export { BatchHandlerOptions, createBatchHandler };
@@ -0,0 +1,91 @@
1
+ import { ValidationError } from "../core/schema.mjs";
2
+ import { SilgiError, toSilgiError } from "../core/error.mjs";
3
+ import { compileRouter } from "../compile.mjs";
4
+ //#region src/plugins/batch-server.ts
5
+ /**
6
+ * Server-side batch endpoint — handle multiple RPC calls in one HTTP request.
7
+ *
8
+ * Works with the client-side BatchLink to combine multiple calls into
9
+ * a single HTTP round-trip.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { createBatchHandler } from "silgi/plugins"
14
+ *
15
+ * const batchHandler = createBatchHandler(appRouter, {
16
+ * context: (req) => ({ db: getDB() }),
17
+ * maxBatchSize: 20,
18
+ * })
19
+ *
20
+ * // Mount at /batch endpoint alongside your normal handler
21
+ * ```
22
+ */
23
+ /**
24
+ * Create a Fetch API handler that processes batched RPC calls.
25
+ *
26
+ * Expects a POST with JSON body: `[{ path, input }, ...]`
27
+ * Returns: `[{ data } | { error }, ...]`
28
+ *
29
+ * All calls in a batch share the same context (computed once).
30
+ */
31
+ function createBatchHandler(router, options) {
32
+ const flatRouter = compileRouter(router);
33
+ const { maxBatchSize = 50 } = options;
34
+ return async (request) => {
35
+ if (request.method !== "POST") return Response.json({
36
+ code: "METHOD_NOT_ALLOWED",
37
+ status: 405
38
+ }, { status: 405 });
39
+ let calls;
40
+ try {
41
+ calls = await request.json();
42
+ } catch {
43
+ return Response.json({
44
+ code: "BAD_REQUEST",
45
+ status: 400,
46
+ message: "Invalid JSON"
47
+ }, { status: 400 });
48
+ }
49
+ if (!Array.isArray(calls)) return Response.json({
50
+ code: "BAD_REQUEST",
51
+ status: 400,
52
+ message: "Expected array"
53
+ }, { status: 400 });
54
+ if (calls.length > maxBatchSize) return Response.json({
55
+ code: "BAD_REQUEST",
56
+ status: 400,
57
+ message: `Batch too large: ${calls.length} calls (max ${maxBatchSize})`
58
+ }, { status: 400 });
59
+ const baseCtx = await options.context(request);
60
+ const results = await Promise.all(calls.map(async (call) => {
61
+ if (typeof call.path !== "string" || call.path.length === 0 || call.path.length > 512 || call.path.includes("\0")) return { error: {
62
+ code: "BAD_REQUEST",
63
+ status: 400,
64
+ message: "Invalid procedure path"
65
+ } };
66
+ const route = flatRouter("POST", "/" + call.path)?.data;
67
+ if (!route) return { error: {
68
+ code: "NOT_FOUND",
69
+ status: 404,
70
+ message: "Procedure not found"
71
+ } };
72
+ try {
73
+ const ctx = Object.create(null);
74
+ const keys = Object.keys(baseCtx);
75
+ for (let i = 0; i < keys.length; i++) ctx[keys[i]] = baseCtx[keys[i]];
76
+ return { data: await route.handler(ctx, call.input, request.signal) };
77
+ } catch (error) {
78
+ if (error instanceof ValidationError) return { error: {
79
+ code: "BAD_REQUEST",
80
+ status: 400,
81
+ message: error.message,
82
+ data: { issues: error.issues }
83
+ } };
84
+ return { error: (error instanceof SilgiError ? error : toSilgiError(error)).toJSON() };
85
+ }
86
+ }));
87
+ return Response.json(results);
88
+ };
89
+ }
90
+ //#endregion
91
+ export { createBatchHandler };
@@ -0,0 +1,19 @@
1
+ import { GuardDef } from "../types.mjs";
2
+
3
+ //#region src/plugins/body-limit.d.ts
4
+ interface BodyLimitOptions {
5
+ /** Maximum body size in bytes. Default: 1_048_576 (1 MB) */
6
+ maxBytes?: number;
7
+ /** Custom error message. */
8
+ message?: string;
9
+ }
10
+ /**
11
+ * Create a guard that rejects requests with bodies larger than `maxBytes`.
12
+ *
13
+ * Checks Content-Length header when present (zero overhead for GET requests).
14
+ * For chunked/streaming bodies without Content-Length, the limit is enforced
15
+ * at parse time by the handler's body parsing logic.
16
+ */
17
+ declare function bodyLimitGuard(options?: BodyLimitOptions): GuardDef<Record<string, unknown>>;
18
+ //#endregion
19
+ export { BodyLimitOptions, bodyLimitGuard };
@@ -0,0 +1,49 @@
1
+ import { SilgiError } from "../core/error.mjs";
2
+ //#region src/plugins/body-limit.ts
3
+ /**
4
+ * Body limit guard — reject oversized request bodies.
5
+ *
6
+ * Checks Content-Length header first (fast path), then enforces
7
+ * actual body size during stream consumption as a fallback.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { bodyLimitGuard } from "silgi/plugins"
12
+ *
13
+ * const upload = k
14
+ * .$use(bodyLimitGuard({ maxBytes: 5 * 1024 * 1024 })) // 5 MB
15
+ * .$resolve(({ input }) => processUpload(input))
16
+ * ```
17
+ */
18
+ /**
19
+ * Create a guard that rejects requests with bodies larger than `maxBytes`.
20
+ *
21
+ * Checks Content-Length header when present (zero overhead for GET requests).
22
+ * For chunked/streaming bodies without Content-Length, the limit is enforced
23
+ * at parse time by the handler's body parsing logic.
24
+ */
25
+ function bodyLimitGuard(options = {}) {
26
+ const { maxBytes = 1048576, message = "Request body too large" } = options;
27
+ return {
28
+ kind: "guard",
29
+ fn: (ctx) => {
30
+ const headers = ctx.headers;
31
+ if (!headers) return;
32
+ const cl = headers["content-length"];
33
+ if (!cl) return;
34
+ const size = Number.parseInt(cl, 10);
35
+ if (Number.isNaN(size)) return;
36
+ if (size > maxBytes) throw new SilgiError("PAYLOAD_TOO_LARGE", {
37
+ status: 413,
38
+ message,
39
+ data: {
40
+ maxBytes,
41
+ receivedBytes: size
42
+ }
43
+ });
44
+ },
45
+ maxBytes
46
+ };
47
+ }
48
+ //#endregion
49
+ export { bodyLimitGuard };
@@ -0,0 +1,170 @@
1
+ import { WrapDef } from "../types.mjs";
2
+ import { CacheEntry, CacheOptions, StorageInterface } from "ocache";
3
+
4
+ //#region src/plugins/cache.d.ts
5
+ interface CacheQueryOptions<T = unknown> {
6
+ /** Cache TTL in seconds (default: 60) */
7
+ maxAge?: number;
8
+ /** Enable stale-while-revalidate (default: true) */
9
+ swr?: boolean;
10
+ /** Max seconds to serve stale while revalidating (default: maxAge) */
11
+ staleMaxAge?: number;
12
+ /** Custom cache key generator from input */
13
+ getKey?: (input: unknown) => string;
14
+ /** Cache key name prefix (default: procedure path, set automatically) */
15
+ name?: string;
16
+ /**
17
+ * When returns `true`, skip cache entirely and call resolver directly.
18
+ * Useful for admin users or debug modes.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * cacheQuery({
23
+ * shouldBypassCache: (input) => input?.noCache === true,
24
+ * })
25
+ * ```
26
+ */
27
+ shouldBypassCache?: (input: unknown) => boolean | Promise<boolean>;
28
+ /**
29
+ * When returns `true`, invalidate cache for this key and re-resolve.
30
+ * The new result is cached normally.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * cacheQuery({
35
+ * shouldInvalidateCache: (input) => input?.refresh === true,
36
+ * })
37
+ * ```
38
+ */
39
+ shouldInvalidateCache?: (input: unknown) => boolean | Promise<boolean>;
40
+ /**
41
+ * Validate a cache entry before returning it.
42
+ * Return `false` to treat as cache miss and re-resolve.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * cacheQuery({
47
+ * validate: (entry) => entry.value !== null && entry.value !== undefined,
48
+ * })
49
+ * ```
50
+ */
51
+ validate?: (entry: CacheEntry<T>) => boolean;
52
+ /**
53
+ * Transform a cache entry before returning.
54
+ * Runs on both cache hits and fresh resolves.
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * cacheQuery({
59
+ * transform: (entry) => ({ ...entry.value, cachedAt: entry.mtime }),
60
+ * })
61
+ * ```
62
+ */
63
+ transform?: (entry: CacheEntry<T>) => T;
64
+ /**
65
+ * Storage base prefix for cache keys.
66
+ * Defaults to `'/cache'`.
67
+ *
68
+ * @example
69
+ * ```ts
70
+ * cacheQuery({
71
+ * base: '/my-app-cache',
72
+ * })
73
+ * ```
74
+ */
75
+ base?: string;
76
+ /**
77
+ * Custom integrity value. Auto-generated from the resolver + options by default.
78
+ * When integrity changes (e.g. after redeploy), stale cache is invalidated.
79
+ */
80
+ integrity?: string;
81
+ /** Error handler for cache read/write/SWR failures */
82
+ onError?: (error: unknown) => void;
83
+ }
84
+ /**
85
+ * Wrap middleware that caches query results.
86
+ *
87
+ * Uses ocache under the hood: TTL, SWR, dedup, integrity, bypass, invalidation.
88
+ * Default: 60s TTL, SWR enabled.
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * const listUsers = k
93
+ * .$use(cacheQuery({ maxAge: 60 }))
94
+ * .$resolve(({ ctx }) => ctx.db.users.findMany())
95
+ *
96
+ * // Advanced: bypass cache for admin, custom validation
97
+ * const listPosts = k
98
+ * .$use(cacheQuery({
99
+ * maxAge: 300,
100
+ * swr: true,
101
+ * staleMaxAge: 600,
102
+ * shouldBypassCache: (input) => (input as any)?.noCache,
103
+ * shouldInvalidateCache: (input) => (input as any)?.refresh,
104
+ * validate: (entry) => Array.isArray(entry.value),
105
+ * onError: (err) => console.error('[cache]', err),
106
+ * }))
107
+ * .$resolve(({ ctx }) => ctx.db.posts.findMany())
108
+ * ```
109
+ */
110
+ declare function cacheQuery<T = unknown>(options?: CacheQueryOptions<T>): WrapDef;
111
+ /**
112
+ * Invalidate cached entries for a procedure by name.
113
+ *
114
+ * Call this after mutations to clear related query caches.
115
+ *
116
+ * @example
117
+ * ```ts
118
+ * const createUser = k.$resolve(async ({ input, ctx }) => {
119
+ * const user = await ctx.db.users.create(input)
120
+ * await invalidateQueryCache('users_list')
121
+ * return user
122
+ * })
123
+ * ```
124
+ */
125
+ declare function invalidateQueryCache(name: string): Promise<void>;
126
+ /**
127
+ * Set the cache storage backend.
128
+ *
129
+ * Default: in-memory Map with TTL.
130
+ * For production, use `createUnstorageAdapter()` with Redis, Cloudflare KV, etc.
131
+ *
132
+ * @example
133
+ * ```ts
134
+ * import { setCacheStorage, createUnstorageAdapter } from 'silgi/cache'
135
+ * import { createStorage } from 'silgi/unstorage'
136
+ * import redisDriver from 'unstorage/drivers/redis'
137
+ *
138
+ * setCacheStorage(createUnstorageAdapter(
139
+ * createStorage({ driver: redisDriver({ url: 'redis://localhost' }) })
140
+ * ))
141
+ * ```
142
+ */
143
+ declare function setCacheStorage(storage: StorageInterface): void;
144
+ /**
145
+ * Minimal interface matching unstorage's Storage.
146
+ * Avoids hard dependency on unstorage — users bring their own.
147
+ */
148
+ interface UnstorageCompatible {
149
+ getItem<T = unknown>(key: string): Promise<T | null> | T | null;
150
+ setItem(key: string, value: unknown, opts?: {
151
+ ttl?: number;
152
+ }): Promise<void> | void;
153
+ removeItem(key: string): Promise<void> | void;
154
+ }
155
+ /**
156
+ * Create an ocache-compatible storage adapter from an unstorage instance.
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * import { createStorage } from 'silgi/unstorage'
161
+ * import redisDriver from 'unstorage/drivers/redis'
162
+ *
163
+ * const storage = createStorage({ driver: redisDriver({ url: 'redis://localhost' }) })
164
+ * const adapter = createUnstorageAdapter(storage)
165
+ * setCacheStorage(adapter)
166
+ * ```
167
+ */
168
+ declare function createUnstorageAdapter(storage: UnstorageCompatible): StorageInterface;
169
+ //#endregion
170
+ export { type CacheEntry, type CacheOptions, CacheQueryOptions, type StorageInterface, UnstorageCompatible, cacheQuery, createUnstorageAdapter, invalidateQueryCache, setCacheStorage };