acrylblends 0.3.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 (315) hide show
  1. package/dist/index.d.ts +6 -1
  2. package/dist/index.js +28 -3
  3. package/dist/index.js.map +1 -1
  4. package/package.json +1 -1
  5. package/plugins/acryl-inspect/plugin.json +2 -1
  6. package/plugins/acryl-inspect/src/report.ts +16 -13
  7. package/plugins/acryl-inspect/src/service.ts +9 -7
  8. package/plugins/acryl-inspect/tests/report.spec.ts +7 -8
  9. package/plugins/acryl-inspect/tests/service.spec.ts +11 -10
  10. package/plugins/acryl-inspect/upstream.json +2 -2
  11. package/plugins/acryl-node-server/LICENSE +26 -0
  12. package/plugins/acryl-node-server/plugin.json +2 -1
  13. package/plugins/acryl-node-server/src/adapter/conninfo.ts +23 -0
  14. package/plugins/acryl-node-server/src/adapter/early-hints.ts +55 -0
  15. package/plugins/acryl-node-server/src/adapter/error.ts +11 -0
  16. package/plugins/acryl-node-server/src/adapter/headers.ts +249 -0
  17. package/plugins/acryl-node-server/src/adapter/index.ts +6 -0
  18. package/plugins/acryl-node-server/src/adapter/listener.ts +540 -0
  19. package/plugins/acryl-node-server/src/adapter/request.ts +797 -0
  20. package/plugins/acryl-node-server/src/adapter/response.ts +186 -0
  21. package/plugins/acryl-node-server/src/adapter/serve-static.ts +238 -0
  22. package/plugins/acryl-node-server/src/adapter/server.ts +36 -0
  23. package/plugins/acryl-node-server/src/adapter/types.ts +82 -0
  24. package/plugins/acryl-node-server/src/adapter/url.ts +42 -0
  25. package/plugins/acryl-node-server/src/adapter/utils/response/constants.ts +1 -0
  26. package/plugins/acryl-node-server/src/adapter/utils/response.ts +4 -0
  27. package/plugins/acryl-node-server/src/adapter/utils/stream.ts +88 -0
  28. package/plugins/acryl-node-server/src/adapter/utils.ts +96 -0
  29. package/plugins/acryl-node-server/src/adapter/websocket-types.ts +45 -0
  30. package/plugins/acryl-node-server/src/adapter/websocket.ts +375 -0
  31. package/plugins/acryl-node-server/src/index.ts +19 -6
  32. package/plugins/acryl-node-server/tests/adapter/app.ts +76 -0
  33. package/plugins/acryl-node-server/tests/adapter/assets/.static/plain.txt +1 -0
  34. package/plugins/acryl-node-server/tests/adapter/assets/favicon.ico +0 -0
  35. package/plugins/acryl-node-server/tests/adapter/assets/secret.txt +1 -0
  36. package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +1 -0
  37. package/plugins/acryl-node-server/tests/adapter/assets/static/admin/secret.txt +1 -0
  38. package/plugins/acryl-node-server/tests/adapter/assets/static/data.json +5 -0
  39. package/plugins/acryl-node-server/tests/adapter/assets/static/extensionless +1 -0
  40. package/plugins/acryl-node-server/tests/adapter/assets/static/foo..bar.txt +0 -0
  41. package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +1 -0
  42. package/plugins/acryl-node-server/tests/adapter/assets/static/plain.txt +1 -0
  43. package/plugins/acryl-node-server/tests/adapter/assets/static-with-context-path/plain.txt +1 -0
  44. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin +1 -0
  45. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin.br +1 -0
  46. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt +1 -0
  47. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.br +1 -0
  48. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.zst +1 -0
  49. package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +34 -0
  50. package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +248 -0
  51. package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +457 -0
  52. package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-cert.pem +23 -0
  53. package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-key.pem +27 -0
  54. package/plugins/acryl-node-server/tests/adapter/headers.test.ts +252 -0
  55. package/plugins/acryl-node-server/tests/adapter/helpers/request.ts +190 -0
  56. package/plugins/acryl-node-server/tests/adapter/listener.test.ts +727 -0
  57. package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +189 -0
  58. package/plugins/acryl-node-server/tests/adapter/request.test.ts +1230 -0
  59. package/plugins/acryl-node-server/tests/adapter/response.test.ts +285 -0
  60. package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +849 -0
  61. package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +790 -0
  62. package/plugins/acryl-node-server/tests/adapter/server.test.ts +1302 -0
  63. package/plugins/acryl-node-server/tests/adapter/setup.ts +16 -0
  64. package/plugins/acryl-node-server/tests/adapter/url.test.ts +76 -0
  65. package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +23 -0
  66. package/plugins/acryl-node-server/tests/adapter/utils/stream.test.ts +75 -0
  67. package/plugins/acryl-node-server/tests/adapter/utils.test.ts +235 -0
  68. package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +260 -0
  69. package/plugins/acryl-node-server/tests/server.spec.ts +44 -8
  70. package/plugins/acryl-node-server/upstream.json +3 -3
  71. package/plugins/acryl-router/LICENSE +26 -0
  72. package/plugins/acryl-router/plugin.json +2 -1
  73. package/plugins/acryl-router/src/client.ts +2 -0
  74. package/plugins/acryl-router/src/connection.ts +42 -0
  75. package/plugins/acryl-router/src/core/app-base.ts +544 -0
  76. package/plugins/acryl-router/src/core/app.test.ts +3833 -0
  77. package/plugins/acryl-router/src/core/app.ts +34 -0
  78. package/plugins/acryl-router/src/core/client/client.test.ts +2313 -0
  79. package/plugins/acryl-router/src/core/client/client.ts +249 -0
  80. package/plugins/acryl-router/src/core/client/fetch-result-please.ts +95 -0
  81. package/plugins/acryl-router/src/core/client/index.ts +17 -0
  82. package/plugins/acryl-router/src/core/client/types.test.ts +149 -0
  83. package/plugins/acryl-router/src/core/client/types.ts +393 -0
  84. package/plugins/acryl-router/src/core/client/utils.test.ts +405 -0
  85. package/plugins/acryl-router/src/core/client/utils.ts +117 -0
  86. package/plugins/acryl-router/src/core/compose.test.ts +751 -0
  87. package/plugins/acryl-router/src/core/compose.ts +73 -0
  88. package/plugins/acryl-router/src/core/context.test.ts +629 -0
  89. package/plugins/acryl-router/src/core/context.ts +781 -0
  90. package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +344 -0
  91. package/plugins/acryl-router/src/core/helper/accepts/accepts.ts +96 -0
  92. package/plugins/acryl-router/src/core/helper/accepts/index.ts +6 -0
  93. package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +55 -0
  94. package/plugins/acryl-router/src/core/helper/adapter/index.ts +90 -0
  95. package/plugins/acryl-router/src/core/helper/conninfo/index.ts +6 -0
  96. package/plugins/acryl-router/src/core/helper/conninfo/types.ts +45 -0
  97. package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +510 -0
  98. package/plugins/acryl-router/src/core/helper/cookie/index.ts +146 -0
  99. package/plugins/acryl-router/src/core/helper/factory/index.test.ts +434 -0
  100. package/plugins/acryl-router/src/core/helper/factory/index.ts +375 -0
  101. package/plugins/acryl-router/src/core/helper/html/index.test.ts +78 -0
  102. package/plugins/acryl-router/src/core/helper/html/index.ts +57 -0
  103. package/plugins/acryl-router/src/core/helper/route/index.test.ts +259 -0
  104. package/plugins/acryl-router/src/core/helper/route/index.ts +144 -0
  105. package/plugins/acryl-router/src/core/helper/streaming/index.ts +9 -0
  106. package/plugins/acryl-router/src/core/helper/streaming/sse.ts +101 -0
  107. package/plugins/acryl-router/src/core/helper/streaming/stream.test.ts +128 -0
  108. package/plugins/acryl-router/src/core/helper/streaming/stream.ts +45 -0
  109. package/plugins/acryl-router/src/core/helper/streaming/text.test.ts +34 -0
  110. package/plugins/acryl-router/src/core/helper/streaming/text.ts +15 -0
  111. package/plugins/acryl-router/src/core/helper/streaming/utils.ts +11 -0
  112. package/plugins/acryl-router/src/core/helper/testing/index.test.ts +42 -0
  113. package/plugins/acryl-router/src/core/helper/testing/index.ts +28 -0
  114. package/plugins/acryl-router/src/core/helper/websocket/index.test.ts +124 -0
  115. package/plugins/acryl-router/src/core/helper/websocket/index.ts +140 -0
  116. package/plugins/acryl-router/src/core/http-exception.test.ts +45 -0
  117. package/plugins/acryl-router/src/core/http-exception.ts +77 -0
  118. package/plugins/acryl-router/src/core/index.ts +53 -0
  119. package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +434 -0
  120. package/plugins/acryl-router/src/core/middleware/basic-auth/index.ts +152 -0
  121. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +1018 -0
  122. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.ts +220 -0
  123. package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +273 -0
  124. package/plugins/acryl-router/src/core/middleware/body-limit/index.ts +110 -0
  125. package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +355 -0
  126. package/plugins/acryl-router/src/core/middleware/combine/index.ts +171 -0
  127. package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +535 -0
  128. package/plugins/acryl-router/src/core/middleware/compress/index.ts +142 -0
  129. package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +43 -0
  130. package/plugins/acryl-router/src/core/middleware/context-storage/index.ts +58 -0
  131. package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +532 -0
  132. package/plugins/acryl-router/src/core/middleware/cors/index.ts +163 -0
  133. package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +534 -0
  134. package/plugins/acryl-router/src/core/middleware/csrf/index.ts +150 -0
  135. package/plugins/acryl-router/src/core/middleware/etag/digest.test.ts +21 -0
  136. package/plugins/acryl-router/src/core/middleware/etag/digest.ts +95 -0
  137. package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +503 -0
  138. package/plugins/acryl-router/src/core/middleware/etag/index.ts +135 -0
  139. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +217 -0
  140. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.ts +278 -0
  141. package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +1135 -0
  142. package/plugins/acryl-router/src/core/middleware/jwk/index.ts +1 -0
  143. package/plugins/acryl-router/src/core/middleware/jwk/jwk.ts +195 -0
  144. package/plugins/acryl-router/src/core/middleware/jwk/keys.test.json +48 -0
  145. package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +802 -0
  146. package/plugins/acryl-router/src/core/middleware/jwt/index.ts +9 -0
  147. package/plugins/acryl-router/src/core/middleware/jwt/jwt.ts +189 -0
  148. package/plugins/acryl-router/src/core/middleware/language/index.test.ts +552 -0
  149. package/plugins/acryl-router/src/core/middleware/language/index.ts +12 -0
  150. package/plugins/acryl-router/src/core/middleware/language/language.ts +314 -0
  151. package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +204 -0
  152. package/plugins/acryl-router/src/core/middleware/logger/index.ts +95 -0
  153. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +292 -0
  154. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.ts +141 -0
  155. package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +221 -0
  156. package/plugins/acryl-router/src/core/middleware/method-override/index.ts +147 -0
  157. package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +37 -0
  158. package/plugins/acryl-router/src/core/middleware/powered-by/index.ts +35 -0
  159. package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +218 -0
  160. package/plugins/acryl-router/src/core/middleware/pretty-json/index.ts +67 -0
  161. package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +168 -0
  162. package/plugins/acryl-router/src/core/middleware/request-id/index.ts +7 -0
  163. package/plugins/acryl-router/src/core/middleware/request-id/request-id.ts +59 -0
  164. package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +671 -0
  165. package/plugins/acryl-router/src/core/middleware/secure-headers/index.ts +8 -0
  166. package/plugins/acryl-router/src/core/middleware/secure-headers/permissions-policy.ts +101 -0
  167. package/plugins/acryl-router/src/core/middleware/secure-headers/secure-headers.ts +340 -0
  168. package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +450 -0
  169. package/plugins/acryl-router/src/core/middleware/serve-static/index.ts +135 -0
  170. package/plugins/acryl-router/src/core/middleware/serve-static/path.test.ts +50 -0
  171. package/plugins/acryl-router/src/core/middleware/serve-static/path.ts +25 -0
  172. package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +70 -0
  173. package/plugins/acryl-router/src/core/middleware/timeout/index.ts +58 -0
  174. package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +310 -0
  175. package/plugins/acryl-router/src/core/middleware/timing/index.ts +8 -0
  176. package/plugins/acryl-router/src/core/middleware/timing/timing.ts +256 -0
  177. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +381 -0
  178. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.ts +156 -0
  179. package/plugins/acryl-router/src/core/request/constants.ts +1 -0
  180. package/plugins/acryl-router/src/core/request.test.ts +751 -0
  181. package/plugins/acryl-router/src/core/request.ts +502 -0
  182. package/plugins/acryl-router/src/core/router/common.case.test.ts +1132 -0
  183. package/plugins/acryl-router/src/core/router/linear-router/index.ts +6 -0
  184. package/plugins/acryl-router/src/core/router/linear-router/router.test.ts +80 -0
  185. package/plugins/acryl-router/src/core/router/linear-router/router.ts +152 -0
  186. package/plugins/acryl-router/src/core/router/pattern-router/index.ts +6 -0
  187. package/plugins/acryl-router/src/core/router/pattern-router/router.test.ts +46 -0
  188. package/plugins/acryl-router/src/core/router/pattern-router/router.ts +54 -0
  189. package/plugins/acryl-router/src/core/router/reg-exp-router/index.ts +7 -0
  190. package/plugins/acryl-router/src/core/router/reg-exp-router/matcher.ts +33 -0
  191. package/plugins/acryl-router/src/core/router/reg-exp-router/node.ts +170 -0
  192. package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.test.ts +154 -0
  193. package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.ts +165 -0
  194. package/plugins/acryl-router/src/core/router/reg-exp-router/router.test.ts +265 -0
  195. package/plugins/acryl-router/src/core/router/reg-exp-router/router.ts +174 -0
  196. package/plugins/acryl-router/src/core/router/reg-exp-router/trie.ts +84 -0
  197. package/plugins/acryl-router/src/core/router/smart-router/index.ts +6 -0
  198. package/plugins/acryl-router/src/core/router/smart-router/router.test.ts +13 -0
  199. package/plugins/acryl-router/src/core/router/smart-router/router.ts +70 -0
  200. package/plugins/acryl-router/src/core/router/trie-router/index.ts +6 -0
  201. package/plugins/acryl-router/src/core/router/trie-router/node.test.ts +896 -0
  202. package/plugins/acryl-router/src/core/router/trie-router/node.ts +221 -0
  203. package/plugins/acryl-router/src/core/router/trie-router/router.test.ts +8 -0
  204. package/plugins/acryl-router/src/core/router/trie-router/router.ts +18 -0
  205. package/plugins/acryl-router/src/core/router/utils.ts +1 -0
  206. package/plugins/acryl-router/src/core/router.ts +103 -0
  207. package/plugins/acryl-router/src/core/types.test.ts +4134 -0
  208. package/plugins/acryl-router/src/core/types.ts +2782 -0
  209. package/plugins/acryl-router/src/core/utils/accept.test.ts +299 -0
  210. package/plugins/acryl-router/src/core/utils/accept.ts +268 -0
  211. package/plugins/acryl-router/src/core/utils/basic-auth.test.ts +56 -0
  212. package/plugins/acryl-router/src/core/utils/basic-auth.ts +26 -0
  213. package/plugins/acryl-router/src/core/utils/body.test.ts +496 -0
  214. package/plugins/acryl-router/src/core/utils/body.ts +263 -0
  215. package/plugins/acryl-router/src/core/utils/buffer.test.ts +147 -0
  216. package/plugins/acryl-router/src/core/utils/buffer.ts +117 -0
  217. package/plugins/acryl-router/src/core/utils/color.test.ts +23 -0
  218. package/plugins/acryl-router/src/core/utils/color.ts +56 -0
  219. package/plugins/acryl-router/src/core/utils/compress.ts +10 -0
  220. package/plugins/acryl-router/src/core/utils/concurrent.test.ts +69 -0
  221. package/plugins/acryl-router/src/core/utils/concurrent.ts +55 -0
  222. package/plugins/acryl-router/src/core/utils/constants.ts +4 -0
  223. package/plugins/acryl-router/src/core/utils/cookie.test.ts +460 -0
  224. package/plugins/acryl-router/src/core/utils/cookie.ts +281 -0
  225. package/plugins/acryl-router/src/core/utils/crypto.test.ts +43 -0
  226. package/plugins/acryl-router/src/core/utils/crypto.ts +58 -0
  227. package/plugins/acryl-router/src/core/utils/encode.test.ts +61 -0
  228. package/plugins/acryl-router/src/core/utils/encode.ts +34 -0
  229. package/plugins/acryl-router/src/core/utils/filepath.test.ts +78 -0
  230. package/plugins/acryl-router/src/core/utils/filepath.ts +60 -0
  231. package/plugins/acryl-router/src/core/utils/handler.ts +15 -0
  232. package/plugins/acryl-router/src/core/utils/headers.ts +355 -0
  233. package/plugins/acryl-router/src/core/utils/html.test.ts +16 -0
  234. package/plugins/acryl-router/src/core/utils/html.ts +182 -0
  235. package/plugins/acryl-router/src/core/utils/http-status.ts +72 -0
  236. package/plugins/acryl-router/src/core/utils/ipaddr.test.ts +149 -0
  237. package/plugins/acryl-router/src/core/utils/ipaddr.ts +374 -0
  238. package/plugins/acryl-router/src/core/utils/jwt/index.ts +7 -0
  239. package/plugins/acryl-router/src/core/utils/jwt/jwa.test.ts +86 -0
  240. package/plugins/acryl-router/src/core/utils/jwt/jwa.ts +38 -0
  241. package/plugins/acryl-router/src/core/utils/jwt/jws.ts +235 -0
  242. package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +1788 -0
  243. package/plugins/acryl-router/src/core/utils/jwt/jwt.ts +292 -0
  244. package/plugins/acryl-router/src/core/utils/jwt/types.ts +157 -0
  245. package/plugins/acryl-router/src/core/utils/jwt/utf8.ts +7 -0
  246. package/plugins/acryl-router/src/core/utils/mime.test.ts +64 -0
  247. package/plugins/acryl-router/src/core/utils/mime.ts +94 -0
  248. package/plugins/acryl-router/src/core/utils/stream.test.ts +212 -0
  249. package/plugins/acryl-router/src/core/utils/stream.ts +107 -0
  250. package/plugins/acryl-router/src/core/utils/types.test.ts +295 -0
  251. package/plugins/acryl-router/src/core/utils/types.ts +123 -0
  252. package/plugins/acryl-router/src/core/utils/url.test.ts +384 -0
  253. package/plugins/acryl-router/src/core/utils/url.ts +337 -0
  254. package/plugins/acryl-router/src/core/validator/index.ts +8 -0
  255. package/plugins/acryl-router/src/core/validator/utils.test.ts +82 -0
  256. package/plugins/acryl-router/src/core/validator/utils.ts +69 -0
  257. package/plugins/acryl-router/src/core/validator/validator.test.ts +1488 -0
  258. package/plugins/acryl-router/src/core/validator/validator.ts +185 -0
  259. package/plugins/acryl-router/src/helpers/index.ts +13 -3
  260. package/plugins/acryl-router/src/helpers/schema-validator.ts +35 -0
  261. package/plugins/acryl-router/src/index.ts +6 -6
  262. package/plugins/acryl-router/src/middleware/index.ts +25 -6
  263. package/plugins/acryl-router/src/middleware/loopback-only.ts +19 -13
  264. package/plugins/acryl-router/src/service.ts +256 -64
  265. package/plugins/acryl-router/tests/docs-examples.spec.ts +152 -0
  266. package/plugins/acryl-router/tests/live-install.spec.ts +2 -2
  267. package/plugins/acryl-router/tests/loader.spec.ts +3 -2
  268. package/plugins/acryl-router/tests/service.spec.ts +264 -66
  269. package/plugins/acryl-router/tests/shadow-state.spec.ts +79 -0
  270. package/plugins/acryl-router/upstream.json +2 -2
  271. package/plugins/acryl-router-http/plugin.json +2 -1
  272. package/plugins/acryl-router-http/src/bridge.ts +3 -1
  273. package/plugins/acryl-router-http/tests/adapter.spec.ts +16 -12
  274. package/plugins/acryl-router-http/tests/surfaces.spec.ts +12 -10
  275. package/plugins/acryl-router-http/upstream.json +3 -3
  276. package/plugins/acryl-state/NOTICE +30 -0
  277. package/plugins/acryl-state/plugin.json +1 -1
  278. package/plugins/acryl-state/src/cell.ts +1 -1
  279. package/plugins/acryl-state/src/service.ts +33 -15
  280. package/plugins/acryl-state/upstream.json +6 -4
  281. package/plugins/builder/script.ts +4 -7
  282. package/plugins/extensions/index.ts +2 -2
  283. package/plugins/extensions/resolve.ts +28 -3
  284. package/plugins/openai/prompt.ts +9 -7
  285. package/plugins/tsconfig.json +5 -4
  286. package/templates/agent/src/routes.ts +37 -27
  287. package/templates/agent/test/model.test.ts +2 -1
  288. package/templates/agent/tsconfig.json +8 -5
  289. package/templates/blank/src/routes.ts +6 -4
  290. package/templates/blank/tsconfig.json +2 -4
  291. package/templates/todo/src/page.ts +1 -1
  292. package/templates/todo/src/todo.ts +56 -29
  293. package/templates/todo/tsconfig.json +2 -4
  294. package/templates/todo/upstream.json +2 -2
  295. package/plugins/acryl-router/src/compose.ts +0 -21
  296. package/plugins/acryl-router/src/context.ts +0 -59
  297. package/plugins/acryl-router/src/helpers/read-body.ts +0 -59
  298. package/plugins/acryl-router/src/helpers/sse.ts +0 -83
  299. package/plugins/acryl-router/src/helpers/validate.ts +0 -44
  300. package/plugins/acryl-router/src/http-error.ts +0 -21
  301. package/plugins/acryl-router/src/middleware/body-limit.ts +0 -25
  302. package/plugins/acryl-router/src/middleware/cors.ts +0 -46
  303. package/plugins/acryl-router/src/middleware/logger.ts +0 -21
  304. package/plugins/acryl-router/src/middleware/request-id.ts +0 -24
  305. package/plugins/acryl-router/src/middleware/secure-headers.ts +0 -23
  306. package/plugins/acryl-router/src/pattern.ts +0 -89
  307. package/plugins/acryl-router/src/registrar.ts +0 -90
  308. package/plugins/acryl-router/src/table.ts +0 -156
  309. package/plugins/acryl-router/src/types.ts +0 -73
  310. package/plugins/acryl-router/src/util.ts +0 -23
  311. package/plugins/acryl-router/tests/api.spec.ts +0 -223
  312. package/plugins/acryl-router/tests/conformance.ts +0 -170
  313. package/plugins/acryl-router/tests/helpers.spec.ts +0 -172
  314. package/plugins/acryl-router/tests/middleware.spec.ts +0 -183
  315. package/plugins/acryl-router/tests/table.spec.ts +0 -47
@@ -0,0 +1,174 @@
1
+ import type { Router } from '../../router.ts'
2
+ import {
3
+ MESSAGE_MATCHER_IS_ALREADY_BUILT,
4
+ METHOD_NAME_ALL,
5
+ UnsupportedPathError,
6
+ } from '../../router.ts'
7
+ import { checkOptionalParameter } from '../../utils/url.ts'
8
+ import { createNullObject } from '../utils.ts'
9
+ import type { HandlerData, StaticMap, Matcher, MatcherMap } from './matcher.ts'
10
+ import { match, emptyParam } from './matcher.ts'
11
+ import {
12
+ LABEL_REG_EXP_STR,
13
+ ONLY_WILDCARD_REG_EXP_STR,
14
+ PATH_ERROR,
15
+ TAIL_WILDCARD_REG_EXP_STR,
16
+ } from './node.ts'
17
+ import { Trie } from './trie.ts'
18
+
19
+ type HandlerWithMetadata<T> = [T, string] // [handler, path]
20
+
21
+ let wildcardRegExpCache: Record<string, RegExp> = createNullObject()
22
+ function buildWildcardRegExp(path: string): RegExp {
23
+ return (wildcardRegExpCache[path] ??= new RegExp(
24
+ `^${path.replace(
25
+ /\/:[^/{}]+(?:\{\[\^\/]\+})?(?=[/{]|$)|\/?\*$|([.\\+*[^\]$()?{}|])/g,
26
+ (match, metaChar) =>
27
+ metaChar
28
+ ? `\\${metaChar}`
29
+ : match === '/*'
30
+ ? TAIL_WILDCARD_REG_EXP_STR
31
+ : match === '*'
32
+ ? ONLY_WILDCARD_REG_EXP_STR
33
+ : `/:${LABEL_REG_EXP_STR}`
34
+ )}$`
35
+ ))
36
+ }
37
+
38
+ function findMiddleware<T>(middleware: Record<string, T[]>, path: string): T[] | undefined {
39
+ for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) {
40
+ if (buildWildcardRegExp(k).test(path)) {
41
+ return [...middleware[k]]
42
+ }
43
+ }
44
+
45
+ return undefined
46
+ }
47
+
48
+ export class RegExpRouter<T> implements Router<T> {
49
+ name: string = 'RegExpRouter'
50
+ #middleware?: Record<string, Record<string, HandlerWithMetadata<T>[]>>
51
+ #routes?: Record<string, Record<string, HandlerWithMetadata<T>[]>>
52
+ #tries?: Record<string, Trie>
53
+
54
+ constructor() {
55
+ this.#middleware = { [METHOD_NAME_ALL]: createNullObject() }
56
+ this.#routes = { [METHOD_NAME_ALL]: createNullObject() }
57
+ this.#tries = { [METHOD_NAME_ALL]: new Trie() }
58
+ }
59
+
60
+ #insertPath(method: string, path: string) {
61
+ try {
62
+ this.#tries![method].insert(path, !/\*|\/:/.test(path))
63
+ } catch (e) {
64
+ throw e === PATH_ERROR ? new UnsupportedPathError(path) : e
65
+ }
66
+ }
67
+
68
+ add(method: string, path: string, handler: T) {
69
+ const middleware = this.#middleware
70
+ const routes = this.#routes!
71
+
72
+ if (!middleware) {
73
+ throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT)
74
+ }
75
+
76
+ if (!middleware[method]) {
77
+ this.#tries![method] = new Trie()
78
+ for (const handlerMap of [middleware, routes]) {
79
+ handlerMap[method] = createNullObject()
80
+ for (const p in handlerMap[METHOD_NAME_ALL]) {
81
+ handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]]
82
+ this.#insertPath(method, p)
83
+ }
84
+ }
85
+ }
86
+
87
+ if (path === '/*') {
88
+ path = '*'
89
+ }
90
+ const methods = method === METHOD_NAME_ALL ? Object.keys(middleware) : [method]
91
+
92
+ if (/\*$/.test(path)) {
93
+ const re = buildWildcardRegExp(path)
94
+ for (const m of methods) {
95
+ if (!middleware[m][path]) {
96
+ this.#insertPath(m, path)
97
+ middleware[m][path] =
98
+ findMiddleware(middleware[m], path) ||
99
+ findMiddleware(middleware[METHOD_NAME_ALL], path) ||
100
+ []
101
+ }
102
+ }
103
+ for (const handlerMap of [middleware, routes]) {
104
+ for (const m of methods) {
105
+ for (const p in handlerMap[m]) {
106
+ re.test(p) && handlerMap[m][p].push([handler, path])
107
+ }
108
+ }
109
+ }
110
+
111
+ return
112
+ }
113
+
114
+ const paths = checkOptionalParameter(path) || [path]
115
+ for (const path of paths) {
116
+ for (const m of methods) {
117
+ if (!routes[m][path]) {
118
+ this.#insertPath(m, path)
119
+ routes[m][path] =
120
+ findMiddleware(middleware[m], path) ||
121
+ findMiddleware(middleware[METHOD_NAME_ALL], path) ||
122
+ []
123
+ }
124
+ routes[m][path].push([handler, path])
125
+ }
126
+ }
127
+ }
128
+
129
+ match: typeof match<Router<T>, T> = match
130
+
131
+ protected buildAllMatchers(): MatcherMap<T> {
132
+ const matchers: MatcherMap<T> = createNullObject()
133
+
134
+ for (const method of Object.keys(this.#routes!)) {
135
+ matchers[method] = this.#buildMatcher(method)
136
+ }
137
+
138
+ // Release cache
139
+ this.#middleware = this.#routes = this.#tries = undefined
140
+ wildcardRegExpCache = createNullObject()
141
+
142
+ return matchers
143
+ }
144
+
145
+ #buildMatcher(method: string): Matcher<T> {
146
+ const middleware = this.#middleware![method]
147
+ const routes = this.#routes![method]
148
+
149
+ const trie = this.#tries![method]
150
+ const staticMap: StaticMap<T> = createNullObject()
151
+ const handlerData: HandlerData<T>[] = []
152
+ const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp()
153
+
154
+ for (const r of [middleware, routes]) {
155
+ for (const path in r) {
156
+ const handlers = r[path]
157
+ const pathData = trie.paths[path]
158
+ if (!pathData) {
159
+ staticMap[path] = [handlers.map(([h]) => [h, createNullObject()]), emptyParam]
160
+ continue
161
+ }
162
+ handlerData[pathData[0]] = handlers.map(([h, handlerPath]) => [
163
+ h,
164
+ trie.paths[handlerPath][1].reduceRight((map, [key], i) => {
165
+ map[key] = paramReplacementMap[pathData[1][i][1]]
166
+ return map
167
+ }, createNullObject()),
168
+ ])
169
+ }
170
+ }
171
+
172
+ return [regexp, indexReplacementMap.map((i) => handlerData[i]), staticMap] as Matcher<T>
173
+ }
174
+ }
@@ -0,0 +1,84 @@
1
+ import { createNullObject } from '../utils.ts'
2
+ import type { Context, ParamAssocArray } from './node.ts'
3
+ import { Node } from './node.ts'
4
+
5
+ export type ReplacementMap = number[]
6
+
7
+ export class Trie {
8
+ #context: Context = { varIndex: 0 }
9
+ #root: Node = new Node()
10
+ #index: number = 0
11
+ // dynamic path -> [handler index, param assoc]; static paths are not registered
12
+ paths: Record<string, [number, ParamAssocArray]> = createNullObject()
13
+
14
+ insert(path: string, isStatic: boolean): void {
15
+ if (isStatic) {
16
+ // a static path has no pattern; every character is a literal token
17
+ this.#root.insert(path.split(''), 0, [], this.#context, true)
18
+ return
19
+ }
20
+
21
+ const paramAssoc: ParamAssocArray = []
22
+
23
+ const groups: [string, string][] = [] // [mark, original string]
24
+ let markedPath = path
25
+ for (let i = 0; ;) {
26
+ let replaced = false
27
+ markedPath = markedPath.replace(/\{[^}]+\}/g, (m) => {
28
+ const mark = `@\\${i}`
29
+ groups[i] = [mark, m]
30
+ i++
31
+ replaced = true
32
+ return mark
33
+ })
34
+ if (!replaced) {
35
+ break
36
+ }
37
+ }
38
+
39
+ /**
40
+ * - pattern (:label, :label{0-9]+}, ...)
41
+ * - /* wildcard
42
+ * - character
43
+ */
44
+ const tokens = markedPath.match(/(?::[^\/]+)|(?:\/\*$)|./g) || []
45
+ for (let i = groups.length - 1; i >= 0; i--) {
46
+ const [mark] = groups[i]
47
+ for (let j = tokens.length - 1; j >= 0; j--) {
48
+ if (tokens[j].indexOf(mark) !== -1) {
49
+ tokens[j] = tokens[j].replace(mark, groups[i][1])
50
+ break
51
+ }
52
+ }
53
+ }
54
+
55
+ this.#root.insert(tokens, this.#index, paramAssoc, this.#context, false)
56
+ this.paths[path] = [this.#index++, paramAssoc]
57
+ }
58
+
59
+ buildRegExp(): [RegExp, ReplacementMap, ReplacementMap] {
60
+ let regexp = this.#root.buildRegExpStr()
61
+ if (regexp === '') {
62
+ return [/^$/, [], []] // never match
63
+ }
64
+
65
+ let captureIndex = 0
66
+ const indexReplacementMap: ReplacementMap = []
67
+ const paramReplacementMap: ReplacementMap = []
68
+
69
+ regexp = regexp.replace(/#(\d+)|@(\d+)|\.\*\$/g, (_, handlerIndex, paramIndex) => {
70
+ if (handlerIndex !== undefined) {
71
+ indexReplacementMap[++captureIndex] = Number(handlerIndex)
72
+ return '$()'
73
+ }
74
+ if (paramIndex !== undefined) {
75
+ paramReplacementMap[Number(paramIndex)] = ++captureIndex
76
+ return ''
77
+ }
78
+
79
+ return ''
80
+ })
81
+
82
+ return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap]
83
+ }
84
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @module
3
+ * SmartRouter for App.
4
+ */
5
+
6
+ export { SmartRouter } from './router.ts'
@@ -0,0 +1,13 @@
1
+ import { runTest } from '../common.case.test.ts'
2
+ import { RegExpRouter } from '../reg-exp-router/index.ts'
3
+ import { TrieRouter } from '../trie-router/index.ts'
4
+ import { SmartRouter } from './router.ts'
5
+
6
+ describe('SmartRouter', () => {
7
+ runTest({
8
+ newRouter: () =>
9
+ new SmartRouter({
10
+ routers: [new RegExpRouter(), new TrieRouter()],
11
+ }),
12
+ })
13
+ })
@@ -0,0 +1,70 @@
1
+ import type { Result, Router } from '../../router.ts'
2
+ import { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from '../../router.ts'
3
+
4
+ export class SmartRouter<T> implements Router<T> {
5
+ name: string = 'SmartRouter'
6
+ #routers: Router<T>[] = []
7
+ #routes?: [string, string, T][] = []
8
+
9
+ constructor(init: { routers: Router<T>[] }) {
10
+ this.#routers = init.routers
11
+ }
12
+
13
+ add(method: string, path: string, handler: T) {
14
+ if (!this.#routes) {
15
+ throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT)
16
+ }
17
+
18
+ this.#routes.push([method, path, handler])
19
+ }
20
+
21
+ match(method: string, path: string): Result<T> {
22
+ if (!this.#routes) {
23
+ throw new Error('Fatal error')
24
+ }
25
+
26
+ const routers = this.#routers
27
+ const routes = this.#routes
28
+
29
+ const len = routers.length
30
+ let i = 0
31
+ let res
32
+ for (; i < len; i++) {
33
+ const router = routers[i]
34
+ try {
35
+ for (let i = 0, len = routes.length; i < len; i++) {
36
+ router.add(...routes[i])
37
+ }
38
+ res = router.match(method, path)
39
+ } catch (e) {
40
+ if (e instanceof UnsupportedPathError) {
41
+ continue
42
+ }
43
+ throw e
44
+ }
45
+
46
+ this.match = router.match.bind(router)
47
+ this.#routers = [router]
48
+ this.#routes = undefined
49
+ break
50
+ }
51
+
52
+ if (i === len) {
53
+ // not found
54
+ throw new Error('Fatal error')
55
+ }
56
+
57
+ // e.g. "SmartRouter + RegExpRouter"
58
+ this.name = `SmartRouter + ${this.activeRouter.name}`
59
+
60
+ return res as Result<T>
61
+ }
62
+
63
+ get activeRouter(): Router<T> {
64
+ if (this.#routes || this.#routers.length !== 1) {
65
+ throw new Error('No active router has been determined yet.')
66
+ }
67
+
68
+ return this.#routers[0]
69
+ }
70
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @module
3
+ * TrieRouter for App.
4
+ */
5
+
6
+ export { TrieRouter } from './router.ts'