94 lines
2.9 KiB
Dart
Executable File
94 lines
2.9 KiB
Dart
Executable File
#!/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');
|
|
}
|