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,34 +0,0 @@
1
- import { streamText } from './index.ts'
2
- import { Context } from '../../context.ts'
3
-
4
- describe('Text Streaming Helper', () => {
5
- const req = new Request('http://localhost/')
6
- let c: Context
7
- beforeEach(() => {
8
- c = new Context(req)
9
- })
10
-
11
- it('Check streamText Response', async () => {
12
- const res = streamText(c, async (stream) => {
13
- for (let i = 0; i < 3; i++) {
14
- await stream.write(`${i}`)
15
- await stream.sleep(1)
16
- }
17
- })
18
-
19
- expect(res.status).toBe(200)
20
- expect(res.headers.get('content-type')).toMatch(/^text\/plain/)
21
- expect(res.headers.get('x-content-type-options')).toBe('nosniff')
22
- expect(res.headers.get('transfer-encoding')).toBe('chunked')
23
-
24
- if (!res.body) {
25
- throw new Error('Body is null')
26
- }
27
- const reader = res.body.getReader()
28
- const decoder = new TextDecoder()
29
- for (let i = 0; i < 3; i++) {
30
- const { value } = await reader.read()
31
- expect(decoder.decode(value)).toEqual(`${i}`)
32
- }
33
- })
34
- })
@@ -1,42 +0,0 @@
1
- import { testClient } from './index.ts'
2
- import { Acryl } from '../../app.ts'
3
-
4
- describe('acryl testClient', () => {
5
- it('Should return the correct search result', async () => {
6
- const app = new Acryl().get('/search', (c) => c.json({ hello: 'world' }))
7
- const res = await testClient(app).search.$get()
8
- expect(await res.json()).toEqual({ hello: 'world' })
9
- })
10
-
11
- it('Should return the correct environment variables value', async () => {
12
- type Bindings = { hello: string }
13
- const app = new Acryl<{ Bindings: Bindings }>().get('/search', (c) => {
14
- return c.json({ hello: c.env.hello })
15
- })
16
- const res = await testClient(app, { hello: 'world' }).search.$get()
17
- expect(await res.json()).toEqual({ hello: 'world' })
18
- })
19
-
20
- it('Should use the passed in headers', async () => {
21
- const app = new Acryl().get('/search', (c) => {
22
- return c.json({ query: c.req.header('x-query') })
23
- })
24
- const res = await testClient(app, undefined, undefined, {
25
- headers: { 'x-query': 'abc' },
26
- }).search.$get()
27
- expect(await res.json()).toEqual({ query: 'abc' })
28
- })
29
-
30
- it('Should return a correct URL with out throwing an error', async () => {
31
- const app = new Acryl().get('/abc', (c) => c.json(0))
32
- const url = testClient(app).abc.$url()
33
- expect(url.pathname).toBe('/abc')
34
- })
35
-
36
- it('Should not throw an error with $ws()', async () => {
37
- vi.stubGlobal('WebSocket', class {})
38
- const app = new Acryl().get('/ws', (c) => c.text('Fake response of a WebSocket'))
39
- // @ts-expect-error $ws is not typed correctly
40
- expect(() => testClient(app).ws.$ws()).not.toThrowError()
41
- })
42
- })
@@ -1,124 +0,0 @@
1
- import type { WSContextInit } from './index.ts'
2
- import { WSContext, createWSMessageEvent, defineWebSocketHelper } from './index.ts'
3
- import { Context } from '../../context.ts'
4
-
5
- describe('`createWSMessageEvent`', () => {
6
- it('Should `createWSMessageEvent` is working for string', () => {
7
- const randomString = Math.random().toString()
8
- const event = createWSMessageEvent(randomString)
9
-
10
- expect(event.data).toBe(randomString)
11
- })
12
- it('Should `createWSMessageEvent` type is `message`', () => {
13
- const event = createWSMessageEvent('')
14
- expect(event.type).toBe('message')
15
- })
16
- })
17
- describe('defineWebSocketHelper', () => {
18
- it('defineWebSocketHelper should work', async () => {
19
- const upgradeWebSocket = defineWebSocketHelper(() => {
20
- return new Response('Hello World', {
21
- status: 200,
22
- })
23
- })
24
- const response = await upgradeWebSocket(() => ({}))(
25
- new Context(new Request('http://localhost')),
26
- () => Promise.resolve()
27
- )
28
- expect(response).toBeTruthy()
29
- expect((response as Response).status).toBe(200)
30
- })
31
- it('When response is undefined, should call next()', async () => {
32
- const upgradeWebSocket = defineWebSocketHelper(() => {
33
- return
34
- })
35
- const next = vi.fn()
36
- await upgradeWebSocket(() => ({}))(new Context(new Request('http://localhost')), next)
37
- expect(next).toBeCalled()
38
- })
39
- it('Use upgradeWebSocket in return', async () => {
40
- const upgradeWebSocket = defineWebSocketHelper(() => {
41
- return new Response('Hello World', {
42
- status: 200,
43
- })
44
- })
45
- const c = new Context(new Request('http://localhost'))
46
- const res = await upgradeWebSocket(c, {})
47
- expect(res.status).toBe(200)
48
- })
49
- it('When upgrading failed and use it in handler, it should throw error', async () => {
50
- const upgradeWebSocket = defineWebSocketHelper(() => {
51
- return
52
- })
53
- const c = new Context(new Request('http://localhost'))
54
- await expect(() => upgradeWebSocket(c, {})).rejects.toThrow()
55
- })
56
- })
57
- describe('WSContext', () => {
58
- it('Should close() works', async () => {
59
- type Result = [number | undefined, string | undefined]
60
- let ws!: WSContext
61
- const promise = new Promise<Result>((resolve) => {
62
- ws = new WSContext({
63
- close(code, reason) {
64
- resolve([code, reason])
65
- },
66
- } as WSContextInit)
67
- })
68
- ws.close(0, 'reason')
69
- const [code, reason] = await promise
70
- expect(code).toBe(0)
71
- expect(reason).toBe('reason')
72
- })
73
- it('Should send() works', async () => {
74
- let ws!: WSContext
75
- const promise = new Promise<string | ArrayBuffer | Uint8Array<ArrayBuffer>>((resolve) => {
76
- ws = new WSContext({
77
- send(data: string | ArrayBuffer | Uint8Array<ArrayBuffer>, _options) {
78
- resolve(data)
79
- },
80
- } as WSContextInit)
81
- })
82
- ws.send('Hello')
83
- expect(await promise).toBe('Hello')
84
- })
85
- it('Should readyState works', () => {
86
- const ws = new WSContext({
87
- readyState: 0,
88
- } as WSContextInit)
89
- expect(ws.readyState).toBe(0)
90
- })
91
- it('Should normalize URL', () => {
92
- const stringURLWS = new WSContext({
93
- url: 'http://localhost',
94
- } as WSContextInit)
95
- expect(stringURLWS.url).toBeInstanceOf(URL)
96
-
97
- const urlURLWS = new WSContext({
98
- url: new URL('http://localhost'),
99
- } as WSContextInit)
100
- expect(urlURLWS.url).toBeInstanceOf(URL)
101
-
102
- const nullURLWS = new WSContext({
103
- url: undefined,
104
- } as WSContextInit)
105
- expect(nullURLWS.url).toBeNull()
106
- })
107
- it('Should normalize message in send()', () => {
108
- let data: string | ArrayBuffer | Uint8Array | null = null
109
- const wsContext = new WSContext({
110
- send(received, _options) {
111
- data = received
112
- },
113
- } as WSContextInit)
114
-
115
- wsContext.send('string')
116
- expect(data).toBe('string')
117
-
118
- wsContext.send(new ArrayBuffer(16))
119
- expect(data).toBeInstanceOf(ArrayBuffer)
120
-
121
- wsContext.send(new Uint8Array(16))
122
- expect(data).toBeInstanceOf(Uint8Array)
123
- })
124
- })
@@ -1,45 +0,0 @@
1
- import { HTTPException } from './http-exception.ts'
2
-
3
- describe('HTTPException', () => {
4
- it('Should be 401 HTTP exception object', async () => {
5
- // We should throw an exception if is not authorized
6
- // because next handlers should not be fired.
7
- const exception = new HTTPException(401, {
8
- message: 'Unauthorized',
9
- })
10
- const res = exception.getResponse()
11
-
12
- expect(res.status).toBe(401)
13
- expect(await res.text()).toBe('Unauthorized')
14
- expect(exception.status).toBe(401)
15
- expect(exception.message).toBe('Unauthorized')
16
- })
17
-
18
- it('Should be accessible to the object causing the exception', async () => {
19
- // We should pass the cause of the error to the cause option
20
- // because it makes debugging easier.
21
- const error = new Error('Server Error')
22
- const exception = new HTTPException(500, {
23
- message: 'Internal Server Error',
24
- cause: error,
25
- })
26
- const res = exception.getResponse()
27
-
28
- expect(res.status).toBe(500)
29
- expect(await res.text()).toBe('Internal Server Error')
30
- expect(exception.status).toBe(500)
31
- expect(exception.message).toBe('Internal Server Error')
32
- expect(exception.cause).toBe(error)
33
- })
34
-
35
- it('Should prioritize the status code over the code in the response', async () => {
36
- const exception = new HTTPException(400, {
37
- res: new Response('An exception', {
38
- status: 200,
39
- }),
40
- })
41
- const res = exception.getResponse()
42
- expect(res.status).toBe(400)
43
- expect(await res.text()).toBe('An exception')
44
- })
45
- })
@@ -1,97 +0,0 @@
1
- /** @jsxImportSource ./ */
2
-
3
- import type { HtmlEscapedString } from '../utils/html.ts'
4
- import type { Child, JSXNode } from './base.ts'
5
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
6
- import { cloneElement, jsx, Fragment } from './base.ts'
7
-
8
- describe('cloneElement', () => {
9
- it('should clone an element with new props', () => {
10
- const element = <div className='original'>Hello</div>
11
- const clonedElement = cloneElement(element, { className: 'cloned' })
12
- expect((clonedElement as unknown as JSXNode).props.className).toBe('cloned')
13
- expect((clonedElement as unknown as JSXNode).props.children).toBe('Hello')
14
- })
15
-
16
- it('should clone a children element', () => {
17
- const fnElement = ({ message }: { message: string }) => <div>{message}</div>
18
- const element = fnElement({ message: 'Hello' })
19
- const clonedElement = cloneElement(element, {})
20
- expect(element.toString()).toBe('<div>Hello</div>')
21
- expect(clonedElement.toString()).toBe('<div>Hello</div>')
22
- })
23
-
24
- it('should clone an element with new children', () => {
25
- const fnElement = ({ message }: { message: string }) => <div>{message}</div>
26
- const element = fnElement({ message: 'Hello' })
27
- const clonedElement = cloneElement(element, {}, 'World')
28
- expect(element.toString()).toBe('<div>Hello</div>')
29
- expect(clonedElement.toString()).toBe('<div>World</div>')
30
- })
31
-
32
- it('should self-close a wrapped empty tag', () => {
33
- const Hr = ({ ...props }) => <hr {...props} />
34
- const element = <Hr />
35
- expect(element.toString()).toBe('<hr/>')
36
- })
37
-
38
- it('should preserve self-closing empty tag when cloned', () => {
39
- const element = <img src='foo.png' />
40
- const clonedElement = cloneElement(element, { alt: 'bar' })
41
- expect(element.toString()).toBe('<img src="foo.png"/>')
42
- expect(clonedElement.toString()).toBe('<img src="foo.png" alt="bar"/>')
43
- })
44
-
45
- it('should clone an element with array children', () => {
46
- const element = (
47
- <div>
48
- <span>1</span>
49
- <span>2</span>
50
- </div>
51
- )
52
- const clonedElement = cloneElement(element, { className: 'cloned' })
53
- expect(clonedElement.toString()).toBe('<div class="cloned"><span>1</span><span>2</span></div>')
54
- })
55
- })
56
-
57
- describe('createElement', () => {
58
- it('should accept a component that returns a JSXNode', () => {
59
- const Partial = ({ name }: { name: string }) => jsx('div', { 'x-partial': name }, name)
60
-
61
- expect((<Partial name='foo' />).toString()).toBe('<div x-partial="foo">foo</div>')
62
- })
63
-
64
- it('should preserve the SVG element shape', () => {
65
- const ref = { current: null }
66
- const element = jsx('svg', { ref }) as unknown as JSXNode
67
- expect(element.tag).toBe('svg')
68
- expect(element.type).toBe('svg')
69
- expect(element.ref).toBe(ref)
70
- })
71
-
72
- it('should accept a Child-typed value as a child', () => {
73
- const child: Child = <span>inner</span>
74
- const element = jsx('div', null, child) as unknown as JSXNode
75
- expect(element.toString()).toBe('<div><span>inner</span></div>')
76
- })
77
-
78
- it('should escape a string returned by an asynchronous component', async () => {
79
- const Async = async () => '<img src=x onerror=alert(1)>' as unknown as HtmlEscapedString
80
-
81
- expect(
82
- String(
83
- await (
84
- <div>
85
- <Async />
86
- </div>
87
- ).toString()
88
- )
89
- ).toBe('<div>&lt;img src=x onerror=alert(1)&gt;</div>')
90
- })
91
-
92
- it('should omit an unsupported object child', () => {
93
- const object = { toString: () => 'plain-text' }
94
-
95
- expect((<div>{object as never}</div>).toString()).toBe('<div></div>')
96
- })
97
- })
@@ -1,52 +0,0 @@
1
- import { createElement } from './index.ts'
2
- import { Children } from './children.ts'
3
-
4
- describe('map', () => {
5
- it('should map children', () => {
6
- const element = createElement('div', null, 1, 2, 3)
7
- const result = Children.map(element.children, (child) => (child as number) * 2)
8
- expect(result).toEqual([2, 4, 6])
9
- })
10
- })
11
-
12
- describe('forEach', () => {
13
- it('should iterate children', () => {
14
- const element = createElement('div', null, 1, 2, 3)
15
- const result: number[] = []
16
- Children.forEach(element.children, (child) => {
17
- result.push(child as number)
18
- })
19
- expect(result).toEqual([1, 2, 3])
20
- })
21
- })
22
-
23
- describe('count', () => {
24
- it('should count children', () => {
25
- const element = createElement('div', null, 1, 2, 3)
26
- const result = Children.count(element.children)
27
- expect(result).toBe(3)
28
- })
29
- })
30
-
31
- describe('only', () => {
32
- it('should return the only child', () => {
33
- const element = createElement('div', null, 1)
34
- const result = Children.only(element.children)
35
- expect(result).toBe(1)
36
- })
37
-
38
- it('should throw an error if there are multiple children', () => {
39
- const element = createElement('div', null, 1, 2)
40
- expect(() => Children.only(element.children)).toThrowError(
41
- 'Children.only() expects only one child'
42
- )
43
- })
44
- })
45
-
46
- describe('toArray', () => {
47
- it('should convert children to an array', () => {
48
- const element = createElement('div', null, 1, 2, 3)
49
- const result = Children.toArray(element.children)
50
- expect(result).toEqual([1, 2, 3])
51
- })
52
- })