From 40fa074ba407857c98b5fd7ef97fe6f1f235e04a Mon Sep 17 00:00:00 2001 From: Krzysztof Rodak Date: Thu, 5 Mar 2026 22:01:18 +0800 Subject: [PATCH 1/2] BridgeJS: Include properties and release() in declare global class stubs --- .../BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift | 10 ++++++++++ .../BridgeJSLinkTests/EnumNamespace.Global.d.ts | 5 +++++ .../__Snapshots__/BridgeJSLinkTests/MixedModules.d.ts | 1 + .../BridgeJSLinkTests/Namespaces.Global.d.ts | 4 ++++ 4 files changed, 20 insertions(+) diff --git a/Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift b/Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift index af2456f81..fd907e8db 100644 --- a/Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift +++ b/Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift @@ -2947,6 +2947,16 @@ extension BridgeJSLink { "\(method.name)\(renderTSSignatureCallback(method.parameters, method.returnType, method.effects));" printer.write(methodSignature) } + + let sortedProperties = klass.properties.filter { !$0.isStatic }.sorted { + $0.name < $1.name + } + for property in sortedProperties { + let readonly = property.isReadonly ? "readonly " : "" + printer.write("\(readonly)\(property.name): \(property.type.tsType);") + } + + printer.write("release(): void;") } printer.write("}") } diff --git a/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/EnumNamespace.Global.d.ts b/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/EnumNamespace.Global.d.ts index 936ae6b3a..b78f0cecd 100644 --- a/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/EnumNamespace.Global.d.ts +++ b/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/EnumNamespace.Global.d.ts @@ -34,6 +34,7 @@ declare global { class Converter { constructor(); format(value: number): string; + release(): void; } } namespace Networking { @@ -41,6 +42,7 @@ declare global { class HTTPServer { constructor(); call(method: Networking.API.MethodTag): void; + release(): void; } const MethodValues: { readonly Get: 0; @@ -55,6 +57,7 @@ declare global { class TestServer { constructor(); call(method: Networking.APIV2.Internal.SupportedMethodTag): void; + release(): void; } const SupportedMethodValues: { readonly Get: 0; @@ -77,6 +80,8 @@ declare global { class Converter { constructor(); toString(value: number): string; + precision: number; + release(): void; } } } diff --git a/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/MixedModules.d.ts b/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/MixedModules.d.ts index 6f18e53ed..88485232e 100644 --- a/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/MixedModules.d.ts +++ b/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/MixedModules.d.ts @@ -11,6 +11,7 @@ declare global { class GlobalClass { constructor(); greet(): string; + release(): void; } function globalFunction(): string; } diff --git a/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/Namespaces.Global.d.ts b/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/Namespaces.Global.d.ts index 25ac1ac6d..4b7851c3e 100644 --- a/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/Namespaces.Global.d.ts +++ b/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/Namespaces.Global.d.ts @@ -12,6 +12,7 @@ declare global { constructor(); addItem(item: Greeter): void; getItems(): Greeter[]; + release(): void; } } namespace MyModule { @@ -24,6 +25,7 @@ declare global { class Converter { constructor(); toString(value: number): string; + release(): void; } } } @@ -32,9 +34,11 @@ declare global { class Greeter { constructor(name: string); greet(): string; + release(): void; } class UUID { uuidString(): string; + release(): void; } } } From 757f2a07ee434f59466b856ee4d1a72b1f66e40f Mon Sep 17 00:00:00 2001 From: Krzysztof Rodak Date: Thu, 5 Mar 2026 22:21:34 +0800 Subject: [PATCH 2/2] BridgeJS: Add E2E test for instance property access via globalThis --- .../Generated/BridgeJS.swift | 21 +++++++++++++++++++ .../Generated/JavaScript/BridgeJS.json | 12 +++++++++++ .../BridgeJSGlobalTests/GlobalAPITests.swift | 2 ++ Tests/prelude.mjs | 3 +++ 4 files changed, 38 insertions(+) diff --git a/Tests/BridgeJSGlobalTests/Generated/BridgeJS.swift b/Tests/BridgeJSGlobalTests/Generated/BridgeJS.swift index ca9968838..a892720ce 100644 --- a/Tests/BridgeJSGlobalTests/Generated/BridgeJS.swift +++ b/Tests/BridgeJSGlobalTests/Generated/BridgeJS.swift @@ -296,6 +296,27 @@ public func _bjs_GlobalUtils_PublicConverter_toString(_ _self: UnsafeMutableRawP #endif } +@_expose(wasm, "bjs_GlobalUtils_PublicConverter_precision_get") +@_cdecl("bjs_GlobalUtils_PublicConverter_precision_get") +public func _bjs_GlobalUtils_PublicConverter_precision_get(_ _self: UnsafeMutableRawPointer) -> Int32 { + #if arch(wasm32) + let ret = GlobalUtils.PublicConverter.bridgeJSLiftParameter(_self).precision + return ret.bridgeJSLowerReturn() + #else + fatalError("Only available on WebAssembly") + #endif +} + +@_expose(wasm, "bjs_GlobalUtils_PublicConverter_precision_set") +@_cdecl("bjs_GlobalUtils_PublicConverter_precision_set") +public func _bjs_GlobalUtils_PublicConverter_precision_set(_ _self: UnsafeMutableRawPointer, _ value: Int32) -> Void { + #if arch(wasm32) + GlobalUtils.PublicConverter.bridgeJSLiftParameter(_self).precision = Int.bridgeJSLiftParameter(value) + #else + fatalError("Only available on WebAssembly") + #endif +} + @_expose(wasm, "bjs_GlobalUtils_PublicConverter_deinit") @_cdecl("bjs_GlobalUtils_PublicConverter_deinit") public func _bjs_GlobalUtils_PublicConverter_deinit(_ pointer: UnsafeMutableRawPointer) -> Void { diff --git a/Tests/BridgeJSGlobalTests/Generated/JavaScript/BridgeJS.json b/Tests/BridgeJSGlobalTests/Generated/JavaScript/BridgeJS.json index 2eeb8ed2d..9403e3b0c 100644 --- a/Tests/BridgeJSGlobalTests/Generated/JavaScript/BridgeJS.json +++ b/Tests/BridgeJSGlobalTests/Generated/JavaScript/BridgeJS.json @@ -156,7 +156,19 @@ "GlobalUtils" ], "properties" : [ + { + "isReadonly" : false, + "isStatic" : false, + "name" : "precision", + "namespace" : [ + "GlobalUtils" + ], + "type" : { + "int" : { + } + } + } ], "swiftCallName" : "GlobalUtils.PublicConverter" } diff --git a/Tests/BridgeJSGlobalTests/GlobalAPITests.swift b/Tests/BridgeJSGlobalTests/GlobalAPITests.swift index 19087ff55..9bdb5c5e9 100644 --- a/Tests/BridgeJSGlobalTests/GlobalAPITests.swift +++ b/Tests/BridgeJSGlobalTests/GlobalAPITests.swift @@ -63,6 +63,8 @@ enum Internal { @JS enum GlobalUtils { @JS class PublicConverter { + @JS var precision: Int = 2 + @JS init() {} @JS func toString(value: Int) -> String { diff --git a/Tests/prelude.mjs b/Tests/prelude.mjs index 3aeb10a8b..0170da3bc 100644 --- a/Tests/prelude.mjs +++ b/Tests/prelude.mjs @@ -1032,6 +1032,9 @@ function BridgeJSGlobalTests_runJsWorksGlobal() { const globalConverter = new globalThis.GlobalUtils.PublicConverter(); assert.equal(globalConverter.toString(99), "99"); + assert.equal(globalConverter.precision, 2); + globalConverter.precision = 5; + assert.equal(globalConverter.precision, 5); globalConverter.release(); const globalHttpServer = new globalThis.GlobalNetworking.API.TestHTTPServer();