|
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