Skip to content

Commit 40e0a3c

Browse files
authored
[native_assets_cli] Prevent non src imports from src (#2238)
1 parent dcc6fc9 commit 40e0a3c

30 files changed

+317
-112
lines changed

pkgs/code_assets/analysis_options.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ analyzer:
77
strict-casts: true
88
strict-inference: true
99
strict-raw-types: true
10+
plugins:
11+
- custom_lint
1012

1113
linter:
1214
rules:
@@ -15,3 +17,7 @@ linter:
1517
- prefer_expression_function_bodies
1618
- prefer_final_in_for_each
1719
- prefer_final_locals
20+
21+
custom_lint:
22+
rules:
23+
- avoid_import_outside_src

pkgs/code_assets/pubspec.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ dependencies:
1818
path: ../hooks/
1919

2020
dev_dependencies:
21+
custom_lint: ^0.7.5
2122
dart_flutter_team_lints: ^3.5.1
2223
json_schema: ^5.2.0
24+
repo_lint_rules:
25+
path: ../repo_lint_rules/
2326
test: ^1.25.15

pkgs/data_assets/analysis_options.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ analyzer:
77
strict-casts: true
88
strict-inference: true
99
strict-raw-types: true
10+
plugins:
11+
- custom_lint
1012

1113
linter:
1214
rules:
@@ -15,3 +17,7 @@ linter:
1517
- prefer_expression_function_bodies
1618
- prefer_final_in_for_each
1719
- prefer_final_locals
20+
21+
custom_lint:
22+
rules:
23+
- avoid_import_outside_src

pkgs/data_assets/pubspec.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ dependencies:
1818
path: ../hooks/
1919

2020
dev_dependencies:
21+
custom_lint: ^0.7.5
2122
dart_flutter_team_lints: ^3.5.1
2223
json_schema: ^5.2.0
24+
repo_lint_rules:
25+
path: ../repo_lint_rules/
2326
test: ^1.25.15

pkgs/hooks/analysis_options.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ analyzer:
77
strict-casts: true
88
strict-inference: true
99
strict-raw-types: true
10+
plugins:
11+
- custom_lint
1012

1113
linter:
1214
rules:
@@ -15,3 +17,8 @@ linter:
1517
- prefer_expression_function_bodies
1618
- prefer_final_in_for_each
1719
- prefer_final_locals
20+
21+
custom_lint:
22+
rules:
23+
- avoid_import_outside_src
24+

pkgs/hooks/pubspec.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ environment:
1010
sdk: '>=3.7.0 <4.0.0'
1111

1212
dev_dependencies:
13+
custom_lint: ^0.7.5
1314
dart_flutter_team_lints: ^3.5.1
1415
json_schema: ^5.2.0
1516
json_syntax_generator:
1617
path: ../json_syntax_generator/
1718
path: ^1.9.1
19+
repo_lint_rules:
20+
path: ../repo_lint_rules/
1821
test: ^1.25.15

pkgs/json_syntax_generator/analysis_options.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ analyzer:
77
strict-casts: true
88
strict-inference: true
99
strict-raw-types: true
10+
plugins:
11+
- custom_lint
1012

1113
linter:
1214
rules:
@@ -15,3 +17,7 @@ linter:
1517
- prefer_expression_function_bodies
1618
- prefer_final_in_for_each
1719
- prefer_final_locals
20+
21+
custom_lint:
22+
rules:
23+
- avoid_import_outside_src

pkgs/json_syntax_generator/pubspec.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ dependencies:
1818
json_schema: ^5.2.0
1919

2020
dev_dependencies:
21+
custom_lint: ^0.7.5
2122
dart_flutter_team_lints: ^3.5.1
2223
path: ^1.9.1
24+
repo_lint_rules:
25+
path: ../repo_lint_rules/
2326
test: ^1.25.15

pkgs/native_assets_builder/analysis_options.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ analyzer:
77
strict-casts: true
88
strict-inference: true
99
strict-raw-types: true
10+
plugins:
11+
- custom_lint
1012

1113
linter:
1214
rules:
@@ -15,3 +17,8 @@ linter:
1517
- prefer_expression_function_bodies
1618
- prefer_final_in_for_each
1719
- prefer_final_locals
20+
21+
custom_lint:
22+
rules:
23+
- avoid_import_outside_src
24+

pkgs/native_assets_builder/lib/src/model/hook_result.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import 'package:collection/collection.dart';
66
import 'package:native_assets_cli/native_assets_cli.dart';
77
import 'package:native_assets_cli/native_assets_cli_builder.dart';
88

9-
import '../../native_assets_builder.dart';
9+
import '../build_runner/build_runner.dart';
10+
import 'build_result.dart';
11+
import 'link_result.dart';
1012

1113
/// The result from a [NativeAssetsBuildRunner.build] or
1214
/// [NativeAssetsBuildRunner.link].

pkgs/native_assets_builder/lib/src/package_layout/package_layout.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import 'package:file/file.dart';
66
import 'package:package_config/package_config.dart';
77

8-
import '../../native_assets_builder.dart';
8+
import '../build_runner/build_runner.dart';
99

1010
/// Directory layout for dealing with native assets.
1111
///

pkgs/native_assets_builder/pubspec.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ dependencies:
2323
yaml_edit: ^2.2.2
2424

2525
dev_dependencies:
26+
custom_lint: ^0.7.5
2627
dart_flutter_team_lints: ^3.5.1
2728
file_testing: ^3.0.2
29+
repo_lint_rules:
30+
path: ../repo_lint_rules/
2831
test: ^1.25.15

pkgs/native_assets_cli/analysis_options.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ analyzer:
77
strict-casts: true
88
strict-inference: true
99
strict-raw-types: true
10+
plugins:
11+
- custom_lint
1012

1113
linter:
1214
rules:
@@ -15,3 +17,7 @@ linter:
1517
- prefer_expression_function_bodies
1618
- prefer_final_in_for_each
1719
- prefer_final_locals
20+
21+
custom_lint:
22+
rules:
23+
- avoid_import_outside_src
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Copyright (c) 2025, 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+
// expect_lint: avoid_import_outside_src
6+
import '../native_assets_cli.dart';
7+
8+
const x = Builder;

pkgs/native_assets_cli/lib/src/code_assets/c_compiler_config.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
import 'package:collection/collection.dart';
66

7-
import '../../code_assets.dart';
7+
import 'config.dart';
8+
import 'os.dart';
89
import 'syntax.g.dart' as syntax;
910

1011
/// The configuration for a C toolchain.

pkgs/native_assets_cli/lib/src/code_assets/testing.dart

+9-5
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44

55
import 'dart:async';
66

7-
import '../../code_assets.dart';
8-
import '../../code_assets_builder.dart';
9-
import '../../native_assets_cli.dart';
10-
import '../../native_assets_cli_builder.dart';
11-
import '../../test.dart';
7+
import '../config.dart';
8+
import '../test.dart';
129
import '../validation.dart';
10+
import 'architecture.dart';
11+
import 'c_compiler_config.dart';
12+
import 'config.dart';
13+
import 'extension.dart';
14+
import 'ios_sdk.dart';
15+
import 'link_mode_preference.dart';
16+
import 'os.dart';
1317

1418
/// Validate a code build hook; this will throw an exception on validation
1519
/// errors.

pkgs/native_assets_cli/lib/src/data_assets/validation.dart

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44

55
import 'dart:io';
66

7-
import '../../data_assets.dart';
8-
import '../../native_assets_cli.dart';
9-
import '../../native_assets_cli_builder.dart';
7+
import '../config.dart';
8+
import '../encoded_asset.dart';
9+
import '../extension.dart';
10+
import 'data_asset.dart';
1011
import 'syntax.g.dart' as syntax;
1112

1213
Future<ValidationErrors> validateDataAssetBuildInput(BuildInput input) async =>
+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// Copyright (c) 2024, 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+
import 'dart:async';
6+
import 'dart:convert';
7+
import 'dart:io';
8+
9+
import 'package:yaml/yaml.dart';
10+
11+
import 'config.dart';
12+
import 'validation.dart';
13+
14+
/// Validate a build hook; this will throw an exception on validation errors.
15+
///
16+
/// This is intended to be used from tests, e.g.:
17+
///
18+
/// ```
19+
/// test('test my build hook', () async {
20+
/// await testCodeBuildHook(
21+
/// ...
22+
/// );
23+
/// });
24+
/// ```
25+
Future<void> testBuildHook({
26+
required void Function(BuildInputBuilder) extraInputSetup,
27+
required FutureOr<void> Function(List<String> arguments) mainMethod,
28+
required FutureOr<void> Function(BuildInput input, BuildOutput output) check,
29+
bool? linkingEnabled,
30+
}) async {
31+
const keepTempKey = 'KEEP_TEMPORARY_DIRECTORIES';
32+
33+
final tempDir = await Directory.systemTemp.createTemp();
34+
35+
try {
36+
// Deal with Windows temp folder aliases.
37+
final tempUri = Directory(
38+
await tempDir.resolveSymbolicLinks(),
39+
).uri.normalizePath();
40+
final outputDirectory = tempUri.resolve('output/');
41+
final outputDirectoryShared = tempUri.resolve('output_shared/');
42+
final outputFile = tempUri.resolve('output.json');
43+
44+
await Directory.fromUri(outputDirectory).create();
45+
await Directory.fromUri(outputDirectoryShared).create();
46+
47+
final inputBuilder = BuildInputBuilder();
48+
inputBuilder
49+
..setupShared(
50+
packageRoot: Directory.current.uri,
51+
packageName: _readPackageNameFromPubspec(),
52+
outputFile: outputFile,
53+
outputDirectoryShared: outputDirectoryShared,
54+
)
55+
..config.setupBuild(linkingEnabled: true);
56+
extraInputSetup(inputBuilder);
57+
58+
final input = BuildInput(inputBuilder.json);
59+
60+
final inputUri = tempUri.resolve('input.json');
61+
_writeJsonTo(inputUri, input.json);
62+
await mainMethod(['--config=${inputUri.toFilePath()}']);
63+
final output = BuildOutput(_readJsonFrom(input.outputFile));
64+
65+
// Test conformance of protocol invariants.
66+
final validationErrors = await validateBuildOutput(input, output);
67+
if (validationErrors.isNotEmpty) {
68+
throw ValidationFailure(
69+
'encountered build output validation issues: $validationErrors',
70+
);
71+
}
72+
73+
// Run user-defined tests.
74+
await check(input, output);
75+
} finally {
76+
final keepTempDir = (Platform.environment[keepTempKey] ?? '').isNotEmpty;
77+
if (!keepTempDir) {
78+
tempDir.deleteSync(recursive: true);
79+
} else {
80+
print('$keepTempKey ${tempDir.uri}');
81+
}
82+
}
83+
}
84+
85+
void _writeJsonTo(Uri uri, Map<String, Object?> json) {
86+
final encoder = const JsonEncoder().fuse(const Utf8Encoder());
87+
File.fromUri(uri).writeAsBytesSync(encoder.convert(json));
88+
}
89+
90+
Map<String, Object?> _readJsonFrom(Uri uri) {
91+
final decoder = const Utf8Decoder().fuse(const JsonDecoder());
92+
final bytes = File.fromUri(uri).readAsBytesSync();
93+
return decoder.convert(bytes) as Map<String, Object?>;
94+
}
95+
96+
String _readPackageNameFromPubspec() {
97+
final uri = Directory.current.uri.resolve('pubspec.yaml');
98+
final readAsString = File.fromUri(uri).readAsStringSync();
99+
final yaml = loadYaml(readAsString) as YamlMap;
100+
return yaml['name'] as String;
101+
}

pkgs/native_assets_cli/lib/src/validation.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
import 'dart:io';
66

7-
import '../native_assets_cli.dart';
8-
import '../native_assets_cli_builder.dart';
7+
import 'config.dart';
8+
import 'encoded_asset.dart';
99
import 'hooks/syntax.g.dart' as syntax;
1010

1111
typedef ValidationErrors = List<String>;

0 commit comments

Comments
 (0)