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,35 @@
1
+ import { WrapDef } from "../types.mjs";
2
+
3
+ //#region src/plugins/otel.d.ts
4
+ interface Span {
5
+ setAttribute(key: string, value: string | number | boolean): void;
6
+ setStatus(status: {
7
+ code: number;
8
+ message?: string;
9
+ }): void;
10
+ addEvent(name: string, attributes?: Record<string, unknown>): void;
11
+ end(): void;
12
+ }
13
+ interface Tracer {
14
+ startSpan(name: string, options?: {
15
+ attributes?: Record<string, string | number | boolean>;
16
+ }): Span;
17
+ }
18
+ /**
19
+ * Create an OTel tracing wrap middleware.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { otelWrap } from "silgi/otel"
24
+ * import { trace } from "@opentelemetry/api"
25
+ *
26
+ * const tracing = otelWrap(trace.getTracer("my-service"))
27
+ *
28
+ * const proc = k
29
+ * .$use(tracing)
30
+ * .$resolve(({ ctx }) => ctx.db.find())
31
+ * ```
32
+ */
33
+ declare function otelWrap(tracer: Tracer, spanName?: string): WrapDef;
34
+ //#endregion
35
+ export { Span, Tracer, otelWrap };
@@ -0,0 +1,40 @@
1
+ //#region src/plugins/otel.ts
2
+ /**
3
+ * Create an OTel tracing wrap middleware.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { otelWrap } from "silgi/otel"
8
+ * import { trace } from "@opentelemetry/api"
9
+ *
10
+ * const tracing = otelWrap(trace.getTracer("my-service"))
11
+ *
12
+ * const proc = k
13
+ * .$use(tracing)
14
+ * .$resolve(({ ctx }) => ctx.db.find())
15
+ * ```
16
+ */
17
+ function otelWrap(tracer, spanName = "rpc.call") {
18
+ return {
19
+ kind: "wrap",
20
+ fn: async (_ctx, next) => {
21
+ const span = tracer.startSpan(spanName, { attributes: { "rpc.system": "silgi" } });
22
+ try {
23
+ const result = await next();
24
+ span.setStatus({ code: 0 });
25
+ return result;
26
+ } catch (error) {
27
+ span.setStatus({
28
+ code: 2,
29
+ message: String(error)
30
+ });
31
+ span.addEvent("exception", { "exception.message": error instanceof Error ? error.message : String(error) });
32
+ throw error;
33
+ } finally {
34
+ span.end();
35
+ }
36
+ }
37
+ };
38
+ }
39
+ //#endregion
40
+ export { otelWrap };
@@ -0,0 +1,60 @@
1
+ //#region src/plugins/pino.d.ts
2
+ /**
3
+ * Pino logging plugin — v2 hook-based.
4
+ *
5
+ * Logs request lifecycle events via silgi hooks.
6
+ */
7
+ interface Logger {
8
+ child(bindings: Record<string, unknown>): Logger;
9
+ info(obj: Record<string, unknown>, msg?: string): void;
10
+ error(obj: Record<string, unknown>, msg?: string): void;
11
+ warn(obj: Record<string, unknown>, msg?: string): void;
12
+ debug(obj: Record<string, unknown>, msg?: string): void;
13
+ }
14
+ interface LoggingOptions {
15
+ /** The root logger instance */
16
+ logger: Logger;
17
+ /** Log request received events (default: true) */
18
+ logRequests?: boolean;
19
+ /** Log response events (default: true) */
20
+ logResponses?: boolean;
21
+ }
22
+ /**
23
+ * Create logging hooks for silgi().
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import pino from "pino"
28
+ * import { loggingHooks } from "silgi/pino"
29
+ *
30
+ * const k = silgi({
31
+ * context: (req) => ({}),
32
+ * hooks: loggingHooks({ logger: pino() }),
33
+ * })
34
+ * ```
35
+ */
36
+ declare function loggingHooks(options: LoggingOptions): {
37
+ error: ({
38
+ path,
39
+ error
40
+ }: {
41
+ path: string;
42
+ error: unknown;
43
+ }) => void;
44
+ response?: (({
45
+ path,
46
+ durationMs
47
+ }: {
48
+ path: string;
49
+ durationMs: number;
50
+ }) => void) | undefined;
51
+ request?: (({
52
+ path,
53
+ input
54
+ }: {
55
+ path: string;
56
+ input: unknown;
57
+ }) => void) | undefined;
58
+ };
59
+ //#endregion
60
+ export { Logger, LoggingOptions, loggingHooks };
@@ -0,0 +1,42 @@
1
+ //#region src/plugins/pino.ts
2
+ /**
3
+ * Create logging hooks for silgi().
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import pino from "pino"
8
+ * import { loggingHooks } from "silgi/pino"
9
+ *
10
+ * const k = silgi({
11
+ * context: (req) => ({}),
12
+ * hooks: loggingHooks({ logger: pino() }),
13
+ * })
14
+ * ```
15
+ */
16
+ function loggingHooks(options) {
17
+ const { logger } = options;
18
+ const logRequests = options.logRequests ?? true;
19
+ const logResponses = options.logResponses ?? true;
20
+ return {
21
+ ...logRequests && { request: ({ path, input }) => {
22
+ logger.info({
23
+ path,
24
+ hasInput: input !== void 0
25
+ }, "request received");
26
+ } },
27
+ ...logResponses && { response: ({ path, durationMs }) => {
28
+ logger.info({
29
+ path,
30
+ durationMs: Math.round(durationMs * 100) / 100
31
+ }, "response sent");
32
+ } },
33
+ error: ({ path, error }) => {
34
+ logger.error({
35
+ path,
36
+ error: error instanceof Error ? error.message : String(error)
37
+ }, "request error");
38
+ }
39
+ };
40
+ }
41
+ //#endregion
42
+ export { loggingHooks };
@@ -0,0 +1,50 @@
1
+ //#region src/plugins/pubsub.d.ts
2
+ /**
3
+ * Publisher/PubSub — event pub/sub with pluggable backends.
4
+ *
5
+ * Publish events from any procedure, subscribe from SSE/WebSocket.
6
+ * Built-in memory adapter. Redis/Upstash adapters plug in via interface.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { createPublisher, MemoryPubSub } from "silgi/plugins"
11
+ *
12
+ * const pubsub = createPublisher(new MemoryPubSub())
13
+ *
14
+ * // Publish from a mutation
15
+ * const createUser = k.$resolve(async ({ input, ctx }) => {
16
+ * const user = await ctx.db.users.create(input)
17
+ * await pubsub.publish("user:created", user)
18
+ * return user
19
+ * })
20
+ *
21
+ * // Subscribe via SSE
22
+ * const onUserCreated = k.subscription(async function* () {
23
+ * yield* pubsub.subscribe("user:created")
24
+ * })
25
+ * ```
26
+ */
27
+ interface PubSubBackend {
28
+ publish(channel: string, data: unknown): Promise<void>;
29
+ subscribe(channel: string, callback: (data: unknown) => void): () => void;
30
+ }
31
+ declare class MemoryPubSub implements PubSubBackend {
32
+ #private;
33
+ publish(channel: string, data: unknown): Promise<void>;
34
+ subscribe(channel: string, callback: (data: unknown) => void): () => void;
35
+ }
36
+ interface Publisher {
37
+ /** Publish an event to a channel */
38
+ publish(channel: string, data: unknown): Promise<void>;
39
+ /** Subscribe to a channel — returns an async iterable for use in subscriptions */
40
+ subscribe<T = unknown>(channel: string): AsyncGenerator<T, void, unknown>;
41
+ }
42
+ /**
43
+ * Create a publisher from a PubSub backend.
44
+ *
45
+ * The publisher exposes `publish()` for mutations and `subscribe()`
46
+ * as an async generator for SSE/WebSocket subscriptions.
47
+ */
48
+ declare function createPublisher(backend: PubSubBackend): Publisher;
49
+ //#endregion
50
+ export { MemoryPubSub, PubSubBackend, Publisher, createPublisher };
@@ -0,0 +1,53 @@
1
+ //#region src/plugins/pubsub.ts
2
+ var MemoryPubSub = class {
3
+ #listeners = /* @__PURE__ */ new Map();
4
+ async publish(channel, data) {
5
+ const listeners = this.#listeners.get(channel);
6
+ if (!listeners) return;
7
+ for (const cb of listeners) cb(data);
8
+ }
9
+ subscribe(channel, callback) {
10
+ let set = this.#listeners.get(channel);
11
+ if (!set) {
12
+ set = /* @__PURE__ */ new Set();
13
+ this.#listeners.set(channel, set);
14
+ }
15
+ set.add(callback);
16
+ return () => {
17
+ set.delete(callback);
18
+ if (set.size === 0) this.#listeners.delete(channel);
19
+ };
20
+ }
21
+ };
22
+ /**
23
+ * Create a publisher from a PubSub backend.
24
+ *
25
+ * The publisher exposes `publish()` for mutations and `subscribe()`
26
+ * as an async generator for SSE/WebSocket subscriptions.
27
+ */
28
+ function createPublisher(backend) {
29
+ return {
30
+ publish: (channel, data) => backend.publish(channel, data),
31
+ async *subscribe(channel) {
32
+ const queue = [];
33
+ let resolve = null;
34
+ const unsubscribe = backend.subscribe(channel, (data) => {
35
+ queue.push(data);
36
+ if (resolve) {
37
+ resolve();
38
+ resolve = null;
39
+ }
40
+ });
41
+ try {
42
+ while (true) if (queue.length > 0) yield queue.shift();
43
+ else await new Promise((r) => {
44
+ resolve = r;
45
+ });
46
+ } finally {
47
+ unsubscribe();
48
+ }
49
+ }
50
+ };
51
+ }
52
+ //#endregion
53
+ export { MemoryPubSub, createPublisher };
@@ -0,0 +1,53 @@
1
+ import { GuardDef } from "../types.mjs";
2
+
3
+ //#region src/plugins/ratelimit.d.ts
4
+ interface RateLimitResult {
5
+ success: boolean;
6
+ limit: number;
7
+ remaining: number;
8
+ reset: number;
9
+ }
10
+ interface RateLimiter {
11
+ limit(key: string): Promise<RateLimitResult>;
12
+ }
13
+ interface MemoryRateLimiterOptions {
14
+ /** Maximum requests per window */
15
+ limit: number;
16
+ /** Window duration in milliseconds */
17
+ windowMs: number;
18
+ }
19
+ declare class MemoryRateLimiter implements RateLimiter {
20
+ #private;
21
+ constructor(options: MemoryRateLimiterOptions);
22
+ limit(key: string): Promise<RateLimitResult>;
23
+ /** Remove entries with no active timestamps to prevent unbounded Map growth */
24
+ evict(): void;
25
+ }
26
+ interface RateLimitGuardOptions {
27
+ /** The rate limiter instance */
28
+ limiter: RateLimiter;
29
+ /** Extract rate limit key from context */
30
+ keyFn: (ctx: Record<string, unknown>) => string | Promise<string>;
31
+ /** Custom error message */
32
+ message?: string;
33
+ }
34
+ /**
35
+ * Create a rate limiting guard.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * import { rateLimitGuard, MemoryRateLimiter } from "silgi/ratelimit"
40
+ *
41
+ * const rateLimit = rateLimitGuard({
42
+ * limiter: new MemoryRateLimiter({ limit: 100, windowMs: 60_000 }),
43
+ * keyFn: (ctx) => (ctx as any).ip ?? "anonymous",
44
+ * })
45
+ *
46
+ * const proc = k
47
+ * .$use(rateLimit)
48
+ * .$resolve(() => ({ ok: true }))
49
+ * ```
50
+ */
51
+ declare function rateLimitGuard(options: RateLimitGuardOptions): GuardDef<any, any>;
52
+ //#endregion
53
+ export { MemoryRateLimiter, MemoryRateLimiterOptions, RateLimitGuardOptions, RateLimitResult, RateLimiter, rateLimitGuard };
@@ -0,0 +1,92 @@
1
+ import { SilgiError } from "../core/error.mjs";
2
+ //#region src/plugins/ratelimit.ts
3
+ /**
4
+ * Rate limiting plugin — v2 guard middleware.
5
+ *
6
+ * Sliding window in-memory rate limiter.
7
+ * Pluggable: swap MemoryRateLimiter for Redis/Upstash/etc.
8
+ */
9
+ var MemoryRateLimiter = class {
10
+ #limit;
11
+ #windowMs;
12
+ #store = /* @__PURE__ */ new Map();
13
+ #evictTimer;
14
+ constructor(options) {
15
+ this.#limit = options.limit;
16
+ this.#windowMs = options.windowMs;
17
+ this.#evictTimer = setInterval(() => this.evict(), this.#windowMs * 2);
18
+ if (typeof this.#evictTimer === "object" && "unref" in this.#evictTimer) this.#evictTimer.unref();
19
+ }
20
+ async limit(key) {
21
+ const now = Date.now();
22
+ const windowStart = now - this.#windowMs;
23
+ let timestamps = this.#store.get(key);
24
+ if (!timestamps) {
25
+ timestamps = [];
26
+ this.#store.set(key, timestamps);
27
+ }
28
+ while (timestamps.length > 0 && timestamps[0] < windowStart) timestamps.shift();
29
+ const remaining = Math.max(0, this.#limit - timestamps.length);
30
+ const reset = timestamps.length > 0 ? timestamps[0] + this.#windowMs : now + this.#windowMs;
31
+ if (timestamps.length >= this.#limit) return {
32
+ success: false,
33
+ limit: this.#limit,
34
+ remaining: 0,
35
+ reset
36
+ };
37
+ timestamps.push(now);
38
+ return {
39
+ success: true,
40
+ limit: this.#limit,
41
+ remaining: remaining - 1,
42
+ reset
43
+ };
44
+ }
45
+ /** Remove entries with no active timestamps to prevent unbounded Map growth */
46
+ evict() {
47
+ const now = Date.now();
48
+ for (const [key, timestamps] of this.#store) {
49
+ while (timestamps.length > 0 && timestamps[0] < now - this.#windowMs) timestamps.shift();
50
+ if (timestamps.length === 0) this.#store.delete(key);
51
+ }
52
+ }
53
+ };
54
+ /**
55
+ * Create a rate limiting guard.
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * import { rateLimitGuard, MemoryRateLimiter } from "silgi/ratelimit"
60
+ *
61
+ * const rateLimit = rateLimitGuard({
62
+ * limiter: new MemoryRateLimiter({ limit: 100, windowMs: 60_000 }),
63
+ * keyFn: (ctx) => (ctx as any).ip ?? "anonymous",
64
+ * })
65
+ *
66
+ * const proc = k
67
+ * .$use(rateLimit)
68
+ * .$resolve(() => ({ ok: true }))
69
+ * ```
70
+ */
71
+ function rateLimitGuard(options) {
72
+ return {
73
+ kind: "guard",
74
+ fn: async (ctx) => {
75
+ const key = await options.keyFn(ctx);
76
+ const result = await options.limiter.limit(key);
77
+ if (!result.success) throw new SilgiError("TOO_MANY_REQUESTS", {
78
+ status: 429,
79
+ message: options.message ?? "Rate limit exceeded",
80
+ data: {
81
+ limit: result.limit,
82
+ remaining: result.remaining,
83
+ reset: result.reset,
84
+ retryAfter: Math.ceil((result.reset - Date.now()) / 1e3)
85
+ }
86
+ });
87
+ return { rateLimit: result };
88
+ }
89
+ };
90
+ }
91
+ //#endregion
92
+ export { MemoryRateLimiter, rateLimitGuard };
@@ -0,0 +1,41 @@
1
+ //#region src/plugins/signing.d.ts
2
+ /**
3
+ * Signing & Encryption utilities — HMAC-SHA256 and AES-GCM.
4
+ *
5
+ * Uses the Web Crypto API (works in Node.js, Bun, Deno, Cloudflare Workers).
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { sign, unsign, encrypt, decrypt } from "silgi/plugins"
10
+ *
11
+ * // Sign a value (tamper-proof)
12
+ * const signed = await sign("user:123", "my-secret")
13
+ * const value = await unsign(signed, "my-secret") // "user:123" or null
14
+ *
15
+ * // Encrypt a value (confidential)
16
+ * const encrypted = await encrypt("sensitive-data", "my-secret")
17
+ * const decrypted = await decrypt(encrypted, "my-secret") // "sensitive-data"
18
+ * ```
19
+ */
20
+ /**
21
+ * Sign a string value with HMAC-SHA256.
22
+ * Returns `value.signature` — use `unsign()` to verify.
23
+ */
24
+ declare function sign(value: string, secret: string): Promise<string>;
25
+ /**
26
+ * Verify and extract a signed value.
27
+ * Returns the original value if valid, or `null` if tampered.
28
+ */
29
+ declare function unsign(signed: string, secret: string): Promise<string | null>;
30
+ /**
31
+ * Encrypt a string with AES-256-GCM (PBKDF2 key derivation).
32
+ * Returns a base64url-encoded string containing salt + iv + ciphertext.
33
+ */
34
+ declare function encrypt(plaintext: string, secret: string): Promise<string>;
35
+ /**
36
+ * Decrypt a string encrypted with `encrypt()`.
37
+ * Returns the original plaintext, or throws if the secret is wrong.
38
+ */
39
+ declare function decrypt(encrypted: string, secret: string): Promise<string>;
40
+ //#endregion
41
+ export { decrypt, encrypt, sign, unsign };
@@ -0,0 +1,118 @@
1
+ //#region src/plugins/signing.ts
2
+ /**
3
+ * Signing & Encryption utilities — HMAC-SHA256 and AES-GCM.
4
+ *
5
+ * Uses the Web Crypto API (works in Node.js, Bun, Deno, Cloudflare Workers).
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { sign, unsign, encrypt, decrypt } from "silgi/plugins"
10
+ *
11
+ * // Sign a value (tamper-proof)
12
+ * const signed = await sign("user:123", "my-secret")
13
+ * const value = await unsign(signed, "my-secret") // "user:123" or null
14
+ *
15
+ * // Encrypt a value (confidential)
16
+ * const encrypted = await encrypt("sensitive-data", "my-secret")
17
+ * const decrypted = await decrypt(encrypted, "my-secret") // "sensitive-data"
18
+ * ```
19
+ */
20
+ const encoder = new TextEncoder();
21
+ const decoder = new TextDecoder();
22
+ async function getSigningKey(secret) {
23
+ return crypto.subtle.importKey("raw", encoder.encode(secret), {
24
+ name: "HMAC",
25
+ hash: "SHA-256"
26
+ }, false, ["sign", "verify"]);
27
+ }
28
+ function toHex(buffer) {
29
+ return Array.from(new Uint8Array(buffer)).map((b) => b.toString(16).padStart(2, "0")).join("");
30
+ }
31
+ function fromHex(hex) {
32
+ if (hex.length % 2 !== 0 || hex.length === 0) return null;
33
+ if (!/^[0-9a-f]+$/i.test(hex)) return null;
34
+ const bytes = new Uint8Array(hex.length / 2);
35
+ for (let i = 0; i < hex.length; i += 2) bytes[i / 2] = Number.parseInt(hex.slice(i, i + 2), 16);
36
+ return bytes;
37
+ }
38
+ /**
39
+ * Sign a string value with HMAC-SHA256.
40
+ * Returns `value.signature` — use `unsign()` to verify.
41
+ */
42
+ async function sign(value, secret) {
43
+ const key = await getSigningKey(secret);
44
+ return `${value}.${toHex(await crypto.subtle.sign("HMAC", key, encoder.encode(value)))}`;
45
+ }
46
+ /**
47
+ * Verify and extract a signed value.
48
+ * Returns the original value if valid, or `null` if tampered.
49
+ */
50
+ async function unsign(signed, secret) {
51
+ const dotIdx = signed.lastIndexOf(".");
52
+ if (dotIdx === -1) return null;
53
+ const value = signed.slice(0, dotIdx);
54
+ const expected = fromHex(signed.slice(dotIdx + 1));
55
+ if (!expected) return null;
56
+ const key = await getSigningKey(secret);
57
+ return await crypto.subtle.verify("HMAC", key, expected.buffer, encoder.encode(value)) ? value : null;
58
+ }
59
+ async function getEncryptionKey(secret, salt) {
60
+ const keyMaterial = await crypto.subtle.importKey("raw", encoder.encode(secret), "PBKDF2", false, ["deriveKey"]);
61
+ return crypto.subtle.deriveKey({
62
+ name: "PBKDF2",
63
+ salt: salt.buffer,
64
+ iterations: 1e5,
65
+ hash: "SHA-256"
66
+ }, keyMaterial, {
67
+ name: "AES-GCM",
68
+ length: 256
69
+ }, false, ["encrypt", "decrypt"]);
70
+ }
71
+ /**
72
+ * Encrypt a string with AES-256-GCM (PBKDF2 key derivation).
73
+ * Returns a base64url-encoded string containing salt + iv + ciphertext.
74
+ */
75
+ async function encrypt(plaintext, secret) {
76
+ const salt = crypto.getRandomValues(new Uint8Array(16));
77
+ const iv = crypto.getRandomValues(new Uint8Array(12));
78
+ const key = await getEncryptionKey(secret, salt);
79
+ const ciphertext = await crypto.subtle.encrypt({
80
+ name: "AES-GCM",
81
+ iv
82
+ }, key, encoder.encode(plaintext));
83
+ const combined = new Uint8Array(salt.length + iv.length + ciphertext.byteLength);
84
+ combined.set(salt, 0);
85
+ combined.set(iv, salt.length);
86
+ combined.set(new Uint8Array(ciphertext), salt.length + iv.length);
87
+ return base64urlEncode(combined);
88
+ }
89
+ /**
90
+ * Decrypt a string encrypted with `encrypt()`.
91
+ * Returns the original plaintext, or throws if the secret is wrong.
92
+ */
93
+ async function decrypt(encrypted, secret) {
94
+ const combined = base64urlDecode(encrypted);
95
+ const salt = combined.slice(0, 16);
96
+ const iv = combined.slice(16, 28);
97
+ const ciphertext = combined.slice(28);
98
+ const key = await getEncryptionKey(secret, salt);
99
+ const plaintext = await crypto.subtle.decrypt({
100
+ name: "AES-GCM",
101
+ iv
102
+ }, key, ciphertext);
103
+ return decoder.decode(plaintext);
104
+ }
105
+ function base64urlEncode(data) {
106
+ let binary = "";
107
+ const chunkSize = 8192;
108
+ for (let i = 0; i < data.length; i += chunkSize) binary += String.fromCharCode(...data.subarray(i, i + chunkSize));
109
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
110
+ }
111
+ function base64urlDecode(str) {
112
+ const base64 = str.replace(/-/g, "+").replace(/_/g, "/");
113
+ const padded = base64 + "=".repeat((4 - base64.length % 4) % 4);
114
+ const binary = atob(padded);
115
+ return Uint8Array.from(binary, (c) => c.charCodeAt(0));
116
+ }
117
+ //#endregion
118
+ export { decrypt, encrypt, sign, unsign };
@@ -0,0 +1,10 @@
1
+ import { GuardDef } from "../types.mjs";
2
+
3
+ //#region src/plugins/strict-get.d.ts
4
+ /**
5
+ * Guard that rejects non-GET requests. Use on query procedures
6
+ * to enforce RESTful method semantics and prevent CSRF.
7
+ */
8
+ declare const strictGetGuard: GuardDef<Record<string, unknown>>;
9
+ //#endregion
10
+ export { strictGetGuard };
@@ -0,0 +1,33 @@
1
+ import { SilgiError } from "../core/error.mjs";
2
+ //#region src/plugins/strict-get.ts
3
+ /**
4
+ * Strict GET method guard — enforce GET for query procedures.
5
+ *
6
+ * Rejects non-GET requests to query procedures with 405 Method Not Allowed.
7
+ * Mutations must use POST. This prevents CSRF on read endpoints.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { strictGetGuard } from "silgi/plugins"
12
+ *
13
+ * const listUsers = k
14
+ * .$use(strictGetGuard)
15
+ * .$resolve(({ ctx }) => ctx.db.users.findMany())
16
+ * ```
17
+ */
18
+ /**
19
+ * Guard that rejects non-GET requests. Use on query procedures
20
+ * to enforce RESTful method semantics and prevent CSRF.
21
+ */
22
+ const strictGetGuard = {
23
+ kind: "guard",
24
+ fn: (ctx) => {
25
+ const method = ctx.method;
26
+ if (method && method !== "GET" && method !== "HEAD") throw new SilgiError("METHOD_NOT_ALLOWED", {
27
+ status: 405,
28
+ message: `Expected GET, received ${method}`
29
+ });
30
+ }
31
+ };
32
+ //#endregion
33
+ export { strictGetGuard };
@@ -0,0 +1,49 @@
1
+ import { RouterDef } from "./types.mjs";
2
+ //#region src/scalar.d.ts
3
+ interface ScalarOptions {
4
+ title?: string;
5
+ version?: string;
6
+ description?: string;
7
+ servers?: {
8
+ url: string;
9
+ description?: string;
10
+ }[];
11
+ /** Security scheme (e.g. Bearer token) */
12
+ security?: {
13
+ type: 'http' | 'apiKey';
14
+ scheme?: string;
15
+ bearerFormat?: string;
16
+ in?: 'header' | 'query';
17
+ name?: string;
18
+ description?: string;
19
+ };
20
+ /** Contact info */
21
+ contact?: {
22
+ name?: string;
23
+ url?: string;
24
+ email?: string;
25
+ };
26
+ /** License */
27
+ license?: {
28
+ name: string;
29
+ url?: string;
30
+ };
31
+ /** External docs */
32
+ externalDocs?: {
33
+ url: string;
34
+ description?: string;
35
+ };
36
+ /**
37
+ * Scalar UI script source.
38
+ *
39
+ * - `'cdn'` (default) — loads from cdn.jsdelivr.net
40
+ * - `'unpkg'` — loads from unpkg.com
41
+ * - `'local'` — serves from node_modules (offline, requires `@scalar/api-reference` installed)
42
+ * - Custom URL string — self-hosted or local path (e.g. `'/assets/scalar.js'`)
43
+ */
44
+ cdn?: 'cdn' | 'unpkg' | 'local' | (string & {});
45
+ }
46
+ declare function generateOpenAPI(router: RouterDef, options?: ScalarOptions): Record<string, unknown>;
47
+ declare function scalarHTML(specUrl: string, options?: ScalarOptions): string;
48
+ //#endregion
49
+ export { ScalarOptions, generateOpenAPI, scalarHTML };