Skip to content

Commit 5f1f224

Browse files
Merge pull request #300 from swiftwasm/katei/Xnode
Add `-Xnode` option to pass extra arguments to node
2 parents 6236711 + c4a8bae commit 5f1f224

File tree

3 files changed

+60
-5
lines changed

3 files changed

+60
-5
lines changed

Diff for: Plugins/PackageToJS/Sources/PackageToJS.swift

+9-4
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ struct PackageToJS {
3838
var environment: String?
3939
/// Whether to run tests in the browser with inspector enabled
4040
var inspect: Bool
41+
/// The extra arguments to pass to node
42+
var extraNodeArguments: [String]
4143
/// The options for packaging
4244
var packageOptions: PackageOptions
4345
}
@@ -82,7 +84,8 @@ struct PackageToJS {
8284

8385
try PackageToJS.runSingleTestingLibrary(
8486
testRunner: testRunner, currentDirectoryURL: currentDirectoryURL,
85-
extraArguments: extraArguments
87+
extraArguments: extraArguments,
88+
testOptions: testOptions
8689
)
8790
}
8891
let swiftTestingCoverageFile = outputDir.appending(path: "SwiftTesting.profraw")
@@ -97,7 +100,8 @@ struct PackageToJS {
97100

98101
try PackageToJS.runSingleTestingLibrary(
99102
testRunner: testRunner, currentDirectoryURL: currentDirectoryURL,
100-
extraArguments: extraArguments
103+
extraArguments: extraArguments,
104+
testOptions: testOptions
101105
)
102106
}
103107

@@ -114,10 +118,11 @@ struct PackageToJS {
114118
static func runSingleTestingLibrary(
115119
testRunner: URL,
116120
currentDirectoryURL: URL,
117-
extraArguments: [String]
121+
extraArguments: [String],
122+
testOptions: TestOptions
118123
) throws {
119124
let node = try which("node")
120-
let arguments = ["--experimental-wasi-unstable-preview1", testRunner.path] + extraArguments
125+
let arguments = ["--experimental-wasi-unstable-preview1"] + testOptions.extraNodeArguments + [testRunner.path] + extraArguments
121126
print("Running test...")
122127
logCommandExecution(node.path, arguments)
123128

Diff for: Plugins/PackageToJS/Sources/PackageToJSPlugin.swift

+37-1
Original file line numberDiff line numberDiff line change
@@ -340,10 +340,13 @@ extension PackageToJS.TestOptions {
340340
let prelude = extractor.extractOption(named: "prelude").last
341341
let environment = extractor.extractOption(named: "environment").last
342342
let inspect = extractor.extractFlag(named: "inspect")
343+
let extraNodeArguments = extractor.extractSingleDashOption(named: "Xnode")
343344
let packageOptions = PackageToJS.PackageOptions.parse(from: &extractor)
344345
var options = PackageToJS.TestOptions(
345346
buildOnly: buildOnly != 0, listTests: listTests != 0,
346-
filter: filter, prelude: prelude, environment: environment, inspect: inspect != 0, packageOptions: packageOptions
347+
filter: filter, prelude: prelude, environment: environment, inspect: inspect != 0,
348+
extraNodeArguments: extraNodeArguments,
349+
packageOptions: packageOptions
347350
)
348351

349352
if !options.buildOnly, !options.packageOptions.useCDN {
@@ -379,6 +382,39 @@ extension PackageToJS.TestOptions {
379382

380383
// MARK: - PackagePlugin helpers
381384

385+
extension ArgumentExtractor {
386+
fileprivate mutating func extractSingleDashOption(named name: String) -> [String] {
387+
let parts = remainingArguments.split(separator: "--", maxSplits: 1, omittingEmptySubsequences: false)
388+
var args = Array(parts[0])
389+
let literals = Array(parts.count == 2 ? parts[1] : [])
390+
391+
var values: [String] = []
392+
var idx = 0
393+
while idx < args.count {
394+
var arg = args[idx]
395+
if arg == "-\(name)" {
396+
args.remove(at: idx)
397+
if idx < args.count {
398+
let val = args[idx]
399+
values.append(val)
400+
args.remove(at: idx)
401+
}
402+
}
403+
else if arg.starts(with: "-\(name)=") {
404+
args.remove(at: idx)
405+
arg.removeFirst(2 + name.count)
406+
values.append(arg)
407+
}
408+
else {
409+
idx += 1
410+
}
411+
}
412+
413+
self = ArgumentExtractor(args + literals)
414+
return values
415+
}
416+
}
417+
382418
/// Derive default product from the package
383419
/// - Returns: The name of the product to build
384420
/// - Throws: `PackageToJSError` if there's no executable product or if there's more than one

Diff for: Plugins/PackageToJS/Tests/ExampleTests.swift

+14
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,20 @@ extension Trait where Self == ConditionTrait {
148148
let swiftSDKID = try #require(Self.getSwiftSDKID())
149149
try withPackage(at: "Examples/Testing") { packageDir, runSwift in
150150
try runSwift(["package", "--swift-sdk", swiftSDKID, "js", "test"], [:])
151+
try withTemporaryDirectory(body: { tempDir, _ in
152+
let scriptContent = """
153+
const fs = require('fs');
154+
const path = require('path');
155+
const scriptPath = path.join(__dirname, 'test.txt');
156+
fs.writeFileSync(scriptPath, 'Hello, world!');
157+
"""
158+
try scriptContent.write(to: tempDir.appending(path: "script.js"), atomically: true, encoding: .utf8)
159+
let scriptPath = tempDir.appending(path: "script.js")
160+
try runSwift(["package", "--swift-sdk", swiftSDKID, "js", "test", "-Xnode=--require=\(scriptPath.path)"], [:])
161+
let testPath = tempDir.appending(path: "test.txt")
162+
try #require(FileManager.default.fileExists(atPath: testPath.path), "test.txt should exist")
163+
try #require(try String(contentsOf: testPath, encoding: .utf8) == "Hello, world!", "test.txt should be created by the script")
164+
})
151165
try runSwift(["package", "--swift-sdk", swiftSDKID, "js", "test", "--environment", "browser"], [:])
152166
}
153167
}

0 commit comments

Comments
 (0)