| // 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._debugger.registerDevtoolsFormatter(); | |
| // See the generateMainModule doc comment. | |
| app[Object.keys(app)[0]].main(); | |
| }); | |
| '''; | |
| } |