@_nazmiforreal/flutter-ota 0.1.25 → 0.1.27

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 (256) hide show
  1. package/bin/flutter-ota-linux-x64 +0 -0
  2. package/bin/flutter-ota.js +12 -11
  3. package/dart-src/packages/cli-tools/lib/flutter_ota_kit_cli.dart +46 -13
  4. package/dart-src/packages/cli-tools/lib/src/backend.dart +6 -6
  5. package/dart-src/packages/cli-tools/lib/src/commands/build.dart +2 -0
  6. package/dart-src/packages/cli-tools/lib/src/commands/bundle.dart +7 -7
  7. package/dart-src/packages/cli-tools/lib/src/commands/deploy.dart +4 -1
  8. package/dart-src/packages/cli-tools/lib/src/commands/pocketbase.dart +1 -1
  9. package/dart-src/packages/cli-tools/lib/src/commands/rollback.dart +1 -1
  10. package/dart-src/packages/cli-tools/lib/src/config.dart +5 -5
  11. package/dart-src/packages/cli-tools/lib/src/operations.dart +2 -2
  12. package/dart-src/packages/cli-tools/pubspec.yaml +8 -21
  13. package/dart-src/packages/cli-tools/test/backends_test.dart +3 -3
  14. package/dart-src/packages/cli-tools/test/cli_test.dart +1 -1
  15. package/dart-src/packages/cli-tools/test/mocks/mock_aws_s3_client.dart +2 -2
  16. package/dart-src/packages/cli-tools/test/mocks/mock_d1_client.dart +2 -2
  17. package/dart-src/packages/cli-tools/test/mocks/mock_pocketbase_client.dart +4 -1
  18. package/dart-src/packages/cli-tools/test/mocks/mock_postgres_client.dart +2 -2
  19. package/dart-src/packages/cli-tools/test/pocketbase_smoke_test.dart +1 -1
  20. package/dart-src/root/README.md +394 -0
  21. package/dart-src/root/analysis_options.yaml +21 -0
  22. package/dart-src/root/android/build.gradle +116 -0
  23. package/dart-src/root/android/consumer-rules.pro +23 -0
  24. package/dart-src/root/android/settings.gradle +1 -0
  25. package/dart-src/root/android/src/main/AndroidManifest.xml +21 -0
  26. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/ApplyResult.kt +52 -0
  27. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/BlacklistStore.kt +154 -0
  28. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/BootDiagnosticStore.kt +150 -0
  29. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/CrashGuard.kt +271 -0
  30. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/FlutterPatcherApplication.kt +201 -0
  31. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/FlutterPatcherAutoInitProvider.kt +93 -0
  32. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/FlutterPatcherPlugin.kt +245 -0
  33. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/LoaderHook.kt +298 -0
  34. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/PatchManager.kt +1579 -0
  35. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/PatcherConfig.kt +173 -0
  36. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/SignatureVerifier.kt +177 -0
  37. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/CrashGuardTest.kt +61 -0
  38. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/LoaderHookTest.kt +25 -0
  39. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/PatchManagerTest.kt +401 -0
  40. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/PatcherConfigTest.kt +30 -0
  41. package/dart-src/root/bin/pack.dart +182 -0
  42. package/dart-src/root/lib/flutter_ota_kit.dart +1170 -0
  43. package/dart-src/root/lib/src/app_version_resolver.dart +36 -0
  44. package/dart-src/root/lib/src/aws_update_source.dart +97 -0
  45. package/dart-src/root/lib/src/blacklist.dart +54 -0
  46. package/dart-src/root/lib/src/boot_diagnostic.dart +138 -0
  47. package/dart-src/root/lib/src/cloudflare_update_source.dart +97 -0
  48. package/dart-src/root/lib/src/flutter_ota_app.dart +69 -0
  49. package/dart-src/root/lib/src/io.dart +48 -0
  50. package/dart-src/root/lib/src/io_stub.dart +19 -0
  51. package/dart-src/root/lib/src/ota_progress_overlay.dart +987 -0
  52. package/dart-src/root/lib/src/pack/pack.dart +434 -0
  53. package/dart-src/root/lib/src/patch_info.dart +12 -0
  54. package/dart-src/root/lib/src/patcher_channel.dart +160 -0
  55. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_database.dart +1 -1
  56. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_s3_client.dart +1 -1
  57. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_storage.dart +1 -1
  58. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_storage_profile.dart +1 -1
  59. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/with_cloudfront_signed_url.dart +1 -1
  60. package/dart-src/root/lib/src/pkg/client/flutter_ota_kit_client.dart +1 -0
  61. package/dart-src/root/lib/src/pkg/client/src/server_update_source.dart +46 -0
  62. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/cloudflare_worker_database.dart +1 -1
  63. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_build_where.dart +1 -1
  64. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_bundle_mapper.dart +3 -3
  65. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_database.dart +1 -1
  66. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_database_plugin.dart +2 -2
  67. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_s3_client.dart +1 -1
  68. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_storage.dart +1 -1
  69. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_storage_profile.dart +1 -1
  70. package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/status.dart +1 -1
  71. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/flutter_ota_kit_plugin_core.dart +1 -1
  72. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_blob_database_plugin.dart +1 -1
  73. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/filter_compatible_app_versions.dart +1 -1
  74. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/get_update_info.dart +1 -1
  75. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/request_update_bundle_state.dart +1 -1
  76. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/resolve_update_info_from_bundles.dart +1 -1
  77. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/types.dart +2 -2
  78. package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_bundle_mapper.dart +2 -2
  79. package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_database.dart +26 -15
  80. package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_storage.dart +1 -1
  81. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_bundle_mapper.dart +2 -2
  82. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_database.dart +2 -2
  83. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_get_update_info.dart +2 -2
  84. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_storage.dart +1 -1
  85. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_types.dart +1 -1
  86. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_bundle_mapper.dart +2 -2
  87. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_database.dart +2 -2
  88. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_edge_function_database.dart +1 -1
  89. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_edge_function_storage.dart +1 -1
  90. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_storage.dart +1 -1
  91. package/dart-src/root/lib/src/pocketbase_update_source.dart +107 -0
  92. package/dart-src/root/lib/src/postgres_update_source.dart +95 -0
  93. package/dart-src/root/lib/src/shared_update_check.dart +131 -0
  94. package/dart-src/root/lib/src/supabase_update_source.dart +93 -0
  95. package/dart-src/root/pubspec.yaml +54 -0
  96. package/package.json +2 -1
  97. package/scripts/postinstall.js +17 -13
  98. package/scripts/vendor.sh +22 -7
  99. package/dart-src/packages/core/CHANGELOG.md +0 -21
  100. package/dart-src/packages/core/README.md +0 -23
  101. package/dart-src/packages/core/example/lib/main.dart +0 -69
  102. package/dart-src/packages/core/pubspec.yaml +0 -13
  103. package/dart-src/packages/core/test/rollout_test.dart +0 -135
  104. package/dart-src/packages/core/test/semver_test.dart +0 -55
  105. package/dart-src/packages/core/test/semver_vectors.json +0 -1
  106. package/dart-src/packages/core/test/types_test.dart +0 -131
  107. package/dart-src/packages/core/test/uuid_test.dart +0 -40
  108. package/dart-src/packages/core/tool/dbg.dart +0 -7
  109. package/dart-src/plugins/aws/.gitkeep +0 -0
  110. package/dart-src/plugins/aws/CHANGELOG.md +0 -23
  111. package/dart-src/plugins/aws/LICENSE +0 -21
  112. package/dart-src/plugins/aws/README.md +0 -28
  113. package/dart-src/plugins/aws/example/lib/main.dart +0 -60
  114. package/dart-src/plugins/aws/pubspec.yaml +0 -30
  115. package/dart-src/plugins/aws/test/aws_database_test.dart +0 -161
  116. package/dart-src/plugins/aws/test/aws_storage_test.dart +0 -73
  117. package/dart-src/plugins/aws/test/mock_aws_s3_client.dart +0 -78
  118. package/dart-src/plugins/cloudflare/.gitkeep +0 -0
  119. package/dart-src/plugins/cloudflare/CHANGELOG.md +0 -23
  120. package/dart-src/plugins/cloudflare/LICENSE +0 -21
  121. package/dart-src/plugins/cloudflare/README.md +0 -25
  122. package/dart-src/plugins/cloudflare/example/lib/main.dart +0 -62
  123. package/dart-src/plugins/cloudflare/migrations/0001_hot-updater_init.sql +0 -16
  124. package/dart-src/plugins/cloudflare/migrations/0002_hot-updater_0.13.0.sql +0 -8
  125. package/dart-src/plugins/cloudflare/migrations/0003_hot-updater_0.18.0.sql +0 -38
  126. package/dart-src/plugins/cloudflare/migrations/0004_hot-updater_0.29.0.sql +0 -11
  127. package/dart-src/plugins/cloudflare/migrations/0005_hot-updater_0.31.0.sql +0 -24
  128. package/dart-src/plugins/cloudflare/pubspec.yaml +0 -28
  129. package/dart-src/plugins/cloudflare/sql/bundles.sql +0 -42
  130. package/dart-src/plugins/cloudflare/test/cloudflare_worker_database_test.dart +0 -126
  131. package/dart-src/plugins/cloudflare/test/d1_bundle_mapper_test.dart +0 -106
  132. package/dart-src/plugins/cloudflare/test/d1_database_test.dart +0 -200
  133. package/dart-src/plugins/cloudflare/test/mock_d1_client.dart +0 -261
  134. package/dart-src/plugins/cloudflare/test/mock_r2_client.dart +0 -78
  135. package/dart-src/plugins/cloudflare/test/r2_storage_test.dart +0 -74
  136. package/dart-src/plugins/plugin-core/CHANGELOG.md +0 -20
  137. package/dart-src/plugins/plugin-core/LICENSE +0 -21
  138. package/dart-src/plugins/plugin-core/README.md +0 -21
  139. package/dart-src/plugins/plugin-core/example/lib/main.dart +0 -61
  140. package/dart-src/plugins/plugin-core/pubspec.yaml +0 -23
  141. package/dart-src/plugins/plugin-core/test/asset_storage_layout_test.dart +0 -170
  142. package/dart-src/plugins/plugin-core/test/bundle_unit_of_work_store_test.dart +0 -74
  143. package/dart-src/plugins/plugin-core/test/bundle_unit_of_work_test.dart +0 -345
  144. package/dart-src/plugins/plugin-core/test/create_blob_database_plugin_test.dart +0 -843
  145. package/dart-src/plugins/plugin-core/test/create_database_plugin_test.dart +0 -298
  146. package/dart-src/plugins/plugin-core/test/create_storage_plugin_test.dart +0 -195
  147. package/dart-src/plugins/plugin-core/test/generate_min_bundle_id_test.dart +0 -56
  148. package/dart-src/plugins/plugin-core/test/get_update_info_test.dart +0 -1589
  149. package/dart-src/plugins/plugin-core/test/helpers_test.dart +0 -283
  150. package/dart-src/plugins/plugin-core/test/query_bundles_test.dart +0 -202
  151. package/dart-src/plugins/plugin-core/test/request_update_bundle_state_test.dart +0 -86
  152. package/dart-src/plugins/plugin-core/test/uuidv7_test.dart +0 -88
  153. package/dart-src/plugins/pocketbase/CHANGELOG.md +0 -23
  154. package/dart-src/plugins/pocketbase/LICENSE +0 -21
  155. package/dart-src/plugins/pocketbase/README.md +0 -54
  156. package/dart-src/plugins/pocketbase/example/lib/main.dart +0 -62
  157. package/dart-src/plugins/pocketbase/pubspec.yaml +0 -26
  158. package/dart-src/plugins/pocketbase/test/pb_uri_test.dart +0 -12
  159. package/dart-src/plugins/postgres/.gitkeep +0 -0
  160. package/dart-src/plugins/postgres/CHANGELOG.md +0 -23
  161. package/dart-src/plugins/postgres/LICENSE +0 -21
  162. package/dart-src/plugins/postgres/README.md +0 -29
  163. package/dart-src/plugins/postgres/example/lib/main.dart +0 -67
  164. package/dart-src/plugins/postgres/pubspec.yaml +0 -26
  165. package/dart-src/plugins/postgres/sql/bundles.sql +0 -45
  166. package/dart-src/plugins/postgres/sql/get_target_app_version_list.sql +0 -21
  167. package/dart-src/plugins/postgres/sql/get_update_info.spec.ts +0 -171
  168. package/dart-src/plugins/postgres/sql/get_update_info_by_app_version.sql +0 -126
  169. package/dart-src/plugins/postgres/sql/get_update_info_by_fingerprint_hash.sql +0 -125
  170. package/dart-src/plugins/postgres/sql/hash_user_id.sql +0 -30
  171. package/dart-src/plugins/postgres/sql/is_device_eligible.sql +0 -237
  172. package/dart-src/plugins/postgres/sql/prepareSql.ts +0 -11
  173. package/dart-src/plugins/postgres/test/mock_postgres_client.dart +0 -320
  174. package/dart-src/plugins/postgres/test/postgres_bundle_mapper_test.dart +0 -139
  175. package/dart-src/plugins/postgres/test/postgres_database_test.dart +0 -210
  176. package/dart-src/plugins/postgres/test/postgres_storage_runtime_test.dart +0 -60
  177. package/dart-src/plugins/supabase/CHANGELOG.md +0 -24
  178. package/dart-src/plugins/supabase/LICENSE +0 -21
  179. package/dart-src/plugins/supabase/README.md +0 -53
  180. package/dart-src/plugins/supabase/example/lib/main.dart +0 -63
  181. package/dart-src/plugins/supabase/pubspec.yaml +0 -27
  182. package/dart-src/plugins/supabase/supabase/edge-functions/index.ts +0 -44
  183. package/dart-src/plugins/supabase/supabase/edge-functions/runtime.docker.integration.spec.ts +0 -968
  184. package/dart-src/plugins/supabase/supabase/migrations/20250103114225_init.sql +0 -232
  185. package/dart-src/plugins/supabase/supabase/migrations/20250314000000_hot-updater_0.13.0.sql +0 -137
  186. package/dart-src/plugins/supabase/supabase/migrations/20250516000000_hot-updater_0.18.0.sql +0 -206
  187. package/dart-src/plugins/supabase/supabase/migrations/20251014000000_hot-updater_0.21.0.sql +0 -186
  188. package/dart-src/plugins/supabase/supabase/migrations/20260401000000_hot-updater_0.29.0.sql +0 -505
  189. package/dart-src/plugins/supabase/supabase/migrations/20260414000000_hot-updater_0.30.0.sql +0 -50
  190. package/dart-src/plugins/supabase/supabase/migrations/20260422000000_hot-updater_0.31.0.sql +0 -20
  191. package/dart-src/plugins/supabase/supabase/migrations/20260520014100_hot-updater_rls.sql +0 -75
  192. package/dart-src/plugins/supabase/test/mock_supabase_client.dart +0 -654
  193. package/dart-src/plugins/supabase/test/supabase_bundle_mapper_test.dart +0 -115
  194. package/dart-src/plugins/supabase/test/supabase_database_test.dart +0 -198
  195. package/dart-src/plugins/supabase/test/supabase_storage_test.dart +0 -168
  196. /package/dart-src/{packages/core → root}/LICENSE +0 -0
  197. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/flutter_ota_kit_aws.dart +0 -0
  198. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_cloudfront_client.dart +0 -0
  199. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_cloudfront_signer.dart +0 -0
  200. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_config.dart +0 -0
  201. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_ssm_client.dart +0 -0
  202. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/flutter_ota_kit_cloudflare.dart +0 -0
  203. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_client.dart +0 -0
  204. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_config.dart +0 -0
  205. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_config.dart +0 -0
  206. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/flutter_ota_kit_core.dart +0 -0
  207. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/app_update_info.dart +0 -0
  208. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/bundle.dart +0 -0
  209. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/bundle_artifacts.dart +0 -0
  210. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/bundle_patch_artifact.dart +0 -0
  211. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/changed_asset.dart +0 -0
  212. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/get_bundles_args.dart +0 -0
  213. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/metadata.dart +0 -0
  214. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/patch_info.dart +0 -0
  215. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/platform.dart +0 -0
  216. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/rollout.dart +0 -0
  217. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/semver.dart +0 -0
  218. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/semver_range.dart +0 -0
  219. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/semver_version.dart +0 -0
  220. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/strategy.dart +0 -0
  221. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/update_bundle_params.dart +0 -0
  222. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/uuid.dart +0 -0
  223. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/asset_storage_layout.dart +0 -0
  224. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_helpers.dart +0 -0
  225. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_storage_layout.dart +0 -0
  226. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_unit_of_work.dart +0 -0
  227. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_unit_of_work_store.dart +0 -0
  228. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/calculate_pagination.dart +0 -0
  229. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/compression_format.dart +0 -0
  230. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/content_addressed_assets.dart +0 -0
  231. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_database_plugin.dart +0 -0
  232. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_storage_key_builder.dart +0 -0
  233. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_storage_plugin.dart +0 -0
  234. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/generate_min_bundle_id.dart +0 -0
  235. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/is_object.dart +0 -0
  236. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/legacy_asset_storage_layout.dart +0 -0
  237. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/paginate_bundles.dart +0 -0
  238. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/parse_storage_uri.dart +0 -0
  239. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/query_bundles.dart +0 -0
  240. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/storage_helpers.dart +0 -0
  241. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/storage_profile.dart +0 -0
  242. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/uuidv7.dart +0 -0
  243. /package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/flutter_ota_kit_pocketbase.dart +0 -0
  244. /package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_client.dart +0 -0
  245. /package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_config.dart +0 -0
  246. /package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/flutter_ota_kit_postgres.dart +0 -0
  247. /package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_client.dart +0 -0
  248. /package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_config.dart +0 -0
  249. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/edge.dart +0 -0
  250. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/flutter_ota_kit_supabase.dart +0 -0
  251. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/error_message.dart +0 -0
  252. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_client_adapter.dart +0 -0
  253. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_client_http.dart +0 -0
  254. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_config.dart +0 -0
  255. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_signed_url_batcher.dart +0 -0
  256. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/types.dart +0 -0
@@ -1,115 +0,0 @@
1
- import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart';
2
- import 'package:flutter_ota_kit_supabase/src/supabase_bundle_mapper.dart';
3
- import 'package:flutter_ota_kit_supabase/src/types.dart';
4
- import 'package:test/test.dart';
5
-
6
- Bundle _makeBundle({List<BundlePatchArtifact> patches = const []}) => Bundle(
7
- id: '018f0000-0000-7000-8000-000000000001',
8
- platform: Platform.android,
9
- shouldForceUpdate: false,
10
- enabled: true,
11
- fileHash: 'file-hash-1',
12
- gitCommitHash: 'git-1',
13
- message: 'hello',
14
- channel: 'production',
15
- storageUri: 'supabase-storage://updates/bundles/b1.zip',
16
- targetAppVersion: '1.0.0',
17
- fingerprintHash: 'fp-1',
18
- metadata: const BundleMetadata(appVersion: '1.2.3'),
19
- manifestStorageUri: 'supabase-storage://updates/manifests/m1.json',
20
- manifestFileHash: 'mf-1',
21
- assetBaseStorageUri: 'supabase-storage://updates/assets',
22
- rolloutCohortCount: 500,
23
- targetCohorts: ['team-a'],
24
- patches: patches,
25
- patchBaseBundleId: patches.isNotEmpty ? patches.first.baseBundleId : null,
26
- patchBaseFileHash: patches.isNotEmpty ? patches.first.baseFileHash : null,
27
- patchFileHash: patches.isNotEmpty ? patches.first.patchFileHash : null,
28
- patchStorageUri: patches.isNotEmpty ? patches.first.patchStorageUri : null,
29
- );
30
-
31
- void main() {
32
- group('bundleToRow / mapRowToBundle round-trip', () {
33
- test('preserves scalar fields and stripBundleArtifactMetadata', () {
34
- final bundle = _makeBundle();
35
- final row = bundleToRow(bundle);
36
-
37
- expect(row.id, bundle.id);
38
- expect(row.channel, 'production');
39
- expect(row.enabled, true);
40
- expect(row.shouldForceUpdate, false);
41
- expect(row.fileHash, 'file-hash-1');
42
- expect(row.gitCommitHash, 'git-1');
43
- expect(row.message, 'hello');
44
- expect(row.platform, 'android');
45
- expect(row.targetAppVersion, '1.0.0');
46
- expect(row.fingerprintHash, 'fp-1');
47
- expect(row.storageUri, 'supabase-storage://updates/bundles/b1.zip');
48
- expect(row.manifestStorageUri, bundle.manifestStorageUri);
49
- expect(row.manifestFileHash, 'mf-1');
50
- expect(row.assetBaseStorageUri, bundle.assetBaseStorageUri);
51
- expect(row.rolloutCohortCount, 500);
52
- expect(row.targetCohorts, ['team-a']);
53
- expect(row.metadata, {'app_version': '1.2.3'});
54
- });
55
-
56
- test('mapRowToBundle rebuilds derived patch fields', () {
57
- final baseBundleId = '018f0000-0000-7000-8000-000000000000';
58
- final bundle = _makeBundle(
59
- patches: [
60
- BundlePatchArtifact(
61
- baseBundleId: baseBundleId,
62
- baseFileHash: 'base-hash',
63
- patchFileHash: 'patch-hash',
64
- patchStorageUri: 'supabase-storage://updates/patches/p1.patch',
65
- ),
66
- ],
67
- );
68
-
69
- final row = bundleToRow(bundle);
70
- final patchRows = bundleToPatchRows(bundle);
71
- expect(patchRows, hasLength(1));
72
- expect(patchRows.first.id, '${bundle.id}:$baseBundleId');
73
- expect(patchRows.first.bundleId, bundle.id);
74
- expect(patchRows.first.baseBundleId, baseBundleId);
75
- expect(patchRows.first.orderIndex, 0);
76
-
77
- final back = mapRowToBundle(
78
- SupabaseBundleRow.fromJson(row.toJson()),
79
- patchRows
80
- .map((p) => SupabaseBundlePatchRow.fromJson(p.toJson()))
81
- .toList(),
82
- );
83
-
84
- expect(back.id, bundle.id);
85
- expect(back.patches, hasLength(1));
86
- expect(back.patchBaseBundleId, baseBundleId);
87
- expect(back.patchBaseFileHash, 'base-hash');
88
- expect(back.patches!.first.patchFileHash, 'patch-hash');
89
- expect(
90
- back.patchStorageUri,
91
- 'supabase-storage://updates/patches/p1.patch',
92
- );
93
- expect(back.metadata?.appVersion, '1.2.3');
94
- });
95
-
96
- test('defaults when row fields are missing', () {
97
- final row = SupabaseBundleRow.fromJson({
98
- 'id': 'id-1',
99
- 'channel': 'production',
100
- 'enabled': true,
101
- 'platform': 'android',
102
- 'should_force_update': false,
103
- 'file_hash': 'fh',
104
- 'storage_uri': 's',
105
- 'target_app_version': '1.0.0',
106
- 'metadata': {'app_version': '9.9.9'},
107
- });
108
- final bundle = mapRowToBundle(row);
109
- expect(bundle.rolloutCohortCount, 1000);
110
- expect(bundle.targetCohorts, isNull);
111
- expect(bundle.metadata?.appVersion, '9.9.9');
112
- expect(bundle.manifestStorageUri, isNull);
113
- });
114
- });
115
- }
@@ -1,198 +0,0 @@
1
- import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart';
2
- import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
3
- import 'package:flutter_ota_kit_supabase/flutter_ota_kit_supabase.dart';
4
- import 'package:test/test.dart';
5
-
6
- import 'mock_supabase_client.dart';
7
-
8
- late Store store;
9
- late FakeStorageBucket bucket;
10
- late SupabaseClientLike client;
11
-
12
- DatabasePlugin newPlugin() => supabaseDatabase(
13
- SupabaseServiceRoleConfig(
14
- supabaseUrl: 'https://test.supabase.invalid',
15
- supabaseAnonKey: 'test-anon-key',
16
- clientFactory: (_, __) => client,
17
- ),
18
- )();
19
-
20
- Bundle _bundle(
21
- String id, {
22
- bool enabled = true,
23
- String? fp,
24
- String? message,
25
- String channel = 'production',
26
- }) => Bundle(
27
- id: id,
28
- platform: Platform.android,
29
- shouldForceUpdate: false,
30
- enabled: enabled,
31
- fileHash: 'file-$id',
32
- gitCommitHash: 'git-$id',
33
- message: message ?? 'msg-$id',
34
- channel: channel,
35
- storageUri: 'supabase-storage://updates/bundles/$id.zip',
36
- targetAppVersion: '1.0.0',
37
- fingerprintHash: fp,
38
- metadata: const BundleMetadata(),
39
- manifestStorageUri: 'supabase-storage://updates/manifests/$id.json',
40
- manifestFileHash: 'mf-$id',
41
- assetBaseStorageUri: 'supabase-storage://updates/assets',
42
- );
43
-
44
- void main() {
45
- setUp(() {
46
- store = Store();
47
- bucket = FakeStorageBucket();
48
- client = createMockSupabaseClient(store: store, bucket: bucket);
49
- });
50
-
51
- group('supabaseDatabase bundle methods', () {
52
- test('insert + commit + getBundleById round-trips', () async {
53
- final plugin = newPlugin();
54
- await plugin.appendBundle(_bundle('b1'));
55
- await plugin.commitBundle();
56
- final got = await plugin.getBundleById('b1');
57
- expect(got, isNotNull);
58
- expect(got!.id, 'b1');
59
- expect(got.fileHash, 'file-b1');
60
- expect(got.targetAppVersion, '1.0.0');
61
- expect(got.rolloutCohortCount, 1000);
62
- });
63
-
64
- test('getBundles filters by where + pagination', () async {
65
- final plugin = newPlugin();
66
- for (var i = 0; i < 5; i++) {
67
- await plugin.appendBundle(_bundle('b$i'));
68
- }
69
- await plugin.commitBundle();
70
-
71
- final res = await plugin.getBundles(
72
- DatabaseBundleQueryOptions(
73
- where: DatabaseBundleQueryWhere(
74
- channel: 'production',
75
- platform: Platform.android,
76
- ),
77
- limit: 3,
78
- ),
79
- );
80
- expect(res.data, hasLength(3));
81
- expect(res.pagination.total, 5);
82
- });
83
-
84
- test('getChannels returns distinct channels', () async {
85
- final plugin = newPlugin();
86
- await plugin.appendBundle(_bundle('b1'));
87
- await plugin.appendBundle(_bundle('b2', channel: 'staging'));
88
- await plugin.commitBundle();
89
- final channels = await plugin.getChannels();
90
- expect(channels, containsAll(['production', 'staging']));
91
- expect(channels, hasLength(2));
92
- });
93
-
94
- test('updateBundle persists changes', () async {
95
- final plugin = newPlugin();
96
- await plugin.appendBundle(_bundle('b1'));
97
- await plugin.commitBundle();
98
- final updated = _bundle('b1', message: 'updated');
99
- await plugin.updateBundle('b1', updated.toJson());
100
- await plugin.commitBundle();
101
- final got = await plugin.getBundleById('b1');
102
- expect(got!.message, 'updated');
103
- });
104
-
105
- test('deleteBundle removes the row', () async {
106
- final plugin = newPlugin();
107
- await plugin.appendBundle(_bundle('b1'));
108
- await plugin.commitBundle();
109
- final got = await plugin.getBundleById('b1');
110
- await plugin.deleteBundle(got!);
111
- await plugin.commitBundle();
112
- expect(await plugin.getBundleById('b1'), isNull);
113
- });
114
- });
115
-
116
- group('supabaseDatabase getUpdateInfo via RPC', () {
117
- test('appVersion strategy returns newer enabled bundle', () async {
118
- final plugin = newPlugin();
119
- await plugin.appendBundle(
120
- _bundle('018f0000-0000-7000-8000-000000000001'),
121
- );
122
- await plugin.appendBundle(
123
- _bundle('018f0000-0000-7000-8000-000000000002'),
124
- );
125
- await plugin.commitBundle();
126
-
127
- final info = await plugin.getUpdateInfo(
128
- AppVersionGetBundlesArgs(
129
- appVersion: '1.0.0',
130
- bundleId: '018f0000-0000-7000-8000-000000000001',
131
- channel: 'production',
132
- minBundleId: nilUuid,
133
- platform: Platform.android,
134
- ),
135
- );
136
- expect(info, isNotNull);
137
- expect(info!.id, '018f0000-0000-7000-8000-000000000002');
138
- expect(info.status, UpdateStatus.update);
139
- });
140
-
141
- test('fingerprint strategy returns matching bundle', () async {
142
- final plugin = newPlugin();
143
- await plugin.appendBundle(
144
- _bundle('018f0000-0000-7000-8000-000000000001', fp: 'fp-current'),
145
- );
146
- await plugin.appendBundle(
147
- _bundle('018f0000-0000-7000-8000-000000000002', fp: 'fp-target'),
148
- );
149
- await plugin.commitBundle();
150
-
151
- final info = await plugin.getUpdateInfo(
152
- FingerprintGetBundlesArgs(
153
- fingerprintHash: 'fp-target',
154
- bundleId: '018f0000-0000-7000-8000-000000000001',
155
- channel: 'production',
156
- minBundleId: nilUuid,
157
- platform: Platform.android,
158
- ),
159
- );
160
- expect(info, isNotNull);
161
- expect(info!.id, '018f0000-0000-7000-8000-000000000002');
162
- });
163
-
164
- test('returns rollback when no compatible newer bundle exists', () async {
165
- final plugin = newPlugin();
166
- await plugin.appendBundle(
167
- _bundle('018f0000-0000-7000-8000-000000000001'),
168
- );
169
- await plugin.commitBundle();
170
-
171
- final info = await plugin.getUpdateInfo(
172
- AppVersionGetBundlesArgs(
173
- appVersion: '9.9.9',
174
- bundleId: '018f0000-0000-7000-8000-000000000001',
175
- channel: 'production',
176
- minBundleId: nilUuid,
177
- platform: Platform.android,
178
- ),
179
- );
180
- expect(info, isNotNull);
181
- expect(info!.status, UpdateStatus.rollback);
182
- });
183
-
184
- test('returns null for an init bundle with no candidates', () async {
185
- final plugin = newPlugin();
186
- final info = await plugin.getUpdateInfo(
187
- AppVersionGetBundlesArgs(
188
- appVersion: '9.9.9',
189
- bundleId: nilUuid,
190
- channel: 'production',
191
- minBundleId: nilUuid,
192
- platform: Platform.android,
193
- ),
194
- );
195
- expect(info, isNull);
196
- });
197
- });
198
- }
@@ -1,168 +0,0 @@
1
- import 'dart:io' as io;
2
-
3
- import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
4
- import 'package:flutter_ota_kit_supabase/flutter_ota_kit_supabase.dart';
5
- import 'package:test/test.dart';
6
-
7
- import 'mock_supabase_client.dart';
8
-
9
- late Store store;
10
- late FakeStorageBucket bucket;
11
- late SupabaseClientLike client;
12
- late StoragePlugin storage;
13
- late NodeStorageProfile node;
14
- late RuntimeStorageProfile runtime;
15
-
16
- void main() {
17
- setUp(() {
18
- store = Store();
19
- bucket = FakeStorageBucket();
20
- client = createMockSupabaseClient(store: store, bucket: bucket);
21
- storage = supabaseStorage(
22
- SupabaseStorageConfig(
23
- bucketName: 'updates',
24
- supabaseUrl: 'https://example.supabase.co',
25
- supabaseAnonKey: 'anon-key',
26
- clientFactory: (_, __) => client,
27
- ),
28
- );
29
- node = storage.profiles.node!;
30
- runtime = storage.profiles.runtime!;
31
- });
32
-
33
- group('supabaseStorage node.exists', () {
34
- test('returns true for existing, signable objects', () async {
35
- bucket.existsData = true;
36
- bucket.signedUrlData = 'https://example.supabase.co/signed-url';
37
- final result = await node.exists(
38
- 'supabase-storage://updates/assets/sha256/fi/file-hash.png',
39
- );
40
- expect(result, isTrue);
41
- expect(bucket.existsCalls, ['assets/sha256/fi/file-hash.png']);
42
- expect(bucket.createSignedUrlCalls, ['assets/sha256/fi/file-hash.png']);
43
- });
44
-
45
- test('returns false when object is missing', () async {
46
- bucket.existsData = false;
47
- bucket.existsError = 'Object not found';
48
- final result = await node.exists(
49
- 'supabase-storage://updates/assets/sha256/fi/file-hash.png',
50
- );
51
- expect(result, isFalse);
52
- expect(bucket.createSignedUrlCalls, isEmpty);
53
- });
54
-
55
- test('rejects existing objects that are not signable', () async {
56
- bucket.existsData = true;
57
- bucket.signedUrlError = 'Object not found';
58
- await expectLater(
59
- node.exists(
60
- 'supabase-storage://updates/assets/sha256/fi/file-hash.png',
61
- ),
62
- throwsA(
63
- isA<StateError>().having(
64
- (e) => e.message,
65
- 'message',
66
- contains(
67
- 'Failed to generate download URL for '
68
- '"assets/sha256/fi/file-hash.png": Object not found',
69
- ),
70
- ),
71
- ),
72
- );
73
- expect(bucket.createSignedUrlCalls, hasLength(1));
74
- });
75
-
76
- test('rejects a different bucket', () async {
77
- await expectLater(
78
- node.exists('supabase-storage://other/assets/sha256/fi/file-hash.png'),
79
- throwsA(
80
- isA<StateError>().having(
81
- (e) => e.message,
82
- 'message',
83
- contains('Bucket name mismatch: expected "updates"'),
84
- ),
85
- ),
86
- );
87
- expect(bucket.existsCalls, isEmpty);
88
- });
89
- });
90
-
91
- group('supabaseStorage runtime.getDownloadUrl', () {
92
- test('batches concurrent signed URL requests', () async {
93
- final paths = List.generate(20, (i) => 'assets/sha256/file-$i.png');
94
- final results = await Future.wait(
95
- paths.map(
96
- (p) => runtime.getDownloadUrl('supabase-storage://updates/$p'),
97
- ),
98
- );
99
- expect(
100
- results,
101
- paths
102
- .map((p) => {'fileUrl': 'https://example.supabase.co/3600/$p'})
103
- .toList(),
104
- );
105
- expect(bucket.createSignedUrlsCalls, hasLength(1));
106
- expect(bucket.createSignedUrlsCalls.first, paths);
107
- });
108
-
109
- test('surfaces non-missing signed URL errors', () async {
110
- bucket.signedUrlError = 'Storage API failed';
111
- await expectLater(
112
- runtime.getDownloadUrl(
113
- 'supabase-storage://updates/assets/sha256/fi/file-hash.png',
114
- ),
115
- throwsA(
116
- isA<StateError>().having(
117
- (e) => e.message,
118
- 'message',
119
- contains(
120
- 'Failed to generate download URL for '
121
- '"assets/sha256/fi/file-hash.png": Storage API failed',
122
- ),
123
- ),
124
- ),
125
- );
126
- expect(bucket.createSignedUrlsCalls, hasLength(1));
127
- });
128
-
129
- test(
130
- 'decodes percent-encoded object keys before signing and removing',
131
- () async {
132
- const uri =
133
- 'supabase-storage://updates/'
134
- 'assets/bootsplash/logo-ios%402x.png';
135
- final url = await runtime.getDownloadUrl(uri);
136
- expect(url, {
137
- 'fileUrl':
138
- 'https://example.supabase.co/3600/'
139
- 'assets/bootsplash/logo-ios@2x.png',
140
- });
141
- expect(bucket.createSignedUrlsCalls.first, [
142
- 'assets/bootsplash/logo-ios@2x.png',
143
- ]);
144
-
145
- await node.delete(uri);
146
- expect(bucket.removeCalls.first, ['assets/bootsplash/logo-ios@2x.png']);
147
- },
148
- );
149
- });
150
-
151
- group('supabaseStorage node.upload', () {
152
- test('returns storageUri for a signable upload', () async {
153
- final dir = await io.Directory.systemTemp.createTemp('hu-supabase-');
154
- final uploadPath = '${dir.path}/bundle.zip';
155
- await io.File(uploadPath).writeAsString('bundle');
156
- bucket.uploadData = {'fullPath': 'updates/bundles/bundle.zip'};
157
-
158
- final result = await node.upload('bundles', uploadPath);
159
- expect(result, {
160
- 'storageUri': 'supabase-storage://updates/bundles/bundle.zip',
161
- });
162
- expect(bucket.uploadCalls, ['bundles/bundle.zip']);
163
- expect(bucket.createSignedUrlCalls, ['bundles/bundle.zip']);
164
-
165
- await dir.delete(recursive: true);
166
- });
167
- });
168
- }
File without changes