@_nazmiforreal/flutter-ota 0.1.21 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/bin/flutter-ota-linux-x64 +0 -0
  2. package/bin/flutter-ota.js +85 -0
  3. package/dart-src/packages/cli-tools/lib/flutter_ota_kit_cli.dart +7 -4
  4. package/dart-src/packages/cli-tools/lib/src/commands/bundle.dart +95 -32
  5. package/dart-src/packages/cli-tools/lib/src/commands/channel.dart +28 -12
  6. package/dart-src/packages/cli-tools/lib/src/commands/config_command.dart +9 -4
  7. package/dart-src/packages/cli-tools/lib/src/commands/deploy.dart +29 -6
  8. package/dart-src/packages/cli-tools/lib/src/commands/doctor.dart +20 -32
  9. package/dart-src/packages/cli-tools/lib/src/commands/init.dart +40 -19
  10. package/dart-src/packages/cli-tools/lib/src/commands/keys.dart +7 -5
  11. package/dart-src/packages/cli-tools/lib/src/commands/migrate.dart +33 -22
  12. package/dart-src/packages/cli-tools/lib/src/commands/pocketbase.dart +256 -68
  13. package/dart-src/packages/cli-tools/lib/src/commands/rollback.dart +17 -11
  14. package/dart-src/packages/cli-tools/lib/src/commands/storage.dart +28 -12
  15. package/dart-src/packages/cli-tools/lib/src/config.dart +5 -6
  16. package/dart-src/packages/cli-tools/lib/src/operations.dart +1 -3
  17. package/dart-src/packages/cli-tools/lib/src/pocketbase/process_manager.dart +17 -16
  18. package/dart-src/packages/cli-tools/lib/src/runner.dart +3 -1
  19. package/dart-src/packages/cli-tools/lib/src/ui/ui.dart +8 -14
  20. package/dart-src/packages/cli-tools/test/mocks/mock_pocketbase_client.dart +7 -3
  21. package/dart-src/packages/cli-tools/test/pocketbase_schema_test.dart +13 -16
  22. package/dart-src/packages/core/CHANGELOG.md +15 -0
  23. package/dart-src/packages/core/lib/src/bundle.dart +3 -6
  24. package/dart-src/packages/core/pubspec.yaml +1 -1
  25. package/dart-src/plugins/aws/CHANGELOG.md +18 -0
  26. package/dart-src/plugins/aws/lib/src/aws_cloudfront_client.dart +1 -2
  27. package/dart-src/plugins/aws/pubspec.yaml +3 -3
  28. package/dart-src/plugins/cloudflare/CHANGELOG.md +18 -0
  29. package/dart-src/plugins/cloudflare/pubspec.yaml +3 -3
  30. package/dart-src/plugins/plugin-core/CHANGELOG.md +15 -0
  31. package/dart-src/plugins/plugin-core/pubspec.yaml +2 -2
  32. package/dart-src/plugins/pocketbase/CHANGELOG.md +18 -0
  33. package/dart-src/plugins/pocketbase/pubspec.yaml +3 -3
  34. package/dart-src/plugins/postgres/CHANGELOG.md +18 -0
  35. package/dart-src/plugins/postgres/pubspec.yaml +3 -3
  36. package/dart-src/plugins/supabase/CHANGELOG.md +18 -0
  37. package/dart-src/plugins/supabase/pubspec.yaml +3 -3
  38. package/package.json +2 -2
  39. package/scripts/postinstall.js +54 -2
@@ -18,7 +18,7 @@ import '../pocketbase/schema_installer.dart';
18
18
  import '../ui/ui.dart';
19
19
 
20
20
  class PocketBaseCommand extends FlutterPatcherCommand {
21
- PocketBaseCommand() {
21
+ PocketBaseCommand() {
22
22
  addSubcommand(PocketBaseInstallCommand());
23
23
  addSubcommand(PocketBaseServeCommand());
24
24
  addSubcommand(PocketBaseStopCommand());
@@ -91,7 +91,11 @@ class PocketBaseServeCommand extends FlutterPatcherCommand {
91
91
  PocketBaseServeCommand() {
92
92
  argParser.addOption('version', help: 'PocketBase version.');
93
93
  argParser.addOption('port', help: 'PB HTTP port.', defaultsTo: '8090');
94
- argParser.addOption('host', help: 'PB bind address.', defaultsTo: '127.0.0.1');
94
+ argParser.addOption(
95
+ 'host',
96
+ help: 'PB bind address.',
97
+ defaultsTo: '127.0.0.1',
98
+ );
95
99
  argParser.addOption('data-dir', help: 'PB data directory.');
96
100
  argParser.addOption('admin-email', help: 'Bootstrap admin email.');
97
101
  argParser.addOption('admin-password', help: 'Bootstrap admin password.');
@@ -299,7 +303,10 @@ class PocketBaseStatusCommand extends FlutterPatcherCommand {
299
303
  box('status', [
300
304
  kv('version', paths.version),
301
305
  kv('binary', exists ? green('installed') : red('not installed')),
302
- kv('pid', pidAlive ? green('$pid') : (pid > 0 ? yellow('$pid (dead)') : dim('-'))),
306
+ kv(
307
+ 'pid',
308
+ pidAlive ? green('$pid') : (pid > 0 ? yellow('$pid (dead)') : dim('-')),
309
+ ),
303
310
  kv('health', healthy ? green('healthy') : red('unreachable')),
304
311
  kv('url', 'http://$host:$port'),
305
312
  ]);
@@ -323,7 +330,9 @@ String _safeSubstring(String? s, int length) {
323
330
  return s.length > length ? s.substring(0, length) : s;
324
331
  }
325
332
 
326
- (String url, String adminEmail, String adminPassword) _resolveBackend(ArgResults r) {
333
+ (String url, String adminEmail, String adminPassword) _resolveBackend(
334
+ ArgResults r,
335
+ ) {
327
336
  final url = r['url'] as String? ?? _detectRunningUrl(r);
328
337
  if (url == null || url.isEmpty) {
329
338
  throw const PackException(
@@ -331,10 +340,12 @@ String _safeSubstring(String? s, int length) {
331
340
  64,
332
341
  );
333
342
  }
334
- final admin = r['admin-email'] as String? ??
343
+ final admin =
344
+ r['admin-email'] as String? ??
335
345
  Platform.environment['POCKETBASE_ADMIN_EMAIL'] ??
336
346
  '';
337
- final pass = r['admin-password'] as String? ??
347
+ final pass =
348
+ r['admin-password'] as String? ??
338
349
  Platform.environment['POCKETBASE_ADMIN_PASSWORD'] ??
339
350
  '';
340
351
  if (admin.isEmpty || pass.isEmpty) {
@@ -487,7 +498,11 @@ class PocketBaseBackupDeleteCommand extends FlutterPatcherCommand {
487
498
  class PocketBaseBackupRestoreCommand extends FlutterPatcherCommand {
488
499
  PocketBaseBackupRestoreCommand() {
489
500
  _addBackendOptions(argParser);
490
- argParser.addOption('name', help: 'Backup key to restore.', mandatory: true);
501
+ argParser.addOption(
502
+ 'name',
503
+ help: 'Backup key to restore.',
504
+ mandatory: true,
505
+ );
491
506
  }
492
507
 
493
508
  @override
@@ -508,7 +523,11 @@ class PocketBaseBackupRestoreCommand extends FlutterPatcherCommand {
508
523
  class PocketBaseBackupDownloadCommand extends FlutterPatcherCommand {
509
524
  PocketBaseBackupDownloadCommand() {
510
525
  _addBackendOptions(argParser);
511
- argParser.addOption('name', help: 'Backup key to download.', mandatory: true);
526
+ argParser.addOption(
527
+ 'name',
528
+ help: 'Backup key to download.',
529
+ mandatory: true,
530
+ );
512
531
  argParser.addOption('output', help: 'Output directory.', defaultsTo: '.');
513
532
  }
514
533
 
@@ -610,7 +629,12 @@ class PocketBaseExportCommand extends FlutterPatcherCommand {
610
629
  }
611
630
  }
612
631
  if (collections.isEmpty) {
613
- collections.addAll(['bundles', 'channels', 'audit_log', 'bundles_patches']);
632
+ collections.addAll([
633
+ 'bundles',
634
+ 'channels',
635
+ 'audit_log',
636
+ 'bundles_patches',
637
+ ]);
614
638
  }
615
639
  }
616
640
 
@@ -644,7 +668,8 @@ class PocketBaseImportCommand extends FlutterPatcherCommand {
644
668
  String get name => 'import';
645
669
 
646
670
  @override
647
- String get description => 'Import records from a JSON file into a collection.';
671
+ String get description =>
672
+ 'Import records from a JSON file into a collection.';
648
673
 
649
674
  @override
650
675
  Future<int> run() => runGuarded(() async {
@@ -705,7 +730,11 @@ class PocketBaseAdminCreateCommand extends FlutterPatcherCommand {
705
730
  final password = r['password'] as String;
706
731
  final result = await _pbStep(
707
732
  'Creating admin $email',
708
- (c) => c.createAdmin(email: email, password: password, passwordConfirm: password),
733
+ (c) => c.createAdmin(
734
+ email: email,
735
+ password: password,
736
+ passwordConfirm: password,
737
+ ),
709
738
  r,
710
739
  );
711
740
  stdout.writeln(' ${dim('→')} admin ${cyan(result['id'] ?? '?')} $email');
@@ -726,13 +755,22 @@ class PocketBaseAdminListCommand extends FlutterPatcherCommand {
726
755
  @override
727
756
  Future<int> run() => runGuarded(() async {
728
757
  banner('pocketbase · admin · list');
729
- final admins = await _pbStep('Listing admins', (c) => c.listAdmins(), argResults!);
758
+ final admins = await _pbStep(
759
+ 'Listing admins',
760
+ (c) => c.listAdmins(),
761
+ argResults!,
762
+ );
730
763
  if (admins.isEmpty) {
731
764
  warn('No admins found.');
732
765
  return;
733
766
  }
734
767
  final rows = admins
735
- .map((a) => [cyan(a['id']?.toString() ?? '?'), a['email']?.toString() ?? '?'])
768
+ .map(
769
+ (a) => [
770
+ cyan(a['id']?.toString() ?? '?'),
771
+ a['email']?.toString() ?? '?',
772
+ ],
773
+ )
736
774
  .toList();
737
775
  table('${admins.length} admins', ['ID', 'EMAIL'], rows);
738
776
  });
@@ -742,7 +780,11 @@ class PocketBaseAdminUpdateCommand extends FlutterPatcherCommand {
742
780
  PocketBaseAdminUpdateCommand() {
743
781
  _addBackendOptions(argParser);
744
782
  argParser.addOption('id', help: 'Admin ID to update.', mandatory: true);
745
- argParser.addOption('body', help: 'JSON fields to update.', mandatory: true);
783
+ argParser.addOption(
784
+ 'body',
785
+ help: 'JSON fields to update.',
786
+ mandatory: true,
787
+ );
746
788
  }
747
789
 
748
790
  @override
@@ -835,7 +877,11 @@ class PocketBaseHealthCommand extends FlutterPatcherCommand {
835
877
  @override
836
878
  Future<int> run() => runGuarded(() async {
837
879
  banner('pocketbase · health');
838
- final health = await _pbStep('health', (c) => c.healthDetailed(), argResults!);
880
+ final health = await _pbStep(
881
+ 'health',
882
+ (c) => c.healthDetailed(),
883
+ argResults!,
884
+ );
839
885
  final code = health['code'] as int? ?? 0;
840
886
  final message = health['message'] as String? ?? '';
841
887
  final data = health['data'] as Map<String, dynamic>? ?? {};
@@ -901,7 +947,11 @@ class PocketBaseLogsListCommand extends FlutterPatcherCommand {
901
947
  }
902
948
  final rows = items.map((log) {
903
949
  final level = log['level'] as int? ?? 0;
904
- final lvl = level == 0 ? green('INFO') : level == 1 ? yellow('WARN') : red('ERROR');
950
+ final lvl = level == 0
951
+ ? green('INFO')
952
+ : level == 1
953
+ ? yellow('WARN')
954
+ : red('ERROR');
905
955
  final msg = (log['message'] as String? ?? '').length > 60
906
956
  ? '${(log['message'] as String).substring(0, 57)}...'
907
957
  : log['message'] as String? ?? '';
@@ -935,10 +985,14 @@ class PocketBaseLogsStatsCommand extends FlutterPatcherCommand {
935
985
  warn('No stats available.');
936
986
  return;
937
987
  }
938
- final rows = stats.map((s) => [
939
- _safeSubstring(s['date']?.toString(), 16),
940
- '${s['total'] ?? 0}',
941
- ]).toList();
988
+ final rows = stats
989
+ .map(
990
+ (s) => [
991
+ _safeSubstring(s['date']?.toString(), 16),
992
+ '${s['total'] ?? 0}',
993
+ ],
994
+ )
995
+ .toList();
942
996
  table('${stats.length} entries', ['TIME', 'COUNT'], rows);
943
997
  });
944
998
  }
@@ -986,7 +1040,11 @@ class PocketBaseRecordsCommand extends FlutterPatcherCommand {
986
1040
  class PocketBaseRecordsListCommand extends FlutterPatcherCommand {
987
1041
  PocketBaseRecordsListCommand() {
988
1042
  _addBackendOptions(argParser);
989
- argParser.addOption('collection', help: 'Collection name.', mandatory: true);
1043
+ argParser.addOption(
1044
+ 'collection',
1045
+ help: 'Collection name.',
1046
+ mandatory: true,
1047
+ );
990
1048
  argParser.addOption('filter', help: 'PB filter expression.');
991
1049
  argParser.addOption('sort', help: 'Sort field.');
992
1050
  argParser.addOption('page', help: 'Page number.', defaultsTo: '1');
@@ -1021,7 +1079,8 @@ class PocketBaseRecordsListCommand extends FlutterPatcherCommand {
1021
1079
  }
1022
1080
  final rows = data.items.map((r) {
1023
1081
  final m = r as Map<String, dynamic>;
1024
- final label = m['name']?.toString() ??
1082
+ final label =
1083
+ m['name']?.toString() ??
1025
1084
  m['updated']?.toString() ??
1026
1085
  m['created']?.toString() ??
1027
1086
  '';
@@ -1034,7 +1093,11 @@ class PocketBaseRecordsListCommand extends FlutterPatcherCommand {
1034
1093
  class PocketBaseRecordsGetCommand extends FlutterPatcherCommand {
1035
1094
  PocketBaseRecordsGetCommand() {
1036
1095
  _addBackendOptions(argParser);
1037
- argParser.addOption('collection', help: 'Collection name.', mandatory: true);
1096
+ argParser.addOption(
1097
+ 'collection',
1098
+ help: 'Collection name.',
1099
+ mandatory: true,
1100
+ );
1038
1101
  argParser.addOption('id', help: 'Record ID.', mandatory: true);
1039
1102
  }
1040
1103
 
@@ -1050,7 +1113,11 @@ class PocketBaseRecordsGetCommand extends FlutterPatcherCommand {
1050
1113
  final r = argResults!;
1051
1114
  final record = await _pbStep(
1052
1115
  'Getting ${r['collection']}/${r['id']}',
1053
- (c) => c.getRecord<dynamic>(r['collection'] as String, r['id'] as String, (j) => j),
1116
+ (c) => c.getRecord<dynamic>(
1117
+ r['collection'] as String,
1118
+ r['id'] as String,
1119
+ (j) => j,
1120
+ ),
1054
1121
  r,
1055
1122
  );
1056
1123
  if (record == null) {
@@ -1064,7 +1131,11 @@ class PocketBaseRecordsGetCommand extends FlutterPatcherCommand {
1064
1131
  class PocketBaseRecordsCreateCommand extends FlutterPatcherCommand {
1065
1132
  PocketBaseRecordsCreateCommand() {
1066
1133
  _addBackendOptions(argParser);
1067
- argParser.addOption('collection', help: 'Collection name.', mandatory: true);
1134
+ argParser.addOption(
1135
+ 'collection',
1136
+ help: 'Collection name.',
1137
+ mandatory: true,
1138
+ );
1068
1139
  argParser.addOption('body', help: 'JSON body.', mandatory: true);
1069
1140
  }
1070
1141
 
@@ -1084,14 +1155,20 @@ class PocketBaseRecordsCreateCommand extends FlutterPatcherCommand {
1084
1155
  (c) => c.createRecord<dynamic>(r['collection'] as String, body, (j) => j),
1085
1156
  r,
1086
1157
  );
1087
- stdout.writeln(' ${dim('→')} record ${cyan((record as Map)['id']?.toString() ?? '?')}');
1158
+ stdout.writeln(
1159
+ ' ${dim('→')} record ${cyan((record as Map)['id']?.toString() ?? '?')}',
1160
+ );
1088
1161
  });
1089
1162
  }
1090
1163
 
1091
1164
  class PocketBaseRecordsUpdateCommand extends FlutterPatcherCommand {
1092
1165
  PocketBaseRecordsUpdateCommand() {
1093
1166
  _addBackendOptions(argParser);
1094
- argParser.addOption('collection', help: 'Collection name.', mandatory: true);
1167
+ argParser.addOption(
1168
+ 'collection',
1169
+ help: 'Collection name.',
1170
+ mandatory: true,
1171
+ );
1095
1172
  argParser.addOption('id', help: 'Record ID.', mandatory: true);
1096
1173
  argParser.addOption('body', help: 'JSON body.', mandatory: true);
1097
1174
  }
@@ -1109,7 +1186,12 @@ class PocketBaseRecordsUpdateCommand extends FlutterPatcherCommand {
1109
1186
  final body = jsonDecode(r['body'] as String) as Map<String, dynamic>;
1110
1187
  await _pbStep(
1111
1188
  'Updating ${r['collection']}/${r['id']}',
1112
- (c) => c.updateRecord<dynamic>(r['collection'] as String, r['id'] as String, body, (j) => j),
1189
+ (c) => c.updateRecord<dynamic>(
1190
+ r['collection'] as String,
1191
+ r['id'] as String,
1192
+ body,
1193
+ (j) => j,
1194
+ ),
1113
1195
  r,
1114
1196
  );
1115
1197
  step(green('Updated ${r['collection']}/${r['id']}'));
@@ -1119,7 +1201,11 @@ class PocketBaseRecordsUpdateCommand extends FlutterPatcherCommand {
1119
1201
  class PocketBaseRecordsDeleteCommand extends FlutterPatcherCommand {
1120
1202
  PocketBaseRecordsDeleteCommand() {
1121
1203
  _addBackendOptions(argParser);
1122
- argParser.addOption('collection', help: 'Collection name.', mandatory: true);
1204
+ argParser.addOption(
1205
+ 'collection',
1206
+ help: 'Collection name.',
1207
+ mandatory: true,
1208
+ );
1123
1209
  argParser.addOption('id', help: 'Record ID.', mandatory: true);
1124
1210
  }
1125
1211
 
@@ -1145,19 +1231,25 @@ class PocketBaseRecordsDeleteCommand extends FlutterPatcherCommand {
1145
1231
  class PocketBaseRecordsBatchCommand extends FlutterPatcherCommand {
1146
1232
  PocketBaseRecordsBatchCommand() {
1147
1233
  _addBackendOptions(argParser);
1148
- argParser.addOption('requests', help: 'JSON array of request objects.', mandatory: true);
1234
+ argParser.addOption(
1235
+ 'requests',
1236
+ help: 'JSON array of request objects.',
1237
+ mandatory: true,
1238
+ );
1149
1239
  }
1150
1240
 
1151
1241
  @override
1152
1242
  String get name => 'batch';
1153
1243
 
1154
1244
  @override
1155
- String get description => 'Execute multiple record operations in a single transaction.';
1245
+ String get description =>
1246
+ 'Execute multiple record operations in a single transaction.';
1156
1247
 
1157
1248
  @override
1158
1249
  Future<int> run() => runGuarded(() async {
1159
1250
  banner('pocketbase · records · batch');
1160
- final requests = jsonDecode(argResults!['requests'] as String) as List<dynamic>;
1251
+ final requests =
1252
+ jsonDecode(argResults!['requests'] as String) as List<dynamic>;
1161
1253
  final body = requests.cast<Map<String, dynamic>>();
1162
1254
  final results = await _pbStep(
1163
1255
  'Executing ${body.length} batch requests',
@@ -1205,16 +1297,24 @@ class PocketBaseCollectionsListCommand extends FlutterPatcherCommand {
1205
1297
  @override
1206
1298
  Future<int> run() => runGuarded(() async {
1207
1299
  banner('pocketbase · collections · list');
1208
- final cols = await _pbStep('Listing collections', (c) => c.listCollections(), argResults!);
1300
+ final cols = await _pbStep(
1301
+ 'Listing collections',
1302
+ (c) => c.listCollections(),
1303
+ argResults!,
1304
+ );
1209
1305
  if (cols.isEmpty) {
1210
1306
  warn('No collections found.');
1211
1307
  return;
1212
1308
  }
1213
- final rows = cols.map((c) => [
1214
- cyan(c['name']?.toString() ?? '?'),
1215
- c['type']?.toString() ?? '?',
1216
- '${(c['fields'] as List?)?.length ?? 0} fields',
1217
- ]).toList();
1309
+ final rows = cols
1310
+ .map(
1311
+ (c) => [
1312
+ cyan(c['name']?.toString() ?? '?'),
1313
+ c['type']?.toString() ?? '?',
1314
+ '${(c['fields'] as List?)?.length ?? 0} fields',
1315
+ ],
1316
+ )
1317
+ .toList();
1218
1318
  table('${cols.length} collections', ['NAME', 'TYPE', 'FIELDS'], rows);
1219
1319
  });
1220
1320
  }
@@ -1222,7 +1322,11 @@ class PocketBaseCollectionsListCommand extends FlutterPatcherCommand {
1222
1322
  class PocketBaseCollectionsViewCommand extends FlutterPatcherCommand {
1223
1323
  PocketBaseCollectionsViewCommand() {
1224
1324
  _addBackendOptions(argParser);
1225
- argParser.addOption('name', help: 'Collection name or ID.', mandatory: true);
1325
+ argParser.addOption(
1326
+ 'name',
1327
+ help: 'Collection name or ID.',
1328
+ mandatory: true,
1329
+ );
1226
1330
  }
1227
1331
 
1228
1332
  @override
@@ -1235,7 +1339,11 @@ class PocketBaseCollectionsViewCommand extends FlutterPatcherCommand {
1235
1339
  Future<int> run() => runGuarded(() async {
1236
1340
  banner('pocketbase · collections · view');
1237
1341
  final name = argResults!['name'] as String;
1238
- final col = await _pbStep('Viewing $name', (c) => c.getCollection(name), argResults!);
1342
+ final col = await _pbStep(
1343
+ 'Viewing $name',
1344
+ (c) => c.getCollection(name),
1345
+ argResults!,
1346
+ );
1239
1347
  stdout.writeln(const JsonEncoder.withIndent(' ').convert(col));
1240
1348
  });
1241
1349
  }
@@ -1243,7 +1351,11 @@ class PocketBaseCollectionsViewCommand extends FlutterPatcherCommand {
1243
1351
  class PocketBaseCollectionsCreateCommand extends FlutterPatcherCommand {
1244
1352
  PocketBaseCollectionsCreateCommand() {
1245
1353
  _addBackendOptions(argParser);
1246
- argParser.addOption('body', help: 'JSON collection definition.', mandatory: true);
1354
+ argParser.addOption(
1355
+ 'body',
1356
+ help: 'JSON collection definition.',
1357
+ mandatory: true,
1358
+ );
1247
1359
  }
1248
1360
 
1249
1361
  @override
@@ -1255,9 +1367,13 @@ class PocketBaseCollectionsCreateCommand extends FlutterPatcherCommand {
1255
1367
  @override
1256
1368
  Future<int> run() => runGuarded(() async {
1257
1369
  banner('pocketbase · collections · create');
1258
- final body = jsonDecode(argResults!['body'] as String) as Map<String, dynamic>;
1259
- await _pbStep('Creating ${body['name'] ?? 'collection'}',
1260
- (c) => c.createCollection(body), argResults!);
1370
+ final body =
1371
+ jsonDecode(argResults!['body'] as String) as Map<String, dynamic>;
1372
+ await _pbStep(
1373
+ 'Creating ${body['name'] ?? 'collection'}',
1374
+ (c) => c.createCollection(body),
1375
+ argResults!,
1376
+ );
1261
1377
  step(green('Created ${body['name'] ?? 'collection'}'));
1262
1378
  });
1263
1379
  }
@@ -1265,8 +1381,16 @@ class PocketBaseCollectionsCreateCommand extends FlutterPatcherCommand {
1265
1381
  class PocketBaseCollectionsUpdateCommand extends FlutterPatcherCommand {
1266
1382
  PocketBaseCollectionsUpdateCommand() {
1267
1383
  _addBackendOptions(argParser);
1268
- argParser.addOption('name', help: 'Collection name or ID.', mandatory: true);
1269
- argParser.addOption('body', help: 'JSON fields to update.', mandatory: true);
1384
+ argParser.addOption(
1385
+ 'name',
1386
+ help: 'Collection name or ID.',
1387
+ mandatory: true,
1388
+ );
1389
+ argParser.addOption(
1390
+ 'body',
1391
+ help: 'JSON fields to update.',
1392
+ mandatory: true,
1393
+ );
1270
1394
  }
1271
1395
 
1272
1396
  @override
@@ -1289,7 +1413,11 @@ class PocketBaseCollectionsUpdateCommand extends FlutterPatcherCommand {
1289
1413
  class PocketBaseCollectionsDeleteCommand extends FlutterPatcherCommand {
1290
1414
  PocketBaseCollectionsDeleteCommand() {
1291
1415
  _addBackendOptions(argParser);
1292
- argParser.addOption('name', help: 'Collection name or ID.', mandatory: true);
1416
+ argParser.addOption(
1417
+ 'name',
1418
+ help: 'Collection name or ID.',
1419
+ mandatory: true,
1420
+ );
1293
1421
  }
1294
1422
 
1295
1423
  @override
@@ -1302,7 +1430,11 @@ class PocketBaseCollectionsDeleteCommand extends FlutterPatcherCommand {
1302
1430
  Future<int> run() => runGuarded(() async {
1303
1431
  banner('pocketbase · collections · delete');
1304
1432
  final name = argResults!['name'] as String;
1305
- await _pbStep('Deleting $name', (c) => c.deleteCollection(name), argResults!);
1433
+ await _pbStep(
1434
+ 'Deleting $name',
1435
+ (c) => c.deleteCollection(name),
1436
+ argResults!,
1437
+ );
1306
1438
  step(green('Deleted collection $name'));
1307
1439
  });
1308
1440
  }
@@ -1310,7 +1442,11 @@ class PocketBaseCollectionsDeleteCommand extends FlutterPatcherCommand {
1310
1442
  class PocketBaseCollectionsTruncateCommand extends FlutterPatcherCommand {
1311
1443
  PocketBaseCollectionsTruncateCommand() {
1312
1444
  _addBackendOptions(argParser);
1313
- argParser.addOption('name', help: 'Collection name or ID.', mandatory: true);
1445
+ argParser.addOption(
1446
+ 'name',
1447
+ help: 'Collection name or ID.',
1448
+ mandatory: true,
1449
+ );
1314
1450
  }
1315
1451
 
1316
1452
  @override
@@ -1323,7 +1459,11 @@ class PocketBaseCollectionsTruncateCommand extends FlutterPatcherCommand {
1323
1459
  Future<int> run() => runGuarded(() async {
1324
1460
  banner('pocketbase · collections · truncate');
1325
1461
  final name = argResults!['name'] as String;
1326
- await _pbStep('Truncating $name', (c) => c.truncateCollection(name), argResults!);
1462
+ await _pbStep(
1463
+ 'Truncating $name',
1464
+ (c) => c.truncateCollection(name),
1465
+ argResults!,
1466
+ );
1327
1467
  step(green('Truncated $name'));
1328
1468
  });
1329
1469
  }
@@ -1331,8 +1471,16 @@ class PocketBaseCollectionsTruncateCommand extends FlutterPatcherCommand {
1331
1471
  class PocketBaseCollectionsImportCommand extends FlutterPatcherCommand {
1332
1472
  PocketBaseCollectionsImportCommand() {
1333
1473
  _addBackendOptions(argParser);
1334
- argParser.addOption('file', help: 'JSON file with collections config.', mandatory: true);
1335
- argParser.addFlag('delete-missing', help: 'Delete collections not in file.', defaultsTo: false);
1474
+ argParser.addOption(
1475
+ 'file',
1476
+ help: 'JSON file with collections config.',
1477
+ mandatory: true,
1478
+ );
1479
+ argParser.addFlag(
1480
+ 'delete-missing',
1481
+ help: 'Delete collections not in file.',
1482
+ defaultsTo: false,
1483
+ );
1336
1484
  }
1337
1485
 
1338
1486
  @override
@@ -1352,7 +1500,8 @@ class PocketBaseCollectionsImportCommand extends FlutterPatcherCommand {
1352
1500
  final cols = json.cast<Map<String, dynamic>>();
1353
1501
  await _pbStep(
1354
1502
  'Importing ${cols.length} collections',
1355
- (c) => c.importCollections(cols, deleteMissing: r['delete-missing'] as bool),
1503
+ (c) =>
1504
+ c.importCollections(cols, deleteMissing: r['delete-missing'] as bool),
1356
1505
  r,
1357
1506
  );
1358
1507
  step(green('Imported ${cols.length} collections'));
@@ -1392,7 +1541,11 @@ class PocketBaseSettingsListCommand extends FlutterPatcherCommand {
1392
1541
  @override
1393
1542
  Future<int> run() => runGuarded(() async {
1394
1543
  banner('pocketbase · settings · list');
1395
- final settings = await _pbStep('Fetching settings', (c) => c.listSettings(), argResults!);
1544
+ final settings = await _pbStep(
1545
+ 'Fetching settings',
1546
+ (c) => c.listSettings(),
1547
+ argResults!,
1548
+ );
1396
1549
  stdout.writeln(const JsonEncoder.withIndent(' ').convert(settings));
1397
1550
  });
1398
1551
  }
@@ -1400,7 +1553,11 @@ class PocketBaseSettingsListCommand extends FlutterPatcherCommand {
1400
1553
  class PocketBaseSettingsUpdateCommand extends FlutterPatcherCommand {
1401
1554
  PocketBaseSettingsUpdateCommand() {
1402
1555
  _addBackendOptions(argParser);
1403
- argParser.addOption('body', help: 'JSON object with settings to update.', mandatory: true);
1556
+ argParser.addOption(
1557
+ 'body',
1558
+ help: 'JSON object with settings to update.',
1559
+ mandatory: true,
1560
+ );
1404
1561
  }
1405
1562
 
1406
1563
  @override
@@ -1412,8 +1569,13 @@ class PocketBaseSettingsUpdateCommand extends FlutterPatcherCommand {
1412
1569
  @override
1413
1570
  Future<int> run() => runGuarded(() async {
1414
1571
  banner('pocketbase · settings · update');
1415
- final body = jsonDecode(argResults!['body'] as String) as Map<String, dynamic>;
1416
- await _pbStep('Updating settings', (c) => c.updateSettings(body), argResults!);
1572
+ final body =
1573
+ jsonDecode(argResults!['body'] as String) as Map<String, dynamic>;
1574
+ await _pbStep(
1575
+ 'Updating settings',
1576
+ (c) => c.updateSettings(body),
1577
+ argResults!,
1578
+ );
1417
1579
  step(green('Settings updated'));
1418
1580
  });
1419
1581
  }
@@ -1421,7 +1583,11 @@ class PocketBaseSettingsUpdateCommand extends FlutterPatcherCommand {
1421
1583
  class PocketBaseSettingsTestS3Command extends FlutterPatcherCommand {
1422
1584
  PocketBaseSettingsTestS3Command() {
1423
1585
  _addBackendOptions(argParser);
1424
- argParser.addOption('filesystem', help: 'Storage filesystem to test.', defaultsTo: 'storage');
1586
+ argParser.addOption(
1587
+ 'filesystem',
1588
+ help: 'Storage filesystem to test.',
1589
+ defaultsTo: 'storage',
1590
+ );
1425
1591
  }
1426
1592
 
1427
1593
  @override
@@ -1477,7 +1643,11 @@ class PocketBaseSettingsTestEmailCommand extends FlutterPatcherCommand {
1477
1643
  class PocketBaseSqlCommand extends FlutterPatcherCommand {
1478
1644
  PocketBaseSqlCommand() {
1479
1645
  _addBackendOptions(argParser);
1480
- argParser.addOption('query', help: 'SQL query to execute.', mandatory: true);
1646
+ argParser.addOption(
1647
+ 'query',
1648
+ help: 'SQL query to execute.',
1649
+ mandatory: true,
1650
+ );
1481
1651
  }
1482
1652
 
1483
1653
  @override
@@ -1490,8 +1660,13 @@ class PocketBaseSqlCommand extends FlutterPatcherCommand {
1490
1660
  Future<int> run() => runGuarded(() async {
1491
1661
  banner('pocketbase · sql');
1492
1662
  final query = argResults!['query'] as String;
1493
- final result = await _pbStep('Executing query', (c) => c.runSql(query), argResults!);
1494
- final columns = (result['columns'] as List? ?? []).cast<Map<String, dynamic>>();
1663
+ final result = await _pbStep(
1664
+ 'Executing query',
1665
+ (c) => c.runSql(query),
1666
+ argResults!,
1667
+ );
1668
+ final columns = (result['columns'] as List? ?? [])
1669
+ .cast<Map<String, dynamic>>();
1495
1670
  final rows = (result['rows'] as List? ?? []).cast<List<dynamic>>();
1496
1671
  if (rows.isNotEmpty) {
1497
1672
  final colNames = columns.map((c) => '${c['name']}').toList();
@@ -1534,15 +1709,23 @@ class PocketBaseCronsListCommand extends FlutterPatcherCommand {
1534
1709
  @override
1535
1710
  Future<int> run() => runGuarded(() async {
1536
1711
  banner('pocketbase · crons · list');
1537
- final crons = await _pbStep('Fetching cron jobs', (c) => c.listCrons(), argResults!);
1712
+ final crons = await _pbStep(
1713
+ 'Fetching cron jobs',
1714
+ (c) => c.listCrons(),
1715
+ argResults!,
1716
+ );
1538
1717
  if (crons.isEmpty) {
1539
1718
  warn('No cron jobs registered.');
1540
1719
  return;
1541
1720
  }
1542
- final rows = crons.map((c) => [
1543
- cyan(c['id']?.toString() ?? '?'),
1544
- c['expression']?.toString() ?? '?',
1545
- ]).toList();
1721
+ final rows = crons
1722
+ .map(
1723
+ (c) => [
1724
+ cyan(c['id']?.toString() ?? '?'),
1725
+ c['expression']?.toString() ?? '?',
1726
+ ],
1727
+ )
1728
+ .toList();
1546
1729
  table('${crons.length} cron jobs', ['ID', 'EXPRESSION'], rows);
1547
1730
  });
1548
1731
  }
@@ -1602,7 +1785,9 @@ class PocketBaseQueryCommand extends FlutterPatcherCommand {
1602
1785
  try {
1603
1786
  await client.authenticate(admin, pass);
1604
1787
  final res = await client.rawRequest(method, path, body: body);
1605
- stdout.writeln(const JsonEncoder.withIndent(' ').convert(jsonDecode(res.body)));
1788
+ stdout.writeln(
1789
+ const JsonEncoder.withIndent(' ').convert(jsonDecode(res.body)),
1790
+ );
1606
1791
  } finally {
1607
1792
  client.close();
1608
1793
  }
@@ -1634,7 +1819,10 @@ class PocketBaseConfigCommand extends FlutterPatcherCommand {
1634
1819
  kv('url', cyan(url)),
1635
1820
  kv('admin', admin),
1636
1821
  kv('version', paths.version),
1637
- kv('binary', exists ? green(paths.binaryPath.path) : red('not installed')),
1822
+ kv(
1823
+ 'binary',
1824
+ exists ? green(paths.binaryPath.path) : red('not installed'),
1825
+ ),
1638
1826
  ]);
1639
1827
  });
1640
1828
  }