From 87b3cb9d4cbcd2e5cb26b1628e3ab3d331c841d5 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 10 Mar 2022 11:47:55 -0800 Subject: [PATCH 01/12] Migrate .packages --- .../src/readers/frontend_server_asset_reader.dart | 8 ++++---- dwds/lib/src/utilities/dart_uri.dart | 7 ++++--- dwds/test/fixtures/context.dart | 3 ++- frontend_server_common/lib/src/asset_server.dart | 3 ++- webdev/test/e2e_test.dart | 4 +++- webdev/test/integration_test.dart | 12 ++++++------ 6 files changed, 21 insertions(+), 16 deletions(-) diff --git a/dwds/lib/src/readers/frontend_server_asset_reader.dart b/dwds/lib/src/readers/frontend_server_asset_reader.dart index c44cedb0b..f11616208 100644 --- a/dwds/lib/src/readers/frontend_server_asset_reader.dart +++ b/dwds/lib/src/readers/frontend_server_asset_reader.dart @@ -37,8 +37,8 @@ class FrontendServerAssetReader implements AssetReader { /// Corresponding `.json` and `.map` files will be read relative to /// [outputPath]. /// - /// [_packageRoot] is the path to the directory that contains a `.packages` - /// file for the application. + /// [_packageRoot] is the path to the directory that contains a + /// `.dart_tool/package_config.json` file for the application. FrontendServerAssetReader( String outputPath, this._packageRoot, @@ -46,8 +46,8 @@ class FrontendServerAssetReader implements AssetReader { _mapIncremental = File('$outputPath.incremental.map'), _jsonOriginal = File('$outputPath.json'), _jsonIncremental = File('$outputPath.incremental.json'), - _packageConfig = loadPackageConfig( - File(p.absolute(p.join(_packageRoot, '.packages')))); + _packageConfig = loadPackageConfig(File(p + .absolute(p.join(_packageRoot, '.dart_tool/package_config.json')))); @override Future dartSourceContents(String serverPath) async { diff --git a/dwds/lib/src/utilities/dart_uri.dart b/dwds/lib/src/utilities/dart_uri.dart index 4d3fb35cf..9903950af 100644 --- a/dwds/lib/src/utilities/dart_uri.dart +++ b/dwds/lib/src/utilities/dart_uri.dart @@ -157,7 +157,8 @@ class DartUri { /// Record library and script uris to enable resolving library and script paths. static Future initialize(SdkConfiguration sdkConfiguration) async { _sdkConfiguration = sdkConfiguration; - var packagesUri = p.toUri(p.join(currentDirectory, '.packages')); + var packagesUri = + p.toUri(p.join(currentDirectory, '.dart_tool/package_config.json')); clear(); @@ -190,8 +191,8 @@ class DartUri { /// Returns the dirname for the server URI. static String _dirForServerUri(String uri) => p.dirname(Uri.parse(uri).path); - /// Load the .packages file associated with the running application so we can - /// resolve file URLs into package: URLs appropriately. + /// Load the .dart_tool/package_config.json file associated with the running + /// application so we can resolve file URLs into package: URLs appropriately. static Future _loadPackageConfig(Uri uri) async { _packageConfig = await loadPackageConfigUri(uri, onError: (e) { _logger.warning('Cannot read packages spec: $uri', e); diff --git a/dwds/test/fixtures/context.dart b/dwds/test/fixtures/context.dart index e0b483713..5e74a0071 100644 --- a/dwds/test/fixtures/context.dart +++ b/dwds/test/fixtures/context.dart @@ -98,7 +98,8 @@ class TestContext { .absolute(directory ?? p.relative(relativeDirectory, from: p.current))); DartUri.currentDirectory = workingDirectory; - _packagesFilePath = p.join(workingDirectory, '.packages'); + _packagesFilePath = + p.join(workingDirectory, '.dart_tool/package_config.json'); _entryFile = File(p.normalize( p.absolute(entry ?? p.relative(relativeEntry, from: p.current)))); diff --git a/frontend_server_common/lib/src/asset_server.dart b/frontend_server_common/lib/src/asset_server.dart index 756d489f7..388feea98 100644 --- a/frontend_server_common/lib/src/asset_server.dart +++ b/frontend_server_common/lib/src/asset_server.dart @@ -50,7 +50,8 @@ class TestAssetServer implements AssetReader { ) async { var address = (await InternetAddress.lookup(hostname)).first; var httpServer = await HttpServer.bind(address, port); - var packages = await loadPackageConfigUri(Uri.base.resolve('.packages'), + var packages = await loadPackageConfigUri( + Uri.base.resolve('.dart_tool/package_config.json'), loader: (Uri uri) => fileSystem.file(uri).readAsBytes()); var server = TestAssetServer(root, httpServer, packages, address, fileSystem); diff --git a/webdev/test/e2e_test.dart b/webdev/test/e2e_test.dart index e5779b2b9..b5a47980b 100644 --- a/webdev/test/e2e_test.dart +++ b/webdev/test/e2e_test.dart @@ -53,7 +53,9 @@ void main() { await process.shouldExit(0); - await d.file('.packages', isNotEmpty).validate(exampleDirectory); + await d + .file('.dart_tool/package_config.json', isNotEmpty) + .validate(exampleDirectory); await d.file('pubspec.lock', isNotEmpty).validate(exampleDirectory); }); diff --git a/webdev/test/integration_test.dart b/webdev/test/integration_test.dart index 259ed60f8..25cabb501 100644 --- a/webdev/test/integration_test.dart +++ b/webdev/test/integration_test.dart @@ -53,7 +53,7 @@ name: sample )) .create(); - await d.file('.packages', ''' + await d.file('.dart_tool/package_config.json', ''' ''').create(); await d.dir('.dart_tool', [d.file('package_config.json', '')]).create(); @@ -84,7 +84,7 @@ name: sample .file('pubspec.lock', _pubspecLock(runnerVersion: null)) .create(); - await d.file('.packages', ''' + await d.file('.dart_tool/package_config.json', ''' ''').create(); await d .dir('.dart_tool', [d.file('package_config.json', '')]).create(); @@ -107,7 +107,7 @@ name: sample .file('pubspec.lock', _pubspecLock(webCompilersVersion: null)) .create(); - await d.file('.packages', ''' + await d.file('.dart_tool/package_config.json', ''' ''').create(); await d .dir('.dart_tool', [d.file('package_config.json', '')]).create(); @@ -132,7 +132,7 @@ name: sample .file('pubspec.lock', _pubspecLock(webCompilersVersion: null)) .create(); - await d.file('.packages', ''' + await d.file('.dart_tool/package_config.json', ''' ''').create(); await d .dir('.dart_tool', [d.file('package_config.json', '')]).create(); @@ -184,7 +184,7 @@ name: sample daemonVersion: buildDaemonVersion)) .create(); - await d.file('.packages', ''' + await d.file('.dart_tool/package_config.json', ''' ''').create(); await d.dir( '.dart_tool', [d.file('package_config.json', '')]).create(); @@ -240,7 +240,7 @@ name: sample test('should fail if there has been a dependency change', () async { await d.file('pubspec.lock', _pubspecLock()).create(); - await d.file('.packages', '').create(); + await d.file('.dart_tool/package_config.json', '').create(); await d.dir('.dart_tool', [d.file('package_config.json', '')]).create(); // Ensure there is a noticeable delta in the creation times From dfddbb86753d500c91329e0d51ca666751167886 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 10 Mar 2022 11:59:43 -0800 Subject: [PATCH 02/12] Update dependency override and changelog --- webdev/pubspec.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webdev/pubspec.yaml b/webdev/pubspec.yaml index 6463845cb..bc8701683 100644 --- a/webdev/pubspec.yaml +++ b/webdev/pubspec.yaml @@ -48,9 +48,9 @@ dev_dependencies: webdriver: ^3.0.0 # Uncomment for development versions -# dependency_overrides: -# dwds: -# path: ../dwds +dependency_overrides: + dwds: + path: ../dwds executables: webdev: From 7ae137aa41a29196a7f723922685122e1902bcfb Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 10 Mar 2022 12:00:50 -0800 Subject: [PATCH 03/12] Update changelog --- dwds/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md index c98fc9424..8c637e7df 100644 --- a/dwds/CHANGELOG.md +++ b/dwds/CHANGELOG.md @@ -6,6 +6,7 @@ - Add `SdkConfiguration` and `SdkConfigurationProvider` classes to allow for lazily created SDK configurations. - Add an `ide` query parameter to the Dart DevTools URL for analytics. +- Migrate .packages to package_config.json. **Breaking changes:** - `Dwds.start` and `ExpressionCompilerService` now take From 04da253c061fb4dcc571b6cdd105595de83d9a0d Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 10 Mar 2022 12:47:41 -0800 Subject: [PATCH 04/12] Update expression compiler --- webdev/lib/src/serve/webdev_server.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webdev/lib/src/serve/webdev_server.dart b/webdev/lib/src/serve/webdev_server.dart index f3327e3f4..b73224547 100644 --- a/webdev/lib/src/serve/webdev_server.dart +++ b/webdev/lib/src/serve/webdev_server.dart @@ -132,7 +132,7 @@ class WebDevServer { options.configuration.hostname, options.port, assetHandler, - options.configuration.verbose, + verbose: options.configuration.verbose, ); } var shouldServeDevTools = From ccb78aa25ed6838b36219bbf8aadc6dc35b1a6ae Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Wed, 16 Mar 2022 16:40:33 -0700 Subject: [PATCH 05/12] Merge in master --- dwds/CHANGELOG.md | 3 + dwds/debug_extension/CHANGELOG.md | 4 ++ dwds/debug_extension/pubspec.yaml | 2 +- .../web/{panel.html => debugger_panel.html} | 2 +- dwds/debug_extension/web/devtools.js | 58 ++++++++++++++----- dwds/debug_extension/web/inspector_panel.html | 21 +++++++ dwds/debug_extension/web/manifest.json | 2 +- dwds/debug_extension/web/panel.js | 7 ++- dwds/lib/src/dwds_vm_client.dart | 20 ++++--- dwds/lib/src/injected/client.js | 2 +- dwds/pubspec.yaml | 2 +- webdev/lib/src/version.dart | 2 +- webdev/pubspec.yaml | 4 +- 13 files changed, 99 insertions(+), 30 deletions(-) rename dwds/debug_extension/web/{panel.html => debugger_panel.html} (94%) create mode 100644 dwds/debug_extension/web/inspector_panel.html diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md index 4801c1976..704b2e398 100644 --- a/dwds/CHANGELOG.md +++ b/dwds/CHANGELOG.md @@ -10,8 +10,11 @@ - Add an `ide` query parameter to the Dart DevTools URL for analytics. - Fix a race where injected client crashed on events send just before hot restart. +- Remove verbose printing on receiving DevTools events. +- Update `vm_service` version to `^8.2.0`. - Migrate .packages to package_config.json. + **Breaking changes:** - `Dwds.start` and `ExpressionCompilerService` now take `sdkConfigurationProvider` argument instead of separate SDK-related file diff --git a/dwds/debug_extension/CHANGELOG.md b/dwds/debug_extension/CHANGELOG.md index a9c65735a..6371b5108 100644 --- a/dwds/debug_extension/CHANGELOG.md +++ b/dwds/debug_extension/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.27 + +- Support embedded debugger and inspector in Chrome DevTools for Flutter Web apps. + ## 1.26 - Support embedded debugging experience in environments with no Dart app ID. diff --git a/dwds/debug_extension/pubspec.yaml b/dwds/debug_extension/pubspec.yaml index 11e91c039..be7dd78db 100644 --- a/dwds/debug_extension/pubspec.yaml +++ b/dwds/debug_extension/pubspec.yaml @@ -1,6 +1,6 @@ name: extension publish_to: none -version: 1.26.0 +version: 1.27.0 author: Dart Team homepage: https://github.com/dart-lang/webdev description: >- diff --git a/dwds/debug_extension/web/panel.html b/dwds/debug_extension/web/debugger_panel.html similarity index 94% rename from dwds/debug_extension/web/panel.html rename to dwds/debug_extension/web/debugger_panel.html index a77690eec..5972b7636 100644 --- a/dwds/debug_extension/web/panel.html +++ b/dwds/debug_extension/web/debugger_panel.html @@ -5,7 +5,7 @@ - +
diff --git a/dwds/debug_extension/web/devtools.js b/dwds/debug_extension/web/devtools.js index 44a3ff821..97c18a39f 100644 --- a/dwds/debug_extension/web/devtools.js +++ b/dwds/debug_extension/web/devtools.js @@ -1,33 +1,63 @@ (function loadDevToolsScript() { const DDR_DART_APP_ATTRIBUTE = 'data-ddr-dart-app'; - let created = false; - let checkCount = 0; - chrome.devtools.network.onNavigated.addListener(createPanelIfDartApp) - const checkDartAppInterval = setInterval(createPanelIfDartApp, 1000) - createPanelIfDartApp() + let debuggerCreated = false; + let inspectorCreated = false; + let checkDartCount = 0; + let checkFlutterCount = 0; - function createPanelIfDartApp() { - if (created || checkCount++ > 20) { + chrome.devtools.network.onNavigated.addListener(createDebuggerPanelIfDartApp) + const checkDartAppInterval = setInterval(createDebuggerPanelIfDartApp, 1000) + createDebuggerPanelIfDartApp() + + function createDebuggerPanelIfDartApp() { + if (debuggerCreated || checkDartCount++ > 20) { clearInterval(checkDartAppInterval); return; } + checkIsDartApp(); + } + + function checkIsDartApp() { // TODO(elliette): Remove the DDR data attribute check when we are ready to launch externally, // and instead replace it with the following: !!window.$dartAppId // Note: we must remove the useContentScriptContext option as well. chrome.devtools.inspectedWindow.eval( `document.documentElement.hasAttribute("${DDR_DART_APP_ATTRIBUTE}")`, - {useContentScriptContext: true}, + { useContentScriptContext: true }, function (isDartApp) { - if (isDartApp) { - created = true - chrome.devtools.panels.create( - 'Dart Debugger', '', 'panel.html' + if (!isDartApp) return; + + chrome.devtools.panels.create( + 'Dart Debugger', '', 'debugger_panel.html' ); + debuggerCreated = true; + createInspectorPanelIfFlutterApp(); + }); + } + + function createInspectorPanelIfFlutterApp() { + const checkFlutterAppInterval = setInterval(function () { + if (inspectorCreated|| checkFlutterCount++ > 10) { + clearInterval(checkFlutterAppInterval); + return; + } + + // The following value is loaded asynchronously, which is why + // we check for it every 1 second: + chrome.devtools.inspectedWindow.eval( + '!!window._flutter_web_set_location_strategy', + function (isFlutterWeb) { + if (isFlutterWeb) { + chrome.devtools.panels.create( + 'Flutter Inspector', '', 'inspector_panel.html' + ); + inspectorCreated = true; + } } - }, - ) + ); + }, 1000) } }()); diff --git a/dwds/debug_extension/web/inspector_panel.html b/dwds/debug_extension/web/inspector_panel.html new file mode 100644 index 000000000..d3880e5a4 --- /dev/null +++ b/dwds/debug_extension/web/inspector_panel.html @@ -0,0 +1,21 @@ + + + + + + + + + +
+
+ +
+
+
+ + + + + + \ No newline at end of file diff --git a/dwds/debug_extension/web/manifest.json b/dwds/debug_extension/web/manifest.json index 5901079ed..61f392d54 100644 --- a/dwds/debug_extension/web/manifest.json +++ b/dwds/debug_extension/web/manifest.json @@ -1,6 +1,6 @@ { "name": "Dart Debug Extension", - "version": "1.26", + "version": "1.27", "minimum_chrome_version": "10.0", "devtools_page": "devtools.html", "manifest_version": 2, diff --git a/dwds/debug_extension/web/panel.js b/dwds/debug_extension/web/panel.js index 4b209b285..2f82ed205 100644 --- a/dwds/debug_extension/web/panel.js +++ b/dwds/debug_extension/web/panel.js @@ -10,6 +10,8 @@ const PANEL_SCRIPT = 'panel-script'; const START_DEBUGGING = 'start-debugging'; const DEVTOOLS_OPEN = 'devtools-open'; + const PANEL_BODY = 'panelBody'; + const PANEL_ATTRIBUTE = 'data-panel'; const chromeTheme = chrome.devtools.panels.themeName; const backgroundColor = chromeTheme == CHROME_DARK ? DARK_COLOR : LIGHT_COLOR; @@ -17,6 +19,7 @@ let appId = null; let currentDevToolsUrl = ''; + let panel = ''; // Helper functions: function sendStartDebuggingRequest() { @@ -26,6 +29,7 @@ } window.onload = function () { + panel = document.getElementById(PANEL_BODY).getAttribute(PANEL_ATTRIBUTE) document.getElementById(DEBUGGING_BUTTON).addEventListener('click', sendStartDebuggingRequest); // Set the background and text color of the panel to match the Chrome theme: document.body.style.backgroundColor = `#${backgroundColor}`; @@ -51,7 +55,8 @@ } else { // Debugger has benn connected, add an IFRAME for Dart DevTools: const iframe = document.createElement(IFRAME_TAG); - const src = `${devToolsUrl}&embed=true&page=debugger&backgroundColor=${backgroundColor}`; + if (panel == '') return; + const src = `${devToolsUrl}&embed=true&page=${panel}&backgroundColor=${backgroundColor}`; iframe.setAttribute('src', src); iframe.setAttribute('scrolling', 'no'); iframe.id = IFRAME_ID; diff --git a/dwds/lib/src/dwds_vm_client.dart b/dwds/lib/src/dwds_vm_client.dart index 8ebfb6269..52d6e0bb5 100644 --- a/dwds/lib/src/dwds_vm_client.dart +++ b/dwds/lib/src/dwds_vm_client.dart @@ -150,25 +150,31 @@ void _processSendEvent(Map event, switch (type) { case 'DevtoolsEvent': { + _logger.finest('Received DevTools event: $event'); var action = payload == null ? null : payload['action']; if (action == 'pageReady') { if (dwdsStats.isFirstDebuggerReady) { if (dwdsStats.devToolsStart != null) { - emitEvent(DwdsEvent.devToolsLoad(DateTime.now() + var time = DateTime.now() .difference(dwdsStats.devToolsStart) - .inMilliseconds)); + .inMilliseconds; + emitEvent(DwdsEvent.devToolsLoad(time)); + _logger.fine('DevTools load time: $time ms'); } if (dwdsStats.debuggerStart != null) { - emitEvent(DwdsEvent.debuggerReady(DateTime.now() + var time = DateTime.now() .difference(dwdsStats.debuggerStart) - .inMilliseconds)); + .inMilliseconds; + emitEvent(DwdsEvent.debuggerReady(time)); + _logger.fine('Debugger ready time: $time ms'); } } else { - print('Ignoring already received event: $event'); - _logger.warning('Ignoring already received event: $event'); + _logger + .finest('Debugger and DevTools startup times alredy recorded.' + ' Ignoring $event.'); } } else { - _logger.warning('Ignoring unknown event: $event'); + _logger.finest('Ignoring unknown event: $event'); } } } diff --git a/dwds/lib/src/injected/client.js b/dwds/lib/src/injected/client.js index d25c60a3d..936b99e6d 100644 --- a/dwds/lib/src/injected/client.js +++ b/dwds/lib/src/injected/client.js @@ -1,4 +1,4 @@ -// Generated by dart2js (NullSafetyMode.unsound, csp), the Dart to JavaScript compiler version: 2.17.0-162.0.dev. +// Generated by dart2js (NullSafetyMode.unsound, csp), the Dart to JavaScript compiler version: 2.17.0-169.0.dev. // The code supports the following hooks: // dartPrint(message): // if this function is defined it is called instead of the Dart [print] diff --git a/dwds/pubspec.yaml b/dwds/pubspec.yaml index de9ad15c1..cf74b883b 100644 --- a/dwds/pubspec.yaml +++ b/dwds/pubspec.yaml @@ -34,7 +34,7 @@ dependencies: stack_trace: ^1.10.0 sse: ^4.1.0 uuid: '>=2.0.0 <4.0.0' - vm_service: ^8.1.0 + vm_service: ^8.2.0 web_socket_channel: ^2.0.0 webkit_inspection_protocol: ^1.0.0 diff --git a/webdev/lib/src/version.dart b/webdev/lib/src/version.dart index 3c5f39d6d..285214122 100644 --- a/webdev/lib/src/version.dart +++ b/webdev/lib/src/version.dart @@ -1,2 +1,2 @@ // Generated code. Do not modify. -const packageVersion = '2.7.8'; +const packageVersion = '2.7.9-dev'; diff --git a/webdev/pubspec.yaml b/webdev/pubspec.yaml index bc8701683..eaf6ba93a 100644 --- a/webdev/pubspec.yaml +++ b/webdev/pubspec.yaml @@ -1,6 +1,6 @@ name: webdev # Every time this changes you need to run `dart run build_runner build`. -version: 2.7.8 +version: 2.7.9-dev # We should not depend on a dev SDK before publishing. # publish_to: none homepage: https://github.com/dart-lang/webdev @@ -47,7 +47,7 @@ dev_dependencies: test_process: ^2.0.2 webdriver: ^3.0.0 -# Uncomment for development versions +# Comment out before releasing webdev. dependency_overrides: dwds: path: ../dwds From dd4088e2e02ba082662eaa38d7619a27b3e90d74 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Wed, 16 Mar 2022 16:47:56 -0700 Subject: [PATCH 06/12] Update changelog --- dwds/CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md index 704b2e398..69ed3b0b4 100644 --- a/dwds/CHANGELOG.md +++ b/dwds/CHANGELOG.md @@ -12,8 +12,6 @@ restart. - Remove verbose printing on receiving DevTools events. - Update `vm_service` version to `^8.2.0`. -- Migrate .packages to package_config.json. - **Breaking changes:** - `Dwds.start` and `ExpressionCompilerService` now take From eb90329091a2e4f8b179305b4281136b2dc57114 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 17 Mar 2022 11:57:04 -0700 Subject: [PATCH 07/12] Test changes --- dwds/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md index 69ed3b0b4..1f34136f7 100644 --- a/dwds/CHANGELOG.md +++ b/dwds/CHANGELOG.md @@ -12,6 +12,7 @@ restart. - Remove verbose printing on receiving DevTools events. - Update `vm_service` version to `^8.2.0`. +- Migrate .packages to package_config.json. **Breaking changes:** - `Dwds.start` and `ExpressionCompilerService` now take From 62417407f3cf7cbd8e1338a8682eb854921c2745 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 17 Mar 2022 11:57:30 -0700 Subject: [PATCH 08/12] All test changes --- frontend_server_common/lib/src/asset_server.dart | 8 ++++++-- frontend_server_common/lib/src/devfs.dart | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend_server_common/lib/src/asset_server.dart b/frontend_server_common/lib/src/asset_server.dart index 388feea98..bb090bb46 100644 --- a/frontend_server_common/lib/src/asset_server.dart +++ b/frontend_server_common/lib/src/asset_server.dart @@ -12,7 +12,7 @@ import 'dart:io'; import 'dart:typed_data'; import 'package:dwds/dwds.dart'; -import 'package:file/file.dart'; +import 'package:file/file.dart' hide Directory; import 'package:logging/logging.dart'; import 'package:mime/mime.dart' as mime; import 'package:package_config/package_config.dart'; // ignore: deprecated_member_use @@ -50,9 +50,13 @@ class TestAssetServer implements AssetReader { ) async { var address = (await InternetAddress.lookup(hostname)).first; var httpServer = await HttpServer.bind(address, port); + print('ROOT IS $root'); + print('URI IS ${Uri.base}'); + // var packages = await findPackageConfig(Directory.fromUri(Uri.base)); var packages = await loadPackageConfigUri( - Uri.base.resolve('.dart_tool/package_config.json'), + Uri.base.resolve('package_config.json'), loader: (Uri uri) => fileSystem.file(uri).readAsBytes()); + print('======== PACKAGE VERSION IS ${packages.version}'); var server = TestAssetServer(root, httpServer, packages, address, fileSystem); diff --git a/frontend_server_common/lib/src/devfs.dart b/frontend_server_common/lib/src/devfs.dart index 568d1fad1..75097fab9 100644 --- a/frontend_server_common/lib/src/devfs.dart +++ b/frontend_server_common/lib/src/devfs.dart @@ -57,7 +57,7 @@ class WebDevFS { Future dispose() { fileSystem.currentDirectory = _savedCurrentDirectory; - return assetServer.close(); + // return assetServer.close(); } Future update({ From 27bd6d36f94eb505e3521a94380ba59d14148b1e Mon Sep 17 00:00:00 2001 From: Anna Gringauze Date: Fri, 18 Mar 2022 15:31:39 -0700 Subject: [PATCH 09/12] Update frontend server test infrastructure to handle package_config.json --- dwds/test/fixtures/context.dart | 16 +- .../test/frontend_server_breakpoint_test.dart | 14 ++ .../lib/src/asset_server.dart | 18 +- frontend_server_common/lib/src/devfs.dart | 29 +-- .../lib/src/frontend_server_client.dart | 192 +++++------------- .../lib/src/resident_runner.dart | 11 +- 6 files changed, 98 insertions(+), 182 deletions(-) diff --git a/dwds/test/fixtures/context.dart b/dwds/test/fixtures/context.dart index 5e74a0071..b6395054a 100644 --- a/dwds/test/fixtures/context.dart +++ b/dwds/test/fixtures/context.dart @@ -101,9 +101,14 @@ class TestContext { _packagesFilePath = p.join(workingDirectory, '.dart_tool/package_config.json'); - _entryFile = File(p.normalize( - p.absolute(entry ?? p.relative(relativeEntry, from: p.current)))); + var entryFilePath = p.normalize( + p.absolute(entry ?? p.relative(relativeEntry, from: p.current))); + _logger.info('Serving: $pathToServe/$path'); + _logger.info('Packages: $_packagesFilePath'); + _logger.info('Entry: $entryFilePath'); + + _entryFile = File(entryFilePath); _entryContents = _entryFile.readAsStringSync(); } @@ -242,15 +247,14 @@ class TestContext { case CompilationMode.frontendServer: { soundNullSafety ??= true; - var fileSystemRoot = p.dirname(_packagesFilePath); + var projectDirectory = p.dirname(p.dirname(_packagesFilePath)); var entryPath = - _entryFile.path.substring(fileSystemRoot.length + 1); + _entryFile.path.substring(projectDirectory.length + 1); webRunner = ResidentWebRunner( '${Uri.file(entryPath)}', urlEncoder, - fileSystemRoot, _packagesFilePath, - [fileSystemRoot], + [projectDirectory], 'org-dartlang-app', _outputDir.path, verboseCompiler); diff --git a/dwds/test/frontend_server_breakpoint_test.dart b/dwds/test/frontend_server_breakpoint_test.dart index cd0a8a2c5..1f8e767f2 100644 --- a/dwds/test/frontend_server_breakpoint_test.dart +++ b/dwds/test/frontend_server_breakpoint_test.dart @@ -15,6 +15,7 @@ import 'package:vm_service/vm_service.dart'; import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'; import 'fixtures/context.dart'; +import 'fixtures/logging.dart'; final context = TestContext( directory: p.join('..', 'fixtures', '_testPackage'), @@ -27,10 +28,22 @@ ChromeProxyService get service => WipConnection get tabConnection => context.tabConnection; void main() { + // Enable verbose logging for debugging. + var debug = true; + + // Change to 'true' to print expression compiler messages to console. + // + // Note: expression compiler runs in an isolate, so its output is not + // currently redirected to a logger. As a result, it will be printed + // regardless of the logger settings. + var verboseCompiler = true; + group('shared context', () { setUpAll(() async { + setCurrentLogWriter(debug: debug); await context.setUp( compilationMode: CompilationMode.frontendServer, + verboseCompiler: verboseCompiler, ); }); @@ -46,6 +59,7 @@ void main() { Stream stream; setUp(() async { + setCurrentLogWriter(debug: debug); vm = await service.getVM(); isolate = await service.getIsolate(vm.isolates.first.id); scripts = await service.getScripts(isolate.id); diff --git a/frontend_server_common/lib/src/asset_server.dart b/frontend_server_common/lib/src/asset_server.dart index bb090bb46..3100fe818 100644 --- a/frontend_server_common/lib/src/asset_server.dart +++ b/frontend_server_common/lib/src/asset_server.dart @@ -27,7 +27,7 @@ class TestAssetServer implements AssetReader { TestAssetServer( this._root, this._httpServer, - this._packages, + this._packageConfig, this.internetAddress, this._fileSystem, ); @@ -47,19 +47,12 @@ class TestAssetServer implements AssetReader { String hostname, int port, UrlEncoder urlTunneller, + PackageConfig packageConfig, ) async { var address = (await InternetAddress.lookup(hostname)).first; var httpServer = await HttpServer.bind(address, port); - print('ROOT IS $root'); - print('URI IS ${Uri.base}'); - // var packages = await findPackageConfig(Directory.fromUri(Uri.base)); - var packages = await loadPackageConfigUri( - Uri.base.resolve('package_config.json'), - loader: (Uri uri) => fileSystem.file(uri).readAsBytes()); - print('======== PACKAGE VERSION IS ${packages.version}'); var server = - TestAssetServer(root, httpServer, packages, address, fileSystem); - + TestAssetServer(root, httpServer, packageConfig, address, fileSystem); return server; } @@ -69,8 +62,7 @@ class TestAssetServer implements AssetReader { final Map _sourcemaps = {}; final Map _metadata = {}; String _mergedMetadata; - // ignore: deprecated_member_use - final PackageConfig _packages; + final PackageConfig _packageConfig; final InternetAddress internetAddress; Uint8List getFile(String path) => _files[path]; @@ -246,7 +238,7 @@ class TestAssetServer implements AssetReader { // The file might have been a package file which is signaled by a // `/packages//` request. if (segments.first == 'packages') { - var packageFile = _fileSystem.file(_packages + var packageFile = _fileSystem.file(_packageConfig .resolve(Uri(scheme: 'package', pathSegments: segments.skip(1)))); if (packageFile.existsSync()) { return packageFile; diff --git a/frontend_server_common/lib/src/devfs.dart b/frontend_server_common/lib/src/devfs.dart index 75097fab9..df097a498 100644 --- a/frontend_server_common/lib/src/devfs.dart +++ b/frontend_server_common/lib/src/devfs.dart @@ -12,6 +12,7 @@ import 'package:dwds/dwds.dart'; import 'package:file/file.dart'; import 'package:logging/logging.dart'; import 'package:meta/meta.dart'; +import 'package:package_config/package_config.dart'; import 'package:path/path.dart' as p; import 'asset.dart'; @@ -30,8 +31,7 @@ class WebDevFS { this.fileSystem, this.hostname, this.port, - this.packagesFilePath, - this.packagesPath, + this.packageConfigPath, this.root, this.urlTunneller, }); @@ -40,24 +40,31 @@ class WebDevFS { TestAssetServer assetServer; final String hostname; final int port; - final String packagesFilePath; - final String packagesPath; + final String packageConfigPath; final String root; final UrlEncoder urlTunneller; Directory _savedCurrentDirectory; List sources; + PackageConfig _packageConfig; Future create() async { _savedCurrentDirectory = fileSystem.currentDirectory; - fileSystem.currentDirectory = packagesPath; + // package_config.json is located in /.dart_tool/package_config + var projectDirectory = p.dirname(p.dirname(packageConfigPath)); + + fileSystem.currentDirectory = projectDirectory; + + _packageConfig = await loadPackageConfigUri(Uri.file(packageConfigPath), + loader: (Uri uri) => fileSystem.file(uri).readAsBytes()); + assetServer = await TestAssetServer.start( - fileSystem, root, hostname, port, urlTunneller); + fileSystem, root, hostname, port, urlTunneller, _packageConfig); return Uri.parse('http://$hostname:$port'); } Future dispose() { fileSystem.currentDirectory = _savedCurrentDirectory; - // return assetServer.close(); + return assetServer?.close(); } Future update({ @@ -102,11 +109,9 @@ class WebDevFS { generator.reset(); var compilerOutput = await generator.recompile( - 'org-dartlang-app:///$mainPath', - invalidatedFiles, - outputPath: p.join(dillOutputPath, 'app.dill'), - packagesFilePath: packagesFilePath, - ); + Uri.parse('org-dartlang-app:///$mainPath'), invalidatedFiles, + outputPath: p.join(dillOutputPath, 'app.dill'), + packageConfig: _packageConfig); if (compilerOutput == null || compilerOutput.errorCount > 0) { return UpdateFSReport(success: false); } diff --git a/frontend_server_common/lib/src/frontend_server_client.dart b/frontend_server_common/lib/src/frontend_server_client.dart index 91ed7ffad..68f9a236b 100644 --- a/frontend_server_common/lib/src/frontend_server_client.dart +++ b/frontend_server_common/lib/src/frontend_server_client.dart @@ -158,68 +158,6 @@ class StdoutHandler { } } -/// Converts filesystem paths to package URIs. -class PackageUriMapper { - PackageUriMapper(String scriptPath, String packagesFilePath, - String fileSystemScheme, List fileSystemRoots) { - init(scriptPath, packagesFilePath, fileSystemScheme, fileSystemRoots); - } - - Future init(String scriptPath, String packagesFilePath, - String fileSystemScheme, List fileSystemRoots) async { - var packageConfig = await loadPackageConfig( - File(fileSystem.path.absolute(packagesFilePath))); - var isWindowsPath = - Platform.isWindows && !scriptPath.startsWith('org-dartlang-app'); - var scriptUri = Uri.file(scriptPath, windows: isWindowsPath).toString(); - for (var package in packageConfig.packages) { - var prefix = package.packageUriRoot.toString(); - // Only perform a multi-root mapping if there are multiple roots. - if (fileSystemScheme != null && - fileSystemRoots != null && - fileSystemRoots.length > 1 && - prefix.contains(fileSystemScheme)) { - _packageName = package.name; - _uriPrefixes = fileSystemRoots - .map((String name) => - Uri.file(name, windows: Platform.isWindows).toString()) - .toList(); - return; - } - if (scriptUri.startsWith(prefix)) { - _packageName = package.name; - _uriPrefixes = [prefix]; - return; - } - } - } - - String _packageName; - List _uriPrefixes; - - Uri map(String scriptPath) { - if (_packageName == null) { - return null; - } - var scriptUri = - Uri.file(scriptPath, windows: Platform.isWindows).toString(); - for (var uriPrefix in _uriPrefixes) { - if (scriptUri.startsWith(uriPrefix)) { - return Uri.parse( - 'package:$_packageName/${scriptUri.substring(uriPrefix.length)}'); - } - } - return null; - } - - static Uri findUri(String scriptPath, String packagesFilePath, - String fileSystemScheme, List fileSystemRoots) { - return PackageUriMapper( - scriptPath, packagesFilePath, fileSystemScheme, fileSystemRoots) - .map(scriptPath); - } -} - /// Class that allows to serialize compilation requests to the compiler. abstract class _CompilationRequest { _CompilationRequest(this.completer); @@ -236,16 +174,16 @@ abstract class _CompilationRequest { class _RecompileRequest extends _CompilationRequest { _RecompileRequest( Completer completer, - this.mainPath, + this.mainUri, this.invalidatedFiles, this.outputPath, - this.packagesFilePath, + this.packageConfig, ) : super(completer); - String mainPath; + Uri mainUri; List invalidatedFiles; String outputPath; - String packagesFilePath; + PackageConfig packageConfig; @override Future _run(DefaultResidentCompiler compiler) async => @@ -316,7 +254,7 @@ class _RejectRequest extends _CompilationRequest { abstract class ResidentCompiler { factory ResidentCompiler( String sdkRoot, { - String packagesPath, + String packageConfigPath, List fileSystemRoots, String fileSystemScheme, String platformDill, @@ -330,18 +268,14 @@ abstract class ResidentCompiler { void addFileSystemRoot(String root); /// If invoked for the first time, it compiles Dart script identified by - /// [mainPath], [invalidatedFiles] list is ignored. + /// [mainUri], [invalidatedFiles] list is ignored. /// On successive runs [invalidatedFiles] indicates which files need to be - /// recompiled. If [mainPath] is null, previously used [mainPath] entry + /// recompiled. If [mainUri] is null, previously used [mainUri] entry /// point that is used for recompilation. /// Binary file name is returned if compilation was successful, otherwise /// null is returned. - Future recompile( - String mainPath, - List invalidatedFiles, { - @required String outputPath, - String packagesFilePath, - }); + Future recompile(Uri mainUri, List invalidatedFiles, + {@required String outputPath, @required PackageConfig packageConfig}); Future compileExpression( String expression, @@ -387,7 +321,7 @@ abstract class ResidentCompiler { class DefaultResidentCompiler implements ResidentCompiler { DefaultResidentCompiler( String sdkRoot, { - this.packagesPath, + this.packageConfigPath, this.fileSystemRoots, this.fileSystemScheme, this.platformDill, @@ -398,7 +332,7 @@ class DefaultResidentCompiler implements ResidentCompiler { // This is a URI, not a file path, so the forward slash is correct even on Windows. sdkRoot = sdkRoot.endsWith('/') ? sdkRoot : '$sdkRoot/'; - final String packagesPath; + final String packageConfigPath; final List fileSystemRoots; final String fileSystemScheme; final String platformDill; @@ -420,8 +354,9 @@ class DefaultResidentCompiler implements ResidentCompiler { StreamController<_CompilationRequest>(); @override - Future recompile(String mainPath, List invalidatedFiles, - {@required String outputPath, String packagesFilePath}) async { + Future recompile(Uri mainUri, List invalidatedFiles, + {@required String outputPath, + @required PackageConfig packageConfig}) async { assert(outputPath != null); if (!_controller.hasListener) { _controller.stream.listen(_handleCompilationRequest); @@ -429,40 +364,34 @@ class DefaultResidentCompiler implements ResidentCompiler { var completer = Completer(); _controller.add(_RecompileRequest( - completer, mainPath, invalidatedFiles, outputPath, packagesFilePath)); + completer, mainUri, invalidatedFiles, outputPath, packageConfig)); return completer.future; } Future _recompile(_RecompileRequest request) async { _stdoutHandler.reset(); - // First time recompile is called we actually have to compile the app from - // scratch ignoring list of invalidated files. - PackageUriMapper packageUriMapper; - if (request.packagesFilePath != null) { - packageUriMapper = PackageUriMapper( - request.mainPath, - request.packagesFilePath, - fileSystemScheme, - fileSystemRoots, - ); - } + final mainUri = + request.packageConfig.toPackageUri(request.mainUri)?.toString() ?? + toMultiRootPath(request.mainUri, fileSystemScheme, fileSystemRoots); _compileRequestNeedsConfirmation = true; if (_server == null) { - return _compile(_mapFilename(request.mainPath, packageUriMapper), - request.outputPath, request.packagesFilePath); + return _compile(mainUri, request.outputPath); } var inputKey = Uuid().generateV4(); - var mainUri = request.mainPath != null - ? '${_mapFilename(request.mainPath, packageUriMapper)} ' - : ''; _server.stdin.writeln('recompile $mainUri$inputKey'); _logger.info('<- recompile $mainUri$inputKey'); for (var fileUri in request.invalidatedFiles) { - var message = _mapFileUri(fileUri.toString(), packageUriMapper); + String message; + if (fileUri.scheme == 'package') { + message = fileUri.toString(); + } else { + message = request.packageConfig.toPackageUri(fileUri)?.toString() ?? + toMultiRootPath(fileUri, fileSystemScheme, fileSystemRoots); + } _server.stdin.writeln(message); _logger.info(message); } @@ -490,7 +419,7 @@ class DefaultResidentCompiler implements ResidentCompiler { } Future _compile( - String scriptUri, String outputFilePath, String packagesFilePath) async { + String scriptUri, String outputFilePath) async { var frontendServer = frontendServerExecutable; var args = [ frontendServer, @@ -501,12 +430,9 @@ class DefaultResidentCompiler implements ResidentCompiler { '-Ddart.developer.causal_async_stacks=true', '--output-dill', outputFilePath, - if (packagesFilePath != null) ...[ + if (packageConfigPath != null) ...[ '--packages', - packagesFilePath, - ] else if (packagesPath != null) ...[ - '--packages', - packagesPath, + packageConfigPath, ], if (fileSystemRoots != null) for (final String root in fileSystemRoots) ...[ @@ -527,8 +453,9 @@ class DefaultResidentCompiler implements ResidentCompiler { ]; _logger.info(args.join(' ')); + var projectDirectory = p.dirname(p.dirname(packageConfigPath)); _server = await Process.start(Platform.resolvedExecutable, args, - workingDirectory: packagesPath); + workingDirectory: projectDirectory); _server.stdout .transform(utf8.decoder) .transform(const LineSplitter()) @@ -693,46 +620,6 @@ class DefaultResidentCompiler implements ResidentCompiler { return _server.exitCode; } - String _mapFilename(String filename, PackageUriMapper packageUriMapper) { - return _doMapFilename(filename, packageUriMapper) ?? filename; - } - - String _mapFileUri(String fileUri, PackageUriMapper packageUriMapper) { - String filename; - try { - filename = Uri.parse(fileUri).toFilePath(); - } on UnsupportedError catch (_) { - return fileUri; - } - return _doMapFilename(filename, packageUriMapper) ?? fileUri; - } - - String _doMapFilename(String filename, PackageUriMapper packageUriMapper) { - if (packageUriMapper != null) { - var packageUri = packageUriMapper.map(filename); - if (packageUri != null) { - return packageUri.toString(); - } - } - - if (fileSystemRoots != null) { - for (var root in fileSystemRoots) { - if (filename.startsWith(root)) { - return Uri( - scheme: fileSystemScheme, - path: filename.substring(root.length)) - .toString(); - } - } - } - if (Platform.isWindows && - fileSystemRoots != null && - fileSystemRoots.length > 1) { - return Uri.file(filename, windows: Platform.isWindows).toString(); - } - return null; - } - @override Future shutdown() async { // Server was never successfully created. @@ -788,3 +675,20 @@ class TestExpressionCompiler implements ExpressionCompiler { @override Future initialize({String moduleFormat, bool soundNullSafety}) async {} } + +/// Convert a file URI into a multi-root scheme URI if provided, otherwise +/// return unmodified. +@visibleForTesting +String toMultiRootPath( + Uri fileUri, String scheme, List fileSystemRoots) { + if (scheme == null || fileSystemRoots.isEmpty || fileUri.scheme != 'file') { + return fileUri.toString(); + } + final filePath = fileUri.toFilePath(windows: Platform.isWindows); + for (final fileSystemRoot in fileSystemRoots) { + if (filePath.startsWith(fileSystemRoot)) { + return '$scheme://${filePath.substring(fileSystemRoot.length)}'; + } + } + return fileUri.toString(); +} diff --git a/frontend_server_common/lib/src/resident_runner.dart b/frontend_server_common/lib/src/resident_runner.dart index 9f14f8704..ed692f8ea 100644 --- a/frontend_server_common/lib/src/resident_runner.dart +++ b/frontend_server_common/lib/src/resident_runner.dart @@ -28,14 +28,13 @@ class ResidentWebRunner { ResidentWebRunner( this.mainPath, this.urlTunneller, - this.packagesPath, - this.packagesFilePath, + this.packageConfigPath, this.fileSystemRoots, this.fileSystemScheme, this.outputPath, bool verbose) { generator = ResidentCompiler(dartSdkPath, - packagesPath: packagesPath, + packageConfigPath: packageConfigPath, platformDill: '$platformDill', fileSystemRoots: fileSystemRoots, fileSystemScheme: fileSystemScheme, @@ -45,8 +44,7 @@ class ResidentWebRunner { final UrlEncoder urlTunneller; final String mainPath; - final String packagesPath; - final String packagesFilePath; + final String packageConfigPath; final String outputPath; final List fileSystemRoots; final String fileSystemScheme; @@ -67,8 +65,7 @@ class ResidentWebRunner { fileSystem: fileSystem, hostname: hostname, port: port, - packagesFilePath: packagesFilePath, - packagesPath: packagesPath, + packageConfigPath: packageConfigPath, root: root, urlTunneller: urlTunneller, ); From 29de1defce6a6be3ad4c9a954008b28f25358b32 Mon Sep 17 00:00:00 2001 From: Anna Gringauze Date: Fri, 18 Mar 2022 15:40:06 -0700 Subject: [PATCH 10/12] Remove verbose printing from tests --- dwds/test/frontend_server_breakpoint_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dwds/test/frontend_server_breakpoint_test.dart b/dwds/test/frontend_server_breakpoint_test.dart index 1f8e767f2..54cfe877b 100644 --- a/dwds/test/frontend_server_breakpoint_test.dart +++ b/dwds/test/frontend_server_breakpoint_test.dart @@ -29,14 +29,14 @@ WipConnection get tabConnection => context.tabConnection; void main() { // Enable verbose logging for debugging. - var debug = true; + var debug = false; // Change to 'true' to print expression compiler messages to console. // // Note: expression compiler runs in an isolate, so its output is not // currently redirected to a logger. As a result, it will be printed // regardless of the logger settings. - var verboseCompiler = true; + var verboseCompiler = false; group('shared context', () { setUpAll(() async { From 76af7c422a597e40aff1eccf52a18a414ed42be6 Mon Sep 17 00:00:00 2001 From: Anna Gringauze Date: Fri, 18 Mar 2022 16:09:13 -0700 Subject: [PATCH 11/12] Fix webdev integration tests --- webdev/test/integration_test.dart | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/webdev/test/integration_test.dart b/webdev/test/integration_test.dart index 25cabb501..be766da1b 100644 --- a/webdev/test/integration_test.dart +++ b/webdev/test/integration_test.dart @@ -53,9 +53,9 @@ name: sample )) .create(); + await d.dir('.dart_tool', [d.file('package_config.json', '')]).create(); await d.file('.dart_tool/package_config.json', ''' ''').create(); - await d.dir('.dart_tool', [d.file('package_config.json', '')]).create(); var process = await runWebDev(['serve'], workingDirectory: d.sandbox); @@ -84,10 +84,10 @@ name: sample .file('pubspec.lock', _pubspecLock(runnerVersion: null)) .create(); - await d.file('.dart_tool/package_config.json', ''' -''').create(); await d .dir('.dart_tool', [d.file('package_config.json', '')]).create(); + await d.file('.dart_tool/package_config.json', ''' +''').create(); var process = await runWebDev([command], workingDirectory: d.sandbox); @@ -107,10 +107,10 @@ name: sample .file('pubspec.lock', _pubspecLock(webCompilersVersion: null)) .create(); - await d.file('.dart_tool/package_config.json', ''' -''').create(); await d .dir('.dart_tool', [d.file('package_config.json', '')]).create(); + await d.file('.dart_tool/package_config.json', ''' +''').create(); var process = await runWebDev(['serve'], workingDirectory: d.sandbox); @@ -132,10 +132,10 @@ name: sample .file('pubspec.lock', _pubspecLock(webCompilersVersion: null)) .create(); - await d.file('.dart_tool/package_config.json', ''' -''').create(); await d .dir('.dart_tool', [d.file('package_config.json', '')]).create(); + await d.file('.dart_tool/package_config.json', ''' +''').create(); // Required for webdev to not complain about nothing to serve. await d.dir('web').create(); @@ -184,10 +184,10 @@ name: sample daemonVersion: buildDaemonVersion)) .create(); - await d.file('.dart_tool/package_config.json', ''' -''').create(); await d.dir( '.dart_tool', [d.file('package_config.json', '')]).create(); + await d.file('.dart_tool/package_config.json', ''' +''').create(); var process = await runWebDev(['serve'], workingDirectory: d.sandbox); @@ -240,8 +240,8 @@ name: sample test('should fail if there has been a dependency change', () async { await d.file('pubspec.lock', _pubspecLock()).create(); - await d.file('.dart_tool/package_config.json', '').create(); await d.dir('.dart_tool', [d.file('package_config.json', '')]).create(); + await d.file('.dart_tool/package_config.json', '').create(); // Ensure there is a noticeable delta in the creation times await Future.delayed(const Duration(milliseconds: 1100)); From 1fa46cbbc6e9f7799b3cedf68175bba7a2ab3e62 Mon Sep 17 00:00:00 2001 From: Anna Gringauze Date: Mon, 21 Mar 2022 11:30:46 -0700 Subject: [PATCH 12/12] Removed hiding directory --- frontend_server_common/lib/src/asset_server.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend_server_common/lib/src/asset_server.dart b/frontend_server_common/lib/src/asset_server.dart index 3100fe818..776e35e6a 100644 --- a/frontend_server_common/lib/src/asset_server.dart +++ b/frontend_server_common/lib/src/asset_server.dart @@ -12,7 +12,7 @@ import 'dart:io'; import 'dart:typed_data'; import 'package:dwds/dwds.dart'; -import 'package:file/file.dart' hide Directory; +import 'package:file/file.dart'; import 'package:logging/logging.dart'; import 'package:mime/mime.dart' as mime; import 'package:package_config/package_config.dart'; // ignore: deprecated_member_use