Skip to content

Commit e62668b

Browse files
committed
Remove package:cli_config & package:args dependencies in package:native_asset_cli
1 parent 3bbdcb2 commit e62668b

9 files changed

+226
-132
lines changed

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

+3-1
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

+1-2
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

+2-2
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';
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+
}
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

+17-25
Original file line numberDiff line numberDiff line change
@@ -100,37 +100,32 @@ final class BuildConfigImpl extends HookConfigImpl implements BuildConfig {
100100
_supportedAssetTypesBackwardsCompatibility(supportedAssetTypes),
101101
);
102102

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

122116
static const dependencyMetadataConfigKey = 'dependency_metadata';
123117

124118
static const linkingEnabledKey = 'linking_enabled';
125119

126-
static BuildConfigImpl _readFieldsFromConfig(Config config) {
120+
static BuildConfigImpl fromJson(Map<String, dynamic> config, {Uri? baseUri}) {
121+
baseUri ??= Uri.base;
127122
final dryRun = HookConfigImpl.parseDryRun(config) ?? false;
128123
final targetOS = HookConfigImpl.parseTargetOS(config);
129124
return BuildConfigImpl(
130-
outputDirectory: HookConfigImpl.parseOutDir(config),
131-
outputDirectoryShared: HookConfigImpl.parseOutDirShared(config),
125+
outputDirectory: HookConfigImpl.parseOutDir(baseUri, config),
126+
outputDirectoryShared: HookConfigImpl.parseOutDirShared(baseUri, config),
132127
packageName: HookConfigImpl.parsePackageName(config),
133-
packageRoot: HookConfigImpl.parsePackageRoot(config),
128+
packageRoot: HookConfigImpl.parsePackageRoot(baseUri, config),
134129
buildMode: HookConfigImpl.parseBuildMode(config, dryRun),
135130
targetOS: targetOS,
136131
targetArchitecture:
@@ -139,7 +134,7 @@ final class BuildConfigImpl extends HookConfigImpl implements BuildConfig {
139134
dependencyMetadata: parseDependencyMetadata(config),
140135
linkingEnabled: parseHasLinkPhase(config),
141136
version: HookConfigImpl.parseVersion(config),
142-
cCompiler: HookConfigImpl.parseCCompiler(config, dryRun),
137+
cCompiler: HookConfigImpl.parseCCompiler(baseUri, config, dryRun),
143138
supportedAssetTypes: HookConfigImpl.parseSupportedAssetTypes(config),
144139
targetAndroidNdkApi:
145140
HookConfigImpl.parseTargetAndroidNdkApi(config, dryRun, targetOS),
@@ -152,9 +147,9 @@ final class BuildConfigImpl extends HookConfigImpl implements BuildConfig {
152147
);
153148
}
154149

155-
static Map<String, Metadata>? parseDependencyMetadata(Config config) {
156-
final fileValue =
157-
config.valueOf<Map<Object?, Object?>?>(dependencyMetadataConfigKey);
150+
static Map<String, Metadata>? parseDependencyMetadata(
151+
Map<String, Object?> config) {
152+
final fileValue = config.optionalMap(dependencyMetadataConfigKey);
158153
if (fileValue == null) {
159154
return null;
160155
}
@@ -177,12 +172,9 @@ final class BuildConfigImpl extends HookConfigImpl implements BuildConfig {
177172
).sortOnKey();
178173
}
179174

180-
static bool? parseHasLinkPhase(Config config) =>
175+
static bool? parseHasLinkPhase(Map<String, Object?> config) =>
181176
config.optionalBool(linkingEnabledKey);
182177

183-
static BuildConfigImpl fromJson(Map<String, dynamic> buildConfigJson) =>
184-
BuildConfigImpl._fromConfig(Config(fileParsed: buildConfigJson));
185-
186178
@override
187179
Map<String, Object> toJson() => {
188180
...hookToJson(),

0 commit comments

Comments
 (0)