Skip to content

Commit

Permalink
Allow client to specify how to find the package config (#2199)
Browse files Browse the repository at this point in the history
  • Loading branch information
elliette authored Aug 22, 2023
1 parent fc876cb commit b244b89
Show file tree
Hide file tree
Showing 17 changed files with 160 additions and 20 deletions.
6 changes: 5 additions & 1 deletion dwds/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
## 20.0.2-wip
## 21.0.0-wip

**Breaking changes**

- Allow clients to specify where to find the package config. - [#2199](https://github.com/dart-lang/webdev/pull/2199).

## 20.0.1

Expand Down
15 changes: 15 additions & 0 deletions dwds/lib/src/loaders/legacy.dart
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,16 @@ class LegacyStrategy extends LoadStrategy {
/// an app URI.
final String? Function(String appUri) _serverPathForAppUri;

/// Returns the absolute path to the app's package config, determined by the
/// app's [entrypoint] path.
///
/// Example:
///
/// main_module.bootstrap.js
/// -> /Users/john_doe/my_dart_app/.dart_tool/package_config.json
///
final String? Function(String entrypoint) _packageConfigLocator;

final Uri? _appEntrypoint;

LegacyStrategy(
Expand All @@ -77,6 +87,7 @@ class LegacyStrategy extends LoadStrategy {
this._moduleInfoForProvider,
AssetReader assetReader,
this._appEntrypoint,
this._packageConfigLocator,
) : super(assetReader);

@override
Expand Down Expand Up @@ -122,4 +133,8 @@ class LegacyStrategy extends LoadStrategy {

@override
Uri? get appEntrypoint => _appEntrypoint;

@override
String? packageConfigLocator(String entrypoint) =>
_packageConfigLocator(entrypoint);
}
3 changes: 3 additions & 0 deletions dwds/lib/src/loaders/require.dart
Original file line number Diff line number Diff line change
Expand Up @@ -283,4 +283,7 @@ if(!window.\$requireLoader) {
@override
Future<Map<String, ModuleInfo>> moduleInfoForEntrypoint(String entrypoint) =>
_moduleInfoForProvider(metadataProviderFor(entrypoint));

@override
String? packageConfigLocator(String entrypoint) => null;
}
27 changes: 27 additions & 0 deletions dwds/lib/src/loaders/strategy.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import 'package:dwds/src/debugging/metadata/provider.dart';
import 'package:dwds/src/readers/asset_reader.dart';
import 'package:dwds/src/services/expression_compiler.dart';
import 'package:dwds/src/utilities/dart_uri.dart';
import 'package:path/path.dart' as p;
import 'package:shelf/shelf.dart';

late LoadStrategy _globalLoadStrategy;
Expand All @@ -16,6 +18,7 @@ LoadStrategy get globalLoadStrategy => _globalLoadStrategy;
abstract class LoadStrategy {
final AssetReader _assetReader;
final _providers = <String, MetadataProvider>{};
String? _packageConfigPath;

LoadStrategy(this._assetReader);

Expand Down Expand Up @@ -103,6 +106,29 @@ abstract class LoadStrategy {
/// an app URI.
String? serverPathForAppUri(String appUri);

/// Returns the absolute path to the app's package config, determined by the
/// app's [entrypoint] path.
///
/// Example:
///
/// main_module.bootstrap.js
/// -> /Users/john_doe/my_dart_app/.dart_tool/package_config.json
///
String? packageConfigLocator(String entrypoint);

/// The absolute path to the app's package config, or null if not provided by
/// [packageConfigLocator].
String get packageConfigPath {
return _packageConfigPath ?? _defaultPackageConfigPath;
}

/// The default package config path, if none is provided by the load strategy.
String get _defaultPackageConfigPath => p.join(
DartUri.currentDirectory,
'.dart_tool',
'package_config.json',
);

/// Returns the [MetadataProvider] for the application located at the provided
/// [entrypoint].
MetadataProvider metadataProviderFor(String entrypoint) {
Expand All @@ -117,6 +143,7 @@ abstract class LoadStrategy {
/// provided [entrypoint].
void trackEntrypoint(String entrypoint) {
final metadataProvider = MetadataProvider(entrypoint, _assetReader);
_packageConfigPath = packageConfigLocator(entrypoint);
_providers[metadataProvider.entrypoint] = metadataProvider;
}
}
Expand Down
5 changes: 1 addition & 4 deletions dwds/lib/src/utilities/dart_uri.dart
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,8 @@ class DartUri {

/// Record library and script uris to enable resolving library and script paths.
static Future<void> initialize() async {
final packagesUri =
p.toUri(p.join(currentDirectory, '.dart_tool/package_config.json'));

clear();
await _loadPackageConfig(packagesUri);
await _loadPackageConfig(p.toUri(globalLoadStrategy.packageConfigPath));
}

/// Clear the uri resolution tables.
Expand Down
2 changes: 1 addition & 1 deletion dwds/lib/src/version.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dwds/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: dwds
# Every time this changes you need to run `dart run build_runner build`.
version: 20.0.2-wip
version: 21.0.0-wip
description: >-
A service that proxies between the Chrome debug protocol and the Dart VM
service protocol.
Expand Down
7 changes: 6 additions & 1 deletion dwds/test/dart_uri_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
@TestOn('vm')
@Timeout(Duration(minutes: 2))

import 'package:dwds/asset_reader.dart';
import 'package:dwds/src/loaders/strategy.dart';
import 'package:dwds/src/utilities/dart_uri.dart';
import 'package:test/test.dart';
Expand All @@ -13,6 +14,10 @@ import 'package:test_common/logging.dart';
import 'fixtures/fakes.dart';

class TestStrategy extends FakeStrategy {
TestStrategy(
AssetReader assetReader,
) : super(assetReader);

@override
String? serverPathForAppUri(String appUrl) {
final appUri = Uri.parse(appUrl);
Expand All @@ -30,7 +35,7 @@ class TestStrategy extends FakeStrategy {
}

void main() {
globalLoadStrategy = TestStrategy();
globalLoadStrategy = TestStrategy(FakeAssetReader());
group('DartUri', () {
test('parses package : paths', () {
final uri = DartUri('package:path/path.dart');
Expand Down
7 changes: 6 additions & 1 deletion dwds/test/debugger_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
@Timeout(Duration(minutes: 2))
import 'dart:async';

import 'package:dwds/asset_reader.dart';
import 'package:dwds/src/debugging/debugger.dart';
import 'package:dwds/src/debugging/frame_computer.dart';
import 'package:dwds/src/debugging/inspector.dart';
Expand All @@ -29,6 +30,10 @@ late Locations locations;
late SkipLists skipLists;

class TestStrategy extends FakeStrategy {
TestStrategy(
AssetReader assetReader,
) : super(assetReader);

@override
Future<String> moduleForServerPath(String entrypoint, String appUri) async =>
'foo.ddc.js';
Expand Down Expand Up @@ -82,7 +87,7 @@ void main() async {
webkitDebugger = FakeWebkitDebugger(scripts: scripts);
pausedController = StreamController<DebuggerPausedEvent>();
webkitDebugger.onPaused = pausedController.stream;
globalLoadStrategy = TestStrategy();
globalLoadStrategy = TestStrategy(FakeAssetReader());
final root = 'fakeRoot';
locations = Locations(
FakeAssetReader(sourceMap: sourceMapContents),
Expand Down
4 changes: 2 additions & 2 deletions dwds/test/expression_evaluator_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ void main() async {
late StreamController<DebuggerPausedEvent> pausedController;
late StreamController<Event> debugEventController;
setUp(() async {
globalLoadStrategy = FakeStrategy();

final assetReader = FakeAssetReader(sourceMap: '');
globalLoadStrategy = FakeStrategy(assetReader);

final modules = FakeModules();

final webkitDebugger = FakeWebkitDebugger();
Expand Down
12 changes: 8 additions & 4 deletions dwds/test/fixtures/fakes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,11 @@ class FakeExecutionContext extends ExecutionContext {
FakeExecutionContext();
}

class FakeStrategy implements LoadStrategy {
class FakeStrategy extends LoadStrategy {
FakeStrategy(
AssetReader assetReader,
) : super(assetReader);

@override
Future<String> bootstrapFor(String entrypoint) async => 'dummy_bootstrap';

Expand All @@ -336,6 +340,9 @@ class FakeStrategy implements LoadStrategy {
@override
Uri? get appEntrypoint => Uri.parse('package:myapp/main.dart');

@override
String? packageConfigLocator(String entrypoint) => null;

@override
ReloadConfiguration get reloadConfiguration => ReloadConfiguration.none;

Expand Down Expand Up @@ -367,9 +374,6 @@ class FakeStrategy implements LoadStrategy {
MetadataProvider metadataProviderFor(String entrypoint) =>
MetadataProvider(entrypoint, FakeAssetReader());

@override
void trackEntrypoint(String entrypoint) {}

@override
Future<Map<String, ModuleInfo>> moduleInfoForEntrypoint(String entrypoint) =>
throw UnimplementedError();
Expand Down
2 changes: 1 addition & 1 deletion dwds/test/handlers/injector_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ void main() {
late HttpServer server;
const entryEtag = 'entry etag';
const nonEntryEtag = 'some etag';
final loadStrategy = FakeStrategy();
final loadStrategy = FakeStrategy(FakeAssetReader());

group('InjectedHandlerWithoutExtension', () {
late DwdsInjector injector;
Expand Down
68 changes: 68 additions & 0 deletions dwds/test/load_strategy_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// Copyright (c) 2023, 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.

@TestOn('vm')
@Timeout(Duration(minutes: 1))

import 'package:dwds/asset_reader.dart';
import 'package:path/path.dart' as p;
import 'package:test/test.dart';
import 'package:test_common/test_sdk_configuration.dart';

import 'fixtures/context.dart';
import 'fixtures/fakes.dart';
import 'fixtures/project.dart';

class LoadStrategyCustomPackageConfig extends FakeStrategy {
LoadStrategyCustomPackageConfig(
AssetReader assetReader,
) : super(assetReader);

@override
String? packageConfigLocator(String entrypoint) =>
'$entrypoint/custom/package_config/path';
}

void main() {
final provider = TestSdkConfigurationProvider();
tearDownAll(provider.dispose);

final context = TestContext(TestProject.testWithSoundNullSafety, provider);

setUpAll(() async {
await context.setUp();
});

tearDownAll(() async {
await context.tearDown();
});

group('Load Strategy', () {
group(
'When the packageConfigLocator does not specify a package config path',
() {
final strategy = FakeStrategy(FakeAssetReader());

test('defaults to "./dart_tool/packageconfig.json"', () {
strategy.trackEntrypoint('my_app/entrypoint');
expect(
p.split(strategy.packageConfigPath).join('/'),
endsWith('_testSound/.dart_tool/package_config.json'),
);
});
});

group('When the packageConfigLocator specifies a package config path', () {
final strategy = LoadStrategyCustomPackageConfig(FakeAssetReader());

test('uses the specified package config path', () {
strategy.trackEntrypoint('my_app/entrypoint');
expect(
strategy.packageConfigPath,
equals('my_app/entrypoint/custom/package_config/path'),
);
});
});
});
}
9 changes: 7 additions & 2 deletions dwds/test/location_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

@Timeout(Duration(minutes: 2))

import 'package:dwds/asset_reader.dart';
import 'package:dwds/src/debugging/location.dart';
import 'package:dwds/src/loaders/strategy.dart';
import 'package:dwds/src/utilities/dart_uri.dart';
Expand All @@ -23,10 +24,10 @@ void main() {
const lines = 100;
const lineLength = 150;

globalLoadStrategy = MockLoadStrategy();
final assetReader = FakeAssetReader(sourceMap: sourceMapContents);
globalLoadStrategy = MockLoadStrategy(assetReader);
final dartUri = DartUri('org-dartlang-app://web/main.dart');

final assetReader = FakeAssetReader(sourceMap: sourceMapContents);
final modules = FakeModules(module: _module);
final locations = Locations(assetReader, modules, '');
locations.initialize('fake_entrypoint');
Expand Down Expand Up @@ -183,6 +184,10 @@ const _serverPath = 'web/main.dart';
const _sourceMapPath = 'packages/module.js.map';

class MockLoadStrategy extends FakeStrategy {
MockLoadStrategy(
AssetReader assetReader,
) : super(assetReader);

@override
Future<String?> moduleForServerPath(
String entrypoint,
Expand Down
2 changes: 2 additions & 0 deletions dwds/test/metadata_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import 'package:dwds/src/debugging/metadata/module_metadata.dart';
import 'package:dwds/src/debugging/metadata/provider.dart';
import 'package:dwds/src/loaders/strategy.dart';
import 'package:test/test.dart';

import 'fixtures/fakes.dart';
Expand Down Expand Up @@ -40,6 +41,7 @@ const _fileUriMetadata =
'// intentionally empty: package blah has no dart sources';

void main() {
globalLoadStrategy = FakeStrategy(FakeAssetReader());
test('can parse metadata with empty sources', () async {
final provider = MetadataProvider(
'foo.bootstrap.js',
Expand Down
7 changes: 6 additions & 1 deletion dwds/test/skip_list_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

@Timeout(Duration(minutes: 2))

import 'package:dwds/asset_reader.dart';
import 'package:dwds/src/debugging/location.dart';
import 'package:dwds/src/debugging/skip_list.dart';
import 'package:dwds/src/loaders/strategy.dart';
Expand All @@ -14,14 +15,18 @@ import 'package:test/test.dart';
import 'fixtures/fakes.dart';

class TestStrategy extends FakeStrategy {
TestStrategy(
AssetReader assetReader,
) : super(assetReader);

@override
String serverPathForAppUri(String appUri) {
return 'foo';
}
}

void main() {
globalLoadStrategy = TestStrategy();
globalLoadStrategy = TestStrategy(FakeAssetReader());

late SkipLists skipLists;
final dartUri = DartUri('org-dartlang-app://web/main.dart');
Expand Down
2 changes: 1 addition & 1 deletion fixtures/_experimentSound/web/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ String testPattern(Object obj) {
}

String testPattern2() {
final dog = 'Prismo';
final dog = 'Prismo';
final cats = ['Garfield', 'Tom']; // Breakpoint: testPattern2Case1
final [firstCat, secondCat] = cats;
print(firstCat); // Breakpoint: testPattern2Case2
Expand Down

0 comments on commit b244b89

Please sign in to comment.