@_nazmiforreal/flutter-ota 0.1.12 → 0.1.14

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 (177) hide show
  1. package/README.md +1 -1
  2. package/bin/flutter-ota-linux-x64 +0 -0
  3. package/dart-src/packages/cli-tools/.dart_tool/package_config.json +46 -76
  4. package/dart-src/packages/cli-tools/.dart_tool/package_graph.json +140 -166
  5. package/dart-src/packages/cli-tools/README.md +1 -1
  6. package/dart-src/packages/cli-tools/lib/flutter_ota_kit_cli.dart +30 -17
  7. package/dart-src/packages/cli-tools/lib/src/backend.dart +30 -31
  8. package/dart-src/packages/cli-tools/lib/src/cli_base.dart +3 -1
  9. package/dart-src/packages/cli-tools/lib/src/commands/build.dart +44 -43
  10. package/dart-src/packages/cli-tools/lib/src/commands/bundle.dart +265 -239
  11. package/dart-src/packages/cli-tools/lib/src/commands/channel.dart +75 -66
  12. package/dart-src/packages/cli-tools/lib/src/commands/config_command.dart +39 -35
  13. package/dart-src/packages/cli-tools/lib/src/commands/console.dart +30 -27
  14. package/dart-src/packages/cli-tools/lib/src/commands/deploy.dart +88 -72
  15. package/dart-src/packages/cli-tools/lib/src/commands/doctor.dart +66 -29
  16. package/dart-src/packages/cli-tools/lib/src/commands/fingerprint.dart +10 -6
  17. package/dart-src/packages/cli-tools/lib/src/commands/init.dart +290 -181
  18. package/dart-src/packages/cli-tools/lib/src/commands/keys.dart +24 -23
  19. package/dart-src/packages/cli-tools/lib/src/commands/migrate.dart +111 -97
  20. package/dart-src/packages/cli-tools/lib/src/commands/pocketbase.dart +237 -0
  21. package/dart-src/packages/cli-tools/lib/src/commands/rollback.dart +43 -34
  22. package/dart-src/packages/cli-tools/lib/src/commands/storage.dart +57 -53
  23. package/dart-src/packages/cli-tools/lib/src/config.dart +227 -93
  24. package/dart-src/packages/cli-tools/lib/src/operations.dart +9 -8
  25. package/dart-src/packages/cli-tools/lib/src/pack.dart +26 -25
  26. package/dart-src/packages/cli-tools/lib/src/pocketbase/data_bootstrap.dart +39 -0
  27. package/dart-src/packages/cli-tools/lib/src/pocketbase/hooks/bundles.pb.js +56 -0
  28. package/dart-src/packages/cli-tools/lib/src/pocketbase/installer.dart +189 -0
  29. package/dart-src/packages/cli-tools/lib/src/pocketbase/process_manager.dart +123 -0
  30. package/dart-src/packages/cli-tools/lib/src/pocketbase/schema_installer.dart +237 -0
  31. package/dart-src/packages/cli-tools/lib/src/runner.dart +36 -15
  32. package/dart-src/packages/cli-tools/lib/src/sign.dart +13 -5
  33. package/dart-src/packages/cli-tools/lib/src/ui/ui.dart +10 -13
  34. package/dart-src/packages/cli-tools/lib/src/util.dart +3 -1
  35. package/dart-src/packages/cli-tools/pubspec.lock +69 -116
  36. package/dart-src/packages/cli-tools/pubspec.yaml +25 -7
  37. package/dart-src/packages/cli-tools/test/backends_test.dart +62 -32
  38. package/dart-src/packages/cli-tools/test/build_pack_test.dart +4 -4
  39. package/dart-src/packages/cli-tools/test/cli_test.dart +89 -42
  40. package/dart-src/packages/cli-tools/test/mocks/mock_aws_s3_client.dart +8 -13
  41. package/dart-src/packages/cli-tools/test/mocks/mock_d1_client.dart +23 -18
  42. package/dart-src/packages/cli-tools/test/mocks/mock_pocketbase_client.dart +197 -0
  43. package/dart-src/packages/cli-tools/test/mocks/mock_postgres_client.dart +70 -46
  44. package/dart-src/packages/cli-tools/test/pocketbase_installer_test.dart +72 -0
  45. package/dart-src/packages/cli-tools/test/pocketbase_schema_test.dart +107 -0
  46. package/dart-src/packages/cli-tools/test/pocketbase_smoke_test.dart +59 -0
  47. package/dart-src/packages/core/CHANGELOG.md +9 -0
  48. package/dart-src/packages/core/README.md +2 -2
  49. package/dart-src/packages/core/example/lib/main.dart +69 -0
  50. package/dart-src/packages/core/lib/flutter_ota_kit_core.dart +1 -1
  51. package/dart-src/packages/core/lib/src/app_update_info.dart +17 -15
  52. package/dart-src/packages/core/lib/src/bundle.dart +102 -94
  53. package/dart-src/packages/core/lib/src/bundle_artifacts.dart +1 -2
  54. package/dart-src/packages/core/lib/src/bundle_patch_artifact.dart +15 -16
  55. package/dart-src/packages/core/lib/src/changed_asset.dart +24 -22
  56. package/dart-src/packages/core/lib/src/get_bundles_args.dart +13 -13
  57. package/dart-src/packages/core/lib/src/metadata.dart +9 -7
  58. package/dart-src/packages/core/lib/src/patch_info.dart +8 -7
  59. package/dart-src/packages/core/lib/src/platform.dart +4 -3
  60. package/dart-src/packages/core/lib/src/rollout.dart +14 -11
  61. package/dart-src/packages/core/lib/src/semver_range.dart +49 -39
  62. package/dart-src/packages/core/lib/src/semver_version.dart +8 -7
  63. package/dart-src/packages/core/lib/src/status.dart +4 -3
  64. package/dart-src/packages/core/lib/src/update_bundle_params.dart +7 -7
  65. package/dart-src/packages/core/lib/src/uuid.dart +1 -2
  66. package/dart-src/packages/core/pubspec.yaml +6 -7
  67. package/dart-src/packages/core/test/rollout_test.dart +15 -8
  68. package/dart-src/packages/core/test/semver_test.dart +5 -2
  69. package/dart-src/packages/core/test/types_test.dart +26 -24
  70. package/dart-src/packages/core/test/uuid_test.dart +3 -1
  71. package/dart-src/packages/core/tool/dbg.dart +1 -0
  72. package/dart-src/plugins/aws/CHANGELOG.md +15 -0
  73. package/dart-src/plugins/aws/example/lib/main.dart +60 -0
  74. package/dart-src/plugins/aws/lib/flutter_ota_kit_aws.dart +5 -1
  75. package/dart-src/plugins/aws/lib/src/aws_cloudfront_client.dart +11 -16
  76. package/dart-src/plugins/aws/lib/src/aws_cloudfront_signer.dart +7 -2
  77. package/dart-src/plugins/aws/lib/src/aws_database.dart +14 -18
  78. package/dart-src/plugins/aws/lib/src/aws_s3_client.dart +23 -18
  79. package/dart-src/plugins/aws/lib/src/aws_ssm_client.dart +5 -4
  80. package/dart-src/plugins/aws/lib/src/aws_storage.dart +2 -3
  81. package/dart-src/plugins/aws/lib/src/aws_storage_profile.dart +10 -16
  82. package/dart-src/plugins/aws/lib/src/with_cloudfront_signed_url.dart +6 -9
  83. package/dart-src/plugins/aws/pubspec.yaml +15 -10
  84. package/dart-src/plugins/aws/test/aws_database_test.dart +51 -57
  85. package/dart-src/plugins/aws/test/mock_aws_s3_client.dart +8 -13
  86. package/dart-src/plugins/cloudflare/CHANGELOG.md +15 -0
  87. package/dart-src/plugins/cloudflare/example/lib/main.dart +62 -0
  88. package/dart-src/plugins/cloudflare/lib/flutter_ota_kit_cloudflare.dart +4 -2
  89. package/dart-src/plugins/cloudflare/lib/src/cloudflare_worker_database.dart +3 -3
  90. package/dart-src/plugins/cloudflare/lib/src/d1_build_where.dart +3 -2
  91. package/dart-src/plugins/cloudflare/lib/src/d1_bundle_mapper.dart +24 -27
  92. package/dart-src/plugins/cloudflare/lib/src/d1_database_plugin.dart +22 -30
  93. package/dart-src/plugins/cloudflare/lib/src/r2_config.dart +1 -1
  94. package/dart-src/plugins/cloudflare/lib/src/r2_s3_client.dart +21 -29
  95. package/dart-src/plugins/cloudflare/lib/src/r2_storage.dart +7 -7
  96. package/dart-src/plugins/cloudflare/lib/src/r2_storage_profile.dart +7 -15
  97. package/dart-src/plugins/cloudflare/pubspec.yaml +14 -9
  98. package/dart-src/plugins/cloudflare/test/cloudflare_worker_database_test.dart +46 -42
  99. package/dart-src/plugins/cloudflare/test/d1_database_test.dart +100 -90
  100. package/dart-src/plugins/cloudflare/test/mock_d1_client.dart +23 -18
  101. package/dart-src/plugins/cloudflare/test/mock_r2_client.dart +8 -13
  102. package/dart-src/plugins/cloudflare/test/r2_storage_test.dart +1 -4
  103. package/dart-src/plugins/plugin-core/CHANGELOG.md +15 -1
  104. package/dart-src/plugins/plugin-core/example/lib/main.dart +61 -0
  105. package/dart-src/plugins/plugin-core/lib/flutter_ota_kit_plugin_core.dart +3 -7
  106. package/dart-src/plugins/plugin-core/lib/src/asset_storage_layout.dart +5 -5
  107. package/dart-src/plugins/plugin-core/lib/src/bundle_helpers.dart +23 -0
  108. package/dart-src/plugins/plugin-core/lib/src/bundle_storage_layout.dart +16 -10
  109. package/dart-src/plugins/plugin-core/lib/src/bundle_unit_of_work.dart +31 -26
  110. package/dart-src/plugins/plugin-core/lib/src/calculate_pagination.dart +5 -1
  111. package/dart-src/plugins/plugin-core/lib/src/content_addressed_assets.dart +1 -1
  112. package/dart-src/plugins/plugin-core/lib/src/create_blob_database_plugin.dart +78 -71
  113. package/dart-src/plugins/plugin-core/lib/src/create_database_plugin.dart +56 -35
  114. package/dart-src/plugins/plugin-core/lib/src/create_storage_plugin.dart +10 -13
  115. package/dart-src/plugins/plugin-core/lib/src/paginate_bundles.dart +30 -17
  116. package/dart-src/plugins/plugin-core/lib/src/parse_storage_uri.dart +3 -1
  117. package/dart-src/plugins/plugin-core/lib/src/query_bundles.dart +5 -3
  118. package/dart-src/plugins/plugin-core/lib/src/request_update_bundle_state.dart +2 -4
  119. package/dart-src/plugins/plugin-core/lib/src/storage_helpers.dart +18 -0
  120. package/dart-src/plugins/plugin-core/lib/src/types.dart +7 -6
  121. package/dart-src/plugins/plugin-core/pubspec.yaml +12 -9
  122. package/dart-src/plugins/plugin-core/test/asset_storage_layout_test.dart +13 -9
  123. package/dart-src/plugins/plugin-core/test/bundle_unit_of_work_test.dart +28 -15
  124. package/dart-src/plugins/plugin-core/test/create_blob_database_plugin_test.dart +254 -122
  125. package/dart-src/plugins/plugin-core/test/create_database_plugin_test.dart +36 -32
  126. package/dart-src/plugins/plugin-core/test/create_storage_plugin_test.dart +18 -15
  127. package/dart-src/plugins/plugin-core/test/generate_min_bundle_id_test.dart +8 -3
  128. package/dart-src/plugins/plugin-core/test/get_update_info_test.dart +682 -693
  129. package/dart-src/plugins/plugin-core/test/helpers_test.dart +45 -21
  130. package/dart-src/plugins/plugin-core/test/query_bundles_test.dart +76 -13
  131. package/dart-src/plugins/plugin-core/test/uuidv7_test.dart +20 -9
  132. package/dart-src/plugins/pocketbase/CHANGELOG.md +8 -0
  133. package/dart-src/plugins/pocketbase/LICENSE +21 -0
  134. package/dart-src/plugins/pocketbase/README.md +54 -0
  135. package/dart-src/plugins/pocketbase/example/lib/main.dart +62 -0
  136. package/dart-src/plugins/pocketbase/lib/flutter_ota_kit_pocketbase.dart +28 -0
  137. package/dart-src/plugins/pocketbase/lib/src/pocketbase_bundle_mapper.dart +121 -0
  138. package/dart-src/plugins/pocketbase/lib/src/pocketbase_client.dart +349 -0
  139. package/dart-src/plugins/pocketbase/lib/src/pocketbase_config.dart +61 -0
  140. package/dart-src/plugins/pocketbase/lib/src/pocketbase_database.dart +278 -0
  141. package/dart-src/plugins/pocketbase/lib/src/pocketbase_storage.dart +255 -0
  142. package/dart-src/plugins/pocketbase/pubspec.yaml +26 -0
  143. package/dart-src/plugins/pocketbase/test/pb_uri_test.dart +12 -0
  144. package/dart-src/plugins/postgres/CHANGELOG.md +16 -0
  145. package/dart-src/plugins/postgres/example/lib/main.dart +67 -0
  146. package/dart-src/plugins/postgres/lib/flutter_ota_kit_postgres.dart +3 -6
  147. package/dart-src/plugins/postgres/lib/src/postgres_bundle_mapper.dart +32 -52
  148. package/dart-src/plugins/postgres/lib/src/postgres_config.dart +3 -1
  149. package/dart-src/plugins/postgres/lib/src/postgres_database.dart +28 -38
  150. package/dart-src/plugins/postgres/lib/src/postgres_get_update_info.dart +16 -14
  151. package/dart-src/plugins/postgres/lib/src/postgres_storage.dart +26 -14
  152. package/dart-src/plugins/postgres/lib/src/postgres_types.dart +27 -28
  153. package/dart-src/plugins/postgres/pubspec.yaml +14 -9
  154. package/dart-src/plugins/postgres/test/mock_postgres_client.dart +62 -39
  155. package/dart-src/plugins/postgres/test/postgres_bundle_mapper_test.dart +3 -4
  156. package/dart-src/plugins/postgres/test/postgres_database_test.dart +102 -73
  157. package/dart-src/plugins/postgres/test/postgres_storage_runtime_test.dart +60 -0
  158. package/dart-src/plugins/supabase/CHANGELOG.md +20 -0
  159. package/dart-src/plugins/supabase/README.md +2 -2
  160. package/dart-src/plugins/supabase/example/lib/main.dart +63 -0
  161. package/dart-src/plugins/supabase/lib/flutter_ota_kit_supabase.dart +2 -0
  162. package/dart-src/plugins/supabase/lib/src/error_message.dart +11 -0
  163. package/dart-src/plugins/supabase/lib/src/supabase_bundle_mapper.dart +34 -58
  164. package/dart-src/plugins/supabase/lib/src/supabase_client_adapter.dart +3 -13
  165. package/dart-src/plugins/supabase/lib/src/supabase_client_http.dart +34 -52
  166. package/dart-src/plugins/supabase/lib/src/supabase_database.dart +38 -30
  167. package/dart-src/plugins/supabase/lib/src/supabase_edge_function_storage.dart +21 -29
  168. package/dart-src/plugins/supabase/lib/src/supabase_signed_url_batcher.dart +7 -19
  169. package/dart-src/plugins/supabase/lib/src/supabase_storage.dart +18 -29
  170. package/dart-src/plugins/supabase/lib/src/types.dart +26 -26
  171. package/dart-src/plugins/supabase/pubspec.yaml +14 -9
  172. package/dart-src/plugins/supabase/test/mock_supabase_client.dart +57 -57
  173. package/dart-src/plugins/supabase/test/supabase_bundle_mapper_test.dart +30 -27
  174. package/dart-src/plugins/supabase/test/supabase_database_test.dart +26 -35
  175. package/dart-src/plugins/supabase/test/supabase_storage_test.dart +27 -34
  176. package/package.json +3 -3
  177. package/scripts/vendor.sh +1 -1
@@ -1,6 +1,7 @@
1
1
  import 'package:flutter_ota_kit_aws/flutter_ota_kit_aws.dart';
2
2
  import 'package:flutter_ota_kit_cloudflare/flutter_ota_kit_cloudflare.dart';
3
3
  import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
4
+ import 'package:flutter_ota_kit_pocketbase/flutter_ota_kit_pocketbase.dart';
4
5
  import 'package:flutter_ota_kit_postgres/flutter_ota_kit_postgres.dart';
5
6
  import 'package:flutter_ota_kit_supabase/flutter_ota_kit_supabase.dart';
6
7
 
@@ -8,11 +9,7 @@ import 'config.dart';
8
9
 
9
10
  /// Backend handle wiring the database + node storage profiles used by the CLI.
10
11
  class Backend {
11
- const Backend({
12
- required this.db,
13
- required this.storage,
14
- this.basePath,
15
- });
12
+ const Backend({required this.db, required this.storage, this.basePath});
16
13
 
17
14
  final DatabasePlugin db;
18
15
  final NodeStorageProfile storage;
@@ -33,10 +30,10 @@ class Backend {
33
30
 
34
31
  /// Construct a [Backend] for the configured provider.
35
32
  ///
36
- /// Supports `supabase`, `postgres`, `cloudflare`, and `aws`. Credential
37
- /// precedence is: explicit factory/flag > environment variable > JSON config
38
- /// (see the `resolve*Config` helpers in `config.dart`). Test seams let callers
39
- /// inject mock clients (e.g. `postgresClientFactory`).
33
+ /// Supports `supabase`, `postgres`, `cloudflare`, `aws`, and `pocketbase`.
34
+ /// Credential precedence is: explicit factory/flag > environment variable >
35
+ /// JSON config (see the `resolve*Config` helpers in `config.dart`). Test seams
36
+ /// let callers inject mock clients (e.g. `postgresClientFactory`).
40
37
  Backend resolveBackend(
41
38
  FlutterPatcherConfig config, {
42
39
  SupabaseClientFactory? supabaseClientFactory,
@@ -45,8 +42,9 @@ Backend resolveBackend(
45
42
  PostgresClientFactory? postgresClientFactory,
46
43
  AwsS3ClientLike Function(S3DatabaseConfig config)? awsS3ClientFactory,
47
44
  AwsCloudFrontClientLike Function(S3DatabaseConfig config)?
48
- awsCloudFrontClientFactory,
45
+ awsCloudFrontClientFactory,
49
46
  AwsS3ClientLike Function(AwsS3StorageConfig config)? awsStorageClientFactory,
47
+ PocketBaseClientFactory? pocketbaseClientFactory,
50
48
  }) {
51
49
  switch (config.provider) {
52
50
  case 'supabase':
@@ -64,11 +62,7 @@ Backend resolveBackend(
64
62
  if (node == null) {
65
63
  throw StateError('Supabase storage plugin exposes no node profile.');
66
64
  }
67
- return Backend(
68
- db: db,
69
- storage: node,
70
- basePath: storageConfig.basePath,
71
- );
65
+ return Backend(db: db, storage: node, basePath: storageConfig.basePath);
72
66
 
73
67
  case 'postgres':
74
68
  final dbConfig = resolvePostgresDatabaseConfig(
@@ -85,11 +79,7 @@ Backend resolveBackend(
85
79
  if (node == null) {
86
80
  throw StateError('Postgres storage plugin exposes no node profile.');
87
81
  }
88
- return Backend(
89
- db: db,
90
- storage: node,
91
- basePath: storageConfig.basePath,
92
- );
82
+ return Backend(db: db, storage: node, basePath: storageConfig.basePath);
93
83
 
94
84
  case 'cloudflare':
95
85
  final dbConfig = resolveCloudflareDatabaseConfig(
@@ -106,11 +96,7 @@ Backend resolveBackend(
106
96
  if (node == null) {
107
97
  throw StateError('R2 storage plugin exposes no node profile.');
108
98
  }
109
- return Backend(
110
- db: db,
111
- storage: node,
112
- basePath: storageConfig.basePath,
113
- );
99
+ return Backend(db: db, storage: node, basePath: storageConfig.basePath);
114
100
 
115
101
  case 'aws':
116
102
  final dbConfig = resolveAwsDatabaseConfig(
@@ -128,16 +114,29 @@ Backend resolveBackend(
128
114
  if (node == null) {
129
115
  throw StateError('S3 storage plugin exposes no node profile.');
130
116
  }
131
- return Backend(
132
- db: db,
133
- storage: node,
134
- basePath: storageConfig.basePath,
117
+ return Backend(db: db, storage: node, basePath: storageConfig.basePath);
118
+
119
+ case 'pocketbase':
120
+ final dbConfig = resolvePocketBaseDatabaseConfig(
121
+ config,
122
+ clientFactory: pocketbaseClientFactory,
135
123
  );
124
+ final storageConfig = resolvePocketBaseStorageConfig(
125
+ config,
126
+ clientFactory: pocketbaseClientFactory,
127
+ );
128
+ final db = pocketbaseDatabase(dbConfig)();
129
+ final storage = pocketbaseStorage(storageConfig);
130
+ final node = storage.profiles.node;
131
+ if (node == null) {
132
+ throw StateError('PocketBase storage plugin exposes no node profile.');
133
+ }
134
+ return Backend(db: db, storage: node, basePath: storageConfig.basePath);
136
135
 
137
136
  default:
138
137
  throw UnsupportedError(
139
138
  'Provider "${config.provider}" is not supported. '
140
- 'Supported: supabase, postgres, cloudflare, aws.',
139
+ 'Supported: supabase, postgres, cloudflare, aws, pocketbase.',
141
140
  );
142
141
  }
143
- }
142
+ }
@@ -53,13 +53,15 @@ FlutterPatcherConfig? effectiveConfig(
53
53
  ) {
54
54
  final backend = argResults['backend'] as String?;
55
55
  if (backend == null) return cfg;
56
- final base = cfg ??
56
+ final base =
57
+ cfg ??
57
58
  FlutterPatcherConfig(
58
59
  provider: backend,
59
60
  supabase: const SupabaseConfigJson(),
60
61
  postgres: const PostgresConfigJson(),
61
62
  cloudflare: const CloudflareConfigJson(),
62
63
  aws: const AwsConfigJson(),
64
+ pocketbase: const PocketBaseConfigJson(),
63
65
  );
64
66
  return base.copyWith(provider: backend);
65
67
  }
@@ -30,7 +30,8 @@ class BuildCommand extends FlutterPatcherCommand {
30
30
  )
31
31
  ..addOption(
32
32
  'abi',
33
- help: 'Restrict the patch to a single ABI (e.g. arm64-v8a). '
33
+ help:
34
+ 'Restrict the patch to a single ABI (e.g. arm64-v8a). '
34
35
  'Default: all ABIs found in the APK are included.',
35
36
  )
36
37
  ..addOption(
@@ -50,48 +51,48 @@ class BuildCommand extends FlutterPatcherCommand {
50
51
 
51
52
  @override
52
53
  Future<int> run() => runGuarded(() async {
53
- final results = argResults!;
54
- final apk = results['apk'] as String?;
55
- if (apk == null || apk.isEmpty) {
56
- throw PackException('missing required --apk <path>', 64);
57
- }
58
- final version = results['version'] as String?;
59
- if (version == null || version.isEmpty) {
60
- throw PackException('missing required --version <string>', 64);
61
- }
62
- final targetVersionCodeRaw = results['target-version-code'] as String?;
63
- if (targetVersionCodeRaw == null || targetVersionCodeRaw.isEmpty) {
64
- throw PackException('missing required --target-version-code <int>', 64);
65
- }
66
- final targetVersionCode = int.tryParse(targetVersionCodeRaw);
67
- if (targetVersionCode == null) {
68
- throw PackException('--target-version-code must be an integer', 64);
69
- }
54
+ final results = argResults!;
55
+ final apk = results['apk'] as String?;
56
+ if (apk == null || apk.isEmpty) {
57
+ throw PackException('missing required --apk <path>', 64);
58
+ }
59
+ final version = results['version'] as String?;
60
+ if (version == null || version.isEmpty) {
61
+ throw PackException('missing required --version <string>', 64);
62
+ }
63
+ final targetVersionCodeRaw = results['target-version-code'] as String?;
64
+ if (targetVersionCodeRaw == null || targetVersionCodeRaw.isEmpty) {
65
+ throw PackException('missing required --target-version-code <int>', 64);
66
+ }
67
+ final targetVersionCode = int.tryParse(targetVersionCodeRaw);
68
+ if (targetVersionCode == null) {
69
+ throw PackException('--target-version-code must be an integer', 64);
70
+ }
70
71
 
71
- banner('build');
72
- final bar = ProgressBar(1, 'pack');
73
- final result = await packPatch(
74
- apkPath: apk,
75
- version: version,
76
- targetVersionCode: targetVersionCode,
77
- abi: results['abi'] as String?,
78
- requestedAssets: results['assets'] as List<String>,
79
- out: results['out'] as String,
80
- onProgress: (done, total, label) {
81
- bar.total = total;
82
- bar.update(done, label);
83
- },
84
- );
72
+ banner('build');
73
+ final bar = ProgressBar(1, 'pack');
74
+ final result = await packPatch(
75
+ apkPath: apk,
76
+ version: version,
77
+ targetVersionCode: targetVersionCode,
78
+ abi: results['abi'] as String?,
79
+ requestedAssets: results['assets'] as List<String>,
80
+ out: results['out'] as String,
81
+ onProgress: (done, total, label) {
82
+ bar.total = total;
83
+ bar.update(done, label);
84
+ },
85
+ );
85
86
 
86
- box('patch.zip', [
87
- kv('version', result.version),
88
- kv('target code', result.targetVersionCode.toString()),
89
- kv('abis', cyan(result.abis.join(' · '))),
90
- kv('bundle md5', gray(result.md5)),
91
- kv('overlay assets', result.assetCount.toString()),
92
- kv('payload', result.payloadPath),
93
- kv('manifest', result.manifestPath),
94
- ]);
95
- step('Build complete — ready to deploy.');
96
- });
87
+ box('patch.zip', [
88
+ kv('version', result.version),
89
+ kv('target code', result.targetVersionCode.toString()),
90
+ kv('abis', cyan(result.abis.join(' · '))),
91
+ kv('bundle md5', gray(result.md5)),
92
+ kv('overlay assets', result.assetCount.toString()),
93
+ kv('payload', result.payloadPath),
94
+ kv('manifest', result.manifestPath),
95
+ ]);
96
+ step('Build complete — ready to deploy.');
97
+ });
97
98
  }