Skip to content

Commit 112fcc1

Browse files
Add test suite to the PackageToJS plugin
1 parent b16af28 commit 112fcc1

File tree

6 files changed

+77
-34
lines changed

6 files changed

+77
-34
lines changed

Package.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ let package = Package(
7676
name: "PackageToJS",
7777
capability: .command(
7878
intent: .custom(verb: "js", description: "Convert a Swift package to a JavaScript package")
79-
)
79+
),
80+
sources: ["Sources"]
8081
),
8182
]
8283
)

Plugins/PackageToJS/Package.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// swift-tools-version: 6.0
2+
3+
import PackageDescription
4+
5+
let package = Package(
6+
name: "PackageToJS",
7+
targets: [
8+
.target(name: "PackageToJS"),
9+
.testTarget(name: "PackageToJSTests", dependencies: ["PackageToJS"]),
10+
]
11+
)

Plugins/PackageToJS/PackageToJS.swift renamed to Plugins/PackageToJS/Sources/PackageToJS.swift

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,36 @@
11
@preconcurrency import Foundation // For "stderr"
2+
3+
struct PackageToJSOptions {
4+
/// Path to the output directory
5+
var outputPath: String?
6+
/// Name of the package (default: lowercased Package.swift name)
7+
var packageName: String?
8+
/// Whether to explain the build plan
9+
var explain: Bool = false
10+
}
11+
12+
#if canImport(PackagePlugin)
213
import PackagePlugin
314

4-
@main
5-
struct PackageToJS: CommandPlugin {
6-
struct Options {
7-
/// Path to the output directory
8-
var outputPath: String?
9-
/// Name of the package (default: lowercased Package.swift name)
10-
var packageName: String?
11-
/// Whether to explain the build plan
12-
var explain: Bool = false
13-
14-
static func parse(from extractor: inout ArgumentExtractor) -> Options {
15-
let outputPath = extractor.extractOption(named: "output").last
16-
let packageName = extractor.extractOption(named: "package-name").last
17-
let explain = extractor.extractFlag(named: "explain")
18-
return Options(
19-
outputPath: outputPath, packageName: packageName, explain: explain != 0
20-
)
21-
}
15+
extension PackageToJSOptions {
16+
static func parse(from extractor: inout ArgumentExtractor) -> PackageToJSOptions {
17+
let outputPath = extractor.extractOption(named: "output").last
18+
let packageName = extractor.extractOption(named: "package-name").last
19+
let explain = extractor.extractFlag(named: "explain")
20+
return PackageToJSOptions(
21+
outputPath: outputPath, packageName: packageName, explain: explain != 0
22+
)
2223
}
24+
}
2325

26+
@main
27+
struct PackageToJS: CommandPlugin {
2428
struct BuildOptions {
2529
/// Product to build (default: executable target if there's only one)
2630
var product: String?
2731
/// Whether to split debug information into a separate file (default: false)
2832
var splitDebug: Bool
29-
var options: Options
33+
var options: PackageToJSOptions
3034

3135
static func parse(from extractor: inout ArgumentExtractor) -> BuildOptions {
3236
let product = extractor.extractOption(named: "product").last
@@ -71,7 +75,7 @@ struct PackageToJS: CommandPlugin {
7175
var testLibrary: String?
7276
var filter: [String]
7377

74-
var options: Options
78+
var options: PackageToJSOptions
7579

7680
static func parse(from extractor: inout ArgumentExtractor) -> TestOptions {
7781
let buildOnly = extractor.extractFlag(named: "build-only")
@@ -315,7 +319,7 @@ struct PackageToJS: CommandPlugin {
315319
}
316320
}
317321

318-
private func buildWasm(productName: String, context: PluginContext, options: Options) throws
322+
private func buildWasm(productName: String, context: PluginContext, options: PackageToJSOptions) throws
319323
-> PackageManager.BuildResult
320324
{
321325
var parameters = PackageManager.BuildParameters(
@@ -414,6 +418,25 @@ private func findPackageInDependencies(package: Package, id: Package.ID) -> Pack
414418
return visit(package: package)
415419
}
416420

421+
extension PackagingPlanner {
422+
init(
423+
options: PackageToJSOptions,
424+
context: PluginContext,
425+
selfPackage: Package,
426+
outputDir: URL
427+
) {
428+
self.init(
429+
options: options,
430+
packageId: context.package.id,
431+
pluginWorkDirectoryURL: context.pluginWorkDirectoryURL,
432+
selfPackageDir: selfPackage.directoryURL,
433+
outputDir: outputDir
434+
)
435+
}
436+
}
437+
438+
#endif
439+
417440
private func printStderr(_ message: String) {
418441
fputs(message + "\n", stderr)
419442
}

Plugins/PackageToJS/PackagingPlanner.swift renamed to Plugins/PackageToJS/Sources/PackagingPlanner.swift

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import Foundation
2-
import PackagePlugin
32

43
/// Plans the build for packaging.
54
struct PackagingPlanner {
65
/// The options of the plugin
7-
let options: PackageToJS.Options
8-
/// The context of the plugin
9-
let context: PluginContext
10-
/// The package that contains this plugin
11-
let selfPackage: Package
6+
let options: PackageToJSOptions
7+
/// The package ID of the package that this plugin is running on
8+
let packageId: String
9+
/// The directory of the package that contains this plugin
10+
let selfPackageDir: URL
1211
/// The path of this file itself, used to capture changes of planner code
1312
let selfPath: String
1413
/// The directory for the final output
@@ -19,14 +18,17 @@ struct PackagingPlanner {
1918
let wasmFilename = "main.wasm"
2019

2120
init(
22-
options: PackageToJS.Options, context: PluginContext, selfPackage: Package,
21+
options: PackageToJSOptions,
22+
packageId: String,
23+
pluginWorkDirectoryURL: URL,
24+
selfPackageDir: URL,
2325
outputDir: URL
2426
) {
2527
self.options = options
26-
self.context = context
27-
self.selfPackage = selfPackage
28+
self.packageId = packageId
29+
self.selfPackageDir = selfPackageDir
2830
self.outputDir = outputDir
29-
self.intermediatesDir = context.pluginWorkDirectoryURL.appending(path: outputDir.lastPathComponent + ".tmp")
31+
self.intermediatesDir = pluginWorkDirectoryURL.appending(path: outputDir.lastPathComponent + ".tmp")
3032
self.selfPath = String(#filePath)
3133
}
3234

@@ -150,7 +152,7 @@ struct PackagingPlanner {
150152
) {
151153
let packageJSON = """
152154
{
153-
"name": "\(options.packageName ?? context.package.id.lowercased())",
155+
"name": "\(options.packageName ?? packageId.lowercased())",
154156
"version": "0.0.0",
155157
"type": "module",
156158
"exports": {
@@ -224,7 +226,7 @@ struct PackagingPlanner {
224226
outputDirTask: MiniMake.TaskKey,
225227
inputs: [MiniMake.TaskKey]
226228
) -> MiniMake.TaskKey {
227-
let inputPath = selfPackage.directoryURL.appending(path: file)
229+
let inputPath = selfPackageDir.appending(path: file)
228230
let substitutions = [
229231
"@PACKAGE_TO_JS_MODULE_PATH@": wasmFilename
230232
]
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import Testing
2+
@testable import PackageToJS
3+
4+
@Test func example() async throws {
5+
// Write your test here and use APIs like `#expect(...)` to check expected conditions.
6+
}

0 commit comments

Comments
 (0)