1
1
#!/usr/bin/env node
2
-
3
2
const { program } = require ( 'commander' )
4
- const { execSync } = require ( 'child_process' )
5
- const fs = require ( "fs" )
6
- const path = require ( "path" )
7
- const yaml = require ( 'js-yaml' )
8
- const { Worker } = require ( 'worker_threads' )
9
-
10
- var outputDir
11
- var outputPackage
12
- var packageSet = new Set ( )
13
-
14
- function mkdirs ( dirname ) {
15
- if ( fs . existsSync ( dirname ) ) {
16
- return true
17
- } else {
18
- if ( mkdirs ( path . dirname ( dirname ) ) ) {
19
- fs . mkdirSync ( dirname )
20
- return true
21
- }
22
- }
23
- }
24
-
25
- function recFindByExt ( base , ext , files , result ) {
26
- if ( ! fs . statSync ( base ) . isDirectory ( ) ) {
27
- if ( base . substr ( - 1 * ( ext . length + 1 ) ) == '.' + ext ) {
28
- return [ base ]
29
- }
30
- return [ ]
31
- }
32
- files = files || fs . readdirSync ( base )
33
- result = result || [ ]
34
-
35
- files . forEach (
36
- function ( file ) {
37
- var newbase = path . join ( base , file )
38
- if ( fs . statSync ( newbase ) . isDirectory ( ) ) {
39
- result = recFindByExt ( newbase , ext , fs . readdirSync ( newbase ) , result )
40
- } else {
41
- if ( file . substr ( - 1 * ( ext . length + 1 ) ) == '.' + ext ) {
42
- result . push ( newbase )
43
- }
44
- }
45
- }
46
- )
47
- return result
48
- }
49
-
50
- function writeOutputToFileByPath ( result , srcPath ) {
51
- var srcFile = srcPath . substr ( srcPath . lastIndexOf ( '/' ) + 1 )
52
- var dartFile = srcFile . substring ( 0 , srcFile . indexOf ( '.' ) ) . toLowerCase ( ) + '.dart'
53
- var outputFile = outputDir ? path . join ( outputDir , dartFile ) : dartFile
54
- fs . writeFileSync ( outputFile , result )
55
- }
56
-
57
- function formatDartFile ( dartPath ) {
58
- var command = 'flutter format ' + path . dirname ( dartPath )
59
- execSync ( command , { stdio : 'inherit' } )
60
- }
61
-
62
- function createFlutterPackage ( packageName ) {
63
- var command = 'flutter create --template=package ' + packageName
64
- execSync ( command , { stdio : 'inherit' } )
65
- }
66
-
67
- function writeDependencyToPubSpec ( filePath ) {
68
- var doc = yaml . safeLoad ( fs . readFileSync ( filePath , 'utf8' ) ) ;
69
- packageSet . forEach ( item => {
70
- if ( typeof ( item ) == "undefined" ) {
71
- return
72
- }
73
- item = item . toLowerCase ( )
74
- doc . dependencies [ item ] = 'any'
75
- } )
76
- fs . writeFileSync ( filePath , yaml . safeDump ( doc ) . replace ( / n u l l / g, '' ) )
77
- }
78
-
79
- function generateDartWithWorker ( path , script ) {
80
- return new Promise ( ( resolve , reject ) => {
81
- const worker = new Worker ( script , {
82
- workerData : { path : path } ,
83
- resourceLimits : { maxOldGenerationSizeMb : 8 * 1024 }
84
- } ) ;
85
- worker . on ( "message" , resolve ) ;
86
- worker . on ( "error" , reject ) ;
87
- } ) ;
88
- } ;
89
-
90
- async function runWorkItems ( workItems ) {
91
- const promises = Object . keys ( workItems ) . map ( ( path ) => {
92
- let script = workItems [ path ]
93
- return generateDartWithWorker ( path , script ) . then ( ( msg ) => {
94
- if ( msg . error ) {
95
- console . log ( 'filePath:' + msg . path + '\nerror:' + msg . error )
96
- }
97
- let result = msg . result
98
- if ( ! result ) {
99
- return
100
- }
101
- writeOutputToFileByPath ( result . dartCode , msg . path )
102
-
103
- if ( outputPackage ) {
104
- result . packages . forEach ( item => packageSet . add ( item ) )
105
- }
106
- } )
107
- } )
108
- await Promise . all ( promises )
109
- }
3
+ const main = require ( '../lib/main' ) . main
110
4
111
5
program . version ( '1.0.2' )
112
6
@@ -116,61 +10,6 @@ program
116
10
. option ( '-o, --output <output>' , 'Output directory' )
117
11
. option ( '-p, --package <package>' , 'Generate a shareable Flutter project containing modular Dart code.' )
118
12
. description ( 'Generate dart code from native API.' )
119
- . action ( async function ( input , options ) {
120
- language = options . language
121
- if ( ! language ) {
122
- language = 'auto'
123
- }
124
-
125
- var extMap = { 'objc' : [ 'h' ] , 'java' : [ 'java' ] , 'auto' : [ 'h' , 'java' ] }
126
- var extArray = extMap [ language ]
127
-
128
- outputDir = options . output
129
- if ( ! outputDir ) {
130
- outputDir = process . cwd ( )
131
- }
132
- mkdirs ( outputDir )
133
-
134
- outputPackage = options . package
135
- if ( outputPackage ) {
136
- outputDir = path . join ( outputDir , outputPackage )
137
- createFlutterPackage ( outputDir )
138
- outputDir = path . join ( outputDir , 'lib' )
139
- }
140
-
141
- console . log ( 'Output Dir: ' + outputDir )
142
-
143
- var baseOutputDir = outputDir
144
-
145
- const langForExtension = { 'h' : 'objc' , 'java' : 'java' }
146
- // TODO: handle java here
147
- const scriptForExtension = { 'h' : path . join ( __dirname , '../lib/objc/DNObjectiveCConverter.js' ) }
148
-
149
- var workItems = new Map ( )
150
- extArray . forEach ( ( ext ) => {
151
- let files = recFindByExt ( input , ext )
152
- let script = scriptForExtension [ ext ]
153
- if ( files . length == 0 || ! script ) {
154
- return
155
- }
156
-
157
- outputDir = path . join ( baseOutputDir , langForExtension [ ext ] )
158
- mkdirs ( outputDir )
159
-
160
- files . forEach ( ( file ) => {
161
- workItems [ file ] = script ;
162
- } )
163
- } )
164
- await runWorkItems ( workItems )
165
-
166
- outputDir = baseOutputDir
167
- formatDartFile ( outputDir )
168
-
169
- if ( outputPackage ) {
170
- var filePath = path . join ( path . join ( options . output , outputPackage ) , 'pubspec.yaml' )
171
- writeDependencyToPubSpec ( filePath )
172
- }
173
- console . log ( 'codegen finished' )
174
- } )
13
+ . action ( main )
175
14
176
15
program . parse ( process . argv )
0 commit comments