mirror of
https://github.com/chenasraf/dart_script_runner.git
synced 2026-05-17 17:48:03 +00:00
fix: null shell config
feat: improve errors
This commit is contained in:
17
.vscode/launch.json
vendored
Normal file
17
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "script_runner",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "${workspaceRoot}/bin/script_runner.dart",
|
||||
"args": [
|
||||
"echo1"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,3 +1,8 @@
|
||||
## 0.1.7
|
||||
|
||||
- Fix error when not supplying shell in config
|
||||
- Improve errors for bad configurations
|
||||
|
||||
## 0.1.6
|
||||
|
||||
- Code improvements
|
||||
|
||||
@@ -98,8 +98,13 @@ class ScriptRunnerConfig {
|
||||
}
|
||||
final pubspec = await file.readAsString();
|
||||
final yaml.YamlMap contents = yaml.loadYaml(pubspec);
|
||||
final yaml.YamlMap? conf = contents['script_runner'];
|
||||
return conf;
|
||||
try {
|
||||
final yaml.YamlMap? conf = contents['script_runner'];
|
||||
return conf;
|
||||
} catch (e) {
|
||||
throw StateError(
|
||||
'Expected YamlMap in pubspec.yaml under script_runner key, got: ${contents['script_runner'].runtimeType}');
|
||||
}
|
||||
}
|
||||
|
||||
static Future<yaml.YamlMap?>? _getCustomConfig(FileSystem fileSystem) async {
|
||||
@@ -110,8 +115,13 @@ class ScriptRunnerConfig {
|
||||
return null;
|
||||
}
|
||||
final pubspec = await file.readAsString();
|
||||
final yaml.YamlMap? conf = yaml.loadYaml(pubspec);
|
||||
return conf;
|
||||
try {
|
||||
final yaml.YamlMap? conf = yaml.loadYaml(pubspec);
|
||||
return conf;
|
||||
} catch (e) {
|
||||
throw StateError(
|
||||
'Expected YamlMap in pubspec.yaml under script_runner key, got: ${yaml.loadYaml(pubspec).runtimeType}');
|
||||
}
|
||||
}
|
||||
|
||||
static List<RunnableScript> _parseScriptsList(
|
||||
@@ -166,20 +176,28 @@ class ScriptRunnerShellConfig {
|
||||
this.linux,
|
||||
});
|
||||
|
||||
/// Parses a shell configuration from a YAML map, dart map or string.
|
||||
/// Parses a shell configuration from a [YamlMap], [Map] or [String].
|
||||
/// Other types will throw a [StateError].
|
||||
factory ScriptRunnerShellConfig.parse(dynamic obj) {
|
||||
if (obj is String) {
|
||||
return ScriptRunnerShellConfig(defaultShell: obj);
|
||||
try {
|
||||
if (obj is String) {
|
||||
return ScriptRunnerShellConfig(defaultShell: obj);
|
||||
}
|
||||
if (obj is yaml.YamlMap || obj is Map) {
|
||||
return ScriptRunnerShellConfig(
|
||||
defaultShell: obj['default'],
|
||||
windows: obj['windows'],
|
||||
macos: obj['macos'],
|
||||
linux: obj['linux'],
|
||||
);
|
||||
}
|
||||
if (obj == null) {
|
||||
return ScriptRunnerShellConfig();
|
||||
}
|
||||
throw StateError('Invalid shell config: $obj');
|
||||
} catch (e) {
|
||||
throw StateError('Error while parsing config: $obj');
|
||||
}
|
||||
if (obj is yaml.YamlMap || obj is Map) {
|
||||
return ScriptRunnerShellConfig(
|
||||
defaultShell: obj['default'],
|
||||
windows: obj['windows'],
|
||||
macos: obj['macos'],
|
||||
linux: obj['linux'],
|
||||
);
|
||||
}
|
||||
throw StateError('Invalid shell config: $obj');
|
||||
}
|
||||
|
||||
/// Get the shell to use for the given platform.
|
||||
@@ -200,6 +218,11 @@ class ScriptRunnerShellConfig {
|
||||
if (Platform.isWindows) {
|
||||
return 'cmd.exe';
|
||||
}
|
||||
return '/bin/sh';
|
||||
try {
|
||||
final res = Platform.environment['SHELL'];
|
||||
return res ?? '/bin/sh';
|
||||
} catch (e) {
|
||||
return '/bin/sh';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,8 +66,12 @@ class RunnableScript {
|
||||
(map['args'] as yaml.YamlList?)?.map((e) => e.toString()).toList();
|
||||
out['env'] = (map['env'] as yaml.YamlMap?)?.cast<String, String>();
|
||||
}
|
||||
|
||||
return RunnableScript.fromMap(out, fileSystem: fileSystem);
|
||||
try {
|
||||
return RunnableScript.fromMap(out, fileSystem: fileSystem);
|
||||
} catch (e) {
|
||||
throw StateError(
|
||||
'Failed to parse script, arguments: $map, $fileSystem. Error: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// Generate a runnable script from a normal map as defined in the config.
|
||||
@@ -81,13 +85,18 @@ class RunnableScript {
|
||||
final description = map['description'] as String?;
|
||||
// print('cmdArgs: $cmdArgs');
|
||||
|
||||
return RunnableScript(
|
||||
name,
|
||||
cmd: cmd,
|
||||
args: cmdArgs + List<String>.from(rawArgs),
|
||||
fileSystem: fileSystem,
|
||||
description: description,
|
||||
);
|
||||
try {
|
||||
return RunnableScript(
|
||||
name,
|
||||
cmd: cmd,
|
||||
args: cmdArgs + List<String>.from(rawArgs),
|
||||
fileSystem: fileSystem,
|
||||
description: description,
|
||||
);
|
||||
} catch (e) {
|
||||
throw StateError(
|
||||
'Failed to parse script, arguments: $map, $fileSystem. Error: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// Runs the current script with the given extra arguments.
|
||||
|
||||
46
pubspec.yaml
46
pubspec.yaml
@@ -1,7 +1,7 @@
|
||||
name: script_runner
|
||||
description: Run all your project-related scripts in a portable, simple config.
|
||||
version: 0.1.6
|
||||
homepage: https://casraf.blog/
|
||||
version: 0.1.7
|
||||
homepage: https://casraf.dev/
|
||||
repository: https://github.com/chenasraf/dart_script_runner
|
||||
license: MIT
|
||||
environment:
|
||||
@@ -17,27 +17,27 @@ dev_dependencies:
|
||||
test: ^1.16.0
|
||||
|
||||
script_runner:
|
||||
shell: /bin/zsh
|
||||
line_length: 100
|
||||
scripts:
|
||||
# Real
|
||||
- auto-fix: dart fix --apply
|
||||
- publish: dart pub publish
|
||||
- doc: dart doc
|
||||
# Examples
|
||||
- name: echo1
|
||||
cmd: echo "Hello World"
|
||||
description: Interdum a scelerisque arcu felis taciti ligula pellentesque curabitur, suspendisse adipiscing quisque sed luctus elementum in imperdiet id, praesent enim sem justo sapien diam nec. Quisque erat risus sagittis penatibus per, vehicula sociosqu cubilia convallis, sollicitudin scelerisque cras aptent. Natoque ornare dictumst netus litora mollis suspendisse cubilia proin morbi primis consequat eu massa, cursus non urna ridiculus dolor duis tempus ut nam velit lacus viverra. A interdum senectus eu mus leo aptent facilisi augue tristique ante purus condimentum pulvinar porta viverra morbi, et tellus gravida porttitor non euismod suscipit neque egestas praesent arcu luctus pharetra fusce. Luctus mauris a venenatis tempus cras ante efficitur massa ultricies mollis lacus, volutpat nisi lacinia himenaeos facilisi in aliquet sodales purus integer vitae quisque, libero torquent enim mattis placerat tortor mi dignissim viverra sem.
|
||||
- name: echo2
|
||||
cmd: echo
|
||||
args:
|
||||
- 'Hello World'
|
||||
description: test script foobar
|
||||
- name: activate-local
|
||||
cmd: dart pub global activate --source path ./
|
||||
- name: combined
|
||||
cmd: echo 'test' && echo1 && echo2
|
||||
- short: echo 'this is a short script'
|
||||
# line_length: 100
|
||||
# scripts:
|
||||
# Real
|
||||
- auto-fix: dart fix --apply
|
||||
- publish: dart pub publish
|
||||
- doc: dart doc
|
||||
|
||||
# Examples
|
||||
- name: echo1
|
||||
cmd: echo "Hello World" $SHELL
|
||||
description: Interdum a scelerisque arcu felis taciti ligula pellentesque curabitur, suspendisse adipiscing quisque sed luctus elementum in imperdiet id, praesent enim sem justo sapien diam nec. Quisque erat risus sagittis penatibus per, vehicula sociosqu cubilia convallis, sollicitudin scelerisque cras aptent. Natoque ornare dictumst netus litora mollis suspendisse cubilia proin morbi primis consequat eu massa, cursus non urna ridiculus dolor duis tempus ut nam velit lacus viverra. A interdum senectus eu mus leo aptent facilisi augue tristique ante purus condimentum pulvinar porta viverra morbi, et tellus gravida porttitor non euismod suscipit neque egestas praesent arcu luctus pharetra fusce. Luctus mauris a venenatis tempus cras ante efficitur massa ultricies mollis lacus, volutpat nisi lacinia himenaeos facilisi in aliquet sodales purus integer vitae quisque, libero torquent enim mattis placerat tortor mi dignissim viverra sem.
|
||||
- name: echo2
|
||||
cmd: echo
|
||||
args:
|
||||
- 'Hello World'
|
||||
description: test script foobar
|
||||
- name: activate-local
|
||||
cmd: dart pub global activate --source path ./
|
||||
- name: combined
|
||||
cmd: echo 'test' && echo1 && echo2
|
||||
- short: echo 'this is a short script'
|
||||
|
||||
executables:
|
||||
scr: script_runner
|
||||
|
||||
Reference in New Issue
Block a user