Skip to content

Commit 03532ca

Browse files
authored
Merge pull request #24 from dart-native/feature/refactor_entry
Feature/refactor entry
2 parents 7ffbaa4 + ba7586f commit 03532ca

File tree

3 files changed

+176
-176
lines changed

3 files changed

+176
-176
lines changed

bin/codegen.js

Lines changed: 2 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -1,112 +1,6 @@
11
#!/usr/bin/env node
2-
32
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(/null/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
1104

1115
program.version('1.0.2')
1126

@@ -116,61 +10,6 @@ program
11610
.option('-o, --output <output>', 'Output directory')
11711
.option('-p, --package <package>', 'Generate a shareable Flutter project containing modular Dart code.')
11812
.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)
17514

17615
program.parse(process.argv)

index.js

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,6 @@
1-
let workerScript = './lib/objc/DNObjectiveCConverter'
2-
let dataPath = "./test/objc/RuntimeStub.h"
3-
let main = require(workerScript).main
1+
const main = require('./lib/main').main
42

5-
main(dataPath, callback)
6-
7-
function callback(result, path, error) {
8-
if (result) {
9-
console.log('result:\n' + result.dartCode + '\n\npath:\n' + path)
10-
}
11-
if (error) {
12-
console.log('\nerror:\n' + error)
13-
}
14-
}
3+
let dataPath = "test/objc/RuntimeStub.h"
4+
let option = {output: 'test/dart'}
155

6+
main(dataPath, option)

lib/main.js

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

0 commit comments

Comments
 (0)