Skip to content

Commit 1436269

Browse files
authored
Merge pull request #1 from EasyFlutterApps/development
Development
2 parents 3328848 + dbe013a commit 1436269

24 files changed

+451
-5
lines changed

.mason/bricks.json

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"hello":"C:/Users/prash/AppData/Local/Mason/Cache/hosted/registry.brickhub.dev/hello_0.1.0+1","easy_app_command":"C:/Users/prash/AppData/Local/Mason/Cache/hosted/registry.brickhub.dev/easy_app_command_0.1.0+1","easy_app_blank":"C:/Users/prash/AppData/Local/Mason/Cache/hosted/registry.brickhub.dev/easy_app_blank_0.1.0+5.1"}

.vscode/settings.json

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"cSpell.words": [
3+
"ansicolor",
4+
"negatable",
5+
"recase"
6+
]
7+
}

analysis_options.yaml

+10-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,10 @@
1-
include: package:very_good_analysis/analysis_options.2.4.0.yaml
1+
include: package:very_good_analysis/analysis_options.2.4.0.yaml
2+
3+
analyzer:
4+
exclude:
5+
- 'lib/demo.dart'
6+
7+
linter:
8+
rules:
9+
public_member_api_docs: true
10+

bin/easy_app.dart

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'package:easy_app_cli/easy_app_cli.dart';
2+
import 'package:universal_io/io.dart';
3+
4+
Future<void> main(List<String> args) async {
5+
await _flushThenExit(await EasyAppCli().run(args));
6+
}
7+
8+
/// Flushes stdout and stderr, then exits the program with the given [exitCode].
9+
///
10+
/// This returns a Future that will never complete, since the program will have
11+
/// exited already. This is useful to prevent Future chains from proceeding
12+
/// after you've decided to exit.
13+
Future _flushThenExit(int? status) async {
14+
await Future.wait<void>([
15+
stdout.flush(),
16+
stderr.flush(),
17+
]).then<void>((value) => exit(status!));
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export 'src/bottom_bar_command.dart';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import 'package:args/args.dart';
2+
import 'package:args/command_runner.dart';
3+
import 'package:easy_app_cli/src/utils/constants/constants.dart';
4+
import 'package:mason_logger/mason_logger.dart';
5+
6+
/// Command for the module.
7+
class BottomNavBarCommand extends Command<int> {
8+
/// Constructor.
9+
/// {@macro easy_app_cli}
10+
BottomNavBarCommand({
11+
Logger? logger,
12+
}) : _logger = logger ?? Logger(),
13+
super();
14+
15+
final Logger _logger;
16+
17+
@override
18+
String get description => 'Create a bottom navigation bar.';
19+
20+
@override
21+
String get name => 'bottom_navbar';
22+
23+
/// The function that is executed when the command is run.
24+
@override
25+
String get invocation => '${Constants.packageCli} init';
26+
27+
@override
28+
String get summary => '$invocation\n$description';
29+
30+
/// [ArgResults] which can be overridden for testing.
31+
ArgResults? argResultOverrides;
32+
33+
ArgResults get _argResults => argResultOverrides ?? argResults!;
34+
35+
@override
36+
Future<int> run() async {
37+
_logger.info('Running command: $name ${_argResults.arguments}');
38+
39+
return ExitCode.usage.code;
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export 'bottom_nav_bar/bottom_bar.dart';

lib/src/commands/init/init.dart

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export 'src/init_command.dart';
+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import 'package:args/args.dart';
2+
import 'package:args/command_runner.dart';
3+
import 'package:cli_dialog/cli_dialog.dart';
4+
import 'package:easy_app_cli/src/utils/commands/commands.dart';
5+
import 'package:easy_app_cli/src/utils/commands/src/pub_get.dart';
6+
import 'package:easy_app_cli/src/utils/constants/constants.dart';
7+
import 'package:easy_app_cli/src/utils/core/bricks.dart';
8+
import 'package:easy_app_cli/src/utils/core/packages.dart';
9+
import 'package:easy_app_cli/src/utils/generator/generate_bricks.dart';
10+
import 'package:mason_logger/mason_logger.dart';
11+
12+
/// Command for the module.
13+
class InitCommand extends Command<int> {
14+
/// Constructor.
15+
/// {@macro easy_app_cli}
16+
InitCommand({
17+
Logger? logger,
18+
}) : _logger = logger ?? Logger(),
19+
super();
20+
21+
final Logger _logger;
22+
23+
@override
24+
String get description => 'Initialize a new project.';
25+
26+
@override
27+
String get name => 'init';
28+
29+
/// The function that is executed when the command is run.
30+
@override
31+
String get invocation => '${Constants.packageCli} init';
32+
33+
@override
34+
String get summary => '$invocation\n$description';
35+
36+
/// [ArgResults] which can be overridden for testing.
37+
ArgResults? argResultOverrides;
38+
39+
/// No Need for now.
40+
// ArgResults get _argResults => argResultOverrides ?? argResults!;
41+
42+
@override
43+
Future<int> run() async {
44+
_logger.info('Running command: ${Constants.packageCli} $name');
45+
46+
/// No Need for now.
47+
// _logger.info('Running command: $name ${_argResults.arguments}');
48+
49+
await flutterPubAdd(_logger, packageName: PackagesName.goRoute);
50+
await flutterPubAdd(_logger, packageName: PackagesName.flexColorScheme);
51+
await flutterPubAdd(_logger, packageName: PackagesName.googleFonts);
52+
53+
await flutterPubGet(_logger);
54+
55+
await generateBricks(
56+
_logger,
57+
brickName: BricksName.init,
58+
brickVersion: kBricks[BricksName.init]!,
59+
);
60+
61+
try {
62+
final dialog = CLI_Dialog(
63+
booleanQuestions: <dynamic>[
64+
['Do you want to create a new module?', 'name']
65+
],
66+
);
67+
final flag = dialog.ask()['name'] as bool;
68+
69+
if (flag) {
70+
await _addExtraModules(flag);
71+
}
72+
} catch (e) {
73+
_logger.err('Error: $e');
74+
return 1;
75+
}
76+
77+
return ExitCode.usage.code;
78+
}
79+
80+
Future<void> _addExtraModules(bool flag) async {
81+
var temp = flag;
82+
do {
83+
/// Generate a new module.
84+
final templateDialog = CLI_Dialog(
85+
questions: <dynamic>[
86+
['What is your module name?', 'name']
87+
],
88+
);
89+
90+
final template = templateDialog.ask()['name'].toString();
91+
92+
await generateBricks(
93+
_logger,
94+
brickName: BricksName.blank,
95+
brickVersion: kBricks[BricksName.blank]!,
96+
vars: <String, dynamic>{
97+
'name': template,
98+
},
99+
);
100+
101+
/// Ask for the module name.
102+
final dialog = CLI_Dialog(
103+
booleanQuestions: <dynamic>[
104+
['Again create a new module?', 'name']
105+
],
106+
);
107+
final flag = dialog.ask()['name'] as bool;
108+
temp = flag;
109+
} while (temp);
110+
}
111+
}

lib/src/commands/modules/modules.dart

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export 'src/module_command.dart';
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
part of 'module_command.dart';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import 'package:args/args.dart';
2+
import 'package:args/command_runner.dart';
3+
import 'package:cli_dialog/cli_dialog.dart';
4+
import 'package:easy_app_cli/src/utils/constants/constants.dart';
5+
import 'package:easy_app_cli/src/utils/core/bricks.dart';
6+
import 'package:easy_app_cli/src/utils/generator/generate_bricks.dart';
7+
import 'package:mason/mason.dart';
8+
9+
part 'blank.dart';
10+
11+
/// Command for the module.
12+
class ModuleCommand extends Command<int> {
13+
/// Constructor.
14+
/// {@macro easy_app_cli}
15+
ModuleCommand({
16+
Logger? logger,
17+
}) : _logger = logger ?? Logger(),
18+
super();
19+
20+
final Logger _logger;
21+
22+
@override
23+
String get description => 'create a new module';
24+
25+
@override
26+
String get name => 'module';
27+
28+
/// The function that is executed when the command is run.
29+
@override
30+
String get invocation => '${Constants.packageCli} make [template]';
31+
32+
@override
33+
String get summary => '$invocation\n$description';
34+
35+
/// [ArgResults] which can be overridden for testing.
36+
ArgResults? argResultOverrides;
37+
38+
ArgResults get _argResults => argResultOverrides ?? argResults!;
39+
40+
@override
41+
Future<int> run() async {
42+
final generateDone = _logger.progress('Bootstrapping');
43+
generateDone.call();
44+
45+
final String template;
46+
47+
if (_argResults.arguments.isEmpty) {
48+
final dialog = CLI_Dialog(
49+
questions: <dynamic>[
50+
['What is your module name?', 'name']
51+
],
52+
);
53+
54+
template = dialog.ask()['name'].toString();
55+
} else {
56+
template = _argResults.arguments.first;
57+
}
58+
59+
await generateBricks(
60+
_logger,
61+
brickName: BricksName.blank,
62+
brickVersion: kBricks[BricksName.blank]!,
63+
vars: <String, dynamic>{
64+
'name': template,
65+
},
66+
);
67+
68+
return ExitCode.usage.code;
69+
}
70+
}

lib/src/easy_app_cli.dart

+64-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,69 @@
1+
import 'package:args/args.dart';
2+
import 'package:args/command_runner.dart';
3+
import 'package:easy_app_cli/src/commands/init/init.dart';
4+
import 'package:easy_app_cli/src/commands/modules/modules.dart';
5+
import 'package:easy_app_cli/src/utils/constants/constants.dart';
6+
import 'package:easy_app_cli/src/version.dart';
7+
import 'package:mason_logger/mason_logger.dart';
8+
19
/// {@template easy_app_cli}
210
/// A Good Command Line Application created by Easy Apps
311
/// {@endtemplate}
4-
class EasyAppCli {
12+
class EasyAppCli extends CommandRunner<int> {
513
/// {@macro easy_app_cli}
6-
const EasyAppCli();
14+
EasyAppCli({
15+
Logger? logger,
16+
}) : _logger = logger ?? Logger(),
17+
super(
18+
Constants.packageName,
19+
'A command line interface for the easy_app package.',
20+
) {
21+
argParser
22+
.addFlag(
23+
'version',
24+
negatable: false,
25+
help: 'Print the current version.',
26+
);
27+
28+
/// Add the commands to the runner.
29+
addCommand(InitCommand(logger: _logger));
30+
addCommand(ModuleCommand(logger: _logger));
31+
// addCommand(BottomNavBarCommand(logger: _logger));
32+
}
33+
34+
final Logger _logger;
35+
36+
@override
37+
Future<int?> run(Iterable<String> args) async {
38+
try {
39+
final _argResults = parse(args);
40+
return await runCommand(_argResults) ?? ExitCode.success.code;
41+
} on FormatException catch (e, stackTrace) {
42+
_logger
43+
..err(e.message)
44+
..err('$stackTrace')
45+
..info('')
46+
..info(usage);
47+
return ExitCode.usage.code;
48+
} on UsageException catch (e) {
49+
_logger
50+
..err(e.message)
51+
..info('')
52+
..info(usage);
53+
return ExitCode.usage.code;
54+
}
55+
}
56+
57+
/// Runs the command.
58+
@override
59+
Future<int?> runCommand(ArgResults topLevelResults) async {
60+
int? exitCode = ExitCode.unavailable.code;
61+
if (topLevelResults['version'] == true) {
62+
_logger.info('Version: $packageVersion');
63+
exitCode = ExitCode.success.code;
64+
} else {
65+
exitCode = await super.runCommand(topLevelResults);
66+
}
67+
return exitCode;
68+
}
769
}

lib/src/utils/commands/commands.dart

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export 'src/pub_add.dart';
2+
export 'src/pub_add.dart';
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'package:mason_logger/mason_logger.dart';
2+
import 'package:process_run/shell.dart';
3+
4+
/// Add Flutter Package in project
5+
Future<void> flutterPubAdd(
6+
Logger logger, {
7+
required String packageName,
8+
String? operation = 'add',
9+
}) async {
10+
final _shell = Shell();
11+
try {
12+
await _shell.run(
13+
'''
14+
# ✓ Running "flutter pub $operation $packageName" in projects
15+
flutter pub $operation $packageName
16+
''',
17+
);
18+
} on ShellException {
19+
await flutterPubAdd(logger, packageName: packageName, operation: 'upgrade');
20+
} catch (e) {
21+
logger.err(e.toString());
22+
}
23+
}
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import 'package:mason_logger/mason_logger.dart';
2+
import 'package:process_run/shell.dart';
3+
4+
/// Run [flutter pub get] in project
5+
Future<void> flutterPubGet(Logger logger) async {
6+
final _shell = Shell();
7+
try {
8+
await _shell.run(
9+
'''
10+
# ✓ Running "flutter pub get" in projects
11+
flutter pub get
12+
''',
13+
);
14+
} catch (e) {
15+
logger.err(e.toString());
16+
}
17+
}

0 commit comments

Comments
 (0)