|
1 | 1 | @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) |
2 | 13 | import PackagePlugin |
3 | 14 |
|
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 | + ) |
22 | 23 | } |
| 24 | +} |
23 | 25 |
|
| 26 | +@main |
| 27 | +struct PackageToJS: CommandPlugin { |
24 | 28 | struct BuildOptions { |
25 | 29 | /// Product to build (default: executable target if there's only one) |
26 | 30 | var product: String? |
27 | 31 | /// Whether to split debug information into a separate file (default: false) |
28 | 32 | var splitDebug: Bool |
29 | | - var options: Options |
| 33 | + var options: PackageToJSOptions |
30 | 34 |
|
31 | 35 | static func parse(from extractor: inout ArgumentExtractor) -> BuildOptions { |
32 | 36 | let product = extractor.extractOption(named: "product").last |
@@ -71,7 +75,7 @@ struct PackageToJS: CommandPlugin { |
71 | 75 | var testLibrary: String? |
72 | 76 | var filter: [String] |
73 | 77 |
|
74 | | - var options: Options |
| 78 | + var options: PackageToJSOptions |
75 | 79 |
|
76 | 80 | static func parse(from extractor: inout ArgumentExtractor) -> TestOptions { |
77 | 81 | let buildOnly = extractor.extractFlag(named: "build-only") |
@@ -315,7 +319,7 @@ struct PackageToJS: CommandPlugin { |
315 | 319 | } |
316 | 320 | } |
317 | 321 |
|
318 | | - private func buildWasm(productName: String, context: PluginContext, options: Options) throws |
| 322 | + private func buildWasm(productName: String, context: PluginContext, options: PackageToJSOptions) throws |
319 | 323 | -> PackageManager.BuildResult |
320 | 324 | { |
321 | 325 | var parameters = PackageManager.BuildParameters( |
@@ -414,6 +418,25 @@ private func findPackageInDependencies(package: Package, id: Package.ID) -> Pack |
414 | 418 | return visit(package: package) |
415 | 419 | } |
416 | 420 |
|
| 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 | + |
417 | 440 | private func printStderr(_ message: String) { |
418 | 441 | fputs(message + "\n", stderr) |
419 | 442 | } |
|
0 commit comments