@@ -9,7 +9,9 @@ import 'package:code_builder/code_builder.dart' as code;
9
9
import 'package:dart_style/dart_style.dart' ;
10
10
import 'package:path/path.dart' as p;
11
11
import 'package:pub_semver/pub_semver.dart' ;
12
+ import 'package:yaml/yaml.dart' ;
12
13
14
+ import 'config.dart' ;
13
15
import 'generate_bindings.dart' ;
14
16
import 'interop_gen/parser.dart' ;
15
17
import 'interop_gen/transform.dart' ;
@@ -21,7 +23,6 @@ import 'util.dart';
21
23
// TODO(joshualitt): Use static interop methods for JSArray and JSPromise.
22
24
// TODO(joshualitt): Find a way to generate bindings for JS builtins. This will
23
25
// probably involve parsing the TC39 spec.
24
-
25
26
void main (List <String > args) async {
26
27
var languageVersionString = const String .fromEnvironment ('languageVersion' );
27
28
if (languageVersionString.isEmpty) {
@@ -40,36 +41,45 @@ void main(List<String> args) async {
40
41
languageVersion: Version .parse (languageVersionString),
41
42
);
42
43
} else if (argResult.wasParsed ('declaration' )) {
43
- await generateJSInteropBindings (
44
- inputs: argResult['input' ] as Iterable <String >,
45
- output: argResult['output' ] as String ,
46
- languageVersion: Version .parse (languageVersionString),
47
- );
44
+ final Config config;
45
+
46
+ if (argResult.wasParsed ('config' )) {
47
+ final filename = argResult['config' ] as String ;
48
+ final configContent = fs.readFileSync (
49
+ filename.toJS, JSReadFileOptions (encoding: 'utf8' .toJS)) as JSString ;
50
+ final yaml = loadYamlDocument (configContent.toDart);
51
+ config =
52
+ YamlConfig .fromYaml (yaml.contents as YamlMap , filename: filename);
53
+ } else {
54
+ config = Config (
55
+ input: argResult['input' ] as List <String >,
56
+ output: argResult['output' ] as String ,
57
+ languageVersion: Version .parse (languageVersionString),
58
+ );
59
+ }
60
+
61
+ await generateJSInteropBindings (config);
48
62
}
49
63
}
50
64
51
- // TODO(https://github.com/dart-lang/web/issues/376): Add support for configuration
52
- Future <void > generateJSInteropBindings ({
53
- required Iterable <String > inputs,
54
- required String output,
55
- required Version languageVersion,
56
- }) async {
65
+ Future <void > generateJSInteropBindings (Config config) async {
57
66
// generate
58
- final jsDeclarations = parseDeclarationFiles (inputs );
67
+ final jsDeclarations = parseDeclarationFiles (config.input );
59
68
60
69
// transform declarations
61
70
final dartDeclarations = transform (jsDeclarations);
62
71
63
72
// generate
64
73
final generatedCodeMap = dartDeclarations.generate ();
65
74
66
- // write code to file(s)
67
- if (inputs .length == 1 ) {
68
- final singleEntry = generatedCodeMap.entries.single ;
69
- fs.writeFileSync (output.toJS, singleEntry .value.toJS);
75
+ // write code to file
76
+ if (generatedCodeMap .length == 1 ) {
77
+ final entry = generatedCodeMap.entries.first ;
78
+ fs.writeFileSync (config. output.toJS, entry .value.toJS);
70
79
} else {
71
80
for (final entry in generatedCodeMap.entries) {
72
- fs.writeFileSync (p.join (output, entry.key).toJS, entry.value.toJS);
81
+ fs.writeFileSync (
82
+ p.join (config.output, p.basename (entry.key)).toJS, entry.value.toJS);
73
83
}
74
84
}
75
85
}
0 commit comments