// Copyright (c) 2017, 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. import 'dart:io'; import 'package:dev_compiler/src/analyzer/command.dart'; import 'package:testing/testing.dart'; import 'common.dart'; import 'ddc_common.dart'; Future createContext( Chain suite, Map environment) async { return SourceMapContext(environment); } class SourceMapContext extends ChainContextWithCleanupHelper { final Map environment; SourceMapContext(this.environment); List _steps; @override List get steps => _steps ??= [ const Setup(), Compile(DevCompilerRunner(debugging: environment.containsKey("debug"))), const StepWithD8(), CheckSteps(environment.containsKey("debug")), ]; @override bool debugging() => environment.containsKey("debug"); } class DevCompilerRunner implements CompilerRunner { final bool debugging; final bool absoluteRoot; const DevCompilerRunner({this.debugging = false, this.absoluteRoot = true}); @override Future run(Uri inputFile, Uri outputFile, Uri outWrapperFile) async { Uri outDir = outputFile.resolve("."); String outputFilename = outputFile.pathSegments.last; File sdkJsFile = findInOutDir("gen/utils/dartdevc/js/es6/dart_sdk.js"); var jsSdkPath = sdkJsFile.uri; File ddcSdkSummary = findInOutDir("gen/utils/dartdevc/ddc_sdk.sum"); var ddc = getDdcDir().uri.resolve("bin/dartdevc.dart"); List args = [ "--modules=es6", "--dart-sdk-summary=${ddcSdkSummary.path}", "--library-root", absoluteRoot ? "/" : outDir.toFilePath(), "-o", outputFile.toFilePath(), inputFile.toFilePath() ]; var result = compile(args); var exitCode = result?.exitCode; if (exitCode != 0) { throw "Exit code: $exitCode from ddc when running something like " "$dartExecutable ${ddc.toFilePath()} " "${args.reduce((value, element) => '$value "$element"')}"; } var jsContent = File.fromUri(outputFile).readAsStringSync(); File.fromUri(outputFile).writeAsStringSync(jsContent.replaceFirst( "from 'dart_sdk.js'", "from '${uriPathForwardSlashed(jsSdkPath)}'")); if (debugging) { createHtmlWrapper( sdkJsFile, outputFile, jsContent, outputFilename, outDir); } var inputFileName = absoluteRoot ? inputFile.path : inputFile.pathSegments.last; inputFileName = inputFileName.split(":").last; var inputFileNameNoExt = pathToJSIdentifier( inputFileName.substring(0, inputFileName.lastIndexOf("."))); File.fromUri(outWrapperFile).writeAsStringSync( getWrapperContent(jsSdkPath, inputFileNameNoExt, outputFilename)); } } void main(List arguments) => runMe(arguments, createContext, "testing.json");