acrylblends 0.4.0 → 0.5.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 (426) hide show
  1. package/LICENSE +73 -0
  2. package/dist/index.js +56 -2
  3. package/dist/index.js.map +1 -1
  4. package/docs/framework/LICENSE +23 -0
  5. package/docs/framework/README.md +63 -0
  6. package/docs/framework/UPSTREAM.md +3 -0
  7. package/docs/framework/agents/index.md +24 -0
  8. package/docs/framework/api/acryl.md +259 -0
  9. package/docs/framework/api/context.md +527 -0
  10. package/docs/framework/api/exception.md +80 -0
  11. package/docs/framework/api/index.md +12 -0
  12. package/docs/framework/api/presets.md +65 -0
  13. package/docs/framework/api/request.md +396 -0
  14. package/docs/framework/api/routing.md +303 -0
  15. package/docs/framework/api/summary.md +140 -0
  16. package/docs/framework/concepts/benchmarks.md +26 -0
  17. package/docs/framework/concepts/developer-experience.md +5 -0
  18. package/docs/framework/concepts/middleware.md +21 -0
  19. package/docs/framework/concepts/motivation.md +14 -0
  20. package/docs/framework/concepts/routers.md +63 -0
  21. package/docs/framework/concepts/stacks.md +235 -0
  22. package/docs/framework/concepts/web-standard.md +37 -0
  23. package/docs/framework/cordis/acryl-in-a-cordis-app.md +146 -0
  24. package/docs/framework/cordis/concepts.md +105 -0
  25. package/docs/framework/cordis/middleware.md +8 -0
  26. package/docs/framework/cordis/migration-from-0-3.md +111 -0
  27. package/docs/framework/cordis/migration-from-0-4.md +14 -0
  28. package/docs/framework/cordis/migration-from-dsh-webserver.md +103 -0
  29. package/docs/framework/cordis/mounting.md +85 -0
  30. package/docs/framework/cordis/node-server.md +75 -0
  31. package/docs/framework/cordis/plugin-lifecycle.md +111 -0
  32. package/docs/framework/cordis/surfaces.md +71 -0
  33. package/docs/framework/cordis/transport-and-cancellation.md +57 -0
  34. package/docs/framework/cordis/validation.md +135 -0
  35. package/docs/framework/getting-started/basic.md +196 -0
  36. package/docs/framework/getting-started/bun.md +221 -0
  37. package/docs/framework/getting-started/nodejs.md +344 -0
  38. package/docs/framework/getting-started/other-runtimes.md +23 -0
  39. package/docs/framework/guides/best-practices.md +231 -0
  40. package/docs/framework/guides/create-acrylblends.md +79 -0
  41. package/docs/framework/guides/examples.md +3 -0
  42. package/docs/framework/guides/faq.md +19 -0
  43. package/docs/framework/guides/helpers.md +33 -0
  44. package/docs/framework/guides/jsx-dom.md +299 -0
  45. package/docs/framework/guides/jsx.md +440 -0
  46. package/docs/framework/guides/middleware.md +253 -0
  47. package/docs/framework/guides/rpc.md +886 -0
  48. package/docs/framework/guides/testing.md +133 -0
  49. package/docs/framework/guides/validation.md +383 -0
  50. package/docs/framework/helpers/accepts.md +60 -0
  51. package/docs/framework/helpers/adapter.md +87 -0
  52. package/docs/framework/helpers/conninfo.md +112 -0
  53. package/docs/framework/helpers/cookie.md +232 -0
  54. package/docs/framework/helpers/css.md +285 -0
  55. package/docs/framework/helpers/dev.md +67 -0
  56. package/docs/framework/helpers/factory.md +180 -0
  57. package/docs/framework/helpers/html.md +123 -0
  58. package/docs/framework/helpers/jwt.md +184 -0
  59. package/docs/framework/helpers/proxy.md +118 -0
  60. package/docs/framework/helpers/route.md +143 -0
  61. package/docs/framework/helpers/ssg.md +393 -0
  62. package/docs/framework/helpers/streaming.md +119 -0
  63. package/docs/framework/helpers/testing.md +101 -0
  64. package/docs/framework/helpers/websocket.md +215 -0
  65. package/docs/framework/middleware/builtin/basic-auth.md +165 -0
  66. package/docs/framework/middleware/builtin/bearer-auth.md +138 -0
  67. package/docs/framework/middleware/builtin/body-limit.md +71 -0
  68. package/docs/framework/middleware/builtin/cache.md +122 -0
  69. package/docs/framework/middleware/builtin/combine.md +94 -0
  70. package/docs/framework/middleware/builtin/compress.md +59 -0
  71. package/docs/framework/middleware/builtin/context-storage.md +78 -0
  72. package/docs/framework/middleware/builtin/cors.md +135 -0
  73. package/docs/framework/middleware/builtin/csrf.md +105 -0
  74. package/docs/framework/middleware/builtin/etag.md +54 -0
  75. package/docs/framework/middleware/builtin/ip-restriction.md +69 -0
  76. package/docs/framework/middleware/builtin/jsx-renderer.md +286 -0
  77. package/docs/framework/middleware/builtin/jwk.md +192 -0
  78. package/docs/framework/middleware/builtin/jwt.md +145 -0
  79. package/docs/framework/middleware/builtin/language.md +232 -0
  80. package/docs/framework/middleware/builtin/logger.md +74 -0
  81. package/docs/framework/middleware/builtin/loopback-only.md +31 -0
  82. package/docs/framework/middleware/builtin/method-not-allowed.md +48 -0
  83. package/docs/framework/middleware/builtin/method-override.md +80 -0
  84. package/docs/framework/middleware/builtin/mount.md +106 -0
  85. package/docs/framework/middleware/builtin/pretty-json.md +53 -0
  86. package/docs/framework/middleware/builtin/request-id.md +94 -0
  87. package/docs/framework/middleware/builtin/secure-headers.md +247 -0
  88. package/docs/framework/middleware/builtin/timeout.md +98 -0
  89. package/docs/framework/middleware/builtin/timing.md +101 -0
  90. package/docs/framework/middleware/builtin/trailing-slash.md +74 -0
  91. package/docs/framework/middleware/third-party.md +4 -0
  92. package/docs/framework/upstream.json +9 -0
  93. package/lib/accepts-XBuZPVRI.js +52 -0
  94. package/lib/accepts.d.ts +33 -0
  95. package/lib/accepts.js +2 -0
  96. package/lib/acryl-base.d.ts +2 -0
  97. package/lib/acryl-base.js +332 -0
  98. package/lib/adapter.d.ts +12 -0
  99. package/lib/adapter.js +37 -0
  100. package/lib/app-BM0rTCp7.js +26 -0
  101. package/lib/app-CmAYW1Al.d.ts +21 -0
  102. package/lib/basic-auth.d.ts +72 -0
  103. package/lib/basic-auth.js +95 -0
  104. package/lib/bearer-auth.d.ts +89 -0
  105. package/lib/bearer-auth.js +94 -0
  106. package/lib/body-limit.d.ts +42 -0
  107. package/lib/body-limit.js +66 -0
  108. package/lib/client-BHTr318g.js +266 -0
  109. package/lib/client.d.ts +3 -0
  110. package/lib/client.js +2 -0
  111. package/lib/combine.d.ts +85 -0
  112. package/lib/combine.js +137 -0
  113. package/lib/compose-BuW2B6PZ.js +50 -0
  114. package/lib/compress.d.ts +38 -0
  115. package/lib/compress.js +79 -0
  116. package/lib/connection-C7xgP1hP.js +24 -0
  117. package/lib/conninfo.d.ts +25 -0
  118. package/lib/conninfo.js +2 -0
  119. package/lib/constants-Dy7ZvN1H.js +4 -0
  120. package/lib/context-Bm7rI-oK.d.ts +1234 -0
  121. package/lib/context-DDO0cfuP.js +365 -0
  122. package/lib/context-storage.d.ts +38 -0
  123. package/lib/context-storage.js +52 -0
  124. package/lib/cookie-ClMaKDQf.d.ts +40 -0
  125. package/lib/cookie.d.ts +24 -0
  126. package/lib/cookie.js +82 -0
  127. package/lib/cors.d.ts +52 -0
  128. package/lib/cors.js +106 -0
  129. package/lib/csrf.d.ts +75 -0
  130. package/lib/csrf.js +101 -0
  131. package/lib/etag.d.ts +40 -0
  132. package/lib/etag.js +135 -0
  133. package/lib/factory.d.ts +35 -0
  134. package/lib/factory.js +30 -0
  135. package/lib/headers-tu2YYN8T.d.ts +11 -0
  136. package/lib/html.d.ts +6 -0
  137. package/lib/html.js +31 -0
  138. package/lib/http-exception.d.ts +57 -0
  139. package/lib/http-exception.js +54 -0
  140. package/lib/http-status-DaAwGAFL.d.ts +35 -0
  141. package/lib/index-B-3F4wt2.d.ts +12 -0
  142. package/lib/index-UTBmM3GX.d.ts +68 -0
  143. package/lib/index-oOClm_Xk.d.ts +45 -0
  144. package/lib/index.d.ts +5 -0
  145. package/lib/index.js +28 -0
  146. package/lib/ip-restriction.d.ts +68 -0
  147. package/lib/ip-restriction.js +166 -0
  148. package/lib/jwk.d.ts +52 -0
  149. package/lib/jwk.js +117 -0
  150. package/lib/jwt-BGJBw5AF.js +403 -0
  151. package/lib/jwt-Dg493Tai.d.ts +51 -0
  152. package/lib/jwt.d.ts +72 -0
  153. package/lib/jwt.js +115 -0
  154. package/lib/language.d.ts +88 -0
  155. package/lib/language.js +198 -0
  156. package/lib/logger.d.ts +22 -0
  157. package/lib/logger.js +54 -0
  158. package/lib/loopback-only.d.ts +45 -0
  159. package/lib/loopback-only.js +90 -0
  160. package/lib/method-not-allowed.d.ts +47 -0
  161. package/lib/method-not-allowed.js +82 -0
  162. package/lib/method-override.d.ts +46 -0
  163. package/lib/method-override.js +103 -0
  164. package/lib/mime-BQOYHl-l.d.ts +72 -0
  165. package/lib/node-server/conninfo.d.ts +11 -0
  166. package/lib/node-server/conninfo.js +19 -0
  167. package/lib/node-server/serve-static.d.ts +19 -0
  168. package/lib/node-server/serve-static.js +2 -0
  169. package/lib/node-server.d.ts +103 -0
  170. package/lib/node-server.js +1325 -0
  171. package/lib/powered-by.d.ts +28 -0
  172. package/lib/powered-by.js +24 -0
  173. package/lib/pretty-json.d.ts +40 -0
  174. package/lib/pretty-json.js +39 -0
  175. package/lib/reg-exp-router-DC1R3qoY.js +363 -0
  176. package/lib/request-id.d.ts +45 -0
  177. package/lib/request-id.js +34 -0
  178. package/lib/request.d.ts +2 -0
  179. package/lib/request.js +323 -0
  180. package/lib/route.d.ts +78 -0
  181. package/lib/route.js +126 -0
  182. package/lib/router/linear-router.d.ts +11 -0
  183. package/lib/router/linear-router.js +96 -0
  184. package/lib/router/pattern-router.d.ts +11 -0
  185. package/lib/router/pattern-router.js +41 -0
  186. package/lib/router/reg-exp-router.d.ts +35 -0
  187. package/lib/router/reg-exp-router.js +2 -0
  188. package/lib/router/smart-router.d.ts +15 -0
  189. package/lib/router/smart-router.js +2 -0
  190. package/lib/router/trie-router.d.ts +11 -0
  191. package/lib/router/trie-router.js +2 -0
  192. package/lib/router-CvUxUTOq.d.ts +99 -0
  193. package/lib/router.d.ts +2 -0
  194. package/lib/router.js +35 -0
  195. package/lib/schema-validator.d.ts +28 -0
  196. package/lib/schema-validator.js +22 -0
  197. package/lib/secure-headers.d.ts +125 -0
  198. package/lib/secure-headers.js +163 -0
  199. package/lib/serve-static-Dw_m6KxR.js +213 -0
  200. package/lib/serve-static.d.ts +31 -0
  201. package/lib/serve-static.js +77 -0
  202. package/lib/smart-router-C5CZ5XSM.js +49 -0
  203. package/lib/stream-CPdqZ0Fp.d.ts +34 -0
  204. package/lib/streaming-DHST3Scg.js +96 -0
  205. package/lib/streaming.d.ts +23 -0
  206. package/lib/streaming.js +2 -0
  207. package/lib/testing.d.ts +10 -0
  208. package/lib/testing.js +17 -0
  209. package/lib/timeout.d.ts +30 -0
  210. package/lib/timeout.js +42 -0
  211. package/lib/timing.d.ts +130 -0
  212. package/lib/timing.js +183 -0
  213. package/lib/trailing-slash.d.ts +91 -0
  214. package/lib/trailing-slash.js +85 -0
  215. package/lib/trie-router-CfFbapzL.js +146 -0
  216. package/lib/types-CDO6I3B0.d.ts +40 -0
  217. package/lib/types-CHesD1KG.d.ts +195 -0
  218. package/lib/types-CwrQjlaM.d.ts +105 -0
  219. package/lib/types-DR95J00T.d.ts +29 -0
  220. package/lib/types.d.ts +2 -0
  221. package/lib/types.js +4 -0
  222. package/lib/utils/accept.d.ts +9 -0
  223. package/lib/utils/accept.js +193 -0
  224. package/lib/utils/basic-auth.d.ts +8 -0
  225. package/lib/utils/basic-auth.js +20 -0
  226. package/lib/utils/body.d.ts +2 -0
  227. package/lib/utils/body.js +94 -0
  228. package/lib/utils/buffer.d.ts +19 -0
  229. package/lib/utils/buffer.js +51 -0
  230. package/lib/utils/color.d.ts +24 -0
  231. package/lib/utils/color.js +37 -0
  232. package/lib/utils/compress.d.ts +11 -0
  233. package/lib/utils/compress.js +11 -0
  234. package/lib/utils/concurrent.d.ts +17 -0
  235. package/lib/utils/concurrent.js +30 -0
  236. package/lib/utils/constants.d.ts +7 -0
  237. package/lib/utils/constants.js +7 -0
  238. package/lib/utils/cookie.d.ts +2 -0
  239. package/lib/utils/cookie.js +125 -0
  240. package/lib/utils/crypto.d.ts +14 -0
  241. package/lib/utils/crypto.js +34 -0
  242. package/lib/utils/encode.d.ts +11 -0
  243. package/lib/utils/encode.js +33 -0
  244. package/lib/utils/filepath.d.ts +14 -0
  245. package/lib/utils/filepath.js +25 -0
  246. package/lib/utils/handler.d.ts +9 -0
  247. package/lib/utils/handler.js +12 -0
  248. package/lib/utils/headers.d.ts +2 -0
  249. package/lib/utils/headers.js +1 -0
  250. package/lib/utils/html.d.ts +46 -0
  251. package/lib/utils/html.js +103 -0
  252. package/lib/utils/http-status.d.ts +2 -0
  253. package/lib/utils/http-status.js +1 -0
  254. package/lib/utils/ipaddr.d.ts +56 -0
  255. package/lib/utils/ipaddr.js +238 -0
  256. package/lib/utils/jwt.d.ts +24 -0
  257. package/lib/utils/jwt.js +2 -0
  258. package/lib/utils/mime.d.ts +2 -0
  259. package/lib/utils/mime.js +77 -0
  260. package/lib/utils/stream.d.ts +2 -0
  261. package/lib/utils/stream.js +88 -0
  262. package/lib/utils/types.d.ts +2 -0
  263. package/lib/utils/types.js +1 -0
  264. package/lib/utils/url.d.ts +46 -0
  265. package/lib/utils/url.js +197 -0
  266. package/lib/utils-dw8lxqjL.js +4 -0
  267. package/lib/validator-D84mq-dO.js +65 -0
  268. package/lib/validator.d.ts +42 -0
  269. package/lib/validator.js +2 -0
  270. package/lib/ws.d.ts +2 -0
  271. package/lib/ws.js +53 -0
  272. package/package.json +315 -15
  273. package/plugins/acryl-inspect/src/report.ts +15 -10
  274. package/plugins/acryl-inspect/src/service.ts +2 -2
  275. package/plugins/acryl-inspect/tests/report.spec.ts +9 -3
  276. package/plugins/acryl-inspect/tests/service.spec.ts +3 -3
  277. package/plugins/acryl-inspect/upstream.json +2 -2
  278. package/plugins/acryl-node-server/tests/adapter/app.ts +2 -2
  279. package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +1 -1
  280. package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +1 -1
  281. package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +2 -2
  282. package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +4 -4
  283. package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +5 -5
  284. package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +2 -2
  285. package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +20 -20
  286. package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +2 -2
  287. package/plugins/acryl-node-server/tests/adapter/server.test.ts +50 -50
  288. package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +4 -4
  289. package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +9 -9
  290. package/plugins/acryl-node-server/tests/server.spec.ts +6 -6
  291. package/plugins/acryl-node-server/upstream.json +2 -2
  292. package/plugins/acryl-router/src/client.ts +1 -1
  293. package/plugins/acryl-router/src/connection.ts +2 -2
  294. package/plugins/acryl-router/src/core/app-base.ts +29 -29
  295. package/plugins/acryl-router/src/core/app.test.ts +175 -175
  296. package/plugins/acryl-router/src/core/app.ts +8 -8
  297. package/plugins/acryl-router/src/core/client/client.test.ts +76 -76
  298. package/plugins/acryl-router/src/core/client/client.ts +2 -2
  299. package/plugins/acryl-router/src/core/client/fetch-result-please.ts +1 -1
  300. package/plugins/acryl-router/src/core/client/index.ts +1 -1
  301. package/plugins/acryl-router/src/core/client/types.test.ts +6 -6
  302. package/plugins/acryl-router/src/core/client/types.ts +16 -16
  303. package/plugins/acryl-router/src/core/client/utils.test.ts +2 -2
  304. package/plugins/acryl-router/src/core/context.test.ts +4 -4
  305. package/plugins/acryl-router/src/core/context.ts +6 -6
  306. package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +3 -3
  307. package/plugins/acryl-router/src/core/helper/accepts/index.ts +1 -1
  308. package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +6 -6
  309. package/plugins/acryl-router/src/core/helper/adapter/index.ts +1 -1
  310. package/plugins/acryl-router/src/core/helper/conninfo/index.ts +1 -1
  311. package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +8 -8
  312. package/plugins/acryl-router/src/core/helper/cookie/index.ts +1 -1
  313. package/plugins/acryl-router/src/core/helper/factory/index.test.ts +9 -9
  314. package/plugins/acryl-router/src/core/helper/factory/index.ts +10 -10
  315. package/plugins/acryl-router/src/core/helper/html/index.test.ts +4 -4
  316. package/plugins/acryl-router/src/core/helper/html/index.ts +1 -1
  317. package/plugins/acryl-router/src/core/helper/route/index.test.ts +7 -7
  318. package/plugins/acryl-router/src/core/helper/route/index.ts +8 -8
  319. package/plugins/acryl-router/src/core/helper/streaming/index.ts +1 -1
  320. package/plugins/acryl-router/src/core/helper/testing/index.test.ts +6 -6
  321. package/plugins/acryl-router/src/core/helper/testing/index.ts +4 -4
  322. package/plugins/acryl-router/src/core/helper/websocket/index.ts +2 -1
  323. package/plugins/acryl-router/src/core/http-exception.ts +1 -1
  324. package/plugins/acryl-router/src/core/index.ts +9 -9
  325. package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +6 -6
  326. package/plugins/acryl-router/src/core/middleware/basic-auth/index.ts +3 -3
  327. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +5 -5
  328. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.ts +3 -3
  329. package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +6 -6
  330. package/plugins/acryl-router/src/core/middleware/body-limit/index.ts +3 -3
  331. package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +9 -9
  332. package/plugins/acryl-router/src/core/middleware/combine/index.ts +7 -7
  333. package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +9 -9
  334. package/plugins/acryl-router/src/core/middleware/compress/index.ts +3 -3
  335. package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +5 -5
  336. package/plugins/acryl-router/src/core/middleware/context-storage/index.ts +4 -4
  337. package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +7 -7
  338. package/plugins/acryl-router/src/core/middleware/cors/index.ts +3 -3
  339. package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +10 -10
  340. package/plugins/acryl-router/src/core/middleware/csrf/index.ts +3 -3
  341. package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +42 -42
  342. package/plugins/acryl-router/src/core/middleware/etag/index.ts +4 -4
  343. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +4 -4
  344. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.ts +6 -6
  345. package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +16 -16
  346. package/plugins/acryl-router/src/core/middleware/jwk/jwk.ts +7 -6
  347. package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +16 -16
  348. package/plugins/acryl-router/src/core/middleware/jwt/jwt.ts +4 -3
  349. package/plugins/acryl-router/src/core/middleware/language/index.test.ts +3 -3
  350. package/plugins/acryl-router/src/core/middleware/language/language.ts +3 -3
  351. package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +5 -5
  352. package/plugins/acryl-router/src/core/middleware/logger/index.ts +4 -4
  353. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +24 -24
  354. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.ts +8 -8
  355. package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +5 -5
  356. package/plugins/acryl-router/src/core/middleware/method-override/index.ts +6 -6
  357. package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +4 -4
  358. package/plugins/acryl-router/src/core/middleware/powered-by/index.ts +6 -6
  359. package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +30 -30
  360. package/plugins/acryl-router/src/core/middleware/pretty-json/index.ts +4 -4
  361. package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +15 -15
  362. package/plugins/acryl-router/src/core/middleware/request-id/request-id.ts +3 -3
  363. package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +35 -35
  364. package/plugins/acryl-router/src/core/middleware/secure-headers/secure-headers.ts +3 -3
  365. package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +23 -23
  366. package/plugins/acryl-router/src/core/middleware/serve-static/index.ts +1 -1
  367. package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +2 -2
  368. package/plugins/acryl-router/src/core/middleware/timeout/index.ts +3 -3
  369. package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +14 -14
  370. package/plugins/acryl-router/src/core/middleware/timing/timing.ts +3 -3
  371. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +7 -7
  372. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.ts +7 -7
  373. package/plugins/acryl-router/src/core/request.test.ts +42 -42
  374. package/plugins/acryl-router/src/core/request.ts +6 -6
  375. package/plugins/acryl-router/src/core/router/linear-router/index.ts +1 -1
  376. package/plugins/acryl-router/src/core/router/pattern-router/index.ts +1 -1
  377. package/plugins/acryl-router/src/core/router/reg-exp-router/index.ts +1 -1
  378. package/plugins/acryl-router/src/core/router/smart-router/index.ts +1 -1
  379. package/plugins/acryl-router/src/core/router/trie-router/index.ts +1 -1
  380. package/plugins/acryl-router/src/core/types.test.ts +115 -115
  381. package/plugins/acryl-router/src/core/types.ts +72 -72
  382. package/plugins/acryl-router/src/core/utils/body.ts +8 -8
  383. package/plugins/acryl-router/src/core/utils/html.ts +1 -1
  384. package/plugins/acryl-router/src/core/utils/jwt/jws.ts +3 -3
  385. package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +2 -2
  386. package/plugins/acryl-router/src/core/utils/jwt/jwt.ts +3 -3
  387. package/plugins/acryl-router/src/core/utils/jwt/types.ts +1 -1
  388. package/plugins/acryl-router/src/core/utils/types.ts +42 -0
  389. package/plugins/acryl-router/src/core/utils/url.test.ts +2 -2
  390. package/plugins/acryl-router/src/core/validator/index.ts +1 -1
  391. package/plugins/acryl-router/src/core/validator/validator.test.ts +28 -28
  392. package/plugins/acryl-router/src/deprecated.ts +15 -0
  393. package/plugins/acryl-router/src/index.ts +3 -2
  394. package/plugins/acryl-router/src/middleware/index.ts +1 -1
  395. package/plugins/acryl-router/src/middleware/loopback-only.ts +34 -1
  396. package/plugins/acryl-router/src/service.ts +19 -13
  397. package/plugins/acryl-router/tests/docs-examples.spec.ts +11 -11
  398. package/plugins/acryl-router/tests/live-install.spec.ts +2 -2
  399. package/plugins/acryl-router/tests/loader.spec.ts +3 -3
  400. package/plugins/acryl-router/tests/loopback-only.spec.ts +80 -0
  401. package/plugins/acryl-router/tests/no-dom/consumer.ts +11 -0
  402. package/plugins/acryl-router/tests/no-dom/tsconfig.json +13 -0
  403. package/plugins/acryl-router/tests/service.spec.ts +39 -22
  404. package/plugins/acryl-router/upstream.json +3 -3
  405. package/plugins/acryl-router-http/tests/adapter.spec.ts +3 -3
  406. package/plugins/acryl-router-http/tests/surfaces.spec.ts +2 -2
  407. package/plugins/acryl-router-http/upstream.json +2 -2
  408. package/plugins/acryl-state/src/service.ts +2 -2
  409. package/plugins/acryl-state/upstream.json +2 -2
  410. package/plugins/builder/script.ts +3 -3
  411. package/plugins/extensions/index.ts +4 -3
  412. package/plugins/extensions/resolve.ts +70 -10
  413. package/plugins/openai/prompt.ts +7 -7
  414. package/shared/AGENTS.core.md +61 -0
  415. package/templates/agent/AGENTS.md +6 -0
  416. package/templates/agent/README.md +2 -2
  417. package/templates/agent/blend.yaml +1 -1
  418. package/templates/agent/src/routes.ts +2 -2
  419. package/templates/agent/test/model.test.ts +2 -2
  420. package/templates/agent/tsconfig.json +40 -0
  421. package/templates/blank/AGENTS.md +5 -0
  422. package/templates/blank/README.md +1 -1
  423. package/templates/blank/src/routes.ts +2 -2
  424. package/templates/todo/AGENTS.md +5 -0
  425. package/templates/todo/src/todo.ts +6 -4
  426. package/templates/todo/upstream.json +2 -2
@@ -0,0 +1,35 @@
1
+ import { a as ParamIndexMap, c as Result, l as Router } from "../router-CvUxUTOq.js";
2
+
3
+ //#region ../../plugins/acryl-router/src/core/router/reg-exp-router/matcher.d.ts
4
+ type HandlerData<T> = [T, ParamIndexMap][];
5
+ type StaticMap<T> = Record<string, Result<T>>;
6
+ type Matcher<T> = [RegExp, HandlerData<T>[], StaticMap<T>];
7
+ type MatcherMap<T> = Record<string, Matcher<T> | null>;
8
+ declare function match<R extends Router<T>, T>(this: R, method: string, path: string): Result<T>;
9
+ //#endregion
10
+ //#region ../../plugins/acryl-router/src/core/router/reg-exp-router/router.d.ts
11
+ declare class RegExpRouter<T> implements Router<T> {
12
+ #private;
13
+ name: string;
14
+ constructor();
15
+ add(method: string, path: string, handler: T): void;
16
+ match: typeof match<Router<T>, T>;
17
+ protected buildAllMatchers(): MatcherMap<T>;
18
+ }
19
+ //#endregion
20
+ //#region ../../plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.d.ts
21
+ type RelocateMap = Record<string, ([(number | string)[], ParamIndexMap] | [(number | string)[]])[]>;
22
+ declare class PreparedRegExpRouter<T> implements Router<T> {
23
+ #private;
24
+ name: string;
25
+ constructor(matchers: MatcherMap<T>, relocateMap: RelocateMap);
26
+ add(method: string, path: string, handler: T): void;
27
+ protected buildAllMatchers(): MatcherMap<T>;
28
+ match: typeof match<Router<T>, T>;
29
+ }
30
+ declare const buildInitParams: (params: {
31
+ paths: string[];
32
+ }) => ConstructorParameters<typeof PreparedRegExpRouter>;
33
+ declare const serializeInitParams: (params: ConstructorParameters<typeof PreparedRegExpRouter>) => string;
34
+ //#endregion
35
+ export { PreparedRegExpRouter, RegExpRouter, buildInitParams, serializeInitParams };
@@ -0,0 +1,2 @@
1
+ import { i as RegExpRouter, n as buildInitParams, r as serializeInitParams, t as PreparedRegExpRouter } from "../reg-exp-router-DC1R3qoY.js";
2
+ export { PreparedRegExpRouter, RegExpRouter, buildInitParams, serializeInitParams };
@@ -0,0 +1,15 @@
1
+ import { c as Result, l as Router } from "../router-CvUxUTOq.js";
2
+
3
+ //#region ../../plugins/acryl-router/src/core/router/smart-router/router.d.ts
4
+ declare class SmartRouter<T> implements Router<T> {
5
+ #private;
6
+ name: string;
7
+ constructor(init: {
8
+ routers: Router<T>[];
9
+ });
10
+ add(method: string, path: string, handler: T): void;
11
+ match(method: string, path: string): Result<T>;
12
+ get activeRouter(): Router<T>;
13
+ }
14
+ //#endregion
15
+ export { SmartRouter };
@@ -0,0 +1,2 @@
1
+ import { t as SmartRouter } from "../smart-router-C5CZ5XSM.js";
2
+ export { SmartRouter };
@@ -0,0 +1,11 @@
1
+ import { c as Result, l as Router } from "../router-CvUxUTOq.js";
2
+
3
+ //#region ../../plugins/acryl-router/src/core/router/trie-router/router.d.ts
4
+ declare class TrieRouter<T> implements Router<T> {
5
+ #private;
6
+ name: string;
7
+ add(method: string, path: string, handler: T): void;
8
+ match(method: string, path: string): Result<T>;
9
+ }
10
+ //#endregion
11
+ export { TrieRouter };
@@ -0,0 +1,2 @@
1
+ import { t as TrieRouter } from "../trie-router-CfFbapzL.js";
2
+ export { TrieRouter };
@@ -0,0 +1,99 @@
1
+ //#region ../../plugins/acryl-router/src/core/router.d.ts
2
+ /**
3
+ * @module
4
+ * This module provides types definitions and variables for the routers.
5
+ */
6
+ /**
7
+ * Constant representing all HTTP methods in uppercase.
8
+ */
9
+ declare const METHOD_NAME_ALL: "ALL";
10
+ /**
11
+ * Constant representing all HTTP methods in lowercase.
12
+ */
13
+ declare const METHOD_NAME_ALL_LOWERCASE: "all";
14
+ /**
15
+ * Array of supported HTTP methods.
16
+ */
17
+ declare const METHODS: readonly ["get", "post", "put", "delete", "options", "patch", "query"];
18
+ /**
19
+ * Error message indicating that a route cannot be added because the matcher is already built.
20
+ */
21
+ declare const MESSAGE_MATCHER_IS_ALREADY_BUILT = "Can not add a route since the matcher is already built.";
22
+ /**
23
+ * Interface representing a router.
24
+ *
25
+ * @template T - The type of the handler.
26
+ */
27
+ interface Router<T> {
28
+ /**
29
+ * The name of the router.
30
+ */
31
+ name: string;
32
+ /**
33
+ * Adds a route to the router.
34
+ *
35
+ * @param method - The HTTP method (e.g., 'get', 'post').
36
+ * @param path - The path for the route.
37
+ * @param handler - The handler for the route.
38
+ */
39
+ add(method: string, path: string, handler: T): void;
40
+ /**
41
+ * Matches a route based on the given method and path.
42
+ *
43
+ * @param method - The HTTP method (e.g., 'get', 'post').
44
+ * @param path - The path to match.
45
+ * @returns The result of the match.
46
+ */
47
+ match(method: string, path: string): Result<T>;
48
+ }
49
+ /**
50
+ * Type representing a map of parameter indices.
51
+ */
52
+ type ParamIndexMap = Record<string, number>;
53
+ /**
54
+ * Type representing a stash of parameters.
55
+ */
56
+ type ParamStash = string[];
57
+ /**
58
+ * Type representing a map of parameters.
59
+ */
60
+ type Params = Record<string, string>;
61
+ /**
62
+ * Type representing the result of a route match.
63
+ *
64
+ * The result can be in one of two formats:
65
+ * 1. An array of handlers with their corresponding parameter index maps, followed by a parameter stash.
66
+ * 2. An array of handlers with their corresponding parameter maps.
67
+ *
68
+ * Example:
69
+ *
70
+ * [[handler, paramIndexMap][], paramArray]
71
+ * ```typescript
72
+ * [
73
+ * [
74
+ * [middlewareA, {}], // '*'
75
+ * [funcA, {'id': 0}], // '/user/:id/*'
76
+ * [funcB, {'id': 0, 'action': 1}], // '/user/:id/:action'
77
+ * ],
78
+ * ['123', 'abc']
79
+ * ]
80
+ * ```
81
+ *
82
+ * [[handler, params][]]
83
+ * ```typescript
84
+ * [
85
+ * [
86
+ * [middlewareA, {}], // '*'
87
+ * [funcA, {'id': '123'}], // '/user/:id/*'
88
+ * [funcB, {'id': '123', 'action': 'abc'}], // '/user/:id/:action'
89
+ * ]
90
+ * ]
91
+ * ```
92
+ */
93
+ type Result<T> = [[T, ParamIndexMap][], ParamStash] | [[T, Params][]];
94
+ /**
95
+ * Error class representing an unsupported path error.
96
+ */
97
+ declare class UnsupportedPathError extends Error {}
98
+ //#endregion
99
+ export { ParamIndexMap as a, Result as c, METHOD_NAME_ALL_LOWERCASE as i, Router as l, METHODS as n, ParamStash as o, METHOD_NAME_ALL as r, Params as s, MESSAGE_MATCHER_IS_ALREADY_BUILT as t, UnsupportedPathError as u };
@@ -0,0 +1,2 @@
1
+ import { a as ParamIndexMap, c as Result, i as METHOD_NAME_ALL_LOWERCASE, l as Router, n as METHODS, o as ParamStash, r as METHOD_NAME_ALL, s as Params, t as MESSAGE_MATCHER_IS_ALREADY_BUILT, u as UnsupportedPathError } from "./router-CvUxUTOq.js";
2
+ export { MESSAGE_MATCHER_IS_ALREADY_BUILT, METHODS, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE, ParamIndexMap, ParamStash, Params, Result, Router, UnsupportedPathError };
package/lib/router.js ADDED
@@ -0,0 +1,35 @@
1
+ //#region ../../plugins/acryl-router/src/core/router.ts
2
+ /**
3
+ * @module
4
+ * This module provides types definitions and variables for the routers.
5
+ */
6
+ /**
7
+ * Constant representing all HTTP methods in uppercase.
8
+ */
9
+ const METHOD_NAME_ALL = "ALL";
10
+ /**
11
+ * Constant representing all HTTP methods in lowercase.
12
+ */
13
+ const METHOD_NAME_ALL_LOWERCASE = "all";
14
+ /**
15
+ * Array of supported HTTP methods.
16
+ */
17
+ const METHODS = [
18
+ "get",
19
+ "post",
20
+ "put",
21
+ "delete",
22
+ "options",
23
+ "patch",
24
+ "query"
25
+ ];
26
+ /**
27
+ * Error message indicating that a route cannot be added because the matcher is already built.
28
+ */
29
+ const MESSAGE_MATCHER_IS_ALREADY_BUILT = "Can not add a route since the matcher is already built.";
30
+ /**
31
+ * Error class representing an unsupported path error.
32
+ */
33
+ var UnsupportedPathError = class extends Error {};
34
+ //#endregion
35
+ export { MESSAGE_MATCHER_IS_ALREADY_BUILT, METHODS, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE, UnsupportedPathError };
@@ -0,0 +1,28 @@
1
+ import { I as MiddlewareHandler, Z as ValidationTargets, _ as Env } from "./context-Bm7rI-oK.js";
2
+
3
+ //#region ../../plugins/acryl-router/src/helpers/schema-validator.d.ts
4
+ /** The slice of the Standard Schema interface this needs; Schemastery (what Cordis uses), Zod and Valibot all implement it. */
5
+ interface StandardSchema<T = unknown> {
6
+ readonly '~standard': {
7
+ validate(value: unknown): StandardResult<T> | Promise<StandardResult<T>>;
8
+ };
9
+ }
10
+ type StandardResult<T> = {
11
+ readonly value: T;
12
+ readonly issues?: undefined;
13
+ } | {
14
+ readonly issues: readonly {
15
+ readonly message: string;
16
+ readonly path?: readonly unknown[] | undefined;
17
+ }[];
18
+ };
19
+ /**
20
+ * The core `validator` driven by a Standard Schema. A failure answers 400 with `{ error, issues }`; success makes the parsed value the
21
+ * handler's `c.req.valid(target)`, typed by the schema.
22
+ */
23
+ declare function schemaValidator<Target extends keyof ValidationTargets, Out, E extends Env = Env, P extends string = string>(target: Target, schema: StandardSchema<Out>): MiddlewareHandler<E, P, {
24
+ in: { [K in Target]: Out };
25
+ out: { [K in Target]: Out };
26
+ }>;
27
+ //#endregion
28
+ export { StandardSchema, schemaValidator };
@@ -0,0 +1,22 @@
1
+ import { t as validator } from "./validator-D84mq-dO.js";
2
+ //#region ../../plugins/acryl-router/src/helpers/schema-validator.ts
3
+ const pathOf = (path) => (path ?? []).map((part) => String(typeof part === "object" && part !== null && "key" in part ? part.key : part)).join(".");
4
+ /**
5
+ * The core `validator` driven by a Standard Schema. A failure answers 400 with `{ error, issues }`; success makes the parsed value the
6
+ * handler's `c.req.valid(target)`, typed by the schema.
7
+ */
8
+ function schemaValidator(target, schema) {
9
+ return validator(target, async (value, c) => {
10
+ const result = await schema["~standard"].validate(value);
11
+ if (result.issues !== void 0) return c.json({
12
+ error: `invalid ${target}`,
13
+ issues: result.issues.map((issue) => ({
14
+ message: issue.message,
15
+ path: pathOf(issue.path)
16
+ }))
17
+ }, 400);
18
+ return result.value;
19
+ });
20
+ }
21
+ //#endregion
22
+ export { schemaValidator };
@@ -0,0 +1,125 @@
1
+ import { I as MiddlewareHandler, t as Context } from "./context-Bm7rI-oK.js";
2
+
3
+ //#region ../../plugins/acryl-router/src/core/middleware/secure-headers/permissions-policy.d.ts
4
+ type PermissionsPolicyDirective = StandardizedFeatures | ProposedFeatures | ExperimentalFeatures;
5
+ /**
6
+ * These features have been declared in a published version of the respective specification.
7
+ */
8
+ type StandardizedFeatures = 'accelerometer' | 'ambientLightSensor' | 'attributionReporting' | 'autoplay' | 'battery' | 'bluetooth' | 'camera' | 'chUa' | 'chUaArch' | 'chUaBitness' | 'chUaFullVersion' | 'chUaFullVersionList' | 'chUaHighEntropyValues' | 'chUaMobile' | 'chUaModel' | 'chUaPlatform' | 'chUaPlatformVersion' | 'chUaWow64' | 'computePressure' | 'crossOriginIsolated' | 'directSockets' | 'displayCapture' | 'encryptedMedia' | 'executionWhileNotRendered' | 'executionWhileOutOfViewport' | 'fullscreen' | 'geolocation' | 'gyroscope' | 'hid' | 'identityCredentialsGet' | 'idleDetection' | 'keyboardMap' | 'magnetometer' | 'mediasession' | 'microphone' | 'midi' | 'navigationOverride' | 'otpCredentials' | 'payment' | 'pictureInPicture' | 'publickeyCredentialsGet' | 'screenWakeLock' | 'serial' | 'storageAccess' | 'syncXhr' | 'tools' | 'usb' | 'webShare' | 'windowManagement' | 'xrSpatialTracking';
9
+ /**
10
+ * These features have been proposed, but the definitions have not yet been integrated into their respective specs.
11
+ */
12
+ type ProposedFeatures = 'autofill' | 'clipboardRead' | 'clipboardWrite' | 'deferredFetch' | 'gamepad' | 'languageDetector' | 'languageModel' | 'manualText' | 'rewriter' | 'sharedAutofill' | 'speakerSelection' | 'summarizer' | 'translator' | 'writer';
13
+ /**
14
+ * These features generally have an explainer only, but may be available for experimentation by web developers.
15
+ */
16
+ type ExperimentalFeatures = 'allScreensCapture' | 'browsingTopics' | 'capturedSurfaceControl' | 'conversionMeasurement' | 'digitalCredentialsCreate' | 'digitalCredentialsGet' | 'focusWithoutUserActivation' | 'joinAdInterestGroup' | 'localFonts' | 'monetization' | 'runAdAuction' | 'smartCard' | 'syncScript' | 'trustTokenRedemption' | 'unload' | 'verticalScroll';
17
+ //#endregion
18
+ //#region ../../plugins/acryl-router/src/core/middleware/secure-headers/secure-headers.d.ts
19
+ type SecureHeadersVariables = {
20
+ secureHeadersNonce?: string;
21
+ };
22
+ type ContentSecurityPolicyOptionHandler = (ctx: Context, directive: string) => string;
23
+ type ContentSecurityPolicyOptionValue = (string | ContentSecurityPolicyOptionHandler)[];
24
+ interface ContentSecurityPolicyOptions {
25
+ defaultSrc?: ContentSecurityPolicyOptionValue;
26
+ baseUri?: ContentSecurityPolicyOptionValue;
27
+ childSrc?: ContentSecurityPolicyOptionValue;
28
+ connectSrc?: ContentSecurityPolicyOptionValue;
29
+ fontSrc?: ContentSecurityPolicyOptionValue;
30
+ formAction?: ContentSecurityPolicyOptionValue;
31
+ frameAncestors?: ContentSecurityPolicyOptionValue;
32
+ frameSrc?: ContentSecurityPolicyOptionValue;
33
+ imgSrc?: ContentSecurityPolicyOptionValue;
34
+ manifestSrc?: ContentSecurityPolicyOptionValue;
35
+ mediaSrc?: ContentSecurityPolicyOptionValue;
36
+ objectSrc?: ContentSecurityPolicyOptionValue;
37
+ reportTo?: string;
38
+ reportUri?: string | string[];
39
+ sandbox?: ContentSecurityPolicyOptionValue;
40
+ scriptSrc?: ContentSecurityPolicyOptionValue;
41
+ scriptSrcAttr?: ContentSecurityPolicyOptionValue;
42
+ scriptSrcElem?: ContentSecurityPolicyOptionValue;
43
+ styleSrc?: ContentSecurityPolicyOptionValue;
44
+ styleSrcAttr?: ContentSecurityPolicyOptionValue;
45
+ styleSrcElem?: ContentSecurityPolicyOptionValue;
46
+ upgradeInsecureRequests?: ContentSecurityPolicyOptionValue;
47
+ workerSrc?: ContentSecurityPolicyOptionValue;
48
+ requireTrustedTypesFor?: ContentSecurityPolicyOptionValue;
49
+ trustedTypes?: ContentSecurityPolicyOptionValue;
50
+ }
51
+ interface ReportToOptions {
52
+ group: string;
53
+ max_age: number;
54
+ endpoints: ReportToEndpoint[];
55
+ }
56
+ interface ReportToEndpoint {
57
+ url: string;
58
+ }
59
+ interface ReportingEndpointOptions {
60
+ name: string;
61
+ url: string;
62
+ }
63
+ type PermissionsPolicyValue = '*' | 'self' | 'src' | 'none' | string;
64
+ type PermissionsPolicyOptions = Partial<Record<PermissionsPolicyDirective, PermissionsPolicyValue[] | boolean>>;
65
+ type overridableHeader = boolean | string;
66
+ interface SecureHeadersOptions {
67
+ contentSecurityPolicy?: ContentSecurityPolicyOptions;
68
+ contentSecurityPolicyReportOnly?: ContentSecurityPolicyOptions;
69
+ crossOriginEmbedderPolicy?: overridableHeader;
70
+ crossOriginResourcePolicy?: overridableHeader;
71
+ crossOriginOpenerPolicy?: overridableHeader;
72
+ originAgentCluster?: overridableHeader;
73
+ referrerPolicy?: overridableHeader;
74
+ reportingEndpoints?: ReportingEndpointOptions[];
75
+ reportTo?: ReportToOptions[];
76
+ strictTransportSecurity?: overridableHeader;
77
+ xContentTypeOptions?: overridableHeader;
78
+ xDnsPrefetchControl?: overridableHeader;
79
+ xDownloadOptions?: overridableHeader;
80
+ xFrameOptions?: overridableHeader;
81
+ xPermittedCrossDomainPolicies?: overridableHeader;
82
+ xXssProtection?: overridableHeader;
83
+ removePoweredBy?: boolean;
84
+ permissionsPolicy?: PermissionsPolicyOptions;
85
+ }
86
+ declare const NONCE: ContentSecurityPolicyOptionHandler;
87
+ /**
88
+ * Secure Headers Middleware for Acryl.
89
+ *
90
+ *
91
+ * @param {Partial<SecureHeadersOptions>} [customOptions] - The options for the secure headers middleware.
92
+ * @param {ContentSecurityPolicyOptions} [customOptions.contentSecurityPolicy] - Settings for the Content-Security-Policy header.
93
+ * @param {ContentSecurityPolicyOptions} [customOptions.contentSecurityPolicyReportOnly] - Settings for the Content-Security-Policy-Report-Only header.
94
+ * @param {overridableHeader} [customOptions.crossOriginEmbedderPolicy=false] - Settings for the Cross-Origin-Embedder-Policy header.
95
+ * @param {overridableHeader} [customOptions.crossOriginResourcePolicy=true] - Settings for the Cross-Origin-Resource-Policy header.
96
+ * @param {overridableHeader} [customOptions.crossOriginOpenerPolicy=true] - Settings for the Cross-Origin-Opener-Policy header.
97
+ * @param {overridableHeader} [customOptions.originAgentCluster=true] - Settings for the Origin-Agent-Cluster header.
98
+ * @param {overridableHeader} [customOptions.referrerPolicy=true] - Settings for the Referrer-Policy header.
99
+ * @param {ReportingEndpointOptions[]} [customOptions.reportingEndpoints] - Settings for the Reporting-Endpoints header.
100
+ * @param {ReportToOptions[]} [customOptions.reportTo] - Settings for the Report-To header.
101
+ * @param {overridableHeader} [customOptions.strictTransportSecurity=true] - Settings for the Strict-Transport-Security header.
102
+ * @param {overridableHeader} [customOptions.xContentTypeOptions=true] - Settings for the X-Content-Type-Options header.
103
+ * @param {overridableHeader} [customOptions.xDnsPrefetchControl=true] - Settings for the X-DNS-Prefetch-Control header.
104
+ * @param {overridableHeader} [customOptions.xDownloadOptions=true] - Settings for the X-Download-Options header.
105
+ * @param {overridableHeader} [customOptions.xFrameOptions=true] - Settings for the X-Frame-Options header.
106
+ * @param {overridableHeader} [customOptions.xPermittedCrossDomainPolicies=true] - Settings for the X-Permitted-Cross-Domain-Policies header.
107
+ * @param {overridableHeader} [customOptions.xXssProtection=true] - Settings for the X-XSS-Protection header.
108
+ * @param {boolean} [customOptions.removePoweredBy=true] - Settings for remove X-Powered-By header.
109
+ * @param {PermissionsPolicyOptions} [customOptions.permissionsPolicy] - Settings for the Permissions-Policy header.
110
+ * @returns {MiddlewareHandler} The middleware handler function.
111
+ *
112
+ * @example
113
+ * ```ts
114
+ * const app = new Acryl()
115
+ * app.use(secureHeaders())
116
+ * ```
117
+ */
118
+ declare const secureHeaders: (customOptions?: SecureHeadersOptions) => MiddlewareHandler;
119
+ //#endregion
120
+ //#region ../../plugins/acryl-router/src/core/middleware/secure-headers/index.d.ts
121
+ declare module '../../context.ts' {
122
+ interface ContextVariableMap extends SecureHeadersVariables {}
123
+ }
124
+ //#endregion
125
+ export { type ContentSecurityPolicyOptionHandler, NONCE, type SecureHeadersVariables, secureHeaders };
@@ -0,0 +1,163 @@
1
+ import { encodeBase64 } from "./utils/encode.js";
2
+ //#region ../../plugins/acryl-router/src/core/middleware/secure-headers/secure-headers.ts
3
+ const HEADERS_MAP = {
4
+ crossOriginEmbedderPolicy: ["Cross-Origin-Embedder-Policy", "require-corp"],
5
+ crossOriginResourcePolicy: ["Cross-Origin-Resource-Policy", "same-origin"],
6
+ crossOriginOpenerPolicy: ["Cross-Origin-Opener-Policy", "same-origin"],
7
+ originAgentCluster: ["Origin-Agent-Cluster", "?1"],
8
+ referrerPolicy: ["Referrer-Policy", "no-referrer"],
9
+ strictTransportSecurity: ["Strict-Transport-Security", "max-age=15552000; includeSubDomains"],
10
+ xContentTypeOptions: ["X-Content-Type-Options", "nosniff"],
11
+ xDnsPrefetchControl: ["X-DNS-Prefetch-Control", "off"],
12
+ xDownloadOptions: ["X-Download-Options", "noopen"],
13
+ xFrameOptions: ["X-Frame-Options", "SAMEORIGIN"],
14
+ xPermittedCrossDomainPolicies: ["X-Permitted-Cross-Domain-Policies", "none"],
15
+ xXssProtection: ["X-XSS-Protection", "0"]
16
+ };
17
+ const DEFAULT_OPTIONS = {
18
+ crossOriginEmbedderPolicy: false,
19
+ crossOriginResourcePolicy: true,
20
+ crossOriginOpenerPolicy: true,
21
+ originAgentCluster: true,
22
+ referrerPolicy: true,
23
+ strictTransportSecurity: true,
24
+ xContentTypeOptions: true,
25
+ xDnsPrefetchControl: true,
26
+ xDownloadOptions: true,
27
+ xFrameOptions: true,
28
+ xPermittedCrossDomainPolicies: true,
29
+ xXssProtection: true,
30
+ removePoweredBy: true,
31
+ permissionsPolicy: {}
32
+ };
33
+ const generateNonce = () => {
34
+ const arrayBuffer = /* @__PURE__ */ new Uint8Array(16);
35
+ crypto.getRandomValues(arrayBuffer);
36
+ return encodeBase64(arrayBuffer.buffer);
37
+ };
38
+ const NONCE = (ctx) => {
39
+ const key = "secureHeadersNonce";
40
+ const init = ctx.get(key);
41
+ const nonce = init || generateNonce();
42
+ if (init == null) ctx.set(key, nonce);
43
+ return `'nonce-${nonce}'`;
44
+ };
45
+ /**
46
+ * Secure Headers Middleware for Acryl.
47
+ *
48
+ *
49
+ * @param {Partial<SecureHeadersOptions>} [customOptions] - The options for the secure headers middleware.
50
+ * @param {ContentSecurityPolicyOptions} [customOptions.contentSecurityPolicy] - Settings for the Content-Security-Policy header.
51
+ * @param {ContentSecurityPolicyOptions} [customOptions.contentSecurityPolicyReportOnly] - Settings for the Content-Security-Policy-Report-Only header.
52
+ * @param {overridableHeader} [customOptions.crossOriginEmbedderPolicy=false] - Settings for the Cross-Origin-Embedder-Policy header.
53
+ * @param {overridableHeader} [customOptions.crossOriginResourcePolicy=true] - Settings for the Cross-Origin-Resource-Policy header.
54
+ * @param {overridableHeader} [customOptions.crossOriginOpenerPolicy=true] - Settings for the Cross-Origin-Opener-Policy header.
55
+ * @param {overridableHeader} [customOptions.originAgentCluster=true] - Settings for the Origin-Agent-Cluster header.
56
+ * @param {overridableHeader} [customOptions.referrerPolicy=true] - Settings for the Referrer-Policy header.
57
+ * @param {ReportingEndpointOptions[]} [customOptions.reportingEndpoints] - Settings for the Reporting-Endpoints header.
58
+ * @param {ReportToOptions[]} [customOptions.reportTo] - Settings for the Report-To header.
59
+ * @param {overridableHeader} [customOptions.strictTransportSecurity=true] - Settings for the Strict-Transport-Security header.
60
+ * @param {overridableHeader} [customOptions.xContentTypeOptions=true] - Settings for the X-Content-Type-Options header.
61
+ * @param {overridableHeader} [customOptions.xDnsPrefetchControl=true] - Settings for the X-DNS-Prefetch-Control header.
62
+ * @param {overridableHeader} [customOptions.xDownloadOptions=true] - Settings for the X-Download-Options header.
63
+ * @param {overridableHeader} [customOptions.xFrameOptions=true] - Settings for the X-Frame-Options header.
64
+ * @param {overridableHeader} [customOptions.xPermittedCrossDomainPolicies=true] - Settings for the X-Permitted-Cross-Domain-Policies header.
65
+ * @param {overridableHeader} [customOptions.xXssProtection=true] - Settings for the X-XSS-Protection header.
66
+ * @param {boolean} [customOptions.removePoweredBy=true] - Settings for remove X-Powered-By header.
67
+ * @param {PermissionsPolicyOptions} [customOptions.permissionsPolicy] - Settings for the Permissions-Policy header.
68
+ * @returns {MiddlewareHandler} The middleware handler function.
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * const app = new Acryl()
73
+ * app.use(secureHeaders())
74
+ * ```
75
+ */
76
+ const secureHeaders = (customOptions) => {
77
+ const options = {
78
+ ...DEFAULT_OPTIONS,
79
+ ...customOptions
80
+ };
81
+ const headersToSet = getFilteredHeaders(options);
82
+ const callbacks = [];
83
+ if (options.contentSecurityPolicy) {
84
+ const [callback, value] = getCSPDirectives(options.contentSecurityPolicy, "Content-Security-Policy");
85
+ if (callback) callbacks.push(callback);
86
+ headersToSet.push(["Content-Security-Policy", value]);
87
+ }
88
+ if (options.contentSecurityPolicyReportOnly) {
89
+ const [callback, value] = getCSPDirectives(options.contentSecurityPolicyReportOnly, "Content-Security-Policy-Report-Only");
90
+ if (callback) callbacks.push(callback);
91
+ headersToSet.push(["Content-Security-Policy-Report-Only", value]);
92
+ }
93
+ if (options.permissionsPolicy && Object.keys(options.permissionsPolicy).length > 0) headersToSet.push(["Permissions-Policy", getPermissionsPolicyDirectives(options.permissionsPolicy)]);
94
+ if (options.reportingEndpoints) headersToSet.push(["Reporting-Endpoints", getReportingEndpoints(options.reportingEndpoints)]);
95
+ if (options.reportTo) headersToSet.push(["Report-To", getReportToOptions(options.reportTo)]);
96
+ return async function secureHeaders(ctx, next) {
97
+ const headersToSetForReq = callbacks.length === 0 ? headersToSet : callbacks.reduce((acc, cb) => cb(ctx, acc), headersToSet);
98
+ await next();
99
+ setHeaders(ctx, headersToSetForReq);
100
+ if (options?.removePoweredBy) ctx.res.headers.delete("X-Powered-By");
101
+ };
102
+ };
103
+ function getFilteredHeaders(options) {
104
+ return Object.entries(HEADERS_MAP).filter(([key]) => options[key]).map(([key, defaultValue]) => {
105
+ const overrideValue = options[key];
106
+ return typeof overrideValue === "string" ? [defaultValue[0], overrideValue] : defaultValue;
107
+ });
108
+ }
109
+ function getCSPDirectives(contentSecurityPolicy, headerName) {
110
+ const callbacks = [];
111
+ const resultValues = [];
112
+ for (const [directive, value] of Object.entries(contentSecurityPolicy)) {
113
+ const valueArray = Array.isArray(value) ? value : [value];
114
+ valueArray.forEach((value, i) => {
115
+ if (typeof value === "function") {
116
+ const index = i * 2 + 2 + resultValues.length;
117
+ callbacks.push((ctx, values) => {
118
+ values[index] = value(ctx, directive);
119
+ });
120
+ }
121
+ });
122
+ resultValues.push(directive.replace(/[A-Z]+(?![a-z])|[A-Z]/g, (match, offset) => offset ? "-" + match.toLowerCase() : match.toLowerCase()), ...valueArray.flatMap((value) => [" ", value]), "; ");
123
+ }
124
+ resultValues.pop();
125
+ return callbacks.length === 0 ? [void 0, resultValues.join("")] : [(ctx, headersToSet) => headersToSet.map((values) => {
126
+ if (values[0] === headerName) {
127
+ const clone = values[1].slice();
128
+ callbacks.forEach((cb) => {
129
+ cb(ctx, clone);
130
+ });
131
+ return [values[0], clone.join("")];
132
+ } else return values;
133
+ }), resultValues];
134
+ }
135
+ function getPermissionsPolicyDirectives(policy) {
136
+ return Object.entries(policy).map(([directive, value]) => {
137
+ const kebabDirective = camelToKebab(directive);
138
+ if (typeof value === "boolean") return `${kebabDirective}=${value ? "*" : "()"}`;
139
+ if (Array.isArray(value)) {
140
+ if (value.length === 0) return `${kebabDirective}=()`;
141
+ if (value.length === 1 && value[0] === "*") return `${kebabDirective}=*`;
142
+ if (value.length === 1 && value[0] === "none") return `${kebabDirective}=()`;
143
+ return `${kebabDirective}=(${value.map((item) => ["self", "src"].includes(item) ? item : `"${item}"`).join(" ")})`;
144
+ }
145
+ return "";
146
+ }).filter(Boolean).join(", ");
147
+ }
148
+ function camelToKebab(str) {
149
+ return str.replace(/([a-z\d])([A-Z])/g, "$1-$2").toLowerCase();
150
+ }
151
+ function getReportingEndpoints(reportingEndpoints = []) {
152
+ return reportingEndpoints.map((endpoint) => `${endpoint.name}="${endpoint.url}"`).join(", ");
153
+ }
154
+ function getReportToOptions(reportTo = []) {
155
+ return reportTo.map((option) => JSON.stringify(option)).join(", ");
156
+ }
157
+ function setHeaders(ctx, headersToSet) {
158
+ headersToSet.forEach(([header, value]) => {
159
+ ctx.res.headers.set(header, value);
160
+ });
161
+ }
162
+ //#endregion
163
+ export { NONCE, secureHeaders };