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,381 @@
1
+ import { appendTrailingSlash, trimTrailingSlash } from './index.ts'
2
+ import { App } from '../../app.ts'
3
+
4
+ describe('Resolve trailing slash', () => {
5
+ describe('trimTrailingSlash middleware', () => {
6
+ const app = new App({ strict: true })
7
+ app.use('*', trimTrailingSlash())
8
+
9
+ app.get('/', async (c) => {
10
+ return c.text('ok')
11
+ })
12
+ app.get('/the/example/endpoint/without/trailing/slash', async (c) => {
13
+ return c.text('ok')
14
+ })
15
+
16
+ it('should handle GET request for root path correctly', async () => {
17
+ const resp = await app.request('/')
18
+
19
+ expect(resp).not.toBeNull()
20
+ expect(resp.status).toBe(200)
21
+ })
22
+
23
+ it('should handle GET request for path without trailing slash correctly', async () => {
24
+ const resp = await app.request('/the/example/endpoint/without/trailing/slash')
25
+
26
+ expect(resp).not.toBeNull()
27
+ expect(resp.status).toBe(200)
28
+ })
29
+
30
+ it('should handle GET request for path with trailing slash correctly', async () => {
31
+ const resp = await app.request('/the/example/endpoint/without/trailing/slash/')
32
+ const loc = new URL(resp.headers.get('location')!)
33
+
34
+ expect(resp).not.toBeNull()
35
+ expect(resp.status).toBe(301)
36
+ expect(loc.pathname).toBe('/the/example/endpoint/without/trailing/slash')
37
+ })
38
+
39
+ it('should preserve query parameters when redirecting', async () => {
40
+ const resp = await app.request('/the/example/endpoint/without/trailing/slash/?exampleParam=1')
41
+ const loc = new URL(resp.headers.get('location')!)
42
+
43
+ expect(resp).not.toBeNull()
44
+ expect(resp.status).toBe(301)
45
+ expect(loc.pathname).toBe('/the/example/endpoint/without/trailing/slash')
46
+ expect(loc.searchParams.get('exampleParam')).toBe('1')
47
+ })
48
+
49
+ it('should handle HEAD request for root path correctly', async () => {
50
+ const resp = await app.request('/', { method: 'HEAD' })
51
+
52
+ expect(resp).not.toBeNull()
53
+ expect(resp.status).toBe(200)
54
+ })
55
+
56
+ it('should handle HEAD request for path without trailing slash correctly', async () => {
57
+ const resp = await app.request('/the/example/endpoint/without/trailing/slash', {
58
+ method: 'HEAD',
59
+ })
60
+
61
+ expect(resp).not.toBeNull()
62
+ expect(resp.status).toBe(200)
63
+ })
64
+
65
+ it('should handle HEAD request for path with trailing slash correctly', async () => {
66
+ const resp = await app.request('/the/example/endpoint/without/trailing/slash/', {
67
+ method: 'HEAD',
68
+ })
69
+ const loc = new URL(resp.headers.get('location')!)
70
+
71
+ expect(resp).not.toBeNull()
72
+ expect(resp.status).toBe(301)
73
+ expect(loc.pathname).toBe('/the/example/endpoint/without/trailing/slash')
74
+ })
75
+
76
+ it('should preserve query parameters when redirecting HEAD requests', async () => {
77
+ const resp = await app.request(
78
+ '/the/example/endpoint/without/trailing/slash/?exampleParam=1',
79
+ { method: 'HEAD' }
80
+ )
81
+ const loc = new URL(resp.headers.get('location')!)
82
+
83
+ expect(resp).not.toBeNull()
84
+ expect(resp.status).toBe(301)
85
+ expect(loc.pathname).toBe('/the/example/endpoint/without/trailing/slash')
86
+ expect(loc.searchParams.get('exampleParam')).toBe('1')
87
+ })
88
+ })
89
+
90
+ describe('trimTrailingSlash middleware with alwaysRedirect option', () => {
91
+ const app = new App()
92
+ app.use('*', trimTrailingSlash({ alwaysRedirect: true }))
93
+
94
+ app.get('/', async (c) => {
95
+ return c.text('ok')
96
+ })
97
+ app.get('/my-path/*', async (c) => {
98
+ return c.text('wildcard')
99
+ })
100
+ app.get('/exact-path', async (c) => {
101
+ return c.text('exact')
102
+ })
103
+
104
+ it('should handle GET request for root path correctly', async () => {
105
+ const resp = await app.request('/')
106
+
107
+ expect(resp).not.toBeNull()
108
+ expect(resp.status).toBe(200)
109
+ })
110
+
111
+ it('should redirect wildcard route with trailing slash', async () => {
112
+ const resp = await app.request('/my-path/something/else/')
113
+ const loc = new URL(resp.headers.get('location')!)
114
+
115
+ expect(resp).not.toBeNull()
116
+ expect(resp.status).toBe(301)
117
+ expect(loc.pathname).toBe('/my-path/something/else')
118
+ })
119
+
120
+ it('should not redirect wildcard route without trailing slash', async () => {
121
+ const resp = await app.request('/my-path/something/else')
122
+
123
+ expect(resp).not.toBeNull()
124
+ expect(resp.status).toBe(200)
125
+ expect(await resp.text()).toBe('wildcard')
126
+ })
127
+
128
+ it('should redirect exact route with trailing slash', async () => {
129
+ const resp = await app.request('/exact-path/')
130
+ const loc = new URL(resp.headers.get('location')!)
131
+
132
+ expect(resp).not.toBeNull()
133
+ expect(resp.status).toBe(301)
134
+ expect(loc.pathname).toBe('/exact-path')
135
+ })
136
+
137
+ it('should preserve query parameters when redirecting', async () => {
138
+ const resp = await app.request('/my-path/something/?param=1')
139
+ const loc = new URL(resp.headers.get('location')!)
140
+
141
+ expect(resp).not.toBeNull()
142
+ expect(resp.status).toBe(301)
143
+ expect(loc.pathname).toBe('/my-path/something')
144
+ expect(loc.searchParams.get('param')).toBe('1')
145
+ })
146
+
147
+ it('should handle HEAD request for wildcard route with trailing slash', async () => {
148
+ const resp = await app.request('/my-path/something/', { method: 'HEAD' })
149
+ const loc = new URL(resp.headers.get('location')!)
150
+
151
+ expect(resp).not.toBeNull()
152
+ expect(resp.status).toBe(301)
153
+ expect(loc.pathname).toBe('/my-path/something')
154
+ })
155
+ })
156
+
157
+ describe('appendTrailingSlash middleware', () => {
158
+ const app = new App({ strict: true })
159
+ app.use('*', appendTrailingSlash())
160
+
161
+ app.get('/', async (c) => {
162
+ return c.text('ok')
163
+ })
164
+ app.get('/the/example/endpoint/with/trailing/slash/', async (c) => {
165
+ return c.text('ok')
166
+ })
167
+ app.get('/the/example/simulate/a.file', async (c) => {
168
+ return c.text('ok')
169
+ })
170
+
171
+ it('should handle GET request for root path correctly', async () => {
172
+ const resp = await app.request('/')
173
+
174
+ expect(resp).not.toBeNull()
175
+ expect(resp.status).toBe(200)
176
+ })
177
+
178
+ it('should handle GET request for file-like paths correctly', async () => {
179
+ const resp = await app.request('/the/example/simulate/a.file')
180
+
181
+ expect(resp).not.toBeNull()
182
+ expect(resp.status).toBe(200)
183
+ })
184
+
185
+ it('should handle GET request for path with trailing slash correctly', async () => {
186
+ const resp = await app.request('/the/example/endpoint/with/trailing/slash/')
187
+
188
+ expect(resp).not.toBeNull()
189
+ expect(resp.status).toBe(200)
190
+ })
191
+
192
+ it('should redirect path without trailing slash to one with it', async () => {
193
+ const resp = await app.request('/the/example/endpoint/with/trailing/slash')
194
+ const loc = new URL(resp.headers.get('location')!)
195
+
196
+ expect(resp).not.toBeNull()
197
+ expect(resp.status).toBe(301)
198
+ expect(loc.pathname).toBe('/the/example/endpoint/with/trailing/slash/')
199
+ })
200
+
201
+ it('should preserve query parameters when redirecting', async () => {
202
+ const resp = await app.request('/the/example/endpoint/with/trailing/slash?exampleParam=1')
203
+ const loc = new URL(resp.headers.get('location')!)
204
+
205
+ expect(resp).not.toBeNull()
206
+ expect(resp.status).toBe(301)
207
+ expect(loc.pathname).toBe('/the/example/endpoint/with/trailing/slash/')
208
+ expect(loc.searchParams.get('exampleParam')).toBe('1')
209
+ })
210
+
211
+ it('should handle HEAD request for root path correctly', async () => {
212
+ const resp = await app.request('/', { method: 'HEAD' })
213
+
214
+ expect(resp).not.toBeNull()
215
+ expect(resp.status).toBe(200)
216
+ })
217
+
218
+ it('should handle HEAD request for file-like paths correctly', async () => {
219
+ const resp = await app.request('/the/example/simulate/a.file', { method: 'HEAD' })
220
+
221
+ expect(resp).not.toBeNull()
222
+ expect(resp.status).toBe(200)
223
+ })
224
+
225
+ it('should handle HEAD request for path with trailing slash correctly', async () => {
226
+ const resp = await app.request('/the/example/endpoint/with/trailing/slash/', {
227
+ method: 'HEAD',
228
+ })
229
+
230
+ expect(resp).not.toBeNull()
231
+ expect(resp.status).toBe(200)
232
+ })
233
+
234
+ it('should redirect HEAD request for path without trailing slash to one with it', async () => {
235
+ const resp = await app.request('/the/example/endpoint/with/trailing/slash', {
236
+ method: 'HEAD',
237
+ })
238
+ const loc = new URL(resp.headers.get('location')!)
239
+
240
+ expect(resp).not.toBeNull()
241
+ expect(resp.status).toBe(301)
242
+ expect(loc.pathname).toBe('/the/example/endpoint/with/trailing/slash/')
243
+ })
244
+
245
+ it('should preserve query parameters when redirecting HEAD requests', async () => {
246
+ const resp = await app.request('/the/example/endpoint/with/trailing/slash?exampleParam=1', {
247
+ method: 'HEAD',
248
+ })
249
+ const loc = new URL(resp.headers.get('location')!)
250
+
251
+ expect(resp).not.toBeNull()
252
+ expect(resp.status).toBe(301)
253
+ expect(loc.pathname).toBe('/the/example/endpoint/with/trailing/slash/')
254
+ expect(loc.searchParams.get('exampleParam')).toBe('1')
255
+ })
256
+ })
257
+
258
+ describe('appendTrailingSlash middleware with skip option', () => {
259
+ const hasExtension = (path: string): boolean => /\.\w+$/.test(path.split('/').at(-1) ?? '')
260
+ const app = new App({ strict: true })
261
+ app.use('*', appendTrailingSlash({ skip: hasExtension }))
262
+
263
+ app.get('/page/', (c) => c.text('ok'))
264
+
265
+ it('should not redirect paths with file extensions', async () => {
266
+ const resp = await app.request('/foo.html')
267
+
268
+ expect(resp.status).toBe(404)
269
+ })
270
+
271
+ it('should redirect paths without file extensions', async () => {
272
+ const resp = await app.request('/page')
273
+
274
+ expect(resp.status).toBe(301)
275
+ const loc = new URL(resp.headers.get('location')!)
276
+ expect(loc.pathname).toBe('/page/')
277
+ })
278
+ })
279
+
280
+ describe('appendTrailingSlash middleware with alwaysRedirect and skip options', () => {
281
+ const hasExtension = (path: string): boolean => /\.\w+$/.test(path.split('/').at(-1) ?? '')
282
+ const app = new App()
283
+ app.use('*', appendTrailingSlash({ alwaysRedirect: true, skip: hasExtension }))
284
+
285
+ app.get('/', (c) => c.text('ok'))
286
+ app.get('/my-path/*', (c) => c.text('wildcard'))
287
+
288
+ it('should redirect paths without extensions', async () => {
289
+ const resp = await app.request('/my-path/something')
290
+ const loc = new URL(resp.headers.get('location')!)
291
+
292
+ expect(resp.status).toBe(301)
293
+ expect(loc.pathname).toBe('/my-path/something/')
294
+ })
295
+
296
+ it('should not redirect paths with file extensions', async () => {
297
+ const resp = await app.request('/my-path/style.css')
298
+
299
+ expect(resp.status).toBe(200)
300
+ })
301
+
302
+ it('should not redirect paths with extensions like .html', async () => {
303
+ const resp = await app.request('/my-path/page.html')
304
+
305
+ expect(resp.status).toBe(200)
306
+ })
307
+
308
+ it('should handle HEAD request for paths with extensions', async () => {
309
+ const resp = await app.request('/my-path/script.js', { method: 'HEAD' })
310
+
311
+ expect(resp.status).toBe(200)
312
+ })
313
+ })
314
+
315
+ describe('appendTrailingSlash middleware with alwaysRedirect option', () => {
316
+ const app = new App()
317
+ app.use('*', appendTrailingSlash({ alwaysRedirect: true }))
318
+
319
+ app.get('/', async (c) => {
320
+ return c.text('ok')
321
+ })
322
+ app.get('/my-path/*', async (c) => {
323
+ return c.text('wildcard')
324
+ })
325
+ app.get('/exact-path/', async (c) => {
326
+ return c.text('exact')
327
+ })
328
+
329
+ it('should handle GET request for root path correctly', async () => {
330
+ const resp = await app.request('/')
331
+
332
+ expect(resp).not.toBeNull()
333
+ expect(resp.status).toBe(200)
334
+ })
335
+
336
+ it('should redirect wildcard route without trailing slash', async () => {
337
+ const resp = await app.request('/my-path/something/else')
338
+ const loc = new URL(resp.headers.get('location')!)
339
+
340
+ expect(resp).not.toBeNull()
341
+ expect(resp.status).toBe(301)
342
+ expect(loc.pathname).toBe('/my-path/something/else/')
343
+ })
344
+
345
+ it('should not redirect wildcard route with trailing slash', async () => {
346
+ const resp = await app.request('/my-path/something/else/')
347
+
348
+ expect(resp).not.toBeNull()
349
+ expect(resp.status).toBe(200)
350
+ expect(await resp.text()).toBe('wildcard')
351
+ })
352
+
353
+ it('should redirect exact route without trailing slash', async () => {
354
+ const resp = await app.request('/exact-path')
355
+ const loc = new URL(resp.headers.get('location')!)
356
+
357
+ expect(resp).not.toBeNull()
358
+ expect(resp.status).toBe(301)
359
+ expect(loc.pathname).toBe('/exact-path/')
360
+ })
361
+
362
+ it('should preserve query parameters when redirecting', async () => {
363
+ const resp = await app.request('/my-path/something?param=1')
364
+ const loc = new URL(resp.headers.get('location')!)
365
+
366
+ expect(resp).not.toBeNull()
367
+ expect(resp.status).toBe(301)
368
+ expect(loc.pathname).toBe('/my-path/something/')
369
+ expect(loc.searchParams.get('param')).toBe('1')
370
+ })
371
+
372
+ it('should handle HEAD request for wildcard route without trailing slash', async () => {
373
+ const resp = await app.request('/my-path/something', { method: 'HEAD' })
374
+ const loc = new URL(resp.headers.get('location')!)
375
+
376
+ expect(resp).not.toBeNull()
377
+ expect(resp.status).toBe(301)
378
+ expect(loc.pathname).toBe('/my-path/something/')
379
+ })
380
+ })
381
+ })
@@ -0,0 +1,156 @@
1
+ /**
2
+ * @module
3
+ * Trailing Slash Middleware for App.
4
+ */
5
+
6
+ import type { MiddlewareHandler } from '../../types.ts'
7
+
8
+ type TrimTrailingSlashOptions = {
9
+ /**
10
+ * If `true`, the middleware will always redirect requests with a trailing slash
11
+ * before executing handlers.
12
+ * This is useful for routes with wildcards (`*`).
13
+ * If `false` (default), it will only redirect when the route is not found (404).
14
+ * @default false
15
+ */
16
+ alwaysRedirect?: boolean
17
+ }
18
+
19
+ /**
20
+ * Trailing Slash Middleware for App.
21
+ *
22
+ *
23
+ * @param {TrimTrailingSlashOptions} options - The options for the middleware.
24
+ * @returns {MiddlewareHandler} The middleware handler function.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * const app = new App()
29
+ *
30
+ * app.use(trimTrailingSlash())
31
+ * app.get('/about/me/', (c) => c.text('With Trailing Slash'))
32
+ * ```
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * // With alwaysRedirect option for wildcard routes
37
+ * const app = new App()
38
+ *
39
+ * app.use(trimTrailingSlash({ alwaysRedirect: true }))
40
+ * app.get('/my-path/*', (c) => c.text('Wildcard route'))
41
+ * ```
42
+ */
43
+ export const trimTrailingSlash = (options?: TrimTrailingSlashOptions): MiddlewareHandler => {
44
+ return async function trimTrailingSlash(c, next) {
45
+ if (options?.alwaysRedirect) {
46
+ if (
47
+ (c.req.method === 'GET' || c.req.method === 'HEAD') &&
48
+ c.req.path !== '/' &&
49
+ c.req.path.at(-1) === '/'
50
+ ) {
51
+ const url = new URL(c.req.url)
52
+ url.pathname = url.pathname.substring(0, url.pathname.length - 1)
53
+
54
+ return c.redirect(url.toString(), 301)
55
+ }
56
+ }
57
+
58
+ await next()
59
+
60
+ if (
61
+ !options?.alwaysRedirect &&
62
+ c.res.status === 404 &&
63
+ (c.req.method === 'GET' || c.req.method === 'HEAD') &&
64
+ c.req.path !== '/' &&
65
+ c.req.path.at(-1) === '/'
66
+ ) {
67
+ const url = new URL(c.req.url)
68
+ url.pathname = url.pathname.substring(0, url.pathname.length - 1)
69
+
70
+ c.res = c.redirect(url.toString(), 301)
71
+ }
72
+ }
73
+ }
74
+
75
+ type AppendTrailingSlashOptions = {
76
+ /**
77
+ * If `true`, the middleware will always redirect requests without a trailing slash
78
+ * before executing handlers.
79
+ * This is useful for routes with wildcards (`*`).
80
+ * If `false` (default), it will only redirect when the route is not found (404).
81
+ * @default false
82
+ */
83
+ alwaysRedirect?: boolean
84
+ /**
85
+ * A function that determines whether to skip the redirect for a given path.
86
+ * If the function returns `true`, the redirect will be skipped.
87
+ * @param path - The request path
88
+ * @returns `true` to skip the redirect
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * // Skip redirect for paths with file extensions
93
+ * app.use(appendTrailingSlash({
94
+ * alwaysRedirect: true,
95
+ * skip: (path) => /\.\w+$/.test(path),
96
+ * }))
97
+ * ```
98
+ */
99
+ skip?: (path: string) => boolean
100
+ }
101
+
102
+ /**
103
+ * Append trailing slash middleware for App.
104
+ * Append a trailing slash to the URL if it doesn't have one. For example, `/path/to/page` will be redirected to `/path/to/page/`.
105
+ *
106
+ *
107
+ * @param {AppendTrailingSlashOptions} options - The options for the middleware.
108
+ * @returns {MiddlewareHandler} The middleware handler function.
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * const app = new App()
113
+ *
114
+ * app.use(appendTrailingSlash())
115
+ * ```
116
+ *
117
+ * @example
118
+ * ```ts
119
+ * // With alwaysRedirect option for wildcard routes
120
+ * const app = new App()
121
+ *
122
+ * app.use(appendTrailingSlash({ alwaysRedirect: true }))
123
+ * app.get('/my-path/*', (c) => c.text('Wildcard route'))
124
+ * ```
125
+ */
126
+ export const appendTrailingSlash = (options?: AppendTrailingSlashOptions): MiddlewareHandler => {
127
+ return async function appendTrailingSlash(c, next) {
128
+ if (options?.alwaysRedirect) {
129
+ if (
130
+ (c.req.method === 'GET' || c.req.method === 'HEAD') &&
131
+ c.req.path.at(-1) !== '/' &&
132
+ !options.skip?.(c.req.path)
133
+ ) {
134
+ const url = new URL(c.req.url)
135
+ url.pathname += '/'
136
+
137
+ return c.redirect(url.toString(), 301)
138
+ }
139
+ }
140
+
141
+ await next()
142
+
143
+ if (
144
+ !options?.alwaysRedirect &&
145
+ c.res.status === 404 &&
146
+ (c.req.method === 'GET' || c.req.method === 'HEAD') &&
147
+ c.req.path.at(-1) !== '/' &&
148
+ !options?.skip?.(c.req.path)
149
+ ) {
150
+ const url = new URL(c.req.url)
151
+ url.pathname += '/'
152
+
153
+ c.res = c.redirect(url.toString(), 301)
154
+ }
155
+ }
156
+ }
@@ -0,0 +1 @@
1
+ export const GET_MATCH_RESULT: unique symbol = Symbol()