acrylblends 0.2.0 → 0.4.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 (335) hide show
  1. package/dist/index.d.ts +22 -16
  2. package/dist/index.js +65 -20
  3. package/dist/index.js.map +1 -1
  4. package/package.json +1 -1
  5. package/plugins/acryl-inspect/LICENSE +21 -0
  6. package/plugins/acryl-inspect/plugin.json +12 -0
  7. package/plugins/acryl-inspect/src/index.ts +3 -0
  8. package/plugins/acryl-inspect/src/report.ts +126 -0
  9. package/plugins/acryl-inspect/src/service.ts +68 -0
  10. package/plugins/acryl-inspect/tests/report.spec.ts +63 -0
  11. package/plugins/acryl-inspect/tests/service.spec.ts +121 -0
  12. package/plugins/acryl-inspect/upstream.json +18 -0
  13. package/plugins/acryl-node-server/LICENSE +47 -0
  14. package/plugins/acryl-node-server/plugin.json +13 -0
  15. package/plugins/acryl-node-server/src/adapter/conninfo.ts +23 -0
  16. package/plugins/acryl-node-server/src/adapter/early-hints.ts +55 -0
  17. package/plugins/acryl-node-server/src/adapter/error.ts +11 -0
  18. package/plugins/acryl-node-server/src/adapter/headers.ts +249 -0
  19. package/plugins/acryl-node-server/src/adapter/index.ts +6 -0
  20. package/plugins/acryl-node-server/src/adapter/listener.ts +540 -0
  21. package/plugins/acryl-node-server/src/adapter/request.ts +797 -0
  22. package/plugins/acryl-node-server/src/adapter/response.ts +186 -0
  23. package/plugins/acryl-node-server/src/adapter/serve-static.ts +238 -0
  24. package/plugins/acryl-node-server/src/adapter/server.ts +36 -0
  25. package/plugins/acryl-node-server/src/adapter/types.ts +82 -0
  26. package/plugins/acryl-node-server/src/adapter/url.ts +42 -0
  27. package/plugins/acryl-node-server/src/adapter/utils/response/constants.ts +1 -0
  28. package/plugins/acryl-node-server/src/adapter/utils/response.ts +4 -0
  29. package/plugins/acryl-node-server/src/adapter/utils/stream.ts +88 -0
  30. package/plugins/acryl-node-server/src/adapter/utils.ts +96 -0
  31. package/plugins/acryl-node-server/src/adapter/websocket-types.ts +45 -0
  32. package/plugins/acryl-node-server/src/adapter/websocket.ts +375 -0
  33. package/plugins/acryl-node-server/src/index.ts +107 -0
  34. package/plugins/acryl-node-server/tests/adapter/app.ts +76 -0
  35. package/plugins/acryl-node-server/tests/adapter/assets/.static/plain.txt +1 -0
  36. package/plugins/acryl-node-server/tests/adapter/assets/favicon.ico +0 -0
  37. package/plugins/acryl-node-server/tests/adapter/assets/secret.txt +1 -0
  38. package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +1 -0
  39. package/plugins/acryl-node-server/tests/adapter/assets/static/admin/secret.txt +1 -0
  40. package/plugins/acryl-node-server/tests/adapter/assets/static/data.json +5 -0
  41. package/plugins/acryl-node-server/tests/adapter/assets/static/extensionless +1 -0
  42. package/plugins/acryl-node-server/tests/adapter/assets/static/foo..bar.txt +0 -0
  43. package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +1 -0
  44. package/plugins/acryl-node-server/tests/adapter/assets/static/plain.txt +1 -0
  45. package/plugins/acryl-node-server/tests/adapter/assets/static-with-context-path/plain.txt +1 -0
  46. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin +1 -0
  47. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin.br +1 -0
  48. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt +1 -0
  49. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.br +1 -0
  50. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.zst +1 -0
  51. package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +34 -0
  52. package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +248 -0
  53. package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +457 -0
  54. package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-cert.pem +23 -0
  55. package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-key.pem +27 -0
  56. package/plugins/acryl-node-server/tests/adapter/headers.test.ts +252 -0
  57. package/plugins/acryl-node-server/tests/adapter/helpers/request.ts +190 -0
  58. package/plugins/acryl-node-server/tests/adapter/listener.test.ts +727 -0
  59. package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +189 -0
  60. package/plugins/acryl-node-server/tests/adapter/request.test.ts +1230 -0
  61. package/plugins/acryl-node-server/tests/adapter/response.test.ts +285 -0
  62. package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +849 -0
  63. package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +790 -0
  64. package/plugins/acryl-node-server/tests/adapter/server.test.ts +1302 -0
  65. package/plugins/acryl-node-server/tests/adapter/setup.ts +16 -0
  66. package/plugins/acryl-node-server/tests/adapter/url.test.ts +76 -0
  67. package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +23 -0
  68. package/plugins/acryl-node-server/tests/adapter/utils/stream.test.ts +75 -0
  69. package/plugins/acryl-node-server/tests/adapter/utils.test.ts +235 -0
  70. package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +260 -0
  71. package/plugins/acryl-node-server/tests/server.spec.ts +141 -0
  72. package/plugins/acryl-node-server/upstream.json +18 -0
  73. package/plugins/acryl-router/LICENSE +47 -0
  74. package/plugins/acryl-router/plugin.json +13 -0
  75. package/plugins/acryl-router/src/client.ts +2 -0
  76. package/plugins/acryl-router/src/connection.ts +42 -0
  77. package/plugins/acryl-router/src/core/app-base.ts +544 -0
  78. package/plugins/acryl-router/src/core/app.test.ts +3833 -0
  79. package/plugins/acryl-router/src/core/app.ts +34 -0
  80. package/plugins/acryl-router/src/core/client/client.test.ts +2313 -0
  81. package/plugins/acryl-router/src/core/client/client.ts +249 -0
  82. package/plugins/acryl-router/src/core/client/fetch-result-please.ts +95 -0
  83. package/plugins/acryl-router/src/core/client/index.ts +17 -0
  84. package/plugins/acryl-router/src/core/client/types.test.ts +149 -0
  85. package/plugins/acryl-router/src/core/client/types.ts +393 -0
  86. package/plugins/acryl-router/src/core/client/utils.test.ts +405 -0
  87. package/plugins/acryl-router/src/core/client/utils.ts +117 -0
  88. package/plugins/acryl-router/src/core/compose.test.ts +751 -0
  89. package/plugins/acryl-router/src/core/compose.ts +73 -0
  90. package/plugins/acryl-router/src/core/context.test.ts +629 -0
  91. package/plugins/acryl-router/src/core/context.ts +781 -0
  92. package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +344 -0
  93. package/plugins/acryl-router/src/core/helper/accepts/accepts.ts +96 -0
  94. package/plugins/acryl-router/src/core/helper/accepts/index.ts +6 -0
  95. package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +55 -0
  96. package/plugins/acryl-router/src/core/helper/adapter/index.ts +90 -0
  97. package/plugins/acryl-router/src/core/helper/conninfo/index.ts +6 -0
  98. package/plugins/acryl-router/src/core/helper/conninfo/types.ts +45 -0
  99. package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +510 -0
  100. package/plugins/acryl-router/src/core/helper/cookie/index.ts +146 -0
  101. package/plugins/acryl-router/src/core/helper/factory/index.test.ts +434 -0
  102. package/plugins/acryl-router/src/core/helper/factory/index.ts +375 -0
  103. package/plugins/acryl-router/src/core/helper/html/index.test.ts +78 -0
  104. package/plugins/acryl-router/src/core/helper/html/index.ts +57 -0
  105. package/plugins/acryl-router/src/core/helper/route/index.test.ts +259 -0
  106. package/plugins/acryl-router/src/core/helper/route/index.ts +144 -0
  107. package/plugins/acryl-router/src/core/helper/streaming/index.ts +9 -0
  108. package/plugins/acryl-router/src/core/helper/streaming/sse.ts +101 -0
  109. package/plugins/acryl-router/src/core/helper/streaming/stream.test.ts +128 -0
  110. package/plugins/acryl-router/src/core/helper/streaming/stream.ts +45 -0
  111. package/plugins/acryl-router/src/core/helper/streaming/text.test.ts +34 -0
  112. package/plugins/acryl-router/src/core/helper/streaming/text.ts +15 -0
  113. package/plugins/acryl-router/src/core/helper/streaming/utils.ts +11 -0
  114. package/plugins/acryl-router/src/core/helper/testing/index.test.ts +42 -0
  115. package/plugins/acryl-router/src/core/helper/testing/index.ts +28 -0
  116. package/plugins/acryl-router/src/core/helper/websocket/index.test.ts +124 -0
  117. package/plugins/acryl-router/src/core/helper/websocket/index.ts +140 -0
  118. package/plugins/acryl-router/src/core/http-exception.test.ts +45 -0
  119. package/plugins/acryl-router/src/core/http-exception.ts +77 -0
  120. package/plugins/acryl-router/src/core/index.ts +53 -0
  121. package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +434 -0
  122. package/plugins/acryl-router/src/core/middleware/basic-auth/index.ts +152 -0
  123. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +1018 -0
  124. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.ts +220 -0
  125. package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +273 -0
  126. package/plugins/acryl-router/src/core/middleware/body-limit/index.ts +110 -0
  127. package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +355 -0
  128. package/plugins/acryl-router/src/core/middleware/combine/index.ts +171 -0
  129. package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +535 -0
  130. package/plugins/acryl-router/src/core/middleware/compress/index.ts +142 -0
  131. package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +43 -0
  132. package/plugins/acryl-router/src/core/middleware/context-storage/index.ts +58 -0
  133. package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +532 -0
  134. package/plugins/acryl-router/src/core/middleware/cors/index.ts +163 -0
  135. package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +534 -0
  136. package/plugins/acryl-router/src/core/middleware/csrf/index.ts +150 -0
  137. package/plugins/acryl-router/src/core/middleware/etag/digest.test.ts +21 -0
  138. package/plugins/acryl-router/src/core/middleware/etag/digest.ts +95 -0
  139. package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +503 -0
  140. package/plugins/acryl-router/src/core/middleware/etag/index.ts +135 -0
  141. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +217 -0
  142. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.ts +278 -0
  143. package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +1135 -0
  144. package/plugins/acryl-router/src/core/middleware/jwk/index.ts +1 -0
  145. package/plugins/acryl-router/src/core/middleware/jwk/jwk.ts +195 -0
  146. package/plugins/acryl-router/src/core/middleware/jwk/keys.test.json +48 -0
  147. package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +802 -0
  148. package/plugins/acryl-router/src/core/middleware/jwt/index.ts +9 -0
  149. package/plugins/acryl-router/src/core/middleware/jwt/jwt.ts +189 -0
  150. package/plugins/acryl-router/src/core/middleware/language/index.test.ts +552 -0
  151. package/plugins/acryl-router/src/core/middleware/language/index.ts +12 -0
  152. package/plugins/acryl-router/src/core/middleware/language/language.ts +314 -0
  153. package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +204 -0
  154. package/plugins/acryl-router/src/core/middleware/logger/index.ts +95 -0
  155. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +292 -0
  156. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.ts +141 -0
  157. package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +221 -0
  158. package/plugins/acryl-router/src/core/middleware/method-override/index.ts +147 -0
  159. package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +37 -0
  160. package/plugins/acryl-router/src/core/middleware/powered-by/index.ts +35 -0
  161. package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +218 -0
  162. package/plugins/acryl-router/src/core/middleware/pretty-json/index.ts +67 -0
  163. package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +168 -0
  164. package/plugins/acryl-router/src/core/middleware/request-id/index.ts +7 -0
  165. package/plugins/acryl-router/src/core/middleware/request-id/request-id.ts +59 -0
  166. package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +671 -0
  167. package/plugins/acryl-router/src/core/middleware/secure-headers/index.ts +8 -0
  168. package/plugins/acryl-router/src/core/middleware/secure-headers/permissions-policy.ts +101 -0
  169. package/plugins/acryl-router/src/core/middleware/secure-headers/secure-headers.ts +340 -0
  170. package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +450 -0
  171. package/plugins/acryl-router/src/core/middleware/serve-static/index.ts +135 -0
  172. package/plugins/acryl-router/src/core/middleware/serve-static/path.test.ts +50 -0
  173. package/plugins/acryl-router/src/core/middleware/serve-static/path.ts +25 -0
  174. package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +70 -0
  175. package/plugins/acryl-router/src/core/middleware/timeout/index.ts +58 -0
  176. package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +310 -0
  177. package/plugins/acryl-router/src/core/middleware/timing/index.ts +8 -0
  178. package/plugins/acryl-router/src/core/middleware/timing/timing.ts +256 -0
  179. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +381 -0
  180. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.ts +156 -0
  181. package/plugins/acryl-router/src/core/request/constants.ts +1 -0
  182. package/plugins/acryl-router/src/core/request.test.ts +751 -0
  183. package/plugins/acryl-router/src/core/request.ts +502 -0
  184. package/plugins/acryl-router/src/core/router/common.case.test.ts +1132 -0
  185. package/plugins/acryl-router/src/core/router/linear-router/index.ts +6 -0
  186. package/plugins/acryl-router/src/core/router/linear-router/router.test.ts +80 -0
  187. package/plugins/acryl-router/src/core/router/linear-router/router.ts +152 -0
  188. package/plugins/acryl-router/src/core/router/pattern-router/index.ts +6 -0
  189. package/plugins/acryl-router/src/core/router/pattern-router/router.test.ts +46 -0
  190. package/plugins/acryl-router/src/core/router/pattern-router/router.ts +54 -0
  191. package/plugins/acryl-router/src/core/router/reg-exp-router/index.ts +7 -0
  192. package/plugins/acryl-router/src/core/router/reg-exp-router/matcher.ts +33 -0
  193. package/plugins/acryl-router/src/core/router/reg-exp-router/node.ts +170 -0
  194. package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.test.ts +154 -0
  195. package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.ts +165 -0
  196. package/plugins/acryl-router/src/core/router/reg-exp-router/router.test.ts +265 -0
  197. package/plugins/acryl-router/src/core/router/reg-exp-router/router.ts +174 -0
  198. package/plugins/acryl-router/src/core/router/reg-exp-router/trie.ts +84 -0
  199. package/plugins/acryl-router/src/core/router/smart-router/index.ts +6 -0
  200. package/plugins/acryl-router/src/core/router/smart-router/router.test.ts +13 -0
  201. package/plugins/acryl-router/src/core/router/smart-router/router.ts +70 -0
  202. package/plugins/acryl-router/src/core/router/trie-router/index.ts +6 -0
  203. package/plugins/acryl-router/src/core/router/trie-router/node.test.ts +896 -0
  204. package/plugins/acryl-router/src/core/router/trie-router/node.ts +221 -0
  205. package/plugins/acryl-router/src/core/router/trie-router/router.test.ts +8 -0
  206. package/plugins/acryl-router/src/core/router/trie-router/router.ts +18 -0
  207. package/plugins/acryl-router/src/core/router/utils.ts +1 -0
  208. package/plugins/acryl-router/src/core/router.ts +103 -0
  209. package/plugins/acryl-router/src/core/types.test.ts +4134 -0
  210. package/plugins/acryl-router/src/core/types.ts +2782 -0
  211. package/plugins/acryl-router/src/core/utils/accept.test.ts +299 -0
  212. package/plugins/acryl-router/src/core/utils/accept.ts +268 -0
  213. package/plugins/acryl-router/src/core/utils/basic-auth.test.ts +56 -0
  214. package/plugins/acryl-router/src/core/utils/basic-auth.ts +26 -0
  215. package/plugins/acryl-router/src/core/utils/body.test.ts +496 -0
  216. package/plugins/acryl-router/src/core/utils/body.ts +263 -0
  217. package/plugins/acryl-router/src/core/utils/buffer.test.ts +147 -0
  218. package/plugins/acryl-router/src/core/utils/buffer.ts +117 -0
  219. package/plugins/acryl-router/src/core/utils/color.test.ts +23 -0
  220. package/plugins/acryl-router/src/core/utils/color.ts +56 -0
  221. package/plugins/acryl-router/src/core/utils/compress.ts +10 -0
  222. package/plugins/acryl-router/src/core/utils/concurrent.test.ts +69 -0
  223. package/plugins/acryl-router/src/core/utils/concurrent.ts +55 -0
  224. package/plugins/acryl-router/src/core/utils/constants.ts +4 -0
  225. package/plugins/acryl-router/src/core/utils/cookie.test.ts +460 -0
  226. package/plugins/acryl-router/src/core/utils/cookie.ts +281 -0
  227. package/plugins/acryl-router/src/core/utils/crypto.test.ts +43 -0
  228. package/plugins/acryl-router/src/core/utils/crypto.ts +58 -0
  229. package/plugins/acryl-router/src/core/utils/encode.test.ts +61 -0
  230. package/plugins/acryl-router/src/core/utils/encode.ts +34 -0
  231. package/plugins/acryl-router/src/core/utils/filepath.test.ts +78 -0
  232. package/plugins/acryl-router/src/core/utils/filepath.ts +60 -0
  233. package/plugins/acryl-router/src/core/utils/handler.ts +15 -0
  234. package/plugins/acryl-router/src/core/utils/headers.ts +355 -0
  235. package/plugins/acryl-router/src/core/utils/html.test.ts +16 -0
  236. package/plugins/acryl-router/src/core/utils/html.ts +182 -0
  237. package/plugins/acryl-router/src/core/utils/http-status.ts +72 -0
  238. package/plugins/acryl-router/src/core/utils/ipaddr.test.ts +149 -0
  239. package/plugins/acryl-router/src/core/utils/ipaddr.ts +374 -0
  240. package/plugins/acryl-router/src/core/utils/jwt/index.ts +7 -0
  241. package/plugins/acryl-router/src/core/utils/jwt/jwa.test.ts +86 -0
  242. package/plugins/acryl-router/src/core/utils/jwt/jwa.ts +38 -0
  243. package/plugins/acryl-router/src/core/utils/jwt/jws.ts +235 -0
  244. package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +1788 -0
  245. package/plugins/acryl-router/src/core/utils/jwt/jwt.ts +292 -0
  246. package/plugins/acryl-router/src/core/utils/jwt/types.ts +157 -0
  247. package/plugins/acryl-router/src/core/utils/jwt/utf8.ts +7 -0
  248. package/plugins/acryl-router/src/core/utils/mime.test.ts +64 -0
  249. package/plugins/acryl-router/src/core/utils/mime.ts +94 -0
  250. package/plugins/acryl-router/src/core/utils/stream.test.ts +212 -0
  251. package/plugins/acryl-router/src/core/utils/stream.ts +107 -0
  252. package/plugins/acryl-router/src/core/utils/types.test.ts +295 -0
  253. package/plugins/acryl-router/src/core/utils/types.ts +123 -0
  254. package/plugins/acryl-router/src/core/utils/url.test.ts +384 -0
  255. package/plugins/acryl-router/src/core/utils/url.ts +337 -0
  256. package/plugins/acryl-router/src/core/validator/index.ts +8 -0
  257. package/plugins/acryl-router/src/core/validator/utils.test.ts +82 -0
  258. package/plugins/acryl-router/src/core/validator/utils.ts +69 -0
  259. package/plugins/acryl-router/src/core/validator/validator.test.ts +1488 -0
  260. package/plugins/acryl-router/src/core/validator/validator.ts +185 -0
  261. package/plugins/acryl-router/src/helpers/index.ts +13 -0
  262. package/plugins/acryl-router/src/helpers/schema-validator.ts +35 -0
  263. package/plugins/acryl-router/src/index.ts +6 -0
  264. package/plugins/acryl-router/src/middleware/index.ts +25 -0
  265. package/plugins/acryl-router/src/middleware/loopback-only.ts +88 -0
  266. package/plugins/acryl-router/src/service.ts +356 -0
  267. package/plugins/acryl-router/tests/docs-examples.spec.ts +152 -0
  268. package/plugins/acryl-router/tests/live-install.spec.ts +64 -0
  269. package/plugins/acryl-router/tests/loader.spec.ts +72 -0
  270. package/plugins/acryl-router/tests/service.spec.ts +409 -0
  271. package/plugins/acryl-router/tests/shadow-state.spec.ts +79 -0
  272. package/plugins/acryl-router/upstream.json +20 -0
  273. package/plugins/acryl-router-http/LICENSE +21 -0
  274. package/plugins/acryl-router-http/plugin.json +12 -0
  275. package/plugins/acryl-router-http/src/bridge.ts +54 -0
  276. package/plugins/acryl-router-http/src/index.ts +63 -0
  277. package/plugins/acryl-router-http/src/serve.ts +24 -0
  278. package/plugins/acryl-router-http/tests/adapter.spec.ts +174 -0
  279. package/plugins/acryl-router-http/tests/stream.spec.ts +133 -0
  280. package/plugins/acryl-router-http/tests/surfaces.spec.ts +101 -0
  281. package/plugins/acryl-router-http/upstream.json +22 -0
  282. package/plugins/acryl-state/LICENSE +21 -0
  283. package/plugins/acryl-state/NOTICE +30 -0
  284. package/plugins/acryl-state/plugin.json +12 -0
  285. package/plugins/acryl-state/src/cell.ts +67 -0
  286. package/plugins/acryl-state/src/index.ts +3 -0
  287. package/plugins/acryl-state/src/react.ts +11 -0
  288. package/plugins/acryl-state/src/service.ts +119 -0
  289. package/plugins/acryl-state/tests/cell.spec.ts +71 -0
  290. package/plugins/acryl-state/tests/react.spec.ts +39 -0
  291. package/plugins/acryl-state/tests/service.spec.ts +132 -0
  292. package/plugins/acryl-state/upstream.json +22 -0
  293. package/plugins/builder/script.ts +6 -10
  294. package/plugins/extensions/index.ts +20 -3
  295. package/plugins/extensions/resolve.ts +28 -3
  296. package/plugins/openai/prompt.ts +12 -6
  297. package/plugins/tasks/index.ts +14 -0
  298. package/plugins/tsconfig.json +14 -5
  299. package/templates/agent/blend.yaml +5 -7
  300. package/templates/agent/src/app.ts +8 -8
  301. package/templates/agent/src/routes.ts +39 -38
  302. package/templates/agent/template.json +3 -3
  303. package/templates/agent/test/builder.test.ts +22 -14
  304. package/templates/agent/test/model.test.ts +3 -3
  305. package/templates/agent/tsconfig.json +8 -5
  306. package/templates/{app → blank}/blend.yaml +3 -3
  307. package/templates/{app → blank}/src/app.ts +5 -5
  308. package/templates/blank/src/routes.ts +16 -0
  309. package/templates/blank/template.json +1 -0
  310. package/templates/{app → blank}/test/app.test.ts +1 -1
  311. package/templates/{app → blank}/tsconfig.json +2 -4
  312. package/templates/todo/README.md +27 -0
  313. package/templates/todo/blend.yaml +25 -0
  314. package/templates/todo/gitignore +2 -0
  315. package/templates/todo/package.json +23 -0
  316. package/templates/todo/src/app.ts +71 -0
  317. package/templates/todo/src/main.ts +19 -0
  318. package/templates/todo/src/page.ts +28 -0
  319. package/templates/todo/src/todo.ts +123 -0
  320. package/templates/todo/template.json +1 -0
  321. package/templates/todo/test/todo.test.ts +145 -0
  322. package/templates/todo/tsconfig.json +17 -0
  323. package/templates/todo/upstream.json +12 -0
  324. package/plugins/events/index.ts +0 -42
  325. package/plugins/events/plugin.json +0 -9
  326. package/plugins/http/index.ts +0 -64
  327. package/plugins/http/plugin.json +0 -10
  328. package/plugins/server/index.ts +0 -138
  329. package/plugins/server/plugin.json +0 -10
  330. package/templates/app/src/routes.ts +0 -14
  331. package/templates/app/template.json +0 -1
  332. /package/templates/{app → blank}/README.md +0 -0
  333. /package/templates/{app → blank}/gitignore +0 -0
  334. /package/templates/{app → blank}/package.json +0 -0
  335. /package/templates/{app → blank}/src/main.ts +0 -0
@@ -0,0 +1,249 @@
1
+ import type { App } from '../app.ts'
2
+ import type { FormValue, ValidationTargets } from '../types.ts'
3
+ import { serialize } from '../utils/cookie.ts'
4
+ import type { UnionToIntersection } from '../utils/types.ts'
5
+ import type { BuildSearchParamsFn, Callback, Client, ClientRequestOptions } from './types.ts'
6
+ import {
7
+ buildSearchParams,
8
+ deepMerge,
9
+ mergePath,
10
+ removeIndexString,
11
+ replaceUrlParam,
12
+ replaceUrlProtocol,
13
+ } from './utils.ts'
14
+
15
+ const createProxy = (callback: Callback, path: string[]) => {
16
+ const proxy: unknown = new Proxy(() => {}, {
17
+ get(_obj, key) {
18
+ if (typeof key !== 'string' || key === 'then') {
19
+ return undefined
20
+ }
21
+ return createProxy(callback, [...path, key])
22
+ },
23
+ apply(_1, _2, args) {
24
+ return callback({
25
+ path,
26
+ args,
27
+ })
28
+ },
29
+ })
30
+ return proxy
31
+ }
32
+
33
+ const appendQueryParams = (url: string, searchParams: URLSearchParams): string => {
34
+ const queryString = searchParams.toString()
35
+ return queryString ? `${url}?${queryString}` : url
36
+ }
37
+
38
+ class ClientRequestImpl {
39
+ private url: string
40
+ private method: string
41
+ private buildSearchParams: BuildSearchParamsFn
42
+ private queryParams: URLSearchParams | undefined = undefined
43
+ private pathParams: Record<string, string> = {}
44
+ private rBody: BodyInit | undefined
45
+ private cType: string | undefined = undefined
46
+
47
+ constructor(
48
+ url: string,
49
+ method: string,
50
+ options: {
51
+ buildSearchParams: BuildSearchParamsFn
52
+ }
53
+ ) {
54
+ this.url = url
55
+ this.method = method
56
+ this.buildSearchParams = options.buildSearchParams
57
+ }
58
+ fetch = async (
59
+ args?: ValidationTargets<FormValue> & {
60
+ param?: Record<string, string>
61
+ },
62
+ opt?: ClientRequestOptions
63
+ ) => {
64
+ if (args) {
65
+ if (args.query) {
66
+ this.queryParams = this.buildSearchParams(args.query)
67
+ }
68
+
69
+ if (args.form) {
70
+ const form = new FormData()
71
+ for (const [k, v] of Object.entries(args.form)) {
72
+ if (v === undefined) {
73
+ continue
74
+ }
75
+ if (Array.isArray(v)) {
76
+ for (const v2 of v) {
77
+ if (v2 === undefined) {
78
+ continue
79
+ }
80
+ form.append(k, v2)
81
+ }
82
+ } else {
83
+ form.append(k, v)
84
+ }
85
+ }
86
+ this.rBody = form
87
+ }
88
+
89
+ if (args.json !== undefined) {
90
+ this.rBody = JSON.stringify(args.json)
91
+ this.cType = 'application/json'
92
+ }
93
+
94
+ if (args.param) {
95
+ this.pathParams = args.param
96
+ }
97
+ }
98
+
99
+ let methodUpperCase = this.method.toUpperCase()
100
+
101
+ const headerValues: Record<string, string | undefined> = {
102
+ ...args?.header,
103
+ ...(typeof opt?.headers === 'function' ? await opt.headers() : opt?.headers),
104
+ }
105
+
106
+ if (args?.cookie) {
107
+ const cookies: string[] = []
108
+ for (const [key, value] of Object.entries(args.cookie)) {
109
+ if (value === undefined) {
110
+ continue
111
+ }
112
+ cookies.push(serialize(key, value))
113
+ }
114
+ if (cookies.length > 0) {
115
+ headerValues['Cookie'] = cookies.join('; ')
116
+ }
117
+ }
118
+
119
+ if (this.cType) {
120
+ headerValues['Content-Type'] = this.cType
121
+ }
122
+
123
+ const headers = new Headers()
124
+ for (const [key, value] of Object.entries(headerValues)) {
125
+ if (value !== undefined) {
126
+ headers.set(key, value)
127
+ }
128
+ }
129
+ let url = this.url
130
+
131
+ url = removeIndexString(url)
132
+ url = replaceUrlParam(url, this.pathParams)
133
+
134
+ if (this.queryParams) {
135
+ url = appendQueryParams(url, this.queryParams)
136
+ }
137
+ methodUpperCase = this.method.toUpperCase()
138
+ const setBody = !(methodUpperCase === 'GET' || methodUpperCase === 'HEAD')
139
+
140
+ // Pass URL string to 1st arg for testing with MSW and node-fetch
141
+ return (opt?.fetch || fetch)(url, {
142
+ body: setBody ? this.rBody : undefined,
143
+ method: methodUpperCase,
144
+ headers: headers,
145
+ ...opt?.init,
146
+ })
147
+ }
148
+ }
149
+
150
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
151
+ export const hc = <T extends App<any, any, any>, Prefix extends string = string>(
152
+ baseUrl: Prefix,
153
+ options?: ClientRequestOptions
154
+ ) =>
155
+ createProxy(function proxyCallback(opts) {
156
+ const buildSearchParamsOption = options?.buildSearchParams ?? buildSearchParams
157
+ const parts = [...opts.path]
158
+ const lastParts = parts.slice(-3).reverse()
159
+
160
+ // allow calling .toString() and .valueOf() on the proxy
161
+ if (lastParts[0] === 'toString') {
162
+ if (lastParts[1] === 'name') {
163
+ // e.g. hc().somePath.name.toString() -> "somePath"
164
+ return lastParts[2] || ''
165
+ }
166
+ // e.g. hc().somePath.toString()
167
+ return proxyCallback.toString()
168
+ }
169
+
170
+ if (lastParts[0] === 'valueOf') {
171
+ if (lastParts[1] === 'name') {
172
+ // e.g. hc().somePath.name.valueOf() -> "somePath"
173
+ return lastParts[2] || ''
174
+ }
175
+ // e.g. hc().somePath.valueOf()
176
+ return proxyCallback
177
+ }
178
+
179
+ let method = ''
180
+ if (/^\$/.test(lastParts[0] as string)) {
181
+ const last = parts.pop()
182
+ if (last) {
183
+ method = last.replace(/^\$/, '')
184
+ }
185
+ }
186
+
187
+ const path = parts.join('/')
188
+ const url = mergePath(baseUrl, path)
189
+ if (method === 'url' || method === 'path') {
190
+ // Strip the synthetic `index` segment before substituting params, so that a param
191
+ // whose value is `index` is not mistaken for one.
192
+ let result = removeIndexString(url)
193
+ if (opts.args[0]) {
194
+ if (opts.args[0].param) {
195
+ result = replaceUrlParam(result, opts.args[0].param)
196
+ }
197
+ if (opts.args[0].query) {
198
+ result = appendQueryParams(result, buildSearchParamsOption(opts.args[0].query))
199
+ }
200
+ }
201
+ if (method === 'url') {
202
+ return new URL(result)
203
+ }
204
+ return result.slice(baseUrl.replace(/\/+$/, '').length).replace(/^\/?/, '/')
205
+ }
206
+ if (method === 'ws') {
207
+ const normalizedUrl = removeIndexString(url)
208
+ const webSocketUrl = replaceUrlProtocol(
209
+ opts.args[0]?.param ? replaceUrlParam(normalizedUrl, opts.args[0].param) : normalizedUrl,
210
+ 'ws'
211
+ )
212
+ const targetUrl = new URL(webSocketUrl)
213
+
214
+ const queryParams: Record<string, string | string[]> | undefined = opts.args[0]?.query
215
+ if (queryParams) {
216
+ const searchParams = buildSearchParamsOption(queryParams)
217
+ searchParams.forEach((value, key) => {
218
+ targetUrl.searchParams.append(key, value)
219
+ })
220
+ }
221
+ const establishWebSocket = (...args: ConstructorParameters<typeof WebSocket>) => {
222
+ if (options?.webSocket !== undefined && typeof options.webSocket === 'function') {
223
+ return options.webSocket(...args)
224
+ }
225
+ return new WebSocket(...args)
226
+ }
227
+
228
+ return establishWebSocket(targetUrl.toString())
229
+ }
230
+
231
+ const req = new ClientRequestImpl(url, method, {
232
+ buildSearchParams: buildSearchParamsOption,
233
+ })
234
+ if (method) {
235
+ options ??= {}
236
+ const reqOptions: ClientRequestOptions = { ...opts.args[1] }
237
+ const baseHeaders = options.headers
238
+ const reqHeaders = reqOptions.headers
239
+ if (baseHeaders && reqHeaders) {
240
+ reqOptions.headers = async () => ({
241
+ ...(typeof baseHeaders === 'function' ? await baseHeaders() : baseHeaders),
242
+ ...(typeof reqHeaders === 'function' ? await reqHeaders() : reqHeaders),
243
+ })
244
+ }
245
+ const args = deepMerge<ClientRequestOptions>(options, reqOptions)
246
+ return req.fetch(opts.args[0], args)
247
+ }
248
+ return req
249
+ }, []) as UnionToIntersection<Client<T, Prefix>>
@@ -0,0 +1,95 @@
1
+ /**
2
+ * @description This file is a modified version of `fetch-result-please` (`ofetch`), minimalized and adapted to App's custom needs.
3
+ *
4
+ * @link https://www.npmjs.com/package/fetch-result-please
5
+ */
6
+
7
+ const nullBodyResponses = new Set([101, 204, 205, 304])
8
+
9
+ /**
10
+ * Smartly parses and return the consumable result from a fetch `Response`.
11
+ *
12
+ * Throwing a structured error if the response is not `ok`. ({@link DetailedError})
13
+ */
14
+ export async function fetchRP(fetchRes: Response | Promise<Response>): Promise<any> {
15
+ const _fetchRes = (await fetchRes) as unknown as Response & {
16
+ _data: any
17
+ /**
18
+ * @description BodyInit property from whatwg-fetch polyfill
19
+ *
20
+ * @link https://github.com/JakeChampion/fetch/blob/main/fetch.js#L238
21
+ */
22
+ _bodyInit?: any
23
+ }
24
+
25
+ const hasBody =
26
+ (_fetchRes.body || _fetchRes._bodyInit) && !nullBodyResponses.has(_fetchRes.status)
27
+
28
+ if (hasBody) {
29
+ const responseType = detectResponseType(_fetchRes)
30
+ _fetchRes._data = await _fetchRes[responseType]()
31
+ }
32
+
33
+ if (!_fetchRes.ok) {
34
+ throw new DetailedError(`${_fetchRes.status} ${_fetchRes.statusText}`, {
35
+ statusCode: _fetchRes?.status,
36
+ detail: {
37
+ data: _fetchRes?._data,
38
+ statusText: _fetchRes?.statusText,
39
+ },
40
+ })
41
+ }
42
+
43
+ return _fetchRes._data
44
+ }
45
+
46
+ export class DetailedError extends Error {
47
+ /**
48
+ * Additional `message` that will be logged AND returned to client
49
+ */
50
+ public detail?: any
51
+ /**
52
+ * Additional `code` that will be logged AND returned to client
53
+ */
54
+ public code?: any
55
+ /**
56
+ * Additional value that will be logged AND NOT returned to client
57
+ */
58
+ public log?: any
59
+ /**
60
+ * Optionally set the status code to return, in a web server context
61
+ */
62
+ public statusCode?: any
63
+
64
+ constructor(
65
+ message: string,
66
+ options: { detail?: any; code?: any; statusCode?: number; log?: any } = {}
67
+ ) {
68
+ super(message)
69
+ this.name = 'DetailedError'
70
+ this.log = options.log
71
+ this.detail = options.detail
72
+ this.code = options.code
73
+ this.statusCode = options.statusCode
74
+ }
75
+ }
76
+
77
+ // This is used to match the content-type header for 'json'
78
+ const jsonRegex = /^application\/(?:[\w!#$%&*.^`~-]*\+)?json(?:;.+)?$/i
79
+
80
+ function detectResponseType(response: Response): 'json' | 'text' {
81
+ const _contentType = response.headers.get('content-type')
82
+
83
+ if (!_contentType) {
84
+ return 'text'
85
+ }
86
+
87
+ // `_contentType` might look like: `application/json; charset=utf-8`, `text/plain`, so we get the first part before `;`
88
+ const contentType = _contentType.split(';').shift()!
89
+
90
+ if (jsonRegex.test(contentType)) {
91
+ return 'json'
92
+ }
93
+
94
+ return 'text'
95
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @module
3
+ * The HTTP Client for App.
4
+ */
5
+
6
+ export { hc } from './client.ts'
7
+ export { parseResponse, DetailedError } from './utils.ts'
8
+ export type {
9
+ InferResponseType,
10
+ InferRequestType,
11
+ Fetch,
12
+ ClientRequestOptions,
13
+ ClientRequest,
14
+ ClientResponse,
15
+ ApplyGlobalResponse,
16
+ PickResponseByStatusCode,
17
+ } from './types.ts'
@@ -0,0 +1,149 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import { expectTypeOf } from 'vitest'
3
+ import { hc } from './index.ts'
4
+ import { App } from '../index.ts'
5
+ import { defineWebSocketHelper } from '../helper/websocket/index.ts'
6
+ import type { TypedURL } from './types.ts'
7
+
8
+ // The Deno adapter is not part of ACRYL; these tests only build client URLs, so a helper that never upgrades stands in for it.
9
+ const upgradeWebSocket = defineWebSocketHelper(async () => {})
10
+
11
+ describe('WebSockets', () => {
12
+ const app = new App()
13
+ .get(
14
+ '/ws',
15
+ upgradeWebSocket(() => ({}))
16
+ )
17
+ .get('/', (c) => c.json({}))
18
+ const client = hc<typeof app>('/')
19
+
20
+ it('WebSocket route', () => {
21
+ expectTypeOf(client.ws).toMatchTypeOf<{
22
+ $ws: () => WebSocket
23
+ }>()
24
+ })
25
+ it('Not WebSocket Route', () => {
26
+ expectTypeOf<
27
+ typeof client.index extends { $ws: () => WebSocket } ? false : true
28
+ >().toEqualTypeOf(true)
29
+ })
30
+ })
31
+
32
+ describe('without the leading slash', () => {
33
+ const app = new App()
34
+ .get('foo', (c) => c.json({}))
35
+ .get('foo/bar', (c) => c.json({}))
36
+ .get('foo/:id/baz', (c) => c.json({}))
37
+ const client = hc<typeof app, 'http://localhost'>('http://localhost')
38
+ it('`foo` should have `$get`', () => {
39
+ expectTypeOf(client.foo).toHaveProperty('$get')
40
+ expectTypeOf(client.foo.$url()).toEqualTypeOf<TypedURL<'http:', 'localhost', '', '/foo', ''>>()
41
+ expectTypeOf(client.foo.$path()).toEqualTypeOf<'/foo'>()
42
+ })
43
+ it('`foo.bar` should not have `$get`', () => {
44
+ expectTypeOf(client.foo.bar).toHaveProperty('$get')
45
+ expectTypeOf(client.foo.bar.$url()).toEqualTypeOf<
46
+ TypedURL<'http:', 'localhost', '', '/foo/bar', ''>
47
+ >()
48
+ expectTypeOf(client.foo.bar.$path()).toEqualTypeOf<'/foo/bar'>()
49
+ })
50
+ it('`foo[":id"].baz` should have `$get`', () => {
51
+ expectTypeOf(client.foo[':id'].baz).toHaveProperty('$get')
52
+ expectTypeOf(client.foo[':id'].baz.$url()).toEqualTypeOf<
53
+ TypedURL<'http:', 'localhost', '', '/foo/:id/baz', ''>
54
+ >()
55
+ expectTypeOf(
56
+ client.foo[':id'].baz.$url({
57
+ param: { id: '123' },
58
+ })
59
+ ).toEqualTypeOf<TypedURL<'http:', 'localhost', '', '/foo/123/baz', ''>>()
60
+ expectTypeOf(
61
+ client.foo[':id'].baz.$url({
62
+ param: { id: '123' },
63
+ query: { q: 'acryl' },
64
+ })
65
+ ).toEqualTypeOf<TypedURL<'http:', 'localhost', '', '/foo/123/baz', `?${string}`>>()
66
+
67
+ expectTypeOf(client.foo[':id'].baz.$path()).toEqualTypeOf<'/foo/:id/baz'>()
68
+ expectTypeOf(
69
+ client.foo[':id'].baz.$path({
70
+ param: { id: '123' },
71
+ })
72
+ ).toEqualTypeOf<'/foo/123/baz'>()
73
+ expectTypeOf(
74
+ client.foo[':id'].baz.$path({
75
+ param: { id: '123' },
76
+ query: { q: 'acryl' },
77
+ })
78
+ ).toEqualTypeOf<`/foo/123/baz?${string}`>()
79
+ })
80
+ })
81
+
82
+ describe('with the leading slash', () => {
83
+ const app = new App()
84
+ .get('/foo', (c) => c.json({}))
85
+ .get('/foo/bar', (c) => c.json({}))
86
+ .get('/foo/:id/baz', (c) => c.json({}))
87
+ const client = hc<typeof app>('')
88
+ it('`foo` should have `$get`', () => {
89
+ expectTypeOf(client.foo).toHaveProperty('$get')
90
+ })
91
+ it('`foo.bar` should not have `$get`', () => {
92
+ expectTypeOf(client.foo.bar).toHaveProperty('$get')
93
+ })
94
+ it('`foo[":id"].baz` should have `$get`', () => {
95
+ expectTypeOf(client.foo[':id'].baz).toHaveProperty('$get')
96
+ })
97
+ })
98
+
99
+ describe('app.all()', () => {
100
+ const app = new App()
101
+ .all('/all-route', (c) => c.json({ msg: 'all methods' }))
102
+ .get('/get-route', (c) => c.json({ msg: 'get only' }))
103
+ const client = hc<typeof app>('http://localhost', { fetch: app.request })
104
+
105
+ it('should NOT expose $all on the client', () => {
106
+ expectTypeOf<
107
+ (typeof client)['all-route'] extends { $all: unknown } ? true : false
108
+ >().toEqualTypeOf<false>()
109
+ })
110
+
111
+ it('should still expose valid HTTP methods like $get', () => {
112
+ expectTypeOf(client['get-route']).toHaveProperty('$get')
113
+ })
114
+
115
+ it('should expose all standard HTTP methods for routes defined with app.all()', () => {
116
+ // $all routes should have all standard HTTP methods typed
117
+ expectTypeOf(client['all-route']).toHaveProperty('$get')
118
+ expectTypeOf(client['all-route']).toHaveProperty('$post')
119
+ expectTypeOf(client['all-route']).toHaveProperty('$put')
120
+ expectTypeOf(client['all-route']).toHaveProperty('$delete')
121
+ expectTypeOf(client['all-route']).toHaveProperty('$options')
122
+ expectTypeOf(client['all-route']).toHaveProperty('$patch')
123
+ expectTypeOf(client['all-route']).toHaveProperty('$query')
124
+ })
125
+
126
+ it('should have correct return type for expanded methods', async () => {
127
+ // The response type should match the original handler's return type
128
+ const res = await client['all-route'].$get()
129
+ expectTypeOf(res.json()).resolves.toEqualTypeOf<{ msg: string }>()
130
+ })
131
+ })
132
+
133
+ describe('with base URL pathname', () => {
134
+ const app = new App()
135
+ .get('foo', (c) => c.json({}))
136
+ .get('foo/bar', (c) => c.json({}))
137
+ .get('foo/:id/baz', (c) => c.json({}))
138
+ const client = hc<typeof app, 'http://localhost/api'>('http://localhost/api')
139
+ it('$path', () => {
140
+ expectTypeOf(client.foo.$path()).toEqualTypeOf<'/foo'>()
141
+ expectTypeOf(client.foo.bar.$path()).toEqualTypeOf<'/foo/bar'>()
142
+ expectTypeOf(
143
+ client.foo[':id'].baz.$path({
144
+ param: { id: '123' },
145
+ query: { q: 'acryl' },
146
+ })
147
+ ).toEqualTypeOf<`/foo/123/baz?${string}`>()
148
+ })
149
+ })