From de9e8a07252f4c2a8c1f290c7585f0cf67612e14 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Mon, 27 Oct 2025 10:04:51 +0100 Subject: [PATCH 1/4] Implement onPageLoad for playwright --- .../PlaywrightOnPageLoadTest/README.md | 156 ++++++++++++++++++ .../SwiftTesting/Package.swift | 17 ++ .../SwiftTesting/Tests/CheckTests.swift | 25 +++ .../XCTest/Package.swift | 17 ++ .../XCTest/Tests/CheckTests.swift | 41 +++++ .../PlaywrightOnPageLoadTest/expose.js | 49 ++++++ Plugins/PackageToJS/Sources/PackageToJS.swift | 10 ++ .../Sources/PackageToJSPlugin.swift | 3 + Plugins/PackageToJS/Templates/bin/test.js | 43 ++++- Plugins/PackageToJS/Templates/test.d.ts | 18 ++ Plugins/PackageToJS/Templates/test.js | 7 +- Plugins/PackageToJS/Tests/ExampleTests.swift | 53 ++++++ 12 files changed, 436 insertions(+), 3 deletions(-) create mode 100644 Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/README.md create mode 100644 Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/SwiftTesting/Package.swift create mode 100644 Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/SwiftTesting/Tests/CheckTests.swift create mode 100644 Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/XCTest/Package.swift create mode 100644 Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/XCTest/Tests/CheckTests.swift create mode 100644 Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/expose.js diff --git a/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/README.md b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/README.md new file mode 100644 index 00000000..3266c0c3 --- /dev/null +++ b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/README.md @@ -0,0 +1,156 @@ +# Playwright OnPageLoad Test + +This example demonstrates how to expose JavaScript functions to your Swift/WebAssembly tests using Playwright's `page.exposeFunction` API. + +## How it works + +1. **Expose Script**: A JavaScript file that exports functions to be exposed in the browser context +2. **Swift Tests**: Call these exposed functions using JavaScriptKit's `JSObject.global` API +3. **Test Runner**: The `--playwright-expose` flag loads the script and exposes the functions before running tests + +## Usage + +### Define exposed functions in a JavaScript file + +**Important:** All functions exposed via Playwright's `page.exposeFunction` are async from the browser's perspective, meaning they always return Promises. Define them as `async` for clarity. + +#### Option 1: Function with Page Access (Recommended) + +Export a function that receives the Playwright `page` object. This allows your exposed functions to interact with the browser page: + +```javascript +/** + * @param {import('playwright').Page} page - The Playwright Page object + */ +export async function exposedFunctions(page) { + return { + expectToBeTrue: async () => { + return true; + }, + + // Use the page object to interact with the browser + getTitle: async () => { + return await page.title(); + }, + + clickButton: async (selector) => { + await page.click(selector); + return true; + }, + + evaluate: async (script) => { + return await page.evaluate(script); + }, + + screenshot: async () => { + const buffer = await page.screenshot(); + return buffer.toString('base64'); + } + }; +} +``` + +#### Option 2: Static Object (Simple Cases) + +For simple functions that don't need page access: + +```javascript +export const exposedFunctions = { + expectToBeTrue: async () => { + return true; + }, + + addNumbers: async (a, b) => { + return a + b; + } +}; +``` + +### Use the functions in Swift tests + +```swift +import XCTest +import JavaScriptKit +import JavaScriptEventLoop + +final class CheckTests: XCTestCase { + func testExpectToBeTrue() async throws { + guard let expectToBeTrue = JSObject.global.expectToBeTrue.function + else { return XCTFail("Function expectToBeTrue not found") } + + // Functions exposed via Playwright return Promises + guard let promiseObject = expectToBeTrue().object + else { return XCTFail("expectToBeTrue() did not return an object") } + + guard let promise = JSPromise(promiseObject) + else { return XCTFail("expectToBeTrue() did not return a Promise") } + + let resultValue = try await promise.value + guard let result = resultValue.boolean + else { return XCTFail("expectToBeTrue() returned nil") } + + XCTAssertTrue(result) + } +} +``` + +### Run tests with the expose script + +```bash +swift package js test --environment browser --playwright-expose path/to/expose.js +``` + +### Backward Compatibility + +You can also use `--prelude` to define exposed functions, which allows combining WASM setup options (`setupOptions`) and Playwright exposed functions in one file: + +```bash +swift package js test --environment browser --prelude path/to/prelude.js +``` + +However, using `--playwright-expose` is recommended for clarity and separation of concerns. + +## Advanced Usage + +### Access to Page Context + +When you export a function (as shown in Option 1), you receive the Playwright `page` object, which gives you full access to the browser page. This is powerful because you can: + +- **Query the DOM**: `await page.$('selector')` +- **Execute JavaScript**: `await page.evaluate('...')` +- **Take screenshots**: `await page.screenshot()` +- **Navigate**: `await page.goto('...')` +- **Handle events**: `page.on('console', ...)` + +### Async Initialization + +You can perform async initialization before returning your functions: + +```javascript +export async function exposedFunctions(page) { + // Perform async setup + const config = await loadConfiguration(); + + // Navigate to a specific page if needed + await page.goto('http://example.com'); + + return { + expectToBeTrue: async () => true, + + getConfig: async () => config, + + // Function that uses both page and initialization data + checkElement: async (selector) => { + const element = await page.$(selector); + return element !== null; + } + }; +} +``` + +### Best Practices + +1. **Always use `async` functions**: All exposed functions are async from the browser's perspective +2. **Capture `page` in closures**: Functions returned from `exposedFunctions(page)` can access `page` via closure +3. **Handle errors**: Wrap page interactions in try-catch blocks +4. **Return serializable data**: Functions can only return JSON-serializable values diff --git a/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/SwiftTesting/Package.swift b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/SwiftTesting/Package.swift new file mode 100644 index 00000000..84130401 --- /dev/null +++ b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/SwiftTesting/Package.swift @@ -0,0 +1,17 @@ +// swift-tools-version: 6.0 +import PackageDescription + +let package = Package( + name: "Check", + dependencies: [.package(name: "JavaScriptKit", path: "../../../../../")], + targets: [ + .testTarget( + name: "CheckTests", + dependencies: [ + "JavaScriptKit", + .product(name: "JavaScriptEventLoopTestSupport", package: "JavaScriptKit"), + ], + path: "Tests" + ) + ] +) diff --git a/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/SwiftTesting/Tests/CheckTests.swift b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/SwiftTesting/Tests/CheckTests.swift new file mode 100644 index 00000000..e9b2f935 --- /dev/null +++ b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/SwiftTesting/Tests/CheckTests.swift @@ -0,0 +1,25 @@ +import Testing +import JavaScriptKit +import JavaScriptEventLoop + +@Test func expectToBeTrue() async throws { + let expectToBeTrue = try #require(JSObject.global.expectToBeTrue.function) + + // expectToBeTrue returns a Promise, so we need to await it + let promiseObject = try #require(expectToBeTrue.callAsFunction().object) + let promise = try #require(JSPromise(promiseObject)) + + let resultValue = try await promise.value + #expect(resultValue.boolean == true) +} + +@Test func getTitleOfPage() async throws { + let getTitle = try #require(JSObject.global.getTitle.function) + + // getTitle returns a Promise, so we need to await it + let promiseObject = try #require(getTitle.callAsFunction().object) + let promise = try #require(JSPromise(promiseObject)) + + let resultValue = try await promise.value + #expect(resultValue.string == "") +} diff --git a/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/XCTest/Package.swift b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/XCTest/Package.swift new file mode 100644 index 00000000..84130401 --- /dev/null +++ b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/XCTest/Package.swift @@ -0,0 +1,17 @@ +// swift-tools-version: 6.0 +import PackageDescription + +let package = Package( + name: "Check", + dependencies: [.package(name: "JavaScriptKit", path: "../../../../../")], + targets: [ + .testTarget( + name: "CheckTests", + dependencies: [ + "JavaScriptKit", + .product(name: "JavaScriptEventLoopTestSupport", package: "JavaScriptKit"), + ], + path: "Tests" + ) + ] +) diff --git a/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/XCTest/Tests/CheckTests.swift b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/XCTest/Tests/CheckTests.swift new file mode 100644 index 00000000..49d0a741 --- /dev/null +++ b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/XCTest/Tests/CheckTests.swift @@ -0,0 +1,41 @@ +import XCTest +import JavaScriptKit +import JavaScriptEventLoop + +final class CheckTests: XCTestCase { + func testExpectToBeTrue() async throws { + guard let expectToBeTrue = JSObject.global.expectToBeTrue.function + else { return XCTFail("Function expectToBeTrue not found") } + + // expectToBeTrue returns a Promise, so we need to await it + guard let promiseObject = expectToBeTrue().object + else { return XCTFail("expectToBeTrue() did not return an object") } + + guard let promise = JSPromise(promiseObject) + else { return XCTFail("expectToBeTrue() did not return a Promise") } + + let resultValue = try await promise.value + guard let result = resultValue.boolean + else { return XCTFail("expectToBeTrue() returned nil") } + + XCTAssertTrue(result) + } + + func testTileOfPage() async throws { + guard let getTitle = JSObject.global.getTitle.function + else { return XCTFail("Function getTitle not found") } + + // getTitle returns a Promise, so we need to await it + guard let promiseObject = getTitle().object + else { return XCTFail("getTitle() did not return an object") } + + guard let promise = JSPromise(promiseObject) + else { return XCTFail("expectToBeTrue() did not return a Promise") } + + let resultValue = try await promise.value + guard let title = resultValue.string + else { return XCTFail("expectToBeTrue() returned nil") } + + XCTAssertTrue(title == "") + } +} diff --git a/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/expose.js b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/expose.js new file mode 100644 index 00000000..22f760a1 --- /dev/null +++ b/Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/expose.js @@ -0,0 +1,49 @@ +/** + * Playwright exposed functions for PlaywrightOnPageLoadTest + * These functions will be exposed to the browser context and available as global functions + * in the WASM environment (accessible via JSObject.global) + * + * IMPORTANT: All exposed functions are async from the browser's perspective. + * Playwright's page.exposeFunction automatically wraps them to return Promises. + * Therefore, you must use JSPromise to await them in Swift. + */ + +/** + * Export a function that receives the Playwright Page object and returns the exposed functions. + * This allows your functions to interact with the page (click, query DOM, etc.) + * + * @param {import('playwright').Page} page - The Playwright Page object + * @returns {Object} An object mapping function names to async functions + */ +export async function exposedFunctions(page) { + return { + expectToBeTrue: async () => { + return true; + }, + + getTitle: async () => { + return await page.title(); + }, + + // clickButton: async (selector) => { + // await page.click(selector); + // return true; + // }, + + // screenshot: async () => { + // const buffer = await page.screenshot(); + // return buffer.toString('base64'); + // } + }; +} + +/** + * Alternative: Export a static object if you don't need page access + * (Note: This approach doesn't have access to the page object) + */ +// export const exposedFunctions = { +// expectToBeTrue: async () => { +// return true; +// }, +// addNumbers: async (a, b) => a + b, +// }; diff --git a/Plugins/PackageToJS/Sources/PackageToJS.swift b/Plugins/PackageToJS/Sources/PackageToJS.swift index cec51cfb..ec984043 100644 --- a/Plugins/PackageToJS/Sources/PackageToJS.swift +++ b/Plugins/PackageToJS/Sources/PackageToJS.swift @@ -58,6 +58,8 @@ struct PackageToJS { var environment: String? /// Whether to run tests in the browser with inspector enabled var inspect: Bool + /// The script defining Playwright exposed functions + var playwrightExpose: String? /// The extra arguments to pass to node var extraNodeArguments: [String] /// The options for packaging @@ -89,6 +91,14 @@ struct PackageToJS { testJsArguments.append("--prelude") testJsArguments.append(preludeURL.path) } + if let playwrightExpose = testOptions.playwrightExpose { + let playwrightExposeURL = URL( + fileURLWithPath: playwrightExpose, + relativeTo: URL(fileURLWithPath: FileManager.default.currentDirectoryPath) + ) + testJsArguments.append("--playwright-expose") + testJsArguments.append(playwrightExposeURL.path) + } if let environment = testOptions.environment { testJsArguments.append("--environment") testJsArguments.append(environment) diff --git a/Plugins/PackageToJS/Sources/PackageToJSPlugin.swift b/Plugins/PackageToJS/Sources/PackageToJSPlugin.swift index 9a35322f..709dc8f3 100644 --- a/Plugins/PackageToJS/Sources/PackageToJSPlugin.swift +++ b/Plugins/PackageToJS/Sources/PackageToJSPlugin.swift @@ -551,6 +551,7 @@ extension PackageToJS.TestOptions { let prelude = extractor.extractOption(named: "prelude").last let environment = extractor.extractOption(named: "environment").last let inspect = extractor.extractFlag(named: "inspect") + let playwrightExpose = extractor.extractOption(named: "playwright-expose").last let extraNodeArguments = extractor.extractSingleDashOption(named: "Xnode") let packageOptions = try PackageToJS.PackageOptions.parse(from: &extractor) var options = PackageToJS.TestOptions( @@ -560,6 +561,7 @@ extension PackageToJS.TestOptions { prelude: prelude, environment: environment, inspect: inspect != 0, + playwrightExpose: playwrightExpose, extraNodeArguments: extraNodeArguments, packageOptions: packageOptions ) @@ -582,6 +584,7 @@ extension PackageToJS.TestOptions { --prelude Path to the prelude script --environment The environment to use for the tests (values: node, browser; default: node) --inspect Whether to run tests in the browser with inspector enabled + --playwright-expose Path to script defining Playwright exposed functions -Xnode Extra arguments to pass to Node.js \(PackageToJS.PackageOptions.optionsHelp()) diff --git a/Plugins/PackageToJS/Templates/bin/test.js b/Plugins/PackageToJS/Templates/bin/test.js index e7444e90..1d48b685 100644 --- a/Plugins/PackageToJS/Templates/bin/test.js +++ b/Plugins/PackageToJS/Templates/bin/test.js @@ -33,6 +33,7 @@ const args = parseArgs({ environment: { type: "string" }, inspect: { type: "boolean" }, "coverage-file": { type: "string" }, + "playwright-expose": { type: "string" }, }, }) @@ -95,7 +96,47 @@ Hint: This typically means that a continuation leak occurred. } }, browser: async ({ preludeScript }) => { - process.exit(await testBrowser({ preludeScript, inspect: args.values.inspect, args: testFrameworkArgs })); + let onPageLoad = undefined; + + // Load exposed functions from playwright-expose flag + if (args.values["playwright-expose"]) { + const exposeScript = path.resolve(process.cwd(), args.values["playwright-expose"]); + try { + const exposeModule = await import(exposeScript); + const exposedFunctions = exposeModule.exposedFunctions; + + if (exposedFunctions) { + onPageLoad = async (page) => { + // If exposedFunctions is a function, call it with the page object + // This allows the functions to capture the page in their closure + const functions = typeof exposedFunctions === 'function' + ? await exposedFunctions(page) + : exposedFunctions; + + for (const [name, fn] of Object.entries(functions)) { + // Bind the page context to each function if needed + // The function can optionally use the page from its closure + page.exposeFunction(name, fn); + } + }; + } + } catch (e) { + // If --playwright-expose is specified but file doesn't exist or has no exposedFunctions, that's an error + if (args.values["playwright-expose"]) { + throw e; + } + } + } + + const exitCode = await testBrowser({ + preludeScript, + inspect: args.values.inspect, + args: testFrameworkArgs, + playwright: { + onPageLoad + } + }); + process.exit(exitCode); } } diff --git a/Plugins/PackageToJS/Templates/test.d.ts b/Plugins/PackageToJS/Templates/test.d.ts index 03a064f2..4c6741a7 100644 --- a/Plugins/PackageToJS/Templates/test.d.ts +++ b/Plugins/PackageToJS/Templates/test.d.ts @@ -7,6 +7,23 @@ export type SetupOptionsFn = ( } ) => Promise +/** + * Functions to be exposed to the browser context via Playwright's page.exposeFunction. + * Note: All functions are treated as async from the browser's perspective and will + * return Promises when called from Swift/WebAssembly via JavaScriptKit. + */ +export type ExposedFunctions = Record Promise> + +/** + * A function that receives the Playwright Page object and returns exposed functions. + * This allows the exposed functions to interact with the browser page (click, query DOM, etc.) + * Can also be used for async initialization before returning the functions. + * + * @param page - The Playwright Page object for browser interaction + * @returns An object mapping function names to async functions, or a Promise resolving to such an object + */ +export type ExposedFunctionsFn = (page: import('playwright').Page) => ExposedFunctions | Promise + export function testBrowser( options: { /** Path to the prelude script to be injected before tests run */ @@ -17,6 +34,7 @@ export function testBrowser( playwright?: { browser?: string, launchOptions?: import("playwright").LaunchOptions + onPageLoad?: (page: import("playwright").Page) => Promise } } ): Promise diff --git a/Plugins/PackageToJS/Templates/test.js b/Plugins/PackageToJS/Templates/test.js index 19a1deac..5b709030 100644 --- a/Plugins/PackageToJS/Templates/test.js +++ b/Plugins/PackageToJS/Templates/test.js @@ -99,13 +99,16 @@ Please run the following command to install it: const browser = await playwright[options.playwright?.browser ?? "chromium"].launch(options.playwright?.launchOptions ?? {}); const context = await browser.newContext(); const page = await context.newPage(); - + // Allow the user to customize the page before it's loaded, for defining custom export functions + if (options.playwright?.onPageLoad) { + await options.playwright.onPageLoad(page); + } // Forward console messages in the page to the Node.js console page.on("console", (message) => { console.log(message.text()); }); - + const onExit = new Promise((resolve) => { page.exposeFunction("exitTest", resolve); }); diff --git a/Plugins/PackageToJS/Tests/ExampleTests.swift b/Plugins/PackageToJS/Tests/ExampleTests.swift index e1a103f4..70a0b755 100644 --- a/Plugins/PackageToJS/Tests/ExampleTests.swift +++ b/Plugins/PackageToJS/Tests/ExampleTests.swift @@ -232,6 +232,16 @@ extension Trait where Self == ConditionTrait { } } + /// FIXME: swift-testing uses too much stack space, so we need to increase the stack size for tests using swift-testing. + static var stackSizeLinkerFlags: [String] { + [ + "-Xlinker", "--stack-first", + "-Xlinker", "-z", + "-Xlinker", "stack-size=524288", + "-Xlinker", "--global-base=524288", + ] + } + @Test(.requireSwiftSDK) func basic() throws { let swiftSDKID = try #require(Self.getSwiftSDKID()) @@ -394,4 +404,47 @@ extension Trait where Self == ConditionTrait { } } #endif + + @Test(.requireSwiftSDK) + func playwrightOnPageLoad_XCTest() throws { + let swiftSDKID = try #require(Self.getSwiftSDKID()) + try withPackage( + at: "Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/XCTest", + assertTerminationStatus: { $0 == 0 } + ) { packageDir, runProcess, runSwift in + try runProcess(which("npm"), ["install"], [:]) + try runProcess(which("npx"), ["playwright", "install", "chromium-headless-shell"], [:]) + + try runSwift( + ["package", "--disable-sandbox"] + Self.stackSizeLinkerFlags + [ + "--swift-sdk", swiftSDKID, "js", "test", "--environment", "browser", + "--playwright-expose", "../expose.js", + ], + [:] + ) + } + } + + #if compiler(>=6.1) + // TODO: Remove triple restriction once swift-testing is shipped in p1-threads SDK + @Test(.requireSwiftSDK(triple: "wasm32-unknown-wasi")) + func playwrightOnPageLoad_SwiftTesting() throws { + let swiftSDKID = try #require(Self.getSwiftSDKID()) + try withPackage( + at: "Plugins/PackageToJS/Fixtures/PlaywrightOnPageLoadTest/SwiftTesting", + assertTerminationStatus: { $0 == 0 } + ) { packageDir, runProcess, runSwift in + try runProcess(which("npm"), ["install"], [:]) + try runProcess(which("npx"), ["playwright", "install", "chromium-headless-shell"], [:]) + + try runSwift( + [ + "package", "--disable-sandbox", "--swift-sdk", swiftSDKID, "js", "test", "--environment", "browser", + "--playwright-expose", "../expose.js", + ], + [:] + ) + } + } + #endif } From 623cda09c34f2cc0b544295e73a55fb1513abbf2 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Fri, 7 Nov 2025 21:31:57 +0100 Subject: [PATCH 2/4] Add missing protocols on generated --- .../Sources/Generated/JavaScript/BridgeJS.ImportTS.json | 5 ++++- .../PlayBridgeJS/Generated/JavaScript/BridgeJS.ImportTS.json | 5 ++++- .../Generated/JavaScript/BridgeJS.ImportTS.json | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Benchmarks/Sources/Generated/JavaScript/BridgeJS.ImportTS.json b/Benchmarks/Sources/Generated/JavaScript/BridgeJS.ImportTS.json index 366342bb..c00d1616 100644 --- a/Benchmarks/Sources/Generated/JavaScript/BridgeJS.ImportTS.json +++ b/Benchmarks/Sources/Generated/JavaScript/BridgeJS.ImportTS.json @@ -63,5 +63,8 @@ ] } ], - "moduleName" : "Benchmarks" + "moduleName" : "Benchmarks", + "protocols" : [ + + ] } \ No newline at end of file diff --git a/Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/JavaScript/BridgeJS.ImportTS.json b/Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/JavaScript/BridgeJS.ImportTS.json index f1a567cd..f7362022 100644 --- a/Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/JavaScript/BridgeJS.ImportTS.json +++ b/Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/JavaScript/BridgeJS.ImportTS.json @@ -44,5 +44,8 @@ ] } ], - "moduleName" : "PlayBridgeJS" + "moduleName" : "PlayBridgeJS", + "protocols" : [ + + ] } \ No newline at end of file diff --git a/Tests/BridgeJSRuntimeTests/Generated/JavaScript/BridgeJS.ImportTS.json b/Tests/BridgeJSRuntimeTests/Generated/JavaScript/BridgeJS.ImportTS.json index 82515fec..31ffbcee 100644 --- a/Tests/BridgeJSRuntimeTests/Generated/JavaScript/BridgeJS.ImportTS.json +++ b/Tests/BridgeJSRuntimeTests/Generated/JavaScript/BridgeJS.ImportTS.json @@ -229,5 +229,8 @@ ] } ], - "moduleName" : "BridgeJSRuntimeTests" + "moduleName" : "BridgeJSRuntimeTests", + "protocols" : [ + + ] } \ No newline at end of file From 2619cb54ed56a2f4bb5d4c7a6ec60dcbefa0cf1f Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Sat, 8 Nov 2025 02:10:29 +0000 Subject: [PATCH 3/4] Revert "Add missing protocols on generated" This reverts commit 623cda09c34f2cc0b544295e73a55fb1513abbf2. --- .../Sources/Generated/JavaScript/BridgeJS.ImportTS.json | 5 +---- .../PlayBridgeJS/Generated/JavaScript/BridgeJS.ImportTS.json | 5 +---- .../Generated/JavaScript/BridgeJS.ImportTS.json | 5 +---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/Benchmarks/Sources/Generated/JavaScript/BridgeJS.ImportTS.json b/Benchmarks/Sources/Generated/JavaScript/BridgeJS.ImportTS.json index c00d1616..366342bb 100644 --- a/Benchmarks/Sources/Generated/JavaScript/BridgeJS.ImportTS.json +++ b/Benchmarks/Sources/Generated/JavaScript/BridgeJS.ImportTS.json @@ -63,8 +63,5 @@ ] } ], - "moduleName" : "Benchmarks", - "protocols" : [ - - ] + "moduleName" : "Benchmarks" } \ No newline at end of file diff --git a/Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/JavaScript/BridgeJS.ImportTS.json b/Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/JavaScript/BridgeJS.ImportTS.json index f7362022..f1a567cd 100644 --- a/Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/JavaScript/BridgeJS.ImportTS.json +++ b/Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/JavaScript/BridgeJS.ImportTS.json @@ -44,8 +44,5 @@ ] } ], - "moduleName" : "PlayBridgeJS", - "protocols" : [ - - ] + "moduleName" : "PlayBridgeJS" } \ No newline at end of file diff --git a/Tests/BridgeJSRuntimeTests/Generated/JavaScript/BridgeJS.ImportTS.json b/Tests/BridgeJSRuntimeTests/Generated/JavaScript/BridgeJS.ImportTS.json index 31ffbcee..82515fec 100644 --- a/Tests/BridgeJSRuntimeTests/Generated/JavaScript/BridgeJS.ImportTS.json +++ b/Tests/BridgeJSRuntimeTests/Generated/JavaScript/BridgeJS.ImportTS.json @@ -229,8 +229,5 @@ ] } ], - "moduleName" : "BridgeJSRuntimeTests", - "protocols" : [ - - ] + "moduleName" : "BridgeJSRuntimeTests" } \ No newline at end of file From 6514efb47f476a444f12c504b8903d652efea738 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Sat, 8 Nov 2025 03:32:46 +0000 Subject: [PATCH 4/4] Exclude Tests/TemporaryDirectory from file copying --- Plugins/PackageToJS/Tests/ExampleTests.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Plugins/PackageToJS/Tests/ExampleTests.swift b/Plugins/PackageToJS/Tests/ExampleTests.swift index 70a0b755..e673e663 100644 --- a/Plugins/PackageToJS/Tests/ExampleTests.swift +++ b/Plugins/PackageToJS/Tests/ExampleTests.swift @@ -127,6 +127,7 @@ extension Trait where Self == ConditionTrait { ".vscode", ".build", "node_modules", + "Tests/TemporaryDirectory", ] let enumerator = FileManager.default.enumerator(atPath: repoPath.path)!