@_nazmiforreal/flutter-ota 0.1.26 → 0.1.28

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 (259) hide show
  1. package/README.md +112 -18
  2. package/bin/flutter-ota-linux-x64 +0 -0
  3. package/bin/flutter-ota.js +12 -11
  4. package/dart-src/packages/cli-tools/README.md +146 -2
  5. package/dart-src/packages/cli-tools/lib/flutter_ota_kit_cli.dart +46 -13
  6. package/dart-src/packages/cli-tools/lib/src/backend.dart +6 -6
  7. package/dart-src/packages/cli-tools/lib/src/commands/build.dart +2 -0
  8. package/dart-src/packages/cli-tools/lib/src/commands/bundle.dart +7 -7
  9. package/dart-src/packages/cli-tools/lib/src/commands/deploy.dart +4 -1
  10. package/dart-src/packages/cli-tools/lib/src/commands/init.dart +36 -8
  11. package/dart-src/packages/cli-tools/lib/src/commands/pocketbase.dart +1 -1
  12. package/dart-src/packages/cli-tools/lib/src/commands/rollback.dart +1 -1
  13. package/dart-src/packages/cli-tools/lib/src/config.dart +5 -5
  14. package/dart-src/packages/cli-tools/lib/src/operations.dart +2 -2
  15. package/dart-src/packages/cli-tools/pubspec.yaml +8 -21
  16. package/dart-src/packages/cli-tools/test/backends_test.dart +3 -3
  17. package/dart-src/packages/cli-tools/test/cli_test.dart +1 -1
  18. package/dart-src/packages/cli-tools/test/mocks/mock_aws_s3_client.dart +2 -2
  19. package/dart-src/packages/cli-tools/test/mocks/mock_d1_client.dart +2 -2
  20. package/dart-src/packages/cli-tools/test/mocks/mock_pocketbase_client.dart +4 -1
  21. package/dart-src/packages/cli-tools/test/mocks/mock_postgres_client.dart +2 -2
  22. package/dart-src/packages/cli-tools/test/pocketbase_smoke_test.dart +1 -1
  23. package/dart-src/root/README.md +334 -0
  24. package/dart-src/root/analysis_options.yaml +21 -0
  25. package/dart-src/root/android/build.gradle +116 -0
  26. package/dart-src/root/android/consumer-rules.pro +23 -0
  27. package/dart-src/root/android/settings.gradle +1 -0
  28. package/dart-src/root/android/src/main/AndroidManifest.xml +21 -0
  29. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/ApplyResult.kt +52 -0
  30. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/BlacklistStore.kt +154 -0
  31. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/BootDiagnosticStore.kt +150 -0
  32. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/CrashGuard.kt +271 -0
  33. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/FlutterPatcherApplication.kt +201 -0
  34. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/FlutterPatcherAutoInitProvider.kt +93 -0
  35. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/FlutterPatcherPlugin.kt +245 -0
  36. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/LoaderHook.kt +298 -0
  37. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/PatchManager.kt +1579 -0
  38. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/PatcherConfig.kt +173 -0
  39. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/SignatureVerifier.kt +177 -0
  40. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/CrashGuardTest.kt +61 -0
  41. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/LoaderHookTest.kt +25 -0
  42. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/PatchManagerTest.kt +401 -0
  43. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/PatcherConfigTest.kt +30 -0
  44. package/dart-src/root/bin/pack.dart +182 -0
  45. package/dart-src/root/lib/flutter_ota_kit.dart +1170 -0
  46. package/dart-src/root/lib/src/app_version_resolver.dart +36 -0
  47. package/dart-src/root/lib/src/aws_update_source.dart +97 -0
  48. package/dart-src/root/lib/src/blacklist.dart +54 -0
  49. package/dart-src/root/lib/src/boot_diagnostic.dart +138 -0
  50. package/dart-src/root/lib/src/cloudflare_update_source.dart +97 -0
  51. package/dart-src/root/lib/src/flutter_ota_app.dart +69 -0
  52. package/dart-src/root/lib/src/io.dart +48 -0
  53. package/dart-src/root/lib/src/io_stub.dart +19 -0
  54. package/dart-src/root/lib/src/ota_progress_overlay.dart +1186 -0
  55. package/dart-src/root/lib/src/pack/pack.dart +434 -0
  56. package/dart-src/root/lib/src/patch_info.dart +12 -0
  57. package/dart-src/root/lib/src/patcher_channel.dart +160 -0
  58. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_database.dart +1 -1
  59. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_s3_client.dart +1 -1
  60. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_storage.dart +1 -1
  61. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_storage_profile.dart +1 -1
  62. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/with_cloudfront_signed_url.dart +1 -1
  63. package/dart-src/root/lib/src/pkg/client/flutter_ota_kit_client.dart +1 -0
  64. package/dart-src/root/lib/src/pkg/client/src/server_update_source.dart +46 -0
  65. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/cloudflare_worker_database.dart +1 -1
  66. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_build_where.dart +1 -1
  67. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_bundle_mapper.dart +3 -3
  68. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_database.dart +1 -1
  69. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_database_plugin.dart +2 -2
  70. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_s3_client.dart +1 -1
  71. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_storage.dart +1 -1
  72. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_storage_profile.dart +1 -1
  73. package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/status.dart +1 -1
  74. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/flutter_ota_kit_plugin_core.dart +1 -1
  75. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_blob_database_plugin.dart +1 -1
  76. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/filter_compatible_app_versions.dart +1 -1
  77. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/get_update_info.dart +1 -1
  78. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/request_update_bundle_state.dart +1 -1
  79. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/resolve_update_info_from_bundles.dart +1 -1
  80. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/types.dart +2 -2
  81. package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_bundle_mapper.dart +2 -2
  82. package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_database.dart +26 -15
  83. package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_storage.dart +1 -1
  84. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_bundle_mapper.dart +2 -2
  85. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_database.dart +2 -2
  86. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_get_update_info.dart +2 -2
  87. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_storage.dart +1 -1
  88. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_types.dart +1 -1
  89. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_bundle_mapper.dart +2 -2
  90. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_database.dart +2 -2
  91. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_edge_function_database.dart +1 -1
  92. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_edge_function_storage.dart +1 -1
  93. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_storage.dart +1 -1
  94. package/dart-src/root/lib/src/pocketbase_update_source.dart +107 -0
  95. package/dart-src/root/lib/src/postgres_update_source.dart +95 -0
  96. package/dart-src/root/lib/src/shared_update_check.dart +131 -0
  97. package/dart-src/root/lib/src/supabase_update_source.dart +93 -0
  98. package/dart-src/root/pubspec.yaml +54 -0
  99. package/package.json +1 -1
  100. package/scripts/postinstall.js +17 -13
  101. package/scripts/vendor.sh +22 -7
  102. package/dart-src/packages/core/CHANGELOG.md +0 -21
  103. package/dart-src/packages/core/README.md +0 -23
  104. package/dart-src/packages/core/example/lib/main.dart +0 -69
  105. package/dart-src/packages/core/pubspec.yaml +0 -13
  106. package/dart-src/packages/core/test/rollout_test.dart +0 -135
  107. package/dart-src/packages/core/test/semver_test.dart +0 -55
  108. package/dart-src/packages/core/test/semver_vectors.json +0 -1
  109. package/dart-src/packages/core/test/types_test.dart +0 -131
  110. package/dart-src/packages/core/test/uuid_test.dart +0 -40
  111. package/dart-src/packages/core/tool/dbg.dart +0 -7
  112. package/dart-src/plugins/aws/.gitkeep +0 -0
  113. package/dart-src/plugins/aws/CHANGELOG.md +0 -23
  114. package/dart-src/plugins/aws/LICENSE +0 -21
  115. package/dart-src/plugins/aws/README.md +0 -28
  116. package/dart-src/plugins/aws/example/lib/main.dart +0 -60
  117. package/dart-src/plugins/aws/pubspec.yaml +0 -30
  118. package/dart-src/plugins/aws/test/aws_database_test.dart +0 -161
  119. package/dart-src/plugins/aws/test/aws_storage_test.dart +0 -73
  120. package/dart-src/plugins/aws/test/mock_aws_s3_client.dart +0 -78
  121. package/dart-src/plugins/cloudflare/.gitkeep +0 -0
  122. package/dart-src/plugins/cloudflare/CHANGELOG.md +0 -23
  123. package/dart-src/plugins/cloudflare/LICENSE +0 -21
  124. package/dart-src/plugins/cloudflare/README.md +0 -25
  125. package/dart-src/plugins/cloudflare/example/lib/main.dart +0 -62
  126. package/dart-src/plugins/cloudflare/migrations/0001_hot-updater_init.sql +0 -16
  127. package/dart-src/plugins/cloudflare/migrations/0002_hot-updater_0.13.0.sql +0 -8
  128. package/dart-src/plugins/cloudflare/migrations/0003_hot-updater_0.18.0.sql +0 -38
  129. package/dart-src/plugins/cloudflare/migrations/0004_hot-updater_0.29.0.sql +0 -11
  130. package/dart-src/plugins/cloudflare/migrations/0005_hot-updater_0.31.0.sql +0 -24
  131. package/dart-src/plugins/cloudflare/pubspec.yaml +0 -28
  132. package/dart-src/plugins/cloudflare/sql/bundles.sql +0 -42
  133. package/dart-src/plugins/cloudflare/test/cloudflare_worker_database_test.dart +0 -126
  134. package/dart-src/plugins/cloudflare/test/d1_bundle_mapper_test.dart +0 -106
  135. package/dart-src/plugins/cloudflare/test/d1_database_test.dart +0 -200
  136. package/dart-src/plugins/cloudflare/test/mock_d1_client.dart +0 -261
  137. package/dart-src/plugins/cloudflare/test/mock_r2_client.dart +0 -78
  138. package/dart-src/plugins/cloudflare/test/r2_storage_test.dart +0 -74
  139. package/dart-src/plugins/plugin-core/CHANGELOG.md +0 -20
  140. package/dart-src/plugins/plugin-core/LICENSE +0 -21
  141. package/dart-src/plugins/plugin-core/README.md +0 -21
  142. package/dart-src/plugins/plugin-core/example/lib/main.dart +0 -61
  143. package/dart-src/plugins/plugin-core/pubspec.yaml +0 -23
  144. package/dart-src/plugins/plugin-core/test/asset_storage_layout_test.dart +0 -170
  145. package/dart-src/plugins/plugin-core/test/bundle_unit_of_work_store_test.dart +0 -74
  146. package/dart-src/plugins/plugin-core/test/bundle_unit_of_work_test.dart +0 -345
  147. package/dart-src/plugins/plugin-core/test/create_blob_database_plugin_test.dart +0 -843
  148. package/dart-src/plugins/plugin-core/test/create_database_plugin_test.dart +0 -298
  149. package/dart-src/plugins/plugin-core/test/create_storage_plugin_test.dart +0 -195
  150. package/dart-src/plugins/plugin-core/test/generate_min_bundle_id_test.dart +0 -56
  151. package/dart-src/plugins/plugin-core/test/get_update_info_test.dart +0 -1589
  152. package/dart-src/plugins/plugin-core/test/helpers_test.dart +0 -283
  153. package/dart-src/plugins/plugin-core/test/query_bundles_test.dart +0 -202
  154. package/dart-src/plugins/plugin-core/test/request_update_bundle_state_test.dart +0 -86
  155. package/dart-src/plugins/plugin-core/test/uuidv7_test.dart +0 -88
  156. package/dart-src/plugins/pocketbase/CHANGELOG.md +0 -23
  157. package/dart-src/plugins/pocketbase/LICENSE +0 -21
  158. package/dart-src/plugins/pocketbase/README.md +0 -54
  159. package/dart-src/plugins/pocketbase/example/lib/main.dart +0 -62
  160. package/dart-src/plugins/pocketbase/pubspec.yaml +0 -26
  161. package/dart-src/plugins/pocketbase/test/pb_uri_test.dart +0 -12
  162. package/dart-src/plugins/postgres/.gitkeep +0 -0
  163. package/dart-src/plugins/postgres/CHANGELOG.md +0 -23
  164. package/dart-src/plugins/postgres/LICENSE +0 -21
  165. package/dart-src/plugins/postgres/README.md +0 -29
  166. package/dart-src/plugins/postgres/example/lib/main.dart +0 -67
  167. package/dart-src/plugins/postgres/pubspec.yaml +0 -26
  168. package/dart-src/plugins/postgres/sql/bundles.sql +0 -45
  169. package/dart-src/plugins/postgres/sql/get_target_app_version_list.sql +0 -21
  170. package/dart-src/plugins/postgres/sql/get_update_info.spec.ts +0 -171
  171. package/dart-src/plugins/postgres/sql/get_update_info_by_app_version.sql +0 -126
  172. package/dart-src/plugins/postgres/sql/get_update_info_by_fingerprint_hash.sql +0 -125
  173. package/dart-src/plugins/postgres/sql/hash_user_id.sql +0 -30
  174. package/dart-src/plugins/postgres/sql/is_device_eligible.sql +0 -237
  175. package/dart-src/plugins/postgres/sql/prepareSql.ts +0 -11
  176. package/dart-src/plugins/postgres/test/mock_postgres_client.dart +0 -320
  177. package/dart-src/plugins/postgres/test/postgres_bundle_mapper_test.dart +0 -139
  178. package/dart-src/plugins/postgres/test/postgres_database_test.dart +0 -210
  179. package/dart-src/plugins/postgres/test/postgres_storage_runtime_test.dart +0 -60
  180. package/dart-src/plugins/supabase/CHANGELOG.md +0 -24
  181. package/dart-src/plugins/supabase/LICENSE +0 -21
  182. package/dart-src/plugins/supabase/README.md +0 -53
  183. package/dart-src/plugins/supabase/example/lib/main.dart +0 -63
  184. package/dart-src/plugins/supabase/pubspec.yaml +0 -27
  185. package/dart-src/plugins/supabase/supabase/edge-functions/index.ts +0 -44
  186. package/dart-src/plugins/supabase/supabase/edge-functions/runtime.docker.integration.spec.ts +0 -968
  187. package/dart-src/plugins/supabase/supabase/migrations/20250103114225_init.sql +0 -232
  188. package/dart-src/plugins/supabase/supabase/migrations/20250314000000_hot-updater_0.13.0.sql +0 -137
  189. package/dart-src/plugins/supabase/supabase/migrations/20250516000000_hot-updater_0.18.0.sql +0 -206
  190. package/dart-src/plugins/supabase/supabase/migrations/20251014000000_hot-updater_0.21.0.sql +0 -186
  191. package/dart-src/plugins/supabase/supabase/migrations/20260401000000_hot-updater_0.29.0.sql +0 -505
  192. package/dart-src/plugins/supabase/supabase/migrations/20260414000000_hot-updater_0.30.0.sql +0 -50
  193. package/dart-src/plugins/supabase/supabase/migrations/20260422000000_hot-updater_0.31.0.sql +0 -20
  194. package/dart-src/plugins/supabase/supabase/migrations/20260520014100_hot-updater_rls.sql +0 -75
  195. package/dart-src/plugins/supabase/test/mock_supabase_client.dart +0 -654
  196. package/dart-src/plugins/supabase/test/supabase_bundle_mapper_test.dart +0 -115
  197. package/dart-src/plugins/supabase/test/supabase_database_test.dart +0 -198
  198. package/dart-src/plugins/supabase/test/supabase_storage_test.dart +0 -168
  199. /package/dart-src/{packages/core → root}/LICENSE +0 -0
  200. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/flutter_ota_kit_aws.dart +0 -0
  201. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_cloudfront_client.dart +0 -0
  202. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_cloudfront_signer.dart +0 -0
  203. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_config.dart +0 -0
  204. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_ssm_client.dart +0 -0
  205. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/flutter_ota_kit_cloudflare.dart +0 -0
  206. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_client.dart +0 -0
  207. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_config.dart +0 -0
  208. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_config.dart +0 -0
  209. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/flutter_ota_kit_core.dart +0 -0
  210. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/app_update_info.dart +0 -0
  211. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/bundle.dart +0 -0
  212. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/bundle_artifacts.dart +0 -0
  213. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/bundle_patch_artifact.dart +0 -0
  214. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/changed_asset.dart +0 -0
  215. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/get_bundles_args.dart +0 -0
  216. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/metadata.dart +0 -0
  217. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/patch_info.dart +0 -0
  218. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/platform.dart +0 -0
  219. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/rollout.dart +0 -0
  220. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/semver.dart +0 -0
  221. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/semver_range.dart +0 -0
  222. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/semver_version.dart +0 -0
  223. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/strategy.dart +0 -0
  224. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/update_bundle_params.dart +0 -0
  225. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/uuid.dart +0 -0
  226. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/asset_storage_layout.dart +0 -0
  227. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_helpers.dart +0 -0
  228. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_storage_layout.dart +0 -0
  229. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_unit_of_work.dart +0 -0
  230. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_unit_of_work_store.dart +0 -0
  231. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/calculate_pagination.dart +0 -0
  232. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/compression_format.dart +0 -0
  233. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/content_addressed_assets.dart +0 -0
  234. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_database_plugin.dart +0 -0
  235. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_storage_key_builder.dart +0 -0
  236. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_storage_plugin.dart +0 -0
  237. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/generate_min_bundle_id.dart +0 -0
  238. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/is_object.dart +0 -0
  239. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/legacy_asset_storage_layout.dart +0 -0
  240. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/paginate_bundles.dart +0 -0
  241. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/parse_storage_uri.dart +0 -0
  242. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/query_bundles.dart +0 -0
  243. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/storage_helpers.dart +0 -0
  244. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/storage_profile.dart +0 -0
  245. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/uuidv7.dart +0 -0
  246. /package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/flutter_ota_kit_pocketbase.dart +0 -0
  247. /package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_client.dart +0 -0
  248. /package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_config.dart +0 -0
  249. /package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/flutter_ota_kit_postgres.dart +0 -0
  250. /package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_client.dart +0 -0
  251. /package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_config.dart +0 -0
  252. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/edge.dart +0 -0
  253. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/flutter_ota_kit_supabase.dart +0 -0
  254. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/error_message.dart +0 -0
  255. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_client_adapter.dart +0 -0
  256. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_client_http.dart +0 -0
  257. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_config.dart +0 -0
  258. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_signed_url_batcher.dart +0 -0
  259. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/types.dart +0 -0
@@ -1,283 +0,0 @@
1
- import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart'
2
- show Bundle, BundleMetadata, Platform;
3
- import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
4
- import 'package:test/test.dart';
5
-
6
- void main() {
7
- group('paginateBundles', () {
8
- List<Bundle> makeBundles(int count) => List.generate(
9
- count,
10
- (i) => _testBundle(id: 'b-${i.toString().padLeft(3, '0')}'),
11
- );
12
-
13
- test('offset-based first page', () {
14
- final result = paginateBundles(
15
- bundles: makeBundles(25),
16
- limit: 10,
17
- offset: 0,
18
- );
19
- expect(result.data.length, 10);
20
- expect(result.pagination.total, 25);
21
- expect(result.pagination.hasNextPage, isTrue);
22
- expect(result.pagination.hasPreviousPage, isFalse);
23
- expect(result.pagination.currentPage, 1);
24
- expect(result.pagination.nextCursor, isNotNull);
25
- expect(result.pagination.previousCursor, isNull);
26
- });
27
-
28
- test('offset-based last page', () {
29
- final result = paginateBundles(
30
- bundles: makeBundles(25),
31
- limit: 10,
32
- offset: 20,
33
- );
34
- expect(result.data.length, 5);
35
- expect(result.pagination.hasNextPage, isFalse);
36
- expect(result.pagination.hasPreviousPage, isTrue);
37
- });
38
-
39
- test('cursor-based after', () {
40
- final result = paginateBundles(
41
- bundles: makeBundles(10),
42
- limit: 3,
43
- cursor: const DatabaseBundleCursor(after: 'b-004'),
44
- );
45
- // Sorted desc: b-009..b-000. After b-004 (id < 'b-004'): b-003, b-002, b-001, b-000
46
- expect(result.data.length, 3);
47
- expect(result.data.first.id, 'b-003');
48
- expect(result.data.last.id, 'b-001');
49
- });
50
-
51
- test('cursor-based before', () {
52
- final result = paginateBundles(
53
- bundles: makeBundles(10),
54
- limit: 3,
55
- cursor: const DatabaseBundleCursor(before: 'b-005'),
56
- );
57
- // Before b-005 in desc: candidates id > b-005 = [b-009, b-008, b-007, b-006]
58
- // Take last 3 (closest to cursor): b-008, b-007, b-006
59
- expect(result.data.length, 3);
60
- expect(result.data.first.id, 'b-008');
61
- expect(result.data.last.id, 'b-006');
62
- });
63
-
64
- test('empty result preserves cursor', () {
65
- final result = paginateBundles(
66
- bundles: makeBundles(5),
67
- limit: 10,
68
- cursor: const DatabaseBundleCursor(after: 'b-000'),
69
- );
70
- // Desc sorted: b-004, b-003, b-002, b-001, b-000
71
- // after 'b-000': nothing has id < 'b-000' → empty, previousCursor preserved
72
- expect(result.data, isEmpty);
73
- expect(result.pagination.previousCursor, 'b-000');
74
- });
75
- });
76
-
77
- group('filterCompatibleAppVersions', () {
78
- test('filters and sorts descending', () {
79
- final result = filterCompatibleAppVersions([
80
- '^1.0.0',
81
- '^2.0.0',
82
- '^0.5.0',
83
- ], '1.3.0');
84
- expect(result, ['^1.0.0']);
85
- });
86
-
87
- test('multiple compatible versions sorted desc', () {
88
- final result = filterCompatibleAppVersions([
89
- '>=1.0.0',
90
- '>=1.2.0',
91
- '>=2.0.0',
92
- ], '1.5.0');
93
- expect(result, ['>=1.2.0', '>=1.0.0']);
94
- });
95
- });
96
-
97
- group('parseStorageUri', () {
98
- test('parses supabase-storage URI', () {
99
- final result = parseStorageUri(
100
- 'supabase-storage://bucket/path/to/file.zip',
101
- 'supabase-storage',
102
- );
103
- expect(result.protocol, 'supabase-storage');
104
- expect(result.bucket, 'bucket');
105
- expect(result.key, 'path/to/file.zip');
106
- });
107
-
108
- test('parses s3 URI', () {
109
- final result = parseStorageUri('s3://my-bucket/key.zip', 's3');
110
- expect(result.bucket, 'my-bucket');
111
- expect(result.key, 'key.zip');
112
- });
113
-
114
- test('decodes percent-encoded keys', () {
115
- final result = parseStorageUri(
116
- 'supabase-storage://bucket/path%20with%20spaces/file.zip',
117
- 'supabase-storage',
118
- );
119
- expect(result.key, 'path with spaces/file.zip');
120
- });
121
-
122
- test('throws on wrong protocol', () {
123
- expect(
124
- () => parseStorageUri('s3://bucket/key', 'supabase-storage'),
125
- throwsFormatException,
126
- );
127
- });
128
- });
129
-
130
- group('contentAddressedAssets', () {
131
- test('builds sha256 path with extension', () {
132
- final path = getContentAddressedAssetStoragePath(
133
- assetPath: 'index.android.bundle',
134
- fileHash: 'abcdef1234567890',
135
- );
136
- expect(path, 'sha256/ab/abcdef1234567890.bundle');
137
- });
138
-
139
- test('preserves .br extension', () {
140
- final path = getContentAddressedAssetStoragePath(
141
- assetPath: 'index.android.bundle.br',
142
- fileHash: 'abcdef1234567890',
143
- );
144
- expect(path, 'sha256/ab/abcdef1234567890.br');
145
- });
146
-
147
- test('handles no extension', () {
148
- final path = getContentAddressedAssetStoragePath(
149
- assetPath: 'manifest',
150
- fileHash: 'abcdef1234567890',
151
- );
152
- expect(path, 'sha256/ab/abcdef1234567890');
153
- });
154
- });
155
-
156
- group('compressionFormat', () {
157
- test('detects zip', () {
158
- expect(
159
- detectCompressionFormat('bundle.zip').format,
160
- CompressionFormat.zip,
161
- );
162
- });
163
-
164
- test('detects tar.br', () {
165
- expect(
166
- detectCompressionFormat('bundle.tar.br').format,
167
- CompressionFormat.tarBr,
168
- );
169
- });
170
-
171
- test('detects tar.gz', () {
172
- expect(
173
- detectCompressionFormat('bundle.tar.gz').format,
174
- CompressionFormat.tarGz,
175
- );
176
- });
177
-
178
- test('defaults to zip', () {
179
- expect(
180
- detectCompressionFormat('bundle.xyz').format,
181
- CompressionFormat.zip,
182
- );
183
- });
184
-
185
- test('getContentType returns mime type for zip', () {
186
- expect(getContentType('bundle.zip'), 'application/zip');
187
- });
188
- });
189
-
190
- group('storageProfile', () {
191
- test('isNodeStoragePlugin checks profiles.node', () {
192
- final plugin = _DummyStoragePlugin(node: true, runtime: false);
193
- expect(isNodeStoragePlugin(plugin), isTrue);
194
- expect(isRuntimeStoragePlugin(plugin), isFalse);
195
- });
196
-
197
- test('isRuntimeStoragePlugin checks profiles.runtime', () {
198
- final plugin = _DummyStoragePlugin(node: false, runtime: true);
199
- expect(isNodeStoragePlugin(plugin), isFalse);
200
- expect(isRuntimeStoragePlugin(plugin), isTrue);
201
- });
202
-
203
- test('assertNodeStoragePlugin throws if missing', () {
204
- final plugin = _DummyStoragePlugin(node: false, runtime: true);
205
- expect(() => assertNodeStoragePlugin(plugin), throwsStateError);
206
- });
207
- });
208
-
209
- group('createStorageKeyBuilder', () {
210
- test('with base path', () {
211
- final getKey = createStorageKeyBuilder('bundles');
212
- expect(getKey('v1', 'patch.zip'), 'bundles/v1/patch.zip');
213
- });
214
-
215
- test('without base path', () {
216
- final getKey = createStorageKeyBuilder(null);
217
- expect(getKey('v1', 'file.zip'), 'v1/file.zip');
218
- });
219
- });
220
- }
221
-
222
- Bundle _testBundle({String id = 'test-bundle-id'}) {
223
- return Bundle(
224
- id: id,
225
- channel: 'production',
226
- platform: Platform.android,
227
- enabled: true,
228
- shouldForceUpdate: false,
229
- fileHash: 'abc123',
230
- gitCommitHash: null,
231
- message: null,
232
- targetAppVersion: '1.0.0',
233
- fingerprintHash: null,
234
- storageUri: 'supabase-storage://bucket/path',
235
- metadata: const BundleMetadata(),
236
- patches: const [],
237
- rolloutCohortCount: 1000,
238
- targetCohorts: null,
239
- );
240
- }
241
-
242
- class _DummyStoragePlugin extends StoragePlugin {
243
- _DummyStoragePlugin({required bool node, required bool runtime})
244
- : _node = node,
245
- _runtime = runtime;
246
-
247
- final bool _node;
248
- final bool _runtime;
249
-
250
- @override
251
- String get name => 'dummy';
252
-
253
- @override
254
- String get supportedProtocol => 'dummy';
255
-
256
- @override
257
- StoragePluginProfiles get profiles => StoragePluginProfiles(
258
- node: _node ? _DummyNodeStorageProfile() : null,
259
- runtime: _runtime ? _DummyRuntimeStorageProfile() : null,
260
- );
261
- }
262
-
263
- class _DummyNodeStorageProfile extends NodeStorageProfile {
264
- @override
265
- Future<Map<String, String>> upload(String key, String filePath) async => {};
266
- @override
267
- Future<bool> exists(String storageUri) async => false;
268
- @override
269
- Future<void> delete(String storageUri) async {}
270
- @override
271
- Future<void> downloadFile(String storageUri, String filePath) async {}
272
- @override
273
- Future<List<StorageObject>> listObjects([String? prefix]) async => [];
274
- @override
275
- Future<void> deleteObjects(List<String> keys) async {}
276
- }
277
-
278
- class _DummyRuntimeStorageProfile extends RuntimeStorageProfile {
279
- @override
280
- Future<Map<String, String>> getDownloadUrl(String storageUri) async => {};
281
- @override
282
- Future<String?> readText(String storageUri) async => null;
283
- }
@@ -1,202 +0,0 @@
1
- import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart'
2
- show Bundle, BundleMetadata, Platform;
3
- import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
4
- import 'package:test/test.dart';
5
-
6
- void main() {
7
- group('calculatePagination', () {
8
- test('empty total', () {
9
- final p = calculatePagination(0, limit: 10, offset: 0);
10
- expect(p.total, 0);
11
- expect(p.hasNextPage, isFalse);
12
- expect(p.hasPreviousPage, isFalse);
13
- expect(p.currentPage, 1);
14
- expect(p.totalPages, 0);
15
- });
16
-
17
- test('first page', () {
18
- final p = calculatePagination(25, limit: 10, offset: 0);
19
- expect(p.total, 25);
20
- expect(p.hasNextPage, isTrue);
21
- expect(p.hasPreviousPage, isFalse);
22
- expect(p.currentPage, 1);
23
- expect(p.totalPages, 3);
24
- });
25
-
26
- test('middle page', () {
27
- final p = calculatePagination(25, limit: 10, offset: 10);
28
- expect(p.currentPage, 2);
29
- expect(p.hasNextPage, isTrue);
30
- expect(p.hasPreviousPage, isTrue);
31
- });
32
-
33
- test('last page', () {
34
- final p = calculatePagination(25, limit: 10, offset: 20);
35
- expect(p.currentPage, 3);
36
- expect(p.hasNextPage, isFalse);
37
- expect(p.hasPreviousPage, isTrue);
38
- });
39
- });
40
-
41
- group('bundleIdMatchesFilter', () {
42
- test('null filter matches all', () {
43
- expect(bundleIdMatchesFilter('abc', null), isTrue);
44
- });
45
-
46
- test('eq match', () {
47
- expect(
48
- bundleIdMatchesFilter('abc', const DatabaseBundleIdFilter(eq: 'abc')),
49
- isTrue,
50
- );
51
- expect(
52
- bundleIdMatchesFilter('abc', const DatabaseBundleIdFilter(eq: 'def')),
53
- isFalse,
54
- );
55
- });
56
-
57
- test('gt match', () {
58
- expect(
59
- bundleIdMatchesFilter('b', const DatabaseBundleIdFilter(gt: 'a')),
60
- isTrue,
61
- );
62
- expect(
63
- bundleIdMatchesFilter('a', const DatabaseBundleIdFilter(gt: 'b')),
64
- isFalse,
65
- );
66
- });
67
-
68
- test('in match', () {
69
- expect(
70
- bundleIdMatchesFilter(
71
- 'a',
72
- const DatabaseBundleIdFilter(ins: ['a', 'b']),
73
- ),
74
- isTrue,
75
- );
76
- expect(
77
- bundleIdMatchesFilter(
78
- 'c',
79
- const DatabaseBundleIdFilter(ins: ['a', 'b']),
80
- ),
81
- isFalse,
82
- );
83
- });
84
-
85
- test('combined filters', () {
86
- final f = DatabaseBundleIdFilter(gte: 'a', lte: 'z');
87
- expect(bundleIdMatchesFilter('m', f), isTrue);
88
- expect(bundleIdMatchesFilter('0', f), isFalse);
89
- });
90
- });
91
-
92
- group('bundleMatchesQueryWhere', () {
93
- test('null where matches all', () {
94
- final bundle = _testBundle(channel: 'prod');
95
- expect(bundleMatchesQueryWhere(bundle, null), isTrue);
96
- });
97
-
98
- test('filters by channel', () {
99
- final bundle = _testBundle(channel: 'prod');
100
- expect(
101
- bundleMatchesQueryWhere(
102
- bundle,
103
- const DatabaseBundleQueryWhere(channel: 'prod'),
104
- ),
105
- isTrue,
106
- );
107
- expect(
108
- bundleMatchesQueryWhere(
109
- bundle,
110
- const DatabaseBundleQueryWhere(channel: 'dev'),
111
- ),
112
- isFalse,
113
- );
114
- });
115
-
116
- test('filters by enabled', () {
117
- final bundle = _testBundle(enabled: true);
118
- expect(
119
- bundleMatchesQueryWhere(
120
- bundle,
121
- const DatabaseBundleQueryWhere(enabled: true),
122
- ),
123
- isTrue,
124
- );
125
- expect(
126
- bundleMatchesQueryWhere(
127
- bundle,
128
- const DatabaseBundleQueryWhere(enabled: false),
129
- ),
130
- isFalse,
131
- );
132
- });
133
-
134
- test('filters by targetAppVersion null', () {
135
- final bundle = _testBundle(targetAppVersion: null);
136
- expect(
137
- bundleMatchesQueryWhere(
138
- bundle,
139
- const DatabaseBundleQueryWhere(targetAppVersionNotNull: true),
140
- ),
141
- isFalse,
142
- );
143
- expect(
144
- bundleMatchesQueryWhere(
145
- bundle,
146
- const DatabaseBundleQueryWhere(targetAppVersionNotNull: false),
147
- ),
148
- isTrue,
149
- );
150
- });
151
- });
152
-
153
- group('sortBundles', () {
154
- test('sorts descending by default', () {
155
- final bundles = [
156
- _testBundle(id: 'c'),
157
- _testBundle(id: 'a'),
158
- _testBundle(id: 'b'),
159
- ];
160
- final sorted = sortBundles(bundles, null);
161
- expect(sorted.map((b) => b.id).toList(), ['c', 'b', 'a']);
162
- });
163
-
164
- test('sorts ascending', () {
165
- final bundles = [
166
- _testBundle(id: 'c'),
167
- _testBundle(id: 'a'),
168
- _testBundle(id: 'b'),
169
- ];
170
- final sorted = sortBundles(
171
- bundles,
172
- const DatabaseBundleQueryOrder(direction: 'asc'),
173
- );
174
- expect(sorted.map((b) => b.id).toList(), ['a', 'b', 'c']);
175
- });
176
- });
177
- }
178
-
179
- Bundle _testBundle({
180
- String id = 'test-bundle-id',
181
- String channel = 'production',
182
- bool enabled = true,
183
- String? targetAppVersion = '1.0.0',
184
- }) {
185
- return Bundle(
186
- id: id,
187
- channel: channel,
188
- platform: Platform.android,
189
- enabled: enabled,
190
- shouldForceUpdate: false,
191
- fileHash: 'abc123',
192
- gitCommitHash: null,
193
- message: null,
194
- targetAppVersion: targetAppVersion,
195
- fingerprintHash: null,
196
- storageUri: 'supabase-storage://bucket/path',
197
- metadata: const BundleMetadata(),
198
- patches: const [],
199
- rolloutCohortCount: 1000,
200
- targetCohorts: null,
201
- );
202
- }
@@ -1,86 +0,0 @@
1
- import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart';
2
- import 'package:flutter_ota_kit_plugin_core/src/bundle_unit_of_work_store.dart';
3
- import 'package:flutter_ota_kit_plugin_core/src/request_update_bundle_state.dart';
4
- import 'package:test/test.dart';
5
-
6
- Bundle _bundle(String id) => Bundle(
7
- id: id,
8
- platform: Platform.android,
9
- shouldForceUpdate: false,
10
- enabled: true,
11
- fileHash: 'hash_$id',
12
- storageUri: 's3://bucket/$id.zip',
13
- channel: 'production',
14
- );
15
-
16
- void main() {
17
- setUp(() {
18
- clearUnitOfWorkStore();
19
- });
20
-
21
- group('seedRequestUpdateBundles', () {
22
- test('seeds bundles into context UoW', () {
23
- final context = <String, Object?>{};
24
- seedRequestUpdateBundles(context, [_bundle('a'), _bundle('b')]);
25
- final seeds = getRequestUpdateBundleSeeds(context);
26
- expect(seeds.length, 2);
27
- expect(seeds.map((b) => b.id).toSet(), {'a', 'b'});
28
- });
29
-
30
- test('ignores null context', () {
31
- seedRequestUpdateBundles(null, [_bundle('a')]);
32
- // Should not throw
33
- });
34
-
35
- test('ignores empty seeds', () {
36
- final context = <String, Object?>{};
37
- seedRequestUpdateBundles(context, [null]);
38
- final seeds = getRequestUpdateBundleSeeds(context);
39
- expect(seeds, isEmpty);
40
- });
41
-
42
- test('filters out null seeds', () {
43
- final context = <String, Object?>{};
44
- seedRequestUpdateBundles(context, [_bundle('a'), null, _bundle('b')]);
45
- final seeds = getRequestUpdateBundleSeeds(context);
46
- expect(seeds.length, 2);
47
- });
48
- });
49
-
50
- group('getRequestUpdateBundleSeeds', () {
51
- test('returns empty for null context', () {
52
- expect(getRequestUpdateBundleSeeds(null), isEmpty);
53
- });
54
-
55
- test('returns empty for unseeded context', () {
56
- expect(getRequestUpdateBundleSeeds(<String, Object?>{}), isEmpty);
57
- });
58
- });
59
-
60
- group('createRequestUpdateBundleResolver', () {
61
- test('creates resolver for valid context', () async {
62
- final context = <String, Object?>{};
63
- seedRequestUpdateBundles(context, [_bundle('x')]);
64
- final resolver = createRequestUpdateBundleResolver(context);
65
-
66
- expect(resolver.hasSeededBundles, isTrue);
67
- expect(resolver.peek('x'), isNotNull);
68
- expect(resolver.peek('missing'), isNull);
69
- });
70
-
71
- test('creates standalone resolver for null context', () async {
72
- final resolver = createRequestUpdateBundleResolver(null);
73
- expect(resolver.hasSeededBundles, isFalse);
74
- expect(resolver.peek('anything'), isNull);
75
- });
76
-
77
- test('getById delegates to underlying UoW', () async {
78
- final context = <String, Object?>{};
79
- final resolver = createRequestUpdateBundleResolver(context);
80
-
81
- final result = await resolver.getById('y', () async => _bundle('y'));
82
- expect(result, isNotNull);
83
- expect(result!.id, 'y');
84
- });
85
- });
86
- }
@@ -1,88 +0,0 @@
1
- import 'package:flutter_ota_kit_plugin_core/src/uuidv7.dart';
2
- import 'package:test/test.dart';
3
-
4
- void main() {
5
- group('extractTimestampFromUUIDv7', () {
6
- test('extracts timestamp from known UUID', () {
7
- // Timestamp hex = 01894f2e3a00 = 1737105248768
8
- final uuid = '01894f2e-3a00-7000-8000-000000000000';
9
- final ts = extractTimestampFromUUIDv7(uuid);
10
- expect(ts, 0x01894f2e3a00);
11
- });
12
-
13
- test('round-trips createUUIDv7 timestamp', () {
14
- final uuid = createUUIDv7();
15
- final ts = extractTimestampFromUUIDv7(uuid);
16
- final now = DateTime.now().millisecondsSinceEpoch;
17
- // Should be within 50ms of now
18
- expect((now - ts).abs(), lessThan(50));
19
- });
20
- });
21
-
22
- group('createUUIDv7', () {
23
- test('produces valid UUID v7 format', () {
24
- final uuid = createUUIDv7();
25
- // 8-4-4-4-12 format
26
- expect(
27
- uuid,
28
- matches(
29
- RegExp(
30
- r'^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$',
31
- ),
32
- ),
33
- );
34
- });
35
-
36
- test('generates unique UUIDs', () {
37
- final ids = <String>{};
38
- for (var i = 0; i < 100; i++) {
39
- ids.add(createUUIDv7());
40
- }
41
- expect(ids.length, 100);
42
- });
43
-
44
- test('UUIDs with different timestamps are ordered correctly', () {
45
- // Create two UUIDs with known timestamps
46
- final uuid1 = createUUIDv7WithSameTimestamp(
47
- '01900000-0001-7000-8000-000000000000',
48
- );
49
- final uuid2 = createUUIDv7WithSameTimestamp(
50
- '01900000-0002-7000-8000-000000000000',
51
- );
52
- expect(uuid2.compareTo(uuid1), greaterThan(0));
53
- });
54
- });
55
-
56
- group('createUUIDv7WithSameTimestamp', () {
57
- test('preserves timestamp from original UUID', () {
58
- final original = createUUIDv7();
59
- final originalTs = extractTimestampFromUUIDv7(original);
60
- final derived = createUUIDv7WithSameTimestamp(original);
61
- final derivedTs = extractTimestampFromUUIDv7(derived);
62
- expect(derivedTs, originalTs);
63
- });
64
-
65
- test('produces different random bits', () {
66
- final original = createUUIDv7();
67
- // Generate a few — at least one should differ in random part
68
- final differentFound = List.generate(
69
- 10,
70
- (_) => createUUIDv7WithSameTimestamp(original),
71
- ).any((u) => u != original);
72
- expect(differentFound, isTrue);
73
- });
74
-
75
- test('derived UUID still has version 7 and correct variant', () {
76
- final original = createUUIDv7();
77
- final derived = createUUIDv7WithSameTimestamp(original);
78
- expect(
79
- derived,
80
- matches(
81
- RegExp(
82
- r'^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$',
83
- ),
84
- ),
85
- );
86
- });
87
- });
88
- }
@@ -1,23 +0,0 @@
1
- ## 0.1.7
2
-
3
- - Release 2026-09-10
4
-
5
- ## 0.1.6
6
-
7
- - Release 2026-09-10
8
-
9
- ## 0.1.6
10
-
11
- - Automated release 2026-09-10
12
-
13
- ## 0.1.5
14
-
15
- - Added comprehensive documentation for all public APIs.
16
- - Documented PocketBase client, database, storage, and bundle mapper.
17
- - General maintenance.
18
-
19
- ## 0.1.4
20
-
21
- - General maintenance.
22
-
23
- ## 0.1.3
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 HYPER12755
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.