acrylblends 0.4.1 → 0.5.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 (416) hide show
  1. package/LICENSE +73 -0
  2. package/docs/framework/README.md +51 -51
  3. package/docs/framework/UPSTREAM.md +1 -1
  4. package/docs/framework/agents/index.md +24 -0
  5. package/docs/framework/api/acryl.md +259 -0
  6. package/docs/framework/api/context.md +527 -0
  7. package/docs/framework/api/exception.md +80 -0
  8. package/docs/framework/api/index.md +12 -0
  9. package/docs/framework/api/presets.md +65 -0
  10. package/docs/framework/api/request.md +396 -0
  11. package/docs/framework/api/routing.md +303 -0
  12. package/docs/framework/{api-summary.md → api/summary.md} +19 -17
  13. package/docs/framework/concepts/benchmarks.md +26 -0
  14. package/docs/framework/concepts/developer-experience.md +5 -0
  15. package/docs/framework/concepts/middleware.md +21 -0
  16. package/docs/framework/concepts/motivation.md +14 -0
  17. package/docs/framework/concepts/routers.md +63 -0
  18. package/docs/framework/concepts/stacks.md +235 -0
  19. package/docs/framework/concepts/web-standard.md +37 -0
  20. package/docs/framework/{getting-started.md → cordis/acryl-in-a-cordis-app.md} +16 -16
  21. package/docs/framework/{concepts.md → cordis/concepts.md} +2 -2
  22. package/docs/framework/cordis/middleware.md +8 -0
  23. package/docs/framework/{migration-from-0-3.md → cordis/migration-from-0-3.md} +16 -13
  24. package/docs/framework/cordis/migration-from-0-4.md +14 -0
  25. package/docs/framework/{migration-from-dsh-webserver.md → cordis/migration-from-dsh-webserver.md} +7 -7
  26. package/docs/framework/{routing.md → cordis/mounting.md} +5 -108
  27. package/docs/framework/{node-server.md → cordis/node-server.md} +4 -4
  28. package/docs/framework/{surfaces.md → cordis/surfaces.md} +2 -2
  29. package/docs/framework/cordis/transport-and-cancellation.md +57 -0
  30. package/docs/framework/{validation.md → cordis/validation.md} +9 -9
  31. package/docs/framework/getting-started/basic.md +196 -0
  32. package/docs/framework/getting-started/bun.md +221 -0
  33. package/docs/framework/getting-started/nodejs.md +344 -0
  34. package/docs/framework/getting-started/other-runtimes.md +23 -0
  35. package/docs/framework/guides/best-practices.md +231 -0
  36. package/docs/framework/guides/create-acrylblends.md +79 -0
  37. package/docs/framework/guides/examples.md +3 -0
  38. package/docs/framework/guides/faq.md +19 -0
  39. package/docs/framework/guides/helpers.md +33 -0
  40. package/docs/framework/guides/jsx-dom.md +299 -0
  41. package/docs/framework/guides/jsx.md +440 -0
  42. package/docs/framework/guides/middleware.md +253 -0
  43. package/docs/framework/guides/rpc.md +886 -0
  44. package/docs/framework/guides/testing.md +133 -0
  45. package/docs/framework/guides/validation.md +383 -0
  46. package/docs/framework/helpers/accepts.md +60 -0
  47. package/docs/framework/helpers/adapter.md +87 -0
  48. package/docs/framework/helpers/conninfo.md +112 -0
  49. package/docs/framework/helpers/cookie.md +232 -0
  50. package/docs/framework/helpers/css.md +285 -0
  51. package/docs/framework/helpers/dev.md +67 -0
  52. package/docs/framework/helpers/factory.md +180 -0
  53. package/docs/framework/helpers/html.md +123 -0
  54. package/docs/framework/helpers/jwt.md +184 -0
  55. package/docs/framework/helpers/proxy.md +118 -0
  56. package/docs/framework/helpers/route.md +143 -0
  57. package/docs/framework/helpers/ssg.md +393 -0
  58. package/docs/framework/helpers/streaming.md +119 -0
  59. package/docs/framework/helpers/testing.md +101 -0
  60. package/docs/framework/helpers/websocket.md +215 -0
  61. package/docs/framework/middleware/builtin/basic-auth.md +165 -0
  62. package/docs/framework/middleware/builtin/bearer-auth.md +138 -0
  63. package/docs/framework/middleware/builtin/body-limit.md +71 -0
  64. package/docs/framework/middleware/builtin/cache.md +122 -0
  65. package/docs/framework/middleware/builtin/combine.md +94 -0
  66. package/docs/framework/middleware/builtin/compress.md +59 -0
  67. package/docs/framework/middleware/builtin/context-storage.md +78 -0
  68. package/docs/framework/middleware/builtin/cors.md +135 -0
  69. package/docs/framework/middleware/builtin/csrf.md +105 -0
  70. package/docs/framework/middleware/builtin/etag.md +54 -0
  71. package/docs/framework/middleware/builtin/ip-restriction.md +69 -0
  72. package/docs/framework/middleware/builtin/jsx-renderer.md +286 -0
  73. package/docs/framework/middleware/builtin/jwk.md +192 -0
  74. package/docs/framework/middleware/builtin/jwt.md +145 -0
  75. package/docs/framework/middleware/builtin/language.md +232 -0
  76. package/docs/framework/middleware/builtin/logger.md +74 -0
  77. package/docs/framework/middleware/builtin/loopback-only.md +31 -0
  78. package/docs/framework/middleware/builtin/method-not-allowed.md +48 -0
  79. package/docs/framework/middleware/builtin/method-override.md +80 -0
  80. package/docs/framework/middleware/builtin/mount.md +106 -0
  81. package/docs/framework/middleware/builtin/pretty-json.md +53 -0
  82. package/docs/framework/middleware/builtin/request-id.md +94 -0
  83. package/docs/framework/middleware/builtin/secure-headers.md +247 -0
  84. package/docs/framework/middleware/builtin/timeout.md +98 -0
  85. package/docs/framework/middleware/builtin/timing.md +101 -0
  86. package/docs/framework/middleware/builtin/trailing-slash.md +74 -0
  87. package/docs/framework/middleware/third-party.md +4 -0
  88. package/docs/framework/upstream.json +3 -3
  89. package/lib/accepts-XBuZPVRI.js +52 -0
  90. package/lib/accepts.d.ts +33 -0
  91. package/lib/accepts.js +2 -0
  92. package/lib/acryl-base.d.ts +2 -0
  93. package/lib/acryl-base.js +332 -0
  94. package/lib/adapter.d.ts +12 -0
  95. package/lib/adapter.js +37 -0
  96. package/lib/app-BM0rTCp7.js +26 -0
  97. package/lib/app-CmAYW1Al.d.ts +21 -0
  98. package/lib/basic-auth.d.ts +72 -0
  99. package/lib/basic-auth.js +95 -0
  100. package/lib/bearer-auth.d.ts +89 -0
  101. package/lib/bearer-auth.js +94 -0
  102. package/lib/body-limit.d.ts +42 -0
  103. package/lib/body-limit.js +66 -0
  104. package/lib/client-BHTr318g.js +266 -0
  105. package/lib/client.d.ts +3 -0
  106. package/lib/client.js +2 -0
  107. package/lib/combine.d.ts +85 -0
  108. package/lib/combine.js +137 -0
  109. package/lib/compose-BuW2B6PZ.js +50 -0
  110. package/lib/compress.d.ts +38 -0
  111. package/lib/compress.js +79 -0
  112. package/lib/connection-C7xgP1hP.js +24 -0
  113. package/lib/conninfo.d.ts +25 -0
  114. package/lib/conninfo.js +2 -0
  115. package/lib/constants-Dy7ZvN1H.js +4 -0
  116. package/lib/context-Bm7rI-oK.d.ts +1234 -0
  117. package/lib/context-DDO0cfuP.js +365 -0
  118. package/lib/context-storage.d.ts +38 -0
  119. package/lib/context-storage.js +52 -0
  120. package/lib/cookie-ClMaKDQf.d.ts +40 -0
  121. package/lib/cookie.d.ts +24 -0
  122. package/lib/cookie.js +82 -0
  123. package/lib/cors.d.ts +52 -0
  124. package/lib/cors.js +106 -0
  125. package/lib/csrf.d.ts +75 -0
  126. package/lib/csrf.js +101 -0
  127. package/lib/etag.d.ts +40 -0
  128. package/lib/etag.js +135 -0
  129. package/lib/factory.d.ts +35 -0
  130. package/lib/factory.js +30 -0
  131. package/lib/headers-tu2YYN8T.d.ts +11 -0
  132. package/lib/html.d.ts +6 -0
  133. package/lib/html.js +31 -0
  134. package/lib/http-exception.d.ts +57 -0
  135. package/lib/http-exception.js +54 -0
  136. package/lib/http-status-DaAwGAFL.d.ts +35 -0
  137. package/lib/index-B-3F4wt2.d.ts +12 -0
  138. package/lib/index-UTBmM3GX.d.ts +68 -0
  139. package/lib/index-oOClm_Xk.d.ts +45 -0
  140. package/lib/index.d.ts +5 -0
  141. package/lib/index.js +28 -0
  142. package/lib/ip-restriction.d.ts +68 -0
  143. package/lib/ip-restriction.js +166 -0
  144. package/lib/jwk.d.ts +52 -0
  145. package/lib/jwk.js +117 -0
  146. package/lib/jwt-BGJBw5AF.js +403 -0
  147. package/lib/jwt-Dg493Tai.d.ts +51 -0
  148. package/lib/jwt.d.ts +72 -0
  149. package/lib/jwt.js +115 -0
  150. package/lib/language.d.ts +88 -0
  151. package/lib/language.js +198 -0
  152. package/lib/logger.d.ts +22 -0
  153. package/lib/logger.js +54 -0
  154. package/lib/loopback-only.d.ts +45 -0
  155. package/lib/loopback-only.js +90 -0
  156. package/lib/method-not-allowed.d.ts +47 -0
  157. package/lib/method-not-allowed.js +82 -0
  158. package/lib/method-override.d.ts +46 -0
  159. package/lib/method-override.js +103 -0
  160. package/lib/mime-BQOYHl-l.d.ts +72 -0
  161. package/lib/node-server/conninfo.d.ts +11 -0
  162. package/lib/node-server/conninfo.js +19 -0
  163. package/lib/node-server/serve-static.d.ts +19 -0
  164. package/lib/node-server/serve-static.js +2 -0
  165. package/lib/node-server.d.ts +103 -0
  166. package/lib/node-server.js +1325 -0
  167. package/lib/powered-by.d.ts +28 -0
  168. package/lib/powered-by.js +24 -0
  169. package/lib/pretty-json.d.ts +40 -0
  170. package/lib/pretty-json.js +39 -0
  171. package/lib/reg-exp-router-DC1R3qoY.js +363 -0
  172. package/lib/request-id.d.ts +45 -0
  173. package/lib/request-id.js +34 -0
  174. package/lib/request.d.ts +2 -0
  175. package/lib/request.js +323 -0
  176. package/lib/route.d.ts +78 -0
  177. package/lib/route.js +126 -0
  178. package/lib/router/linear-router.d.ts +11 -0
  179. package/lib/router/linear-router.js +96 -0
  180. package/lib/router/pattern-router.d.ts +11 -0
  181. package/lib/router/pattern-router.js +41 -0
  182. package/lib/router/reg-exp-router.d.ts +35 -0
  183. package/lib/router/reg-exp-router.js +2 -0
  184. package/lib/router/smart-router.d.ts +15 -0
  185. package/lib/router/smart-router.js +2 -0
  186. package/lib/router/trie-router.d.ts +11 -0
  187. package/lib/router/trie-router.js +2 -0
  188. package/lib/router-CvUxUTOq.d.ts +99 -0
  189. package/lib/router.d.ts +2 -0
  190. package/lib/router.js +35 -0
  191. package/lib/schema-validator.d.ts +28 -0
  192. package/lib/schema-validator.js +22 -0
  193. package/lib/secure-headers.d.ts +125 -0
  194. package/lib/secure-headers.js +163 -0
  195. package/lib/serve-static-Dw_m6KxR.js +213 -0
  196. package/lib/serve-static.d.ts +31 -0
  197. package/lib/serve-static.js +77 -0
  198. package/lib/smart-router-C5CZ5XSM.js +49 -0
  199. package/lib/stream-CPdqZ0Fp.d.ts +34 -0
  200. package/lib/streaming-DHST3Scg.js +96 -0
  201. package/lib/streaming.d.ts +23 -0
  202. package/lib/streaming.js +2 -0
  203. package/lib/testing.d.ts +10 -0
  204. package/lib/testing.js +17 -0
  205. package/lib/timeout.d.ts +30 -0
  206. package/lib/timeout.js +42 -0
  207. package/lib/timing.d.ts +130 -0
  208. package/lib/timing.js +183 -0
  209. package/lib/trailing-slash.d.ts +91 -0
  210. package/lib/trailing-slash.js +85 -0
  211. package/lib/trie-router-CfFbapzL.js +146 -0
  212. package/lib/types-CDO6I3B0.d.ts +40 -0
  213. package/lib/types-CHesD1KG.d.ts +195 -0
  214. package/lib/types-CwrQjlaM.d.ts +105 -0
  215. package/lib/types-DR95J00T.d.ts +29 -0
  216. package/lib/types.d.ts +2 -0
  217. package/lib/types.js +4 -0
  218. package/lib/utils/accept.d.ts +9 -0
  219. package/lib/utils/accept.js +193 -0
  220. package/lib/utils/basic-auth.d.ts +8 -0
  221. package/lib/utils/basic-auth.js +20 -0
  222. package/lib/utils/body.d.ts +2 -0
  223. package/lib/utils/body.js +94 -0
  224. package/lib/utils/buffer.d.ts +19 -0
  225. package/lib/utils/buffer.js +51 -0
  226. package/lib/utils/color.d.ts +24 -0
  227. package/lib/utils/color.js +37 -0
  228. package/lib/utils/compress.d.ts +11 -0
  229. package/lib/utils/compress.js +11 -0
  230. package/lib/utils/concurrent.d.ts +17 -0
  231. package/lib/utils/concurrent.js +30 -0
  232. package/lib/utils/constants.d.ts +7 -0
  233. package/lib/utils/constants.js +7 -0
  234. package/lib/utils/cookie.d.ts +2 -0
  235. package/lib/utils/cookie.js +125 -0
  236. package/lib/utils/crypto.d.ts +14 -0
  237. package/lib/utils/crypto.js +34 -0
  238. package/lib/utils/encode.d.ts +11 -0
  239. package/lib/utils/encode.js +33 -0
  240. package/lib/utils/filepath.d.ts +14 -0
  241. package/lib/utils/filepath.js +25 -0
  242. package/lib/utils/handler.d.ts +9 -0
  243. package/lib/utils/handler.js +12 -0
  244. package/lib/utils/headers.d.ts +2 -0
  245. package/lib/utils/headers.js +1 -0
  246. package/lib/utils/html.d.ts +46 -0
  247. package/lib/utils/html.js +103 -0
  248. package/lib/utils/http-status.d.ts +2 -0
  249. package/lib/utils/http-status.js +1 -0
  250. package/lib/utils/ipaddr.d.ts +56 -0
  251. package/lib/utils/ipaddr.js +238 -0
  252. package/lib/utils/jwt.d.ts +24 -0
  253. package/lib/utils/jwt.js +2 -0
  254. package/lib/utils/mime.d.ts +2 -0
  255. package/lib/utils/mime.js +77 -0
  256. package/lib/utils/stream.d.ts +2 -0
  257. package/lib/utils/stream.js +88 -0
  258. package/lib/utils/types.d.ts +2 -0
  259. package/lib/utils/types.js +1 -0
  260. package/lib/utils/url.d.ts +46 -0
  261. package/lib/utils/url.js +197 -0
  262. package/lib/utils-dw8lxqjL.js +4 -0
  263. package/lib/validator-D84mq-dO.js +65 -0
  264. package/lib/validator.d.ts +42 -0
  265. package/lib/validator.js +2 -0
  266. package/lib/ws.d.ts +2 -0
  267. package/lib/ws.js +53 -0
  268. package/package.json +312 -14
  269. package/plugins/acryl-inspect/src/service.ts +2 -2
  270. package/plugins/acryl-inspect/tests/service.spec.ts +3 -3
  271. package/plugins/acryl-inspect/upstream.json +2 -2
  272. package/plugins/acryl-node-server/tests/adapter/app.ts +2 -2
  273. package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +1 -1
  274. package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +1 -1
  275. package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +2 -2
  276. package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +4 -4
  277. package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +5 -5
  278. package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +2 -2
  279. package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +20 -20
  280. package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +2 -2
  281. package/plugins/acryl-node-server/tests/adapter/server.test.ts +50 -50
  282. package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +4 -4
  283. package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +9 -9
  284. package/plugins/acryl-node-server/tests/server.spec.ts +6 -6
  285. package/plugins/acryl-node-server/upstream.json +2 -2
  286. package/plugins/acryl-router/src/client.ts +1 -1
  287. package/plugins/acryl-router/src/connection.ts +2 -2
  288. package/plugins/acryl-router/src/core/app-base.ts +29 -29
  289. package/plugins/acryl-router/src/core/app.test.ts +175 -175
  290. package/plugins/acryl-router/src/core/app.ts +8 -8
  291. package/plugins/acryl-router/src/core/client/client.test.ts +76 -76
  292. package/plugins/acryl-router/src/core/client/client.ts +2 -2
  293. package/plugins/acryl-router/src/core/client/fetch-result-please.ts +1 -1
  294. package/plugins/acryl-router/src/core/client/index.ts +1 -1
  295. package/plugins/acryl-router/src/core/client/types.test.ts +6 -6
  296. package/plugins/acryl-router/src/core/client/types.ts +16 -16
  297. package/plugins/acryl-router/src/core/client/utils.test.ts +2 -2
  298. package/plugins/acryl-router/src/core/context.test.ts +4 -4
  299. package/plugins/acryl-router/src/core/context.ts +6 -6
  300. package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +3 -3
  301. package/plugins/acryl-router/src/core/helper/accepts/index.ts +1 -1
  302. package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +6 -6
  303. package/plugins/acryl-router/src/core/helper/adapter/index.ts +1 -1
  304. package/plugins/acryl-router/src/core/helper/conninfo/index.ts +1 -1
  305. package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +8 -8
  306. package/plugins/acryl-router/src/core/helper/cookie/index.ts +1 -1
  307. package/plugins/acryl-router/src/core/helper/factory/index.test.ts +9 -9
  308. package/plugins/acryl-router/src/core/helper/factory/index.ts +10 -10
  309. package/plugins/acryl-router/src/core/helper/html/index.test.ts +4 -4
  310. package/plugins/acryl-router/src/core/helper/html/index.ts +1 -1
  311. package/plugins/acryl-router/src/core/helper/route/index.test.ts +7 -7
  312. package/plugins/acryl-router/src/core/helper/route/index.ts +8 -8
  313. package/plugins/acryl-router/src/core/helper/streaming/index.ts +1 -1
  314. package/plugins/acryl-router/src/core/helper/testing/index.test.ts +6 -6
  315. package/plugins/acryl-router/src/core/helper/testing/index.ts +4 -4
  316. package/plugins/acryl-router/src/core/helper/websocket/index.ts +2 -1
  317. package/plugins/acryl-router/src/core/http-exception.ts +1 -1
  318. package/plugins/acryl-router/src/core/index.ts +9 -9
  319. package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +6 -6
  320. package/plugins/acryl-router/src/core/middleware/basic-auth/index.ts +3 -3
  321. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +5 -5
  322. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.ts +3 -3
  323. package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +6 -6
  324. package/plugins/acryl-router/src/core/middleware/body-limit/index.ts +3 -3
  325. package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +9 -9
  326. package/plugins/acryl-router/src/core/middleware/combine/index.ts +7 -7
  327. package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +9 -9
  328. package/plugins/acryl-router/src/core/middleware/compress/index.ts +3 -3
  329. package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +5 -5
  330. package/plugins/acryl-router/src/core/middleware/context-storage/index.ts +4 -4
  331. package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +7 -7
  332. package/plugins/acryl-router/src/core/middleware/cors/index.ts +3 -3
  333. package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +10 -10
  334. package/plugins/acryl-router/src/core/middleware/csrf/index.ts +3 -3
  335. package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +42 -42
  336. package/plugins/acryl-router/src/core/middleware/etag/index.ts +4 -4
  337. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +4 -4
  338. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.ts +6 -6
  339. package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +16 -16
  340. package/plugins/acryl-router/src/core/middleware/jwk/jwk.ts +7 -6
  341. package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +16 -16
  342. package/plugins/acryl-router/src/core/middleware/jwt/jwt.ts +4 -3
  343. package/plugins/acryl-router/src/core/middleware/language/index.test.ts +3 -3
  344. package/plugins/acryl-router/src/core/middleware/language/language.ts +3 -3
  345. package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +5 -5
  346. package/plugins/acryl-router/src/core/middleware/logger/index.ts +4 -4
  347. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +24 -24
  348. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.ts +8 -8
  349. package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +5 -5
  350. package/plugins/acryl-router/src/core/middleware/method-override/index.ts +6 -6
  351. package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +4 -4
  352. package/plugins/acryl-router/src/core/middleware/powered-by/index.ts +6 -6
  353. package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +30 -30
  354. package/plugins/acryl-router/src/core/middleware/pretty-json/index.ts +4 -4
  355. package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +15 -15
  356. package/plugins/acryl-router/src/core/middleware/request-id/request-id.ts +3 -3
  357. package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +35 -35
  358. package/plugins/acryl-router/src/core/middleware/secure-headers/secure-headers.ts +3 -3
  359. package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +23 -23
  360. package/plugins/acryl-router/src/core/middleware/serve-static/index.ts +1 -1
  361. package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +2 -2
  362. package/plugins/acryl-router/src/core/middleware/timeout/index.ts +3 -3
  363. package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +14 -14
  364. package/plugins/acryl-router/src/core/middleware/timing/timing.ts +3 -3
  365. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +7 -7
  366. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.ts +7 -7
  367. package/plugins/acryl-router/src/core/request.test.ts +42 -42
  368. package/plugins/acryl-router/src/core/request.ts +6 -6
  369. package/plugins/acryl-router/src/core/router/linear-router/index.ts +1 -1
  370. package/plugins/acryl-router/src/core/router/pattern-router/index.ts +1 -1
  371. package/plugins/acryl-router/src/core/router/reg-exp-router/index.ts +1 -1
  372. package/plugins/acryl-router/src/core/router/smart-router/index.ts +1 -1
  373. package/plugins/acryl-router/src/core/router/trie-router/index.ts +1 -1
  374. package/plugins/acryl-router/src/core/types.test.ts +115 -115
  375. package/plugins/acryl-router/src/core/types.ts +72 -72
  376. package/plugins/acryl-router/src/core/utils/body.ts +8 -8
  377. package/plugins/acryl-router/src/core/utils/html.ts +1 -1
  378. package/plugins/acryl-router/src/core/utils/jwt/jws.ts +3 -3
  379. package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +2 -2
  380. package/plugins/acryl-router/src/core/utils/jwt/jwt.ts +3 -3
  381. package/plugins/acryl-router/src/core/utils/jwt/types.ts +1 -1
  382. package/plugins/acryl-router/src/core/utils/types.ts +42 -0
  383. package/plugins/acryl-router/src/core/utils/url.test.ts +2 -2
  384. package/plugins/acryl-router/src/core/validator/index.ts +1 -1
  385. package/plugins/acryl-router/src/core/validator/validator.test.ts +28 -28
  386. package/plugins/acryl-router/src/deprecated.ts +15 -0
  387. package/plugins/acryl-router/src/index.ts +3 -2
  388. package/plugins/acryl-router/src/service.ts +10 -10
  389. package/plugins/acryl-router/tests/docs-examples.spec.ts +11 -11
  390. package/plugins/acryl-router/tests/live-install.spec.ts +2 -2
  391. package/plugins/acryl-router/tests/loader.spec.ts +3 -3
  392. package/plugins/acryl-router/tests/loopback-only.spec.ts +4 -4
  393. package/plugins/acryl-router/tests/no-dom/consumer.ts +11 -0
  394. package/plugins/acryl-router/tests/no-dom/tsconfig.json +13 -0
  395. package/plugins/acryl-router/tests/service.spec.ts +23 -23
  396. package/plugins/acryl-router/upstream.json +3 -3
  397. package/plugins/acryl-router-http/tests/adapter.spec.ts +3 -3
  398. package/plugins/acryl-router-http/tests/surfaces.spec.ts +2 -2
  399. package/plugins/acryl-router-http/upstream.json +2 -2
  400. package/plugins/acryl-state/src/service.ts +2 -2
  401. package/plugins/acryl-state/upstream.json +2 -2
  402. package/plugins/builder/script.ts +2 -2
  403. package/plugins/extensions/resolve.ts +70 -10
  404. package/plugins/openai/prompt.ts +5 -5
  405. package/shared/AGENTS.core.md +16 -9
  406. package/templates/agent/src/routes.ts +2 -2
  407. package/templates/agent/test/model.test.ts +2 -2
  408. package/templates/agent/tsconfig.json +40 -0
  409. package/templates/blank/src/routes.ts +2 -2
  410. package/templates/todo/src/todo.ts +2 -2
  411. package/templates/todo/upstream.json +2 -2
  412. package/docs/framework/context.md +0 -129
  413. package/docs/framework/helpers.md +0 -118
  414. package/docs/framework/middleware.md +0 -154
  415. package/docs/framework/request.md +0 -106
  416. /package/docs/framework/{plugin-lifecycle.md → cordis/plugin-lifecycle.md} +0 -0
@@ -0,0 +1,57 @@
1
+ import { n as ContentfulStatusCode } from "./http-status-DaAwGAFL.js";
2
+
3
+ //#region ../../plugins/acryl-router/src/core/http-exception.d.ts
4
+ /**
5
+ * Options for creating an `HTTPException`.
6
+ * @property res - Optional response object to use.
7
+ * @property message - Optional custom error message.
8
+ * @property cause - Optional cause of the error.
9
+ */
10
+ type HTTPExceptionOptions = {
11
+ res?: Response;
12
+ message?: string;
13
+ cause?: unknown;
14
+ };
15
+ /**
16
+ * `HTTPException` must be used when a fatal error such as authentication failure occurs.
17
+ *
18
+ *
19
+ * @param {StatusCode} status - status code of HTTPException
20
+ * @param {HTTPExceptionOptions} options - options of HTTPException
21
+ * @param {HTTPExceptionOptions["res"]} options.res - response of options of HTTPException
22
+ * @param {HTTPExceptionOptions["message"]} options.message - message of options of HTTPException
23
+ * @param {HTTPExceptionOptions["cause"]} options.cause - cause of options of HTTPException
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import { HTTPException } from 'acrylblends/http-exception'
28
+ *
29
+ * // ...
30
+ *
31
+ * app.post('/auth', async (c, next) => {
32
+ * // authentication
33
+ * if (authorized === false) {
34
+ * throw new HTTPException(401, { message: 'Custom error message' })
35
+ * }
36
+ * await next()
37
+ * })
38
+ * ```
39
+ */
40
+ declare class HTTPException extends Error {
41
+ readonly res?: Response;
42
+ readonly status: ContentfulStatusCode;
43
+ /**
44
+ * Creates an instance of `HTTPException`.
45
+ * @param status - HTTP status code for the exception. Defaults to 500.
46
+ * @param options - Additional options for the exception.
47
+ */
48
+ constructor(status?: ContentfulStatusCode, options?: HTTPExceptionOptions);
49
+ /**
50
+ * Returns the response object associated with the exception.
51
+ * If a response object is not provided, a new response is created with the error message and status code.
52
+ * @returns The response object.
53
+ */
54
+ getResponse(): Response;
55
+ }
56
+ //#endregion
57
+ export { HTTPException };
@@ -0,0 +1,54 @@
1
+ //#region ../../plugins/acryl-router/src/core/http-exception.ts
2
+ /**
3
+ * `HTTPException` must be used when a fatal error such as authentication failure occurs.
4
+ *
5
+ *
6
+ * @param {StatusCode} status - status code of HTTPException
7
+ * @param {HTTPExceptionOptions} options - options of HTTPException
8
+ * @param {HTTPExceptionOptions["res"]} options.res - response of options of HTTPException
9
+ * @param {HTTPExceptionOptions["message"]} options.message - message of options of HTTPException
10
+ * @param {HTTPExceptionOptions["cause"]} options.cause - cause of options of HTTPException
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { HTTPException } from 'acrylblends/http-exception'
15
+ *
16
+ * // ...
17
+ *
18
+ * app.post('/auth', async (c, next) => {
19
+ * // authentication
20
+ * if (authorized === false) {
21
+ * throw new HTTPException(401, { message: 'Custom error message' })
22
+ * }
23
+ * await next()
24
+ * })
25
+ * ```
26
+ */
27
+ var HTTPException = class extends Error {
28
+ res;
29
+ status;
30
+ /**
31
+ * Creates an instance of `HTTPException`.
32
+ * @param status - HTTP status code for the exception. Defaults to 500.
33
+ * @param options - Additional options for the exception.
34
+ */
35
+ constructor(status = 500, options) {
36
+ super(options?.message, { cause: options?.cause });
37
+ this.res = options?.res;
38
+ this.status = status;
39
+ }
40
+ /**
41
+ * Returns the response object associated with the exception.
42
+ * If a response object is not provided, a new response is created with the error message and status code.
43
+ * @returns The response object.
44
+ */
45
+ getResponse() {
46
+ if (this.res) return new Response(this.res.body, {
47
+ status: this.status,
48
+ headers: this.res.headers
49
+ });
50
+ return new Response(this.message, { status: this.status });
51
+ }
52
+ };
53
+ //#endregion
54
+ export { HTTPException };
@@ -0,0 +1,35 @@
1
+ //#region ../../plugins/acryl-router/src/core/utils/http-status.d.ts
2
+ /**
3
+ * @module
4
+ * HTTP Status utility.
5
+ */
6
+ type InfoStatusCode = 100 | 101 | 102 | 103;
7
+ type SuccessStatusCode = 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 226;
8
+ type DeprecatedStatusCode = 305 | 306;
9
+ type RedirectStatusCode = 300 | 301 | 302 | 303 | 304 | DeprecatedStatusCode | 307 | 308;
10
+ type ClientErrorStatusCode = 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451;
11
+ type ServerErrorStatusCode = 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511;
12
+ /**
13
+ * `UnofficialStatusCode` can be used to specify an unofficial status code.
14
+ * @example
15
+ *
16
+ * ```ts
17
+ * app.get('/unknown', (c) => {
18
+ * return c.text("Unknown Error", 520 as UnofficialStatusCode)
19
+ * })
20
+ * ```
21
+ */
22
+ type UnofficialStatusCode = -1;
23
+ /**
24
+ * @deprecated
25
+ * Use `UnofficialStatusCode` instead.
26
+ */
27
+ type UnOfficalStatusCode = UnofficialStatusCode;
28
+ /**
29
+ * If you want to use an unofficial status, use `UnofficialStatusCode`.
30
+ */
31
+ type StatusCode = InfoStatusCode | SuccessStatusCode | RedirectStatusCode | ClientErrorStatusCode | ServerErrorStatusCode | UnofficialStatusCode;
32
+ type ContentlessStatusCode = 101 | 204 | 205 | 304;
33
+ type ContentfulStatusCode = Exclude<StatusCode, ContentlessStatusCode>;
34
+ //#endregion
35
+ export { InfoStatusCode as a, StatusCode as c, UnofficialStatusCode as d, DeprecatedStatusCode as i, SuccessStatusCode as l, ContentfulStatusCode as n, RedirectStatusCode as o, ContentlessStatusCode as r, ServerErrorStatusCode as s, ClientErrorStatusCode as t, UnOfficalStatusCode as u };
@@ -0,0 +1,12 @@
1
+ import { A as Input, J as Schema, _ as Env, h as BlankSchema, o as AcrylRequest, p as BlankEnv } from "./context-Bm7rI-oK.js";
2
+ import { t as Acryl } from "./app-CmAYW1Al.js";
3
+
4
+ //#region ../../plugins/acryl-router/src/deprecated.d.ts
5
+ /** @deprecated Use `Acryl` (`new Acryl()`); `App` is the 0.4 name and goes away in the next release. */
6
+ declare const App: typeof Acryl;
7
+ /** @deprecated Use `Acryl`; `App` is the 0.4 name and goes away in the next release. */
8
+ type App<E extends Env = BlankEnv, S extends Schema = BlankSchema, BasePath extends string = '/'> = Acryl<E, S, BasePath>;
9
+ /** @deprecated Use `AcrylRequest`; `AppRequest` is the 0.4 name and goes away in the next release. */
10
+ type AppRequest<P extends string = '/', I extends Input['out'] = {}> = AcrylRequest<P, I>;
11
+ //#endregion
12
+ export { AppRequest as n, App as t };
@@ -0,0 +1,68 @@
1
+ import { I as MiddlewareHandler, X as TypedResponse, t as Context } from "./context-Bm7rI-oK.js";
2
+ import { c as StatusCode } from "./http-status-DaAwGAFL.js";
3
+ import { r as CloseEvent, t as BinaryType, v as MessageEvent } from "./types-CwrQjlaM.js";
4
+
5
+ //#region ../../plugins/acryl-router/src/core/helper/websocket/index.d.ts
6
+ /**
7
+ * WebSocket Event Listeners type
8
+ */
9
+ interface WSEvents<T = unknown> {
10
+ onOpen?: (evt: Event, ws: WSContext<T>) => void;
11
+ onMessage?: (evt: MessageEvent<WSMessageReceive>, ws: WSContext<T>) => void;
12
+ onClose?: (evt: CloseEvent, ws: WSContext<T>) => void;
13
+ onError?: (evt: Event, ws: WSContext<T>) => void;
14
+ }
15
+ /**
16
+ * Upgrade WebSocket Type
17
+ */
18
+ interface UpgradeWebSocket<T = unknown, U = any, _WSEvents = WSEvents<T>> {
19
+ (createEvents: (c: Context) => _WSEvents | Promise<_WSEvents>, options?: U): MiddlewareHandler<any, string, {
20
+ outputFormat: 'ws';
21
+ }>;
22
+ (c: Context, events: _WSEvents, options?: U): Promise<Response & TypedResponse<{}, StatusCode, 'ws'>>;
23
+ }
24
+ /**
25
+ * ReadyState for WebSocket
26
+ */
27
+ type WSReadyState = 0 | 1 | 2 | 3;
28
+ /**
29
+ * An argument for WSContext class
30
+ */
31
+ interface WSContextInit<T = unknown> {
32
+ send(data: string | ArrayBuffer | Uint8Array<ArrayBuffer>, options: SendOptions): void;
33
+ close(code?: number, reason?: string): void;
34
+ raw?: T;
35
+ readyState: WSReadyState;
36
+ url?: string | URL | null;
37
+ protocol?: string | null;
38
+ }
39
+ /**
40
+ * Options for sending message
41
+ */
42
+ interface SendOptions {
43
+ compress?: boolean;
44
+ }
45
+ /**
46
+ * A context for controlling WebSockets
47
+ */
48
+ declare class WSContext<T = unknown> {
49
+ #private;
50
+ constructor(init: WSContextInit<T>);
51
+ send(source: string | ArrayBuffer | Uint8Array<ArrayBuffer>, options?: SendOptions): void;
52
+ raw?: T;
53
+ binaryType: BinaryType;
54
+ get readyState(): WSReadyState;
55
+ url: URL | null;
56
+ protocol: string | null;
57
+ close(code?: number, reason?: string): void;
58
+ }
59
+ type WSMessageReceive = string | Blob | ArrayBufferLike;
60
+ declare const createWSMessageEvent: (source: WSMessageReceive) => MessageEvent<WSMessageReceive>;
61
+ interface WebSocketHelperDefineContext {}
62
+ type WebSocketHelperDefineHandler<T, U> = (c: Context, events: WSEvents<T>, options?: U) => Promise<Response | void> | Response | void;
63
+ /**
64
+ * Create a WebSocket adapter/helper
65
+ */
66
+ declare const defineWebSocketHelper: <T = unknown, U = any>(handler: WebSocketHelperDefineHandler<T, U>) => UpgradeWebSocket<T, U>;
67
+ //#endregion
68
+ export { WSEvents as a, WebSocketHelperDefineContext as c, defineWebSocketHelper as d, WSContextInit as i, WebSocketHelperDefineHandler as l, UpgradeWebSocket as n, WSMessageReceive as o, WSContext as r, WSReadyState as s, SendOptions as t, createWSMessageEvent as u };
@@ -0,0 +1,45 @@
1
+ import { n as ContentfulStatusCode, s as ServerErrorStatusCode, t as ClientErrorStatusCode } from "./http-status-DaAwGAFL.js";
2
+ import { T as UnionToIntersection } from "./types-CwrQjlaM.js";
3
+ import { t as Acryl } from "./app-CmAYW1Al.js";
4
+ import { a as ClientResponse, i as ClientRequestOptions, n as Client, s as FilterClientResponseByStatusCode } from "./types-CHesD1KG.js";
5
+
6
+ //#region ../../plugins/acryl-router/src/core/client/client.d.ts
7
+ declare const hc: <T extends Acryl<any, any, any>, Prefix extends string = string>(baseUrl: Prefix, options?: ClientRequestOptions) => UnionToIntersection<Client<T, Prefix>>;
8
+ //#endregion
9
+ //#region ../../plugins/acryl-router/src/core/client/fetch-result-please.d.ts
10
+ declare class DetailedError extends Error {
11
+ /**
12
+ * Additional `message` that will be logged AND returned to client
13
+ */
14
+ detail?: any;
15
+ /**
16
+ * Additional `code` that will be logged AND returned to client
17
+ */
18
+ code?: any;
19
+ /**
20
+ * Additional value that will be logged AND NOT returned to client
21
+ */
22
+ log?: any;
23
+ /**
24
+ * Optionally set the status code to return, in a web server context
25
+ */
26
+ statusCode?: any;
27
+ constructor(message: string, options?: {
28
+ detail?: any;
29
+ code?: any;
30
+ statusCode?: number;
31
+ log?: any;
32
+ });
33
+ }
34
+ //#endregion
35
+ //#region ../../plugins/acryl-router/src/core/client/utils.d.ts
36
+ /**
37
+ * Shortcut to get a consumable response from `hc`'s fetch calls (Response), with types inference.
38
+ *
39
+ * Smartly parse the response data, throwing a structured error if the response is not `ok`. ({@link DetailedError})
40
+ *
41
+ * @example const result = await parseResponse(client.posts.$get())
42
+ */
43
+ declare function parseResponse<T extends ClientResponse<any>>(fetchRes: T | Promise<T>): Promise<FilterClientResponseByStatusCode<T, Exclude<ContentfulStatusCode, ClientErrorStatusCode | ServerErrorStatusCode>> extends never ? undefined : FilterClientResponseByStatusCode<T, Exclude<ContentfulStatusCode, ClientErrorStatusCode | ServerErrorStatusCode>> extends ClientResponse<infer RT, infer _, infer RF> ? RF extends 'json' ? RT : RT extends string ? RT : string : undefined>;
44
+ //#endregion
45
+ export { DetailedError as n, hc as r, parseResponse as t };
package/lib/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { A as Input, B as NotFoundResponse, D as Handler, I as MiddlewareHandler, J as Schema, R as Next, X as TypedResponse, Y as ToSchema, Z as ValidationTargets, _ as Env, a as ExecutionContext, n as ContextRenderer, o as AcrylRequest, r as ContextVariableMap, t as Context, v as ErrorHandler, z as NotFoundHandler } from "./context-Bm7rI-oK.js";
2
+ import { t as Acryl } from "./app-CmAYW1Al.js";
3
+ import { c as InferRequestType, i as ClientRequestOptions, l as InferResponseType } from "./types-CHesD1KG.js";
4
+ import { n as AppRequest, t as App } from "./index-B-3F4wt2.js";
5
+ export { Acryl, type AcrylRequest, App, type AppRequest, type ClientRequestOptions, Context, type ContextRenderer, type ContextVariableMap, type Env, type ErrorHandler, type ExecutionContext, type Handler, type InferRequestType, type InferResponseType, type Input, type MiddlewareHandler, type Next, type NotFoundHandler, type NotFoundResponse, type Schema, type ToSchema, type TypedResponse, type ValidationTargets };
package/lib/index.js ADDED
@@ -0,0 +1,28 @@
1
+ import { t as Context } from "./context-DDO0cfuP.js";
2
+ import { t as Acryl } from "./app-BM0rTCp7.js";
3
+ //#region ../../plugins/acryl-router/src/core/index.ts
4
+ /**
5
+ * @module
6
+ *
7
+ * Acryl - Web Framework built on Web Standards
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { Acryl } from 'acrylblends'
12
+ * const app = new Acryl()
13
+ *
14
+ * app.get('/', (c) => c.text('Acryl!'))
15
+ *
16
+ * export default app
17
+ * ```
18
+ */
19
+ //#endregion
20
+ //#region ../../plugins/acryl-router/src/deprecated.ts
21
+ /**
22
+ * The 0.4 names, kept for one release so code written against them keeps working: `App` is now `Acryl` and `AppRequest` is now `AcrylRequest`,
23
+ * the upstream names with the project renamed. Not part of the ported core; both the plugin's root and the public package's root export these.
24
+ */
25
+ /** @deprecated Use `Acryl` (`new Acryl()`); `App` is the 0.4 name and goes away in the next release. */
26
+ const App = Acryl;
27
+ //#endregion
28
+ export { Acryl, App, Context };
@@ -0,0 +1,68 @@
1
+ import { I as MiddlewareHandler, t as Context } from "./context-Bm7rI-oK.js";
2
+ import { r as GetConnInfo, t as AddressType } from "./types-CDO6I3B0.js";
3
+
4
+ //#region ../../plugins/acryl-router/src/core/middleware/ip-restriction/index.d.ts
5
+ /**
6
+ * Function to get IP Address
7
+ */
8
+ type GetIPAddr = GetConnInfo | ((c: Context) => string);
9
+ type IPRestrictionRule = string | ((addr: {
10
+ addr: string;
11
+ type: AddressType;
12
+ }) => boolean);
13
+ /**
14
+ * Rules for IP Restriction Middleware
15
+ */
16
+ interface IPRestrictionRules {
17
+ denyList?: IPRestrictionRule[];
18
+ allowList?: IPRestrictionRule[];
19
+ }
20
+ /**
21
+ * IP Restriction Middleware for Acryl.
22
+ *
23
+ *
24
+ * @param {GetConnInfo | ((c: Context) => string)} getIP - A function to retrieve the client IP address. Use `getConnInfo` from the appropriate runtime adapter.
25
+ * @param {IPRestrictionRules} rules - An object with optional `denyList` and `allowList` arrays of IP rules. Each rule can be a static IP, a CIDR range, or a custom function.
26
+ * @param {(remote: { addr: string; type: AddressType }, c: Context) => Response | Promise<Response>} [onError] - Optional custom handler invoked when a request is blocked. Defaults to returning a 403 Forbidden response.
27
+ * @returns {MiddlewareHandler} The middleware handler function.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * import { Acryl } from 'acrylblends'
32
+ * import { ipRestriction } from 'acrylblends/ip-restriction'
33
+ * import { getConnInfo } from 'acrylblends/cloudflare-workers'
34
+ *
35
+ * const app = new Acryl()
36
+ *
37
+ * app.use(
38
+ * '*',
39
+ * ipRestriction(getConnInfo, {
40
+ * // Block a specific IP and an entire subnet
41
+ * denyList: ['192.168.0.5', '10.0.0.0/8'],
42
+ * // Only allow requests from localhost and a private range
43
+ * allowList: ['127.0.0.1', '::1', '192.168.1.0/24'],
44
+ * })
45
+ * )
46
+ *
47
+ * // With a custom error handler
48
+ * app.use(
49
+ * '/admin/*',
50
+ * ipRestriction(
51
+ * getConnInfo,
52
+ * { allowList: ['203.0.113.0/24'] },
53
+ * (remote, c) => c.text(`Access denied for ${remote.addr}`, 403)
54
+ * )
55
+ * )
56
+ *
57
+ * app.get('/', (c) => c.text('Hello!'))
58
+ * ```
59
+ */
60
+ declare const ipRestriction: (getIP: GetIPAddr, {
61
+ denyList,
62
+ allowList
63
+ }: IPRestrictionRules, onError?: (remote: {
64
+ addr: string;
65
+ type: AddressType;
66
+ }, c: Context) => Response | Promise<Response>) => MiddlewareHandler;
67
+ //#endregion
68
+ export { IPRestrictionRule, IPRestrictionRules, ipRestriction };
@@ -0,0 +1,166 @@
1
+ import { HTTPException } from "./http-exception.js";
2
+ import { convertIPv4MappedIPv6ToIPv4, convertIPv4ToBinary, convertIPv6BinaryToString, convertIPv6ToBinary, distinctRemoteAddr, isIPv4MappedIPv6 } from "./utils/ipaddr.js";
3
+ //#region ../../plugins/acryl-router/src/core/middleware/ip-restriction/index.ts
4
+ const IS_CIDR_NOTATION_REGEX = /\/[^/]*$/;
5
+ const parseCidrPrefix = (rule, prefix, max) => {
6
+ if (!/^[0-9]{1,3}$/.test(prefix)) throw new TypeError(`Invalid rule: ${rule}`);
7
+ const parsedPrefix = parseInt(prefix);
8
+ if (parsedPrefix > max) throw new TypeError(`Invalid rule: ${rule}`);
9
+ return parsedPrefix;
10
+ };
11
+ const buildMatcher = (rules) => {
12
+ const functionRules = [];
13
+ const staticRules = /* @__PURE__ */ new Set();
14
+ const staticIPv4Rules = /* @__PURE__ */ new Set();
15
+ const staticIPv6Rules = /* @__PURE__ */ new Set();
16
+ const cidrRules = [];
17
+ const registerStaticRule = (rule) => {
18
+ const type = distinctRemoteAddr(rule);
19
+ if (type === void 0) throw new TypeError(`Invalid rule: ${rule}`);
20
+ if (type === "IPv4") {
21
+ const ipv4binary = convertIPv4ToBinary(rule);
22
+ staticRules.add(rule);
23
+ staticRules.add(`::ffff:${rule}`);
24
+ staticIPv4Rules.add(ipv4binary);
25
+ staticIPv6Rules.add(65535n << 32n | ipv4binary);
26
+ } else {
27
+ const ipv6binary = convertIPv6ToBinary(rule);
28
+ const ipv6Addr = convertIPv6BinaryToString(ipv6binary);
29
+ staticRules.add(ipv6Addr);
30
+ staticIPv6Rules.add(ipv6binary);
31
+ if (isIPv4MappedIPv6(ipv6binary)) {
32
+ staticRules.add(ipv6Addr.substring(7));
33
+ staticIPv4Rules.add(convertIPv4MappedIPv6ToIPv4(ipv6binary));
34
+ }
35
+ }
36
+ };
37
+ for (let rule of rules) if (rule === "*") return () => true;
38
+ else if (typeof rule === "function") functionRules.push(rule);
39
+ else {
40
+ if (IS_CIDR_NOTATION_REGEX.test(rule)) {
41
+ const separatedRule = rule.split("/");
42
+ const addrStr = separatedRule[0];
43
+ const type = distinctRemoteAddr(addrStr);
44
+ if (type === void 0) throw new TypeError(`Invalid rule: ${rule}`);
45
+ let isIPv4 = type === "IPv4";
46
+ let prefix = parseCidrPrefix(rule, separatedRule[1], isIPv4 ? 32 : 128);
47
+ if (isIPv4 ? prefix === 32 : prefix === 128) rule = addrStr;
48
+ else {
49
+ let addr = (isIPv4 ? convertIPv4ToBinary : convertIPv6ToBinary)(addrStr);
50
+ if (type === "IPv6" && isIPv4MappedIPv6(addr) && prefix >= 96) {
51
+ isIPv4 = true;
52
+ addr = convertIPv4MappedIPv6ToIPv4(addr);
53
+ prefix -= 96;
54
+ }
55
+ const mask = (1n << BigInt(prefix)) - 1n << BigInt((isIPv4 ? 32 : 128) - prefix);
56
+ cidrRules.push([
57
+ isIPv4,
58
+ addr & mask,
59
+ mask
60
+ ]);
61
+ continue;
62
+ }
63
+ }
64
+ registerStaticRule(rule);
65
+ }
66
+ return (remote) => {
67
+ if (staticRules.has(remote.addr)) return true;
68
+ const remoteAddr = remote.binaryAddr ||= (remote.isIPv4 ? convertIPv4ToBinary : convertIPv6ToBinary)(remote.addr);
69
+ const remoteIPv4Addr = remote.isIPv4 || isIPv4MappedIPv6(remoteAddr) ? remote.isIPv4 ? remoteAddr : convertIPv4MappedIPv6ToIPv4(remoteAddr) : void 0;
70
+ if ((remote.isIPv4 ? staticIPv4Rules : staticIPv6Rules).has(remoteAddr)) return true;
71
+ for (const [isIPv4, addr, mask] of cidrRules) {
72
+ if (isIPv4) {
73
+ if (remoteIPv4Addr === void 0) continue;
74
+ if ((remoteIPv4Addr & mask) === addr) return true;
75
+ continue;
76
+ }
77
+ if (remote.isIPv4) continue;
78
+ if ((remoteAddr & mask) === addr) return true;
79
+ }
80
+ for (const rule of functionRules) if (rule({
81
+ addr: remote.addr,
82
+ type: remote.type
83
+ })) return true;
84
+ return false;
85
+ };
86
+ };
87
+ /**
88
+ * IP Restriction Middleware for Acryl.
89
+ *
90
+ *
91
+ * @param {GetConnInfo | ((c: Context) => string)} getIP - A function to retrieve the client IP address. Use `getConnInfo` from the appropriate runtime adapter.
92
+ * @param {IPRestrictionRules} rules - An object with optional `denyList` and `allowList` arrays of IP rules. Each rule can be a static IP, a CIDR range, or a custom function.
93
+ * @param {(remote: { addr: string; type: AddressType }, c: Context) => Response | Promise<Response>} [onError] - Optional custom handler invoked when a request is blocked. Defaults to returning a 403 Forbidden response.
94
+ * @returns {MiddlewareHandler} The middleware handler function.
95
+ *
96
+ * @example
97
+ * ```ts
98
+ * import { Acryl } from 'acrylblends'
99
+ * import { ipRestriction } from 'acrylblends/ip-restriction'
100
+ * import { getConnInfo } from 'acrylblends/cloudflare-workers'
101
+ *
102
+ * const app = new Acryl()
103
+ *
104
+ * app.use(
105
+ * '*',
106
+ * ipRestriction(getConnInfo, {
107
+ * // Block a specific IP and an entire subnet
108
+ * denyList: ['192.168.0.5', '10.0.0.0/8'],
109
+ * // Only allow requests from localhost and a private range
110
+ * allowList: ['127.0.0.1', '::1', '192.168.1.0/24'],
111
+ * })
112
+ * )
113
+ *
114
+ * // With a custom error handler
115
+ * app.use(
116
+ * '/admin/*',
117
+ * ipRestriction(
118
+ * getConnInfo,
119
+ * { allowList: ['203.0.113.0/24'] },
120
+ * (remote, c) => c.text(`Access denied for ${remote.addr}`, 403)
121
+ * )
122
+ * )
123
+ *
124
+ * app.get('/', (c) => c.text('Hello!'))
125
+ * ```
126
+ */
127
+ const ipRestriction = (getIP, { denyList = [], allowList = [] }, onError) => {
128
+ const allowLength = allowList.length;
129
+ const denyMatcher = buildMatcher(denyList);
130
+ const allowMatcher = buildMatcher(allowList);
131
+ const blockError = (c) => new HTTPException(403, { res: c.text("Forbidden", { status: 403 }) });
132
+ return async function ipRestriction(c, next) {
133
+ const connInfo = getIP(c);
134
+ const addr = typeof connInfo === "string" ? connInfo : connInfo.remote.address;
135
+ if (!addr) throw blockError(c);
136
+ const type = typeof connInfo !== "string" && connInfo.remote.addressType || distinctRemoteAddr(addr);
137
+ const remoteData = {
138
+ addr,
139
+ type,
140
+ isIPv4: type === "IPv4"
141
+ };
142
+ try {
143
+ if (denyMatcher(remoteData)) {
144
+ if (onError) return onError({
145
+ addr,
146
+ type
147
+ }, c);
148
+ throw blockError(c);
149
+ }
150
+ if (allowMatcher(remoteData)) return await next();
151
+ } catch (e) {
152
+ if (e instanceof TypeError && e.code === "ERR_INVALID_IP_ADDRESS") throw blockError(c);
153
+ throw e;
154
+ }
155
+ if (allowLength === 0) return await next();
156
+ else {
157
+ if (onError) return await onError({
158
+ addr,
159
+ type
160
+ }, c);
161
+ throw blockError(c);
162
+ }
163
+ };
164
+ };
165
+ //#endregion
166
+ export { ipRestriction };
package/lib/jwk.d.ts ADDED
@@ -0,0 +1,52 @@
1
+ import { I as MiddlewareHandler, t as Context } from "./context-Bm7rI-oK.js";
2
+ import { n as BufferSource } from "./types-CwrQjlaM.js";
3
+ import { i as CookiePrefixOptions } from "./cookie-ClMaKDQf.js";
4
+ import { i as AcrylJsonWebKey, n as VerifyOptions, s as AsymmetricAlgorithm } from "./jwt-Dg493Tai.js";
5
+
6
+ //#region ../../plugins/acryl-router/src/core/middleware/jwk/jwk.d.ts
7
+ /**
8
+ * JWK Auth Middleware for Acryl.
9
+ *
10
+ *
11
+ * @param {object} options - The options for the JWK middleware.
12
+ * @param {AcrylJsonWebKey[] | ((ctx: Context) => Promise<AcrylJsonWebKey[]> | AcrylJsonWebKey[])} [options.keys] - The public keys used for JWK verification, or a function that returns them.
13
+ * @param {string | ((ctx: Context) => Promise<string> | string)} [options.jwks_uri] - If set to a URI string or a function that returns a URI string, attempt to fetch JWKs from it. The response must be a JSON object containing a `keys` array, which will be merged with the `keys` option.
14
+ * @param {boolean} [options.allow_anon] - If set to `true`, the middleware allows requests without a token to proceed without authentication.
15
+ * @param {string} [options.cookie] - If set, the middleware attempts to retrieve the token from a cookie with these options (optionally signed) only if no token is found in the header.
16
+ * @param {string} [options.headerName='Authorization'] - The name of the header to look for the JWT token. Default is 'Authorization'.
17
+ * @param {string} [options.realm] - The protection space described by the `realm` parameter of the returned `WWW-Authenticate` challenge header. Defaults to the request URL.
18
+ * @param {AsymmetricAlgorithm[]} options.alg - An array of allowed asymmetric algorithms for JWT verification. Only tokens signed with these algorithms will be accepted.
19
+ * @param {RequestInit} [init] - Optional init options for the `fetch` request when retrieving JWKS from a URI.
20
+ * @param {VerifyOptions} [options.verification] - Additional options for JWK payload verification.
21
+ * @returns {MiddlewareHandler} The middleware handler function.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * const app = new Acryl()
26
+ *
27
+ * app.use("/auth/*", jwk({
28
+ * jwks_uri: (c) => `https://${c.env.authServer}/.well-known/jwks.json`,
29
+ * headerName: 'x-custom-auth-header', // Optional, default is 'Authorization'
30
+ * }))
31
+ *
32
+ * app.get('/auth/page', (c) => {
33
+ * return c.text('You are authorized')
34
+ * })
35
+ * ```
36
+ */
37
+ declare const jwk: (options: {
38
+ keys?: AcrylJsonWebKey[] | ((ctx: Context) => Promise<AcrylJsonWebKey[]> | AcrylJsonWebKey[]);
39
+ jwks_uri?: string | ((ctx: Context) => Promise<string> | string);
40
+ allow_anon?: boolean;
41
+ cookie?: string | {
42
+ key: string;
43
+ secret?: string | BufferSource;
44
+ prefixOptions?: CookiePrefixOptions;
45
+ };
46
+ headerName?: string;
47
+ alg: AsymmetricAlgorithm[];
48
+ realm?: string;
49
+ verification?: VerifyOptions;
50
+ }, init?: RequestInit) => MiddlewareHandler;
51
+ //#endregion
52
+ export { jwk };