Skip to content

Allow client to specify how to find the package config #2199

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Aug 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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