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.
- package/AGENTS.md +1 -1
- package/README.md +5 -4
- package/README.zh-CN.md +4 -3
- package/dist/src/cli/extensions.d.ts +24 -0
- package/dist/src/cli/extensions.js +62 -0
- package/dist/src/cli/extensions.js.map +1 -0
- package/dist/src/cli/help.d.ts +1 -1
- package/dist/src/cli/help.js +3 -1
- package/dist/src/cli/help.js.map +1 -1
- package/dist/src/cli/hints.js +8 -3
- package/dist/src/cli/hints.js.map +1 -1
- package/dist/src/cli/main.js +21 -28
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/diagnostics/diagnostic.d.ts +3 -1
- package/dist/src/diagnostics/diagnostic.js +2 -0
- package/dist/src/diagnostics/diagnostic.js.map +1 -1
- package/dist/src/driver/build-key.d.ts +2 -0
- package/dist/src/driver/build-key.js +1 -0
- package/dist/src/driver/build-key.js.map +1 -1
- package/dist/src/driver/compiler.js +61 -8
- package/dist/src/driver/compiler.js.map +1 -1
- package/dist/src/driver/config.d.ts +4 -0
- package/dist/src/driver/config.js +2 -0
- package/dist/src/driver/config.js.map +1 -1
- package/dist/src/driver/link-features.d.ts +37 -0
- package/dist/src/driver/link-features.js +123 -0
- package/dist/src/driver/link-features.js.map +1 -0
- package/dist/src/driver/options.d.ts +10 -0
- package/dist/src/driver/runtime-objects.d.ts +5 -0
- package/dist/src/driver/runtime-objects.js +20 -1
- package/dist/src/driver/runtime-objects.js.map +1 -1
- package/dist/src/driver/usage.d.ts +23 -0
- package/dist/src/driver/usage.js +353 -0
- package/dist/src/driver/usage.js.map +1 -0
- package/dist/src/driver/version.d.ts +1 -1
- package/dist/src/driver/version.js +1 -1
- package/dist/src/extensions/catalog.js +1 -2
- package/dist/src/extensions/catalog.js.map +1 -1
- package/dist/src/extensions/gui/features.d.ts +34 -0
- package/dist/src/extensions/gui/features.js +165 -0
- package/dist/src/extensions/gui/features.js.map +1 -0
- package/dist/src/extensions/gui/index.js +10 -4
- package/dist/src/extensions/gui/index.js.map +1 -1
- package/dist/src/extensions/link-feature.d.ts +70 -0
- package/dist/src/extensions/link-feature.js +18 -0
- package/dist/src/extensions/link-feature.js.map +1 -0
- package/dist/src/extensions/registry.d.ts +24 -4
- package/dist/src/extensions/registry.js +26 -3
- package/dist/src/extensions/registry.js.map +1 -1
- package/dist/src/index.d.ts +3 -2
- package/dist/src/index.js +0 -1
- package/dist/src/index.js.map +1 -1
- package/dist/tests/cli/hints.test.js +5 -7
- package/dist/tests/cli/hints.test.js.map +1 -1
- package/dist/tests/driver/link-features.test.js +105 -0
- package/dist/tests/driver/link-features.test.js.map +1 -0
- package/dist/tests/driver/usage.test.d.ts +1 -0
- package/dist/tests/driver/usage.test.js +88 -0
- package/dist/tests/driver/usage.test.js.map +1 -0
- package/dist/tests/e2e/gui-audio.test.js +4 -4
- package/dist/tests/e2e/gui-audio.test.js.map +1 -1
- package/dist/tests/e2e/gui-css-coverage.test.d.ts +9 -0
- package/dist/tests/e2e/gui-css-coverage.test.js +333 -0
- package/dist/tests/e2e/gui-css-coverage.test.js.map +1 -0
- package/dist/tests/e2e/gui-css-features.test.d.ts +6 -0
- package/dist/tests/e2e/gui-css-features.test.js +270 -0
- package/dist/tests/e2e/gui-css-features.test.js.map +1 -0
- package/dist/tests/e2e/gui-effects.test.js +92 -11
- package/dist/tests/e2e/gui-effects.test.js.map +1 -1
- package/dist/tests/e2e/gui-feature-linking.test.d.ts +9 -0
- package/dist/tests/e2e/gui-feature-linking.test.js +68 -0
- package/dist/tests/e2e/gui-feature-linking.test.js.map +1 -0
- package/dist/tests/e2e/gui-font-face.test.d.ts +10 -0
- package/dist/tests/e2e/gui-font-face.test.js +142 -0
- package/dist/tests/e2e/gui-font-face.test.js.map +1 -0
- package/dist/tests/e2e/gui-fonts.test.d.ts +10 -0
- package/dist/tests/e2e/gui-fonts.test.js +150 -0
- package/dist/tests/e2e/gui-fonts.test.js.map +1 -0
- package/dist/tests/e2e/gui-helpers.d.ts +10 -1
- package/dist/tests/e2e/gui-helpers.js +6 -0
- package/dist/tests/e2e/gui-helpers.js.map +1 -1
- package/dist/tests/e2e/gui-layout.test.js +7 -3
- package/dist/tests/e2e/gui-layout.test.js.map +1 -1
- package/dist/tests/e2e/gui-media-disabled.test.d.ts +5 -4
- package/dist/tests/e2e/gui-media-disabled.test.js +7 -6
- package/dist/tests/e2e/gui-media-disabled.test.js.map +1 -1
- package/dist/tests/e2e/gui-media.test.d.ts +5 -4
- package/dist/tests/e2e/gui-media.test.js +9 -9
- package/dist/tests/e2e/gui-media.test.js.map +1 -1
- package/dist/tests/e2e/gui-paint.test.js +5 -2
- package/dist/tests/e2e/gui-paint.test.js.map +1 -1
- package/dist/tests/e2e/gui-shaping.test.d.ts +5 -0
- package/dist/tests/e2e/gui-shaping.test.js +47 -0
- package/dist/tests/e2e/gui-shaping.test.js.map +1 -0
- package/dist/tests/e2e/gui-track-sizing.test.d.ts +6 -0
- package/dist/tests/e2e/gui-track-sizing.test.js +173 -0
- package/dist/tests/e2e/gui-track-sizing.test.js.map +1 -0
- package/dist/tests/e2e/gui-transform.test.js +3 -2
- package/dist/tests/e2e/gui-transform.test.js.map +1 -1
- package/dist/tests/e2e/gui-webgl-pipeline-cache.test.d.ts +18 -0
- package/dist/tests/e2e/gui-webgl-pipeline-cache.test.js +120 -0
- package/dist/tests/e2e/gui-webgl-pipeline-cache.test.js.map +1 -0
- package/dist/tests/extensions/gui-features.test.d.ts +1 -0
- package/dist/tests/extensions/gui-features.test.js +175 -0
- package/dist/tests/extensions/gui-features.test.js.map +1 -0
- package/doc/ai/cli.md +5 -1
- package/doc/ai/extensions.md +56 -26
- package/doc/ai/troubleshooting.md +10 -7
- package/doc/ai/zh-CN/cli.md +5 -1
- package/doc/ai/zh-CN/extensions.md +48 -22
- package/doc/ai/zh-CN/troubleshooting.md +6 -5
- package/doc/gui/animation.md +39 -9
- package/doc/gui/api.md +2 -1
- package/doc/gui/build.md +137 -19
- package/doc/gui/canvas.md +1 -1
- package/doc/gui/dom.md +20 -4
- package/doc/gui/known-issues.md +63 -26
- package/doc/gui/layout.md +31 -8
- package/doc/gui/media.md +13 -7
- package/doc/gui/rendering.md +114 -39
- package/doc/gui/runtime.md +5 -0
- package/doc/gui/webgl.md +24 -6
- package/doc/gui.md +110 -47
- package/doc/implemented/cli.md +2 -0
- package/doc/implemented/extensions.md +9 -3
- package/doc/npm-package.md +4 -4
- package/doc/xbintsc.config.schema.json +10 -0
- package/doc/zh-CN/gui/animation.md +33 -10
- package/doc/zh-CN/gui/api.md +2 -1
- package/doc/zh-CN/gui/build.md +110 -16
- package/doc/zh-CN/gui/canvas.md +1 -1
- package/doc/zh-CN/gui/dom.md +16 -3
- package/doc/zh-CN/gui/known-issues.md +45 -15
- package/doc/zh-CN/gui/layout.md +23 -6
- package/doc/zh-CN/gui/media.md +11 -6
- package/doc/zh-CN/gui/rendering.md +84 -26
- package/doc/zh-CN/gui/runtime.md +3 -0
- package/doc/zh-CN/gui/webgl.md +3 -3
- package/doc/zh-CN/gui.md +92 -41
- package/doc/zh-CN/implemented/cli.md +2 -0
- package/doc/zh-CN/implemented/extensions.md +9 -3
- package/doc/zh-CN/npm-package.md +4 -3
- package/package.json +7 -7
- package/runtime/ext_gui/animation_values.cpp +425 -0
- package/runtime/ext_gui/animation_values.h +64 -0
- package/runtime/ext_gui/browser.cpp +22 -15
- package/runtime/ext_gui/browser_loop.cpp +13 -1
- package/runtime/ext_gui/canvas.h +1 -1
- package/runtime/ext_gui/canvas_raster.cpp +1 -1
- package/runtime/ext_gui/canvas_text.cpp +1 -1
- package/runtime/ext_gui/css.cpp +172 -21
- package/runtime/ext_gui/css.h +75 -4
- package/runtime/ext_gui/css_match.cpp +4 -0
- package/runtime/ext_gui/css_sheet.cpp +218 -2
- package/runtime/ext_gui/document.cpp +42 -192
- package/runtime/ext_gui/document.h +25 -12
- package/runtime/ext_gui/document_animation.cpp +428 -0
- package/runtime/ext_gui/dom_api_canvas.cpp +15 -8
- package/runtime/ext_gui/dom_api_canvas_extra.cpp +44 -20
- package/runtime/ext_gui/dom_api_canvas_image.cpp +3 -1
- package/runtime/ext_gui/dom_api_node_read.cpp +10 -0
- package/runtime/ext_gui/dom_api_offscreen.cpp +3 -1
- package/runtime/ext_gui/dom_api_style.cpp +7 -0
- package/runtime/ext_gui/dom_api_webgl_internal.h +4 -0
- package/runtime/ext_gui/dom_api_webgl_source.cpp +5 -2
- package/runtime/ext_gui/effect_values.cpp +245 -21
- package/runtime/ext_gui/gpu_bridge.c +28 -0
- package/runtime/ext_gui/gpu_feature.cpp +30 -0
- package/runtime/ext_gui/gpu_shader.cpp +22 -0
- package/runtime/ext_gui/gpu_shader_api.h +50 -0
- package/runtime/ext_gui/gradient_values.cpp +24 -0
- package/runtime/ext_gui/grid_values.cpp +23 -0
- package/runtime/ext_gui/gui.cpp +6 -37
- package/runtime/ext_gui/gui_canvas.cpp +14 -6
- package/runtime/ext_gui/gui_cursor.cpp +50 -0
- package/runtime/ext_gui/gui_engine.h +1 -18
- package/runtime/ext_gui/gui_events.cpp +19 -6
- package/runtime/ext_gui/gui_internal.h +3 -0
- package/runtime/ext_gui/gui_webgl.cpp +25 -10
- package/runtime/ext_gui/image_api.cpp +18 -0
- package/runtime/ext_gui/image_api.h +43 -0
- package/runtime/ext_gui/image_bitmap_browser.cpp +20 -11
- package/runtime/ext_gui/image_bridge.c +22 -0
- package/runtime/ext_gui/image_feature.cpp +107 -0
- package/runtime/ext_gui/inline_svg.cpp +95 -8
- package/runtime/ext_gui/inline_svg.h +5 -1
- package/runtime/ext_gui/layout.cpp +15 -9
- package/runtime/ext_gui/layout.h +8 -2
- package/runtime/ext_gui/layout_flex.cpp +134 -29
- package/runtime/ext_gui/layout_flow.cpp +58 -7
- package/runtime/ext_gui/layout_flow_internal.h +39 -4
- package/runtime/ext_gui/layout_grid.cpp +31 -0
- package/runtime/ext_gui/layout_inline.cpp +26 -2
- package/runtime/ext_gui/layout_vertical.cpp +196 -0
- package/runtime/ext_gui/media.cpp +4 -2
- package/runtime/ext_gui/media.h +3 -3
- package/runtime/ext_gui/media_api.h +7 -6
- package/runtime/ext_gui/paint.cpp +67 -9
- package/runtime/ext_gui/paint.h +61 -8
- package/runtime/ext_gui/paint_backdrop.cpp +211 -0
- package/runtime/ext_gui/paint_background.cpp +175 -97
- package/runtime/ext_gui/paint_effects.cpp +12 -6
- package/runtime/ext_gui/paint_internal.h +27 -0
- package/runtime/ext_gui/paint_outline.cpp +44 -0
- package/runtime/ext_gui/paint_shadow.cpp +368 -0
- package/runtime/ext_gui/renderer.cpp +15 -7
- package/runtime/ext_gui/renderer.h +11 -2
- package/runtime/ext_gui/renderer_backdrop.cpp +374 -0
- package/runtime/ext_gui/renderer_bitmap.cpp +82 -0
- package/runtime/ext_gui/renderer_gradient.cpp +51 -17
- package/runtime/ext_gui/renderer_image.cpp +19 -7
- package/runtime/ext_gui/renderer_internal.h +21 -0
- package/runtime/ext_gui/renderer_layer.cpp +37 -6
- package/runtime/ext_gui/renderer_text.cpp +2 -1
- package/runtime/ext_gui/stb_truetype.h +5077 -0
- package/runtime/ext_gui/style.cpp +62 -8
- package/runtime/ext_gui/style.h +111 -4
- package/runtime/ext_gui/style_cascade.cpp +83 -0
- package/runtime/ext_gui/style_internal.h +13 -1
- package/runtime/ext_gui/style_length.cpp +92 -0
- package/runtime/ext_gui/style_print.cpp +83 -2
- package/runtime/ext_gui/style_svg.cpp +40 -0
- package/runtime/ext_gui/style_text.cpp +302 -0
- package/runtime/ext_gui/style_ui.cpp +150 -0
- package/runtime/ext_gui/style_values.cpp +76 -62
- package/runtime/ext_gui/style_values_internal.h +23 -0
- package/runtime/ext_gui/text.cpp +27 -499
- package/runtime/ext_gui/text.h +18 -9
- package/runtime/ext_gui/text_api.h +45 -0
- package/runtime/ext_gui/text_bridge.c +23 -0
- package/runtime/ext_gui/text_cache.cpp +12 -3
- package/runtime/ext_gui/text_font_db.cpp +427 -0
- package/runtime/ext_gui/text_font_paths.cpp +250 -0
- package/runtime/ext_gui/text_font_paths.h +39 -0
- package/runtime/ext_gui/text_font_sfnt.cpp +396 -0
- package/runtime/ext_gui/text_font_sfnt.h +44 -0
- package/runtime/ext_gui/text_fonts.cpp +348 -0
- package/runtime/ext_gui/text_fonts.h +78 -0
- package/runtime/ext_gui/text_fonts_internal.h +77 -0
- package/runtime/ext_gui/text_glyph_cache.cpp +2 -2
- package/runtime/ext_gui/text_hb.cpp +438 -0
- package/runtime/ext_gui/text_stb.cpp +369 -0
- package/runtime/ext_gui/transform.cpp +107 -9
- package/runtime/ext_gui/transform.h +5 -0
- package/runtime/ext_gui/webgl_api.cpp +19 -0
- package/runtime/ext_gui/webgl_api.h +53 -0
- package/runtime/ext_gui/webgl_bridge.c +25 -0
- package/runtime/ext_gui/webgl_draw_setup.cpp +42 -1
- package/runtime/ext_gui/webgl_feature.cpp +82 -0
- package/runtime/ext_gui/webgl_feature.h +28 -0
- package/runtime/ext_gui/webgl_msl.cpp +41 -0
- package/runtime/ext_gui/webgl_msl.h +6 -0
- package/runtime/ext_gui/webgl_shader.cpp +40 -32
- package/runtime/ext_gui/window.cpp +7 -7
- package/runtime/ext_media/decode_audio.cpp +1 -1
- package/runtime/ext_media/media.cpp +1 -1
- package/runtime/ext_media/media_bridge.c +7 -7
- package/scripts/build-gui.ts +97 -98
- package/scripts/check-file-length.ts +1 -0
- package/scripts/gui-build-options.ts +122 -0
- package/src/cli/extensions.ts +72 -0
- package/src/cli/help.ts +3 -1
- package/src/cli/hints.ts +9 -3
- package/src/cli/main.ts +21 -27
- package/src/diagnostics/diagnostic.ts +2 -0
- package/src/driver/build-key.ts +3 -0
- package/src/driver/compiler.ts +63 -8
- package/src/driver/config.ts +6 -0
- package/src/driver/link-features.ts +163 -0
- package/src/driver/options.ts +10 -0
- package/src/driver/runtime-objects.ts +26 -1
- package/src/driver/usage.ts +376 -0
- package/src/driver/version.ts +1 -1
- package/src/extensions/catalog.ts +1 -2
- package/src/extensions/gui/features.ts +166 -0
- package/src/extensions/gui/index.ts +10 -4
- package/src/extensions/link-feature.ts +72 -0
- package/src/extensions/registry.ts +45 -4
- package/src/index.ts +3 -2
- package/dist/src/extensions/media/index.d.ts +0 -28
- package/dist/src/extensions/media/index.js +0 -59
- package/dist/src/extensions/media/index.js.map +0 -1
- package/dist/tests/extensions/media.test.js +0 -63
- package/dist/tests/extensions/media.test.js.map +0 -1
- package/src/extensions/media/index.ts +0 -65
- /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,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.
|
|
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
|
|
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;
|
|
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,
|
|
136
|
-
* by its build script, so only OS frameworks remain here.
|
|
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
|
-
/*
|
|
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
|