xbintsc 0.5.45 → 0.5.52

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 (286) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +5 -4
  3. package/README.zh-CN.md +4 -3
  4. package/dist/src/cli/extensions.d.ts +24 -0
  5. package/dist/src/cli/extensions.js +62 -0
  6. package/dist/src/cli/extensions.js.map +1 -0
  7. package/dist/src/cli/help.d.ts +1 -1
  8. package/dist/src/cli/help.js +3 -1
  9. package/dist/src/cli/help.js.map +1 -1
  10. package/dist/src/cli/hints.js +8 -3
  11. package/dist/src/cli/hints.js.map +1 -1
  12. package/dist/src/cli/main.js +21 -28
  13. package/dist/src/cli/main.js.map +1 -1
  14. package/dist/src/diagnostics/diagnostic.d.ts +3 -1
  15. package/dist/src/diagnostics/diagnostic.js +2 -0
  16. package/dist/src/diagnostics/diagnostic.js.map +1 -1
  17. package/dist/src/driver/build-key.d.ts +2 -0
  18. package/dist/src/driver/build-key.js +1 -0
  19. package/dist/src/driver/build-key.js.map +1 -1
  20. package/dist/src/driver/compiler.js +61 -8
  21. package/dist/src/driver/compiler.js.map +1 -1
  22. package/dist/src/driver/config.d.ts +4 -0
  23. package/dist/src/driver/config.js +2 -0
  24. package/dist/src/driver/config.js.map +1 -1
  25. package/dist/src/driver/link-features.d.ts +37 -0
  26. package/dist/src/driver/link-features.js +123 -0
  27. package/dist/src/driver/link-features.js.map +1 -0
  28. package/dist/src/driver/options.d.ts +10 -0
  29. package/dist/src/driver/runtime-objects.d.ts +5 -0
  30. package/dist/src/driver/runtime-objects.js +20 -1
  31. package/dist/src/driver/runtime-objects.js.map +1 -1
  32. package/dist/src/driver/usage.d.ts +23 -0
  33. package/dist/src/driver/usage.js +353 -0
  34. package/dist/src/driver/usage.js.map +1 -0
  35. package/dist/src/driver/version.d.ts +1 -1
  36. package/dist/src/driver/version.js +1 -1
  37. package/dist/src/extensions/catalog.js +1 -2
  38. package/dist/src/extensions/catalog.js.map +1 -1
  39. package/dist/src/extensions/gui/features.d.ts +34 -0
  40. package/dist/src/extensions/gui/features.js +165 -0
  41. package/dist/src/extensions/gui/features.js.map +1 -0
  42. package/dist/src/extensions/gui/index.js +10 -4
  43. package/dist/src/extensions/gui/index.js.map +1 -1
  44. package/dist/src/extensions/link-feature.d.ts +70 -0
  45. package/dist/src/extensions/link-feature.js +18 -0
  46. package/dist/src/extensions/link-feature.js.map +1 -0
  47. package/dist/src/extensions/registry.d.ts +24 -4
  48. package/dist/src/extensions/registry.js +26 -3
  49. package/dist/src/extensions/registry.js.map +1 -1
  50. package/dist/src/index.d.ts +3 -2
  51. package/dist/src/index.js +0 -1
  52. package/dist/src/index.js.map +1 -1
  53. package/dist/tests/cli/hints.test.js +5 -7
  54. package/dist/tests/cli/hints.test.js.map +1 -1
  55. package/dist/tests/driver/link-features.test.js +105 -0
  56. package/dist/tests/driver/link-features.test.js.map +1 -0
  57. package/dist/tests/driver/usage.test.d.ts +1 -0
  58. package/dist/tests/driver/usage.test.js +88 -0
  59. package/dist/tests/driver/usage.test.js.map +1 -0
  60. package/dist/tests/e2e/gui-audio.test.js +4 -4
  61. package/dist/tests/e2e/gui-audio.test.js.map +1 -1
  62. package/dist/tests/e2e/gui-css-coverage.test.d.ts +9 -0
  63. package/dist/tests/e2e/gui-css-coverage.test.js +333 -0
  64. package/dist/tests/e2e/gui-css-coverage.test.js.map +1 -0
  65. package/dist/tests/e2e/gui-css-features.test.d.ts +6 -0
  66. package/dist/tests/e2e/gui-css-features.test.js +270 -0
  67. package/dist/tests/e2e/gui-css-features.test.js.map +1 -0
  68. package/dist/tests/e2e/gui-effects.test.js +92 -11
  69. package/dist/tests/e2e/gui-effects.test.js.map +1 -1
  70. package/dist/tests/e2e/gui-feature-linking.test.d.ts +9 -0
  71. package/dist/tests/e2e/gui-feature-linking.test.js +68 -0
  72. package/dist/tests/e2e/gui-feature-linking.test.js.map +1 -0
  73. package/dist/tests/e2e/gui-font-face.test.d.ts +10 -0
  74. package/dist/tests/e2e/gui-font-face.test.js +142 -0
  75. package/dist/tests/e2e/gui-font-face.test.js.map +1 -0
  76. package/dist/tests/e2e/gui-fonts.test.d.ts +10 -0
  77. package/dist/tests/e2e/gui-fonts.test.js +150 -0
  78. package/dist/tests/e2e/gui-fonts.test.js.map +1 -0
  79. package/dist/tests/e2e/gui-helpers.d.ts +10 -1
  80. package/dist/tests/e2e/gui-helpers.js +6 -0
  81. package/dist/tests/e2e/gui-helpers.js.map +1 -1
  82. package/dist/tests/e2e/gui-layout.test.js +7 -3
  83. package/dist/tests/e2e/gui-layout.test.js.map +1 -1
  84. package/dist/tests/e2e/gui-media-disabled.test.d.ts +5 -4
  85. package/dist/tests/e2e/gui-media-disabled.test.js +7 -6
  86. package/dist/tests/e2e/gui-media-disabled.test.js.map +1 -1
  87. package/dist/tests/e2e/gui-media.test.d.ts +5 -4
  88. package/dist/tests/e2e/gui-media.test.js +9 -9
  89. package/dist/tests/e2e/gui-media.test.js.map +1 -1
  90. package/dist/tests/e2e/gui-paint.test.js +5 -2
  91. package/dist/tests/e2e/gui-paint.test.js.map +1 -1
  92. package/dist/tests/e2e/gui-shaping.test.d.ts +5 -0
  93. package/dist/tests/e2e/gui-shaping.test.js +47 -0
  94. package/dist/tests/e2e/gui-shaping.test.js.map +1 -0
  95. package/dist/tests/e2e/gui-track-sizing.test.d.ts +6 -0
  96. package/dist/tests/e2e/gui-track-sizing.test.js +173 -0
  97. package/dist/tests/e2e/gui-track-sizing.test.js.map +1 -0
  98. package/dist/tests/e2e/gui-transform.test.js +3 -2
  99. package/dist/tests/e2e/gui-transform.test.js.map +1 -1
  100. package/dist/tests/e2e/gui-webgl-pipeline-cache.test.d.ts +18 -0
  101. package/dist/tests/e2e/gui-webgl-pipeline-cache.test.js +120 -0
  102. package/dist/tests/e2e/gui-webgl-pipeline-cache.test.js.map +1 -0
  103. package/dist/tests/extensions/gui-features.test.d.ts +1 -0
  104. package/dist/tests/extensions/gui-features.test.js +175 -0
  105. package/dist/tests/extensions/gui-features.test.js.map +1 -0
  106. package/doc/ai/cli.md +5 -1
  107. package/doc/ai/extensions.md +56 -26
  108. package/doc/ai/troubleshooting.md +10 -7
  109. package/doc/ai/zh-CN/cli.md +5 -1
  110. package/doc/ai/zh-CN/extensions.md +48 -22
  111. package/doc/ai/zh-CN/troubleshooting.md +6 -5
  112. package/doc/gui/animation.md +39 -9
  113. package/doc/gui/api.md +2 -1
  114. package/doc/gui/build.md +137 -19
  115. package/doc/gui/canvas.md +1 -1
  116. package/doc/gui/dom.md +20 -4
  117. package/doc/gui/known-issues.md +63 -26
  118. package/doc/gui/layout.md +31 -8
  119. package/doc/gui/media.md +13 -7
  120. package/doc/gui/rendering.md +114 -39
  121. package/doc/gui/runtime.md +5 -0
  122. package/doc/gui/webgl.md +24 -6
  123. package/doc/gui.md +110 -47
  124. package/doc/implemented/cli.md +2 -0
  125. package/doc/implemented/extensions.md +9 -3
  126. package/doc/npm-package.md +4 -4
  127. package/doc/xbintsc.config.schema.json +10 -0
  128. package/doc/zh-CN/gui/animation.md +33 -10
  129. package/doc/zh-CN/gui/api.md +2 -1
  130. package/doc/zh-CN/gui/build.md +110 -16
  131. package/doc/zh-CN/gui/canvas.md +1 -1
  132. package/doc/zh-CN/gui/dom.md +16 -3
  133. package/doc/zh-CN/gui/known-issues.md +45 -15
  134. package/doc/zh-CN/gui/layout.md +23 -6
  135. package/doc/zh-CN/gui/media.md +11 -6
  136. package/doc/zh-CN/gui/rendering.md +84 -26
  137. package/doc/zh-CN/gui/runtime.md +3 -0
  138. package/doc/zh-CN/gui/webgl.md +3 -3
  139. package/doc/zh-CN/gui.md +92 -41
  140. package/doc/zh-CN/implemented/cli.md +2 -0
  141. package/doc/zh-CN/implemented/extensions.md +9 -3
  142. package/doc/zh-CN/npm-package.md +4 -3
  143. package/package.json +7 -7
  144. package/runtime/ext_gui/animation_values.cpp +425 -0
  145. package/runtime/ext_gui/animation_values.h +64 -0
  146. package/runtime/ext_gui/browser.cpp +22 -15
  147. package/runtime/ext_gui/browser_loop.cpp +13 -1
  148. package/runtime/ext_gui/canvas.h +1 -1
  149. package/runtime/ext_gui/canvas_raster.cpp +1 -1
  150. package/runtime/ext_gui/canvas_text.cpp +1 -1
  151. package/runtime/ext_gui/css.cpp +172 -21
  152. package/runtime/ext_gui/css.h +75 -4
  153. package/runtime/ext_gui/css_match.cpp +4 -0
  154. package/runtime/ext_gui/css_sheet.cpp +218 -2
  155. package/runtime/ext_gui/document.cpp +42 -192
  156. package/runtime/ext_gui/document.h +25 -12
  157. package/runtime/ext_gui/document_animation.cpp +428 -0
  158. package/runtime/ext_gui/dom_api_canvas.cpp +15 -8
  159. package/runtime/ext_gui/dom_api_canvas_extra.cpp +44 -20
  160. package/runtime/ext_gui/dom_api_canvas_image.cpp +3 -1
  161. package/runtime/ext_gui/dom_api_node_read.cpp +10 -0
  162. package/runtime/ext_gui/dom_api_offscreen.cpp +3 -1
  163. package/runtime/ext_gui/dom_api_style.cpp +7 -0
  164. package/runtime/ext_gui/dom_api_webgl_internal.h +4 -0
  165. package/runtime/ext_gui/dom_api_webgl_source.cpp +5 -2
  166. package/runtime/ext_gui/effect_values.cpp +245 -21
  167. package/runtime/ext_gui/gpu_bridge.c +28 -0
  168. package/runtime/ext_gui/gpu_feature.cpp +30 -0
  169. package/runtime/ext_gui/gpu_shader.cpp +22 -0
  170. package/runtime/ext_gui/gpu_shader_api.h +50 -0
  171. package/runtime/ext_gui/gradient_values.cpp +24 -0
  172. package/runtime/ext_gui/grid_values.cpp +23 -0
  173. package/runtime/ext_gui/gui.cpp +6 -37
  174. package/runtime/ext_gui/gui_canvas.cpp +14 -6
  175. package/runtime/ext_gui/gui_cursor.cpp +50 -0
  176. package/runtime/ext_gui/gui_engine.h +1 -18
  177. package/runtime/ext_gui/gui_events.cpp +19 -6
  178. package/runtime/ext_gui/gui_internal.h +3 -0
  179. package/runtime/ext_gui/gui_webgl.cpp +25 -10
  180. package/runtime/ext_gui/image_api.cpp +18 -0
  181. package/runtime/ext_gui/image_api.h +43 -0
  182. package/runtime/ext_gui/image_bitmap_browser.cpp +20 -11
  183. package/runtime/ext_gui/image_bridge.c +22 -0
  184. package/runtime/ext_gui/image_feature.cpp +107 -0
  185. package/runtime/ext_gui/inline_svg.cpp +95 -8
  186. package/runtime/ext_gui/inline_svg.h +5 -1
  187. package/runtime/ext_gui/layout.cpp +15 -9
  188. package/runtime/ext_gui/layout.h +8 -2
  189. package/runtime/ext_gui/layout_flex.cpp +134 -29
  190. package/runtime/ext_gui/layout_flow.cpp +58 -7
  191. package/runtime/ext_gui/layout_flow_internal.h +39 -4
  192. package/runtime/ext_gui/layout_grid.cpp +31 -0
  193. package/runtime/ext_gui/layout_inline.cpp +26 -2
  194. package/runtime/ext_gui/layout_vertical.cpp +196 -0
  195. package/runtime/ext_gui/media.cpp +4 -2
  196. package/runtime/ext_gui/media.h +3 -3
  197. package/runtime/ext_gui/media_api.h +7 -6
  198. package/runtime/ext_gui/paint.cpp +67 -9
  199. package/runtime/ext_gui/paint.h +61 -8
  200. package/runtime/ext_gui/paint_backdrop.cpp +211 -0
  201. package/runtime/ext_gui/paint_background.cpp +175 -97
  202. package/runtime/ext_gui/paint_effects.cpp +12 -6
  203. package/runtime/ext_gui/paint_internal.h +27 -0
  204. package/runtime/ext_gui/paint_outline.cpp +44 -0
  205. package/runtime/ext_gui/paint_shadow.cpp +368 -0
  206. package/runtime/ext_gui/renderer.cpp +15 -7
  207. package/runtime/ext_gui/renderer.h +11 -2
  208. package/runtime/ext_gui/renderer_backdrop.cpp +374 -0
  209. package/runtime/ext_gui/renderer_bitmap.cpp +82 -0
  210. package/runtime/ext_gui/renderer_gradient.cpp +51 -17
  211. package/runtime/ext_gui/renderer_image.cpp +19 -7
  212. package/runtime/ext_gui/renderer_internal.h +21 -0
  213. package/runtime/ext_gui/renderer_layer.cpp +37 -6
  214. package/runtime/ext_gui/renderer_text.cpp +2 -1
  215. package/runtime/ext_gui/stb_truetype.h +5077 -0
  216. package/runtime/ext_gui/style.cpp +62 -8
  217. package/runtime/ext_gui/style.h +111 -4
  218. package/runtime/ext_gui/style_cascade.cpp +83 -0
  219. package/runtime/ext_gui/style_internal.h +13 -1
  220. package/runtime/ext_gui/style_length.cpp +92 -0
  221. package/runtime/ext_gui/style_print.cpp +83 -2
  222. package/runtime/ext_gui/style_svg.cpp +40 -0
  223. package/runtime/ext_gui/style_text.cpp +302 -0
  224. package/runtime/ext_gui/style_ui.cpp +150 -0
  225. package/runtime/ext_gui/style_values.cpp +76 -62
  226. package/runtime/ext_gui/style_values_internal.h +23 -0
  227. package/runtime/ext_gui/text.cpp +27 -499
  228. package/runtime/ext_gui/text.h +18 -9
  229. package/runtime/ext_gui/text_api.h +45 -0
  230. package/runtime/ext_gui/text_bridge.c +23 -0
  231. package/runtime/ext_gui/text_cache.cpp +12 -3
  232. package/runtime/ext_gui/text_font_db.cpp +427 -0
  233. package/runtime/ext_gui/text_font_paths.cpp +250 -0
  234. package/runtime/ext_gui/text_font_paths.h +39 -0
  235. package/runtime/ext_gui/text_font_sfnt.cpp +396 -0
  236. package/runtime/ext_gui/text_font_sfnt.h +44 -0
  237. package/runtime/ext_gui/text_fonts.cpp +348 -0
  238. package/runtime/ext_gui/text_fonts.h +78 -0
  239. package/runtime/ext_gui/text_fonts_internal.h +77 -0
  240. package/runtime/ext_gui/text_glyph_cache.cpp +2 -2
  241. package/runtime/ext_gui/text_hb.cpp +438 -0
  242. package/runtime/ext_gui/text_stb.cpp +369 -0
  243. package/runtime/ext_gui/transform.cpp +107 -9
  244. package/runtime/ext_gui/transform.h +5 -0
  245. package/runtime/ext_gui/webgl_api.cpp +19 -0
  246. package/runtime/ext_gui/webgl_api.h +53 -0
  247. package/runtime/ext_gui/webgl_bridge.c +25 -0
  248. package/runtime/ext_gui/webgl_draw_setup.cpp +42 -1
  249. package/runtime/ext_gui/webgl_feature.cpp +82 -0
  250. package/runtime/ext_gui/webgl_feature.h +28 -0
  251. package/runtime/ext_gui/webgl_msl.cpp +41 -0
  252. package/runtime/ext_gui/webgl_msl.h +6 -0
  253. package/runtime/ext_gui/webgl_shader.cpp +40 -32
  254. package/runtime/ext_gui/window.cpp +7 -7
  255. package/runtime/ext_media/decode_audio.cpp +1 -1
  256. package/runtime/ext_media/media.cpp +1 -1
  257. package/runtime/ext_media/media_bridge.c +7 -7
  258. package/scripts/build-gui.ts +97 -98
  259. package/scripts/check-file-length.ts +1 -0
  260. package/scripts/gui-build-options.ts +122 -0
  261. package/src/cli/extensions.ts +72 -0
  262. package/src/cli/help.ts +3 -1
  263. package/src/cli/hints.ts +9 -3
  264. package/src/cli/main.ts +21 -27
  265. package/src/diagnostics/diagnostic.ts +2 -0
  266. package/src/driver/build-key.ts +3 -0
  267. package/src/driver/compiler.ts +63 -8
  268. package/src/driver/config.ts +6 -0
  269. package/src/driver/link-features.ts +163 -0
  270. package/src/driver/options.ts +10 -0
  271. package/src/driver/runtime-objects.ts +26 -1
  272. package/src/driver/usage.ts +376 -0
  273. package/src/driver/version.ts +1 -1
  274. package/src/extensions/catalog.ts +1 -2
  275. package/src/extensions/gui/features.ts +166 -0
  276. package/src/extensions/gui/index.ts +10 -4
  277. package/src/extensions/link-feature.ts +72 -0
  278. package/src/extensions/registry.ts +45 -4
  279. package/src/index.ts +3 -2
  280. package/dist/src/extensions/media/index.d.ts +0 -28
  281. package/dist/src/extensions/media/index.js +0 -59
  282. package/dist/src/extensions/media/index.js.map +0 -1
  283. package/dist/tests/extensions/media.test.js +0 -63
  284. package/dist/tests/extensions/media.test.js.map +0 -1
  285. package/src/extensions/media/index.ts +0 -65
  286. /package/dist/tests/{extensions/media.test.d.ts → driver/link-features.test.d.ts} +0 -0
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Static usage analysis for optional link features.
3
+ *
4
+ * The bundled AST is the last place where the compiler can see *all* of a
5
+ * program: imported modules and `.html` assets are already merged into one
6
+ * `SourceFile`, and asset loaders have inlined external stylesheets. This module
7
+ * extracts the facts a {@link LinkFeature} needs to decide whether it may be
8
+ * used, without pretending to be a full data-flow analysis:
9
+ *
10
+ * - every string literal / template chunk (HTML tags, CSS property values),
11
+ * - identifiers and property names (`Audio`, `decodeAudioData`, …),
12
+ * - every `getContext(...)` kind that can be resolved statically,
13
+ * - whether HTML/CSS can be built from data the compiler cannot see.
14
+ *
15
+ * Constants are resolved through a small, name-based table (`const` only,
16
+ * invalidated by shadowing or reassignment). Anything that cannot be resolved is
17
+ * treated as dynamic, which makes features conservative: a false positive costs
18
+ * size, a false negative could disable a capability at run time.
19
+ */
20
+ import { SyntaxKind, } from "../ast/nodes.js";
21
+ import { walk } from "../ast/visitor.js";
22
+ /** Operators that make a `BinaryExpression`-shaped node an assignment. */
23
+ const ASSIGNMENT_OPERATORS = new Set([
24
+ "=",
25
+ "+=",
26
+ "-=",
27
+ "*=",
28
+ "/=",
29
+ "%=",
30
+ "**=",
31
+ "<<=",
32
+ ">>=",
33
+ ">>>=",
34
+ "&=",
35
+ "|=",
36
+ "^=",
37
+ "&&=",
38
+ "||=",
39
+ "??=",
40
+ ]);
41
+ /** Property names whose assigned value is parsed as markup or CSS. */
42
+ const MARKUP_PROPERTIES = new Set(["innerHTML", "outerHTML", "cssText"]);
43
+ /**
44
+ * The property/method name of `a.b` or `a["b"]`, or the identifier of a bare
45
+ * call (`loadHTML(...)`). Returns undefined for a computed access.
46
+ */
47
+ function memberName(expression) {
48
+ if (expression.kind === SyntaxKind.PropertyAccessExpression) {
49
+ return expression.name.text;
50
+ }
51
+ if (expression.kind === SyntaxKind.ElementAccessExpression) {
52
+ const argument = expression.argumentExpression;
53
+ if (argument.kind === SyntaxKind.StringLiteral)
54
+ return argument.value;
55
+ return undefined;
56
+ }
57
+ if (expression.kind === SyntaxKind.Identifier)
58
+ return expression.text;
59
+ return undefined;
60
+ }
61
+ /** The assignment-shaped view of a `BinaryExpression`, when it is one. */
62
+ function asAssignment(node) {
63
+ if (node.kind !== SyntaxKind.BinaryExpression)
64
+ return undefined;
65
+ const operator = node.operator;
66
+ return ASSIGNMENT_OPERATORS.has(String(operator)) ? node : undefined;
67
+ }
68
+ /** True for literals that stringify to text which can never contain markup. */
69
+ function isPrimitiveLiteral(expression) {
70
+ switch (expression.kind) {
71
+ case SyntaxKind.NumericLiteral:
72
+ case SyntaxKind.BigIntLiteral:
73
+ case SyntaxKind.TrueKeyword:
74
+ case SyntaxKind.FalseKeyword:
75
+ case SyntaxKind.NullKeyword:
76
+ case SyntaxKind.UndefinedKeyword:
77
+ return true;
78
+ default:
79
+ return false;
80
+ }
81
+ }
82
+ /** Convert a primitive literal to the text it contributes to a template. */
83
+ function primitiveText(expression) {
84
+ switch (expression.kind) {
85
+ case SyntaxKind.NumericLiteral:
86
+ return String(expression.value);
87
+ case SyntaxKind.BigIntLiteral:
88
+ return expression.value.toString();
89
+ case SyntaxKind.TrueKeyword:
90
+ case SyntaxKind.FalseKeyword:
91
+ return expression.value ? "true" : "false";
92
+ case SyntaxKind.NullKeyword:
93
+ return "null";
94
+ case SyntaxKind.UndefinedKeyword:
95
+ return "undefined";
96
+ default:
97
+ return undefined;
98
+ }
99
+ }
100
+ /** Collect the usage facts of one bundled program. */
101
+ export function collectUsage(sourceFile) {
102
+ const strings = new Set();
103
+ const identifiers = new Set();
104
+ const constants = new Map();
105
+ const ambiguous = new Set();
106
+ const assigned = new Set();
107
+ const calls = [];
108
+ const assignments = [];
109
+ let createsStyleElement = false;
110
+ let unresolvedTextContent = false;
111
+ const forget = (name) => {
112
+ if (constants.delete(name))
113
+ ambiguous.add(name);
114
+ };
115
+ walk(sourceFile, (node) => {
116
+ switch (node.kind) {
117
+ case SyntaxKind.StringLiteral:
118
+ strings.add(node.value);
119
+ break;
120
+ case SyntaxKind.NoSubstitutionTemplateLiteral:
121
+ strings.add(node.value);
122
+ break;
123
+ case SyntaxKind.TemplateLiteral: {
124
+ const template = node;
125
+ strings.add(template.head);
126
+ for (const span of template.spans)
127
+ strings.add(span.literal);
128
+ break;
129
+ }
130
+ case SyntaxKind.Identifier:
131
+ identifiers.add(node.text);
132
+ break;
133
+ case SyntaxKind.PrivateIdentifier:
134
+ identifiers.add(node.text);
135
+ break;
136
+ case SyntaxKind.VariableStatement: {
137
+ const statement = node;
138
+ if (statement.declarationList.declarationKind !== "const")
139
+ break;
140
+ for (const declaration of statement.declarationList.declarations) {
141
+ if (declaration.name.kind !== SyntaxKind.Identifier || declaration.initializer === undefined)
142
+ continue;
143
+ const name = declaration.name.text;
144
+ /* A second declaration of the same name makes the initializer
145
+ * ambiguous: shadowing is not tracked, so refuse to resolve it. */
146
+ if (constants.has(name) || ambiguous.has(name)) {
147
+ forget(name);
148
+ continue;
149
+ }
150
+ constants.set(name, declaration.initializer);
151
+ }
152
+ break;
153
+ }
154
+ case SyntaxKind.Parameter: {
155
+ /* A parameter shadows any const of the same name; resolution only looks
156
+ * at the name, so mark it ambiguous. */
157
+ const parameter = node;
158
+ if (parameter.name.kind === SyntaxKind.Identifier)
159
+ ambiguous.add(parameter.name.text);
160
+ break;
161
+ }
162
+ case SyntaxKind.PrefixUnaryExpression: {
163
+ const unary = node;
164
+ if (unary.operator === "++" || unary.operator === "--") {
165
+ if (unary.operand.kind === SyntaxKind.Identifier)
166
+ assigned.add(unary.operand.text);
167
+ }
168
+ break;
169
+ }
170
+ case SyntaxKind.PostfixUnaryExpression: {
171
+ const unary = node;
172
+ if (unary.operand.kind === SyntaxKind.Identifier)
173
+ assigned.add(unary.operand.text);
174
+ break;
175
+ }
176
+ case SyntaxKind.BinaryExpression: {
177
+ const assignment = asAssignment(node);
178
+ if (assignment === undefined)
179
+ break;
180
+ if (assignment.left.kind === SyntaxKind.Identifier)
181
+ assigned.add(assignment.left.text);
182
+ const name = memberName(assignment.left);
183
+ if (name !== undefined)
184
+ assignments.push({ name, right: assignment.right });
185
+ break;
186
+ }
187
+ case SyntaxKind.CallExpression: {
188
+ const call = node;
189
+ const name = memberName(call.expression);
190
+ if (name !== undefined)
191
+ calls.push({ name, arguments: call.arguments });
192
+ break;
193
+ }
194
+ default:
195
+ break;
196
+ }
197
+ });
198
+ const resolve = (expression, stack = new Set()) => {
199
+ const primitive = primitiveText(expression);
200
+ if (primitive !== undefined)
201
+ return primitive;
202
+ switch (expression.kind) {
203
+ case SyntaxKind.StringLiteral:
204
+ return expression.value;
205
+ case SyntaxKind.NoSubstitutionTemplateLiteral:
206
+ return expression.value;
207
+ case SyntaxKind.TemplateLiteral: {
208
+ const template = expression;
209
+ let text = template.head;
210
+ for (const span of template.spans) {
211
+ const value = resolve(span.expression, stack);
212
+ if (value === undefined) {
213
+ if (!isPrimitiveLiteral(span.expression))
214
+ return undefined;
215
+ }
216
+ else {
217
+ text += value;
218
+ }
219
+ text += span.literal;
220
+ }
221
+ return text;
222
+ }
223
+ case SyntaxKind.Identifier: {
224
+ const name = expression.text;
225
+ if (assigned.has(name) || ambiguous.has(name))
226
+ return undefined;
227
+ const initializer = constants.get(name);
228
+ if (initializer === undefined || stack.has(name))
229
+ return undefined;
230
+ stack.add(name);
231
+ const value = resolve(initializer, stack);
232
+ stack.delete(name);
233
+ return value;
234
+ }
235
+ case SyntaxKind.ParenthesizedExpression:
236
+ case SyntaxKind.AsExpression:
237
+ case SyntaxKind.SatisfiesExpression:
238
+ case SyntaxKind.NonNullExpression: {
239
+ return resolve(expression.expression, stack);
240
+ }
241
+ case SyntaxKind.BinaryExpression: {
242
+ const binary = expression;
243
+ if (ASSIGNMENT_OPERATORS.has(String(binary.operator)) || binary.operator !== "+")
244
+ return undefined;
245
+ const left = resolve(binary.left, stack);
246
+ const right = resolve(binary.right, stack);
247
+ return left === undefined || right === undefined ? undefined : left + right;
248
+ }
249
+ default:
250
+ return undefined;
251
+ }
252
+ };
253
+ let dynamicMarkup = false;
254
+ const getContextKinds = [];
255
+ const sink = (expression) => {
256
+ if (expression === undefined) {
257
+ dynamicMarkup = true;
258
+ return;
259
+ }
260
+ const text = resolve(expression);
261
+ if (text === undefined)
262
+ dynamicMarkup = true;
263
+ else
264
+ strings.add(text);
265
+ };
266
+ const sinkAll = (expressions) => {
267
+ for (const expression of expressions) {
268
+ const text = resolve(expression);
269
+ if (text === undefined)
270
+ dynamicMarkup = true;
271
+ else
272
+ strings.add(text);
273
+ }
274
+ };
275
+ for (const site of calls) {
276
+ switch (site.name) {
277
+ case "getContext": {
278
+ const kind = site.arguments[0] === undefined ? undefined : resolve(site.arguments[0]);
279
+ getContextKinds.push(kind === undefined ? undefined : kind.toLowerCase());
280
+ break;
281
+ }
282
+ case "createElement": {
283
+ const tag = site.arguments[0] === undefined ? undefined : resolve(site.arguments[0]);
284
+ if (tag === undefined)
285
+ dynamicMarkup = true;
286
+ else if (tag.toLowerCase() === "style")
287
+ createsStyleElement = true;
288
+ break;
289
+ }
290
+ case "createElementNS": {
291
+ const tag = site.arguments[1] === undefined ? undefined : resolve(site.arguments[1]);
292
+ if (tag === undefined)
293
+ dynamicMarkup = true;
294
+ else if (tag.toLowerCase() === "style")
295
+ createsStyleElement = true;
296
+ break;
297
+ }
298
+ case "loadHTML":
299
+ case "parseFromString":
300
+ case "write":
301
+ case "writeln":
302
+ sink(site.arguments[0]);
303
+ break;
304
+ case "insertAdjacentHTML":
305
+ sink(site.arguments[1]);
306
+ break;
307
+ case "setAttribute": {
308
+ const attribute = site.arguments[0] === undefined ? undefined : resolve(site.arguments[0]);
309
+ if (attribute === undefined)
310
+ dynamicMarkup = true;
311
+ else if (attribute.toLowerCase() === "style")
312
+ sink(site.arguments[1]);
313
+ break;
314
+ }
315
+ case "setProperty": {
316
+ /* The property *name* decides whether a CSS feature is used; the value
317
+ * cannot introduce a new property. A computed name is therefore the
318
+ * only reason to be conservative here. */
319
+ if (site.arguments[0] === undefined || resolve(site.arguments[0]) === undefined)
320
+ dynamicMarkup = true;
321
+ break;
322
+ }
323
+ case "insertRule":
324
+ case "addRule":
325
+ case "replaceSync":
326
+ sinkAll(site.arguments);
327
+ break;
328
+ default:
329
+ break;
330
+ }
331
+ }
332
+ for (const assignment of assignments) {
333
+ if (MARKUP_PROPERTIES.has(assignment.name)) {
334
+ sink(assignment.right);
335
+ }
336
+ else if (assignment.name === "textContent" || assignment.name === "innerText") {
337
+ if (resolve(assignment.right) === undefined)
338
+ unresolvedTextContent = true;
339
+ }
340
+ }
341
+ /* A `<style>` element created at run time is usually filled through
342
+ * `textContent`; if that value is not a literal, CSS (and therefore
343
+ * `mix-blend-mode`) may come from data the compiler cannot see. */
344
+ if (createsStyleElement && unresolvedTextContent)
345
+ dynamicMarkup = true;
346
+ return {
347
+ strings: [...strings],
348
+ identifiers,
349
+ getContext: getContextKinds,
350
+ dynamicMarkup,
351
+ };
352
+ }
353
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/driver/usage.ts"],"names":[],"mappings":"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"}
@@ -9,4 +9,4 @@
9
9
  * `main`/`master` only (see `.githooks/pre-commit`), so feature branches never
10
10
  * change this line and merging two of them cannot conflict here.
11
11
  */
12
- export declare const COMPILER_VERSION = "0.5.45";
12
+ export declare const COMPILER_VERSION = "0.5.52";
@@ -9,5 +9,5 @@
9
9
  * `main`/`master` only (see `.githooks/pre-commit`), so feature branches never
10
10
  * change this line and merging two of them cannot conflict here.
11
11
  */
12
- export const COMPILER_VERSION = "0.5.45";
12
+ export const COMPILER_VERSION = "0.5.52";
13
13
  //# sourceMappingURL=version.js.map
@@ -11,9 +11,8 @@
11
11
  */
12
12
  import { nodeExtension } from "./node/index.js";
13
13
  import { guiExtension } from "./gui/index.js";
14
- import { mediaExtension } from "./media/index.js";
15
14
  /** Every extension bundled with xbintsc, in registration order. */
16
15
  export function bundledExtensions() {
17
- return [nodeExtension, guiExtension, mediaExtension];
16
+ return [nodeExtension, guiExtension];
18
17
  }
19
18
  //# sourceMappingURL=catalog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/extensions/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,mEAAmE;AACnE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/extensions/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,mEAAmE;AACnE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Optional link features of the `gui` extension.
3
+ *
4
+ * The GUI engine itself is always linked with `--ext gui`; these are the two
5
+ * heavy halves a program may never touch:
6
+ *
7
+ * - `media` — the FFmpeg decoder backend (`runtime/ext_media/`, `media.a`).
8
+ * The DOM media surface lives in `gui.a`; only decoding is optional, and an
9
+ * element without the backend still exists and fires `error`.
10
+ * - `gpu` — glslang (+ SPIRV-Cross on macOS), the GLSL→SPIR-V translator used
11
+ * by WebGL *and* by the `mix-blend-mode` / `backdrop-filter` offscreen
12
+ * compositor. The engine's own shaders are precompiled, so a DOM page
13
+ * never needs it.
14
+ *
15
+ * Detection is static: the compiler sees imported `.html`/`.css` assets and all
16
+ * bundled modules, so it can recognise `<video>`/`<audio>`, `getContext("webgl")`
17
+ * and `mix-blend-mode`/`backdrop-filter`. When markup can be built at run time
18
+ * the usage collector sets `dynamicMarkup`, which conservatively enables both
19
+ * features; users who know better can shrink the binary with `--no-feature`.
20
+ */
21
+ import type { LinkFeature, ProgramUsage } from "../link-feature.js";
22
+ /** True when the program may create or drive a media element. */
23
+ export declare function hasMediaUsage(usage: ProgramUsage): boolean;
24
+ /** True when the program may compile GLSL at run time (WebGL or blending). */
25
+ export declare function hasGpuUsage(usage: ProgramUsage): boolean;
26
+ /** True when the program may ask for a WebGL context (not just blending). */
27
+ export declare function hasWebglUsage(usage: ProgramUsage): boolean;
28
+ /** True when the program may draw a bitmap or SVG. */
29
+ export declare function hasImageUsage(usage: ProgramUsage): boolean;
30
+ /** True when the program may need full OpenType shaping. Non-Latin text needs it
31
+ * for shaping, and an author `@font-face` often points at a CFF/OTF font that
32
+ * the default stb_truetype backend cannot outline. */
33
+ export declare function hasShapingUsage(usage: ProgramUsage): boolean;
34
+ export declare const guiLinkFeatures: readonly LinkFeature[];
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Optional link features of the `gui` extension.
3
+ *
4
+ * The GUI engine itself is always linked with `--ext gui`; these are the two
5
+ * heavy halves a program may never touch:
6
+ *
7
+ * - `media` — the FFmpeg decoder backend (`runtime/ext_media/`, `media.a`).
8
+ * The DOM media surface lives in `gui.a`; only decoding is optional, and an
9
+ * element without the backend still exists and fires `error`.
10
+ * - `gpu` — glslang (+ SPIRV-Cross on macOS), the GLSL→SPIR-V translator used
11
+ * by WebGL *and* by the `mix-blend-mode` / `backdrop-filter` offscreen
12
+ * compositor. The engine's own shaders are precompiled, so a DOM page
13
+ * never needs it.
14
+ *
15
+ * Detection is static: the compiler sees imported `.html`/`.css` assets and all
16
+ * bundled modules, so it can recognise `<video>`/`<audio>`, `getContext("webgl")`
17
+ * and `mix-blend-mode`/`backdrop-filter`. When markup can be built at run time
18
+ * the usage collector sets `dynamicMarkup`, which conservatively enables both
19
+ * features; users who know better can shrink the binary with `--no-feature`.
20
+ */
21
+ import { join } from "node:path";
22
+ import { findRuntimeDir, platformSlug } from "../../driver/paths.js";
23
+ import { findRuntimeLibrary, runtimeLibDir } from "../../driver/runtime-lib.js";
24
+ /** `<video …>` / `<audio …>` in an HTML string or asset. */
25
+ const MEDIA_TAG = /<(?:video|audio)\b/i;
26
+ /** A literal tag name handed to `createElement("video")`. */
27
+ const MEDIA_TAG_NAME = /^(?:video|audio)$/i;
28
+ /** Anything that needs the GLSL translator. */
29
+ const GPU_TOKEN = /webgl|mix-blend-mode|mixBlendMode|backdrop-filter|backdropFilter/i;
30
+ /** True when the program may create or drive a media element. */
31
+ export function hasMediaUsage(usage) {
32
+ if (usage.dynamicMarkup)
33
+ return true;
34
+ for (const name of ["Audio", "HTMLMediaElement", "HTMLVideoElement", "HTMLAudioElement", "decodeAudioData"]) {
35
+ if (usage.identifiers.has(name))
36
+ return true;
37
+ }
38
+ return usage.strings.some((value) => MEDIA_TAG.test(value) || MEDIA_TAG_NAME.test(value));
39
+ }
40
+ /** True when the program may compile GLSL at run time (WebGL or blending). */
41
+ export function hasGpuUsage(usage) {
42
+ if (usage.dynamicMarkup)
43
+ return true;
44
+ if (usage.identifiers.has("mixBlendMode") || usage.identifiers.has("backdropFilter"))
45
+ return true;
46
+ if (usage.getContext.some((kind) => kind === undefined || /webgl/i.test(kind)))
47
+ return true;
48
+ return usage.strings.some((value) => GPU_TOKEN.test(value));
49
+ }
50
+ /** True when the program may ask for a WebGL context (not just blending). */
51
+ export function hasWebglUsage(usage) {
52
+ if (usage.dynamicMarkup)
53
+ return true;
54
+ if (usage.getContext.some((kind) => kind === undefined || /webgl/i.test(kind)))
55
+ return true;
56
+ return usage.strings.some((value) => /webgl/i.test(value));
57
+ }
58
+ /** True when the program may draw a bitmap or SVG. */
59
+ export function hasImageUsage(usage) {
60
+ if (usage.dynamicMarkup)
61
+ return true;
62
+ for (const name of ["Image", "ImageBitmap", "createImageBitmap", "drawImage"]) {
63
+ if (usage.identifiers.has(name))
64
+ return true;
65
+ }
66
+ return usage.strings.some((value) => /<img\b|<svg\b|background-image|url\(|\.svg\b|drawImage|createImageBitmap/i.test(value));
67
+ }
68
+ /** True when the program may need full OpenType shaping. Non-Latin text needs it
69
+ * for shaping, and an author `@font-face` often points at a CFF/OTF font that
70
+ * the default stb_truetype backend cannot outline. */
71
+ export function hasShapingUsage(usage) {
72
+ if (usage.dynamicMarkup)
73
+ return true;
74
+ return usage.strings.some((value) => {
75
+ if (/@font-face\b/i.test(value))
76
+ return true;
77
+ for (const character of value) {
78
+ if ((character.codePointAt(0) ?? 0) > 0x7f)
79
+ return true;
80
+ }
81
+ return /\\u\{[0-9a-fA-F]+\}|\\u[0-9a-fA-F]{4}|&#(?:x[0-9a-fA-F]+|\d+);/.test(value);
82
+ });
83
+ }
84
+ /** Absolute path to the per-platform prebuilt media archive. */
85
+ function mediaArchive() {
86
+ return join(runtimeLibDir(), process.platform === "win32" ? "media.lib" : "media.a");
87
+ }
88
+ export const guiLinkFeatures = [
89
+ {
90
+ name: "media",
91
+ description: "FFmpeg decoding for <video>/<audio>",
92
+ /**
93
+ * The registration bridge is a tiny C file compiled and linked only when
94
+ * the feature is active. Its constructor installs the decoder table into
95
+ * the engine and references the backend entry points, which is what makes
96
+ * the linker extract `media.a` — an archive whose only entry point is a
97
+ * constructor would otherwise never be pulled in.
98
+ */
99
+ runtimeSources: () => [join(findRuntimeDir(), "ext_media", "media_bridge.c")],
100
+ nativeObjects: () => {
101
+ const archive = findRuntimeLibrary("media");
102
+ if (archive === undefined) {
103
+ throw new Error(`media native library not found at ${mediaArchive()} (media.a or media.lib).\n` +
104
+ `The optional @xbintsc/${platformSlug()} package ships it: reinstall xbintsc ` +
105
+ `without --omit=optional, or build it with \`npm run media\` (see doc/gui/build.md).`);
106
+ }
107
+ return [archive];
108
+ },
109
+ /** `media.a` is C++ and FFmpeg itself needs libm; the GUI extension already
110
+ * contributes the C++ runtime and the OS frameworks. On Windows the FFmpeg
111
+ * objects reference the Win32 crypto/COM services (`bcrypt`, `ole32`) and
112
+ * `user32`. */
113
+ linkerFlags: () => (process.platform === "win32" ? ["-lbcrypt", "-lole32", "-luser32"] : ["-lm"]),
114
+ used: hasMediaUsage,
115
+ },
116
+ {
117
+ name: "gpu",
118
+ description: "GLSL translation (WebGL, mix-blend-mode and backdrop-filter) via glslang",
119
+ /**
120
+ * `gpu_bridge.c` is linked only when the feature is active. It calls into
121
+ * `gpu_feature.cpp` inside `gui.a`, which installs the shader-translation
122
+ * table and references `compile_glsl`/`cross_compile_msl`; those references
123
+ * are what pull the glslang members out of `gui.a`. Without the bridge the
124
+ * engine's shader paths see a null table and fail gracefully (blend falls
125
+ * back, WebGL reports a compile log).
126
+ */
127
+ runtimeSources: () => [join(findRuntimeDir(), "ext_gui", "gpu_bridge.c")],
128
+ used: hasGpuUsage,
129
+ },
130
+ {
131
+ name: "images",
132
+ description: "stb_image/NanoSVG decoding for <img>, CSS backgrounds and inline <svg>",
133
+ /**
134
+ * `image_bridge.c` installs `XtImageApi` and references the decoders; a page
135
+ * with no `<img>`/SVG/`background-image`/`drawImage` links neither
136
+ * stb_image nor NanoSVG.
137
+ */
138
+ runtimeSources: () => [join(findRuntimeDir(), "ext_gui", "image_bridge.c")],
139
+ used: hasImageUsage,
140
+ },
141
+ {
142
+ name: "shaping",
143
+ description: "HarfBuzz/FreeType shaping for complex scripts and CFF/OTF fonts",
144
+ /**
145
+ * `text_bridge.c` installs `TextApi` and references `text_hb.cpp`, pulling
146
+ * HarfBuzz and FreeType out of `gui.a`. A Latin-only page keeps the faster
147
+ * stb_truetype path and links neither library.
148
+ */
149
+ runtimeSources: () => [join(findRuntimeDir(), "ext_gui", "text_bridge.c")],
150
+ used: hasShapingUsage,
151
+ },
152
+ {
153
+ name: "webgl",
154
+ description: "WebGL context and DOM API (requires gpu)",
155
+ requires: ["gpu"],
156
+ /**
157
+ * `webgl_bridge.c` installs `XtWebglApi` and references the WebGL context
158
+ * and DOM bindings, pulling them out of `gui.a`. A page that never asks for
159
+ * WebGL therefore links none of `webgl_*`/`dom_api_webgl*`.
160
+ */
161
+ runtimeSources: () => [join(findRuntimeDir(), "ext_gui", "webgl_bridge.c")],
162
+ used: hasWebglUsage,
163
+ },
164
+ ];
165
+ //# sourceMappingURL=features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../../../src/extensions/gui/features.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ import { platformSlug } from "../../driver/paths.js";
25
25
  import { findRuntimeLibrary, runtimeLibDir } from "../../driver/runtime-lib.js";
26
26
  import { loadHtmlAsset } from "./html.js";
27
27
  import { loadScriptAsset } from "./three.js";
28
+ import { guiLinkFeatures } from "./features.js";
28
29
  /** Top-level `gui` module bindings. */
29
30
  const guiModule = {
30
31
  namespace: "gui",
@@ -132,9 +133,8 @@ export const guiExtension = {
132
133
  },
133
134
  /**
134
135
  * System libraries the archive itself depends on. The vendored third-party
135
- * libraries (GPU backend, HarfBuzz, FreeType, ...) are linked *into* `gui.a`
136
- * by its build script, so only OS frameworks remain here. TODO(gui): confirm
137
- * the exact set once the GPU backend is chosen (see doc/gui.md).
136
+ * libraries (GPU backend, stb_truetype, stb_image/NanoSVG, ...) are linked
137
+ * *into* `gui.a` by its build script, so only OS frameworks remain here.
138
138
  */
139
139
  linkerFlags: () => {
140
140
  if (process.platform === "darwin") {
@@ -153,7 +153,7 @@ export const guiExtension = {
153
153
  "-framework", "GameController",
154
154
  "-framework", "Metal",
155
155
  "-framework", "QuartzCore",
156
- /* HarfBuzz's CoreText shaper (macOS system fonts). */
156
+ /* Cocoa/system text and graphics services used by SDL. */
157
157
  "-framework", "CoreText",
158
158
  "-framework", "CoreGraphics",
159
159
  "-framework", "CoreFoundation",
@@ -207,5 +207,11 @@ export const guiExtension = {
207
207
  globalValues: () => browserGlobals,
208
208
  /** Rewrite imported `.html` assets and patch three.js's shader unroller. */
209
209
  assetLoaders: () => ({ ".html": loadHtmlAsset, ".js": loadScriptAsset, ".mjs": loadScriptAsset }),
210
+ /**
211
+ * FFmpeg and glslang are optional halves of the engine, selected from the
212
+ * program (see `features.ts`). A program that only renders HTML/CSS never
213
+ * links either.
214
+ */
215
+ linkFeatures: () => guiLinkFeatures,
210
216
  };
211
217
  //# sourceMappingURL=index.js.map