acrylblends 0.6.2 → 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 (181) hide show
  1. package/README.md +4 -1
  2. package/docs/framework/README.md +3 -2
  3. package/docs/framework/UPSTREAM.md +1 -1
  4. package/docs/framework/cordis/acryl-in-a-cordis-app.md +6 -0
  5. package/docs/framework/getting-started/basic.md +1 -0
  6. package/docs/framework/getting-started/desktop.md +41 -0
  7. package/docs/framework/guides/jsx-dom.md +0 -3
  8. package/docs/framework/guides/jsx.md +0 -3
  9. package/docs/framework/helpers/css.md +0 -3
  10. package/docs/framework/upstream.json +3 -3
  11. package/lib/accepts.d.ts +1 -1
  12. package/lib/acryl-base.d.ts +1 -1
  13. package/lib/adapter.d.ts +1 -1
  14. package/lib/{app-BdrVHBlJ.d.ts → app-wFwpg-bt.d.ts} +1 -1
  15. package/lib/base-BpQy2Rk7.d.ts +783 -0
  16. package/lib/base-ddiVmiE7.js +721 -0
  17. package/lib/basic-auth.d.ts +1 -1
  18. package/lib/bearer-auth.d.ts +1 -1
  19. package/lib/body-limit.d.ts +1 -1
  20. package/lib/cache.d.ts +1 -1
  21. package/lib/client.d.ts +2 -2
  22. package/lib/combine.d.ts +1 -1
  23. package/lib/common-D8Z4JRCw.d.ts +46 -0
  24. package/lib/components-Ce5FRyHU.js +268 -0
  25. package/lib/components-DYZdxJIJ.js +24 -0
  26. package/lib/compress.d.ts +1 -1
  27. package/lib/conninfo.d.ts +2 -2
  28. package/lib/constants-BR9jM9BC.js +9 -0
  29. package/lib/{context-B5Y1lLha.d.ts → context-DVQBjuns.d.ts} +1 -1
  30. package/lib/context-DxFdY_un.d.ts +250 -0
  31. package/lib/context-storage.d.ts +1 -1
  32. package/lib/{cookie-D9_nQbsM.d.ts → cookie-CCelEqky.d.ts} +1 -1
  33. package/lib/cookie.d.ts +3 -3
  34. package/lib/cors.d.ts +1 -1
  35. package/lib/csrf.d.ts +1 -1
  36. package/lib/css-D2jb7X8b.js +320 -0
  37. package/lib/css.d.ts +82 -0
  38. package/lib/css.js +134 -0
  39. package/lib/dev.d.ts +2 -2
  40. package/lib/etag.d.ts +1 -1
  41. package/lib/factory.d.ts +2 -2
  42. package/lib/hooks-Bq5q9IMl.js +762 -0
  43. package/lib/html-SllAe0YT.d.ts +46 -0
  44. package/lib/html.d.ts +1 -1
  45. package/lib/index-C850MeBA.d.ts +94 -0
  46. package/lib/{index-m12zcmph.d.ts → index-CUTfU69R.d.ts} +3 -3
  47. package/lib/{index-DtEoak1i.d.ts → index-Cqcdluyn.d.ts} +2 -2
  48. package/lib/{index-Kqou8Fjh.d.ts → index-CsvB-F9j.d.ts} +2 -2
  49. package/lib/index.d.ts +4 -4
  50. package/lib/ip-restriction.d.ts +2 -2
  51. package/lib/jsx/dom/client.d.ts +30 -0
  52. package/lib/jsx/dom/client.js +49 -0
  53. package/lib/jsx/dom/css.d.ts +84 -0
  54. package/lib/jsx/dom/css.js +2 -0
  55. package/lib/jsx/dom/jsx-dev-runtime.d.ts +3 -0
  56. package/lib/jsx/dom/jsx-dev-runtime.js +2 -0
  57. package/lib/jsx/dom/jsx-runtime.d.ts +3 -0
  58. package/lib/jsx/dom/jsx-runtime.js +2 -0
  59. package/lib/jsx/dom/server.d.ts +105 -0
  60. package/lib/jsx/dom/server.js +37 -0
  61. package/lib/jsx/dom.d.ts +5 -0
  62. package/lib/jsx/dom.js +74 -0
  63. package/lib/jsx/jsx-dev-runtime.d.ts +6 -0
  64. package/lib/jsx/jsx-dev-runtime.js +14 -0
  65. package/lib/jsx/jsx-runtime.d.ts +10 -0
  66. package/lib/jsx/jsx-runtime.js +30 -0
  67. package/lib/jsx/streaming.d.ts +2 -0
  68. package/lib/jsx/streaming.js +2 -0
  69. package/lib/jsx-dev-runtime-B22O-Npk.d.ts +7 -0
  70. package/lib/jsx-dev-runtime-kAhR_4C7.js +354 -0
  71. package/lib/jsx-runtime-BVVgDSdq.d.ts +1 -0
  72. package/lib/jsx.d.ts +3 -0
  73. package/lib/jsx.js +47 -0
  74. package/lib/jwk.d.ts +4 -4
  75. package/lib/{jwt-BA65QhnJ.d.ts → jwt-BARhotDz.d.ts} +1 -1
  76. package/lib/jwt.d.ts +4 -4
  77. package/lib/language.d.ts +1 -1
  78. package/lib/logger.d.ts +1 -1
  79. package/lib/loopback-only.d.ts +1 -1
  80. package/lib/method-not-allowed.d.ts +2 -2
  81. package/lib/method-override.d.ts +2 -2
  82. package/lib/mount.d.ts +1 -1
  83. package/lib/node-server/conninfo.d.ts +1 -1
  84. package/lib/node-server/serve-static.d.ts +1 -1
  85. package/lib/node-server/serve-static.js +1 -1
  86. package/lib/node-server.d.ts +1 -1
  87. package/lib/node-server.js +1 -1
  88. package/lib/powered-by.d.ts +1 -1
  89. package/lib/pretty-json.d.ts +1 -1
  90. package/lib/proxy.d.ts +1 -1
  91. package/lib/quick.d.ts +1 -1
  92. package/lib/request-id.d.ts +1 -1
  93. package/lib/request.d.ts +1 -1
  94. package/lib/route.d.ts +1 -1
  95. package/lib/schema-validator.d.ts +1 -1
  96. package/lib/secure-headers.d.ts +1 -1
  97. package/lib/{serve-static-Dw_m6KxR.js → serve-static-Cw23shXv.js} +1 -0
  98. package/lib/serve-static.d.ts +1 -1
  99. package/lib/streaming.d.ts +1 -1
  100. package/lib/testing.d.ts +4 -4
  101. package/lib/timeout.d.ts +1 -1
  102. package/lib/timing.d.ts +1 -1
  103. package/lib/tiny.d.ts +1 -1
  104. package/lib/trailing-slash.d.ts +1 -1
  105. package/lib/{types-Bd29gh2o.d.ts → types-CQiGmsWW.d.ts} +3 -3
  106. package/lib/{types-D9DEXMjE.d.ts → types-Lqx5BxQF.d.ts} +8 -1
  107. package/lib/{types-ZM9gIiKh.d.ts → types-nEL8VPDC.d.ts} +1 -1
  108. package/lib/types.d.ts +1 -1
  109. package/lib/utils/body.d.ts +1 -1
  110. package/lib/utils/cookie.d.ts +1 -1
  111. package/lib/utils/crypto.d.ts +1 -1
  112. package/lib/utils/html.d.ts +1 -45
  113. package/lib/utils/ipaddr.d.ts +1 -1
  114. package/lib/utils/jwt.d.ts +1 -1
  115. package/lib/utils/types.d.ts +2 -2
  116. package/lib/validator.d.ts +2 -2
  117. package/lib/ws.d.ts +1 -1
  118. package/package.json +45 -1
  119. package/plugins/acryl-inspect/upstream.json +1 -1
  120. package/plugins/acryl-node-server/upstream.json +1 -1
  121. package/plugins/acryl-router/src/core/helper/css/common.case.test.tsx +506 -0
  122. package/plugins/acryl-router/src/core/helper/css/common.ts +337 -0
  123. package/plugins/acryl-router/src/core/helper/css/index.test.tsx +678 -0
  124. package/plugins/acryl-router/src/core/helper/css/index.ts +262 -0
  125. package/plugins/acryl-router/src/core/helper/streaming/sse.test.tsx +557 -0
  126. package/plugins/acryl-router/src/core/jsx/base.test.tsx +97 -0
  127. package/plugins/acryl-router/src/core/jsx/base.ts +490 -0
  128. package/plugins/acryl-router/src/core/jsx/children.test.ts +52 -0
  129. package/plugins/acryl-router/src/core/jsx/children.ts +20 -0
  130. package/plugins/acryl-router/src/core/jsx/components.test.tsx +936 -0
  131. package/plugins/acryl-router/src/core/jsx/components.ts +257 -0
  132. package/plugins/acryl-router/src/core/jsx/constants.ts +6 -0
  133. package/plugins/acryl-router/src/core/jsx/context-isolation.test.ts +655 -0
  134. package/plugins/acryl-router/src/core/jsx/context.ts +266 -0
  135. package/plugins/acryl-router/src/core/jsx/dom/client.test.tsx +128 -0
  136. package/plugins/acryl-router/src/core/jsx/dom/client.ts +89 -0
  137. package/plugins/acryl-router/src/core/jsx/dom/components.test.tsx +330 -0
  138. package/plugins/acryl-router/src/core/jsx/dom/components.ts +39 -0
  139. package/plugins/acryl-router/src/core/jsx/dom/context.test.tsx +184 -0
  140. package/plugins/acryl-router/src/core/jsx/dom/context.ts +52 -0
  141. package/plugins/acryl-router/src/core/jsx/dom/css.test.tsx +149 -0
  142. package/plugins/acryl-router/src/core/jsx/dom/css.ts +263 -0
  143. package/plugins/acryl-router/src/core/jsx/dom/hooks/index.test.tsx +172 -0
  144. package/plugins/acryl-router/src/core/jsx/dom/hooks/index.ts +91 -0
  145. package/plugins/acryl-router/src/core/jsx/dom/index.test.tsx +3681 -0
  146. package/plugins/acryl-router/src/core/jsx/dom/index.ts +170 -0
  147. package/plugins/acryl-router/src/core/jsx/dom/intrinsic-element/components.test.tsx +1344 -0
  148. package/plugins/acryl-router/src/core/jsx/dom/intrinsic-element/components.ts +438 -0
  149. package/plugins/acryl-router/src/core/jsx/dom/jsx-dev-runtime.ts +23 -0
  150. package/plugins/acryl-router/src/core/jsx/dom/jsx-runtime.ts +8 -0
  151. package/plugins/acryl-router/src/core/jsx/dom/render.ts +879 -0
  152. package/plugins/acryl-router/src/core/jsx/dom/server.test.tsx +199 -0
  153. package/plugins/acryl-router/src/core/jsx/dom/server.ts +76 -0
  154. package/plugins/acryl-router/src/core/jsx/dom/utils.ts +7 -0
  155. package/plugins/acryl-router/src/core/jsx/hooks/dom.test.tsx +859 -0
  156. package/plugins/acryl-router/src/core/jsx/hooks/index.ts +437 -0
  157. package/plugins/acryl-router/src/core/jsx/hooks/string.test.tsx +40 -0
  158. package/plugins/acryl-router/src/core/jsx/index.test.tsx +1744 -0
  159. package/plugins/acryl-router/src/core/jsx/index.ts +115 -0
  160. package/plugins/acryl-router/src/core/jsx/intrinsic-element/common.ts +23 -0
  161. package/plugins/acryl-router/src/core/jsx/intrinsic-element/components.test.tsx +666 -0
  162. package/plugins/acryl-router/src/core/jsx/intrinsic-element/components.ts +210 -0
  163. package/plugins/acryl-router/src/core/jsx/intrinsic-elements.ts +938 -0
  164. package/plugins/acryl-router/src/core/jsx/jsx-dev-runtime.ts +26 -0
  165. package/plugins/acryl-router/src/core/jsx/jsx-runtime.test.tsx +85 -0
  166. package/plugins/acryl-router/src/core/jsx/jsx-runtime.ts +51 -0
  167. package/plugins/acryl-router/src/core/jsx/streaming.test.tsx +1281 -0
  168. package/plugins/acryl-router/src/core/jsx/streaming.ts +231 -0
  169. package/plugins/acryl-router/src/core/jsx/types.ts +41 -0
  170. package/plugins/acryl-router/src/core/jsx/utils.test.ts +366 -0
  171. package/plugins/acryl-router/src/core/jsx/utils.ts +202 -0
  172. package/plugins/acryl-router/src/core/utils/types.ts +6 -0
  173. package/plugins/acryl-router/src/helpers/index.ts +1 -0
  174. package/plugins/acryl-router/tests/jsx.spec.tsx +63 -0
  175. package/plugins/acryl-router/upstream.json +3 -3
  176. package/plugins/acryl-router-http/upstream.json +1 -1
  177. package/plugins/acryl-state/upstream.json +1 -1
  178. package/plugins/desktop/upstream.json +1 -1
  179. package/plugins/desktop-web/upstream.json +1 -1
  180. package/plugins/save/plugin.json +1 -1
  181. package/templates/todo/upstream.json +1 -1
@@ -0,0 +1,210 @@
1
+ import { raw } from '../../helper/html/index.ts'
2
+ import type { HtmlEscapedCallback, HtmlEscapedString } from '../../utils/html.ts'
3
+ import { JSXNode, getNameSpaceContext, renderChildren } from '../base.ts'
4
+ import type { Child, Props } from '../base.ts'
5
+ import { toArray } from '../children.ts'
6
+ import { PERMALINK } from '../constants.ts'
7
+ import { useContext } from '../context.ts'
8
+ import type { IntrinsicElements } from '../intrinsic-elements.ts'
9
+ import type { FC, PropsWithChildren } from '../types.ts'
10
+ import {
11
+ dataPrecedenceAttr,
12
+ deDupeKeyMap,
13
+ isStylesheetLinkWithPrecedence,
14
+ shouldDeDupeByKey,
15
+ } from './common.ts'
16
+
17
+ const metaTagMap: WeakMap<
18
+ object,
19
+ Record<string, [string, Props, string | undefined][]>
20
+ > = new WeakMap()
21
+ const insertIntoHead: (
22
+ tagName: string,
23
+ tag: string,
24
+ props: Props,
25
+ precedence: string | undefined
26
+ ) => HtmlEscapedCallback =
27
+ (tagName, tag, props, precedence) =>
28
+ ({ buffer, context }): undefined => {
29
+ if (!buffer) {
30
+ return
31
+ }
32
+ const map = metaTagMap.get(context) || {}
33
+ metaTagMap.set(context, map)
34
+ const tags = (map[tagName] ||= [])
35
+
36
+ let duped = false
37
+ const deDupeKeys = deDupeKeyMap[tagName]
38
+ const deDupeByKey = shouldDeDupeByKey(tagName, precedence !== undefined)
39
+ if (deDupeByKey) {
40
+ LOOP: for (const [, tagProps] of tags) {
41
+ if (
42
+ tagName === 'link' &&
43
+ !(tagProps.rel === 'stylesheet' && tagProps[dataPrecedenceAttr] !== undefined)
44
+ ) {
45
+ continue
46
+ }
47
+ for (const key of deDupeKeys) {
48
+ if ((tagProps?.[key] ?? null) === props?.[key]) {
49
+ duped = true
50
+ break LOOP
51
+ }
52
+ }
53
+ }
54
+ }
55
+
56
+ if (duped) {
57
+ buffer[0] = buffer[0].replaceAll(tag, '')
58
+ } else if (deDupeByKey || tagName === 'link') {
59
+ tags.push([tag, props, precedence])
60
+ } else {
61
+ tags.unshift([tag, props, precedence])
62
+ }
63
+
64
+ if (buffer[0].indexOf('</head>') !== -1) {
65
+ let insertTags
66
+ if (tagName === 'link' || precedence !== undefined) {
67
+ const precedences: string[] = []
68
+ insertTags = tags
69
+ .map(([tag, , tagPrecedence], index) => {
70
+ if (tagPrecedence === undefined) {
71
+ return [tag, Number.MAX_SAFE_INTEGER, index] as [string, number, number]
72
+ }
73
+ let order = precedences.indexOf(tagPrecedence as string)
74
+ if (order === -1) {
75
+ precedences.push(tagPrecedence as string)
76
+ order = precedences.length - 1
77
+ }
78
+ return [tag, order, index] as [string, number, number]
79
+ })
80
+ .sort((a, b) => a[1] - b[1] || a[2] - b[2])
81
+ .map(([tag]) => tag)
82
+ } else {
83
+ insertTags = tags.map(([tag]) => tag)
84
+ }
85
+
86
+ insertTags.forEach((tag) => {
87
+ buffer[0] = buffer[0].replaceAll(tag, '')
88
+ })
89
+ buffer[0] = buffer[0].replace(/(?=<\/head>)/, () => insertTags.join(''))
90
+ }
91
+ }
92
+
93
+ const returnWithoutSpecialBehavior = (tag: string, children: Child, props: Props) =>
94
+ renderChildren([new JSXNode(tag, props, toArray(children ?? []))])
95
+
96
+ const documentMetadataTag = (tag: string, children: Child, props: Props, sort: boolean) => {
97
+ if ('itemProp' in props) {
98
+ return returnWithoutSpecialBehavior(tag, children, props)
99
+ }
100
+
101
+ let { precedence, blocking, ...restProps } = props
102
+ precedence = sort ? (precedence ?? '') : undefined
103
+ if (sort) {
104
+ restProps[dataPrecedenceAttr] = precedence
105
+ }
106
+
107
+ const string = new JSXNode(tag, restProps, toArray(children || [])).toString()
108
+
109
+ if (string instanceof Promise) {
110
+ return string.then((resString) =>
111
+ raw(resString, [
112
+ ...((resString as HtmlEscapedString).callbacks || []),
113
+ insertIntoHead(tag, resString, restProps, precedence),
114
+ ])
115
+ )
116
+ } else {
117
+ return raw(string, [insertIntoHead(tag, string, restProps, precedence)])
118
+ }
119
+ }
120
+
121
+ export const title: FC<PropsWithChildren> = ({ children, ...props }) => {
122
+ const nameSpaceContext = getNameSpaceContext()
123
+ if (nameSpaceContext) {
124
+ const context = useContext(nameSpaceContext)
125
+ if (context === 'svg' || context === 'head') {
126
+ return new JSXNode(
127
+ 'title',
128
+ props,
129
+ toArray(children ?? []) as Child[]
130
+ ) as unknown as HtmlEscapedString
131
+ }
132
+ }
133
+
134
+ return documentMetadataTag('title', children, props, false)
135
+ }
136
+ export const script: FC<PropsWithChildren<IntrinsicElements['script']>> = ({
137
+ children,
138
+ ...props
139
+ }) => {
140
+ const nameSpaceContext = getNameSpaceContext()
141
+ if (
142
+ ['src', 'async'].some((k) => !props[k]) ||
143
+ (nameSpaceContext && useContext(nameSpaceContext) === 'head')
144
+ ) {
145
+ return returnWithoutSpecialBehavior('script', children, props)
146
+ }
147
+
148
+ return documentMetadataTag('script', children, props, false)
149
+ }
150
+
151
+ export const style: FC<PropsWithChildren<IntrinsicElements['style']>> = ({
152
+ children,
153
+ ...props
154
+ }) => {
155
+ if (!['href', 'precedence'].every((k) => k in props)) {
156
+ return returnWithoutSpecialBehavior('style', children, props)
157
+ }
158
+ props['data-href'] = props.href
159
+ delete props.href
160
+ return documentMetadataTag('style', children, props, true)
161
+ }
162
+ export const link: FC<PropsWithChildren<IntrinsicElements['link']>> = ({ children, ...props }) => {
163
+ if (
164
+ ['onLoad', 'onError'].some((k) => k in props) ||
165
+ (props.rel === 'stylesheet' && (!('precedence' in props) || 'disabled' in props))
166
+ ) {
167
+ return returnWithoutSpecialBehavior('link', children, props)
168
+ }
169
+ return documentMetadataTag('link', children, props, isStylesheetLinkWithPrecedence(props))
170
+ }
171
+ export const meta: FC<PropsWithChildren> = ({ children, ...props }) => {
172
+ const nameSpaceContext = getNameSpaceContext()
173
+ if (nameSpaceContext && useContext(nameSpaceContext) === 'head') {
174
+ return returnWithoutSpecialBehavior('meta', children, props)
175
+ }
176
+ return documentMetadataTag('meta', children, props, false)
177
+ }
178
+
179
+ const newJSXNode = (tag: string, { children, ...props }: PropsWithChildren<unknown>) =>
180
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
181
+ new JSXNode(tag, props, toArray(children ?? []) as Child[]) as any
182
+ export const form: FC<
183
+ PropsWithChildren<{
184
+ action?: Function | string
185
+ method?: 'get' | 'post'
186
+ }>
187
+ > = (props) => {
188
+ if (typeof props.action === 'function') {
189
+ props.action = PERMALINK in props.action ? (props.action[PERMALINK] as string) : undefined
190
+ }
191
+ return newJSXNode('form', props)
192
+ }
193
+
194
+ const formActionableElement = (
195
+ tag: string,
196
+ props: PropsWithChildren<{
197
+ formAction?: Function | string
198
+ }>
199
+ ) => {
200
+ if (typeof props.formAction === 'function') {
201
+ props.formAction =
202
+ PERMALINK in props.formAction ? (props.formAction[PERMALINK] as string) : undefined
203
+ }
204
+ return newJSXNode(tag, props)
205
+ }
206
+
207
+ export const input: (props: PropsWithChildren) => unknown = (props) =>
208
+ formActionableElement('input', props)
209
+ export const button: (props: PropsWithChildren) => unknown = (props) =>
210
+ formActionableElement('button', props)