acrylblends 0.6.1 → 0.6.3

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 (217) hide show
  1. package/README.md +11 -6
  2. package/docs/framework/README.md +3 -2
  3. package/docs/framework/UPSTREAM.md +1 -1
  4. package/docs/framework/api/presets.md +0 -3
  5. package/docs/framework/cordis/acryl-in-a-cordis-app.md +9 -0
  6. package/docs/framework/getting-started/basic.md +5 -4
  7. package/docs/framework/getting-started/desktop.md +41 -0
  8. package/docs/framework/guides/jsx-dom.md +0 -3
  9. package/docs/framework/guides/jsx.md +1 -4
  10. package/docs/framework/guides/middleware.md +1 -1
  11. package/docs/framework/helpers/cookie.md +1 -1
  12. package/docs/framework/helpers/css.md +0 -3
  13. package/docs/framework/helpers/dev.md +0 -3
  14. package/docs/framework/helpers/jwt.md +1 -1
  15. package/docs/framework/helpers/proxy.md +0 -3
  16. package/docs/framework/middleware/builtin/basic-auth.md +6 -6
  17. package/docs/framework/middleware/builtin/cache.md +0 -3
  18. package/docs/framework/middleware/builtin/combine.md +1 -1
  19. package/docs/framework/middleware/builtin/ip-restriction.md +1 -1
  20. package/docs/framework/middleware/builtin/logger.md +1 -1
  21. package/docs/framework/middleware/builtin/mount.md +0 -3
  22. package/docs/framework/upstream.json +3 -3
  23. package/lib/accepts.d.ts +1 -1
  24. package/lib/acryl-base.d.ts +1 -1
  25. package/lib/adapter.d.ts +1 -1
  26. package/lib/{app-CmAYW1Al.d.ts → app-wFwpg-bt.d.ts} +1 -1
  27. package/lib/base-BpQy2Rk7.d.ts +783 -0
  28. package/lib/base-ddiVmiE7.js +721 -0
  29. package/lib/basic-auth.d.ts +1 -1
  30. package/lib/bearer-auth.d.ts +1 -1
  31. package/lib/body-limit.d.ts +1 -1
  32. package/lib/cache.d.ts +43 -0
  33. package/lib/cache.js +169 -0
  34. package/lib/client.d.ts +2 -2
  35. package/lib/combine.d.ts +1 -1
  36. package/lib/common-D8Z4JRCw.d.ts +46 -0
  37. package/lib/components-Ce5FRyHU.js +268 -0
  38. package/lib/components-DYZdxJIJ.js +24 -0
  39. package/lib/compress.d.ts +1 -1
  40. package/lib/conninfo.d.ts +2 -2
  41. package/lib/constants-BR9jM9BC.js +9 -0
  42. package/lib/{context-Bm7rI-oK.d.ts → context-DVQBjuns.d.ts} +1 -1
  43. package/lib/context-DxFdY_un.d.ts +250 -0
  44. package/lib/context-storage.d.ts +1 -1
  45. package/lib/{cookie-ClMaKDQf.d.ts → cookie-CCelEqky.d.ts} +1 -1
  46. package/lib/cookie.d.ts +3 -3
  47. package/lib/cors.d.ts +1 -1
  48. package/lib/csrf.d.ts +1 -1
  49. package/lib/css-D2jb7X8b.js +320 -0
  50. package/lib/css.d.ts +82 -0
  51. package/lib/css.js +134 -0
  52. package/lib/dev.d.ts +19 -0
  53. package/lib/dev.js +50 -0
  54. package/lib/etag.d.ts +1 -1
  55. package/lib/factory.d.ts +2 -2
  56. package/lib/hooks-Bq5q9IMl.js +762 -0
  57. package/lib/html-SllAe0YT.d.ts +46 -0
  58. package/lib/html.d.ts +1 -1
  59. package/lib/index-C850MeBA.d.ts +94 -0
  60. package/lib/{index-oOClm_Xk.d.ts → index-CUTfU69R.d.ts} +3 -3
  61. package/lib/{index-B-3F4wt2.d.ts → index-Cqcdluyn.d.ts} +2 -2
  62. package/lib/{index-UTBmM3GX.d.ts → index-CsvB-F9j.d.ts} +2 -2
  63. package/lib/index.d.ts +4 -4
  64. package/lib/ip-restriction.d.ts +2 -2
  65. package/lib/jsx/dom/client.d.ts +30 -0
  66. package/lib/jsx/dom/client.js +49 -0
  67. package/lib/jsx/dom/css.d.ts +84 -0
  68. package/lib/jsx/dom/css.js +2 -0
  69. package/lib/jsx/dom/jsx-dev-runtime.d.ts +3 -0
  70. package/lib/jsx/dom/jsx-dev-runtime.js +2 -0
  71. package/lib/jsx/dom/jsx-runtime.d.ts +3 -0
  72. package/lib/jsx/dom/jsx-runtime.js +2 -0
  73. package/lib/jsx/dom/server.d.ts +105 -0
  74. package/lib/jsx/dom/server.js +37 -0
  75. package/lib/jsx/dom.d.ts +5 -0
  76. package/lib/jsx/dom.js +74 -0
  77. package/lib/jsx/jsx-dev-runtime.d.ts +6 -0
  78. package/lib/jsx/jsx-dev-runtime.js +14 -0
  79. package/lib/jsx/jsx-runtime.d.ts +10 -0
  80. package/lib/jsx/jsx-runtime.js +30 -0
  81. package/lib/jsx/streaming.d.ts +2 -0
  82. package/lib/jsx/streaming.js +2 -0
  83. package/lib/jsx-dev-runtime-B22O-Npk.d.ts +7 -0
  84. package/lib/jsx-dev-runtime-kAhR_4C7.js +354 -0
  85. package/lib/jsx-runtime-BVVgDSdq.d.ts +1 -0
  86. package/lib/jsx.d.ts +3 -0
  87. package/lib/jsx.js +47 -0
  88. package/lib/jwk.d.ts +4 -4
  89. package/lib/{jwt-Dg493Tai.d.ts → jwt-BARhotDz.d.ts} +1 -1
  90. package/lib/jwt.d.ts +4 -4
  91. package/lib/language.d.ts +1 -1
  92. package/lib/linear-router-C3FPib6h.js +96 -0
  93. package/lib/logger.d.ts +1 -1
  94. package/lib/loopback-only.d.ts +1 -1
  95. package/lib/method-not-allowed.d.ts +2 -2
  96. package/lib/method-override.d.ts +2 -2
  97. package/lib/mount.d.ts +44 -0
  98. package/lib/mount.js +67 -0
  99. package/lib/node-server/conninfo.d.ts +1 -1
  100. package/lib/node-server/serve-static.d.ts +1 -1
  101. package/lib/node-server/serve-static.js +1 -1
  102. package/lib/node-server.d.ts +1 -1
  103. package/lib/node-server.js +1 -1
  104. package/lib/pattern-router-HZxjDGEQ.js +41 -0
  105. package/lib/powered-by.d.ts +1 -1
  106. package/lib/pretty-json.d.ts +1 -1
  107. package/lib/proxy.d.ts +72 -0
  108. package/lib/proxy.js +121 -0
  109. package/lib/quick.d.ts +8 -0
  110. package/lib/quick.js +17 -0
  111. package/lib/request-id.d.ts +1 -1
  112. package/lib/request.d.ts +1 -1
  113. package/lib/route.d.ts +1 -1
  114. package/lib/router/linear-router.js +1 -95
  115. package/lib/router/pattern-router.js +1 -40
  116. package/lib/schema-validator.d.ts +1 -1
  117. package/lib/secure-headers.d.ts +1 -1
  118. package/lib/{serve-static-Dw_m6KxR.js → serve-static-Cw23shXv.js} +1 -0
  119. package/lib/serve-static.d.ts +1 -1
  120. package/lib/streaming.d.ts +1 -1
  121. package/lib/testing.d.ts +4 -4
  122. package/lib/timeout.d.ts +1 -1
  123. package/lib/timing.d.ts +1 -1
  124. package/lib/tiny.d.ts +8 -0
  125. package/lib/tiny.js +15 -0
  126. package/lib/trailing-slash.d.ts +1 -1
  127. package/lib/{types-CHesD1KG.d.ts → types-CQiGmsWW.d.ts} +3 -3
  128. package/lib/{types-CwrQjlaM.d.ts → types-Lqx5BxQF.d.ts} +10 -1
  129. package/lib/{types-CDO6I3B0.d.ts → types-nEL8VPDC.d.ts} +1 -1
  130. package/lib/types.d.ts +1 -1
  131. package/lib/utils/body.d.ts +1 -1
  132. package/lib/utils/cookie.d.ts +1 -1
  133. package/lib/utils/crypto.d.ts +1 -1
  134. package/lib/utils/html.d.ts +1 -45
  135. package/lib/utils/ipaddr.d.ts +1 -1
  136. package/lib/utils/jwt.d.ts +1 -1
  137. package/lib/utils/types.d.ts +2 -2
  138. package/lib/validator.d.ts +2 -2
  139. package/lib/ws.d.ts +1 -1
  140. package/package.json +69 -1
  141. package/plugins/acryl-inspect/upstream.json +1 -1
  142. package/plugins/acryl-node-server/upstream.json +1 -1
  143. package/plugins/acryl-router/src/core/helper/css/common.case.test.tsx +506 -0
  144. package/plugins/acryl-router/src/core/helper/css/common.ts +337 -0
  145. package/plugins/acryl-router/src/core/helper/css/index.test.tsx +678 -0
  146. package/plugins/acryl-router/src/core/helper/css/index.ts +262 -0
  147. package/plugins/acryl-router/src/core/helper/dev/index.test.ts +181 -0
  148. package/plugins/acryl-router/src/core/helper/dev/index.ts +79 -0
  149. package/plugins/acryl-router/src/core/helper/proxy/index.test.ts +356 -0
  150. package/plugins/acryl-router/src/core/helper/proxy/index.ts +203 -0
  151. package/plugins/acryl-router/src/core/helper/streaming/sse.test.tsx +557 -0
  152. package/plugins/acryl-router/src/core/jsx/base.test.tsx +97 -0
  153. package/plugins/acryl-router/src/core/jsx/base.ts +490 -0
  154. package/plugins/acryl-router/src/core/jsx/children.test.ts +52 -0
  155. package/plugins/acryl-router/src/core/jsx/children.ts +20 -0
  156. package/plugins/acryl-router/src/core/jsx/components.test.tsx +936 -0
  157. package/plugins/acryl-router/src/core/jsx/components.ts +257 -0
  158. package/plugins/acryl-router/src/core/jsx/constants.ts +6 -0
  159. package/plugins/acryl-router/src/core/jsx/context-isolation.test.ts +655 -0
  160. package/plugins/acryl-router/src/core/jsx/context.ts +266 -0
  161. package/plugins/acryl-router/src/core/jsx/dom/client.test.tsx +128 -0
  162. package/plugins/acryl-router/src/core/jsx/dom/client.ts +89 -0
  163. package/plugins/acryl-router/src/core/jsx/dom/components.test.tsx +330 -0
  164. package/plugins/acryl-router/src/core/jsx/dom/components.ts +39 -0
  165. package/plugins/acryl-router/src/core/jsx/dom/context.test.tsx +184 -0
  166. package/plugins/acryl-router/src/core/jsx/dom/context.ts +52 -0
  167. package/plugins/acryl-router/src/core/jsx/dom/css.test.tsx +149 -0
  168. package/plugins/acryl-router/src/core/jsx/dom/css.ts +263 -0
  169. package/plugins/acryl-router/src/core/jsx/dom/hooks/index.test.tsx +172 -0
  170. package/plugins/acryl-router/src/core/jsx/dom/hooks/index.ts +91 -0
  171. package/plugins/acryl-router/src/core/jsx/dom/index.test.tsx +3681 -0
  172. package/plugins/acryl-router/src/core/jsx/dom/index.ts +170 -0
  173. package/plugins/acryl-router/src/core/jsx/dom/intrinsic-element/components.test.tsx +1344 -0
  174. package/plugins/acryl-router/src/core/jsx/dom/intrinsic-element/components.ts +438 -0
  175. package/plugins/acryl-router/src/core/jsx/dom/jsx-dev-runtime.ts +23 -0
  176. package/plugins/acryl-router/src/core/jsx/dom/jsx-runtime.ts +8 -0
  177. package/plugins/acryl-router/src/core/jsx/dom/render.ts +879 -0
  178. package/plugins/acryl-router/src/core/jsx/dom/server.test.tsx +199 -0
  179. package/plugins/acryl-router/src/core/jsx/dom/server.ts +76 -0
  180. package/plugins/acryl-router/src/core/jsx/dom/utils.ts +7 -0
  181. package/plugins/acryl-router/src/core/jsx/hooks/dom.test.tsx +859 -0
  182. package/plugins/acryl-router/src/core/jsx/hooks/index.ts +437 -0
  183. package/plugins/acryl-router/src/core/jsx/hooks/string.test.tsx +40 -0
  184. package/plugins/acryl-router/src/core/jsx/index.test.tsx +1744 -0
  185. package/plugins/acryl-router/src/core/jsx/index.ts +115 -0
  186. package/plugins/acryl-router/src/core/jsx/intrinsic-element/common.ts +23 -0
  187. package/plugins/acryl-router/src/core/jsx/intrinsic-element/components.test.tsx +666 -0
  188. package/plugins/acryl-router/src/core/jsx/intrinsic-element/components.ts +210 -0
  189. package/plugins/acryl-router/src/core/jsx/intrinsic-elements.ts +938 -0
  190. package/plugins/acryl-router/src/core/jsx/jsx-dev-runtime.ts +26 -0
  191. package/plugins/acryl-router/src/core/jsx/jsx-runtime.test.tsx +85 -0
  192. package/plugins/acryl-router/src/core/jsx/jsx-runtime.ts +51 -0
  193. package/plugins/acryl-router/src/core/jsx/streaming.test.tsx +1281 -0
  194. package/plugins/acryl-router/src/core/jsx/streaming.ts +231 -0
  195. package/plugins/acryl-router/src/core/jsx/types.ts +41 -0
  196. package/plugins/acryl-router/src/core/jsx/utils.test.ts +366 -0
  197. package/plugins/acryl-router/src/core/jsx/utils.ts +202 -0
  198. package/plugins/acryl-router/src/core/middleware/cache/index.test.ts +1211 -0
  199. package/plugins/acryl-router/src/core/middleware/cache/index.ts +323 -0
  200. package/plugins/acryl-router/src/core/middleware/mount/index.test.ts +334 -0
  201. package/plugins/acryl-router/src/core/middleware/mount/index.ts +108 -0
  202. package/plugins/acryl-router/src/core/preset/quick.test.ts +42 -0
  203. package/plugins/acryl-router/src/core/preset/quick.ts +24 -0
  204. package/plugins/acryl-router/src/core/preset/tiny.test.ts +42 -0
  205. package/plugins/acryl-router/src/core/preset/tiny.ts +20 -0
  206. package/plugins/acryl-router/src/core/utils/types.ts +9 -0
  207. package/plugins/acryl-router/src/helpers/index.ts +3 -0
  208. package/plugins/acryl-router/src/middleware/index.ts +2 -0
  209. package/plugins/acryl-router/src/service.ts +22 -5
  210. package/plugins/acryl-router/tests/jsx.spec.tsx +63 -0
  211. package/plugins/acryl-router/upstream.json +3 -3
  212. package/plugins/acryl-router-http/upstream.json +1 -1
  213. package/plugins/acryl-state/upstream.json +1 -1
  214. package/plugins/desktop/upstream.json +1 -1
  215. package/plugins/desktop-web/upstream.json +1 -1
  216. package/plugins/save/plugin.json +1 -1
  217. package/templates/todo/upstream.json +1 -1
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @module
3
+ * This module provides Acryl's JSX dev runtime.
4
+ */
5
+
6
+ import type { HtmlEscapedString } from '../utils/html.ts'
7
+ import { jsxFn } from './base.ts'
8
+ import type { JSXNode } from './base.ts'
9
+ export { Fragment } from './base.ts'
10
+ export type { JSX } from './base.ts'
11
+
12
+ export function jsxDEV(
13
+ tag: string | Function,
14
+ props: Record<string, unknown>,
15
+ key?: string
16
+ ): JSXNode {
17
+ let node: JSXNode
18
+ if (!props || !('children' in props)) {
19
+ node = jsxFn(tag, props, [])
20
+ } else {
21
+ const children = props.children as string | HtmlEscapedString
22
+ node = Array.isArray(children) ? jsxFn(tag, props, children) : jsxFn(tag, props, [children])
23
+ }
24
+ node.key = key
25
+ return node
26
+ }
@@ -0,0 +1,85 @@
1
+ /** @jsxRuntime automatic **/
2
+ /** @jsxImportSource . **/
3
+ import { Acryl } from '../app.ts'
4
+ import { jsxAttr } from './jsx-runtime.ts'
5
+
6
+ describe('jsx-runtime', () => {
7
+ let app: Acryl
8
+
9
+ beforeEach(() => {
10
+ app = new Acryl()
11
+ })
12
+
13
+ it('Should render HTML strings', async () => {
14
+ app.get('/', (c) => {
15
+ return c.html(<h1>Hello</h1>)
16
+ })
17
+ const res = await app.request('http://localhost/')
18
+ expect(res.status).toBe(200)
19
+ expect(res.headers.get('Content-Type')).toBe('text/html; charset=UTF-8')
20
+ expect(await res.text()).toBe('<h1>Hello</h1>')
21
+ })
22
+
23
+ it('Should skip invalid attribute keys in jsxAttr()', () => {
24
+ expect(String(jsxAttr('" onfocus="alert(1)', 'x'))).toBe('')
25
+ expect(String(jsxAttr('foo<bar', 'x'))).toBe('')
26
+ expect(String(jsxAttr('foo\\bar', 'x'))).toBe('')
27
+ expect(String(jsxAttr('foo`bar', 'x'))).toBe('')
28
+ })
29
+
30
+ it('Should skip invalid non-string attribute values in jsxAttr()', async () => {
31
+ const invalidKey = '" onfocus="alert(1)'
32
+
33
+ expect(String(jsxAttr(invalidKey, { fontSize: 10 }))).toBe('')
34
+ expect(String(await jsxAttr(invalidKey, Promise.resolve('/docs?q=1&lang=en')))).toBe('')
35
+ })
36
+
37
+ it('Should render valid attribute values in jsxAttr()', async () => {
38
+ expect(String(jsxAttr('style', { fontSize: 10, color: 'red' }))).toBe(
39
+ 'style="font-size:10px;color:red"'
40
+ )
41
+ expect(String(await jsxAttr('href', Promise.resolve('/docs?q=1&lang=en')))).toBe(
42
+ 'href="/docs?q=1&amp;lang=en"'
43
+ )
44
+ })
45
+
46
+ it('Should drop style values containing ";" in jsxAttr() to prevent CSS injection', () => {
47
+ expect(
48
+ String(jsxAttr('style', { color: 'red;background:blue', backgroundColor: 'white' }))
49
+ ).toBe('style="background-color:white"')
50
+ })
51
+
52
+ it('Should drop style values that hide declaration separators in CSS comments in jsxAttr()', () => {
53
+ expect(
54
+ String(
55
+ jsxAttr('style', {
56
+ color: 'red/*(*/;background:blue;position:fixed;top:0',
57
+ backgroundColor: 'white',
58
+ })
59
+ )
60
+ ).toBe('style="background-color:white"')
61
+ })
62
+
63
+ it('Should drop style property names that can inject declarations in jsxAttr()', () => {
64
+ expect(
65
+ String(
66
+ jsxAttr('style', {
67
+ 'color;background-image': 'url(https://attacker.example/a.png)',
68
+ backgroundColor: 'white',
69
+ })
70
+ )
71
+ ).toBe('style="background-color:white"')
72
+ })
73
+
74
+ // https://en.reactjs.org/docs/jsx-in-depth.html#booleans-null-and-undefined-are-ignored
75
+ describe('Booleans, Null, and Undefined Are Ignored', () => {
76
+ it.each([true, false, undefined, null])('%s', (item) => {
77
+ expect((<span>{item}</span>).toString()).toBe('<span></span>')
78
+ })
79
+
80
+ it('falsy value', () => {
81
+ const template = <span>{0}</span>
82
+ expect(template.toString()).toBe('<span>0</span>')
83
+ })
84
+ })
85
+ })
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @module
3
+ * This module provides Acryl's JSX runtime.
4
+ */
5
+
6
+ export { jsxDEV as jsx, Fragment } from './jsx-dev-runtime.ts'
7
+ export { jsxDEV as jsxs } from './jsx-dev-runtime.ts'
8
+ export type { JSX } from './jsx-dev-runtime.ts'
9
+ import { html, raw } from '../helper/html/index.ts'
10
+ import type { HtmlEscapedString, StringBuffer, HtmlEscaped } from '../utils/html.ts'
11
+ import { escapeToBuffer, stringBufferToString } from '../utils/html.ts'
12
+ import { isValidAttributeName, styleObjectForEach } from './utils.ts'
13
+
14
+ export { html as jsxTemplate }
15
+
16
+ export const jsxAttr = (
17
+ key: string,
18
+ v: string | Promise<string> | Record<string, string | number | null | undefined | boolean>
19
+ ): HtmlEscapedString | Promise<HtmlEscapedString> => {
20
+ if (!isValidAttributeName(key)) {
21
+ return raw('')
22
+ }
23
+ const buffer: StringBuffer = [`${key}="`] as StringBuffer
24
+ if (key === 'style' && typeof v === 'object') {
25
+ // object to style strings
26
+ let styleStr = ''
27
+ styleObjectForEach(v as Record<string, string | number>, (property, value) => {
28
+ if (value != null) {
29
+ styleStr += `${styleStr ? ';' : ''}${property}:${value}`
30
+ }
31
+ })
32
+ escapeToBuffer(styleStr, buffer)
33
+ buffer[0] += '"'
34
+ } else if (typeof v === 'string') {
35
+ escapeToBuffer(v, buffer)
36
+ buffer[0] += '"'
37
+ } else if (v === null || v === undefined) {
38
+ return raw('')
39
+ } else if (typeof v === 'number' || (v as unknown as HtmlEscaped).isEscaped) {
40
+ buffer[0] += `${v}"`
41
+ } else if (v instanceof Promise) {
42
+ buffer.unshift('"', v)
43
+ } else {
44
+ escapeToBuffer(v.toString(), buffer)
45
+ buffer[0] += '"'
46
+ }
47
+
48
+ return buffer.length === 1 ? raw(buffer[0]) : stringBufferToString(buffer, undefined)
49
+ }
50
+
51
+ export const jsxEscape = (value: string) => value