acrylblends 0.6.3 → 0.7.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 (285) hide show
  1. package/README.md +4 -3
  2. package/docs/framework/README.md +2 -2
  3. package/docs/framework/UPSTREAM.md +1 -1
  4. package/docs/framework/guides/jsx.md +51 -1
  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/{base-ddiVmiE7.js → base-NSN_SNv-.js} +1 -0
  13. package/lib/basic-auth.d.ts +1 -1
  14. package/lib/bearer-auth.d.ts +1 -1
  15. package/lib/body-limit.d.ts +1 -1
  16. package/lib/cache.d.ts +1 -1
  17. package/lib/cache.js +4 -4
  18. package/lib/{client-BHTr318g.js → client-DDLXwhBo.js} +2 -125
  19. package/lib/client.d.ts +2 -2
  20. package/lib/client.js +2 -1
  21. package/lib/combine.d.ts +1 -1
  22. package/lib/{components-DYZdxJIJ.js → components-JXVm45kK.js} +1 -1
  23. package/lib/{components-Ce5FRyHU.js → components-cEW3ovK0.js} +3 -3
  24. package/lib/compress.d.ts +1 -1
  25. package/lib/conninfo.d.ts +2 -2
  26. package/lib/{context-DVQBjuns.d.ts → context-DS3fYyG-.d.ts} +1 -1
  27. package/lib/context-storage.d.ts +1 -1
  28. package/lib/cookie.d.ts +1 -1
  29. package/lib/cors.d.ts +1 -1
  30. package/lib/csrf.d.ts +1 -1
  31. package/lib/dev.d.ts +2 -2
  32. package/lib/etag.d.ts +1 -1
  33. package/lib/factory.d.ts +2 -2
  34. package/lib/{hooks-Bq5q9IMl.js → hooks-w72iLeFR.js} +6 -6
  35. package/lib/{index-CUTfU69R.d.ts → index-Bb7YJKCq.d.ts} +2 -2
  36. package/lib/{index-CsvB-F9j.d.ts → index-BvFh1Gfx.d.ts} +1 -1
  37. package/lib/{index-Cqcdluyn.d.ts → index-CTy4N7ng.d.ts} +2 -2
  38. package/lib/index.d.ts +4 -4
  39. package/lib/ip-restriction.d.ts +2 -2
  40. package/lib/jsx/dom/client.js +1 -1
  41. package/lib/jsx/dom/jsx-dev-runtime.js +1 -1
  42. package/lib/jsx/dom/jsx-runtime.js +1 -1
  43. package/lib/jsx/dom/server.js +2 -2
  44. package/lib/jsx/dom.js +4 -4
  45. package/lib/jsx/jsx-dev-runtime.js +1 -1
  46. package/lib/jsx/jsx-runtime.js +1 -1
  47. package/lib/jsx/streaming.js +1 -1
  48. package/lib/{jsx-dev-runtime-kAhR_4C7.js → jsx-dev-runtime-CWLRA2F3.js} +2 -2
  49. package/lib/jsx-renderer.d.ts +75 -0
  50. package/lib/jsx-renderer.js +99 -0
  51. package/lib/jsx.js +4 -4
  52. package/lib/jwk.d.ts +1 -1
  53. package/lib/jwt.d.ts +1 -1
  54. package/lib/language.d.ts +1 -1
  55. package/lib/logger.d.ts +1 -1
  56. package/lib/loopback-only.d.ts +1 -1
  57. package/lib/method-not-allowed.d.ts +2 -2
  58. package/lib/method-override.d.ts +2 -2
  59. package/lib/mount.d.ts +1 -1
  60. package/lib/node-server/conninfo.d.ts +1 -1
  61. package/lib/node-server/register.d.ts +1 -0
  62. package/lib/node-server/register.js +73 -0
  63. package/lib/node-server/serve-static.d.ts +1 -1
  64. package/lib/node-server/serve-static.js +1 -1
  65. package/lib/node-server.d.ts +1 -1
  66. package/lib/node-server.js +1 -1
  67. package/lib/powered-by.d.ts +1 -1
  68. package/lib/pretty-json.d.ts +1 -1
  69. package/lib/quick.d.ts +1 -1
  70. package/lib/request-id.d.ts +1 -1
  71. package/lib/request.d.ts +1 -1
  72. package/lib/route.d.ts +1 -1
  73. package/lib/schema-validator.d.ts +1 -1
  74. package/lib/secure-headers.d.ts +1 -1
  75. package/lib/{serve-static-Cw23shXv.js → serve-static-B14MF1Va.js} +1 -0
  76. package/lib/serve-static.d.ts +1 -1
  77. package/lib/ssg-BwjcA-Ge.js +389 -0
  78. package/lib/ssg.d.ts +156 -0
  79. package/lib/ssg.js +2 -0
  80. package/lib/streaming.d.ts +1 -1
  81. package/lib/testing.d.ts +3 -3
  82. package/lib/testing.js +1 -1
  83. package/lib/timeout.d.ts +1 -1
  84. package/lib/timing.d.ts +1 -1
  85. package/lib/tiny.d.ts +1 -1
  86. package/lib/trailing-slash.d.ts +1 -1
  87. package/lib/{types-nEL8VPDC.d.ts → types-Dv_nV2cv.d.ts} +1 -1
  88. package/lib/{types-CQiGmsWW.d.ts → types-zNxyEpG2.d.ts} +2 -2
  89. package/lib/types.d.ts +1 -1
  90. package/lib/utils/body.d.ts +1 -1
  91. package/lib/utils/ipaddr.d.ts +1 -1
  92. package/lib/utils-Cx61GFMC.js +125 -0
  93. package/lib/validator.d.ts +1 -1
  94. package/lib/ws.d.ts +1 -1
  95. package/package.json +13 -1
  96. package/plugins/acryl-inspect/upstream.json +1 -1
  97. package/plugins/acryl-node-server/src/register.ts +86 -0
  98. package/plugins/acryl-node-server/upstream.json +5 -3
  99. package/plugins/acryl-router/src/core/helper/ssg/index.ts +14 -0
  100. package/plugins/acryl-router/src/core/helper/ssg/middleware.ts +83 -0
  101. package/plugins/acryl-router/src/core/helper/ssg/plugins.ts +72 -0
  102. package/plugins/acryl-router/src/core/helper/ssg/ssg.ts +471 -0
  103. package/plugins/acryl-router/src/core/helper/ssg/utils.ts +118 -0
  104. package/plugins/acryl-router/src/core/jsx/dom/render.ts +6 -6
  105. package/plugins/acryl-router/src/core/middleware/cache/index.ts +4 -4
  106. package/plugins/acryl-router/src/core/middleware/jsx-renderer/index.ts +162 -0
  107. package/plugins/acryl-router/src/helpers/index.ts +1 -0
  108. package/plugins/acryl-router/src/middleware/index.ts +1 -0
  109. package/plugins/acryl-router/upstream.json +2 -2
  110. package/plugins/acryl-router-http/upstream.json +1 -1
  111. package/plugins/acryl-state/upstream.json +1 -1
  112. package/plugins/desktop/main.ts +4 -1
  113. package/plugins/desktop/upstream.json +1 -1
  114. package/plugins/desktop-web/main.ts +3 -1
  115. package/plugins/desktop-web/upstream.json +1 -1
  116. package/plugins/extensions/resolve.ts +4 -0
  117. package/shared/AGENTS.core.md +3 -0
  118. package/templates/agent/package.json +7 -3
  119. package/templates/agent/tsconfig.json +10 -2
  120. package/templates/blank/package.json +7 -3
  121. package/templates/blank/src/about.tsx +14 -0
  122. package/templates/blank/src/routes.ts +2 -0
  123. package/templates/blank/test/app.test.ts +15 -0
  124. package/templates/blank/tsconfig.json +3 -1
  125. package/templates/todo/package.json +7 -3
  126. package/templates/todo/tsconfig.json +3 -1
  127. package/templates/todo/upstream.json +1 -1
  128. package/plugins/acryl-inspect/tests/report.spec.ts +0 -69
  129. package/plugins/acryl-inspect/tests/service.spec.ts +0 -121
  130. package/plugins/acryl-node-server/tests/adapter/app.ts +0 -76
  131. package/plugins/acryl-node-server/tests/adapter/assets/.static/plain.txt +0 -1
  132. package/plugins/acryl-node-server/tests/adapter/assets/favicon.ico +0 -0
  133. package/plugins/acryl-node-server/tests/adapter/assets/secret.txt +0 -1
  134. package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +0 -1
  135. package/plugins/acryl-node-server/tests/adapter/assets/static/admin/secret.txt +0 -1
  136. package/plugins/acryl-node-server/tests/adapter/assets/static/data.json +0 -5
  137. package/plugins/acryl-node-server/tests/adapter/assets/static/extensionless +0 -1
  138. package/plugins/acryl-node-server/tests/adapter/assets/static/foo..bar.txt +0 -0
  139. package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +0 -1
  140. package/plugins/acryl-node-server/tests/adapter/assets/static/plain.txt +0 -1
  141. package/plugins/acryl-node-server/tests/adapter/assets/static-with-context-path/plain.txt +0 -1
  142. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin +0 -1
  143. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin.br +0 -1
  144. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt +0 -1
  145. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.br +0 -1
  146. package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.zst +0 -1
  147. package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +0 -34
  148. package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +0 -248
  149. package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +0 -457
  150. package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-cert.pem +0 -23
  151. package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-key.pem +0 -27
  152. package/plugins/acryl-node-server/tests/adapter/headers.test.ts +0 -252
  153. package/plugins/acryl-node-server/tests/adapter/helpers/request.ts +0 -190
  154. package/plugins/acryl-node-server/tests/adapter/listener.test.ts +0 -727
  155. package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +0 -189
  156. package/plugins/acryl-node-server/tests/adapter/request.test.ts +0 -1230
  157. package/plugins/acryl-node-server/tests/adapter/response.test.ts +0 -285
  158. package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +0 -849
  159. package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +0 -790
  160. package/plugins/acryl-node-server/tests/adapter/server.test.ts +0 -1312
  161. package/plugins/acryl-node-server/tests/adapter/setup.ts +0 -16
  162. package/plugins/acryl-node-server/tests/adapter/url.test.ts +0 -76
  163. package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +0 -23
  164. package/plugins/acryl-node-server/tests/adapter/utils/stream.test.ts +0 -75
  165. package/plugins/acryl-node-server/tests/adapter/utils.test.ts +0 -235
  166. package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +0 -260
  167. package/plugins/acryl-node-server/tests/server.spec.ts +0 -141
  168. package/plugins/acryl-router/src/core/app.test.ts +0 -3833
  169. package/plugins/acryl-router/src/core/client/client.test.ts +0 -2313
  170. package/plugins/acryl-router/src/core/client/types.test.ts +0 -149
  171. package/plugins/acryl-router/src/core/client/utils.test.ts +0 -405
  172. package/plugins/acryl-router/src/core/compose.test.ts +0 -751
  173. package/plugins/acryl-router/src/core/context.test.ts +0 -629
  174. package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +0 -344
  175. package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +0 -55
  176. package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +0 -510
  177. package/plugins/acryl-router/src/core/helper/css/common.case.test.tsx +0 -506
  178. package/plugins/acryl-router/src/core/helper/css/index.test.tsx +0 -678
  179. package/plugins/acryl-router/src/core/helper/dev/index.test.ts +0 -181
  180. package/plugins/acryl-router/src/core/helper/factory/index.test.ts +0 -434
  181. package/plugins/acryl-router/src/core/helper/html/index.test.ts +0 -78
  182. package/plugins/acryl-router/src/core/helper/proxy/index.test.ts +0 -356
  183. package/plugins/acryl-router/src/core/helper/route/index.test.ts +0 -259
  184. package/plugins/acryl-router/src/core/helper/streaming/sse.test.tsx +0 -557
  185. package/plugins/acryl-router/src/core/helper/streaming/stream.test.ts +0 -128
  186. package/plugins/acryl-router/src/core/helper/streaming/text.test.ts +0 -34
  187. package/plugins/acryl-router/src/core/helper/testing/index.test.ts +0 -42
  188. package/plugins/acryl-router/src/core/helper/websocket/index.test.ts +0 -124
  189. package/plugins/acryl-router/src/core/http-exception.test.ts +0 -45
  190. package/plugins/acryl-router/src/core/jsx/base.test.tsx +0 -97
  191. package/plugins/acryl-router/src/core/jsx/children.test.ts +0 -52
  192. package/plugins/acryl-router/src/core/jsx/components.test.tsx +0 -936
  193. package/plugins/acryl-router/src/core/jsx/context-isolation.test.ts +0 -655
  194. package/plugins/acryl-router/src/core/jsx/dom/client.test.tsx +0 -128
  195. package/plugins/acryl-router/src/core/jsx/dom/components.test.tsx +0 -330
  196. package/plugins/acryl-router/src/core/jsx/dom/context.test.tsx +0 -184
  197. package/plugins/acryl-router/src/core/jsx/dom/css.test.tsx +0 -149
  198. package/plugins/acryl-router/src/core/jsx/dom/hooks/index.test.tsx +0 -172
  199. package/plugins/acryl-router/src/core/jsx/dom/index.test.tsx +0 -3681
  200. package/plugins/acryl-router/src/core/jsx/dom/intrinsic-element/components.test.tsx +0 -1344
  201. package/plugins/acryl-router/src/core/jsx/dom/server.test.tsx +0 -199
  202. package/plugins/acryl-router/src/core/jsx/hooks/dom.test.tsx +0 -859
  203. package/plugins/acryl-router/src/core/jsx/hooks/string.test.tsx +0 -40
  204. package/plugins/acryl-router/src/core/jsx/index.test.tsx +0 -1744
  205. package/plugins/acryl-router/src/core/jsx/intrinsic-element/components.test.tsx +0 -666
  206. package/plugins/acryl-router/src/core/jsx/jsx-runtime.test.tsx +0 -85
  207. package/plugins/acryl-router/src/core/jsx/streaming.test.tsx +0 -1281
  208. package/plugins/acryl-router/src/core/jsx/utils.test.ts +0 -366
  209. package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +0 -434
  210. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +0 -1018
  211. package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +0 -273
  212. package/plugins/acryl-router/src/core/middleware/cache/index.test.ts +0 -1211
  213. package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +0 -355
  214. package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +0 -535
  215. package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +0 -43
  216. package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +0 -532
  217. package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +0 -534
  218. package/plugins/acryl-router/src/core/middleware/etag/digest.test.ts +0 -21
  219. package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +0 -503
  220. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +0 -217
  221. package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +0 -1135
  222. package/plugins/acryl-router/src/core/middleware/jwk/keys.test.json +0 -48
  223. package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +0 -802
  224. package/plugins/acryl-router/src/core/middleware/language/index.test.ts +0 -552
  225. package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +0 -204
  226. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +0 -292
  227. package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +0 -221
  228. package/plugins/acryl-router/src/core/middleware/mount/index.test.ts +0 -334
  229. package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +0 -37
  230. package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +0 -218
  231. package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +0 -168
  232. package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +0 -671
  233. package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +0 -450
  234. package/plugins/acryl-router/src/core/middleware/serve-static/path.test.ts +0 -50
  235. package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +0 -70
  236. package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +0 -310
  237. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +0 -381
  238. package/plugins/acryl-router/src/core/preset/quick.test.ts +0 -42
  239. package/plugins/acryl-router/src/core/preset/tiny.test.ts +0 -42
  240. package/plugins/acryl-router/src/core/request.test.ts +0 -751
  241. package/plugins/acryl-router/src/core/router/common.case.test.ts +0 -1132
  242. package/plugins/acryl-router/src/core/router/linear-router/router.test.ts +0 -80
  243. package/plugins/acryl-router/src/core/router/pattern-router/router.test.ts +0 -46
  244. package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.test.ts +0 -154
  245. package/plugins/acryl-router/src/core/router/reg-exp-router/router.test.ts +0 -265
  246. package/plugins/acryl-router/src/core/router/smart-router/router.test.ts +0 -13
  247. package/plugins/acryl-router/src/core/router/trie-router/node.test.ts +0 -896
  248. package/plugins/acryl-router/src/core/router/trie-router/router.test.ts +0 -8
  249. package/plugins/acryl-router/src/core/types.test.ts +0 -4134
  250. package/plugins/acryl-router/src/core/utils/accept.test.ts +0 -299
  251. package/plugins/acryl-router/src/core/utils/basic-auth.test.ts +0 -56
  252. package/plugins/acryl-router/src/core/utils/body.test.ts +0 -496
  253. package/plugins/acryl-router/src/core/utils/buffer.test.ts +0 -147
  254. package/plugins/acryl-router/src/core/utils/color.test.ts +0 -23
  255. package/plugins/acryl-router/src/core/utils/concurrent.test.ts +0 -69
  256. package/plugins/acryl-router/src/core/utils/cookie.test.ts +0 -460
  257. package/plugins/acryl-router/src/core/utils/crypto.test.ts +0 -43
  258. package/plugins/acryl-router/src/core/utils/encode.test.ts +0 -61
  259. package/plugins/acryl-router/src/core/utils/filepath.test.ts +0 -78
  260. package/plugins/acryl-router/src/core/utils/html.test.ts +0 -16
  261. package/plugins/acryl-router/src/core/utils/ipaddr.test.ts +0 -149
  262. package/plugins/acryl-router/src/core/utils/jwt/jwa.test.ts +0 -86
  263. package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +0 -1788
  264. package/plugins/acryl-router/src/core/utils/mime.test.ts +0 -64
  265. package/plugins/acryl-router/src/core/utils/stream.test.ts +0 -212
  266. package/plugins/acryl-router/src/core/utils/types.test.ts +0 -295
  267. package/plugins/acryl-router/src/core/utils/url.test.ts +0 -384
  268. package/plugins/acryl-router/src/core/validator/utils.test.ts +0 -82
  269. package/plugins/acryl-router/src/core/validator/validator.test.ts +0 -1488
  270. package/plugins/acryl-router/tests/docs-examples.spec.ts +0 -152
  271. package/plugins/acryl-router/tests/jsx.spec.tsx +0 -63
  272. package/plugins/acryl-router/tests/live-install.spec.ts +0 -64
  273. package/plugins/acryl-router/tests/loader.spec.ts +0 -72
  274. package/plugins/acryl-router/tests/loopback-only.spec.ts +0 -80
  275. package/plugins/acryl-router/tests/no-dom/consumer.ts +0 -11
  276. package/plugins/acryl-router/tests/no-dom/tsconfig.json +0 -13
  277. package/plugins/acryl-router/tests/service.spec.ts +0 -426
  278. package/plugins/acryl-router/tests/shadow-state.spec.ts +0 -79
  279. package/plugins/acryl-router-http/tests/adapter.spec.ts +0 -174
  280. package/plugins/acryl-router-http/tests/stream.spec.ts +0 -133
  281. package/plugins/acryl-router-http/tests/surfaces.spec.ts +0 -101
  282. package/plugins/acryl-state/src/react.ts +0 -11
  283. package/plugins/acryl-state/tests/cell.spec.ts +0 -71
  284. package/plugins/acryl-state/tests/react.spec.ts +0 -39
  285. package/plugins/acryl-state/tests/service.spec.ts +0 -132
@@ -1,285 +0,0 @@
1
- import { createServer } from 'node:http'
2
- import type { Server } from 'node:http'
3
- import type { AddressInfo } from 'node:net'
4
- import { GlobalResponse, Response as LightweightResponse, cacheKey } from '../../src/adapter/response.ts'
5
-
6
- Object.defineProperty(global, 'Response', {
7
- value: LightweightResponse,
8
- })
9
-
10
- class NextResponse extends LightweightResponse {}
11
-
12
- class UpperCaseStream extends TransformStream {
13
- constructor() {
14
- super({
15
- transform(chunk, controller) {
16
- controller.enqueue(
17
- new TextEncoder().encode(new TextDecoder().decode(chunk).toString().toUpperCase())
18
- )
19
- },
20
- })
21
- }
22
- }
23
-
24
- describe('Response', () => {
25
- let server: Server
26
- let port: number
27
- beforeAll(
28
- async () =>
29
- new Promise<void>((resolve) => {
30
- server = createServer((_, res) => {
31
- res.writeHead(200, {
32
- 'Content-Type': 'application/json charset=UTF-8',
33
- })
34
- res.end(JSON.stringify({ status: 'ok' }))
35
- })
36
- .listen(0)
37
- .on('listening', () => {
38
- port = (server.address() as AddressInfo).port
39
- resolve()
40
- })
41
- })
42
- )
43
-
44
- afterAll(() => {
45
- server.close()
46
- })
47
-
48
- it('Should be overrode by Response', () => {
49
- expect(Response).not.toBe(GlobalResponse)
50
- })
51
-
52
- it('Compatibility with standard Response object', async () => {
53
- // response name not changed
54
- expect(Response.name).toEqual('Response')
55
-
56
- // response prototype chain not changed
57
- expect(new Response()).toBeInstanceOf(GlobalResponse)
58
-
59
- // `fetch()` and `Response` are not changed
60
- const fetchRes = await fetch(`http://localhost:${port}`)
61
- expect(new Response()).toBeInstanceOf(fetchRes.constructor)
62
- const resJson = await fetchRes.json()
63
- expect(fetchRes.headers.get('content-type')).toEqual('application/json charset=UTF-8')
64
- expect(resJson).toEqual({ status: 'ok' })
65
-
66
- // can only use new operator
67
- expect(() => {
68
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
- ;(Response as any)()
70
- }).toThrow()
71
-
72
- // support Response static method
73
- expect(Response.error).toEqual(expect.any(Function))
74
- expect(Response.json).toEqual(expect.any(Function))
75
- expect(Response.redirect).toEqual(expect.any(Function))
76
-
77
- // support other class to extends from Response
78
- expect(new NextResponse()).toBeInstanceOf(Response)
79
- })
80
-
81
- it('Should not lose header data', async () => {
82
- const parentResponse = new Response('OK', {
83
- headers: {
84
- 'content-type': 'application/json',
85
- },
86
- })
87
- const childResponse = new Response('OK', parentResponse)
88
- parentResponse.headers.delete('content-type')
89
- expect(childResponse.headers.get('content-type')).toEqual('application/json')
90
- })
91
-
92
- it('Should preserve mutated headers when cloned before body access', () => {
93
- const parentResponse = new Response('hello', {
94
- status: 200,
95
- headers: { 'content-type': 'application/json' },
96
- })
97
- parentResponse.headers.append('set-cookie', 'session=abc; Path=/; HttpOnly')
98
-
99
- const childResponse = new Response('hello', parentResponse)
100
- expect(childResponse.headers.get('set-cookie')).toEqual('session=abc; Path=/; HttpOnly')
101
- expect(childResponse.headers.get('content-type')).toEqual('application/json')
102
- })
103
-
104
- it('Should preserve mutated headers when cloned after body access', () => {
105
- const parentResponse = new Response('hello', {
106
- status: 200,
107
- headers: { 'content-type': 'application/json' },
108
- })
109
- parentResponse.headers.append('set-cookie', 'session=xyz; Path=/; HttpOnly')
110
-
111
- const childResponse = new Response(parentResponse.body, parentResponse)
112
- expect(childResponse.headers.get('set-cookie')).toEqual('session=xyz; Path=/; HttpOnly')
113
- expect(childResponse.headers.get('content-type')).toEqual('application/json')
114
- })
115
-
116
- it('Should preserve status and statusText when headers are mutated', () => {
117
- const res = new Response('hello', {
118
- status: 201,
119
- statusText: 'Created',
120
- headers: { 'content-type': 'application/json' },
121
- })
122
- res.headers.append('set-cookie', 'session=abc; Path=/; HttpOnly')
123
-
124
- expect(res.status).toEqual(201)
125
- expect(res.statusText).toEqual('Created')
126
- expect(res.headers.get('set-cookie')).toEqual('session=abc; Path=/; HttpOnly')
127
- })
128
-
129
- it('Should preserve status from a native Response after materialization', () => {
130
- const nativeRedirect = new GlobalResponse(null, {
131
- status: 302,
132
- headers: { location: 'https://example.com/' },
133
- })
134
- const res = new Response(nativeRedirect.body, nativeRedirect)
135
-
136
- expect(res.status).toEqual(302)
137
- void res.body
138
- expect(res.status).toEqual(302)
139
- expect(res.headers.get('location')).toEqual('https://example.com/')
140
- })
141
-
142
- it('Should copy headers when rebuilding a response from fetch()', async () => {
143
- const upstream = await fetch(`http://localhost:${port}`)
144
- const rebuilt = new Response(upstream.body, upstream)
145
- rebuilt.headers.set('x-test', '1')
146
- expect(rebuilt.headers.get('x-test')).toEqual('1')
147
- expect(rebuilt.headers.get('content-type')).toEqual('application/json charset=UTF-8')
148
- expect(upstream.headers.get('x-test')).toBeNull()
149
- expect(await rebuilt.json()).toEqual({ status: 'ok' })
150
- })
151
-
152
- it('Nested constructors should not cause an error even if ReadableStream is specified', async () => {
153
- const stream = new Response('acryl').body
154
- const parentResponse = new Response(stream)
155
- const upperCaseStream = new UpperCaseStream()
156
- const childResponse = new Response(
157
- parentResponse.body!.pipeThrough(upperCaseStream),
158
- parentResponse
159
- )
160
- expect(await childResponse.text()).toEqual('ACRYL')
161
- })
162
-
163
- describe('Response.json', () => {
164
- it('should return 200 with application/json content-type by default', () => {
165
- const res = Response.json({ hello: 'world' })
166
- expect(res.status).toBe(200)
167
- expect(res.headers.get('content-type')).toBe('application/json')
168
- })
169
-
170
- it('should serialize data correctly', async () => {
171
- const data = { hello: 'world', num: 42, arr: [1, 2, 3] }
172
- const res = Response.json(data)
173
- expect(await res.json()).toEqual(data)
174
- })
175
-
176
- it('should use custom status from init', () => {
177
- const res = Response.json({ error: 'not found' }, { status: 404 })
178
- expect(res.status).toBe(404)
179
- })
180
-
181
- it('should preserve statusText from init', () => {
182
- const res = Response.json({ error: 'not found' }, { status: 404, statusText: 'Not Found' })
183
- expect(res.statusText).toBe('Not Found')
184
- })
185
-
186
- it('should preserve custom content-type from init headers', () => {
187
- const res = Response.json(
188
- { data: 'test' },
189
- { headers: { 'content-type': 'application/vnd.api+json' } }
190
- )
191
- expect(res.headers.get('content-type')).toBe('application/vnd.api+json')
192
- })
193
-
194
- it('should set application/json when init headers do not include content-type', () => {
195
- const res = Response.json({ data: 'test' }, { headers: { 'x-custom': 'value' } })
196
- expect(res.headers.get('content-type')).toBe('application/json')
197
- expect(res.headers.get('x-custom')).toBe('value')
198
- })
199
-
200
- it('should return a LightweightResponse with cacheKey set for the fast path', () => {
201
- const res = Response.json({ ok: true })
202
- expect(res).toBeInstanceOf(LightweightResponse)
203
- expect(cacheKey in res).toBe(true)
204
- })
205
-
206
- it('should throw for non-serializable data', () => {
207
- const circ: Record<string, unknown> = {}
208
- circ.self = circ
209
- expect(() => Response.json(circ)).toThrow(TypeError)
210
- })
211
- })
212
-
213
- describe('Response.redirect', () => {
214
- it('should return a 302 redirect by default', () => {
215
- const res = Response.redirect('https://example.com')
216
- expect(res.status).toBe(302)
217
- expect(res.headers.get('location')).toBe('https://example.com')
218
- })
219
-
220
- it('should use a custom redirect status', () => {
221
- const res = Response.redirect('https://example.com/new', 301)
222
- expect(res.status).toBe(301)
223
- })
224
-
225
- it('should accept a URL object', () => {
226
- const res = Response.redirect(new URL('https://example.com/path'))
227
- expect(res.headers.get('location')).toBe('https://example.com/path')
228
- })
229
-
230
- it('should throw for invalid status codes', () => {
231
- expect(() => Response.redirect('https://example.com', 200)).toThrow(RangeError)
232
- })
233
-
234
- it('should return a LightweightResponse with cacheKey set for the fast path', () => {
235
- const res = Response.redirect('https://example.com')
236
- expect(res).toBeInstanceOf(LightweightResponse)
237
- expect(cacheKey in res).toBe(true)
238
- })
239
- })
240
-
241
- describe('Fallback to GlobalResponse object', () => {
242
- it('Should return value from internal cache', () => {
243
- const res = new Response('Hello! Node!')
244
- res.headers.set('x-test', 'test')
245
- expect(res.headers.get('x-test')).toEqual('test')
246
- expect(res.status).toEqual(200)
247
- expect(res.ok).toEqual(true)
248
- expect(cacheKey in res).toBe(true)
249
- })
250
-
251
- it('Should return value from generated GlobalResponse object', () => {
252
- const res = new Response('Hello! Node!', {
253
- statusText: 'OK',
254
- })
255
- expect(res.statusText).toEqual('OK')
256
- expect(cacheKey in res).toBe(false)
257
- })
258
- })
259
-
260
- describe('util.inspect', () => {
261
- it('should show a lightweight response summary before native Response creation', () => {
262
- const { inspect } = require('node:util')
263
- const res = new Response('Hello')
264
-
265
- expect(() => inspect(res)).not.toThrow()
266
- const result = inspect(res)
267
- expect(result).toContain('Response (lightweight)')
268
- expect(result).toContain('200')
269
- expect(result).toContain('nativeResponse: undefined')
270
- expect(res).toBeInstanceOf(GlobalResponse)
271
- })
272
-
273
- it('should include the native Response after cache creation', async () => {
274
- const { inspect } = require('node:util')
275
- const res = new Response('Hello', { statusText: 'OK' })
276
-
277
- // Access statusText to trigger native Response creation
278
- res.statusText
279
-
280
- const result = inspect(res)
281
- expect(result).toContain('Response (lightweight)')
282
- expect(result).toContain('nativeResponse: Response {')
283
- })
284
- })
285
- })