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,544 @@
1
+ /**
2
+ * @module
3
+ * This module is the base module for the App object.
4
+ */
5
+
6
+ /* eslint-disable @typescript-eslint/no-explicit-any */
7
+ import { compose } from './compose.ts'
8
+ import { Context } from './context.ts'
9
+ import type { ExecutionContext } from './context.ts'
10
+ import type { Router } from './router.ts'
11
+ import { METHODS, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE } from './router.ts'
12
+ import type {
13
+ Env,
14
+ ErrorHandler,
15
+ FetchEventLike,
16
+ H,
17
+ HandlerInterface,
18
+ MergePath,
19
+ MergeSchemaPath,
20
+ MiddlewareHandler,
21
+ MiddlewareHandlerInterface,
22
+ Next,
23
+ NotFoundHandler,
24
+ OnHandlerInterface,
25
+ RouterRoute,
26
+ Schema,
27
+ } from './types.ts'
28
+ import { COMPOSED_HANDLER } from './utils/constants.ts'
29
+ import { getPath, getPathNoStrict, mergePath } from './utils/url.ts'
30
+
31
+ const notFoundHandler: NotFoundHandler = (c) => {
32
+ return c.text('404 Not Found', 404)
33
+ }
34
+
35
+ const errorHandler: ErrorHandler = (err, c) => {
36
+ if ('getResponse' in err) {
37
+ const res = err.getResponse()
38
+ return c.newResponse(res.body, res)
39
+ }
40
+ console.error(err)
41
+ return c.text('Internal Server Error', 500)
42
+ }
43
+
44
+ type GetPath<E extends Env> = (request: Request, options?: { env?: E['Bindings'] }) => string
45
+
46
+ export type AppOptions<E extends Env> = {
47
+ /**
48
+ * `router` option specifies which router to use.
49
+ *
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * const app = new App({ router: new RegExpRouter() })
54
+ * ```
55
+ */
56
+ router?: Router<[H, RouterRoute]>
57
+ } & (
58
+ | {
59
+ /**
60
+ * `strict` option specifies whether to distinguish whether the last path is a directory or not.
61
+ *
62
+ *
63
+ * @default true
64
+ */
65
+ strict?: true
66
+ /**
67
+ * `getPath` can handle the host header value.
68
+ *
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * const app = new App({
73
+ * getPath: (req) =>
74
+ * '/' + req.headers.get('host') + req.url.replace(/^https?:\/\/[^/]+(\/[^?]*)/, '$1'),
75
+ * })
76
+ *
77
+ * app.get('/www1.example.com/hello', () => c.text('hello www1'))
78
+ *
79
+ * // A following request will match the route:
80
+ * // new Request('http://www1.example.com/hello', {
81
+ * // headers: { host: 'www1.example.com' },
82
+ * // })
83
+ * ```
84
+ */
85
+ getPath?: GetPath<E>
86
+ }
87
+ | {
88
+ /**
89
+ * `strict` option specifies whether to distinguish whether the last path is a directory or not.
90
+ * When `strict` is `false`, `getPath` is not used.
91
+ *
92
+ *
93
+ * @default true
94
+ */
95
+ strict: false
96
+ getPath?: never
97
+ }
98
+ )
99
+
100
+ type MountOptionHandler = (c: Context) => unknown
101
+ type MountReplaceRequest = (originalRequest: Request) => Request
102
+ type MountOptions =
103
+ | MountOptionHandler
104
+ | {
105
+ optionHandler?: MountOptionHandler
106
+ replaceRequest?: MountReplaceRequest | false
107
+ }
108
+
109
+ class App<
110
+ E extends Env = Env,
111
+ S extends Schema = {},
112
+ BasePath extends string = '/',
113
+ CurrentPath extends string = BasePath,
114
+ > {
115
+ get!: HandlerInterface<E, 'get', S, BasePath, CurrentPath>
116
+ post!: HandlerInterface<E, 'post', S, BasePath, CurrentPath>
117
+ put!: HandlerInterface<E, 'put', S, BasePath, CurrentPath>
118
+ delete!: HandlerInterface<E, 'delete', S, BasePath, CurrentPath>
119
+ options!: HandlerInterface<E, 'options', S, BasePath, CurrentPath>
120
+ patch!: HandlerInterface<E, 'patch', S, BasePath, CurrentPath>
121
+ query!: HandlerInterface<E, 'query', S, BasePath, CurrentPath>
122
+ all!: HandlerInterface<E, 'all', S, BasePath, CurrentPath>
123
+ on: OnHandlerInterface<E, S, BasePath>
124
+ use: MiddlewareHandlerInterface<E, S, BasePath>
125
+
126
+ /*
127
+ This class is like an abstract class and does not have a router.
128
+ To use it, inherit the class and implement router in the constructor.
129
+ */
130
+ router!: Router<[H, RouterRoute]>
131
+ readonly getPath: GetPath<E>
132
+ // Cannot use `#` because it requires visibility at JavaScript runtime.
133
+ private _basePath: string = '/'
134
+ #path: string = '/'
135
+
136
+ routes: RouterRoute[] = []
137
+
138
+ constructor(options: AppOptions<E> = {}) {
139
+ // Implementation of app.get(...handlers[]) or app.get(path, ...handlers[])
140
+ const allMethods = [...METHODS, METHOD_NAME_ALL_LOWERCASE]
141
+ allMethods.forEach((method) => {
142
+ this[method] = (args1: string | H, ...args: H[]) => {
143
+ const methodName = method.toUpperCase()
144
+ if (typeof args1 === 'string') {
145
+ this.#path = args1
146
+ } else {
147
+ this.#addRoute(methodName, this.#path, args1)
148
+ }
149
+ args.forEach((handler) => {
150
+ this.#addRoute(methodName, this.#path, handler)
151
+ })
152
+ return this as any
153
+ }
154
+ })
155
+
156
+ // Implementation of app.on(method, path, ...handlers[])
157
+ this.on = (method: string | string[], path: string | string[], ...handlers: H[]) => {
158
+ for (const p of [path].flat()) {
159
+ this.#path = p
160
+ for (const m of [method].flat()) {
161
+ const methodName = m.toUpperCase()
162
+ for (const handler of handlers) {
163
+ this.#addRoute(methodName, this.#path, handler)
164
+ }
165
+ }
166
+ }
167
+ return this as any
168
+ }
169
+
170
+ // Implementation of app.use(...handlers[]) or app.use(path, ...handlers[])
171
+ this.use = (arg1: string | MiddlewareHandler<any>, ...handlers: MiddlewareHandler<any>[]) => {
172
+ if (typeof arg1 === 'string') {
173
+ this.#path = arg1
174
+ } else {
175
+ this.#path = '*'
176
+ handlers.unshift(arg1)
177
+ }
178
+ handlers.forEach((handler) => {
179
+ this.#addRoute(METHOD_NAME_ALL, this.#path, handler)
180
+ })
181
+ return this as any
182
+ }
183
+
184
+ const { strict, ...optionsWithoutStrict } = options
185
+ Object.assign(this, optionsWithoutStrict)
186
+ this.getPath = (strict ?? true) ? (options.getPath ?? getPath) : getPathNoStrict
187
+ }
188
+
189
+ #clone(): App<E, S, BasePath, CurrentPath> {
190
+ const clone = new App<E, S, BasePath, CurrentPath>({
191
+ router: this.router,
192
+ getPath: this.getPath,
193
+ })
194
+ clone.errorHandler = this.errorHandler
195
+ clone.#notFoundHandler = this.#notFoundHandler
196
+ clone.routes = this.routes
197
+ return clone
198
+ }
199
+
200
+ #notFoundHandler: NotFoundHandler = notFoundHandler
201
+ // Cannot use `#` because it requires visibility at JavaScript runtime.
202
+ private errorHandler: ErrorHandler = errorHandler
203
+
204
+ /**
205
+ * `.route()` allows grouping other App instance in routes.
206
+ *
207
+ *
208
+ * @param {string} path - base Path
209
+ * @param {App} app - other App instance
210
+ * @returns {App} routed App instance
211
+ *
212
+ * @example
213
+ * ```ts
214
+ * const app = new App()
215
+ * const app2 = new App()
216
+ *
217
+ * app2.get("/user", (c) => c.text("user"))
218
+ * app.route("/api", app2) // GET /api/user
219
+ * ```
220
+ */
221
+ route<
222
+ SubPath extends string,
223
+ SubEnv extends Env,
224
+ SubSchema extends Schema,
225
+ SubBasePath extends string,
226
+ SubCurrentPath extends string,
227
+ >(
228
+ path: SubPath,
229
+ app: App<SubEnv, SubSchema, SubBasePath, SubCurrentPath>
230
+ ): App<E, MergeSchemaPath<SubSchema, MergePath<BasePath, SubPath>> | S, BasePath, CurrentPath> {
231
+ const subApp = this.basePath(path)
232
+ app.routes.map((r) => {
233
+ let handler
234
+ if (app.errorHandler === errorHandler) {
235
+ handler = r.handler
236
+ } else {
237
+ handler = async (c: Context, next: Next) =>
238
+ (await compose([], app.errorHandler)(c, () => r.handler(c, next))).res
239
+ ;(handler as any)[COMPOSED_HANDLER] = r.handler
240
+ }
241
+
242
+ subApp.#addRoute(r.method, r.path, handler, r.basePath)
243
+ })
244
+ return this
245
+ }
246
+
247
+ /**
248
+ * `.basePath()` allows base paths to be specified.
249
+ *
250
+ *
251
+ * @param {string} path - base Path
252
+ * @returns {App} changed App instance
253
+ *
254
+ * @example
255
+ * ```ts
256
+ * const api = new App().basePath('/api')
257
+ * ```
258
+ */
259
+ basePath<SubPath extends string>(
260
+ path: SubPath
261
+ ): App<E, S, MergePath<BasePath, SubPath>, MergePath<BasePath, SubPath>> {
262
+ const subApp = this.#clone()
263
+ subApp._basePath = mergePath(this._basePath, path)
264
+ return subApp
265
+ }
266
+
267
+ /**
268
+ * `.onError()` handles an error and returns a customized Response.
269
+ *
270
+ *
271
+ * @param {ErrorHandler} handler - request Handler for error
272
+ * @returns {App} changed App instance
273
+ *
274
+ * @example
275
+ * ```ts
276
+ * app.onError((err, c) => {
277
+ * console.error(`${err}`)
278
+ * return c.text('Custom Error Message', 500)
279
+ * })
280
+ * ```
281
+ */
282
+ onError = (handler: ErrorHandler<E>): App<E, S, BasePath, CurrentPath> => {
283
+ this.errorHandler = handler
284
+ return this
285
+ }
286
+
287
+ /**
288
+ * `.notFound()` allows you to customize a Not Found Response.
289
+ *
290
+ *
291
+ * @param {NotFoundHandler} handler - request handler for not-found
292
+ * @returns {App} changed App instance
293
+ *
294
+ * @example
295
+ * ```ts
296
+ * app.notFound((c) => {
297
+ * return c.text('Custom 404 Message', 404)
298
+ * })
299
+ * ```
300
+ */
301
+ notFound = (handler: NotFoundHandler<E>): App<E, S, BasePath, CurrentPath> => {
302
+ this.#notFoundHandler = handler
303
+ return this
304
+ }
305
+
306
+ /**
307
+ * `.mount()` allows you to mount applications built with other frameworks into your App application.
308
+ *
309
+ * @deprecated Use `mount()` from `acryl-router/mount` instead. `.mount()` will be removed in v5.
310
+ *
311
+ *
312
+ * @param {string} path - base Path
313
+ * @param {Function} applicationHandler - other Request Handler
314
+ * @param {MountOptions} [options] - options of `.mount()`
315
+ * @returns {App} mounted App instance
316
+ *
317
+ * @example
318
+ * ```ts
319
+ * import { Router as IttyRouter } from 'itty-router'
320
+ * import { App } from 'acryl-router'
321
+ * // Create itty-router application
322
+ * const ittyRouter = IttyRouter()
323
+ * // GET /itty-router/hello
324
+ * ittyRouter.get('/hello', () => new Response('Hello from itty-router'))
325
+ *
326
+ * const app = new App()
327
+ * app.mount('/itty-router', ittyRouter.handle)
328
+ * ```
329
+ *
330
+ * @example
331
+ * ```ts
332
+ * const app = new App()
333
+ * // Send the request to another application without modification.
334
+ * app.mount('/app', anotherApp, {
335
+ * replaceRequest: (req) => req,
336
+ * })
337
+ * ```
338
+ */
339
+ mount(
340
+ path: string,
341
+ applicationHandler: (request: Request, ...args: any) => Response | Promise<Response>,
342
+ options?: MountOptions
343
+ ): App<E, S, BasePath, CurrentPath> {
344
+ // handle options
345
+ let replaceRequest: MountReplaceRequest | undefined
346
+ let optionHandler: MountOptionHandler | undefined
347
+ if (options) {
348
+ if (typeof options === 'function') {
349
+ optionHandler = options
350
+ } else {
351
+ optionHandler = options.optionHandler
352
+ if (options.replaceRequest === false) {
353
+ replaceRequest = (request) => request
354
+ } else {
355
+ replaceRequest = options.replaceRequest
356
+ }
357
+ }
358
+ }
359
+
360
+ // prepare handlers for request
361
+ const getOptions: (c: Context) => unknown[] = optionHandler
362
+ ? (c) => {
363
+ const options = optionHandler!(c)
364
+ return Array.isArray(options) ? options : [options]
365
+ }
366
+ : (c) => {
367
+ let executionContext: ExecutionContext | undefined = undefined
368
+ try {
369
+ executionContext = c.executionCtx
370
+ } catch {} // Do nothing
371
+ return [c.env, executionContext]
372
+ }
373
+ replaceRequest ||= (() => {
374
+ const mergedPath = mergePath(this._basePath, path)
375
+ const pathPrefixLength = mergedPath === '/' ? 0 : mergedPath.length
376
+ return (request) => {
377
+ const url = new URL(request.url)
378
+ url.pathname = this.getPath(request).slice(pathPrefixLength) || '/'
379
+ return new Request(url, request)
380
+ }
381
+ })()
382
+
383
+ const handler: MiddlewareHandler = async (c, next) => {
384
+ const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c))
385
+
386
+ if (res) {
387
+ return res
388
+ }
389
+
390
+ await next()
391
+ }
392
+ this.#addRoute(METHOD_NAME_ALL, mergePath(path, '*'), handler)
393
+ return this
394
+ }
395
+
396
+ #addRoute(method: string, path: string, handler: H, baseRoutePath?: string): void {
397
+ path = mergePath(this._basePath, path)
398
+ const r: RouterRoute = {
399
+ basePath:
400
+ baseRoutePath !== undefined ? mergePath(this._basePath, baseRoutePath) : this._basePath,
401
+ path,
402
+ method,
403
+ handler,
404
+ }
405
+ this.router.add(method, path, [handler, r])
406
+ this.routes.push(r)
407
+ }
408
+
409
+ #handleError(err: unknown, c: Context<E>): Response | Promise<Response> {
410
+ if (err instanceof Error) {
411
+ return this.errorHandler(err, c)
412
+ }
413
+ throw err
414
+ }
415
+
416
+ #dispatch(
417
+ request: Request,
418
+ executionCtx: ExecutionContext | FetchEventLike | undefined,
419
+ env: E['Bindings'],
420
+ method: string
421
+ ): Response | Promise<Response> {
422
+ // Handle HEAD method
423
+ if (method === 'HEAD') {
424
+ return (async () =>
425
+ new Response(null, await this.#dispatch(request, executionCtx, env, 'GET')))()
426
+ }
427
+
428
+ const path = this.getPath(request, { env })
429
+ const matchResult = this.router.match(method, path)
430
+
431
+ const c = new Context(request, {
432
+ path,
433
+ matchResult,
434
+ env,
435
+ executionCtx,
436
+ notFoundHandler: this.#notFoundHandler,
437
+ })
438
+
439
+ // Do not `compose` if it has only one handler
440
+ if (matchResult[0].length === 1) {
441
+ let res: ReturnType<H>
442
+ try {
443
+ res = matchResult[0][0][0][0](c, async () => {
444
+ c.res = await this.#notFoundHandler(c)
445
+ })
446
+ } catch (err) {
447
+ return this.#handleError(err, c)
448
+ }
449
+
450
+ return res instanceof Promise
451
+ ? res
452
+ .then(
453
+ (resolved: Response | undefined) =>
454
+ resolved || (c.finalized ? c.res : this.#notFoundHandler(c))
455
+ )
456
+ .catch((err: Error) => this.#handleError(err, c))
457
+ : (res ?? this.#notFoundHandler(c))
458
+ }
459
+
460
+ const composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler)
461
+
462
+ return (async () => {
463
+ try {
464
+ const context = await composed(c)
465
+ if (!context.finalized) {
466
+ throw new Error(
467
+ 'Context is not finalized. Did you forget to return a Response object or `await next()`?'
468
+ )
469
+ }
470
+
471
+ return context.res
472
+ } catch (err) {
473
+ return this.#handleError(err, c)
474
+ }
475
+ })()
476
+ }
477
+
478
+ /**
479
+ * `.fetch()` will be entry point of your app.
480
+ *
481
+ *
482
+ * @param {Request} request - request Object of request
483
+ * @param {Env} env - env Object
484
+ * @param {ExecutionContext} executionCtx - context of execution
485
+ * @returns {Response | Promise<Response>} response of request
486
+ *
487
+ */
488
+ fetch: (
489
+ request: Request,
490
+ env?: E['Bindings'] | {},
491
+ executionCtx?: ExecutionContext
492
+ ) => Response | Promise<Response> = (request, ...rest) => {
493
+ return this.#dispatch(request, rest[1], rest[0], request.method)
494
+ }
495
+
496
+ /**
497
+ * `.request()` is a useful method for testing.
498
+ * You can pass a URL or pathname to send a GET request.
499
+ * app will return a Response object.
500
+ * ```ts
501
+ * test('GET /hello is ok', async () => {
502
+ * const res = await app.request('/hello')
503
+ * expect(res.status).toBe(200)
504
+ * })
505
+ * ```
506
+ */
507
+ request = (
508
+ input: Request | string | URL,
509
+ requestInit?: RequestInit,
510
+ Env?: E['Bindings'] | {},
511
+ executionCtx?: ExecutionContext
512
+ ): Response | Promise<Response> => {
513
+ if (input instanceof Request) {
514
+ return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx)
515
+ }
516
+ input = input.toString()
517
+ return this.fetch(
518
+ new Request(
519
+ /^https?:\/\//.test(input) ? input : `http://localhost${mergePath('/', input)}`,
520
+ requestInit
521
+ ),
522
+ Env,
523
+ executionCtx
524
+ )
525
+ }
526
+
527
+ /**
528
+ * `.fire()` automatically adds a global fetch event listener.
529
+ * This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers.
530
+ * @deprecated
531
+ * ACRYL ships no service-worker adapter: mount the app with `ctx.router.route(path, app)` and serve it through an ACRYL adapter instead.
532
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API
533
+ * @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/
534
+ */
535
+ fire = (): void => {
536
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
537
+ // @ts-ignore
538
+ addEventListener('fetch', (event: FetchEventLike): void => {
539
+ event.respondWith(this.#dispatch(event.request, event, undefined, event.request.method))
540
+ })
541
+ }
542
+ }
543
+
544
+ export { App as AppBase }