@fluixi/compiler 1.0.0-alpha.100

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 (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/dist/analyze/expr-shape.cjs +62 -0
  4. package/dist/analyze/expr-shape.d.cts +14 -0
  5. package/dist/analyze/expr-shape.d.ts +15 -0
  6. package/dist/analyze/expr-shape.d.ts.map +1 -0
  7. package/dist/analyze/expr-shape.js +37 -0
  8. package/dist/analyze/expr-shape.mjs +41 -0
  9. package/dist/analyze/intrinsics.cjs +112 -0
  10. package/dist/analyze/intrinsics.d.cts +80 -0
  11. package/dist/analyze/intrinsics.d.ts +81 -0
  12. package/dist/analyze/intrinsics.d.ts.map +1 -0
  13. package/dist/analyze/intrinsics.js +126 -0
  14. package/dist/analyze/intrinsics.mjs +91 -0
  15. package/dist/analyze/paren.cjs +134 -0
  16. package/dist/analyze/paren.d.cts +23 -0
  17. package/dist/analyze/paren.d.ts +24 -0
  18. package/dist/analyze/paren.d.ts.map +1 -0
  19. package/dist/analyze/paren.js +168 -0
  20. package/dist/analyze/paren.mjs +113 -0
  21. package/dist/analyze/props-destructure.cjs +226 -0
  22. package/dist/analyze/props-destructure.d.cts +83 -0
  23. package/dist/analyze/props-destructure.d.ts +84 -0
  24. package/dist/analyze/props-destructure.d.ts.map +1 -0
  25. package/dist/analyze/props-destructure.js +272 -0
  26. package/dist/analyze/props-destructure.mjs +205 -0
  27. package/dist/analyze/reactive-bindings.cjs +210 -0
  28. package/dist/analyze/reactive-bindings.d.cts +42 -0
  29. package/dist/analyze/reactive-bindings.d.ts +43 -0
  30. package/dist/analyze/reactive-bindings.d.ts.map +1 -0
  31. package/dist/analyze/reactive-bindings.js +191 -0
  32. package/dist/analyze/reactive-bindings.mjs +187 -0
  33. package/dist/analyze/reactive-expr.cjs +38 -0
  34. package/dist/analyze/reactive-expr.d.cts +38 -0
  35. package/dist/analyze/reactive-expr.d.ts +39 -0
  36. package/dist/analyze/reactive-expr.d.ts.map +1 -0
  37. package/dist/analyze/reactive-expr.js +31 -0
  38. package/dist/analyze/reactive-expr.mjs +17 -0
  39. package/dist/analyze/static-graph.cjs +831 -0
  40. package/dist/analyze/static-graph.d.cts +102 -0
  41. package/dist/analyze/static-graph.d.ts +103 -0
  42. package/dist/analyze/static-graph.d.ts.map +1 -0
  43. package/dist/analyze/static-graph.js +871 -0
  44. package/dist/analyze/static-graph.mjs +813 -0
  45. package/dist/babel-I6BUWUCU.mjs +636 -0
  46. package/dist/chunk-3AICWNF7.mjs +92 -0
  47. package/dist/chunk-6CWJWGE2.mjs +2170 -0
  48. package/dist/chunk-C3XPDB4Y.mjs +16 -0
  49. package/dist/chunk-GX5XV6Z7.mjs +190 -0
  50. package/dist/chunk-HXEXPWJ2.mjs +999 -0
  51. package/dist/chunk-NU3W67UZ.mjs +584 -0
  52. package/dist/chunk-SKAVY75W.mjs +11 -0
  53. package/dist/codegen/backend.cjs +18 -0
  54. package/dist/codegen/backend.d.cts +35 -0
  55. package/dist/codegen/backend.d.ts +36 -0
  56. package/dist/codegen/backend.d.ts.map +1 -0
  57. package/dist/codegen/backend.js +1 -0
  58. package/dist/codegen/backend.mjs +0 -0
  59. package/dist/codegen/backends/imperative.cjs +577 -0
  60. package/dist/codegen/backends/imperative.d.cts +11 -0
  61. package/dist/codegen/backends/imperative.d.ts +12 -0
  62. package/dist/codegen/backends/imperative.d.ts.map +1 -0
  63. package/dist/codegen/backends/imperative.js +362 -0
  64. package/dist/codegen/backends/imperative.mjs +554 -0
  65. package/dist/codegen/contract.cjs +52 -0
  66. package/dist/codegen/contract.d.cts +24 -0
  67. package/dist/codegen/contract.d.ts +25 -0
  68. package/dist/codegen/contract.d.ts.map +1 -0
  69. package/dist/codegen/contract.js +30 -0
  70. package/dist/codegen/contract.mjs +31 -0
  71. package/dist/codegen/partial-template.cjs +176 -0
  72. package/dist/codegen/partial-template.d.cts +61 -0
  73. package/dist/codegen/partial-template.d.ts +62 -0
  74. package/dist/codegen/partial-template.d.ts.map +1 -0
  75. package/dist/codegen/partial-template.js +0 -0
  76. package/dist/codegen/partial-template.mjs +153 -0
  77. package/dist/codegen/serialize-static.cjs +125 -0
  78. package/dist/codegen/serialize-static.d.cts +38 -0
  79. package/dist/codegen/serialize-static.d.ts +39 -0
  80. package/dist/codegen/serialize-static.d.ts.map +1 -0
  81. package/dist/codegen/serialize-static.js +165 -0
  82. package/dist/codegen/serialize-static.mjs +104 -0
  83. package/dist/frontend/babel/build-ir-lit.cjs +1933 -0
  84. package/dist/frontend/babel/build-ir-lit.d.cts +26 -0
  85. package/dist/frontend/babel/build-ir-lit.d.ts +27 -0
  86. package/dist/frontend/babel/build-ir-lit.d.ts.map +1 -0
  87. package/dist/frontend/babel/build-ir-lit.js +13 -0
  88. package/dist/frontend/babel/build-ir-lit.mjs +1902 -0
  89. package/dist/frontend/babel/build-ir.cjs +1948 -0
  90. package/dist/frontend/babel/build-ir.d.cts +35 -0
  91. package/dist/frontend/babel/build-ir.d.ts +36 -0
  92. package/dist/frontend/babel/build-ir.d.ts.map +1 -0
  93. package/dist/frontend/babel/build-ir.js +124 -0
  94. package/dist/frontend/babel/build-ir.mjs +1919 -0
  95. package/dist/frontend/babel/index.cjs +2610 -0
  96. package/dist/frontend/babel/index.d.cts +33 -0
  97. package/dist/frontend/babel/index.d.ts +34 -0
  98. package/dist/frontend/babel/index.d.ts.map +1 -0
  99. package/dist/frontend/babel/index.js +65 -0
  100. package/dist/frontend/babel/index.mjs +2580 -0
  101. package/dist/frontend/babel/lower-template.cjs +1931 -0
  102. package/dist/frontend/babel/lower-template.d.cts +23 -0
  103. package/dist/frontend/babel/lower-template.d.ts +24 -0
  104. package/dist/frontend/babel/lower-template.d.ts.map +1 -0
  105. package/dist/frontend/babel/lower-template.js +64 -0
  106. package/dist/frontend/babel/lower-template.mjs +1902 -0
  107. package/dist/frontend/babel/plugin.cjs +2556 -0
  108. package/dist/frontend/babel/plugin.d.cts +95 -0
  109. package/dist/frontend/babel/plugin.d.ts +96 -0
  110. package/dist/frontend/babel/plugin.d.ts.map +1 -0
  111. package/dist/frontend/babel/plugin.js +523 -0
  112. package/dist/frontend/babel/plugin.mjs +2527 -0
  113. package/dist/frontend/babel/server-functions.cjs +110 -0
  114. package/dist/frontend/babel/server-functions.d.cts +10 -0
  115. package/dist/frontend/babel/server-functions.d.ts +11 -0
  116. package/dist/frontend/babel/server-functions.d.ts.map +1 -0
  117. package/dist/frontend/babel/server-functions.js +81 -0
  118. package/dist/frontend/babel/server-functions.mjs +89 -0
  119. package/dist/frontend/babel/types.cjs +18 -0
  120. package/dist/frontend/babel/types.d.cts +33 -0
  121. package/dist/frontend/babel/types.d.ts +34 -0
  122. package/dist/frontend/babel/types.d.ts.map +1 -0
  123. package/dist/frontend/babel/types.js +1 -0
  124. package/dist/frontend/babel/types.mjs +0 -0
  125. package/dist/frontend/types.cjs +18 -0
  126. package/dist/frontend/types.d.cts +25 -0
  127. package/dist/frontend/types.d.ts +26 -0
  128. package/dist/frontend/types.d.ts.map +1 -0
  129. package/dist/frontend/types.js +1 -0
  130. package/dist/frontend/types.mjs +0 -0
  131. package/dist/frontend/vocabulary.cjs +98 -0
  132. package/dist/frontend/vocabulary.d.cts +79 -0
  133. package/dist/frontend/vocabulary.d.ts +80 -0
  134. package/dist/frontend/vocabulary.d.ts.map +1 -0
  135. package/dist/frontend/vocabulary.js +124 -0
  136. package/dist/frontend/vocabulary.mjs +77 -0
  137. package/dist/index.cjs +1957 -0
  138. package/dist/index.d.cts +27 -0
  139. package/dist/index.d.ts +28 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +38 -0
  142. package/dist/index.mjs +1949 -0
  143. package/dist/integrations.cjs +5705 -0
  144. package/dist/integrations.d.cts +215 -0
  145. package/dist/integrations.d.ts +216 -0
  146. package/dist/integrations.d.ts.map +1 -0
  147. package/dist/integrations.js +566 -0
  148. package/dist/integrations.mjs +810 -0
  149. package/dist/ir/nodes.cjs +18 -0
  150. package/dist/ir/nodes.d.cts +168 -0
  151. package/dist/ir/nodes.d.ts +169 -0
  152. package/dist/ir/nodes.d.ts.map +1 -0
  153. package/dist/ir/nodes.js +1 -0
  154. package/dist/ir/nodes.mjs +0 -0
  155. package/dist/lower/compile-template.cjs +1670 -0
  156. package/dist/lower/compile-template.d.cts +82 -0
  157. package/dist/lower/compile-template.d.ts +83 -0
  158. package/dist/lower/compile-template.d.ts.map +1 -0
  159. package/dist/lower/compile-template.js +79 -0
  160. package/dist/lower/compile-template.mjs +1662 -0
  161. package/dist/lower/entities.cjs +288 -0
  162. package/dist/lower/entities.d.cts +1 -0
  163. package/dist/lower/entities.d.ts +2 -0
  164. package/dist/lower/entities.d.ts.map +1 -0
  165. package/dist/lower/entities.js +54 -0
  166. package/dist/lower/entities.mjs +267 -0
  167. package/dist/lower/jsx.cjs +1101 -0
  168. package/dist/lower/jsx.d.cts +33 -0
  169. package/dist/lower/jsx.d.ts +34 -0
  170. package/dist/lower/jsx.d.ts.map +1 -0
  171. package/dist/lower/jsx.js +414 -0
  172. package/dist/lower/jsx.mjs +1078 -0
  173. package/dist/lower/template.cjs +1354 -0
  174. package/dist/lower/template.d.cts +53 -0
  175. package/dist/lower/template.d.ts +54 -0
  176. package/dist/lower/template.d.ts.map +1 -0
  177. package/dist/lower/template.js +542 -0
  178. package/dist/lower/template.mjs +1335 -0
  179. package/dist/lower/text.cjs +42 -0
  180. package/dist/lower/text.d.cts +10 -0
  181. package/dist/lower/text.d.ts +11 -0
  182. package/dist/lower/text.d.ts.map +1 -0
  183. package/dist/lower/text.js +31 -0
  184. package/dist/lower/text.mjs +21 -0
  185. package/dist/optimize/analyze-static.cjs +112 -0
  186. package/dist/optimize/analyze-static.d.cts +39 -0
  187. package/dist/optimize/analyze-static.d.ts +40 -0
  188. package/dist/optimize/analyze-static.d.ts.map +1 -0
  189. package/dist/optimize/analyze-static.js +131 -0
  190. package/dist/optimize/analyze-static.mjs +91 -0
  191. package/dist/optimize/collapse-strategies.cjs +90 -0
  192. package/dist/optimize/collapse-strategies.d.cts +30 -0
  193. package/dist/optimize/collapse-strategies.d.ts +31 -0
  194. package/dist/optimize/collapse-strategies.d.ts.map +1 -0
  195. package/dist/optimize/collapse-strategies.js +33 -0
  196. package/dist/optimize/collapse-strategies.mjs +67 -0
  197. package/dist/options.cjs +33 -0
  198. package/dist/options.d.cts +39 -0
  199. package/dist/options.d.ts +40 -0
  200. package/dist/options.d.ts.map +1 -0
  201. package/dist/options.js +8 -0
  202. package/dist/options.mjs +12 -0
  203. package/dist/resolve/builtins.cjs +73 -0
  204. package/dist/resolve/builtins.d.cts +68 -0
  205. package/dist/resolve/builtins.d.ts +69 -0
  206. package/dist/resolve/builtins.d.ts.map +1 -0
  207. package/dist/resolve/builtins.js +64 -0
  208. package/dist/resolve/builtins.mjs +53 -0
  209. package/dist/resolve/component-globals.cjs +272 -0
  210. package/dist/resolve/component-globals.d.cts +88 -0
  211. package/dist/resolve/component-globals.d.ts +89 -0
  212. package/dist/resolve/component-globals.d.ts.map +1 -0
  213. package/dist/resolve/component-globals.js +160 -0
  214. package/dist/resolve/component-globals.mjs +249 -0
  215. package/dist/resolve/component-resolver.cjs +80 -0
  216. package/dist/resolve/component-resolver.d.cts +68 -0
  217. package/dist/resolve/component-resolver.d.ts +69 -0
  218. package/dist/resolve/component-resolver.d.ts.map +1 -0
  219. package/dist/resolve/component-resolver.js +95 -0
  220. package/dist/resolve/component-resolver.mjs +59 -0
  221. package/dist/resolve/load-directive.cjs +93 -0
  222. package/dist/resolve/load-directive.d.cts +53 -0
  223. package/dist/resolve/load-directive.d.ts +54 -0
  224. package/dist/resolve/load-directive.d.ts.map +1 -0
  225. package/dist/resolve/load-directive.js +93 -0
  226. package/dist/resolve/load-directive.mjs +72 -0
  227. package/dist/resolve/resolve-ir.cjs +108 -0
  228. package/dist/resolve/resolve-ir.d.cts +53 -0
  229. package/dist/resolve/resolve-ir.d.ts +54 -0
  230. package/dist/resolve/resolve-ir.d.ts.map +1 -0
  231. package/dist/resolve/resolve-ir.js +58 -0
  232. package/dist/resolve/resolve-ir.mjs +85 -0
  233. package/dist/resolve/write-globals.cjs +383 -0
  234. package/dist/resolve/write-globals.d.cts +36 -0
  235. package/dist/resolve/write-globals.d.ts +37 -0
  236. package/dist/resolve/write-globals.d.ts.map +1 -0
  237. package/dist/resolve/write-globals.js +169 -0
  238. package/dist/resolve/write-globals.mjs +362 -0
  239. package/dist/server-fns-VZLHMQTC.mjs +79 -0
  240. package/dist/server-functions-UAZKOLZW.mjs +82 -0
  241. package/dist/transform/bindings.cjs +71 -0
  242. package/dist/transform/bindings.d.cts +16 -0
  243. package/dist/transform/bindings.d.ts +17 -0
  244. package/dist/transform/bindings.d.ts.map +1 -0
  245. package/dist/transform/bindings.js +69 -0
  246. package/dist/transform/bindings.mjs +50 -0
  247. package/dist/transform/index.cjs +3837 -0
  248. package/dist/transform/index.d.cts +15 -0
  249. package/dist/transform/index.d.ts +16 -0
  250. package/dist/transform/index.d.ts.map +1 -0
  251. package/dist/transform/index.js +12 -0
  252. package/dist/transform/index.mjs +4882 -0
  253. package/dist/transform/intrinsics.cjs +261 -0
  254. package/dist/transform/intrinsics.d.cts +33 -0
  255. package/dist/transform/intrinsics.d.ts +34 -0
  256. package/dist/transform/intrinsics.d.ts.map +1 -0
  257. package/dist/transform/intrinsics.js +120 -0
  258. package/dist/transform/intrinsics.mjs +238 -0
  259. package/dist/transform/props.cjs +441 -0
  260. package/dist/transform/props.d.cts +45 -0
  261. package/dist/transform/props.d.ts +46 -0
  262. package/dist/transform/props.d.ts.map +1 -0
  263. package/dist/transform/props.js +221 -0
  264. package/dist/transform/props.mjs +1487 -0
  265. package/dist/transform/server-fn-id.cjs +35 -0
  266. package/dist/transform/server-fn-id.d.cts +9 -0
  267. package/dist/transform/server-fn-id.d.ts +10 -0
  268. package/dist/transform/server-fn-id.d.ts.map +1 -0
  269. package/dist/transform/server-fn-id.js +18 -0
  270. package/dist/transform/server-fn-id.mjs +14 -0
  271. package/dist/transform/server-fns.cjs +114 -0
  272. package/dist/transform/server-fns.d.cts +12 -0
  273. package/dist/transform/server-fns.d.ts +13 -0
  274. package/dist/transform/server-fns.d.ts.map +1 -0
  275. package/dist/transform/server-fns.js +94 -0
  276. package/dist/transform/server-fns.mjs +1160 -0
  277. package/dist/transform/source-locations.cjs +393 -0
  278. package/dist/transform/source-locations.d.cts +48 -0
  279. package/dist/transform/source-locations.d.ts +49 -0
  280. package/dist/transform/source-locations.d.ts.map +1 -0
  281. package/dist/transform/source-locations.js +303 -0
  282. package/dist/transform/source-locations.mjs +370 -0
  283. package/dist/transform/styles.cjs +606 -0
  284. package/dist/transform/styles.d.cts +237 -0
  285. package/dist/transform/styles.d.ts +238 -0
  286. package/dist/transform/styles.d.ts.map +1 -0
  287. package/dist/transform/styles.js +743 -0
  288. package/dist/transform/styles.mjs +671 -0
  289. package/dist/transform/templates.cjs +3806 -0
  290. package/dist/transform/templates.d.cts +82 -0
  291. package/dist/transform/templates.d.ts +83 -0
  292. package/dist/transform/templates.d.ts.map +1 -0
  293. package/dist/transform/templates.js +613 -0
  294. package/dist/transform/templates.mjs +4852 -0
  295. package/dist/transform-3W45L3EA.mjs +951 -0
  296. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  297. package/dist/vite-styles.cjs +223 -0
  298. package/dist/vite-styles.d.cts +68 -0
  299. package/dist/vite-styles.d.ts +69 -0
  300. package/dist/vite-styles.d.ts.map +1 -0
  301. package/dist/vite-styles.js +241 -0
  302. package/dist/vite-styles.mjs +214 -0
  303. package/package.json +141 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Serialize a static IR subtree to the HTML a `<template>` can be built from.
3
+ *
4
+ * Only called for nodes `analyzeStatic` marked static, so every prop is a literal and
5
+ * every child is text or another static element: there is nothing here that could need
6
+ * an expression. That invariant is what makes this safe: the serializer never has to
7
+ * guess, and anything it cannot represent is a bug in the analysis, not a fallback.
8
+ */
9
+ import type { IRElement, IRProp } from '../ir/nodes.js';
10
+ /** True when this element's content must not be entity-escaped. */
11
+ export declare function isRawTextElement(tag: string): boolean;
12
+ /** The HTML spelling of an IR prop name. */
13
+ export declare function htmlAttrName(name: string): string;
14
+ /**
15
+ * True for a prop that is a plain HTML attribute with a compile-time constant value ,
16
+ * safe to write straight onto the element, with no runtime interpretation.
17
+ */
18
+ export declare function isPlainLiteralAttr(prop: IRProp): boolean;
19
+ /** True when the subtree can be represented as HTML text with no loss. */
20
+ export declare function isSerializable(node: IRElement): boolean;
21
+ /** The subtree as HTML. */
22
+ export declare function serializeStatic(node: IRElement): string;
23
+ /**
24
+ * Where each element of a template was written, in the order a clone walks them.
25
+ *
26
+ * A template is emitted as one string, so a source map traces everything in it back to the
27
+ * line the root opens at: every element in a component reports the same place. The order
28
+ * is pre-order over the elements the template contains, which is what
29
+ * `[root, ...root.querySelectorAll('*')]` gives back on the clone, since holes are filled
30
+ * only after it is built.
31
+ *
32
+ * Undefined when the transform was not asked for source locations, so a production build
33
+ * emits nothing and pays nothing.
34
+ */
35
+ export declare function templatePositions(root: IRElement): {
36
+ file: string;
37
+ pos: number[];
38
+ } | undefined;
39
+ //# sourceMappingURL=serialize-static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize-static.d.ts","sourceRoot":"","sources":["../../src/codegen/serialize-static.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAU,MAAM,EAAE,MAAM,gBAAgB,CAAC;AA6DhE,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAgBvD;AAED,2BAA2B;AAC3B,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAKvD;AAmCD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAU9F"}
@@ -0,0 +1,165 @@
1
+ /** Elements the HTML parser closes itself; emitting `</br>` would create a second node. */
2
+ const VOID_ELEMENTS = new Set([
3
+ 'area',
4
+ 'base',
5
+ 'br',
6
+ 'col',
7
+ 'embed',
8
+ 'hr',
9
+ 'img',
10
+ 'input',
11
+ 'link',
12
+ 'meta',
13
+ 'param',
14
+ 'source',
15
+ 'track',
16
+ 'wbr',
17
+ ]);
18
+ /**
19
+ * Attribute names the IR normalises away from their HTML spelling. Serializing to HTML
20
+ * means going back: a template is parsed by the browser, which knows `class`, not
21
+ * `className`.
22
+ */
23
+ const HTML_NAME = {
24
+ className: 'class',
25
+ htmlFor: 'for',
26
+ };
27
+ /**
28
+ * Names the runtime assigns as DOM properties, whatever they look like.
29
+ *
30
+ * `innerHTML="<b>x</b>"` in a template would be escaped into visible text, and `value`
31
+ * as an attribute sets the *default* value rather than the current one. Serializing any
32
+ * of these changes what the code means, so they stay on the imperative path.
33
+ */
34
+ const PROPERTY_ONLY = new Set([
35
+ 'innerHTML',
36
+ 'outerHTML',
37
+ 'innerText',
38
+ 'textContent',
39
+ 'value',
40
+ 'checked',
41
+ 'selected',
42
+ 'muted',
43
+ 'defaultValue',
44
+ 'defaultChecked',
45
+ 'children',
46
+ 'ref',
47
+ ]);
48
+ /**
49
+ * Elements whose content the HTML parser does not decode entities inside.
50
+ *
51
+ * Escaping `>` in a `<style>` body would leave a literal `&gt;` in the CSS rather than
52
+ * the character. There is nothing to gain from templating these, their content is the
53
+ * interesting part, not their structure: so they stay on the imperative path.
54
+ */
55
+ const RAW_TEXT_ELEMENTS = new Set(['script', 'style', 'textarea', 'title']);
56
+ /** True when this element's content must not be entity-escaped. */
57
+ export function isRawTextElement(tag) {
58
+ return RAW_TEXT_ELEMENTS.has(tag);
59
+ }
60
+ /** The HTML spelling of an IR prop name. */
61
+ export function htmlAttrName(name) {
62
+ return HTML_NAME[name] ?? name;
63
+ }
64
+ /**
65
+ * True for a prop that is a plain HTML attribute with a compile-time constant value ,
66
+ * safe to write straight onto the element, with no runtime interpretation.
67
+ */
68
+ export function isPlainLiteralAttr(prop) {
69
+ if (prop.kind !== 'attr')
70
+ return false;
71
+ if (prop.expr !== undefined)
72
+ return false;
73
+ if (prop.name.includes(':'))
74
+ return false;
75
+ return !PROPERTY_ONLY.has(prop.name);
76
+ }
77
+ /** True when the subtree can be represented as HTML text with no loss. */
78
+ export function isSerializable(node) {
79
+ if (!node.static)
80
+ return false;
81
+ if (isRawTextElement(node.tag))
82
+ return false;
83
+ // Nothing may end up needing an expression once inside the template.
84
+ for (const prop of node.props) {
85
+ // Namespaced names (`prop:value`, `attr:x`, `bool:disabled`, `on:click`) are
86
+ // instructions to the runtime, not HTML, and property-only names are assigned
87
+ // rather than set: both stay on the imperative path.
88
+ if (!isPlainLiteralAttr(prop))
89
+ return false;
90
+ }
91
+ for (const child of node.children) {
92
+ if (child.kind === 'text')
93
+ continue;
94
+ if (child.kind === 'element' && isSerializable(child))
95
+ continue;
96
+ return false;
97
+ }
98
+ return true;
99
+ }
100
+ /** The subtree as HTML. */
101
+ export function serializeStatic(node) {
102
+ const attrs = node.props.map(serializeProp).filter(Boolean).join('');
103
+ const open = `<${node.tag}${attrs}>`;
104
+ if (VOID_ELEMENTS.has(node.tag))
105
+ return open;
106
+ return `${open}${node.children.map(serializeChild).join('')}</${node.tag}>`;
107
+ }
108
+ function serializeChild(child) {
109
+ if (child.kind === 'text')
110
+ return escapeText(child.value);
111
+ /* c8 ignore next */
112
+ if (child.kind !== 'element')
113
+ throw new Error(`serializeStatic: unexpected ${child.kind}`);
114
+ return serializeStatic(child);
115
+ }
116
+ function serializeProp(prop) {
117
+ const name = HTML_NAME[prop.name] ?? prop.name;
118
+ const value = prop.literal;
119
+ // A valueless attribute (`disabled`) is `true` in the IR and bare in HTML.
120
+ if (value === true || value === undefined)
121
+ return ` ${name}`;
122
+ if (value === false || value === null)
123
+ return '';
124
+ return ` ${name}="${escapeAttr(String(value))}"`;
125
+ }
126
+ /**
127
+ * Escaping is deliberately aggressive. This string is assigned to `innerHTML`, so a
128
+ * literal that happens to contain markup would otherwise become elements, a value like
129
+ * `class="a<b"` must stay one attribute.
130
+ */
131
+ function escapeAttr(value) {
132
+ return value
133
+ .replace(/&/g, '&amp;')
134
+ .replace(/"/g, '&quot;')
135
+ .replace(/</g, '&lt;')
136
+ .replace(/>/g, '&gt;');
137
+ }
138
+ function escapeText(value) {
139
+ return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
140
+ }
141
+ /**
142
+ * Where each element of a template was written, in the order a clone walks them.
143
+ *
144
+ * A template is emitted as one string, so a source map traces everything in it back to the
145
+ * line the root opens at: every element in a component reports the same place. The order
146
+ * is pre-order over the elements the template contains, which is what
147
+ * `[root, ...root.querySelectorAll('*')]` gives back on the clone, since holes are filled
148
+ * only after it is built.
149
+ *
150
+ * Undefined when the transform was not asked for source locations, so a production build
151
+ * emits nothing and pays nothing.
152
+ */
153
+ export function templatePositions(root) {
154
+ const pos = [];
155
+ let file;
156
+ const walk = (el) => {
157
+ file ??= el.at?.file;
158
+ pos.push(el.at?.line ?? 0, el.at?.column ?? 0);
159
+ for (const child of el.children)
160
+ if (child.kind === 'element')
161
+ walk(child);
162
+ };
163
+ walk(root);
164
+ return file && pos.some((n) => n !== 0) ? { file, pos } : undefined;
165
+ }
@@ -0,0 +1,104 @@
1
+ // src/codegen/serialize-static.ts
2
+ var VOID_ELEMENTS = /* @__PURE__ */ new Set([
3
+ "area",
4
+ "base",
5
+ "br",
6
+ "col",
7
+ "embed",
8
+ "hr",
9
+ "img",
10
+ "input",
11
+ "link",
12
+ "meta",
13
+ "param",
14
+ "source",
15
+ "track",
16
+ "wbr"
17
+ ]);
18
+ var HTML_NAME = {
19
+ className: "class",
20
+ htmlFor: "for"
21
+ };
22
+ var PROPERTY_ONLY = /* @__PURE__ */ new Set([
23
+ "innerHTML",
24
+ "outerHTML",
25
+ "innerText",
26
+ "textContent",
27
+ "value",
28
+ "checked",
29
+ "selected",
30
+ "muted",
31
+ "defaultValue",
32
+ "defaultChecked",
33
+ "children",
34
+ "ref"
35
+ ]);
36
+ var RAW_TEXT_ELEMENTS = /* @__PURE__ */ new Set(["script", "style", "textarea", "title"]);
37
+ function isRawTextElement(tag) {
38
+ return RAW_TEXT_ELEMENTS.has(tag);
39
+ }
40
+ function htmlAttrName(name) {
41
+ return HTML_NAME[name] ?? name;
42
+ }
43
+ function isPlainLiteralAttr(prop) {
44
+ if (prop.kind !== "attr") return false;
45
+ if (prop.expr !== void 0) return false;
46
+ if (prop.name.includes(":")) return false;
47
+ return !PROPERTY_ONLY.has(prop.name);
48
+ }
49
+ function isSerializable(node) {
50
+ if (!node.static) return false;
51
+ if (isRawTextElement(node.tag)) return false;
52
+ for (const prop of node.props) {
53
+ if (!isPlainLiteralAttr(prop)) return false;
54
+ }
55
+ for (const child of node.children) {
56
+ if (child.kind === "text") continue;
57
+ if (child.kind === "element" && isSerializable(child)) continue;
58
+ return false;
59
+ }
60
+ return true;
61
+ }
62
+ function serializeStatic(node) {
63
+ const attrs = node.props.map(serializeProp).filter(Boolean).join("");
64
+ const open = `<${node.tag}${attrs}>`;
65
+ if (VOID_ELEMENTS.has(node.tag)) return open;
66
+ return `${open}${node.children.map(serializeChild).join("")}</${node.tag}>`;
67
+ }
68
+ function serializeChild(child) {
69
+ if (child.kind === "text") return escapeText(child.value);
70
+ if (child.kind !== "element") throw new Error(`serializeStatic: unexpected ${child.kind}`);
71
+ return serializeStatic(child);
72
+ }
73
+ function serializeProp(prop) {
74
+ const name = HTML_NAME[prop.name] ?? prop.name;
75
+ const value = prop.literal;
76
+ if (value === true || value === void 0) return ` ${name}`;
77
+ if (value === false || value === null) return "";
78
+ return ` ${name}="${escapeAttr(String(value))}"`;
79
+ }
80
+ function escapeAttr(value) {
81
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
82
+ }
83
+ function escapeText(value) {
84
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
85
+ }
86
+ function templatePositions(root) {
87
+ const pos = [];
88
+ let file;
89
+ const walk = (el) => {
90
+ file ??= el.at?.file;
91
+ pos.push(el.at?.line ?? 0, el.at?.column ?? 0);
92
+ for (const child of el.children) if (child.kind === "element") walk(child);
93
+ };
94
+ walk(root);
95
+ return file && pos.some((n) => n !== 0) ? { file, pos } : void 0;
96
+ }
97
+ export {
98
+ htmlAttrName,
99
+ isPlainLiteralAttr,
100
+ isRawTextElement,
101
+ isSerializable,
102
+ serializeStatic,
103
+ templatePositions
104
+ };