Skip to content

Commit b07575d

Browse files
committed
Remove package:cli_config & package:args dependencies in package:native_asset_cli
1 parent 54279dd commit b07575d

File tree

9 files changed

+226
-132
lines changed

9 files changed

+226
-132
lines changed

pkgs/native_assets_cli/lib/src/api/build_config.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:convert';
56
import 'dart:io';
67

7-
import 'package:cli_config/cli_config.dart';
88
import 'package:collection/collection.dart';
99
import 'package:pub_semver/pub_semver.dart';
1010

11+
import '../args_parser.dart';
12+
import '../json_utils.dart';
1113
import '../model/hook.dart';
1214
import '../model/metadata.dart';
1315
import '../utils/json.dart';

pkgs/native_assets_cli/lib/src/api/hook_config.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import 'dart:convert';
66
import 'dart:io';
77

8-
import 'package:cli_config/cli_config.dart';
98
import 'package:collection/collection.dart';
109
import 'package:crypto/crypto.dart';
1110
import 'package:pub_semver/pub_semver.dart';
1211

12+
import '../json_utils.dart';
1313
import '../model/hook.dart';
1414
import '../model/metadata.dart';
1515
import '../model/target.dart';
@@ -22,7 +22,6 @@ import 'ios_sdk.dart';
2222
import 'link_config.dart';
2323
import 'link_mode_preference.dart';
2424
import 'os.dart';
25-
2625
part '../model/hook_config.dart';
2726

2827
/// The shared properties of a [LinkConfig] and a [BuildConfig].

pkgs/native_assets_cli/lib/src/api/link_config.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
import 'dart:convert';
55
import 'dart:io';
66

7-
import 'package:args/args.dart';
8-
import 'package:cli_config/cli_config.dart';
97
import 'package:collection/collection.dart';
108
import 'package:meta/meta.dart';
119
import 'package:pub_semver/pub_semver.dart';
1210

11+
import '../args_parser.dart';
12+
import '../json_utils.dart';
1313
import '../model/hook.dart';
1414
import '../utils/map.dart';
1515
import 'architecture.dart';
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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+
String getConfigArgument(List<String> arguments) {
6+
for (var i = 0; i < arguments.length; ++i) {
7+
final argument = arguments[i];
8+
if (argument.startsWith('--config=')) {
9+
return argument.substring('--config='.length);
10+
}
11+
if (argument == '--config') {
12+
if ((i + 1) < arguments.length) {
13+
return arguments[i + 1];
14+
}
15+
}
16+
}
17+
throw StateError('No --config argument given.');
18+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
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:core';
6+
import 'dart:core' as core;
7+
import 'dart:io';
8+
9+
extension JsonUtils on Map<String, Object?> {
10+
String string(String key, {Iterable<String>? validValues}) {
11+
final value = get<String>(key);
12+
if (validValues != null && !validValues.contains(value)) {
13+
throw FormatException('Json "$key" had value $value but expected one of '
14+
'${validValues.join(',')}');
15+
}
16+
return value;
17+
}
18+
19+
String? optionalString(String key) => getOptional<String>(key);
20+
21+
bool? optionalBool(String key) => getOptional<bool>(key);
22+
core.int int(String key) => get<core.int>(key);
23+
core.int? optionalInt(String key) => getOptional<core.int>(key);
24+
25+
Uri path(String key,
26+
{required Uri baseUri,
27+
bool resolveUri = true,
28+
bool mustExist = false}) =>
29+
_pathToUri(get<String>(key), baseUri: baseUri, resolveUri: resolveUri);
30+
31+
Uri? optionalPath(String key,
32+
{required Uri baseUri, bool resolveUri = true, bool mustExist = false}) {
33+
final value = getOptional<String>(key);
34+
if (value == null) return null;
35+
final uri = _pathToUri(value, baseUri: baseUri, resolveUri: resolveUri);
36+
if (mustExist) {
37+
_throwIfNotExists(key, uri);
38+
}
39+
return uri;
40+
}
41+
42+
List<String>? optionalStringList(String key) {
43+
final value = getOptional<List<Object?>>(key);
44+
if (value == null) return null;
45+
return value.cast<String>();
46+
}
47+
48+
List<Object?> list(String key) => get<List<Object?>>(key);
49+
List<Object?>? optionalList(String key) => getOptional<List<Object?>>(key);
50+
Map<String, Object?>? optionalMap(String key) =>
51+
getOptional<Map<String, Object?>>(key);
52+
53+
T get<T extends Object>(String key) {
54+
final value = this[key];
55+
if (value == null) {
56+
throw FormatException('No value was provided for required key: $key');
57+
}
58+
if (value is T) return value;
59+
throw FormatException(
60+
'Unexpected value \'$value\' for key \'.$key\' in config file. '
61+
'Expected a $T.');
62+
}
63+
64+
T? getOptional<T extends Object>(String key) {
65+
final value = this[key];
66+
if (value is T?) return value;
67+
throw FormatException(
68+
'Unexpected value \'$value\' for key \'.$key\' in config file. '
69+
'Expected a $T?.');
70+
}
71+
}
72+
73+
Uri _pathToUri(
74+
String path, {
75+
required core.bool resolveUri,
76+
required Uri? baseUri,
77+
}) {
78+
final uri = _fileSystemPathToUri(path);
79+
if (resolveUri && baseUri != null) {
80+
return baseUri.resolveUri(uri);
81+
}
82+
return uri;
83+
}
84+
85+
void _throwIfNotExists(String key, Uri value) {
86+
final fileSystemEntity = value.fileSystemEntity;
87+
if (!fileSystemEntity.existsSync()) {
88+
throw FormatException("Path '$value' for key '$key' doesn't exist.");
89+
}
90+
}
91+
92+
extension on Uri {
93+
FileSystemEntity get fileSystemEntity {
94+
if (path.endsWith(Platform.pathSeparator) || path.endsWith('/')) {
95+
return Directory.fromUri(this);
96+
}
97+
return File.fromUri(this);
98+
}
99+
}
100+
101+
Uri _fileSystemPathToUri(String path) {
102+
if (path.endsWith(Platform.pathSeparator)) {
103+
return Uri.directory(path);
104+
}
105+
return Uri.file(path);
106+
}

pkgs/native_assets_cli/lib/src/model/build_config.dart

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -97,37 +97,32 @@ final class BuildConfigImpl extends HookConfigImpl implements BuildConfig {
9797
_supportedAssetTypesBackwardsCompatibility(supportedAssetTypes),
9898
);
9999

100-
factory BuildConfigImpl._fromConfig(Config config) =>
101-
_readFieldsFromConfig(config);
102-
103100
static BuildConfigImpl fromArguments(
104-
List<String> args, {
101+
List<String> arguments, {
105102
Map<String, String>? environment,
106103
Uri? workingDirectory,
107104
}) {
108-
// TODO(https://github.com/dart-lang/native/issues/1000): At some point,
109-
// migrate away from package:cli_config, to get rid of package:yaml
110-
// dependency.
111-
final config = Config.fromArgumentsSync(
112-
arguments: args,
113-
environment: environment,
114-
workingDirectory: workingDirectory,
115-
);
116-
return BuildConfigImpl._fromConfig(config);
105+
final configPath = getConfigArgument(arguments);
106+
final bytes = File(configPath).readAsBytesSync();
107+
final linkConfigJson = const Utf8Decoder()
108+
.fuse(const JsonDecoder())
109+
.convert(bytes) as Map<String, Object?>;
110+
return fromJson(linkConfigJson, baseUri: Uri.parse(configPath));
117111
}
118112

119113
static const dependencyMetadataConfigKey = 'dependency_metadata';
120114

121115
static const linkingEnabledKey = 'linking_enabled';
122116

123-
static BuildConfigImpl _readFieldsFromConfig(Config config) {
117+
static BuildConfigImpl fromJson(Map<String, dynamic> config, {Uri? baseUri}) {
118+
baseUri ??= Uri.base;
124119
final dryRun = HookConfigImpl.parseDryRun(config) ?? false;
125120
final targetOS = HookConfigImpl.parseTargetOS(config);
126121
return BuildConfigImpl(
127-
outputDirectory: HookConfigImpl.parseOutDir(config),
128-
outputDirectoryShared: HookConfigImpl.parseOutDirShared(config),
122+
outputDirectory: HookConfigImpl.parseOutDir(baseUri, config),
123+
outputDirectoryShared: HookConfigImpl.parseOutDirShared(baseUri, config),
129124
packageName: HookConfigImpl.parsePackageName(config),
130-
packageRoot: HookConfigImpl.parsePackageRoot(config),
125+
packageRoot: HookConfigImpl.parsePackageRoot(baseUri, config),
131126
buildMode: HookConfigImpl.parseBuildMode(config, dryRun),
132127
targetOS: targetOS,
133128
targetArchitecture:
@@ -136,7 +131,7 @@ final class BuildConfigImpl extends HookConfigImpl implements BuildConfig {
136131
dependencyMetadata: parseDependencyMetadata(config),
137132
linkingEnabled: parseHasLinkPhase(config),
138133
version: HookConfigImpl.parseVersion(config),
139-
cCompiler: HookConfigImpl.parseCCompiler(config, dryRun),
134+
cCompiler: HookConfigImpl.parseCCompiler(baseUri, config, dryRun),
140135
supportedAssetTypes: HookConfigImpl.parseSupportedAssetTypes(config),
141136
targetAndroidNdkApi:
142137
HookConfigImpl.parseTargetAndroidNdkApi(config, dryRun, targetOS),
@@ -149,9 +144,9 @@ final class BuildConfigImpl extends HookConfigImpl implements BuildConfig {
149144
);
150145
}
151146

152-
static Map<String, Metadata>? parseDependencyMetadata(Config config) {
153-
final fileValue =
154-
config.valueOf<Map<Object?, Object?>?>(dependencyMetadataConfigKey);
147+
static Map<String, Metadata>? parseDependencyMetadata(
148+
Map<String, Object?> config) {
149+
final fileValue = config.optionalMap(dependencyMetadataConfigKey);
155150
if (fileValue == null) {
156151
return null;
157152
}
@@ -174,12 +169,9 @@ final class BuildConfigImpl extends HookConfigImpl implements BuildConfig {
174169
).sortOnKey();
175170
}
176171

177-
static bool? parseHasLinkPhase(Config config) =>
172+
static bool? parseHasLinkPhase(Map<String, Object?> config) =>
178173
config.optionalBool(linkingEnabledKey);
179174

180-
static BuildConfigImpl fromJson(Map<String, dynamic> buildConfigJson) =>
181-
BuildConfigImpl._fromConfig(Config(fileParsed: buildConfigJson));
182-
183175
@override
184176
Map<String, Object> toJson() => {
185177
...hookToJson(),

0 commit comments

Comments
 (0)