@_nazmiforreal/flutter-ota 0.1.21 → 0.1.22
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.
- package/bin/flutter-ota-linux-x64 +0 -0
- package/dart-src/packages/cli-tools/.dart_tool/package_config.json +460 -0
- package/dart-src/packages/cli-tools/.dart_tool/package_graph.json +707 -0
- package/dart-src/packages/cli-tools/lib/flutter_ota_kit_cli.dart +7 -4
- package/dart-src/packages/cli-tools/lib/src/commands/bundle.dart +95 -32
- package/dart-src/packages/cli-tools/lib/src/commands/channel.dart +28 -12
- package/dart-src/packages/cli-tools/lib/src/commands/config_command.dart +9 -4
- package/dart-src/packages/cli-tools/lib/src/commands/deploy.dart +29 -6
- package/dart-src/packages/cli-tools/lib/src/commands/doctor.dart +20 -32
- package/dart-src/packages/cli-tools/lib/src/commands/init.dart +40 -19
- package/dart-src/packages/cli-tools/lib/src/commands/keys.dart +7 -5
- package/dart-src/packages/cli-tools/lib/src/commands/migrate.dart +33 -22
- package/dart-src/packages/cli-tools/lib/src/commands/pocketbase.dart +256 -68
- package/dart-src/packages/cli-tools/lib/src/commands/rollback.dart +17 -11
- package/dart-src/packages/cli-tools/lib/src/commands/storage.dart +28 -12
- package/dart-src/packages/cli-tools/lib/src/config.dart +5 -6
- package/dart-src/packages/cli-tools/lib/src/operations.dart +1 -3
- package/dart-src/packages/cli-tools/lib/src/pocketbase/process_manager.dart +17 -16
- package/dart-src/packages/cli-tools/lib/src/runner.dart +3 -1
- package/dart-src/packages/cli-tools/lib/src/ui/ui.dart +8 -14
- package/dart-src/packages/cli-tools/pubspec.lock +590 -0
- package/dart-src/packages/cli-tools/test/mocks/mock_pocketbase_client.dart +7 -3
- package/dart-src/packages/cli-tools/test/pocketbase_schema_test.dart +13 -16
- package/dart-src/packages/core/CHANGELOG.md +15 -0
- package/dart-src/packages/core/lib/src/bundle.dart +3 -6
- package/dart-src/packages/core/pubspec.yaml +1 -1
- package/dart-src/plugins/aws/CHANGELOG.md +18 -0
- package/dart-src/plugins/aws/lib/src/aws_cloudfront_client.dart +1 -2
- package/dart-src/plugins/aws/pubspec.yaml +3 -3
- package/dart-src/plugins/cloudflare/CHANGELOG.md +18 -0
- package/dart-src/plugins/cloudflare/pubspec.yaml +3 -3
- package/dart-src/plugins/plugin-core/CHANGELOG.md +15 -0
- package/dart-src/plugins/plugin-core/pubspec.yaml +2 -2
- package/dart-src/plugins/pocketbase/CHANGELOG.md +18 -0
- package/dart-src/plugins/pocketbase/pubspec.yaml +3 -3
- package/dart-src/plugins/postgres/CHANGELOG.md +18 -0
- package/dart-src/plugins/postgres/pubspec.yaml +3 -3
- package/dart-src/plugins/supabase/CHANGELOG.md +18 -0
- package/dart-src/plugins/supabase/pubspec.yaml +3 -3
- package/package.json +2 -2
- package/scripts/postinstall.js +5 -1
|
@@ -18,7 +18,7 @@ import '../pocketbase/schema_installer.dart';
|
|
|
18
18
|
import '../ui/ui.dart';
|
|
19
19
|
|
|
20
20
|
class PocketBaseCommand extends FlutterPatcherCommand {
|
|
21
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
343
|
+
final admin =
|
|
344
|
+
r['admin-email'] as String? ??
|
|
335
345
|
Platform.environment['POCKETBASE_ADMIN_EMAIL'] ??
|
|
336
346
|
'';
|
|
337
|
-
final pass =
|
|
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(
|
|
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(
|
|
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([
|
|
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 =>
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
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(
|
|
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 =
|
|
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(
|
|
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>(
|
|
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(
|
|
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(
|
|
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(
|
|
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>(
|
|
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(
|
|
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(
|
|
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 =>
|
|
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 =
|
|
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(
|
|
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
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
1259
|
-
|
|
1260
|
-
|
|
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(
|
|
1269
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
1335
|
-
|
|
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) =>
|
|
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(
|
|
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(
|
|
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 =
|
|
1416
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
1494
|
-
|
|
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(
|
|
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
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
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(
|
|
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(
|
|
1822
|
+
kv(
|
|
1823
|
+
'binary',
|
|
1824
|
+
exists ? green(paths.binaryPath.path) : red('not installed'),
|
|
1825
|
+
),
|
|
1638
1826
|
]);
|
|
1639
1827
|
});
|
|
1640
1828
|
}
|