| // Copyright 2020 The Dart Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /// The JavaScript bootstrap script to support in-browser hot restart. |
| /// |
| /// The [requireUrl] loads our cached RequireJS script file. The [mapperUrl] |
| /// loads the special Dart stack trace mapper. |
| /// |
| /// This file is served when the browser requests `$entrypoint.js` in debug |
| /// mode, and is responsible for bootstrapping the RequireJS modules and |
| /// attaching the hot reload hooks. |
| String generateAmdBootstrapScript({ |
| required String requireUrl, |
| required String mapperUrl, |
| required String entrypoint, |
| }) { |
| return ''' |
| "use strict"; |
| |
| // Attach source mapping. |
| var mapperEl = document.createElement("script"); |
| mapperEl.defer = true; |
| mapperEl.async = false; |
| mapperEl.src = "$mapperUrl"; |
| document.head.appendChild(mapperEl); |
| |
| // Attach require JS. |
| var requireEl = document.createElement("script"); |
| requireEl.defer = true; |
| requireEl.async = false; |
| requireEl.src = "$requireUrl"; |
| |
| // This attribute tells require JS what to load as main (defined below). |
| requireEl.setAttribute("data-main", "$entrypoint.bootstrap"); |
| document.head.appendChild(requireEl); |
| '''; |
| } |
| |
| /// Generate a synthetic main module which captures the application's main |
| /// method. |
| /// |
| /// RE: Object.keys usage in app.main: |
| /// This attaches the main entrypoint and hot reload functionality to the window. |
| /// The app module will have a single property which contains the actual application |
| /// code. The property name is based off of the entrypoint that is generated, for example |
| /// the file `foo/bar/baz.dart` will generate a property named approximately |
| /// `foo__bar__baz`. Rather than attempt to guess, we assume the first property of |
| /// this object is the module. |
| String generateAmdMainModule({required String entrypoint}) { |
| return '''/* ENTRYPOINT_EXTENTION_MARKER */ |
| // Create the main module loaded below. |
| require(["$entrypoint.lib.js", "dart_sdk"], function(app, dart_sdk) { |
| dart_sdk.dart.setStartAsyncSynchronously(true); |
| dart_sdk._debugger.registerDevtoolsFormatter(); |
| |
| // See the generateMainModule doc comment. |
| app[Object.keys(app)[0]].main(); |
| }); |
| '''; |
| } |