| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:meta/meta.dart'; |
| |
| import '../asset.dart'; |
| import '../base/common.dart'; |
| import '../base/context.dart'; |
| import '../base/file_system.dart'; |
| import '../base/logger.dart'; |
| import '../build_info.dart'; |
| import '../bundle.dart'; |
| import '../globals.dart'; |
| import '../project.dart'; |
| import '../usage.dart'; |
| |
| /// The [WebCompilationProxy] instance. |
| WebCompilationProxy get webCompilationProxy => context.get<WebCompilationProxy>(); |
| |
| Future<void> buildWeb(FlutterProject flutterProject, String target, BuildInfo buildInfo) async { |
| if (!flutterProject.web.existsSync()) { |
| throwToolExit('Missing index.html.'); |
| } |
| final Status status = logger.startProgress('Compiling $target for the Web...', timeout: null); |
| final Stopwatch sw = Stopwatch()..start(); |
| final Directory outputDir = fs.directory(getWebBuildDirectory()) |
| ..createSync(recursive: true); |
| bool result; |
| try { |
| result = await webCompilationProxy.initialize( |
| projectDirectory: FlutterProject.current().directory, |
| release: buildInfo.isRelease, |
| ); |
| if (result) { |
| // Places assets adjacent to the web stuff. |
| final AssetBundle assetBundle = AssetBundleFactory.instance.createBundle(); |
| await assetBundle.build(); |
| await writeBundle(fs.directory(fs.path.join(outputDir.path, 'assets')), assetBundle.entries); |
| |
| // Copy results to output directory. |
| final String outputPath = fs.path.join( |
| flutterProject.dartTool.path, |
| 'build', |
| 'flutter_web', |
| flutterProject.manifest.appName, |
| '${fs.path.withoutExtension(target)}_web_entrypoint.dart.js' |
| ); |
| fs.file(outputPath).copySync(fs.path.join(outputDir.path, 'main.dart.js')); |
| fs.file('$outputPath.map').copySync(fs.path.join(outputDir.path, 'main.dart.js.map')); |
| flutterProject.web.indexFile.copySync(fs.path.join(outputDir.path, 'index.html')); |
| } |
| } catch (err) { |
| printError(err.toString()); |
| result = false; |
| } finally { |
| status.stop(); |
| } |
| if (result == false) { |
| throwToolExit('Failed to compile $target for the Web.'); |
| } |
| String buildName = 'ddc'; |
| if (buildInfo.isRelease) { |
| buildName = 'dart2js'; |
| } |
| flutterUsage.sendTiming('build', buildName, Duration(milliseconds: sw.elapsedMilliseconds)); |
| } |
| |
| /// An indirection on web compilation. |
| /// |
| /// Avoids issues with syncing build_runner_core to other repos. |
| class WebCompilationProxy { |
| const WebCompilationProxy(); |
| |
| /// Initialize the web compiler from the `projectDirectory`. |
| /// |
| /// Returns whether or not the build was successful. |
| /// |
| /// `release` controls whether we build the bundle for dartdevc or only |
| /// the entrypoints for dart2js to later take over. |
| Future<bool> initialize({ |
| @required Directory projectDirectory, |
| String testOutputDir, |
| bool release, |
| }) async { |
| throw UnimplementedError(); |
| } |
| |
| /// Invalidate the source files in `inputs` and recompile them to JavaScript. |
| Future<void> invalidate({@required List<Uri> inputs}) async { |
| throw UnimplementedError(); |
| } |
| } |