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,375 @@
1
+ /**
2
+ * @module
3
+ * Factory Helper for App.
4
+ */
5
+
6
+ /* eslint-disable @typescript-eslint/no-explicit-any */
7
+ import { App } from '../../app.ts'
8
+ import type { AppOptions } from '../../app-base.ts'
9
+ import type {
10
+ Env,
11
+ H,
12
+ HandlerResponse,
13
+ Input,
14
+ IntersectNonAnyTypes,
15
+ MiddlewareHandler,
16
+ } from '../../types.ts'
17
+
18
+ type InitApp<E extends Env = Env> = (app: App<E>) => void
19
+
20
+ export interface CreateHandlersInterface<E extends Env, P extends string> {
21
+ <I extends Input = {}, R extends HandlerResponse<any> = any, E2 extends Env = E>(
22
+ handler1: H<E2, P, I, R>
23
+ ): [H<E2, P, I, R>]
24
+
25
+ // handler x2
26
+ <
27
+ I extends Input = {},
28
+ I2 extends Input = I,
29
+ R extends HandlerResponse<any> = any,
30
+ R2 extends HandlerResponse<any> = any,
31
+ E2 extends Env = E,
32
+ E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
33
+ >(
34
+ handler1: H<E2, P, I, R>,
35
+ handler2: H<E3, P, I2, R2>
36
+ ): [H<E2, P, I, R>, H<E3, P, I2, R2>]
37
+
38
+ // handler x3
39
+ <
40
+ I extends Input = {},
41
+ I2 extends Input = I,
42
+ I3 extends Input = I & I2,
43
+ R extends HandlerResponse<any> = any,
44
+ R2 extends HandlerResponse<any> = any,
45
+ R3 extends HandlerResponse<any> = any,
46
+ E2 extends Env = E,
47
+ E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
48
+ E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
49
+ >(
50
+ handler1: H<E2, P, I, R>,
51
+ handler2: H<E3, P, I2, R2>,
52
+ handler3: H<E4, P, I3, R3>
53
+ ): [H<E2, P, I, R>, H<E3, P, I2, R2>, H<E4, P, I3, R3>]
54
+
55
+ // handler x4
56
+ <
57
+ I extends Input = {},
58
+ I2 extends Input = I,
59
+ I3 extends Input = I & I2,
60
+ I4 extends Input = I & I2 & I3,
61
+ R extends HandlerResponse<any> = any,
62
+ R2 extends HandlerResponse<any> = any,
63
+ R3 extends HandlerResponse<any> = any,
64
+ R4 extends HandlerResponse<any> = any,
65
+ E2 extends Env = E,
66
+ E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
67
+ E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
68
+ E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
69
+ >(
70
+ handler1: H<E2, P, I, R>,
71
+ handler2: H<E3, P, I2, R2>,
72
+ handler3: H<E4, P, I3, R3>,
73
+ handler4: H<E5, P, I4, R4>
74
+ ): [H<E2, P, I, R>, H<E3, P, I2, R2>, H<E4, P, I3, R3>, H<E5, P, I4, R4>]
75
+
76
+ // handler x5
77
+ <
78
+ I extends Input = {},
79
+ I2 extends Input = I,
80
+ I3 extends Input = I & I2,
81
+ I4 extends Input = I & I2 & I3,
82
+ I5 extends Input = I & I2 & I3 & I4,
83
+ R extends HandlerResponse<any> = any,
84
+ R2 extends HandlerResponse<any> = any,
85
+ R3 extends HandlerResponse<any> = any,
86
+ R4 extends HandlerResponse<any> = any,
87
+ R5 extends HandlerResponse<any> = any,
88
+ E2 extends Env = E,
89
+ E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
90
+ E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
91
+ E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
92
+ E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
93
+ >(
94
+ handler1: H<E2, P, I, R>,
95
+ handler2: H<E3, P, I2, R2>,
96
+ handler3: H<E4, P, I3, R3>,
97
+ handler4: H<E5, P, I4, R4>,
98
+ handler5: H<E6, P, I5, R5>
99
+ ): [H<E2, P, I, R>, H<E3, P, I2, R2>, H<E4, P, I3, R3>, H<E5, P, I4, R4>, H<E6, P, I5, R5>]
100
+
101
+ // handler x6
102
+ <
103
+ I extends Input = {},
104
+ I2 extends Input = I,
105
+ I3 extends Input = I & I2,
106
+ I4 extends Input = I & I2 & I3,
107
+ I5 extends Input = I & I2 & I3 & I4,
108
+ I6 extends Input = I & I2 & I3 & I4 & I5,
109
+ R extends HandlerResponse<any> = any,
110
+ R2 extends HandlerResponse<any> = any,
111
+ R3 extends HandlerResponse<any> = any,
112
+ R4 extends HandlerResponse<any> = any,
113
+ R5 extends HandlerResponse<any> = any,
114
+ R6 extends HandlerResponse<any> = any,
115
+ E2 extends Env = E,
116
+ E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
117
+ E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
118
+ E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
119
+ E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
120
+ E7 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>,
121
+ >(
122
+ handler1: H<E2, P, I, R>,
123
+ handler2: H<E3, P, I2, R2>,
124
+ handler3: H<E4, P, I3, R3>,
125
+ handler4: H<E5, P, I4, R4>,
126
+ handler5: H<E6, P, I5, R5>,
127
+ handler6: H<E7, P, I6, R6>
128
+ ): [
129
+ H<E2, P, I, R>,
130
+ H<E3, P, I2, R2>,
131
+ H<E4, P, I3, R3>,
132
+ H<E5, P, I4, R4>,
133
+ H<E6, P, I5, R5>,
134
+ H<E7, P, I6, R6>,
135
+ ]
136
+
137
+ // handler x7
138
+ <
139
+ I extends Input = {},
140
+ I2 extends Input = I,
141
+ I3 extends Input = I & I2,
142
+ I4 extends Input = I & I2 & I3,
143
+ I5 extends Input = I & I2 & I3 & I4,
144
+ I6 extends Input = I & I2 & I3 & I4 & I5,
145
+ I7 extends Input = I & I2 & I3 & I4 & I5 & I6,
146
+ R extends HandlerResponse<any> = any,
147
+ R2 extends HandlerResponse<any> = any,
148
+ R3 extends HandlerResponse<any> = any,
149
+ R4 extends HandlerResponse<any> = any,
150
+ R5 extends HandlerResponse<any> = any,
151
+ R6 extends HandlerResponse<any> = any,
152
+ R7 extends HandlerResponse<any> = any,
153
+ E2 extends Env = E,
154
+ E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
155
+ E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
156
+ E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
157
+ E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
158
+ E7 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>,
159
+ E8 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7]>,
160
+ >(
161
+ handler1: H<E2, P, I, R>,
162
+ handler2: H<E3, P, I2, R2>,
163
+ handler3: H<E4, P, I3, R3>,
164
+ handler4: H<E5, P, I4, R4>,
165
+ handler5: H<E6, P, I5, R5>,
166
+ handler6: H<E7, P, I6, R6>,
167
+ handler7: H<E8, P, I7, R7>
168
+ ): [
169
+ H<E2, P, I, R>,
170
+ H<E3, P, I2, R2>,
171
+ H<E4, P, I3, R3>,
172
+ H<E5, P, I4, R4>,
173
+ H<E6, P, I5, R5>,
174
+ H<E7, P, I6, R6>,
175
+ H<E8, P, I7, R7>,
176
+ ]
177
+
178
+ // handler x8
179
+ <
180
+ I extends Input = {},
181
+ I2 extends Input = I,
182
+ I3 extends Input = I & I2,
183
+ I4 extends Input = I & I2 & I3,
184
+ I5 extends Input = I & I2 & I3 & I4,
185
+ I6 extends Input = I & I2 & I3 & I4 & I5,
186
+ I7 extends Input = I & I2 & I3 & I4 & I5 & I6,
187
+ I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7,
188
+ R extends HandlerResponse<any> = any,
189
+ R2 extends HandlerResponse<any> = any,
190
+ R3 extends HandlerResponse<any> = any,
191
+ R4 extends HandlerResponse<any> = any,
192
+ R5 extends HandlerResponse<any> = any,
193
+ R6 extends HandlerResponse<any> = any,
194
+ R7 extends HandlerResponse<any> = any,
195
+ R8 extends HandlerResponse<any> = any,
196
+ E2 extends Env = E,
197
+ E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
198
+ E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
199
+ E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
200
+ E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
201
+ E7 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>,
202
+ E8 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7]>,
203
+ E9 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8]>,
204
+ >(
205
+ handler1: H<E2, P, I, R>,
206
+ handler2: H<E3, P, I2, R2>,
207
+ handler3: H<E4, P, I3, R3>,
208
+ handler4: H<E5, P, I4, R4>,
209
+ handler5: H<E6, P, I5, R5>,
210
+ handler6: H<E7, P, I6, R6>,
211
+ handler7: H<E8, P, I7, R7>,
212
+ handler8: H<E9, P, I8, R8>
213
+ ): [
214
+ H<E2, P, I, R>,
215
+ H<E3, P, I2, R2>,
216
+ H<E4, P, I3, R3>,
217
+ H<E5, P, I4, R4>,
218
+ H<E6, P, I5, R5>,
219
+ H<E7, P, I6, R6>,
220
+ H<E8, P, I7, R7>,
221
+ H<E9, P, I8, R8>,
222
+ ]
223
+
224
+ // handler x9
225
+ <
226
+ I extends Input = {},
227
+ I2 extends Input = I,
228
+ I3 extends Input = I & I2,
229
+ I4 extends Input = I & I2 & I3,
230
+ I5 extends Input = I & I2 & I3 & I4,
231
+ I6 extends Input = I & I2 & I3 & I4 & I5,
232
+ I7 extends Input = I & I2 & I3 & I4 & I5 & I6,
233
+ I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7,
234
+ I9 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8,
235
+ R extends HandlerResponse<any> = any,
236
+ R2 extends HandlerResponse<any> = any,
237
+ R3 extends HandlerResponse<any> = any,
238
+ R4 extends HandlerResponse<any> = any,
239
+ R5 extends HandlerResponse<any> = any,
240
+ R6 extends HandlerResponse<any> = any,
241
+ R7 extends HandlerResponse<any> = any,
242
+ R8 extends HandlerResponse<any> = any,
243
+ R9 extends HandlerResponse<any> = any,
244
+ E2 extends Env = E,
245
+ E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
246
+ E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
247
+ E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
248
+ E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
249
+ E7 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>,
250
+ E8 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7]>,
251
+ E9 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8]>,
252
+ E10 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8, E9]>,
253
+ >(
254
+ handler1: H<E2, P, I, R>,
255
+ handler2: H<E3, P, I2, R2>,
256
+ handler3: H<E4, P, I3, R3>,
257
+ handler4: H<E5, P, I4, R4>,
258
+ handler5: H<E6, P, I5, R5>,
259
+ handler6: H<E7, P, I6, R6>,
260
+ handler7: H<E8, P, I7, R7>,
261
+ handler8: H<E9, P, I8, R8>,
262
+ handler9: H<E10, P, I9, R9>
263
+ ): [
264
+ H<E2, P, I, R>,
265
+ H<E3, P, I2, R>,
266
+ H<E4, P, I3, R>,
267
+ H<E5, P, I4, R>,
268
+ H<E6, P, I5, R>,
269
+ H<E7, P, I6, R>,
270
+ H<E8, P, I7, R>,
271
+ H<E9, P, I8, R>,
272
+ H<E10, P, I9, R>,
273
+ ]
274
+
275
+ // handler x10
276
+ <
277
+ I extends Input = {},
278
+ I2 extends Input = I,
279
+ I3 extends Input = I & I2,
280
+ I4 extends Input = I & I2 & I3,
281
+ I5 extends Input = I & I2 & I3 & I4,
282
+ I6 extends Input = I & I2 & I3 & I4 & I5,
283
+ I7 extends Input = I & I2 & I3 & I4 & I5 & I6,
284
+ I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7,
285
+ I9 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8,
286
+ I10 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8 & I9,
287
+ R extends HandlerResponse<any> = any,
288
+ R2 extends HandlerResponse<any> = any,
289
+ R3 extends HandlerResponse<any> = any,
290
+ R4 extends HandlerResponse<any> = any,
291
+ R5 extends HandlerResponse<any> = any,
292
+ R6 extends HandlerResponse<any> = any,
293
+ R7 extends HandlerResponse<any> = any,
294
+ R8 extends HandlerResponse<any> = any,
295
+ R9 extends HandlerResponse<any> = any,
296
+ R10 extends HandlerResponse<any> = any,
297
+ E2 extends Env = E,
298
+ E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
299
+ E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
300
+ E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
301
+ E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
302
+ E7 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>,
303
+ E8 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7]>,
304
+ E9 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8]>,
305
+ E10 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8, E9]>,
306
+ E11 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8, E9, E10]>,
307
+ >(
308
+ handler1: H<E2, P, I, R>,
309
+ handler2: H<E3, P, I2, R2>,
310
+ handler3: H<E4, P, I3, R3>,
311
+ handler4: H<E5, P, I4, R4>,
312
+ handler5: H<E6, P, I5, R5>,
313
+ handler6: H<E7, P, I6, R6>,
314
+ handler7: H<E8, P, I7, R7>,
315
+ handler8: H<E9, P, I8, R8>,
316
+ handler9: H<E10, P, I9, R9>,
317
+ handler10: H<E11, P, I10, R10>
318
+ ): [
319
+ H<E2, P, I, R>,
320
+ H<E3, P, I2, R2>,
321
+ H<E4, P, I3, R3>,
322
+ H<E5, P, I4, R4>,
323
+ H<E6, P, I5, R5>,
324
+ H<E7, P, I6, R6>,
325
+ H<E8, P, I7, R7>,
326
+ H<E9, P, I8, R8>,
327
+ H<E10, P, I9, R9>,
328
+ H<E11, P, I10, R10>,
329
+ ]
330
+ }
331
+
332
+ export class Factory<E extends Env = Env, P extends string = string> {
333
+ private initApp?: InitApp<E>
334
+ #defaultAppOptions?: AppOptions<E>
335
+
336
+ constructor(init?: { initApp?: InitApp<E>; defaultAppOptions?: AppOptions<E> }) {
337
+ this.initApp = init?.initApp
338
+ this.#defaultAppOptions = init?.defaultAppOptions
339
+ }
340
+
341
+ createApp = (options?: AppOptions<E>): App<E> => {
342
+ const app = new App<E>(
343
+ (options && this.#defaultAppOptions
344
+ ? { ...this.#defaultAppOptions, ...options }
345
+ : (options ?? this.#defaultAppOptions)) as AppOptions<E>
346
+ )
347
+ if (this.initApp) {
348
+ this.initApp(app)
349
+ }
350
+ return app
351
+ }
352
+
353
+ createMiddleware = <I extends Input = {}, R extends HandlerResponse<any> | void = void>(
354
+ middleware: MiddlewareHandler<E, P, I, R extends void ? Response : R>
355
+ ): MiddlewareHandler<E, P, I, R extends void ? Response : R> => middleware
356
+
357
+ createHandlers: CreateHandlersInterface<E, P> = (...handlers: any) => {
358
+ // @ts-expect-error this should not be typed
359
+ return handlers.filter((handler) => handler !== undefined)
360
+ }
361
+ }
362
+
363
+ export const createFactory = <E extends Env = Env, P extends string = string>(init?: {
364
+ initApp?: InitApp<E>
365
+ defaultAppOptions?: AppOptions<E>
366
+ }): Factory<E, P> => new Factory<E, P>(init)
367
+
368
+ export const createMiddleware = <
369
+ E extends Env = any,
370
+ P extends string = string,
371
+ I extends Input = {},
372
+ R extends HandlerResponse<any> | void = void,
373
+ >(
374
+ middleware: MiddlewareHandler<E, P, I, R extends void ? Response : R>
375
+ ): MiddlewareHandler<E, P, I, R extends void ? Response : R> => middleware
@@ -0,0 +1,78 @@
1
+ import { html, raw } from './index.ts'
2
+ import { HtmlEscapedCallbackPhase, resolveCallback } from '../../utils/html.ts'
3
+
4
+ describe('Tagged Template Literals', () => {
5
+ it('Should escape special characters', () => {
6
+ const name = 'John "Johnny" Smith'
7
+
8
+ expect(html`<p>I'm ${name}.</p>`.toString()).toBe("<p>I'm John &quot;Johnny&quot; Smith.</p>")
9
+ })
10
+
11
+ describe('Booleans, Null, and Undefined Are Ignored', () => {
12
+ it.each([true, false, undefined, null])('%s', (item) => {
13
+ expect(html`${item}`.toString()).toBe('')
14
+ })
15
+
16
+ it('falsy value', () => {
17
+ expect(html`${0}`.toString()).toBe('0')
18
+ })
19
+ })
20
+
21
+ it('Should call $array.flat(Infinity)', () => {
22
+ const values = [
23
+ 'Name:',
24
+ ['John "Johnny" Smith', undefined, null],
25
+ ' Contact:',
26
+ [html`<a href="http://example.com/">My Website</a>`],
27
+ ]
28
+ expect(html`<p>${values}</p>`.toString()).toBe(
29
+ '<p>Name:John &quot;Johnny&quot; Smith Contact:<a href="http://example.com/">My Website</a></p>'
30
+ )
31
+ })
32
+
33
+ describe('Promise', () => {
34
+ it('Should return Promise<string> when some variables contains Promise<string> in variables', async () => {
35
+ const name = Promise.resolve('John "Johnny" Smith')
36
+ const res = html`<p>I'm ${name}.</p>`
37
+ expect(res).toBeInstanceOf(Promise)
38
+
39
+ expect((await res).toString()).toBe("<p>I'm John &quot;Johnny&quot; Smith.</p>")
40
+ })
41
+
42
+ it('Should return raw value when some variables contains Promise<HtmlEscapedString> in variables', async () => {
43
+ const name = Promise.resolve(raw('John "Johnny" Smith'))
44
+ const res = html`<p>I'm ${name}.</p>`
45
+ expect(res).toBeInstanceOf(Promise)
46
+ expect((await res).toString()).toBe('<p>I\'m John "Johnny" Smith.</p>')
47
+ })
48
+ })
49
+
50
+ describe('HtmlEscapedString', () => {
51
+ it('Should preserve callbacks', async () => {
52
+ const name = raw('App', [
53
+ ({ buffer }) => {
54
+ if (buffer) {
55
+ buffer[0] = buffer[0].replace('App', 'App!')
56
+ }
57
+ return undefined
58
+ },
59
+ ])
60
+ const res = html`<p>I'm ${name}.</p>`
61
+ expect(res).toBeInstanceOf(Promise)
62
+
63
+ expect((await res).toString()).toBe("<p>I'm App.</p>")
64
+ expect(await resolveCallback(await res, HtmlEscapedCallbackPhase.Stringify, false, {})).toBe(
65
+ "<p>I'm App!.</p>"
66
+ )
67
+ })
68
+ })
69
+ })
70
+
71
+ describe('raw', () => {
72
+ it('Should be marked as escaped.', () => {
73
+ const name = 'John &quot;Johnny&quot; Smith'
74
+ expect(html`<p>I'm ${raw(name)}.</p>`.toString()).toBe(
75
+ "<p>I'm John &quot;Johnny&quot; Smith.</p>"
76
+ )
77
+ })
78
+ })
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @module
3
+ * html Helper for App.
4
+ */
5
+
6
+ import { escapeToBuffer, raw, resolveCallbackSync, stringBufferToString } from '../../utils/html.ts'
7
+ import type { HtmlEscaped, HtmlEscapedString, StringBufferWithCallbacks } from '../../utils/html.ts'
8
+
9
+ export { raw }
10
+
11
+ export const html = (
12
+ strings: TemplateStringsArray,
13
+ ...values: unknown[]
14
+ ): HtmlEscapedString | Promise<HtmlEscapedString> => {
15
+ const buffer: StringBufferWithCallbacks = [''] as StringBufferWithCallbacks
16
+
17
+ for (let i = 0, len = strings.length - 1; i < len; i++) {
18
+ buffer[0] += strings[i]
19
+
20
+ const children = Array.isArray(values[i])
21
+ ? (values[i] as Array<unknown>).flat(Infinity)
22
+ : [values[i]]
23
+ for (let i = 0, len = children.length; i < len; i++) {
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ const child = children[i] as any
26
+ if (typeof child === 'string') {
27
+ escapeToBuffer(child, buffer)
28
+ } else if (typeof child === 'number') {
29
+ ;(buffer[0] as string) += child
30
+ } else if (typeof child === 'boolean' || child === null || child === undefined) {
31
+ continue
32
+ } else if (typeof child === 'object' && (child as HtmlEscaped).isEscaped) {
33
+ if ((child as HtmlEscapedString).callbacks) {
34
+ buffer.unshift('', child)
35
+ } else {
36
+ const tmp = child.toString()
37
+ if (tmp instanceof Promise) {
38
+ buffer.unshift('', tmp)
39
+ } else {
40
+ buffer[0] += tmp
41
+ }
42
+ }
43
+ } else if (child instanceof Promise) {
44
+ buffer.unshift('', child)
45
+ } else {
46
+ escapeToBuffer(child.toString(), buffer)
47
+ }
48
+ }
49
+ }
50
+ buffer[0] += strings.at(-1) as string
51
+
52
+ return buffer.length === 1
53
+ ? 'callbacks' in buffer
54
+ ? raw(resolveCallbackSync(raw(buffer[0], buffer.callbacks)))
55
+ : raw(buffer[0])
56
+ : stringBufferToString(buffer, buffer.callbacks)
57
+ }