acrylblends 0.3.0 → 0.4.1

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 (341) hide show
  1. package/dist/index.d.ts +6 -1
  2. package/dist/index.js +84 -5
  3. package/dist/index.js.map +1 -1
  4. package/docs/framework/LICENSE +23 -0
  5. package/docs/framework/README.md +63 -0
  6. package/docs/framework/UPSTREAM.md +3 -0
  7. package/docs/framework/api-summary.md +138 -0
  8. package/docs/framework/concepts.md +105 -0
  9. package/docs/framework/context.md +129 -0
  10. package/docs/framework/getting-started.md +146 -0
  11. package/docs/framework/helpers.md +118 -0
  12. package/docs/framework/middleware.md +154 -0
  13. package/docs/framework/migration-from-0-3.md +108 -0
  14. package/docs/framework/migration-from-dsh-webserver.md +103 -0
  15. package/docs/framework/node-server.md +75 -0
  16. package/docs/framework/plugin-lifecycle.md +111 -0
  17. package/docs/framework/request.md +106 -0
  18. package/docs/framework/routing.md +188 -0
  19. package/docs/framework/surfaces.md +71 -0
  20. package/docs/framework/upstream.json +9 -0
  21. package/docs/framework/validation.md +135 -0
  22. package/package.json +4 -2
  23. package/plugins/acryl-inspect/plugin.json +2 -1
  24. package/plugins/acryl-inspect/src/report.ts +21 -13
  25. package/plugins/acryl-inspect/src/service.ts +9 -7
  26. package/plugins/acryl-inspect/tests/report.spec.ts +13 -8
  27. package/plugins/acryl-inspect/tests/service.spec.ts +11 -10
  28. package/plugins/acryl-inspect/upstream.json +2 -2
  29. package/plugins/acryl-node-server/LICENSE +26 -0
  30. package/plugins/acryl-node-server/plugin.json +2 -1
  31. package/plugins/acryl-node-server/src/adapter/conninfo.ts +23 -0
  32. package/plugins/acryl-node-server/src/adapter/early-hints.ts +55 -0
  33. package/plugins/acryl-node-server/src/adapter/error.ts +11 -0
  34. package/plugins/acryl-node-server/src/adapter/headers.ts +249 -0
  35. package/plugins/acryl-node-server/src/adapter/index.ts +6 -0
  36. package/plugins/acryl-node-server/src/adapter/listener.ts +540 -0
  37. package/plugins/acryl-node-server/src/adapter/request.ts +797 -0
  38. package/plugins/acryl-node-server/src/adapter/response.ts +186 -0
  39. package/plugins/acryl-node-server/src/adapter/serve-static.ts +238 -0
  40. package/plugins/acryl-node-server/src/adapter/server.ts +36 -0
  41. package/plugins/acryl-node-server/src/adapter/types.ts +82 -0
  42. package/plugins/acryl-node-server/src/adapter/url.ts +42 -0
  43. package/plugins/acryl-node-server/src/adapter/utils/response/constants.ts +1 -0
  44. package/plugins/acryl-node-server/src/adapter/utils/response.ts +4 -0
  45. package/plugins/acryl-node-server/src/adapter/utils/stream.ts +88 -0
  46. package/plugins/acryl-node-server/src/adapter/utils.ts +96 -0
  47. package/plugins/acryl-node-server/src/adapter/websocket-types.ts +45 -0
  48. package/plugins/acryl-node-server/src/adapter/websocket.ts +375 -0
  49. package/plugins/acryl-node-server/src/index.ts +19 -6
  50. package/plugins/acryl-node-server/tests/adapter/app.ts +76 -0
  51. package/plugins/acryl-node-server/tests/adapter/assets/.static/plain.txt +1 -0
  52. package/plugins/acryl-node-server/tests/adapter/assets/favicon.ico +0 -0
  53. package/plugins/acryl-node-server/tests/adapter/assets/secret.txt +1 -0
  54. package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +1 -0
  55. package/plugins/acryl-node-server/tests/adapter/assets/static/admin/secret.txt +1 -0
  56. package/plugins/acryl-node-server/tests/adapter/assets/static/data.json +5 -0
  57. package/plugins/acryl-node-server/tests/adapter/assets/static/extensionless +1 -0
  58. package/plugins/acryl-node-server/tests/adapter/assets/static/foo..bar.txt +0 -0
  59. package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +1 -0
  60. package/plugins/acryl-node-server/tests/adapter/assets/static/plain.txt +1 -0
  61. package/plugins/acryl-node-server/tests/adapter/assets/static-with-context-path/plain.txt +1 -0
  62. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin +1 -0
  63. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin.br +1 -0
  64. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt +1 -0
  65. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.br +1 -0
  66. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.zst +1 -0
  67. package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +34 -0
  68. package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +248 -0
  69. package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +457 -0
  70. package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-cert.pem +23 -0
  71. package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-key.pem +27 -0
  72. package/plugins/acryl-node-server/tests/adapter/headers.test.ts +252 -0
  73. package/plugins/acryl-node-server/tests/adapter/helpers/request.ts +190 -0
  74. package/plugins/acryl-node-server/tests/adapter/listener.test.ts +727 -0
  75. package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +189 -0
  76. package/plugins/acryl-node-server/tests/adapter/request.test.ts +1230 -0
  77. package/plugins/acryl-node-server/tests/adapter/response.test.ts +285 -0
  78. package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +849 -0
  79. package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +790 -0
  80. package/plugins/acryl-node-server/tests/adapter/server.test.ts +1302 -0
  81. package/plugins/acryl-node-server/tests/adapter/setup.ts +16 -0
  82. package/plugins/acryl-node-server/tests/adapter/url.test.ts +76 -0
  83. package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +23 -0
  84. package/plugins/acryl-node-server/tests/adapter/utils/stream.test.ts +75 -0
  85. package/plugins/acryl-node-server/tests/adapter/utils.test.ts +235 -0
  86. package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +260 -0
  87. package/plugins/acryl-node-server/tests/server.spec.ts +44 -8
  88. package/plugins/acryl-node-server/upstream.json +3 -3
  89. package/plugins/acryl-router/LICENSE +26 -0
  90. package/plugins/acryl-router/plugin.json +2 -1
  91. package/plugins/acryl-router/src/client.ts +2 -0
  92. package/plugins/acryl-router/src/connection.ts +42 -0
  93. package/plugins/acryl-router/src/core/app-base.ts +544 -0
  94. package/plugins/acryl-router/src/core/app.test.ts +3833 -0
  95. package/plugins/acryl-router/src/core/app.ts +34 -0
  96. package/plugins/acryl-router/src/core/client/client.test.ts +2313 -0
  97. package/plugins/acryl-router/src/core/client/client.ts +249 -0
  98. package/plugins/acryl-router/src/core/client/fetch-result-please.ts +95 -0
  99. package/plugins/acryl-router/src/core/client/index.ts +17 -0
  100. package/plugins/acryl-router/src/core/client/types.test.ts +149 -0
  101. package/plugins/acryl-router/src/core/client/types.ts +393 -0
  102. package/plugins/acryl-router/src/core/client/utils.test.ts +405 -0
  103. package/plugins/acryl-router/src/core/client/utils.ts +117 -0
  104. package/plugins/acryl-router/src/core/compose.test.ts +751 -0
  105. package/plugins/acryl-router/src/core/compose.ts +73 -0
  106. package/plugins/acryl-router/src/core/context.test.ts +629 -0
  107. package/plugins/acryl-router/src/core/context.ts +781 -0
  108. package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +344 -0
  109. package/plugins/acryl-router/src/core/helper/accepts/accepts.ts +96 -0
  110. package/plugins/acryl-router/src/core/helper/accepts/index.ts +6 -0
  111. package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +55 -0
  112. package/plugins/acryl-router/src/core/helper/adapter/index.ts +90 -0
  113. package/plugins/acryl-router/src/core/helper/conninfo/index.ts +6 -0
  114. package/plugins/acryl-router/src/core/helper/conninfo/types.ts +45 -0
  115. package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +510 -0
  116. package/plugins/acryl-router/src/core/helper/cookie/index.ts +146 -0
  117. package/plugins/acryl-router/src/core/helper/factory/index.test.ts +434 -0
  118. package/plugins/acryl-router/src/core/helper/factory/index.ts +375 -0
  119. package/plugins/acryl-router/src/core/helper/html/index.test.ts +78 -0
  120. package/plugins/acryl-router/src/core/helper/html/index.ts +57 -0
  121. package/plugins/acryl-router/src/core/helper/route/index.test.ts +259 -0
  122. package/plugins/acryl-router/src/core/helper/route/index.ts +144 -0
  123. package/plugins/acryl-router/src/core/helper/streaming/index.ts +9 -0
  124. package/plugins/acryl-router/src/core/helper/streaming/sse.ts +101 -0
  125. package/plugins/acryl-router/src/core/helper/streaming/stream.test.ts +128 -0
  126. package/plugins/acryl-router/src/core/helper/streaming/stream.ts +45 -0
  127. package/plugins/acryl-router/src/core/helper/streaming/text.test.ts +34 -0
  128. package/plugins/acryl-router/src/core/helper/streaming/text.ts +15 -0
  129. package/plugins/acryl-router/src/core/helper/streaming/utils.ts +11 -0
  130. package/plugins/acryl-router/src/core/helper/testing/index.test.ts +42 -0
  131. package/plugins/acryl-router/src/core/helper/testing/index.ts +28 -0
  132. package/plugins/acryl-router/src/core/helper/websocket/index.test.ts +124 -0
  133. package/plugins/acryl-router/src/core/helper/websocket/index.ts +140 -0
  134. package/plugins/acryl-router/src/core/http-exception.test.ts +45 -0
  135. package/plugins/acryl-router/src/core/http-exception.ts +77 -0
  136. package/plugins/acryl-router/src/core/index.ts +53 -0
  137. package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +434 -0
  138. package/plugins/acryl-router/src/core/middleware/basic-auth/index.ts +152 -0
  139. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +1018 -0
  140. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.ts +220 -0
  141. package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +273 -0
  142. package/plugins/acryl-router/src/core/middleware/body-limit/index.ts +110 -0
  143. package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +355 -0
  144. package/plugins/acryl-router/src/core/middleware/combine/index.ts +171 -0
  145. package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +535 -0
  146. package/plugins/acryl-router/src/core/middleware/compress/index.ts +142 -0
  147. package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +43 -0
  148. package/plugins/acryl-router/src/core/middleware/context-storage/index.ts +58 -0
  149. package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +532 -0
  150. package/plugins/acryl-router/src/core/middleware/cors/index.ts +163 -0
  151. package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +534 -0
  152. package/plugins/acryl-router/src/core/middleware/csrf/index.ts +150 -0
  153. package/plugins/acryl-router/src/core/middleware/etag/digest.test.ts +21 -0
  154. package/plugins/acryl-router/src/core/middleware/etag/digest.ts +95 -0
  155. package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +503 -0
  156. package/plugins/acryl-router/src/core/middleware/etag/index.ts +135 -0
  157. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +217 -0
  158. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.ts +278 -0
  159. package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +1135 -0
  160. package/plugins/acryl-router/src/core/middleware/jwk/index.ts +1 -0
  161. package/plugins/acryl-router/src/core/middleware/jwk/jwk.ts +195 -0
  162. package/plugins/acryl-router/src/core/middleware/jwk/keys.test.json +48 -0
  163. package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +802 -0
  164. package/plugins/acryl-router/src/core/middleware/jwt/index.ts +9 -0
  165. package/plugins/acryl-router/src/core/middleware/jwt/jwt.ts +189 -0
  166. package/plugins/acryl-router/src/core/middleware/language/index.test.ts +552 -0
  167. package/plugins/acryl-router/src/core/middleware/language/index.ts +12 -0
  168. package/plugins/acryl-router/src/core/middleware/language/language.ts +314 -0
  169. package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +204 -0
  170. package/plugins/acryl-router/src/core/middleware/logger/index.ts +95 -0
  171. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +292 -0
  172. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.ts +141 -0
  173. package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +221 -0
  174. package/plugins/acryl-router/src/core/middleware/method-override/index.ts +147 -0
  175. package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +37 -0
  176. package/plugins/acryl-router/src/core/middleware/powered-by/index.ts +35 -0
  177. package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +218 -0
  178. package/plugins/acryl-router/src/core/middleware/pretty-json/index.ts +67 -0
  179. package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +168 -0
  180. package/plugins/acryl-router/src/core/middleware/request-id/index.ts +7 -0
  181. package/plugins/acryl-router/src/core/middleware/request-id/request-id.ts +59 -0
  182. package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +671 -0
  183. package/plugins/acryl-router/src/core/middleware/secure-headers/index.ts +8 -0
  184. package/plugins/acryl-router/src/core/middleware/secure-headers/permissions-policy.ts +101 -0
  185. package/plugins/acryl-router/src/core/middleware/secure-headers/secure-headers.ts +340 -0
  186. package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +450 -0
  187. package/plugins/acryl-router/src/core/middleware/serve-static/index.ts +135 -0
  188. package/plugins/acryl-router/src/core/middleware/serve-static/path.test.ts +50 -0
  189. package/plugins/acryl-router/src/core/middleware/serve-static/path.ts +25 -0
  190. package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +70 -0
  191. package/plugins/acryl-router/src/core/middleware/timeout/index.ts +58 -0
  192. package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +310 -0
  193. package/plugins/acryl-router/src/core/middleware/timing/index.ts +8 -0
  194. package/plugins/acryl-router/src/core/middleware/timing/timing.ts +256 -0
  195. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +381 -0
  196. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.ts +156 -0
  197. package/plugins/acryl-router/src/core/request/constants.ts +1 -0
  198. package/plugins/acryl-router/src/core/request.test.ts +751 -0
  199. package/plugins/acryl-router/src/core/request.ts +502 -0
  200. package/plugins/acryl-router/src/core/router/common.case.test.ts +1132 -0
  201. package/plugins/acryl-router/src/core/router/linear-router/index.ts +6 -0
  202. package/plugins/acryl-router/src/core/router/linear-router/router.test.ts +80 -0
  203. package/plugins/acryl-router/src/core/router/linear-router/router.ts +152 -0
  204. package/plugins/acryl-router/src/core/router/pattern-router/index.ts +6 -0
  205. package/plugins/acryl-router/src/core/router/pattern-router/router.test.ts +46 -0
  206. package/plugins/acryl-router/src/core/router/pattern-router/router.ts +54 -0
  207. package/plugins/acryl-router/src/core/router/reg-exp-router/index.ts +7 -0
  208. package/plugins/acryl-router/src/core/router/reg-exp-router/matcher.ts +33 -0
  209. package/plugins/acryl-router/src/core/router/reg-exp-router/node.ts +170 -0
  210. package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.test.ts +154 -0
  211. package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.ts +165 -0
  212. package/plugins/acryl-router/src/core/router/reg-exp-router/router.test.ts +265 -0
  213. package/plugins/acryl-router/src/core/router/reg-exp-router/router.ts +174 -0
  214. package/plugins/acryl-router/src/core/router/reg-exp-router/trie.ts +84 -0
  215. package/plugins/acryl-router/src/core/router/smart-router/index.ts +6 -0
  216. package/plugins/acryl-router/src/core/router/smart-router/router.test.ts +13 -0
  217. package/plugins/acryl-router/src/core/router/smart-router/router.ts +70 -0
  218. package/plugins/acryl-router/src/core/router/trie-router/index.ts +6 -0
  219. package/plugins/acryl-router/src/core/router/trie-router/node.test.ts +896 -0
  220. package/plugins/acryl-router/src/core/router/trie-router/node.ts +221 -0
  221. package/plugins/acryl-router/src/core/router/trie-router/router.test.ts +8 -0
  222. package/plugins/acryl-router/src/core/router/trie-router/router.ts +18 -0
  223. package/plugins/acryl-router/src/core/router/utils.ts +1 -0
  224. package/plugins/acryl-router/src/core/router.ts +103 -0
  225. package/plugins/acryl-router/src/core/types.test.ts +4134 -0
  226. package/plugins/acryl-router/src/core/types.ts +2782 -0
  227. package/plugins/acryl-router/src/core/utils/accept.test.ts +299 -0
  228. package/plugins/acryl-router/src/core/utils/accept.ts +268 -0
  229. package/plugins/acryl-router/src/core/utils/basic-auth.test.ts +56 -0
  230. package/plugins/acryl-router/src/core/utils/basic-auth.ts +26 -0
  231. package/plugins/acryl-router/src/core/utils/body.test.ts +496 -0
  232. package/plugins/acryl-router/src/core/utils/body.ts +263 -0
  233. package/plugins/acryl-router/src/core/utils/buffer.test.ts +147 -0
  234. package/plugins/acryl-router/src/core/utils/buffer.ts +117 -0
  235. package/plugins/acryl-router/src/core/utils/color.test.ts +23 -0
  236. package/plugins/acryl-router/src/core/utils/color.ts +56 -0
  237. package/plugins/acryl-router/src/core/utils/compress.ts +10 -0
  238. package/plugins/acryl-router/src/core/utils/concurrent.test.ts +69 -0
  239. package/plugins/acryl-router/src/core/utils/concurrent.ts +55 -0
  240. package/plugins/acryl-router/src/core/utils/constants.ts +4 -0
  241. package/plugins/acryl-router/src/core/utils/cookie.test.ts +460 -0
  242. package/plugins/acryl-router/src/core/utils/cookie.ts +281 -0
  243. package/plugins/acryl-router/src/core/utils/crypto.test.ts +43 -0
  244. package/plugins/acryl-router/src/core/utils/crypto.ts +58 -0
  245. package/plugins/acryl-router/src/core/utils/encode.test.ts +61 -0
  246. package/plugins/acryl-router/src/core/utils/encode.ts +34 -0
  247. package/plugins/acryl-router/src/core/utils/filepath.test.ts +78 -0
  248. package/plugins/acryl-router/src/core/utils/filepath.ts +60 -0
  249. package/plugins/acryl-router/src/core/utils/handler.ts +15 -0
  250. package/plugins/acryl-router/src/core/utils/headers.ts +355 -0
  251. package/plugins/acryl-router/src/core/utils/html.test.ts +16 -0
  252. package/plugins/acryl-router/src/core/utils/html.ts +182 -0
  253. package/plugins/acryl-router/src/core/utils/http-status.ts +72 -0
  254. package/plugins/acryl-router/src/core/utils/ipaddr.test.ts +149 -0
  255. package/plugins/acryl-router/src/core/utils/ipaddr.ts +374 -0
  256. package/plugins/acryl-router/src/core/utils/jwt/index.ts +7 -0
  257. package/plugins/acryl-router/src/core/utils/jwt/jwa.test.ts +86 -0
  258. package/plugins/acryl-router/src/core/utils/jwt/jwa.ts +38 -0
  259. package/plugins/acryl-router/src/core/utils/jwt/jws.ts +235 -0
  260. package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +1788 -0
  261. package/plugins/acryl-router/src/core/utils/jwt/jwt.ts +292 -0
  262. package/plugins/acryl-router/src/core/utils/jwt/types.ts +157 -0
  263. package/plugins/acryl-router/src/core/utils/jwt/utf8.ts +7 -0
  264. package/plugins/acryl-router/src/core/utils/mime.test.ts +64 -0
  265. package/plugins/acryl-router/src/core/utils/mime.ts +94 -0
  266. package/plugins/acryl-router/src/core/utils/stream.test.ts +212 -0
  267. package/plugins/acryl-router/src/core/utils/stream.ts +107 -0
  268. package/plugins/acryl-router/src/core/utils/types.test.ts +295 -0
  269. package/plugins/acryl-router/src/core/utils/types.ts +123 -0
  270. package/plugins/acryl-router/src/core/utils/url.test.ts +384 -0
  271. package/plugins/acryl-router/src/core/utils/url.ts +337 -0
  272. package/plugins/acryl-router/src/core/validator/index.ts +8 -0
  273. package/plugins/acryl-router/src/core/validator/utils.test.ts +82 -0
  274. package/plugins/acryl-router/src/core/validator/utils.ts +69 -0
  275. package/plugins/acryl-router/src/core/validator/validator.test.ts +1488 -0
  276. package/plugins/acryl-router/src/core/validator/validator.ts +185 -0
  277. package/plugins/acryl-router/src/helpers/index.ts +13 -3
  278. package/plugins/acryl-router/src/helpers/schema-validator.ts +35 -0
  279. package/plugins/acryl-router/src/index.ts +6 -6
  280. package/plugins/acryl-router/src/middleware/index.ts +25 -6
  281. package/plugins/acryl-router/src/middleware/loopback-only.ts +53 -14
  282. package/plugins/acryl-router/src/service.ts +262 -64
  283. package/plugins/acryl-router/tests/docs-examples.spec.ts +152 -0
  284. package/plugins/acryl-router/tests/live-install.spec.ts +2 -2
  285. package/plugins/acryl-router/tests/loader.spec.ts +3 -2
  286. package/plugins/acryl-router/tests/loopback-only.spec.ts +80 -0
  287. package/plugins/acryl-router/tests/service.spec.ts +281 -66
  288. package/plugins/acryl-router/tests/shadow-state.spec.ts +79 -0
  289. package/plugins/acryl-router/upstream.json +2 -2
  290. package/plugins/acryl-router-http/plugin.json +2 -1
  291. package/plugins/acryl-router-http/src/bridge.ts +3 -1
  292. package/plugins/acryl-router-http/tests/adapter.spec.ts +16 -12
  293. package/plugins/acryl-router-http/tests/surfaces.spec.ts +12 -10
  294. package/plugins/acryl-router-http/upstream.json +3 -3
  295. package/plugins/acryl-state/NOTICE +30 -0
  296. package/plugins/acryl-state/plugin.json +1 -1
  297. package/plugins/acryl-state/src/cell.ts +1 -1
  298. package/plugins/acryl-state/src/service.ts +33 -15
  299. package/plugins/acryl-state/upstream.json +6 -4
  300. package/plugins/builder/script.ts +4 -7
  301. package/plugins/extensions/index.ts +6 -5
  302. package/plugins/extensions/resolve.ts +28 -3
  303. package/plugins/openai/prompt.ts +9 -7
  304. package/plugins/tsconfig.json +5 -4
  305. package/shared/AGENTS.core.md +54 -0
  306. package/templates/agent/AGENTS.md +6 -0
  307. package/templates/agent/README.md +2 -2
  308. package/templates/agent/blend.yaml +1 -1
  309. package/templates/agent/src/routes.ts +37 -27
  310. package/templates/agent/test/model.test.ts +2 -1
  311. package/templates/agent/tsconfig.json +8 -5
  312. package/templates/blank/AGENTS.md +5 -0
  313. package/templates/blank/README.md +1 -1
  314. package/templates/blank/src/routes.ts +6 -4
  315. package/templates/blank/tsconfig.json +2 -4
  316. package/templates/todo/AGENTS.md +5 -0
  317. package/templates/todo/src/page.ts +1 -1
  318. package/templates/todo/src/todo.ts +58 -29
  319. package/templates/todo/tsconfig.json +2 -4
  320. package/templates/todo/upstream.json +2 -2
  321. package/plugins/acryl-router/src/compose.ts +0 -21
  322. package/plugins/acryl-router/src/context.ts +0 -59
  323. package/plugins/acryl-router/src/helpers/read-body.ts +0 -59
  324. package/plugins/acryl-router/src/helpers/sse.ts +0 -83
  325. package/plugins/acryl-router/src/helpers/validate.ts +0 -44
  326. package/plugins/acryl-router/src/http-error.ts +0 -21
  327. package/plugins/acryl-router/src/middleware/body-limit.ts +0 -25
  328. package/plugins/acryl-router/src/middleware/cors.ts +0 -46
  329. package/plugins/acryl-router/src/middleware/logger.ts +0 -21
  330. package/plugins/acryl-router/src/middleware/request-id.ts +0 -24
  331. package/plugins/acryl-router/src/middleware/secure-headers.ts +0 -23
  332. package/plugins/acryl-router/src/pattern.ts +0 -89
  333. package/plugins/acryl-router/src/registrar.ts +0 -90
  334. package/plugins/acryl-router/src/table.ts +0 -156
  335. package/plugins/acryl-router/src/types.ts +0 -73
  336. package/plugins/acryl-router/src/util.ts +0 -23
  337. package/plugins/acryl-router/tests/api.spec.ts +0 -223
  338. package/plugins/acryl-router/tests/conformance.ts +0 -170
  339. package/plugins/acryl-router/tests/helpers.spec.ts +0 -172
  340. package/plugins/acryl-router/tests/middleware.spec.ts +0 -183
  341. package/plugins/acryl-router/tests/table.spec.ts +0 -47
@@ -0,0 +1,393 @@
1
+ import type { App } from '../app.ts'
2
+ import type { AppBase } from '../app-base.ts'
3
+ import type { METHODS, METHOD_NAME_ALL_LOWERCASE } from '../router.ts'
4
+ import type { Endpoint, ExtractSchema, KnownResponseFormat, ResponseFormat, Schema } from '../types.ts'
5
+ import type { StatusCode, SuccessStatusCode } from '../utils/http-status.ts'
6
+ import type { HasRequiredKeys } from '../utils/types.ts'
7
+
8
+ /**
9
+ * Type representing the '$all' method name
10
+ */
11
+ type MethodNameAll = `$${typeof METHOD_NAME_ALL_LOWERCASE}`
12
+
13
+ /**
14
+ * Type representing all standard HTTP methods prefixed with '$'
15
+ * e.g., '$get' | '$post' | '$put' | '$delete' | '$options' | '$patch' | '$query'
16
+ */
17
+ type StandardMethods = `$${(typeof METHODS)[number]}`
18
+
19
+ /**
20
+ * Expands '$all' into all standard HTTP methods.
21
+ * If the schema contains '$all', it creates a type where all standard HTTP methods
22
+ * point to the same endpoint definition as '$all', while removing '$all' itself.
23
+ */
24
+ type ExpandAllMethod<S> = MethodNameAll extends keyof S
25
+ ? { [M in StandardMethods]: S[MethodNameAll] } & Omit<S, MethodNameAll>
26
+ : S
27
+
28
+ type AppRequest = (typeof App.prototype)['request']
29
+
30
+ export type BuildSearchParamsFn = (query: Record<string, string | string[]>) => URLSearchParams
31
+
32
+ export type ClientRequestOptions<T = unknown> = {
33
+ fetch?: typeof fetch | AppRequest
34
+ webSocket?: (...args: ConstructorParameters<typeof WebSocket>) => WebSocket
35
+ /**
36
+ * Standard `RequestInit`, caution that this take highest priority
37
+ * and could be used to overwrite things that App sets for you, like `body | method | headers`.
38
+ *
39
+ * If you want to add some headers, use in `headers` instead of `init`
40
+ */
41
+ init?: RequestInit
42
+ /**
43
+ * Custom function to serialize query parameters into URLSearchParams.
44
+ * By default, arrays are serialized as multiple parameters with the same key (e.g., `key=a&key=b`).
45
+ * You can provide a custom function to change this behavior, for example to use bracket notation (e.g., `key[]=a&key[]=b`).
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * const client = hc('http://localhost', {
50
+ * buildSearchParams: (query) => {
51
+ * return new URLSearchParams(qs.stringify(query))
52
+ * }
53
+ * })
54
+ * ```
55
+ */
56
+ buildSearchParams?: BuildSearchParamsFn
57
+ } & (keyof T extends never
58
+ ? {
59
+ headers?:
60
+ | Record<string, string>
61
+ | (() => Record<string, string> | Promise<Record<string, string>>)
62
+ }
63
+ : {
64
+ headers: T | (() => T | Promise<T>)
65
+ })
66
+
67
+ export type ClientRequest<Prefix extends string, Path extends string, S extends Schema> = {
68
+ [M in keyof ExpandAllMethod<S>]: ExpandAllMethod<S>[M] extends Endpoint & { input: infer R }
69
+ ? R extends object
70
+ ? HasRequiredKeys<R> extends true
71
+ ? (
72
+ args: R,
73
+ options?: ClientRequestOptions
74
+ ) => Promise<ClientResponseOfEndpoint<ExpandAllMethod<S>[M]>>
75
+ : (
76
+ args?: R,
77
+ options?: ClientRequestOptions
78
+ ) => Promise<ClientResponseOfEndpoint<ExpandAllMethod<S>[M]>>
79
+ : never
80
+ : never
81
+ } & {
82
+ $url: <
83
+ const Arg extends
84
+ | (S[keyof S] extends { input: infer R }
85
+ ? R extends { param: infer P }
86
+ ? R extends { query: infer Q }
87
+ ? { param: P; query: Q }
88
+ : { param: P }
89
+ : R extends { query: infer Q }
90
+ ? { query: Q }
91
+ : {}
92
+ : {})
93
+ | undefined = undefined,
94
+ >(
95
+ arg?: Arg
96
+ ) => AppURL<Prefix, Path, Arg>
97
+ $path: <
98
+ const Arg extends
99
+ | (S[keyof S] extends { input: infer R }
100
+ ? R extends { param: infer P }
101
+ ? R extends { query: infer Q }
102
+ ? { param: P; query: Q }
103
+ : { param: P }
104
+ : R extends { query: infer Q }
105
+ ? { query: Q }
106
+ : {}
107
+ : {})
108
+ | undefined = undefined,
109
+ >(
110
+ arg?: Arg
111
+ ) => BuildPath<Path, Arg>
112
+ } & (S['$get'] extends { outputFormat: 'ws' }
113
+ ? S['$get'] extends { input: infer I }
114
+ ? {
115
+ $ws: (args?: I) => WebSocket
116
+ }
117
+ : {}
118
+ : {})
119
+
120
+ type ClientResponseOfEndpoint<T extends Endpoint = Endpoint> = T extends {
121
+ output: infer O
122
+ outputFormat: infer F
123
+ status: infer S
124
+ }
125
+ ? ClientResponse<O, S extends number ? S : never, F extends ResponseFormat ? F : never>
126
+ : never
127
+
128
+ export interface ClientResponse<
129
+ T,
130
+ U extends number = StatusCode,
131
+ F extends ResponseFormat = ResponseFormat,
132
+ > {
133
+ readonly body: ReadableStream | null
134
+ readonly bodyUsed: boolean
135
+ ok: U extends SuccessStatusCode
136
+ ? true
137
+ : U extends Exclude<StatusCode, SuccessStatusCode>
138
+ ? false
139
+ : boolean
140
+ redirected: boolean
141
+ status: U
142
+ statusText: string
143
+ type: 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect'
144
+ headers: Headers
145
+ url: string
146
+ redirect(url: string, status: number): Response
147
+ clone(): Response
148
+ bytes(): Promise<Uint8Array<ArrayBuffer>>
149
+ json(): F extends 'text' ? Promise<never> : F extends 'json' ? Promise<T> : Promise<unknown>
150
+ text(): F extends 'text' ? (T extends string ? Promise<T> : Promise<never>) : Promise<string>
151
+ blob(): Promise<Blob>
152
+ formData(): Promise<FormData>
153
+ arrayBuffer(): Promise<ArrayBuffer>
154
+ }
155
+
156
+ type BuildSearch<Arg, Key extends 'query'> = Arg extends { [K in Key]: infer Query }
157
+ ? IsEmptyObject<Query> extends true
158
+ ? ''
159
+ : `?${string}`
160
+ : ''
161
+
162
+ type BuildPathname<P extends string, Arg> = Arg extends { param: infer Param }
163
+ ? `${ApplyParam<TrimStartSlash<P>, Param>}`
164
+ : `/${TrimStartSlash<P>}`
165
+
166
+ type BuildPath<P extends string, Arg> = `${BuildPathname<P, Arg>}${BuildSearch<Arg, 'query'>}`
167
+
168
+ type BuildTypedURL<
169
+ Protocol extends string,
170
+ Host extends string,
171
+ Port extends string,
172
+ P extends string,
173
+ Arg,
174
+ > = TypedURL<`${Protocol}:`, Host, Port, BuildPathname<P, Arg>, BuildSearch<Arg, 'query'>>
175
+
176
+ type AppURL<Prefix extends string, Path extends string, Arg> =
177
+ IsLiteral<Prefix> extends true
178
+ ? TrimEndSlash<Prefix> extends `${infer Protocol}://${infer Rest}`
179
+ ? Rest extends `${infer Hostname}/${infer P}`
180
+ ? ParseHostName<Hostname> extends [infer Host extends string, infer Port extends string]
181
+ ? BuildTypedURL<Protocol, Host, Port, P, Arg>
182
+ : never
183
+ : ParseHostName<Rest> extends [infer Host extends string, infer Port extends string]
184
+ ? BuildTypedURL<Protocol, Host, Port, Path, Arg>
185
+ : never
186
+ : URL
187
+ : URL
188
+ type ParseHostName<T extends string> = T extends `${infer Host}:${infer Port}`
189
+ ? [Host, Port]
190
+ : [T, '']
191
+ type TrimStartSlash<T extends string> = T extends `/${infer R}` ? TrimStartSlash<R> : T
192
+ type TrimEndSlash<T extends string> = T extends `${infer R}/` ? TrimEndSlash<R> : T
193
+ type IsLiteral<T extends string> = [T] extends [never] ? false : string extends T ? false : true
194
+ type ApplyParam<
195
+ Path extends string,
196
+ P,
197
+ Result extends string = '',
198
+ > = Path extends `${infer Head}/${infer Rest}`
199
+ ? Head extends `:${infer Param}`
200
+ ? P extends Record<Param, infer Value extends string>
201
+ ? IsLiteral<Value> extends true
202
+ ? ApplyParam<Rest, P, `${Result}/${Value & string}`>
203
+ : ApplyParam<Rest, P, `${Result}/${Head}`>
204
+ : ApplyParam<Rest, P, `${Result}/${Head}`>
205
+ : ApplyParam<Rest, P, `${Result}/${Head}`>
206
+ : Path extends `:${infer Param}`
207
+ ? P extends Record<Param, infer Value extends string>
208
+ ? IsLiteral<Value> extends true
209
+ ? `${Result}/${Value & string}`
210
+ : `${Result}/${Path}`
211
+ : `${Result}/${Path}`
212
+ : `${Result}/${Path}`
213
+ type IsEmptyObject<T> = keyof T extends never ? true : false
214
+
215
+ export interface TypedURL<
216
+ Protocol extends string,
217
+ Hostname extends string,
218
+ Port extends string,
219
+ Pathname extends string,
220
+ Search extends string,
221
+ > extends URL {
222
+ protocol: Protocol
223
+ hostname: Hostname
224
+ port: Port
225
+ host: Port extends '' ? Hostname : `${Hostname}:${Port}`
226
+ origin: `${Protocol}//${Hostname}${Port extends '' ? '' : `:${Port}`}`
227
+ pathname: Pathname
228
+ search: Search
229
+ href: `${Protocol}//${Hostname}${Port extends '' ? '' : `:${Port}`}${Pathname}${Search}`
230
+ }
231
+
232
+ export interface Response extends ClientResponse<unknown> {}
233
+
234
+ export type Fetch<T> = (
235
+ args?: InferRequestType<T>,
236
+ opt?: ClientRequestOptions
237
+ ) => Promise<ClientResponseOfEndpoint<InferEndpointType<T>>>
238
+
239
+ type InferEndpointType<T> = T extends (
240
+ args: infer R,
241
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
242
+ options: any | undefined
243
+ ) => Promise<infer U>
244
+ ? U extends ClientResponse<infer O, infer S, infer F>
245
+ ? { input: NonNullable<R>; output: O; outputFormat: F; status: S } extends Endpoint
246
+ ? { input: NonNullable<R>; output: O; outputFormat: F; status: S }
247
+ : never
248
+ : never
249
+ : never
250
+
251
+ export type InferResponseType<T, U extends StatusCode = StatusCode> = InferResponseTypeFromEndpoint<
252
+ InferEndpointType<T>,
253
+ U
254
+ >
255
+
256
+ type InferResponseTypeFromEndpoint<T extends Endpoint, U extends StatusCode> = T extends {
257
+ output: infer O
258
+ status: infer S
259
+ }
260
+ ? S extends U
261
+ ? O
262
+ : never
263
+ : never
264
+
265
+ export type InferRequestType<T> = T extends (
266
+ args: infer R,
267
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
268
+ options: any | undefined
269
+ ) => Promise<ClientResponse<unknown>>
270
+ ? NonNullable<R>
271
+ : never
272
+
273
+ export type InferRequestOptionsType<T> = T extends (
274
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
275
+ args: any,
276
+ options: infer R
277
+ ) => Promise<ClientResponse<unknown>>
278
+ ? NonNullable<R>
279
+ : never
280
+
281
+ /**
282
+ * Filter a ClientResponse type so it only includes responses of specific status codes.
283
+ */
284
+ export type FilterClientResponseByStatusCode<
285
+ T extends ClientResponse<any, any, any>,
286
+ U extends number = StatusCode,
287
+ > =
288
+ T extends ClientResponse<infer RT, infer RC, infer RF>
289
+ ? RC extends U
290
+ ? ClientResponse<RT, RC, RF>
291
+ : never
292
+ : never
293
+
294
+ type PathToChain<
295
+ Prefix extends string,
296
+ Path extends string,
297
+ E extends Schema,
298
+ Original extends string = Path,
299
+ > = Path extends `/${infer P}`
300
+ ? PathToChain<Prefix, P, E, Path>
301
+ : Path extends `${infer P}/${infer R}`
302
+ ? { [K in P]: PathToChain<Prefix, R, E, Original> }
303
+ : {
304
+ [K in Path extends '' ? 'index' : Path]: ClientRequest<
305
+ Prefix,
306
+ Original,
307
+ E extends Record<string, unknown> ? E[Original] : never
308
+ >
309
+ }
310
+
311
+ export type Client<T, Prefix extends string> =
312
+ T extends AppBase<any, infer S, any>
313
+ ? S extends Record<infer K, Schema>
314
+ ? K extends string
315
+ ? PathToChain<Prefix, K, S>
316
+ : never
317
+ : never
318
+ : never
319
+
320
+ export type Callback = (opts: CallbackOptions) => unknown
321
+
322
+ interface CallbackOptions {
323
+ path: string[]
324
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
325
+ args: any[]
326
+ }
327
+
328
+ export type ObjectType<T = unknown> = {
329
+ [key: string]: T
330
+ }
331
+
332
+ type GlobalResponseDefinition = {
333
+ [S in StatusCode]?: {
334
+ [F in KnownResponseFormat]?: unknown
335
+ }
336
+ }
337
+
338
+ type ToEndpoints<Def extends GlobalResponseDefinition, R> = {
339
+ [S in keyof Def & StatusCode]: {
340
+ [F in keyof Def[S] & KnownResponseFormat]: Omit<R, 'output' | 'status' | 'outputFormat'> & {
341
+ output: Def[S][F]
342
+ status: S
343
+ outputFormat: F
344
+ }
345
+ }[keyof Def[S] & KnownResponseFormat]
346
+ }[keyof Def & StatusCode]
347
+
348
+ type ModRoute<R, Def extends GlobalResponseDefinition> = R extends Endpoint
349
+ ? R | ToEndpoints<Def, R>
350
+ : R
351
+
352
+ type ModSchema<D, Def extends GlobalResponseDefinition> = {
353
+ [K in keyof D]: {
354
+ [M in keyof D[K]]: ModRoute<D[K][M], Def>
355
+ }
356
+ }
357
+
358
+ export type ApplyGlobalResponse<AppType, Def extends GlobalResponseDefinition> =
359
+ AppType extends AppBase<infer E, infer _ extends Schema, infer B>
360
+ ? ModSchema<ExtractSchema<AppType>, Def> extends infer S extends Schema
361
+ ? App<E, S, B>
362
+ : never
363
+ : never
364
+
365
+ type PickRoute<R, U extends StatusCode> = R extends Endpoint
366
+ ? R extends { status: U }
367
+ ? R
368
+ : never
369
+ : R
370
+
371
+ type PickSchema<D, U extends StatusCode> = {
372
+ [K in keyof D]: {
373
+ [M in keyof D[K]]: PickRoute<D[K][M], U>
374
+ }
375
+ }
376
+
377
+ /**
378
+ * Keep only specific status code responses from all routes of an app.
379
+ * Useful when error responses are handled centrally (e.g., via custom fetch)
380
+ * and you want the client to only expose success response types.
381
+ *
382
+ * @example
383
+ * ```ts
384
+ * type AppSuccessOnly = PickResponseByStatusCode<typeof app, 200>
385
+ * const client = hc<AppSuccessOnly>('http://localhost')
386
+ * ```
387
+ */
388
+ export type PickResponseByStatusCode<AppType, U extends StatusCode> =
389
+ AppType extends AppBase<infer E, infer _ extends Schema, infer B>
390
+ ? PickSchema<ExtractSchema<AppType>, U> extends infer S extends Schema
391
+ ? App<E, S, B>
392
+ : never
393
+ : never