@_nazmiforreal/flutter-ota 0.1.0 → 0.1.2

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 (167) hide show
  1. package/bin/flutter-patcher.js +48 -39
  2. package/dart-src/packages/cli-tools/.gitkeep +0 -0
  3. package/dart-src/packages/cli-tools/bin/flutter_patcher.dart +9 -0
  4. package/dart-src/packages/cli-tools/lib/flutter_patcher_cli.dart +73 -0
  5. package/dart-src/packages/cli-tools/lib/src/backend.dart +162 -0
  6. package/dart-src/packages/cli-tools/lib/src/cli_base.dart +56 -0
  7. package/dart-src/packages/cli-tools/lib/src/commands/build.dart +99 -0
  8. package/dart-src/packages/cli-tools/lib/src/commands/bundle.dart +151 -0
  9. package/dart-src/packages/cli-tools/lib/src/commands/channel.dart +140 -0
  10. package/dart-src/packages/cli-tools/lib/src/commands/config_command.dart +113 -0
  11. package/dart-src/packages/cli-tools/lib/src/commands/console.dart +55 -0
  12. package/dart-src/packages/cli-tools/lib/src/commands/deploy.dart +95 -0
  13. package/dart-src/packages/cli-tools/lib/src/commands/doctor.dart +48 -0
  14. package/dart-src/packages/cli-tools/lib/src/commands/fingerprint.dart +29 -0
  15. package/dart-src/packages/cli-tools/lib/src/commands/init.dart +82 -0
  16. package/dart-src/packages/cli-tools/lib/src/commands/keys.dart +55 -0
  17. package/dart-src/packages/cli-tools/lib/src/commands/migrate.dart +132 -0
  18. package/dart-src/packages/cli-tools/lib/src/commands/rollback.dart +41 -0
  19. package/dart-src/packages/cli-tools/lib/src/config.dart +715 -0
  20. package/dart-src/packages/cli-tools/lib/src/operations.dart +206 -0
  21. package/dart-src/packages/cli-tools/lib/src/pack.dart +417 -0
  22. package/dart-src/packages/cli-tools/lib/src/sign.dart +60 -0
  23. package/dart-src/packages/cli-tools/lib/src/util.dart +86 -0
  24. package/dart-src/packages/cli-tools/migrations/cloudflare/0001_hot-updater_init.sql +16 -0
  25. package/dart-src/packages/cli-tools/migrations/cloudflare/0002_hot-updater_0.13.0.sql +8 -0
  26. package/dart-src/packages/cli-tools/migrations/cloudflare/0003_hot-updater_0.18.0.sql +38 -0
  27. package/dart-src/packages/cli-tools/migrations/cloudflare/0004_hot-updater_0.29.0.sql +11 -0
  28. package/dart-src/packages/cli-tools/migrations/cloudflare/0005_hot-updater_0.31.0.sql +24 -0
  29. package/dart-src/packages/cli-tools/migrations/cloudflare/bundles.sql +42 -0
  30. package/dart-src/packages/cli-tools/migrations/supabase/20250103114225_init.sql +228 -0
  31. package/dart-src/packages/cli-tools/migrations/supabase/20250314000000_hot-updater_0.13.0.sql +134 -0
  32. package/dart-src/packages/cli-tools/migrations/supabase/20250516000000_hot-updater_0.18.0.sql +194 -0
  33. package/dart-src/packages/cli-tools/migrations/supabase/20251014000000_hot-updater_0.21.0.sql +184 -0
  34. package/dart-src/packages/cli-tools/migrations/supabase/20260401000000_hot-updater_0.29.0.sql +503 -0
  35. package/dart-src/packages/cli-tools/migrations/supabase/20260414000000_hot-updater_0.30.0.sql +50 -0
  36. package/dart-src/packages/cli-tools/migrations/supabase/20260422000000_hot-updater_0.31.0.sql +20 -0
  37. package/dart-src/packages/cli-tools/migrations/supabase/20260520014100_hot-updater_rls.sql +48 -0
  38. package/dart-src/packages/cli-tools/pubspec.yaml +37 -0
  39. package/dart-src/packages/core/lib/flutter_patcher_core.dart +29 -0
  40. package/dart-src/packages/core/lib/src/app_update_info.dart +111 -0
  41. package/dart-src/packages/core/lib/src/bundle.dart +191 -0
  42. package/dart-src/packages/core/lib/src/bundle_artifacts.dart +39 -0
  43. package/dart-src/packages/core/lib/src/bundle_patch_artifact.dart +47 -0
  44. package/dart-src/packages/core/lib/src/changed_asset.dart +77 -0
  45. package/dart-src/packages/core/lib/src/get_bundles_args.dart +78 -0
  46. package/dart-src/packages/core/lib/src/metadata.dart +31 -0
  47. package/dart-src/packages/core/lib/src/patch_info.dart +284 -0
  48. package/dart-src/packages/core/lib/src/platform.dart +15 -0
  49. package/dart-src/packages/core/lib/src/rollout.dart +209 -0
  50. package/dart-src/packages/core/lib/src/semver.dart +70 -0
  51. package/dart-src/packages/core/lib/src/semver_range.dart +358 -0
  52. package/dart-src/packages/core/lib/src/semver_version.dart +94 -0
  53. package/dart-src/packages/core/lib/src/status.dart +24 -0
  54. package/dart-src/packages/core/lib/src/strategy.dart +10 -0
  55. package/dart-src/packages/core/lib/src/update_bundle_params.dart +30 -0
  56. package/dart-src/packages/core/lib/src/uuid.dart +45 -0
  57. package/dart-src/packages/core/pubspec.yaml +9 -0
  58. package/dart-src/packages/core/tool/dbg.dart +6 -0
  59. package/dart-src/plugins/aws/.gitkeep +0 -0
  60. package/dart-src/plugins/aws/lib/flutter_patcher_aws.dart +12 -0
  61. package/dart-src/plugins/aws/lib/src/aws_cloudfront_client.dart +207 -0
  62. package/dart-src/plugins/aws/lib/src/aws_cloudfront_signer.dart +130 -0
  63. package/dart-src/plugins/aws/lib/src/aws_config.dart +59 -0
  64. package/dart-src/plugins/aws/lib/src/aws_database.dart +198 -0
  65. package/dart-src/plugins/aws/lib/src/aws_lambda_edge_storage.dart +72 -0
  66. package/dart-src/plugins/aws/lib/src/aws_s3_client.dart +312 -0
  67. package/dart-src/plugins/aws/lib/src/aws_ssm_client.dart +125 -0
  68. package/dart-src/plugins/aws/lib/src/aws_storage.dart +20 -0
  69. package/dart-src/plugins/aws/lib/src/aws_storage_profile.dart +123 -0
  70. package/dart-src/plugins/aws/lib/src/with_cloudfront_signed_url.dart +136 -0
  71. package/dart-src/plugins/aws/pubspec.yaml +22 -0
  72. package/dart-src/plugins/cloudflare/.gitkeep +0 -0
  73. package/dart-src/plugins/cloudflare/lib/flutter_patcher_cloudflare.dart +18 -0
  74. package/dart-src/plugins/cloudflare/lib/src/cloudflare_worker_database.dart +29 -0
  75. package/dart-src/plugins/cloudflare/lib/src/d1_build_where.dart +93 -0
  76. package/dart-src/plugins/cloudflare/lib/src/d1_bundle_mapper.dart +131 -0
  77. package/dart-src/plugins/cloudflare/lib/src/d1_client.dart +66 -0
  78. package/dart-src/plugins/cloudflare/lib/src/d1_config.dart +30 -0
  79. package/dart-src/plugins/cloudflare/lib/src/d1_database.dart +16 -0
  80. package/dart-src/plugins/cloudflare/lib/src/d1_database_plugin.dart +314 -0
  81. package/dart-src/plugins/cloudflare/lib/src/r2_config.dart +50 -0
  82. package/dart-src/plugins/cloudflare/lib/src/r2_s3_client.dart +287 -0
  83. package/dart-src/plugins/cloudflare/lib/src/r2_storage.dart +23 -0
  84. package/dart-src/plugins/cloudflare/lib/src/r2_storage_profile.dart +110 -0
  85. package/dart-src/plugins/cloudflare/migrations/0001_hot-updater_init.sql +16 -0
  86. package/dart-src/plugins/cloudflare/migrations/0002_hot-updater_0.13.0.sql +8 -0
  87. package/dart-src/plugins/cloudflare/migrations/0003_hot-updater_0.18.0.sql +38 -0
  88. package/dart-src/plugins/cloudflare/migrations/0004_hot-updater_0.29.0.sql +11 -0
  89. package/dart-src/plugins/cloudflare/migrations/0005_hot-updater_0.31.0.sql +24 -0
  90. package/dart-src/plugins/cloudflare/pubspec.yaml +20 -0
  91. package/dart-src/plugins/cloudflare/sql/bundles.sql +42 -0
  92. package/dart-src/plugins/plugin-core/lib/flutter_patcher_plugin_core.dart +42 -0
  93. package/dart-src/plugins/plugin-core/lib/src/asset_storage_layout.dart +94 -0
  94. package/dart-src/plugins/plugin-core/lib/src/bundle_storage_layout.dart +44 -0
  95. package/dart-src/plugins/plugin-core/lib/src/bundle_unit_of_work.dart +259 -0
  96. package/dart-src/plugins/plugin-core/lib/src/bundle_unit_of_work_store.dart +20 -0
  97. package/dart-src/plugins/plugin-core/lib/src/calculate_pagination.dart +29 -0
  98. package/dart-src/plugins/plugin-core/lib/src/compression_format.dart +63 -0
  99. package/dart-src/plugins/plugin-core/lib/src/content_addressed_assets.dart +22 -0
  100. package/dart-src/plugins/plugin-core/lib/src/create_blob_database_plugin.dart +853 -0
  101. package/dart-src/plugins/plugin-core/lib/src/create_database_plugin.dart +525 -0
  102. package/dart-src/plugins/plugin-core/lib/src/create_storage_key_builder.dart +15 -0
  103. package/dart-src/plugins/plugin-core/lib/src/create_storage_plugin.dart +130 -0
  104. package/dart-src/plugins/plugin-core/lib/src/filter_compatible_app_versions.dart +18 -0
  105. package/dart-src/plugins/plugin-core/lib/src/generate_min_bundle_id.dart +19 -0
  106. package/dart-src/plugins/plugin-core/lib/src/get_update_info.dart +241 -0
  107. package/dart-src/plugins/plugin-core/lib/src/is_object.dart +5 -0
  108. package/dart-src/plugins/plugin-core/lib/src/legacy_asset_storage_layout.dart +9 -0
  109. package/dart-src/plugins/plugin-core/lib/src/paginate_bundles.dart +112 -0
  110. package/dart-src/plugins/plugin-core/lib/src/parse_storage_uri.dart +44 -0
  111. package/dart-src/plugins/plugin-core/lib/src/query_bundles.dart +70 -0
  112. package/dart-src/plugins/plugin-core/lib/src/request_update_bundle_state.dart +62 -0
  113. package/dart-src/plugins/plugin-core/lib/src/resolve_update_info_from_bundles.dart +43 -0
  114. package/dart-src/plugins/plugin-core/lib/src/storage_profile.dart +27 -0
  115. package/dart-src/plugins/plugin-core/lib/src/types.dart +454 -0
  116. package/dart-src/plugins/plugin-core/lib/src/uuidv7.dart +41 -0
  117. package/dart-src/plugins/plugin-core/pubspec.yaml +15 -0
  118. package/dart-src/plugins/postgres/.gitkeep +0 -0
  119. package/dart-src/plugins/postgres/lib/flutter_patcher_postgres.dart +17 -0
  120. package/dart-src/plugins/postgres/lib/src/postgres_bundle_mapper.dart +130 -0
  121. package/dart-src/plugins/postgres/lib/src/postgres_client.dart +90 -0
  122. package/dart-src/plugins/postgres/lib/src/postgres_config.dart +35 -0
  123. package/dart-src/plugins/postgres/lib/src/postgres_database.dart +302 -0
  124. package/dart-src/plugins/postgres/lib/src/postgres_get_update_info.dart +120 -0
  125. package/dart-src/plugins/postgres/lib/src/postgres_storage.dart +205 -0
  126. package/dart-src/plugins/postgres/lib/src/postgres_types.dart +132 -0
  127. package/dart-src/plugins/postgres/pubspec.yaml +18 -0
  128. package/dart-src/plugins/postgres/sql/bundles.sql +45 -0
  129. package/dart-src/plugins/postgres/sql/get_target_app_version_list.sql +21 -0
  130. package/dart-src/plugins/postgres/sql/get_update_info.spec.ts +171 -0
  131. package/dart-src/plugins/postgres/sql/get_update_info_by_app_version.sql +126 -0
  132. package/dart-src/plugins/postgres/sql/get_update_info_by_fingerprint_hash.sql +125 -0
  133. package/dart-src/plugins/postgres/sql/hash_user_id.sql +30 -0
  134. package/dart-src/plugins/postgres/sql/is_device_eligible.sql +237 -0
  135. package/dart-src/plugins/postgres/sql/prepareSql.ts +11 -0
  136. package/dart-src/plugins/standalone/.gitkeep +0 -0
  137. package/dart-src/plugins/standalone/lib/flutter_patcher_standalone.dart +12 -0
  138. package/dart-src/plugins/standalone/lib/src/standalone_config.dart +107 -0
  139. package/dart-src/plugins/standalone/lib/src/standalone_database.dart +233 -0
  140. package/dart-src/plugins/standalone/lib/src/standalone_storage.dart +175 -0
  141. package/dart-src/plugins/standalone/pubspec.yaml +18 -0
  142. package/dart-src/plugins/supabase/lib/edge.dart +10 -0
  143. package/dart-src/plugins/supabase/lib/flutter_patcher_supabase.dart +21 -0
  144. package/dart-src/plugins/supabase/lib/src/supabase_bundle_mapper.dart +129 -0
  145. package/dart-src/plugins/supabase/lib/src/supabase_client_adapter.dart +154 -0
  146. package/dart-src/plugins/supabase/lib/src/supabase_client_http.dart +516 -0
  147. package/dart-src/plugins/supabase/lib/src/supabase_config.dart +34 -0
  148. package/dart-src/plugins/supabase/lib/src/supabase_database.dart +422 -0
  149. package/dart-src/plugins/supabase/lib/src/supabase_edge_function_database.dart +32 -0
  150. package/dart-src/plugins/supabase/lib/src/supabase_edge_function_storage.dart +99 -0
  151. package/dart-src/plugins/supabase/lib/src/supabase_signed_url_batcher.dart +145 -0
  152. package/dart-src/plugins/supabase/lib/src/supabase_storage.dart +298 -0
  153. package/dart-src/plugins/supabase/lib/src/types.dart +130 -0
  154. package/dart-src/plugins/supabase/pubspec.yaml +19 -0
  155. package/dart-src/plugins/supabase/supabase/edge-functions/index.ts +44 -0
  156. package/dart-src/plugins/supabase/supabase/edge-functions/runtime.docker.integration.spec.ts +968 -0
  157. package/dart-src/plugins/supabase/supabase/migrations/20250103114225_init.sql +228 -0
  158. package/dart-src/plugins/supabase/supabase/migrations/20250314000000_hot-updater_0.13.0.sql +134 -0
  159. package/dart-src/plugins/supabase/supabase/migrations/20250516000000_hot-updater_0.18.0.sql +194 -0
  160. package/dart-src/plugins/supabase/supabase/migrations/20251014000000_hot-updater_0.21.0.sql +184 -0
  161. package/dart-src/plugins/supabase/supabase/migrations/20260401000000_hot-updater_0.29.0.sql +503 -0
  162. package/dart-src/plugins/supabase/supabase/migrations/20260414000000_hot-updater_0.30.0.sql +50 -0
  163. package/dart-src/plugins/supabase/supabase/migrations/20260422000000_hot-updater_0.31.0.sql +20 -0
  164. package/dart-src/plugins/supabase/supabase/migrations/20260520014100_hot-updater_rls.sql +48 -0
  165. package/package.json +2 -1
  166. package/scripts/postinstall.js +53 -25
  167. /package/bin/{flutter-patcher-linux → flutter-patcher-linux-x64} +0 -0
@@ -0,0 +1,50 @@
1
+ -- HotUpdater.is_cohort_eligible
2
+ CREATE OR REPLACE FUNCTION is_cohort_eligible(
3
+ bundle_id UUID,
4
+ cohort TEXT,
5
+ rollout_cohort_count INTEGER,
6
+ target_cohorts TEXT[]
7
+ )
8
+ RETURNS BOOLEAN
9
+ LANGUAGE plpgsql
10
+ IMMUTABLE
11
+ AS $$
12
+ DECLARE
13
+ normalized_cohort TEXT := normalize_cohort_value(cohort);
14
+ normalized_rollout_count INTEGER := COALESCE(rollout_cohort_count, 1000);
15
+ normalized_target_cohorts TEXT[];
16
+ BEGIN
17
+ IF target_cohorts IS NOT NULL THEN
18
+ normalized_target_cohorts := ARRAY(
19
+ SELECT normalize_cohort_value(value)
20
+ FROM unnest(target_cohorts) AS value
21
+ );
22
+ END IF;
23
+
24
+ IF normalized_target_cohorts IS NOT NULL
25
+ AND array_length(normalized_target_cohorts, 1) > 0
26
+ AND normalized_cohort IS NOT NULL
27
+ AND normalized_cohort = ANY(normalized_target_cohorts) THEN
28
+ RETURN TRUE;
29
+ END IF;
30
+
31
+ IF normalized_rollout_count <= 0 THEN
32
+ RETURN FALSE;
33
+ END IF;
34
+
35
+ IF normalized_cohort IS NULL THEN
36
+ RETURN normalized_rollout_count >= 1000;
37
+ END IF;
38
+
39
+ IF NOT is_numeric_cohort(normalized_cohort) THEN
40
+ RETURN FALSE;
41
+ END IF;
42
+
43
+ IF normalized_rollout_count >= 1000 THEN
44
+ RETURN TRUE;
45
+ END IF;
46
+
47
+ RETURN get_numeric_cohort_rollout_position(bundle_id, normalized_cohort)
48
+ < normalized_rollout_count;
49
+ END;
50
+ $$;
@@ -0,0 +1,20 @@
1
+ -- HotUpdater.bundle_artifact_columns
2
+
3
+ ALTER TABLE bundles ADD COLUMN IF NOT EXISTS manifest_storage_uri text;
4
+ ALTER TABLE bundles ADD COLUMN IF NOT EXISTS manifest_file_hash text;
5
+ ALTER TABLE bundles ADD COLUMN IF NOT EXISTS asset_base_storage_uri text;
6
+
7
+ CREATE TABLE IF NOT EXISTS bundle_patches (
8
+ id text PRIMARY KEY,
9
+ bundle_id uuid NOT NULL REFERENCES bundles(id) ON DELETE CASCADE,
10
+ base_bundle_id uuid NOT NULL REFERENCES bundles(id) ON DELETE CASCADE,
11
+ base_file_hash text NOT NULL,
12
+ patch_file_hash text NOT NULL,
13
+ patch_storage_uri text NOT NULL,
14
+ order_index integer NOT NULL DEFAULT 0
15
+ );
16
+
17
+ CREATE INDEX IF NOT EXISTS bundle_patches_bundle_id_idx
18
+ ON bundle_patches(bundle_id);
19
+ CREATE INDEX IF NOT EXISTS bundle_patches_base_bundle_id_idx
20
+ ON bundle_patches(base_bundle_id);
@@ -0,0 +1,48 @@
1
+ -- HotUpdater.supabase_rls
2
+
3
+ ALTER TABLE public.bundles ENABLE ROW LEVEL SECURITY;
4
+ ALTER TABLE public.bundle_patches ENABLE ROW LEVEL SECURITY;
5
+
6
+ ALTER FUNCTION public.get_target_app_version_list(public.platforms, uuid)
7
+ SET search_path = public, pg_catalog;
8
+ ALTER FUNCTION public.get_channels()
9
+ SET search_path = public, pg_catalog;
10
+ ALTER FUNCTION public.positive_mod(integer, integer)
11
+ SET search_path = public, pg_catalog;
12
+ ALTER FUNCTION public.hash_rollout_value(text)
13
+ SET search_path = public, pg_catalog;
14
+ ALTER FUNCTION public.normalize_cohort_value(text)
15
+ SET search_path = public, pg_catalog;
16
+ ALTER FUNCTION public.gcd_int(integer, integer)
17
+ SET search_path = public, pg_catalog;
18
+ ALTER FUNCTION public.get_rollout_multiplier(uuid)
19
+ SET search_path = public, pg_catalog;
20
+ ALTER FUNCTION public.get_rollout_offset(uuid)
21
+ SET search_path = public, pg_catalog;
22
+ ALTER FUNCTION public.get_modular_inverse(integer, integer)
23
+ SET search_path = public, pg_catalog;
24
+ ALTER FUNCTION public.is_numeric_cohort(text)
25
+ SET search_path = public, pg_catalog;
26
+ ALTER FUNCTION public.get_numeric_cohort_rollout_position(uuid, text)
27
+ SET search_path = public, pg_catalog;
28
+ ALTER FUNCTION public.is_cohort_eligible(uuid, text, integer, text[])
29
+ SET search_path = public, pg_catalog;
30
+ ALTER FUNCTION public.get_update_info_by_fingerprint_hash(
31
+ public.platforms,
32
+ uuid,
33
+ uuid,
34
+ text,
35
+ text,
36
+ text
37
+ )
38
+ SET search_path = public, pg_catalog;
39
+ ALTER FUNCTION public.get_update_info_by_app_version(
40
+ public.platforms,
41
+ text,
42
+ uuid,
43
+ uuid,
44
+ text,
45
+ text[],
46
+ text
47
+ )
48
+ SET search_path = public, pg_catalog;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@_nazmiforreal/flutter-ota",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Command-line interface for flutter_patcher — an OTA code-push tool for Flutter, hot-updater compatible.",
5
5
  "bin": {
6
6
  "flutter-patcher": "./bin/flutter-patcher.js"
@@ -11,6 +11,7 @@
11
11
  "files": [
12
12
  "bin",
13
13
  "scripts",
14
+ "dart-src",
14
15
  "migrations",
15
16
  "README.md"
16
17
  ],
@@ -2,52 +2,80 @@
2
2
  'use strict';
3
3
 
4
4
  // Post-install: ensure a runnable flutter-patcher binary exists next to the
5
- // launcher. If a prebuilt platform binary ships in `bin/`, use it. Otherwise
6
- // build one from source with `dart compile exe` when the Dart SDK is present.
5
+ // launcher for the current platform+arch. If a prebuilt
6
+ // `flutter-patcher-<os>-<arch>` binary ships in `bin/`, use it. Otherwise, when
7
+ // the Dart SDK is present, compile one from the bundled Dart source so the
8
+ // package works on architectures we did not prebuild (e.g. arm64).
9
+ //
10
+ // We explicitly run `dart pub get` first so dependency resolution is reliable
11
+ // (a stale/locked tree would otherwise fail to fetch packages). If compilation
12
+ // cannot be performed we warn (and exit 0) rather than failing the whole npm
13
+ // install — the launcher prints a clear "how to build" message at runtime.
7
14
 
8
15
  const { spawnSync } = require('child_process');
9
16
  const fs = require('fs');
10
17
  const path = require('path');
11
18
 
12
- const platform =
13
- process.platform === 'win32'
14
- ? 'windows'
15
- : process.platform === 'darwin'
16
- ? 'macos'
17
- : 'linux';
19
+ function platform() {
20
+ if (process.platform === 'win32') return 'windows';
21
+ if (process.platform === 'darwin') return 'macos';
22
+ return 'linux';
23
+ }
24
+
25
+ function arch() {
26
+ return process.arch === 'arm64' ? 'arm64' : 'x64';
27
+ }
28
+
29
+ const platformName = platform();
30
+ const archName = arch();
18
31
  const ext = process.platform === 'win32' ? '.exe' : '';
19
32
  const pkgDir = path.join(__dirname, '..');
20
33
  const binDir = path.join(pkgDir, 'bin');
21
- const target = path.join(binDir, `flutter-patcher-${platform}${ext}`);
34
+ const target = path.join(binDir, `flutter-patcher-${platformName}-${archName}${ext}`);
35
+ const cliDir = path.join(pkgDir, 'dart-src', 'packages', 'cli-tools');
22
36
 
23
37
  if (fs.existsSync(target)) {
24
- console.log('flutter-patcher: prebuilt binary present, skipping build.');
38
+ console.log(`flutter-patcher: prebuilt binary present (${platformName}-${archName}), skipping build.`);
25
39
  process.exit(0);
26
40
  }
27
41
 
28
42
  const dartCheck = spawnSync('dart', ['--version'], { stdio: 'ignore' });
29
43
  if (dartCheck.status !== 0) {
30
44
  console.warn(
31
- 'flutter-patcher: Dart SDK not found; skipping build. Provide a prebuilt ' +
32
- 'binary in bin/ or install the Dart SDK (https://dart.dev).',
45
+ `flutter-patcher: Dart SDK not found; skipping build. Provide a prebuilt ` +
46
+ `binary (bin/flutter-patcher-${platformName}-${archName}${ext}) or install ` +
47
+ 'the Dart SDK (https://dart.dev).',
33
48
  );
34
49
  process.exit(0);
35
50
  }
36
51
 
37
- // packages/cli-tools/bin/flutter_patcher.dart relative to the repo root.
38
- const repoRoot = path.join(pkgDir, '..', '..', '..');
39
- const dartEntry = path.join(
40
- repoRoot,
41
- 'packages',
42
- 'cli-tools',
43
- 'bin',
44
- 'flutter_patcher.dart',
45
- );
52
+ if (!fs.existsSync(path.join(cliDir, 'pubspec.yaml'))) {
53
+ console.warn('flutter-patcher: bundled Dart source not found; skipping build.');
54
+ process.exit(0);
55
+ }
56
+
57
+ console.log('flutter-patcher: resolving Dart dependencies (dart pub get)...');
58
+ const getRes = spawnSync('dart', ['pub', 'get'], { stdio: 'inherit', cwd: cliDir });
59
+ if (getRes.status !== 0) {
60
+ console.warn(
61
+ 'flutter-patcher: `dart pub get` failed (check your network / Dart version). ' +
62
+ `To build manually:\n cd ${cliDir} && dart compile exe bin/flutter_patcher.dart ` +
63
+ `-o ${target}`,
64
+ );
65
+ process.exit(0);
66
+ }
46
67
 
47
- console.log('flutter-patcher: building binary with `dart compile exe`...');
68
+ console.log('flutter-patcher: building native binary with `dart compile exe`...');
48
69
  const res = spawnSync(
49
70
  'dart',
50
- ['compile', 'exe', dartEntry, '-o', target],
51
- { stdio: 'inherit' },
71
+ ['compile', 'exe', 'bin/flutter_patcher.dart', '-o', target],
72
+ { stdio: 'inherit', cwd: cliDir },
52
73
  );
53
- process.exit(res.status == null ? 1 : res.status);
74
+ if (res.status !== 0) {
75
+ console.warn(
76
+ 'flutter-patcher: build failed. To build manually:\n cd ' +
77
+ `${cliDir} && dart compile exe bin/flutter_patcher.dart -o ${target}`,
78
+ );
79
+ process.exit(0);
80
+ }
81
+ console.log(`flutter-patcher: built ${target}`);