Skip to content

Commit b244b89

Browse files
authored
Allow client to specify how to find the package config (#2199)
1 parent fc876cb commit b244b89

17 files changed

+160
-20
lines changed

dwds/CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
## 20.0.2-wip
1+
## 21.0.0-wip
2+
3+
**Breaking changes**
4+
5+
- Allow clients to specify where to find the package config. - [#2199](https://github.com/dart-lang/webdev/pull/2199).
26

37
## 20.0.1
48

dwds/lib/src/loaders/legacy.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,16 @@ class LegacyStrategy extends LoadStrategy {
6666
/// an app URI.
6767
final String? Function(String appUri) _serverPathForAppUri;
6868

69+
/// Returns the absolute path to the app's package config, determined by the
70+
/// app's [entrypoint] path.
71+
///
72+
/// Example:
73+
///
74+
/// main_module.bootstrap.js
75+
/// -> /Users/john_doe/my_dart_app/.dart_tool/package_config.json
76+
///
77+
final String? Function(String entrypoint) _packageConfigLocator;
78+
6979
final Uri? _appEntrypoint;
7080

7181
LegacyStrategy(
@@ -77,6 +87,7 @@ class LegacyStrategy extends LoadStrategy {
7787
this._moduleInfoForProvider,
7888
AssetReader assetReader,
7989
this._appEntrypoint,
90+
this._packageConfigLocator,
8091
) : super(assetReader);
8192

8293
@override
@@ -122,4 +133,8 @@ class LegacyStrategy extends LoadStrategy {
122133

123134
@override
124135
Uri? get appEntrypoint => _appEntrypoint;
136+
137+
@override
138+
String? packageConfigLocator(String entrypoint) =>
139+
_packageConfigLocator(entrypoint);
125140
}

dwds/lib/src/loaders/require.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,4 +283,7 @@ if(!window.\$requireLoader) {
283283
@override
284284
Future<Map<String, ModuleInfo>> moduleInfoForEntrypoint(String entrypoint) =>
285285
_moduleInfoForProvider(metadataProviderFor(entrypoint));
286+
287+
@override
288+
String? packageConfigLocator(String entrypoint) => null;
286289
}

dwds/lib/src/loaders/strategy.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import 'package:dwds/src/debugging/metadata/provider.dart';
66
import 'package:dwds/src/readers/asset_reader.dart';
77
import 'package:dwds/src/services/expression_compiler.dart';
8+
import 'package:dwds/src/utilities/dart_uri.dart';
9+
import 'package:path/path.dart' as p;
810
import 'package:shelf/shelf.dart';
911

1012
late LoadStrategy _globalLoadStrategy;
@@ -16,6 +18,7 @@ LoadStrategy get globalLoadStrategy => _globalLoadStrategy;
1618
abstract class LoadStrategy {
1719
final AssetReader _assetReader;
1820
final _providers = <String, MetadataProvider>{};
21+
String? _packageConfigPath;
1922

2023
LoadStrategy(this._assetReader);
2124

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

109+
/// Returns the absolute path to the app's package config, determined by the
110+
/// app's [entrypoint] path.
111+
///
112+
/// Example:
113+
///
114+
/// main_module.bootstrap.js
115+
/// -> /Users/john_doe/my_dart_app/.dart_tool/package_config.json
116+
///
117+
String? packageConfigLocator(String entrypoint);
118+
119+
/// The absolute path to the app's package config, or null if not provided by
120+
/// [packageConfigLocator].
121+
String get packageConfigPath {
122+
return _packageConfigPath ?? _defaultPackageConfigPath;
123+
}
124+
125+
/// The default package config path, if none is provided by the load strategy.
126+
String get _defaultPackageConfigPath => p.join(
127+
DartUri.currentDirectory,
128+
'.dart_tool',
129+
'package_config.json',
130+
);
131+
106132
/// Returns the [MetadataProvider] for the application located at the provided
107133
/// [entrypoint].
108134
MetadataProvider metadataProviderFor(String entrypoint) {
@@ -117,6 +143,7 @@ abstract class LoadStrategy {
117143
/// provided [entrypoint].
118144
void trackEntrypoint(String entrypoint) {
119145
final metadataProvider = MetadataProvider(entrypoint, _assetReader);
146+
_packageConfigPath = packageConfigLocator(entrypoint);
120147
_providers[metadataProvider.entrypoint] = metadataProvider;
121148
}
122149
}

dwds/lib/src/utilities/dart_uri.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,8 @@ class DartUri {
151151

152152
/// Record library and script uris to enable resolving library and script paths.
153153
static Future<void> initialize() async {
154-
final packagesUri =
155-
p.toUri(p.join(currentDirectory, '.dart_tool/package_config.json'));
156-
157154
clear();
158-
await _loadPackageConfig(packagesUri);
155+
await _loadPackageConfig(p.toUri(globalLoadStrategy.packageConfigPath));
159156
}
160157

161158
/// Clear the uri resolution tables.

dwds/lib/src/version.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dwds/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: dwds
22
# Every time this changes you need to run `dart run build_runner build`.
3-
version: 20.0.2-wip
3+
version: 21.0.0-wip
44
description: >-
55
A service that proxies between the Chrome debug protocol and the Dart VM
66
service protocol.

dwds/test/dart_uri_test.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
@TestOn('vm')
66
@Timeout(Duration(minutes: 2))
77

8+
import 'package:dwds/asset_reader.dart';
89
import 'package:dwds/src/loaders/strategy.dart';
910
import 'package:dwds/src/utilities/dart_uri.dart';
1011
import 'package:test/test.dart';
@@ -13,6 +14,10 @@ import 'package:test_common/logging.dart';
1314
import 'fixtures/fakes.dart';
1415

1516
class TestStrategy extends FakeStrategy {
17+
TestStrategy(
18+
AssetReader assetReader,
19+
) : super(assetReader);
20+
1621
@override
1722
String? serverPathForAppUri(String appUrl) {
1823
final appUri = Uri.parse(appUrl);
@@ -30,7 +35,7 @@ class TestStrategy extends FakeStrategy {
3035
}
3136

3237
void main() {
33-
globalLoadStrategy = TestStrategy();
38+
globalLoadStrategy = TestStrategy(FakeAssetReader());
3439
group('DartUri', () {
3540
test('parses package : paths', () {
3641
final uri = DartUri('package:path/path.dart');

dwds/test/debugger_test.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@Timeout(Duration(minutes: 2))
77
import 'dart:async';
88

9+
import 'package:dwds/asset_reader.dart';
910
import 'package:dwds/src/debugging/debugger.dart';
1011
import 'package:dwds/src/debugging/frame_computer.dart';
1112
import 'package:dwds/src/debugging/inspector.dart';
@@ -29,6 +30,10 @@ late Locations locations;
2930
late SkipLists skipLists;
3031

3132
class TestStrategy extends FakeStrategy {
33+
TestStrategy(
34+
AssetReader assetReader,
35+
) : super(assetReader);
36+
3237
@override
3338
Future<String> moduleForServerPath(String entrypoint, String appUri) async =>
3439
'foo.ddc.js';
@@ -82,7 +87,7 @@ void main() async {
8287
webkitDebugger = FakeWebkitDebugger(scripts: scripts);
8388
pausedController = StreamController<DebuggerPausedEvent>();
8489
webkitDebugger.onPaused = pausedController.stream;
85-
globalLoadStrategy = TestStrategy();
90+
globalLoadStrategy = TestStrategy(FakeAssetReader());
8691
final root = 'fakeRoot';
8792
locations = Locations(
8893
FakeAssetReader(sourceMap: sourceMapContents),

dwds/test/expression_evaluator_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ void main() async {
3535
late StreamController<DebuggerPausedEvent> pausedController;
3636
late StreamController<Event> debugEventController;
3737
setUp(() async {
38-
globalLoadStrategy = FakeStrategy();
39-
4038
final assetReader = FakeAssetReader(sourceMap: '');
39+
globalLoadStrategy = FakeStrategy(assetReader);
40+
4141
final modules = FakeModules();
4242

4343
final webkitDebugger = FakeWebkitDebugger();

dwds/test/fixtures/fakes.dart

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,11 @@ class FakeExecutionContext extends ExecutionContext {
311311
FakeExecutionContext();
312312
}
313313

314-
class FakeStrategy implements LoadStrategy {
314+
class FakeStrategy extends LoadStrategy {
315+
FakeStrategy(
316+
AssetReader assetReader,
317+
) : super(assetReader);
318+
315319
@override
316320
Future<String> bootstrapFor(String entrypoint) async => 'dummy_bootstrap';
317321

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

343+
@override
344+
String? packageConfigLocator(String entrypoint) => null;
345+
339346
@override
340347
ReloadConfiguration get reloadConfiguration => ReloadConfiguration.none;
341348

@@ -367,9 +374,6 @@ class FakeStrategy implements LoadStrategy {
367374
MetadataProvider metadataProviderFor(String entrypoint) =>
368375
MetadataProvider(entrypoint, FakeAssetReader());
369376

370-
@override
371-
void trackEntrypoint(String entrypoint) {}
372-
373377
@override
374378
Future<Map<String, ModuleInfo>> moduleInfoForEntrypoint(String entrypoint) =>
375379
throw UnimplementedError();

dwds/test/handlers/injector_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ void main() {
1919
late HttpServer server;
2020
const entryEtag = 'entry etag';
2121
const nonEntryEtag = 'some etag';
22-
final loadStrategy = FakeStrategy();
22+
final loadStrategy = FakeStrategy(FakeAssetReader());
2323

2424
group('InjectedHandlerWithoutExtension', () {
2525
late DwdsInjector injector;

dwds/test/load_strategy_test.dart

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
@TestOn('vm')
6+
@Timeout(Duration(minutes: 1))
7+
8+
import 'package:dwds/asset_reader.dart';
9+
import 'package:path/path.dart' as p;
10+
import 'package:test/test.dart';
11+
import 'package:test_common/test_sdk_configuration.dart';
12+
13+
import 'fixtures/context.dart';
14+
import 'fixtures/fakes.dart';
15+
import 'fixtures/project.dart';
16+
17+
class LoadStrategyCustomPackageConfig extends FakeStrategy {
18+
LoadStrategyCustomPackageConfig(
19+
AssetReader assetReader,
20+
) : super(assetReader);
21+
22+
@override
23+
String? packageConfigLocator(String entrypoint) =>
24+
'$entrypoint/custom/package_config/path';
25+
}
26+
27+
void main() {
28+
final provider = TestSdkConfigurationProvider();
29+
tearDownAll(provider.dispose);
30+
31+
final context = TestContext(TestProject.testWithSoundNullSafety, provider);
32+
33+
setUpAll(() async {
34+
await context.setUp();
35+
});
36+
37+
tearDownAll(() async {
38+
await context.tearDown();
39+
});
40+
41+
group('Load Strategy', () {
42+
group(
43+
'When the packageConfigLocator does not specify a package config path',
44+
() {
45+
final strategy = FakeStrategy(FakeAssetReader());
46+
47+
test('defaults to "./dart_tool/packageconfig.json"', () {
48+
strategy.trackEntrypoint('my_app/entrypoint');
49+
expect(
50+
p.split(strategy.packageConfigPath).join('/'),
51+
endsWith('_testSound/.dart_tool/package_config.json'),
52+
);
53+
});
54+
});
55+
56+
group('When the packageConfigLocator specifies a package config path', () {
57+
final strategy = LoadStrategyCustomPackageConfig(FakeAssetReader());
58+
59+
test('uses the specified package config path', () {
60+
strategy.trackEntrypoint('my_app/entrypoint');
61+
expect(
62+
strategy.packageConfigPath,
63+
equals('my_app/entrypoint/custom/package_config/path'),
64+
);
65+
});
66+
});
67+
});
68+
}

dwds/test/location_test.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
@Timeout(Duration(minutes: 2))
66

7+
import 'package:dwds/asset_reader.dart';
78
import 'package:dwds/src/debugging/location.dart';
89
import 'package:dwds/src/loaders/strategy.dart';
910
import 'package:dwds/src/utilities/dart_uri.dart';
@@ -23,10 +24,10 @@ void main() {
2324
const lines = 100;
2425
const lineLength = 150;
2526

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

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

185186
class MockLoadStrategy extends FakeStrategy {
187+
MockLoadStrategy(
188+
AssetReader assetReader,
189+
) : super(assetReader);
190+
186191
@override
187192
Future<String?> moduleForServerPath(
188193
String entrypoint,

dwds/test/metadata_test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import 'package:dwds/src/debugging/metadata/module_metadata.dart';
88
import 'package:dwds/src/debugging/metadata/provider.dart';
9+
import 'package:dwds/src/loaders/strategy.dart';
910
import 'package:test/test.dart';
1011

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

4243
void main() {
44+
globalLoadStrategy = FakeStrategy(FakeAssetReader());
4345
test('can parse metadata with empty sources', () async {
4446
final provider = MetadataProvider(
4547
'foo.bootstrap.js',

dwds/test/skip_list_test.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
@Timeout(Duration(minutes: 2))
66

7+
import 'package:dwds/asset_reader.dart';
78
import 'package:dwds/src/debugging/location.dart';
89
import 'package:dwds/src/debugging/skip_list.dart';
910
import 'package:dwds/src/loaders/strategy.dart';
@@ -14,14 +15,18 @@ import 'package:test/test.dart';
1415
import 'fixtures/fakes.dart';
1516

1617
class TestStrategy extends FakeStrategy {
18+
TestStrategy(
19+
AssetReader assetReader,
20+
) : super(assetReader);
21+
1722
@override
1823
String serverPathForAppUri(String appUri) {
1924
return 'foo';
2025
}
2126
}
2227

2328
void main() {
24-
globalLoadStrategy = TestStrategy();
29+
globalLoadStrategy = TestStrategy(FakeAssetReader());
2530

2631
late SkipLists skipLists;
2732
final dartUri = DartUri('org-dartlang-app://web/main.dart');

fixtures/_experimentSound/web/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ String testPattern(Object obj) {
6767
}
6868

6969
String testPattern2() {
70-
final dog = 'Prismo';
70+
final dog = 'Prismo';
7171
final cats = ['Garfield', 'Tom']; // Breakpoint: testPattern2Case1
7272
final [firstCat, secondCat] = cats;
7373
print(firstCat); // Breakpoint: testPattern2Case2

0 commit comments

Comments
 (0)