@@ -12,10 +12,12 @@ struct BridgeJSCommandPlugin: CommandPlugin {
1212
1313 struct Options {
1414 var targets : [ String ]
15+ var verbose : Bool
1516
1617 static func parse( extractor: inout ArgumentExtractor ) -> Options {
1718 let targets = extractor. extractOption ( named: " target " )
18- return Options ( targets: targets)
19+ let verbose = extractor. extractFlag ( named: " verbose " )
20+ return Options ( targets: targets, verbose: verbose != 0 )
1921 }
2022
2123 static func help( ) -> String {
@@ -29,13 +31,13 @@ struct BridgeJSCommandPlugin: CommandPlugin {
2931 OPTIONS:
3032 --target <target> Specify target(s) to generate bridge code for. If omitted,
3133 generates for all targets with JavaScriptKit dependency.
34+ --verbose Print verbose output.
3235 """
3336 }
3437 }
3538
3639 func performCommand( context: PluginContext , arguments: [ String ] ) throws {
3740 // Check for help flags to display usage information
38- // This allows users to run `swift package plugin bridge-js --help` to understand the plugin's functionality
3941 if arguments. contains ( where: { [ " -h " , " --help " ] . contains ( $0) } ) {
4042 printStderr ( Options . help ( ) )
4143 return
@@ -45,83 +47,103 @@ struct BridgeJSCommandPlugin: CommandPlugin {
4547 let options = Options . parse ( extractor: & extractor)
4648 let remainingArguments = extractor. remainingArguments
4749
50+ let context = Context ( options: options, context: context)
51+
4852 if options. targets. isEmpty {
49- try runOnTargets (
50- context: context,
53+ try context. runOnTargets (
5154 remainingArguments: remainingArguments,
5255 where: { target in
5356 target. hasDependency ( named: Self . JAVASCRIPTKIT_PACKAGE_NAME)
5457 }
5558 )
5659 } else {
57- try runOnTargets (
58- context: context,
60+ try context. runOnTargets (
5961 remainingArguments: remainingArguments,
6062 where: { options. targets. contains ( $0. name) }
6163 )
6264 }
6365 }
6466
65- private func runOnTargets(
66- context: PluginContext ,
67+ struct Context {
68+ let options : Options
69+ let context : PluginContext
70+ }
71+ }
72+
73+ extension BridgeJSCommandPlugin . Context {
74+ func runOnTargets(
6775 remainingArguments: [ String ] ,
6876 where predicate: ( SwiftSourceModuleTarget ) -> Bool
6977 ) throws {
7078 for target in context. package . targets {
7179 guard let target = target as? SwiftSourceModuleTarget else {
7280 continue
7381 }
82+ let configFilePath = target. directoryURL. appending ( path: " bridge-js.config.json " )
83+ if !FileManager. default. fileExists ( atPath: configFilePath. path) {
84+ printVerbose ( " No bridge-js.config.json found for \( target. name) , skipping... " )
85+ continue
86+ }
7487 guard predicate ( target) else {
7588 continue
7689 }
77- try runSingleTarget ( context : context , target: target, remainingArguments: remainingArguments)
90+ try runSingleTarget ( target: target, remainingArguments: remainingArguments)
7891 }
7992 }
8093
8194 private func runSingleTarget(
82- context: PluginContext ,
8395 target: SwiftSourceModuleTarget ,
8496 remainingArguments: [ String ]
8597 ) throws {
86- Diagnostics . progress ( " Exporting Swift API for \( target. name) ... " )
98+ printStderr ( " Generating bridge code for \( target. name) ... " )
99+
100+ printVerbose ( " Exporting Swift API for \( target. name) ... " )
87101
88102 let generatedDirectory = target. directoryURL. appending ( path: " Generated " )
89103 let generatedJavaScriptDirectory = generatedDirectory. appending ( path: " JavaScript " )
90104
91105 try runBridgeJSTool (
92- context: context,
93106 arguments: [
94107 " export " ,
95108 " --output-skeleton " ,
96109 generatedJavaScriptDirectory. appending ( path: " ExportSwift.json " ) . path,
97110 " --output-swift " ,
98111 generatedDirectory. appending ( path: " ExportSwift.swift " ) . path,
112+ " --verbose " ,
113+ options. verbose ? " true " : " false " ,
99114 ]
100115 + target. sourceFiles. filter {
101116 !$0. url. path. hasPrefix ( generatedDirectory. path + " / " )
102117 } . map ( \. url. path) + remainingArguments
103118 )
104119
105- try runBridgeJSTool (
106- context: context,
107- arguments: [
108- " import " ,
109- " --output-skeleton " ,
110- generatedJavaScriptDirectory. appending ( path: " ImportTS.json " ) . path,
111- " --output-swift " ,
112- generatedDirectory. appending ( path: " ImportTS.swift " ) . path,
113- " --module-name " ,
114- target. name,
115- " --project " ,
116- context. package . directoryURL. appending ( path: " tsconfig.json " ) . path,
117- target. directoryURL. appending ( path: " bridge.d.ts " ) . path,
118- ] + remainingArguments
119- )
120+ printVerbose ( " Importing TypeScript API for \( target. name) ... " )
121+
122+ let bridgeDtsPath = target. directoryURL. appending ( path: " bridge-js.d.ts " )
123+ // Execute import only if bridge-js.d.ts exists
124+ if FileManager . default. fileExists ( atPath: bridgeDtsPath. path) {
125+ try runBridgeJSTool (
126+ arguments: [
127+ " import " ,
128+ " --output-skeleton " ,
129+ generatedJavaScriptDirectory. appending ( path: " ImportTS.json " ) . path,
130+ " --output-swift " ,
131+ generatedDirectory. appending ( path: " ImportTS.swift " ) . path,
132+ " --verbose " ,
133+ options. verbose ? " true " : " false " ,
134+ " --module-name " ,
135+ target. name,
136+ " --project " ,
137+ context. package . directoryURL. appending ( path: " tsconfig.json " ) . path,
138+ bridgeDtsPath. path,
139+ ] + remainingArguments
140+ )
141+ }
120142 }
121143
122- private func runBridgeJSTool( context : PluginContext , arguments: [ String ] ) throws {
144+ private func runBridgeJSTool( arguments: [ String ] ) throws {
123145 let tool = try context. tool ( named: " BridgeJSTool " ) . url
124- printStderr ( " $ \( tool. path) \( arguments. joined ( separator: " " ) ) " )
146+ printVerbose ( " $ \( tool. path) \( arguments. joined ( separator: " " ) ) " )
125147 let process = Process ( )
126148 process. executableURL = tool
127149 process. arguments = arguments
@@ -133,6 +155,12 @@ struct BridgeJSCommandPlugin: CommandPlugin {
133155 exit ( process. terminationStatus)
134156 }
135157 }
158+
159+ private func printVerbose( _ message: String ) {
160+ if options. verbose {
161+ printStderr ( message)
162+ }
163+ }
136164}
137165
138166private func printStderr( _ message: String ) {
0 commit comments