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,101 @@
1
+ // https://github.com/w3c/webappsec-permissions-policy/blob/main/features.md
2
+
3
+ export type PermissionsPolicyDirective =
4
+ | StandardizedFeatures
5
+ | ProposedFeatures
6
+ | ExperimentalFeatures
7
+
8
+ /**
9
+ * These features have been declared in a published version of the respective specification.
10
+ */
11
+ type StandardizedFeatures =
12
+ | 'accelerometer'
13
+ | 'ambientLightSensor'
14
+ | 'attributionReporting'
15
+ | 'autoplay'
16
+ | 'battery'
17
+ | 'bluetooth'
18
+ | 'camera'
19
+ | 'chUa'
20
+ | 'chUaArch'
21
+ | 'chUaBitness'
22
+ | 'chUaFullVersion'
23
+ | 'chUaFullVersionList'
24
+ | 'chUaHighEntropyValues'
25
+ | 'chUaMobile'
26
+ | 'chUaModel'
27
+ | 'chUaPlatform'
28
+ | 'chUaPlatformVersion'
29
+ | 'chUaWow64'
30
+ | 'computePressure'
31
+ | 'crossOriginIsolated'
32
+ | 'directSockets'
33
+ | 'displayCapture'
34
+ | 'encryptedMedia'
35
+ | 'executionWhileNotRendered'
36
+ | 'executionWhileOutOfViewport'
37
+ | 'fullscreen'
38
+ | 'geolocation'
39
+ | 'gyroscope'
40
+ | 'hid'
41
+ | 'identityCredentialsGet'
42
+ | 'idleDetection'
43
+ | 'keyboardMap'
44
+ | 'magnetometer'
45
+ | 'mediasession'
46
+ | 'microphone'
47
+ | 'midi'
48
+ | 'navigationOverride'
49
+ | 'otpCredentials'
50
+ | 'payment'
51
+ | 'pictureInPicture'
52
+ | 'publickeyCredentialsGet'
53
+ | 'screenWakeLock'
54
+ | 'serial'
55
+ | 'storageAccess'
56
+ | 'syncXhr'
57
+ | 'tools'
58
+ | 'usb'
59
+ | 'webShare'
60
+ | 'windowManagement'
61
+ | 'xrSpatialTracking'
62
+
63
+ /**
64
+ * These features have been proposed, but the definitions have not yet been integrated into their respective specs.
65
+ */
66
+ type ProposedFeatures =
67
+ | 'autofill'
68
+ | 'clipboardRead'
69
+ | 'clipboardWrite'
70
+ | 'deferredFetch'
71
+ | 'gamepad'
72
+ | 'languageDetector'
73
+ | 'languageModel'
74
+ | 'manualText'
75
+ | 'rewriter'
76
+ | 'sharedAutofill'
77
+ | 'speakerSelection'
78
+ | 'summarizer'
79
+ | 'translator'
80
+ | 'writer'
81
+
82
+ /**
83
+ * These features generally have an explainer only, but may be available for experimentation by web developers.
84
+ */
85
+ type ExperimentalFeatures =
86
+ | 'allScreensCapture'
87
+ | 'browsingTopics'
88
+ | 'capturedSurfaceControl'
89
+ | 'conversionMeasurement'
90
+ | 'digitalCredentialsCreate'
91
+ | 'digitalCredentialsGet'
92
+ | 'focusWithoutUserActivation'
93
+ | 'joinAdInterestGroup'
94
+ | 'localFonts'
95
+ | 'monetization'
96
+ | 'runAdAuction'
97
+ | 'smartCard'
98
+ | 'syncScript'
99
+ | 'trustTokenRedemption'
100
+ | 'unload'
101
+ | 'verticalScroll'
@@ -0,0 +1,340 @@
1
+ /**
2
+ * @module
3
+ * Secure Headers Middleware for App.
4
+ */
5
+
6
+ import type { Context } from '../../context.ts'
7
+ import type { MiddlewareHandler } from '../../types.ts'
8
+ import { encodeBase64 } from '../../utils/encode.ts'
9
+ import type { PermissionsPolicyDirective } from './permissions-policy.ts'
10
+
11
+ export type SecureHeadersVariables = {
12
+ secureHeadersNonce?: string
13
+ }
14
+
15
+ export type ContentSecurityPolicyOptionHandler = (ctx: Context, directive: string) => string
16
+ type ContentSecurityPolicyOptionValue = (string | ContentSecurityPolicyOptionHandler)[]
17
+
18
+ interface ContentSecurityPolicyOptions {
19
+ defaultSrc?: ContentSecurityPolicyOptionValue
20
+ baseUri?: ContentSecurityPolicyOptionValue
21
+ childSrc?: ContentSecurityPolicyOptionValue
22
+ connectSrc?: ContentSecurityPolicyOptionValue
23
+ fontSrc?: ContentSecurityPolicyOptionValue
24
+ formAction?: ContentSecurityPolicyOptionValue
25
+ frameAncestors?: ContentSecurityPolicyOptionValue
26
+ frameSrc?: ContentSecurityPolicyOptionValue
27
+ imgSrc?: ContentSecurityPolicyOptionValue
28
+ manifestSrc?: ContentSecurityPolicyOptionValue
29
+ mediaSrc?: ContentSecurityPolicyOptionValue
30
+ objectSrc?: ContentSecurityPolicyOptionValue
31
+ reportTo?: string
32
+ reportUri?: string | string[]
33
+ sandbox?: ContentSecurityPolicyOptionValue
34
+ scriptSrc?: ContentSecurityPolicyOptionValue
35
+ scriptSrcAttr?: ContentSecurityPolicyOptionValue
36
+ scriptSrcElem?: ContentSecurityPolicyOptionValue
37
+ styleSrc?: ContentSecurityPolicyOptionValue
38
+ styleSrcAttr?: ContentSecurityPolicyOptionValue
39
+ styleSrcElem?: ContentSecurityPolicyOptionValue
40
+ upgradeInsecureRequests?: ContentSecurityPolicyOptionValue
41
+ workerSrc?: ContentSecurityPolicyOptionValue
42
+ requireTrustedTypesFor?: ContentSecurityPolicyOptionValue
43
+ trustedTypes?: ContentSecurityPolicyOptionValue
44
+ }
45
+
46
+ interface ReportToOptions {
47
+ group: string
48
+ max_age: number
49
+ endpoints: ReportToEndpoint[]
50
+ }
51
+
52
+ interface ReportToEndpoint {
53
+ url: string
54
+ }
55
+
56
+ interface ReportingEndpointOptions {
57
+ name: string
58
+ url: string
59
+ }
60
+
61
+ type PermissionsPolicyValue = '*' | 'self' | 'src' | 'none' | string
62
+
63
+ type PermissionsPolicyOptions = Partial<
64
+ Record<PermissionsPolicyDirective, PermissionsPolicyValue[] | boolean>
65
+ >
66
+
67
+ type overridableHeader = boolean | string
68
+
69
+ interface SecureHeadersOptions {
70
+ contentSecurityPolicy?: ContentSecurityPolicyOptions
71
+ contentSecurityPolicyReportOnly?: ContentSecurityPolicyOptions
72
+ crossOriginEmbedderPolicy?: overridableHeader
73
+ crossOriginResourcePolicy?: overridableHeader
74
+ crossOriginOpenerPolicy?: overridableHeader
75
+ originAgentCluster?: overridableHeader
76
+ referrerPolicy?: overridableHeader
77
+ reportingEndpoints?: ReportingEndpointOptions[]
78
+ reportTo?: ReportToOptions[]
79
+ strictTransportSecurity?: overridableHeader
80
+ xContentTypeOptions?: overridableHeader
81
+ xDnsPrefetchControl?: overridableHeader
82
+ xDownloadOptions?: overridableHeader
83
+ xFrameOptions?: overridableHeader
84
+ xPermittedCrossDomainPolicies?: overridableHeader
85
+ xXssProtection?: overridableHeader
86
+ removePoweredBy?: boolean
87
+ permissionsPolicy?: PermissionsPolicyOptions
88
+ }
89
+
90
+ type HeadersMap = {
91
+ [key in keyof SecureHeadersOptions]: [string, string]
92
+ }
93
+
94
+ const HEADERS_MAP: HeadersMap = {
95
+ crossOriginEmbedderPolicy: ['Cross-Origin-Embedder-Policy', 'require-corp'],
96
+ crossOriginResourcePolicy: ['Cross-Origin-Resource-Policy', 'same-origin'],
97
+ crossOriginOpenerPolicy: ['Cross-Origin-Opener-Policy', 'same-origin'],
98
+ originAgentCluster: ['Origin-Agent-Cluster', '?1'],
99
+ referrerPolicy: ['Referrer-Policy', 'no-referrer'],
100
+ strictTransportSecurity: ['Strict-Transport-Security', 'max-age=15552000; includeSubDomains'],
101
+ xContentTypeOptions: ['X-Content-Type-Options', 'nosniff'],
102
+ xDnsPrefetchControl: ['X-DNS-Prefetch-Control', 'off'],
103
+ xDownloadOptions: ['X-Download-Options', 'noopen'],
104
+ xFrameOptions: ['X-Frame-Options', 'SAMEORIGIN'],
105
+ xPermittedCrossDomainPolicies: ['X-Permitted-Cross-Domain-Policies', 'none'],
106
+ xXssProtection: ['X-XSS-Protection', '0'],
107
+ }
108
+
109
+ const DEFAULT_OPTIONS: SecureHeadersOptions = {
110
+ crossOriginEmbedderPolicy: false,
111
+ crossOriginResourcePolicy: true,
112
+ crossOriginOpenerPolicy: true,
113
+ originAgentCluster: true,
114
+ referrerPolicy: true,
115
+ strictTransportSecurity: true,
116
+ xContentTypeOptions: true,
117
+ xDnsPrefetchControl: true,
118
+ xDownloadOptions: true,
119
+ xFrameOptions: true,
120
+ xPermittedCrossDomainPolicies: true,
121
+ xXssProtection: true,
122
+ removePoweredBy: true,
123
+ permissionsPolicy: {},
124
+ }
125
+
126
+ type SecureHeadersCallback = (
127
+ ctx: Context,
128
+ headersToSet: [string, string | string[]][]
129
+ ) => [string, string][]
130
+
131
+ const generateNonce = () => {
132
+ const arrayBuffer = new Uint8Array(16)
133
+ crypto.getRandomValues(arrayBuffer)
134
+ return encodeBase64(arrayBuffer.buffer)
135
+ }
136
+
137
+ export const NONCE: ContentSecurityPolicyOptionHandler = (ctx) => {
138
+ const key = 'secureHeadersNonce'
139
+ const init = ctx.get(key)
140
+ const nonce = init || generateNonce()
141
+ if (init == null) {
142
+ ctx.set(key, nonce)
143
+ }
144
+ return `'nonce-${nonce}'`
145
+ }
146
+
147
+ /**
148
+ * Secure Headers Middleware for App.
149
+ *
150
+ *
151
+ * @param {Partial<SecureHeadersOptions>} [customOptions] - The options for the secure headers middleware.
152
+ * @param {ContentSecurityPolicyOptions} [customOptions.contentSecurityPolicy] - Settings for the Content-Security-Policy header.
153
+ * @param {ContentSecurityPolicyOptions} [customOptions.contentSecurityPolicyReportOnly] - Settings for the Content-Security-Policy-Report-Only header.
154
+ * @param {overridableHeader} [customOptions.crossOriginEmbedderPolicy=false] - Settings for the Cross-Origin-Embedder-Policy header.
155
+ * @param {overridableHeader} [customOptions.crossOriginResourcePolicy=true] - Settings for the Cross-Origin-Resource-Policy header.
156
+ * @param {overridableHeader} [customOptions.crossOriginOpenerPolicy=true] - Settings for the Cross-Origin-Opener-Policy header.
157
+ * @param {overridableHeader} [customOptions.originAgentCluster=true] - Settings for the Origin-Agent-Cluster header.
158
+ * @param {overridableHeader} [customOptions.referrerPolicy=true] - Settings for the Referrer-Policy header.
159
+ * @param {ReportingEndpointOptions[]} [customOptions.reportingEndpoints] - Settings for the Reporting-Endpoints header.
160
+ * @param {ReportToOptions[]} [customOptions.reportTo] - Settings for the Report-To header.
161
+ * @param {overridableHeader} [customOptions.strictTransportSecurity=true] - Settings for the Strict-Transport-Security header.
162
+ * @param {overridableHeader} [customOptions.xContentTypeOptions=true] - Settings for the X-Content-Type-Options header.
163
+ * @param {overridableHeader} [customOptions.xDnsPrefetchControl=true] - Settings for the X-DNS-Prefetch-Control header.
164
+ * @param {overridableHeader} [customOptions.xDownloadOptions=true] - Settings for the X-Download-Options header.
165
+ * @param {overridableHeader} [customOptions.xFrameOptions=true] - Settings for the X-Frame-Options header.
166
+ * @param {overridableHeader} [customOptions.xPermittedCrossDomainPolicies=true] - Settings for the X-Permitted-Cross-Domain-Policies header.
167
+ * @param {overridableHeader} [customOptions.xXssProtection=true] - Settings for the X-XSS-Protection header.
168
+ * @param {boolean} [customOptions.removePoweredBy=true] - Settings for remove X-Powered-By header.
169
+ * @param {PermissionsPolicyOptions} [customOptions.permissionsPolicy] - Settings for the Permissions-Policy header.
170
+ * @returns {MiddlewareHandler} The middleware handler function.
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * const app = new App()
175
+ * app.use(secureHeaders())
176
+ * ```
177
+ */
178
+ export const secureHeaders = (customOptions?: SecureHeadersOptions): MiddlewareHandler => {
179
+ const options = { ...DEFAULT_OPTIONS, ...customOptions }
180
+ const headersToSet = getFilteredHeaders(options)
181
+ const callbacks: SecureHeadersCallback[] = []
182
+
183
+ if (options.contentSecurityPolicy) {
184
+ const [callback, value] = getCSPDirectives(
185
+ options.contentSecurityPolicy,
186
+ 'Content-Security-Policy'
187
+ )
188
+ if (callback) {
189
+ callbacks.push(callback)
190
+ }
191
+ headersToSet.push(['Content-Security-Policy', value as string])
192
+ }
193
+
194
+ if (options.contentSecurityPolicyReportOnly) {
195
+ const [callback, value] = getCSPDirectives(
196
+ options.contentSecurityPolicyReportOnly,
197
+ 'Content-Security-Policy-Report-Only'
198
+ )
199
+ if (callback) {
200
+ callbacks.push(callback)
201
+ }
202
+ headersToSet.push(['Content-Security-Policy-Report-Only', value as string])
203
+ }
204
+
205
+ if (options.permissionsPolicy && Object.keys(options.permissionsPolicy).length > 0) {
206
+ headersToSet.push([
207
+ 'Permissions-Policy',
208
+ getPermissionsPolicyDirectives(options.permissionsPolicy),
209
+ ])
210
+ }
211
+
212
+ if (options.reportingEndpoints) {
213
+ headersToSet.push(['Reporting-Endpoints', getReportingEndpoints(options.reportingEndpoints)])
214
+ }
215
+
216
+ if (options.reportTo) {
217
+ headersToSet.push(['Report-To', getReportToOptions(options.reportTo)])
218
+ }
219
+
220
+ return async function secureHeaders(ctx, next) {
221
+ // should evaluate callbacks before next()
222
+ // some callback calls ctx.set() for embedding nonce to the page
223
+ const headersToSetForReq =
224
+ callbacks.length === 0
225
+ ? headersToSet
226
+ : callbacks.reduce((acc, cb) => cb(ctx, acc), headersToSet)
227
+ await next()
228
+ setHeaders(ctx, headersToSetForReq)
229
+
230
+ if (options?.removePoweredBy) {
231
+ ctx.res.headers.delete('X-Powered-By')
232
+ }
233
+ }
234
+ }
235
+
236
+ function getFilteredHeaders(options: SecureHeadersOptions): [string, string][] {
237
+ return Object.entries(HEADERS_MAP)
238
+ .filter(([key]) => options[key as keyof SecureHeadersOptions])
239
+ .map(([key, defaultValue]) => {
240
+ const overrideValue = options[key as keyof SecureHeadersOptions]
241
+ return typeof overrideValue === 'string' ? [defaultValue[0], overrideValue] : defaultValue
242
+ })
243
+ }
244
+
245
+ function getCSPDirectives(
246
+ contentSecurityPolicy: ContentSecurityPolicyOptions,
247
+ headerName: 'Content-Security-Policy' | 'Content-Security-Policy-Report-Only'
248
+ ): [SecureHeadersCallback | undefined, string | string[]] {
249
+ const callbacks: ((ctx: Context, values: string[]) => void)[] = []
250
+ const resultValues: string[] = []
251
+
252
+ for (const [directive, value] of Object.entries(contentSecurityPolicy)) {
253
+ const valueArray = Array.isArray(value) ? value : [value]
254
+
255
+ valueArray.forEach((value, i) => {
256
+ if (typeof value === 'function') {
257
+ const index = i * 2 + 2 + resultValues.length
258
+ callbacks.push((ctx, values) => {
259
+ values[index] = value(ctx, directive)
260
+ })
261
+ }
262
+ })
263
+
264
+ resultValues.push(
265
+ directive.replace(/[A-Z]+(?![a-z])|[A-Z]/g, (match, offset) =>
266
+ offset ? '-' + match.toLowerCase() : match.toLowerCase()
267
+ ),
268
+ ...valueArray.flatMap((value) => [' ', value]),
269
+ '; '
270
+ )
271
+ }
272
+ resultValues.pop()
273
+
274
+ return callbacks.length === 0
275
+ ? [undefined, resultValues.join('')]
276
+ : [
277
+ (ctx, headersToSet) =>
278
+ headersToSet.map((values) => {
279
+ if (values[0] === headerName) {
280
+ const clone = values[1].slice() as unknown as string[]
281
+ callbacks.forEach((cb) => {
282
+ cb(ctx, clone)
283
+ })
284
+ return [values[0], clone.join('')]
285
+ } else {
286
+ return values as [string, string]
287
+ }
288
+ }),
289
+ resultValues,
290
+ ]
291
+ }
292
+
293
+ function getPermissionsPolicyDirectives(policy: PermissionsPolicyOptions): string {
294
+ return Object.entries(policy)
295
+ .map(([directive, value]) => {
296
+ const kebabDirective = camelToKebab(directive)
297
+
298
+ if (typeof value === 'boolean') {
299
+ return `${kebabDirective}=${value ? '*' : '()'}`
300
+ }
301
+
302
+ if (Array.isArray(value)) {
303
+ if (value.length === 0) {
304
+ return `${kebabDirective}=()`
305
+ }
306
+ if (value.length === 1 && value[0] === '*') {
307
+ return `${kebabDirective}=*`
308
+ }
309
+ if (value.length === 1 && value[0] === 'none') {
310
+ return `${kebabDirective}=()`
311
+ }
312
+ const allowlist = value.map((item) => (['self', 'src'].includes(item) ? item : `"${item}"`))
313
+ return `${kebabDirective}=(${allowlist.join(' ')})`
314
+ }
315
+
316
+ return ''
317
+ })
318
+ .filter(Boolean)
319
+ .join(', ')
320
+ }
321
+
322
+ function camelToKebab(str: string): string {
323
+ return str.replace(/([a-z\d])([A-Z])/g, '$1-$2').toLowerCase()
324
+ }
325
+
326
+ function getReportingEndpoints(
327
+ reportingEndpoints: SecureHeadersOptions['reportingEndpoints'] = []
328
+ ): string {
329
+ return reportingEndpoints.map((endpoint) => `${endpoint.name}="${endpoint.url}"`).join(', ')
330
+ }
331
+
332
+ function getReportToOptions(reportTo: SecureHeadersOptions['reportTo'] = []): string {
333
+ return reportTo.map((option) => JSON.stringify(option)).join(', ')
334
+ }
335
+
336
+ function setHeaders(ctx: Context, headersToSet: [string, string][]) {
337
+ headersToSet.forEach(([header, value]) => {
338
+ ctx.res.headers.set(header, value)
339
+ })
340
+ }