acrylblends 0.6.3 → 0.6.4

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 (269) hide show
  1. package/README.md +3 -2
  2. package/docs/framework/README.md +2 -2
  3. package/docs/framework/UPSTREAM.md +1 -1
  4. package/docs/framework/guides/jsx.md +24 -0
  5. package/docs/framework/helpers/ssg.md +3 -6
  6. package/docs/framework/middleware/builtin/jsx-renderer.md +0 -3
  7. package/docs/framework/upstream.json +2 -2
  8. package/lib/accepts.d.ts +1 -1
  9. package/lib/acryl-base.d.ts +1 -1
  10. package/lib/adapter.d.ts +1 -1
  11. package/lib/{app-wFwpg-bt.d.ts → app-D8riatvv.d.ts} +1 -1
  12. package/lib/basic-auth.d.ts +1 -1
  13. package/lib/bearer-auth.d.ts +1 -1
  14. package/lib/body-limit.d.ts +1 -1
  15. package/lib/cache.d.ts +1 -1
  16. package/lib/cache.js +4 -4
  17. package/lib/{client-BHTr318g.js → client-DDLXwhBo.js} +2 -125
  18. package/lib/client.d.ts +2 -2
  19. package/lib/client.js +2 -1
  20. package/lib/combine.d.ts +1 -1
  21. package/lib/{components-Ce5FRyHU.js → components-0o0CBYNv.js} +2 -2
  22. package/lib/{components-DYZdxJIJ.js → components-DdI7-ns7.js} +1 -1
  23. package/lib/compress.d.ts +1 -1
  24. package/lib/conninfo.d.ts +2 -2
  25. package/lib/{context-DVQBjuns.d.ts → context-DS3fYyG-.d.ts} +1 -1
  26. package/lib/context-storage.d.ts +1 -1
  27. package/lib/cookie.d.ts +1 -1
  28. package/lib/cors.d.ts +1 -1
  29. package/lib/csrf.d.ts +1 -1
  30. package/lib/dev.d.ts +2 -2
  31. package/lib/etag.d.ts +1 -1
  32. package/lib/factory.d.ts +2 -2
  33. package/lib/{hooks-Bq5q9IMl.js → hooks-BMw6BAyP.js} +5 -5
  34. package/lib/{index-CUTfU69R.d.ts → index-Bb7YJKCq.d.ts} +2 -2
  35. package/lib/{index-CsvB-F9j.d.ts → index-BvFh1Gfx.d.ts} +1 -1
  36. package/lib/{index-Cqcdluyn.d.ts → index-CTy4N7ng.d.ts} +2 -2
  37. package/lib/index.d.ts +4 -4
  38. package/lib/ip-restriction.d.ts +2 -2
  39. package/lib/jsx/dom/client.js +1 -1
  40. package/lib/jsx/dom/jsx-dev-runtime.js +1 -1
  41. package/lib/jsx/dom/jsx-runtime.js +1 -1
  42. package/lib/jsx/dom/server.js +1 -1
  43. package/lib/jsx/dom.js +3 -3
  44. package/lib/jsx/streaming.js +1 -1
  45. package/lib/{jsx-dev-runtime-kAhR_4C7.js → jsx-dev-runtime-D18Y35TI.js} +1 -1
  46. package/lib/jsx-renderer.d.ts +75 -0
  47. package/lib/jsx-renderer.js +99 -0
  48. package/lib/jsx.js +3 -3
  49. package/lib/jwk.d.ts +1 -1
  50. package/lib/jwt.d.ts +1 -1
  51. package/lib/language.d.ts +1 -1
  52. package/lib/logger.d.ts +1 -1
  53. package/lib/loopback-only.d.ts +1 -1
  54. package/lib/method-not-allowed.d.ts +2 -2
  55. package/lib/method-override.d.ts +2 -2
  56. package/lib/mount.d.ts +1 -1
  57. package/lib/node-server/conninfo.d.ts +1 -1
  58. package/lib/node-server/serve-static.d.ts +1 -1
  59. package/lib/node-server/serve-static.js +1 -1
  60. package/lib/node-server.d.ts +1 -1
  61. package/lib/node-server.js +1 -1
  62. package/lib/powered-by.d.ts +1 -1
  63. package/lib/pretty-json.d.ts +1 -1
  64. package/lib/quick.d.ts +1 -1
  65. package/lib/request-id.d.ts +1 -1
  66. package/lib/request.d.ts +1 -1
  67. package/lib/route.d.ts +1 -1
  68. package/lib/schema-validator.d.ts +1 -1
  69. package/lib/secure-headers.d.ts +1 -1
  70. package/lib/{serve-static-Cw23shXv.js → serve-static-B14MF1Va.js} +1 -0
  71. package/lib/serve-static.d.ts +1 -1
  72. package/lib/ssg-BwjcA-Ge.js +389 -0
  73. package/lib/ssg.d.ts +156 -0
  74. package/lib/ssg.js +2 -0
  75. package/lib/streaming.d.ts +1 -1
  76. package/lib/testing.d.ts +3 -3
  77. package/lib/testing.js +1 -1
  78. package/lib/timeout.d.ts +1 -1
  79. package/lib/timing.d.ts +1 -1
  80. package/lib/tiny.d.ts +1 -1
  81. package/lib/trailing-slash.d.ts +1 -1
  82. package/lib/{types-nEL8VPDC.d.ts → types-Dv_nV2cv.d.ts} +1 -1
  83. package/lib/{types-CQiGmsWW.d.ts → types-zNxyEpG2.d.ts} +2 -2
  84. package/lib/types.d.ts +1 -1
  85. package/lib/utils/body.d.ts +1 -1
  86. package/lib/utils/ipaddr.d.ts +1 -1
  87. package/lib/utils-Cx61GFMC.js +125 -0
  88. package/lib/validator.d.ts +1 -1
  89. package/lib/ws.d.ts +1 -1
  90. package/package.json +9 -1
  91. package/plugins/acryl-inspect/upstream.json +1 -1
  92. package/plugins/acryl-node-server/upstream.json +1 -1
  93. package/plugins/acryl-router/src/core/helper/ssg/index.ts +14 -0
  94. package/plugins/acryl-router/src/core/helper/ssg/middleware.ts +83 -0
  95. package/plugins/acryl-router/src/core/helper/ssg/plugins.ts +72 -0
  96. package/plugins/acryl-router/src/core/helper/ssg/ssg.ts +471 -0
  97. package/plugins/acryl-router/src/core/helper/ssg/utils.ts +118 -0
  98. package/plugins/acryl-router/src/core/jsx/dom/render.ts +6 -6
  99. package/plugins/acryl-router/src/core/middleware/cache/index.ts +4 -4
  100. package/plugins/acryl-router/src/core/middleware/jsx-renderer/index.ts +162 -0
  101. package/plugins/acryl-router/src/helpers/index.ts +1 -0
  102. package/plugins/acryl-router/src/middleware/index.ts +1 -0
  103. package/plugins/acryl-router/upstream.json +2 -2
  104. package/plugins/acryl-router-http/upstream.json +1 -1
  105. package/plugins/acryl-state/upstream.json +1 -1
  106. package/plugins/desktop/upstream.json +1 -1
  107. package/plugins/desktop-web/upstream.json +1 -1
  108. package/plugins/extensions/resolve.ts +4 -0
  109. package/shared/AGENTS.core.md +4 -0
  110. package/templates/agent/tsconfig.json +7 -1
  111. package/templates/todo/upstream.json +1 -1
  112. package/plugins/acryl-inspect/tests/report.spec.ts +0 -69
  113. package/plugins/acryl-inspect/tests/service.spec.ts +0 -121
  114. package/plugins/acryl-node-server/tests/adapter/app.ts +0 -76
  115. package/plugins/acryl-node-server/tests/adapter/assets/.static/plain.txt +0 -1
  116. package/plugins/acryl-node-server/tests/adapter/assets/favicon.ico +0 -0
  117. package/plugins/acryl-node-server/tests/adapter/assets/secret.txt +0 -1
  118. package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +0 -1
  119. package/plugins/acryl-node-server/tests/adapter/assets/static/admin/secret.txt +0 -1
  120. package/plugins/acryl-node-server/tests/adapter/assets/static/data.json +0 -5
  121. package/plugins/acryl-node-server/tests/adapter/assets/static/extensionless +0 -1
  122. package/plugins/acryl-node-server/tests/adapter/assets/static/foo..bar.txt +0 -0
  123. package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +0 -1
  124. package/plugins/acryl-node-server/tests/adapter/assets/static/plain.txt +0 -1
  125. package/plugins/acryl-node-server/tests/adapter/assets/static-with-context-path/plain.txt +0 -1
  126. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin +0 -1
  127. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin.br +0 -1
  128. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt +0 -1
  129. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.br +0 -1
  130. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.zst +0 -1
  131. package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +0 -34
  132. package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +0 -248
  133. package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +0 -457
  134. package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-cert.pem +0 -23
  135. package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-key.pem +0 -27
  136. package/plugins/acryl-node-server/tests/adapter/headers.test.ts +0 -252
  137. package/plugins/acryl-node-server/tests/adapter/helpers/request.ts +0 -190
  138. package/plugins/acryl-node-server/tests/adapter/listener.test.ts +0 -727
  139. package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +0 -189
  140. package/plugins/acryl-node-server/tests/adapter/request.test.ts +0 -1230
  141. package/plugins/acryl-node-server/tests/adapter/response.test.ts +0 -285
  142. package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +0 -849
  143. package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +0 -790
  144. package/plugins/acryl-node-server/tests/adapter/server.test.ts +0 -1312
  145. package/plugins/acryl-node-server/tests/adapter/setup.ts +0 -16
  146. package/plugins/acryl-node-server/tests/adapter/url.test.ts +0 -76
  147. package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +0 -23
  148. package/plugins/acryl-node-server/tests/adapter/utils/stream.test.ts +0 -75
  149. package/plugins/acryl-node-server/tests/adapter/utils.test.ts +0 -235
  150. package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +0 -260
  151. package/plugins/acryl-node-server/tests/server.spec.ts +0 -141
  152. package/plugins/acryl-router/src/core/app.test.ts +0 -3833
  153. package/plugins/acryl-router/src/core/client/client.test.ts +0 -2313
  154. package/plugins/acryl-router/src/core/client/types.test.ts +0 -149
  155. package/plugins/acryl-router/src/core/client/utils.test.ts +0 -405
  156. package/plugins/acryl-router/src/core/compose.test.ts +0 -751
  157. package/plugins/acryl-router/src/core/context.test.ts +0 -629
  158. package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +0 -344
  159. package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +0 -55
  160. package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +0 -510
  161. package/plugins/acryl-router/src/core/helper/css/common.case.test.tsx +0 -506
  162. package/plugins/acryl-router/src/core/helper/css/index.test.tsx +0 -678
  163. package/plugins/acryl-router/src/core/helper/dev/index.test.ts +0 -181
  164. package/plugins/acryl-router/src/core/helper/factory/index.test.ts +0 -434
  165. package/plugins/acryl-router/src/core/helper/html/index.test.ts +0 -78
  166. package/plugins/acryl-router/src/core/helper/proxy/index.test.ts +0 -356
  167. package/plugins/acryl-router/src/core/helper/route/index.test.ts +0 -259
  168. package/plugins/acryl-router/src/core/helper/streaming/sse.test.tsx +0 -557
  169. package/plugins/acryl-router/src/core/helper/streaming/stream.test.ts +0 -128
  170. package/plugins/acryl-router/src/core/helper/streaming/text.test.ts +0 -34
  171. package/plugins/acryl-router/src/core/helper/testing/index.test.ts +0 -42
  172. package/plugins/acryl-router/src/core/helper/websocket/index.test.ts +0 -124
  173. package/plugins/acryl-router/src/core/http-exception.test.ts +0 -45
  174. package/plugins/acryl-router/src/core/jsx/base.test.tsx +0 -97
  175. package/plugins/acryl-router/src/core/jsx/children.test.ts +0 -52
  176. package/plugins/acryl-router/src/core/jsx/components.test.tsx +0 -936
  177. package/plugins/acryl-router/src/core/jsx/context-isolation.test.ts +0 -655
  178. package/plugins/acryl-router/src/core/jsx/dom/client.test.tsx +0 -128
  179. package/plugins/acryl-router/src/core/jsx/dom/components.test.tsx +0 -330
  180. package/plugins/acryl-router/src/core/jsx/dom/context.test.tsx +0 -184
  181. package/plugins/acryl-router/src/core/jsx/dom/css.test.tsx +0 -149
  182. package/plugins/acryl-router/src/core/jsx/dom/hooks/index.test.tsx +0 -172
  183. package/plugins/acryl-router/src/core/jsx/dom/index.test.tsx +0 -3681
  184. package/plugins/acryl-router/src/core/jsx/dom/intrinsic-element/components.test.tsx +0 -1344
  185. package/plugins/acryl-router/src/core/jsx/dom/server.test.tsx +0 -199
  186. package/plugins/acryl-router/src/core/jsx/hooks/dom.test.tsx +0 -859
  187. package/plugins/acryl-router/src/core/jsx/hooks/string.test.tsx +0 -40
  188. package/plugins/acryl-router/src/core/jsx/index.test.tsx +0 -1744
  189. package/plugins/acryl-router/src/core/jsx/intrinsic-element/components.test.tsx +0 -666
  190. package/plugins/acryl-router/src/core/jsx/jsx-runtime.test.tsx +0 -85
  191. package/plugins/acryl-router/src/core/jsx/streaming.test.tsx +0 -1281
  192. package/plugins/acryl-router/src/core/jsx/utils.test.ts +0 -366
  193. package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +0 -434
  194. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +0 -1018
  195. package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +0 -273
  196. package/plugins/acryl-router/src/core/middleware/cache/index.test.ts +0 -1211
  197. package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +0 -355
  198. package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +0 -535
  199. package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +0 -43
  200. package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +0 -532
  201. package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +0 -534
  202. package/plugins/acryl-router/src/core/middleware/etag/digest.test.ts +0 -21
  203. package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +0 -503
  204. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +0 -217
  205. package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +0 -1135
  206. package/plugins/acryl-router/src/core/middleware/jwk/keys.test.json +0 -48
  207. package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +0 -802
  208. package/plugins/acryl-router/src/core/middleware/language/index.test.ts +0 -552
  209. package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +0 -204
  210. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +0 -292
  211. package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +0 -221
  212. package/plugins/acryl-router/src/core/middleware/mount/index.test.ts +0 -334
  213. package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +0 -37
  214. package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +0 -218
  215. package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +0 -168
  216. package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +0 -671
  217. package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +0 -450
  218. package/plugins/acryl-router/src/core/middleware/serve-static/path.test.ts +0 -50
  219. package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +0 -70
  220. package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +0 -310
  221. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +0 -381
  222. package/plugins/acryl-router/src/core/preset/quick.test.ts +0 -42
  223. package/plugins/acryl-router/src/core/preset/tiny.test.ts +0 -42
  224. package/plugins/acryl-router/src/core/request.test.ts +0 -751
  225. package/plugins/acryl-router/src/core/router/common.case.test.ts +0 -1132
  226. package/plugins/acryl-router/src/core/router/linear-router/router.test.ts +0 -80
  227. package/plugins/acryl-router/src/core/router/pattern-router/router.test.ts +0 -46
  228. package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.test.ts +0 -154
  229. package/plugins/acryl-router/src/core/router/reg-exp-router/router.test.ts +0 -265
  230. package/plugins/acryl-router/src/core/router/smart-router/router.test.ts +0 -13
  231. package/plugins/acryl-router/src/core/router/trie-router/node.test.ts +0 -896
  232. package/plugins/acryl-router/src/core/router/trie-router/router.test.ts +0 -8
  233. package/plugins/acryl-router/src/core/types.test.ts +0 -4134
  234. package/plugins/acryl-router/src/core/utils/accept.test.ts +0 -299
  235. package/plugins/acryl-router/src/core/utils/basic-auth.test.ts +0 -56
  236. package/plugins/acryl-router/src/core/utils/body.test.ts +0 -496
  237. package/plugins/acryl-router/src/core/utils/buffer.test.ts +0 -147
  238. package/plugins/acryl-router/src/core/utils/color.test.ts +0 -23
  239. package/plugins/acryl-router/src/core/utils/concurrent.test.ts +0 -69
  240. package/plugins/acryl-router/src/core/utils/cookie.test.ts +0 -460
  241. package/plugins/acryl-router/src/core/utils/crypto.test.ts +0 -43
  242. package/plugins/acryl-router/src/core/utils/encode.test.ts +0 -61
  243. package/plugins/acryl-router/src/core/utils/filepath.test.ts +0 -78
  244. package/plugins/acryl-router/src/core/utils/html.test.ts +0 -16
  245. package/plugins/acryl-router/src/core/utils/ipaddr.test.ts +0 -149
  246. package/plugins/acryl-router/src/core/utils/jwt/jwa.test.ts +0 -86
  247. package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +0 -1788
  248. package/plugins/acryl-router/src/core/utils/mime.test.ts +0 -64
  249. package/plugins/acryl-router/src/core/utils/stream.test.ts +0 -212
  250. package/plugins/acryl-router/src/core/utils/types.test.ts +0 -295
  251. package/plugins/acryl-router/src/core/utils/url.test.ts +0 -384
  252. package/plugins/acryl-router/src/core/validator/utils.test.ts +0 -82
  253. package/plugins/acryl-router/src/core/validator/validator.test.ts +0 -1488
  254. package/plugins/acryl-router/tests/docs-examples.spec.ts +0 -152
  255. package/plugins/acryl-router/tests/jsx.spec.tsx +0 -63
  256. package/plugins/acryl-router/tests/live-install.spec.ts +0 -64
  257. package/plugins/acryl-router/tests/loader.spec.ts +0 -72
  258. package/plugins/acryl-router/tests/loopback-only.spec.ts +0 -80
  259. package/plugins/acryl-router/tests/no-dom/consumer.ts +0 -11
  260. package/plugins/acryl-router/tests/no-dom/tsconfig.json +0 -13
  261. package/plugins/acryl-router/tests/service.spec.ts +0 -426
  262. package/plugins/acryl-router/tests/shadow-state.spec.ts +0 -79
  263. package/plugins/acryl-router-http/tests/adapter.spec.ts +0 -174
  264. package/plugins/acryl-router-http/tests/stream.spec.ts +0 -133
  265. package/plugins/acryl-router-http/tests/surfaces.spec.ts +0 -101
  266. package/plugins/acryl-state/src/react.ts +0 -11
  267. package/plugins/acryl-state/tests/cell.spec.ts +0 -71
  268. package/plugins/acryl-state/tests/react.spec.ts +0 -39
  269. package/plugins/acryl-state/tests/service.spec.ts +0 -132
@@ -1,23 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIID6DCCAtCgAwIBAgIUFH02wcL3Qgben6tfIibXitsApCYwDQYJKoZIhvcNAQEL
3
- BQAwejELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQswCQYDVQQHDAJTRjEPMA0G
4
- A1UECgwGSm95ZW50MRAwDgYDVQQLDAdOb2RlLmpzMQwwCgYDVQQDDANjYTExIDAe
5
- BgkqhkiG9w0BCQEWEXJ5QHRpbnljbG91ZHMub3JnMCAXDTIyMDkwMzIxNDAzN1oY
6
- DzIyOTYwNjE3MjE0MDM3WjB9MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExCzAJ
7
- BgNVBAcMAlNGMQ8wDQYDVQQKDAZKb3llbnQxEDAOBgNVBAsMB05vZGUuanMxDzAN
8
- BgNVBAMMBmFnZW50MTEgMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcw
9
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDUVjIK+yDTgnCT3CxChO0E
10
- 37q9VuHdrlKeKLeQzUJW2yczSfNzX/0zfHpjY+zKWie39z3HCJqWxtiG2wxiOI8c
11
- 3WqWOvzVmdWADlh6EfkIlg+E7VC6JaKDA+zabmhPvnuu3JzogBMnsWl68lCXzuPx
12
- deQAmEwNtqjrh74DtM+Ud0ulb//Ixjxo1q3rYKu+aaexSramuee6qJta2rjrB4l8
13
- B/bU+j1mDf9XQQfSjo9jRnp4hiTFdBl2k+lZzqE2L/rhu6EMjA2IhAq/7xA2MbLo
14
- 9cObVUin6lfoo5+JKRgT9Fp2xEgDOit+2EA/S6oUfPNeLSVUqmXOSWlXlwlb9Nxr
15
- AgMBAAGjYTBfMF0GCCsGAQUFBwEBBFEwTzAjBggrBgEFBQcwAYYXaHR0cDovL29j
16
- c3Aubm9kZWpzLm9yZy8wKAYIKwYBBQUHMAKGHGh0dHA6Ly9jYS5ub2RlanMub3Jn
17
- L2NhLmNlcnQwDQYJKoZIhvcNAQELBQADggEBAMM0mBBjLMt9pYXePtUeNO0VTw9y
18
- FWCM8nAcAO2kRNwkJwcsispNpkcsHZ5o8Xf5mpCotdvziEWG1hyxwU6nAWyNOLcN
19
- G0a0KUfbMO3B6ZYe1GwPDjXaQnv75SkAdxgX5zOzca3xnhITcjUUGjQ0fbDfwFV5
20
- ix8mnzvfXjDONdEznVa7PFcN6QliFUMwR/h8pCRHtE5+a10OSPeJSrGG+FtrGnRW
21
- G1IJUv6oiGF/MvWCr84REVgc1j78xomGANJIu2hN7bnD1nEMON6em8IfnDOUtynV
22
- 9wfWTqiQYD5Zifj6WcGa0aAHMuetyFG4lIfMAHmd3gaKpks7j9l26LwRPvI=
23
- -----END CERTIFICATE-----
@@ -1,27 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIIEpAIBAAKCAQEA1FYyCvsg04Jwk9wsQoTtBN+6vVbh3a5Snii3kM1CVtsnM0nz
3
- c1/9M3x6Y2Psylont/c9xwialsbYhtsMYjiPHN1qljr81ZnVgA5YehH5CJYPhO1Q
4
- uiWigwPs2m5oT757rtyc6IATJ7FpevJQl87j8XXkAJhMDbao64e+A7TPlHdLpW//
5
- yMY8aNat62CrvmmnsUq2prnnuqibWtq46weJfAf21Po9Zg3/V0EH0o6PY0Z6eIYk
6
- xXQZdpPpWc6hNi/64buhDIwNiIQKv+8QNjGy6PXDm1VIp+pX6KOfiSkYE/RadsRI
7
- AzorfthAP0uqFHzzXi0lVKplzklpV5cJW/TcawIDAQABAoIBAAvbtHfAhpjJVBgt
8
- 15rvaX04MWmZjIugzKRgib/gdq/7FTlcC+iJl85kSUF7tyGl30n62MxgwqFhAX6m
9
- hQ6HMhbelrFFIhGbwbyhEHfgwROlrcAysKt0pprCgVvBhrnNXYLqdyjU3jz9P3LK
10
- TY3s0/YMK2uNFdI+PTjKH+Z9Foqn9NZUnUonEDepGyuRO7fLeccWJPv2L4CR4a/5
11
- ku4VbDgVpvVSVRG3PSVzbmxobnpdpl52og+T7tPx1cLnIknPtVljXPWtZdfekh2E
12
- eAp2KxCCHOKzzG3ItBKsVu0woeqEpy8JcoO6LbgmEoVnZpgmtQClbBgef8+i+oGE
13
- BgW9nmECgYEA8gA63QQuZOUC56N1QXURexN2PogF4wChPaCTFbQSJXvSBkQmbqfL
14
- qRSD8P0t7GOioPrQK6pDwFf4BJB01AvkDf8Z6DxxOJ7cqIC7LOwDupXocWX7Q0Qk
15
- O6cwclBVsrDZK00v60uRRpl/a39GW2dx7IiQDkKQndLh3/0TbMIWHNcCgYEA4J6r
16
- yinZbLpKw2+ezhi4B4GT1bMLoKboJwpZVyNZZCzYR6ZHv+lS7HR/02rcYMZGoYbf
17
- n7OHwF4SrnUS7vPhG4g2ZsOhKQnMvFSQqpGmK1ZTuoKGAevyvtouhK/DgtLWzGvX
18
- 9fSahiq/UvfXs/z4M11q9Rv9ztPCmG1cwSEHlo0CgYEAogQNZJK8DMhVnYcNpXke
19
- 7uskqtCeQE/Xo06xqkIYNAgloBRYNpUYAGa/vsOBz1UVN/kzDUi8ezVp0oRz8tLT
20
- J5u2WIi+tE2HJTiqF3UbOfvK1sCT64DfUSCpip7GAQ/tFNRkVH8PD9kMOYfILsGe
21
- v+DdsO5Xq5HXrwHb02BNNZkCgYBsl8lt33WiPx5OBfS8pu6xkk+qjPkeHhM2bKZs
22
- nkZlS9j0KsudWGwirN/vkkYg8zrKdK5AQ0dqFRDrDuasZ3N5IA1M+V88u+QjWK7o
23
- B6pSYVXxYZDv9OZSpqC+vUrEQLJf+fNakXrzSk9dCT1bYv2Lt6ox/epix7XYg2bI
24
- Z/OHMQKBgQC2FUGhlndGeugTJaoJ8nhT/0VfRUX/h6sCgSerk5qFr/hNCBV4T022
25
- x0NDR2yLG6MXyqApJpG6rh3QIDElQoQCNlI3/KJ6JfEfmqrLLN2OigTvA5sE4fGU
26
- Dp/ha8OQAx95EwXuaG7LgARduvOIK3x8qi8KsZoUGJcg2ywurUbkWA==
27
- -----END RSA PRIVATE KEY-----
@@ -1,252 +0,0 @@
1
- import type { IncomingMessage } from 'node:http'
2
- import { Http2ServerRequest } from 'node:http2'
3
- import type { ServerHttp2Stream } from 'node:http2'
4
- import { Duplex } from 'node:stream'
5
- import { inspect } from 'node:util'
6
- import { GlobalHeaders, RequestHeaders, newHeadersFromIncoming } from '../../src/adapter/headers.ts'
7
- import { newRequest, Request as LightweightRequest } from '../../src/adapter/request.ts'
8
-
9
- // Compatibility cases adapted from srvx's Node header suite:
10
- // https://github.com/h3js/srvx/blob/4052594e76d5ead2cc4c7cf8f7fa6d5ea9558a0a/test/node-headers.test.ts
11
-
12
- const incoming = (rawHeaders: string[], headers: Record<string, unknown>): IncomingMessage =>
13
- ({ rawHeaders, headers }) as IncomingMessage
14
-
15
- const incomingHttp2 = (
16
- rawHeaders: string[],
17
- headers: Record<string, string | string[]>
18
- ): Http2ServerRequest =>
19
- new Http2ServerRequest(new Duplex() as ServerHttp2Stream, headers, {}, rawHeaders)
20
-
21
- const lightweightHeaders = (request: IncomingMessage | Http2ServerRequest): GlobalHeaders =>
22
- newHeadersFromIncoming(request)
23
-
24
- const nonJoinedHeaderNames = [
25
- 'age',
26
- 'authorization',
27
- 'content-length',
28
- 'content-type',
29
- 'etag',
30
- 'expires',
31
- 'from',
32
- 'host',
33
- 'if-modified-since',
34
- 'if-unmodified-since',
35
- 'last-modified',
36
- 'location',
37
- 'max-forwards',
38
- 'proxy-authorization',
39
- 'referer',
40
- 'retry-after',
41
- 'server',
42
- 'user-agent',
43
- ]
44
-
45
- describe('RequestHeaders', () => {
46
- it('reads common headers without iterating rawHeaders', () => {
47
- let rawHeadersReads = 0
48
- const request = {
49
- headers: { 'x-test': 'value' },
50
- get rawHeaders() {
51
- rawHeadersReads++
52
- return ['x-test', 'value']
53
- },
54
- } as unknown as IncomingMessage
55
-
56
- const headers = lightweightHeaders(request)
57
-
58
- expect(headers).toBeInstanceOf(GlobalHeaders)
59
- expect(headers.get('X-Test')).toBe('value')
60
- expect(headers.has('x-test')).toBe(true)
61
- expect(rawHeadersReads).toBe(0)
62
- expect(() => headers.get('bad name')).toThrow(TypeError)
63
- expect(() => headers.has(':path')).toThrow(TypeError)
64
- expect(rawHeadersReads).toBe(0)
65
-
66
- expect([...headers]).toEqual([['x-test', 'value']])
67
- expect(rawHeadersReads).toBe(1)
68
- })
69
-
70
- it.each(nonJoinedHeaderNames)(
71
- 'combines repeated %s values consistently before and after iteration',
72
- (name) => {
73
- const rawHeaders = [name, 'one', name, 'two']
74
- const collapsed = { [name]: 'one' }
75
-
76
- const before = lightweightHeaders(incoming(rawHeaders, collapsed))
77
- expect(before.get(name)).toBe('one, two')
78
- expect(before.has(name)).toBe(true)
79
-
80
- const after = lightweightHeaders(incoming(rawHeaders, collapsed))
81
- void [...after]
82
- expect(after.get(name)).toBe('one, two')
83
- }
84
- )
85
-
86
- it('combines headers collapsed by the HTTP/2 parser', () => {
87
- const headers = lightweightHeaders(
88
- incomingHttp2(['if-none-match', '"a"', 'if-none-match', '"b"'], {
89
- 'if-none-match': '"a"',
90
- })
91
- )
92
-
93
- expect(headers.get('if-none-match')).toBe('"a", "b"')
94
- void [...headers]
95
- expect(headers.get('if-none-match')).toBe('"a", "b"')
96
- })
97
-
98
- it('uses an immutable raw-header snapshot for HTTP/2', () => {
99
- const rawHeaders = ['x-secret', 'topsecret', 'host', 'localhost']
100
- const request = incomingHttp2(rawHeaders, {
101
- 'x-secret': 'topsecret',
102
- host: 'localhost',
103
- })
104
- const headers = lightweightHeaders(request)
105
-
106
- delete request.headers['x-secret']
107
- request.headers['x-added'] = 'value'
108
- rawHeaders[1] = 'changed'
109
- rawHeaders.push('x-added', 'value')
110
-
111
- expect(headers.get('x-secret')).toBe('topsecret')
112
- expect(headers.has('x-added')).toBe(false)
113
- void [...headers]
114
- expect(headers.get('x-secret')).toBe('topsecret')
115
- expect(headers.has('x-added')).toBe(false)
116
- })
117
-
118
- it('ignores non-string values in synthesized parsed headers', () => {
119
- const headers = lightweightHeaders(
120
- incoming(['content-length', '123'], { 'content-length': 123 })
121
- )
122
-
123
- expect(headers.get('content-length')).toBe('123')
124
- expect(headers.has('content-length')).toBe(true)
125
- void [...headers]
126
- expect(headers.get('content-length')).toBe('123')
127
- })
128
-
129
- it('normalizes raw values consistently before and after materialization', () => {
130
- const rawHeaders = ['x-token', ' abc\t', 'x-tab', '\tv v\t', 'x-interior', 'a b']
131
- const headers = lightweightHeaders(incomingHttp2(rawHeaders, {}))
132
-
133
- expect(headers.get('x-token')).toBe('abc')
134
- expect(headers.get('x-tab')).toBe('v v')
135
- expect(headers.get('x-interior')).toBe('a b')
136
- void [...headers]
137
- expect(headers.get('x-token')).toBe('abc')
138
- expect(headers.get('x-tab')).toBe('v v')
139
- expect(headers.get('x-interior')).toBe('a b')
140
- })
141
-
142
- it('fails closed on values rejected by native Headers', () => {
143
- const rawHeaders = ['x-evil', 'ok', 'x-evil', 'bad\0value']
144
-
145
- expect(() => lightweightHeaders(incomingHttp2(rawHeaders, {})).get('x-evil')).toThrow(TypeError)
146
- expect(() => lightweightHeaders(incomingHttp2(rawHeaders, {})).has('x-evil')).toThrow(TypeError)
147
- expect(() => [...lightweightHeaders(incomingHttp2(rawHeaders, {}))]).toThrow(TypeError)
148
- })
149
-
150
- it('preserves cookie and set-cookie representations', () => {
151
- const headers = lightweightHeaders(
152
- incoming(['cookie', 'a=1', 'cookie', 'b=2', 'set-cookie', 'a=1', 'set-cookie', 'b=2'], {
153
- cookie: 'a=1; b=2',
154
- 'set-cookie': ['ignored'],
155
- })
156
- )
157
-
158
- expect(headers.get('cookie')).toBe('a=1; b=2')
159
- expect(headers.get('set-cookie')).toBe('a=1, b=2')
160
- expect(headers.getSetCookie()).toEqual(['a=1', 'b=2'])
161
- expect(Object.fromEntries(headers).cookie).toBe('a=1; b=2')
162
- })
163
-
164
- it('reads a literal __proto__ header without exposing prototype properties', () => {
165
- const headers = lightweightHeaders(
166
- incoming(['__proto__', 'value', 'x-test', 'one'], { 'x-test': 'one' })
167
- )
168
-
169
- expect(headers.get('__proto__')).toBe('value')
170
- expect(headers.has('__proto__')).toBe(true)
171
- expect(headers.get('toString')).toBe(null)
172
- expect(headers.has('toString')).toBe(false)
173
- })
174
-
175
- it('materializes for validation and mutation while preserving identity', () => {
176
- const headers = lightweightHeaders(incoming(['host', 'localhost'], { host: 'localhost' }))
177
-
178
- expect(() => headers.get('bad name')).toThrow(TypeError)
179
- expect(() => headers.has(':path')).toThrow(TypeError)
180
- headers.set('x-test', 'value')
181
- headers.append('x-test', 'second')
182
-
183
- expect(headers.get('x-test')).toBe('value, second')
184
- let callbackParent: GlobalHeaders | undefined
185
- headers.forEach((_value, _key, parent) => {
186
- callbackParent = parent
187
- })
188
- expect(callbackParent).toBe(headers)
189
- })
190
-
191
- it('uses the lightweight inspection format', () => {
192
- const headers = lightweightHeaders(incoming(['x-test', 'value'], { 'x-test': 'value' }))
193
-
194
- expect(inspect(headers)).toContain("Headers (lightweight) { 'x-test': 'value' }")
195
- })
196
-
197
- it('leaves the standard Headers constructor unchanged', () => {
198
- const headers = new Headers({ 'x-test': 'one' })
199
- headers.append('x-test', 'two')
200
-
201
- expect(global.Headers).toBe(GlobalHeaders)
202
- expect(Object.getPrototypeOf(headers)).toBe(GlobalHeaders.prototype)
203
- expect(headers.get('x-test')).toBe('one, two')
204
- expect(new Headers(headers).get('x-test')).toBe('one, two')
205
- expect(new Headers({ rawHeaders: 'ordinary value' }).get('rawHeaders')).toBe('ordinary value')
206
- })
207
-
208
- it('uses the internal implementation without replacing the global constructor', () => {
209
- const request = incoming(['x-test', 'value'], { 'x-test': 'value' })
210
- const headers = newHeadersFromIncoming(request)
211
-
212
- expect(global.Headers).toBe(GlobalHeaders)
213
- expect(Object.getPrototypeOf(headers)).toBe(RequestHeaders.prototype)
214
- expect(headers).toBeInstanceOf(GlobalHeaders)
215
- expect(new GlobalHeaders(headers).get('x-test')).toBe('value')
216
- })
217
-
218
- it('uses the live global Headers constructor when it changes after module initialization', () => {
219
- class PolyfillHeaders extends GlobalHeaders {}
220
- const descriptor = Object.getOwnPropertyDescriptor(globalThis, 'Headers')
221
- Object.defineProperty(globalThis, 'Headers', {
222
- value: PolyfillHeaders,
223
- configurable: true,
224
- writable: true,
225
- })
226
-
227
- try {
228
- const headers = newHeadersFromIncoming(incoming(['x-test', 'value'], { 'x-test': 'value' }))
229
-
230
- expect(headers).toBeInstanceOf(PolyfillHeaders)
231
- expect(Object.getPrototypeOf(headers)).toBe(PolyfillHeaders.prototype)
232
- expect(headers.get('x-test')).toBe('value')
233
- } finally {
234
- Object.defineProperty(globalThis, 'Headers', descriptor!)
235
- }
236
- })
237
-
238
- it('can initialize and clone a native Request after header mutation', () => {
239
- const request = newRequest({
240
- method: 'GET',
241
- url: '/',
242
- headers: { host: 'localhost' },
243
- rawHeaders: ['host', 'localhost'],
244
- } as IncomingMessage)
245
- const headers = request.headers
246
- headers.set('x-test', 'value')
247
-
248
- expect(request.keepalive).toBe(false)
249
- expect(request.headers).toBe(headers)
250
- expect(new LightweightRequest(request).headers.get('x-test')).toBe('value')
251
- })
252
- })
@@ -1,190 +0,0 @@
1
- import { once } from 'node:events'
2
- import { request as requestHTTP } from 'node:http'
3
- import type { IncomingMessage, RequestOptions } from 'node:http'
4
- import { connect } from 'node:http2'
5
- import type { IncomingHttpHeaders as IncomingHttp2Headers } from 'node:http2'
6
- import { Server as HttpsServer, request as requestHTTPS } from 'node:https'
7
- import type { AddressInfo } from 'node:net'
8
- import { newHeadersFromIncoming } from '../../../src/adapter/headers.ts'
9
- import { GlobalResponse } from '../../../src/adapter/response.ts'
10
- import type { ServerType } from '../../../src/adapter/types.ts'
11
-
12
- export type ServerRequestInit = Omit<
13
- RequestOptions,
14
- 'agent' | 'host' | 'hostname' | 'path' | 'port' | 'protocol'
15
- > & {
16
- body?: string | Uint8Array
17
- path: string
18
- }
19
-
20
- export type ServerRequestHooks = {
21
- onHeaders?: (headers: Headers, status: number) => void
22
- onChunk?: (chunk: Buffer, index: number) => void
23
- }
24
-
25
- export type Http2RequestInit = {
26
- headers?: Record<string, string>
27
- method?: string
28
- path: string
29
- }
30
-
31
- const ensureListening = async (server: ServerType) => {
32
- let address = server.address() as AddressInfo | null
33
- let startedByHelper = false
34
- if (!address) {
35
- server.listen(0, '127.0.0.1')
36
- await once(server, 'listening')
37
- startedByHelper = true
38
- address = server.address() as AddressInfo | null
39
- }
40
- if (!address) {
41
- throw new Error('Server is not listening on a TCP address')
42
- }
43
-
44
- return {
45
- address,
46
- // a no-op if the server was already listening before the request, its
47
- // owner is responsible for closing it in that case
48
- close: async () => {
49
- if (startedByHelper) {
50
- await new Promise<void>((resolve) => server.close(() => resolve()))
51
- }
52
- },
53
- }
54
- }
55
-
56
- const sendRequest = (server: ServerType, address: AddressInfo, init: ServerRequestInit) => {
57
- const { body, path, ...options } = init
58
- const common = {
59
- ...options,
60
- agent: false,
61
- hostname: address.address,
62
- path,
63
- port: address.port,
64
- }
65
- const request =
66
- server instanceof HttpsServer
67
- ? requestHTTPS({ ...common, rejectUnauthorized: false })
68
- : requestHTTP(common)
69
- request.end(body)
70
- return request
71
- }
72
-
73
- const receiveResponse = async (request: ReturnType<typeof sendRequest>) => {
74
- const [incoming] = (await once(request, 'response')) as [IncomingMessage]
75
- const status = incoming.statusCode
76
- if (!status) {
77
- throw new Error('Server response did not include a status code')
78
- }
79
- return { incoming, status }
80
- }
81
-
82
- export const requestServer = async (
83
- server: ServerType,
84
- init: ServerRequestInit
85
- ): Promise<Response> => {
86
- const { address, close } = await ensureListening(server)
87
-
88
- // the request may fail mid-flight (e.g. aborted via `init.signal`), so the
89
- // helper-started server is always fully closed before returning or
90
- // surfacing an error
91
- try {
92
- const { incoming, status } = await receiveResponse(sendRequest(server, address, init))
93
-
94
- const hasBody = init.method?.toUpperCase() !== 'HEAD' && ![101, 204, 205, 304].includes(status)
95
-
96
- let responseBody: BodyInit | null = null
97
- if (hasBody) {
98
- // buffer the body so a helper-started server can be fully closed before
99
- // returning, otherwise a subsequent request could hit a half-closed server
100
- const chunks: Buffer[] = []
101
- for await (const chunk of incoming) {
102
- chunks.push(chunk)
103
- }
104
- responseBody = new Uint8Array(Buffer.concat(chunks))
105
- }
106
-
107
- return new GlobalResponse(responseBody, {
108
- headers: newHeadersFromIncoming(incoming),
109
- status,
110
- statusText: incoming.statusMessage,
111
- })
112
- } finally {
113
- await close()
114
- }
115
- }
116
-
117
- /**
118
- * Same as `requestServer`, but exposes the raw body chunks for tests that
119
- * assert streaming behavior: `onHeaders` fires before any body data arrives
120
- * and `onChunk` fires per received chunk, so a test can synchronize with the
121
- * server mid-response. Chunk boundaries are preserved by the chunked
122
- * transfer-encoding framing.
123
- */
124
- export const requestServerChunked = async (
125
- server: ServerType,
126
- init: ServerRequestInit,
127
- hooks: ServerRequestHooks = {}
128
- ): Promise<{ chunks: Buffer[]; response: Response }> => {
129
- const { address, close } = await ensureListening(server)
130
-
131
- try {
132
- const { incoming, status } = await receiveResponse(sendRequest(server, address, init))
133
- const headers = newHeadersFromIncoming(incoming)
134
- hooks.onHeaders?.(headers, status)
135
-
136
- const chunks: Buffer[] = []
137
- incoming.on('data', (chunk: Buffer) => {
138
- hooks.onChunk?.(chunk, chunks.length)
139
- chunks.push(chunk)
140
- })
141
- await once(incoming, 'end')
142
-
143
- return {
144
- chunks,
145
- response: new GlobalResponse(new Uint8Array(Buffer.concat(chunks)), {
146
- headers,
147
- status,
148
- statusText: incoming.statusMessage,
149
- }),
150
- }
151
- } finally {
152
- await close()
153
- }
154
- }
155
-
156
- export const requestServerHttp2 = async (
157
- server: ServerType,
158
- init: Http2RequestInit
159
- ): Promise<Response> => {
160
- const { address, close } = await ensureListening(server)
161
- const client = connect(`http://${address.address}:${address.port}`)
162
- // stream errors reject `once()` below, a session error would otherwise crash
163
- client.once('error', () => {})
164
-
165
- try {
166
- const stream = client.request({
167
- ':method': init.method ?? 'GET',
168
- ':path': init.path,
169
- ...init.headers,
170
- })
171
- stream.end()
172
-
173
- const [incomingHeaders, , rawHeaders] = (await once(stream, 'response')) as [
174
- IncomingHttp2Headers,
175
- number,
176
- string[],
177
- ]
178
- const status = Number(incomingHeaders[':status'])
179
- const headers = newHeadersFromIncoming({ rawHeaders })
180
-
181
- const chunks: Buffer[] = []
182
- stream.on('data', (chunk: Buffer) => chunks.push(chunk))
183
- await once(stream, 'end')
184
-
185
- return new GlobalResponse(new Uint8Array(Buffer.concat(chunks)), { headers, status })
186
- } finally {
187
- client.close()
188
- await close()
189
- }
190
- }