blob: 3c73959ecdf4df8ae85783880374f4cc26b0aea2 [file] [log] [blame] [edit]
#!/usr/bin/env dart
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// Runs io.js with dev_compiler's generated code.
library dev_compiler.bin.devrun;
import 'dart:io';
import 'package:dev_compiler/devc.dart' show devCompilerVersion;
import 'package:dev_compiler/src/compiler.dart' show validateOptions, compile;
import 'package:dev_compiler/src/options.dart';
import 'package:dev_compiler/src/runner/runtime_utils.dart'
show listOutputFiles, getMainModuleName;
import 'package:dev_compiler/src/runner/v8_runner.dart' show V8Runner;
import 'package:path/path.dart';
const String _appName = 'dartdevrun';
void _showUsageAndExit() {
print('usage: ${_appName} [<options>] <file.dart>\n');
print('<file.dart> is a single Dart file to run.\n');
print('<options> include:\n');
print(argParser.usage);
exit(1);
}
main(List<String> args) async {
args = []
..add('--arrow-fn-bind-this')
..addAll(args);
CompilerOptions options;
try {
options = validateOptions(args, forceOutDir: true);
} on FormatException catch (e) {
print('${e.message}\n');
_showUsageAndExit();
}
if (options == null || options.help) _showUsageAndExit();
if (options.version) {
print('${_appName} version ${devCompilerVersion}');
exit(0);
}
if (options.inputs.length != 1) {
stderr.writeln("Please only specify one input to run");
_showUsageAndExit();
}
var runner = new V8Runner(options);
if (!compile(options)) exit(1);
var files = await listOutputFiles(options);
var startStatement = 'dart_library.start("${getMainModuleName(options)}");';
// TODO(ochafik): Only generate the html when some flag is set.
await _writeHtmlRunner(options, files, startStatement);
// Give our soul (and streams) away to iojs.
Process process = await runner.start(files, startStatement);
stdin.pipe(process.stdin);
stdout.addStream(process.stdout);
stderr.addStream(process.stderr);
exit(await process.exitCode);
}
/// Generates an HTML file that can be used to run the output with Chrome Dev.
_writeHtmlRunner(
CompilerOptions options, List<File> files, String startStatement) async {
String outputDir = options.codegenOptions.outputDir;
String htmlOutput = join(outputDir, "run.html");
await new File(htmlOutput).writeAsString('''
<html><head></head><body>
${files.map((f) =>
'<script src="${relative(f.path, from: outputDir)}"></script>')
.join("\n")}
<script>$startStatement</script>
</body></html>
''');
stderr.writeln(
'Wrote $htmlOutput. It can be opened in Chrome Dev with the following flags:\n'
'--js-flags="--harmony-arrow-functions '
'--harmony-classes '
'--harmony-computed-property-names '
'--harmony-spreadcalls"'
'\n');
}