native-update 2.0.0 → 3.1.0

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 (258) hide show
  1. package/Readme.md +28 -14
  2. package/android/manifest-additions.xml +28 -0
  3. package/android/src/main/AndroidManifest.xml +3 -7
  4. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundNotificationManager.kt +21 -13
  5. package/android/src/main/java/com/aoneahsan/nativeupdate/LiveUpdatePlugin.kt +196 -29
  6. package/android/src/main/java/com/aoneahsan/nativeupdate/NativeUpdatePlugin.kt +21 -36
  7. package/cli/AGENTS.md +15 -1
  8. package/cli/CLAUDE.md +15 -1
  9. package/cli/commands/backend-create.js +56 -15
  10. package/cli/commands/bundle-create.js +39 -7
  11. package/cli/commands/monitor.js +72 -51
  12. package/cli/index.js +10 -24
  13. package/cli/package.json +11 -3
  14. package/dist/esm/app-review/app-review-manager.js +0 -1
  15. package/dist/esm/app-review/index.js +0 -1
  16. package/dist/esm/app-review/platform-review-handler.js +0 -1
  17. package/dist/esm/app-review/review-conditions-checker.js +0 -1
  18. package/dist/esm/app-review/review-rate-limiter.js +0 -1
  19. package/dist/esm/app-review/types.js +0 -1
  20. package/dist/esm/app-update/app-update-checker.js +0 -1
  21. package/dist/esm/app-update/app-update-installer.d.ts +1 -0
  22. package/dist/esm/app-update/app-update-installer.js +19 -8
  23. package/dist/esm/app-update/app-update-manager.js +0 -1
  24. package/dist/esm/app-update/app-update-notifier.js +0 -1
  25. package/dist/esm/app-update/index.js +0 -1
  26. package/dist/esm/app-update/platform-app-update.js +12 -3
  27. package/dist/esm/app-update/types.js +0 -1
  28. package/dist/esm/background-update/background-scheduler.js +0 -1
  29. package/dist/esm/background-update/index.js +0 -1
  30. package/dist/esm/background-update/notification-manager.js +0 -1
  31. package/dist/esm/config/support.js +0 -1
  32. package/dist/esm/core/analytics.d.ts +13 -0
  33. package/dist/esm/core/analytics.js +15 -1
  34. package/dist/esm/core/cache-manager.js +0 -1
  35. package/dist/esm/core/config.d.ts +0 -15
  36. package/dist/esm/core/config.js +0 -4
  37. package/dist/esm/core/errors.d.ts +1 -0
  38. package/dist/esm/core/errors.js +1 -1
  39. package/dist/esm/core/event-emitter.d.ts +0 -3
  40. package/dist/esm/core/event-emitter.js +8 -3
  41. package/dist/esm/core/logger.js +0 -1
  42. package/dist/esm/core/performance.js +0 -1
  43. package/dist/esm/core/plugin-manager.js +3 -1
  44. package/dist/esm/core/security.d.ts +11 -0
  45. package/dist/esm/core/security.js +27 -1
  46. package/dist/esm/definitions.d.ts +0 -11
  47. package/dist/esm/definitions.js +0 -1
  48. package/dist/esm/index.d.ts +3 -2
  49. package/dist/esm/index.js +3 -1
  50. package/dist/esm/live-update/bundle-manager.d.ts +8 -0
  51. package/dist/esm/live-update/bundle-manager.js +20 -1
  52. package/dist/esm/live-update/certificate-pinning.js +0 -1
  53. package/dist/esm/live-update/delta-processor.d.ts +1 -1
  54. package/dist/esm/live-update/delta-processor.js +3 -1
  55. package/dist/esm/live-update/download-manager.js +9 -2
  56. package/dist/esm/live-update/rollout-checker.d.ts +1 -1
  57. package/dist/esm/live-update/rollout-checker.js +5 -6
  58. package/dist/esm/live-update/update-manager.js +0 -1
  59. package/dist/esm/live-update/version-manager.d.ts +0 -12
  60. package/dist/esm/live-update/version-manager.js +0 -68
  61. package/dist/esm/plugin.js +69 -43
  62. package/dist/esm/security/crypto.js +11 -7
  63. package/dist/esm/security/validator.js +0 -1
  64. package/dist/esm/types/rollout.d.ts +85 -0
  65. package/dist/esm/types/rollout.js +25 -0
  66. package/dist/esm/web.d.ts +8 -0
  67. package/dist/esm/web.js +148 -54
  68. package/dist/plugin.cjs.js +1 -2
  69. package/dist/plugin.esm.js +1 -2
  70. package/dist/plugin.js +2 -3
  71. package/docs/CHANGELOG.md +124 -0
  72. package/docs/CLAUDE.md +1 -1
  73. package/docs/MANUAL-TASKS.md +17 -0
  74. package/docs/MARKETING_WEBSITE_TRACKER.md +18 -2
  75. package/docs/MIGRATION.md +83 -0
  76. package/docs/PACKAGES.md +167 -0
  77. package/docs/PERFORMANCE.md +110 -0
  78. package/docs/PROJECT_COMPLETION_TRACKER.md +4 -35
  79. package/docs/README.md +0 -1
  80. package/docs/REMAINING_FEATURES.md +123 -76
  81. package/docs/ROADMAP.md +200 -120
  82. package/docs/SECURITY-IF-REPO-PUBLIC.md +232 -0
  83. package/docs/TESTING_REQUIREMENTS.md +1 -112
  84. package/docs/ai-knowledge-base/00-project-profile.md +38 -0
  85. package/docs/ai-knowledge-base/01-features.md +46 -0
  86. package/docs/ai-knowledge-base/02-routes.md +72 -0
  87. package/docs/ai-knowledge-base/03-tech-stack.md +57 -0
  88. package/docs/ai-knowledge-base/README.md +23 -0
  89. package/docs/analytics-tracking.md +37 -0
  90. package/docs/capacitor-official-plugins.md +46 -0
  91. package/docs/capawesome-plugins.md +29 -0
  92. package/docs/deployment/HOSTINGER_DEPLOY.md +75 -34
  93. package/docs/deployment/PRODUCTION-DEPLOY-CHECKLIST.md +184 -0
  94. package/docs/docs-site/plan.md +201 -0
  95. package/docs/docs-site/scope.md +127 -0
  96. package/docs/docs-site/tracker.json +235 -0
  97. package/docs/error-handling-tracking.md +37 -0
  98. package/docs/guides/testing-guide.md +15 -41
  99. package/docs/package-audit.md +41 -0
  100. package/docs/play-store/ASO-METADATA.md +5 -0
  101. package/docs/play-store/DATA-SAFETY.md +5 -0
  102. package/docs/play-store/DECLARATIONS.md +5 -0
  103. package/docs/play-store/README.md +27 -0
  104. package/docs/play-store/RELEASE-NOTES.md +99 -0
  105. package/docs/play-store/RELEASE-STEPS.md +6 -0
  106. package/docs/play-store/STORE-LISTING.md +7 -0
  107. package/docs/play-store/SUBMISSION-CHECKLIST.md +5 -0
  108. package/docs/production-readiness.md +1 -1
  109. package/docs/project-audit/2026-05-16/00-FINALIZATION-PLAN.md +123 -0
  110. package/docs/project-audit/2026-05-16/01-BATCH-PLAN.md +227 -0
  111. package/docs/project-audit/2026-05-16/02-AUDIT-FINDINGS.md +144 -0
  112. package/docs/project-audit/2026-05-16/sessions/batch-01.md +42 -0
  113. package/docs/project-audit/2026-05-16/sessions/batch-02.md +74 -0
  114. package/docs/project-audit/2026-05-16/sessions/batch-03.md +71 -0
  115. package/docs/project-audit/2026-05-16/sessions/batch-04.md +88 -0
  116. package/docs/project-audit/2026-05-16/sessions/batch-05.md +63 -0
  117. package/docs/project-audit/2026-05-16/sessions/batch-06.md +103 -0
  118. package/docs/project-audit/2026-05-16/sessions/batch-07.md +61 -0
  119. package/docs/project-audit/2026-05-16/sessions/batch-08.md +101 -0
  120. package/docs/project-audit/2026-05-16/sessions/batch-09.md +105 -0
  121. package/docs/project-audit/2026-05-16/sessions/batch-10.md +102 -0
  122. package/docs/project-audit/AUDIT-HISTORY.md +74 -0
  123. package/docs/project-audit/BATCH-PLAN.md +168 -0
  124. package/docs/project-audit/MARKETING-WEBSITE-FINDINGS-2026-05-11.md +73 -0
  125. package/docs/project-audit/PRODUCTION-READINESS-AUDIT-2026-05-08.md +275 -0
  126. package/docs/project-finalization/00-tracker.json +60 -0
  127. package/docs/project-knowledge-base/01-system-overview.md +39 -30
  128. package/docs/project-knowledge-base/02-routes-pages-forms-users.md +87 -81
  129. package/docs/project-knowledge-base/03-tech-stack-modules-services.md +140 -108
  130. package/docs/project-knowledge-base/04-data-models-integrations.md +191 -254
  131. package/docs/project-knowledge-base/05-docs-corpus-inventory.md +83 -20
  132. package/docs/project-knowledge-base/06-operations-testing-legal-content.md +67 -29
  133. package/docs/project-knowledge-base/README.md +27 -14
  134. package/docs/project-profiles/native-update-capacitor-update-platform-project-profile-last-updated-2026-05-19.md +81 -0
  135. package/docs/rules-tracker.md +102 -0
  136. package/docs/security/PRE-LAUNCH-PENTEST-CHECKLIST.md +116 -0
  137. package/docs/social-media-marketing/README.md +81 -0
  138. package/docs/social-media-marketing/posts-batch-01.md +613 -0
  139. package/docs/social-media-marketing/posts-batch-02.md +528 -0
  140. package/docs/social-media-marketing/whatsapp-messages-batch-01.md +458 -0
  141. package/docs/social-media-marketing/whatsapp-status-batch-01.md +355 -0
  142. package/docs/tracking/finalization-2026-05-16-tracker.json +346 -0
  143. package/docs/tracking/full-audit-tracker.json +121 -0
  144. package/docs/tracking/production-readiness-audit-tracker.json +429 -0
  145. package/ios/Plugin/BackgroundUpdate/BackgroundUpdatePlugin.swift +16 -3
  146. package/ios/Plugin/LiveUpdate/LiveUpdatePlugin.swift +71 -47
  147. package/ios/Plugin/NativeUpdatePlugin.swift +14 -9
  148. package/package.json +29 -29
  149. package/cli/node_modules/.yarn-integrity +0 -16
  150. package/cli/node_modules/commander/LICENSE +0 -22
  151. package/cli/node_modules/commander/Readme.md +0 -1148
  152. package/cli/node_modules/commander/esm.mjs +0 -16
  153. package/cli/node_modules/commander/index.js +0 -26
  154. package/cli/node_modules/commander/lib/argument.js +0 -145
  155. package/cli/node_modules/commander/lib/command.js +0 -2179
  156. package/cli/node_modules/commander/lib/error.js +0 -43
  157. package/cli/node_modules/commander/lib/help.js +0 -462
  158. package/cli/node_modules/commander/lib/option.js +0 -329
  159. package/cli/node_modules/commander/lib/suggestSimilar.js +0 -100
  160. package/cli/node_modules/commander/package-support.json +0 -16
  161. package/cli/node_modules/commander/package.json +0 -80
  162. package/cli/node_modules/commander/typings/esm.d.mts +0 -3
  163. package/cli/node_modules/commander/typings/index.d.ts +0 -884
  164. package/cli/yarn.lock +0 -8
  165. package/dist/esm/__tests__/bundle-manager.test.d.ts +0 -1
  166. package/dist/esm/__tests__/bundle-manager.test.js +0 -151
  167. package/dist/esm/__tests__/bundle-manager.test.js.map +0 -1
  168. package/dist/esm/__tests__/config.test.d.ts +0 -1
  169. package/dist/esm/__tests__/config.test.js +0 -70
  170. package/dist/esm/__tests__/config.test.js.map +0 -1
  171. package/dist/esm/__tests__/delta-processor.test.d.ts +0 -1
  172. package/dist/esm/__tests__/delta-processor.test.js +0 -77
  173. package/dist/esm/__tests__/delta-processor.test.js.map +0 -1
  174. package/dist/esm/__tests__/firestore-schema.test.d.ts +0 -1
  175. package/dist/esm/__tests__/firestore-schema.test.js +0 -74
  176. package/dist/esm/__tests__/firestore-schema.test.js.map +0 -1
  177. package/dist/esm/__tests__/integration.test.d.ts +0 -1
  178. package/dist/esm/__tests__/integration.test.js +0 -78
  179. package/dist/esm/__tests__/integration.test.js.map +0 -1
  180. package/dist/esm/__tests__/manifest-reader.test.d.ts +0 -1
  181. package/dist/esm/__tests__/manifest-reader.test.js +0 -271
  182. package/dist/esm/__tests__/manifest-reader.test.js.map +0 -1
  183. package/dist/esm/__tests__/rollout-checker.test.d.ts +0 -1
  184. package/dist/esm/__tests__/rollout-checker.test.js +0 -210
  185. package/dist/esm/__tests__/rollout-checker.test.js.map +0 -1
  186. package/dist/esm/__tests__/security-enforcement.test.d.ts +0 -1
  187. package/dist/esm/__tests__/security-enforcement.test.js +0 -95
  188. package/dist/esm/__tests__/security-enforcement.test.js.map +0 -1
  189. package/dist/esm/__tests__/security.test.d.ts +0 -1
  190. package/dist/esm/__tests__/security.test.js +0 -54
  191. package/dist/esm/__tests__/security.test.js.map +0 -1
  192. package/dist/esm/__tests__/version-manager.test.d.ts +0 -1
  193. package/dist/esm/__tests__/version-manager.test.js +0 -45
  194. package/dist/esm/__tests__/version-manager.test.js.map +0 -1
  195. package/dist/esm/app-review/app-review-manager.js.map +0 -1
  196. package/dist/esm/app-review/index.js.map +0 -1
  197. package/dist/esm/app-review/platform-review-handler.js.map +0 -1
  198. package/dist/esm/app-review/review-conditions-checker.js.map +0 -1
  199. package/dist/esm/app-review/review-rate-limiter.js.map +0 -1
  200. package/dist/esm/app-review/types.js.map +0 -1
  201. package/dist/esm/app-update/app-update-checker.js.map +0 -1
  202. package/dist/esm/app-update/app-update-installer.js.map +0 -1
  203. package/dist/esm/app-update/app-update-manager.js.map +0 -1
  204. package/dist/esm/app-update/app-update-notifier.js.map +0 -1
  205. package/dist/esm/app-update/index.js.map +0 -1
  206. package/dist/esm/app-update/platform-app-update.js.map +0 -1
  207. package/dist/esm/app-update/types.js.map +0 -1
  208. package/dist/esm/background-update/background-scheduler.js.map +0 -1
  209. package/dist/esm/background-update/index.js.map +0 -1
  210. package/dist/esm/background-update/notification-manager.js.map +0 -1
  211. package/dist/esm/config/support.js.map +0 -1
  212. package/dist/esm/core/analytics.js.map +0 -1
  213. package/dist/esm/core/cache-manager.js.map +0 -1
  214. package/dist/esm/core/config.js.map +0 -1
  215. package/dist/esm/core/errors.js.map +0 -1
  216. package/dist/esm/core/event-emitter.js.map +0 -1
  217. package/dist/esm/core/logger.js.map +0 -1
  218. package/dist/esm/core/performance.js.map +0 -1
  219. package/dist/esm/core/plugin-manager.js.map +0 -1
  220. package/dist/esm/core/security.js.map +0 -1
  221. package/dist/esm/definitions.js.map +0 -1
  222. package/dist/esm/firestore/firestore-client.d.ts +0 -109
  223. package/dist/esm/firestore/firestore-client.js +0 -264
  224. package/dist/esm/firestore/firestore-client.js.map +0 -1
  225. package/dist/esm/firestore/index.d.ts +0 -11
  226. package/dist/esm/firestore/index.js +0 -11
  227. package/dist/esm/firestore/index.js.map +0 -1
  228. package/dist/esm/firestore/manifest-reader.d.ts +0 -87
  229. package/dist/esm/firestore/manifest-reader.js +0 -294
  230. package/dist/esm/firestore/manifest-reader.js.map +0 -1
  231. package/dist/esm/firestore/schema.d.ts +0 -507
  232. package/dist/esm/firestore/schema.js +0 -73
  233. package/dist/esm/firestore/schema.js.map +0 -1
  234. package/dist/esm/index.js.map +0 -1
  235. package/dist/esm/live-update/bundle-manager.js.map +0 -1
  236. package/dist/esm/live-update/certificate-pinning.js.map +0 -1
  237. package/dist/esm/live-update/delta-processor.js.map +0 -1
  238. package/dist/esm/live-update/download-manager.js.map +0 -1
  239. package/dist/esm/live-update/rollout-checker.js.map +0 -1
  240. package/dist/esm/live-update/update-manager.js.map +0 -1
  241. package/dist/esm/live-update/version-manager.js.map +0 -1
  242. package/dist/esm/plugin.js.map +0 -1
  243. package/dist/esm/security/crypto.js.map +0 -1
  244. package/dist/esm/security/validator.js.map +0 -1
  245. package/dist/esm/web.js.map +0 -1
  246. package/dist/plugin.cjs.js.map +0 -1
  247. package/dist/plugin.esm.js.map +0 -1
  248. package/dist/plugin.js.map +0 -1
  249. package/docs/FIREBASE_INTEGRATION_TRACKER.md +0 -321
  250. package/docs/FIREBASE_QUERIES_AND_INDEXES_AUDIT.md +0 -221
  251. package/docs/examples/firebase-backend-example.md +0 -27
  252. package/docs/features/laravel-nova-backend/credentials.ignore.md +0 -34
  253. package/docs/guides/no-cost-backend-implementation-plan.md +0 -77
  254. package/docs/guides/no-cost-firestore-google-drive-backend.md +0 -60
  255. package/docs/project-profiles/native-update-capacitor-update-platform-project-profile-last-updated-2026-03-16.md +0 -454
  256. package/docs/project-profiles/native-update-capacitor-update-platform-project-profile-last-updated-2026-03-24.md +0 -66
  257. package/docs/project-profiles/native-update-capacitor-update-platform-project-profile-last-updated-2026-03-25.md +0 -67
  258. /package/docs/{MARKETING_WEBSITE_PLAN.md → archive/MARKETING_WEBSITE_PLAN.md} +0 -0
package/docs/MIGRATION.md CHANGED
@@ -1,5 +1,88 @@
1
1
  # Migration Guide
2
2
 
3
+ ## Upgrading v2 → v3.0.0
4
+
5
+ v3 narrows the plugin to a single, well-supported backend contract: the
6
+ hosted Native Update SaaS at `https://nativeupdate.aoneahsan.com`
7
+ (reference implementation: Laravel 11 + Nova 5 in `backend/`). The
8
+ direct-Firestore branch — `backendType: 'firestore'` plus the
9
+ `firestore: { … }` config — is removed, along with the
10
+ `src/firestore/` schema/client/manifest-reader/rules/indexes and the
11
+ `example-apps/firebase-backend/` example.
12
+
13
+ ### Why
14
+
15
+ The Firestore branch existed so apps could run without any server. In
16
+ practice it pushed a lot of operational work (security rules, indexes,
17
+ billing, Drive token storage) onto every consumer. The SaaS handles all
18
+ of it server-side, so the SDK only needs to know how to call one
19
+ backend.
20
+
21
+ ### Required action
22
+
23
+ #### 1. Drop `backendType` and `firestore` from your config
24
+
25
+ ```diff
26
+ await NativeUpdate.initialize({
27
+ - backendType: 'firestore',
28
+ - firestore: { projectId: '…', appId: 'com.your.app', channel: 'production' },
29
+ + serverUrl: 'https://api.nativeupdate.aoneahsan.com',
30
+ + apiKey: import.meta.env.VITE_NATIVE_UPDATE_API_KEY,
31
+ + publicKey: import.meta.env.VITE_NATIVE_UPDATE_PUBLIC_KEY,
32
+ appId: 'com.your.app',
33
+ channel: 'production',
34
+ });
35
+ ```
36
+
37
+ If you were running your own Firestore project for manifests, register
38
+ your app in the Native Update dashboard, generate an API key, and
39
+ switch to the HTTP config above. The dashboard mirrors every field
40
+ that previously lived in your Firestore manifest.
41
+
42
+ #### 2. Delete any direct Firestore reads from your app code
43
+
44
+ ```diff
45
+ - import { FirestoreConfig } from 'native-update';
46
+ ```
47
+
48
+ The plugin no longer exposes `FirestoreConfig`, `firestore-client`, or
49
+ `manifest-reader`. Update checks happen via
50
+ `NativeUpdate.checkForUpdate()` / `NativeUpdate.sync()`, which now
51
+ always speak HTTP to your configured `serverUrl`.
52
+
53
+ #### 3. Replace `firestore/schema` type imports
54
+
55
+ If you were importing rollout / device / update-check types, switch to
56
+ the new backend-neutral exports:
57
+
58
+ ```diff
59
+ - import type {
60
+ - RolloutConfig,
61
+ - RolloutTargetSegments,
62
+ - DeviceInfo,
63
+ - UpdateCheckResponse,
64
+ - } from 'native-update/firestore';
65
+ + import type {
66
+ + RolloutConfig,
67
+ + RolloutTargetSegments,
68
+ + DeviceInfo,
69
+ + UpdateCheckResponse,
70
+ + } from 'native-update';
71
+ ```
72
+
73
+ `FirestoreTimestamp` is replaced by `RolloutTimestamp` (`number |
74
+ string | Date`); a `toEpochMs()` helper handles all three forms.
75
+
76
+ ### Not affected
77
+
78
+ - Bundle download, verification, install, rollback, boot-time
79
+ re-verify, and crash-loop auto-rollback are unchanged.
80
+ - Native Android / iOS plugin code is unchanged.
81
+ - App store update checks (`AppUpdate`) and in-app review prompts
82
+ (`AppReview`) are unchanged.
83
+
84
+ ---
85
+
3
86
  ## Upgrading v1 → v2.0.0
4
87
 
5
88
  v2 is a security-focused hardening release with a handful of breaking
@@ -0,0 +1,167 @@
1
+ # Packages — Native Update
2
+
3
+ > Inventory of every package this project depends on and where it's used.
4
+ > Fixed path (all projects): docs/PACKAGES.md. Update on EVERY add/remove/upgrade.
5
+ > Last updated: 2026-06-19 | Fleet pass: 2026-06-19 (absolute-latest + Node ≥24.16.0; cooldown OFF)
6
+
7
+ ## package.json / composer.json units (in scope)
8
+
9
+ - `package.json` (root) — Published Capacitor plugin (`native-update`) + bundled CLI. Build: `tsc` → Rollup.
10
+ - `website/package.json` — React 19 + Vite 8 + Tailwind v4 + Radix marketing site + dashboard.
11
+ - `cli/package.json` (`native-update-cli`) — CLI shipped via the root `bin`; deps also resolve from root when published.
12
+ - `backend/package.json` — Laravel Vite asset build (JS tooling). `backend/composer.json` — Laravel 13 + Nova 5 (PHP).
13
+
14
+ **Out of scope:** `example-apps/**` (demo apps — fleet rule: skip), `backend/vendor/**` (Composer vendor).
15
+
16
+ **Engines:** every unit pins `node >=24.16.0` (user directive 2026-06-19). The published plugin therefore requires Node ≥24.16 in consumer toolchains. PHP floor raised to `^8.3` (Laravel 13).
17
+
18
+ ---
19
+
20
+ ## Root plugin (`native-update`)
21
+
22
+ ### Production deps — the bundled CLI's runtime deps (root `bin: cli/index.js`)
23
+ | Package | Version | Used where | Notes |
24
+ |---|---|---|---|
25
+ | archiver | ^8.0.0 | `cli/commands/bundle-create.js` | ZIP bundle creation |
26
+ | chalk | ^5.6.2 | `cli/index.js`, all `cli/commands/*.js` | Colored output |
27
+ | commander | ^15.0.0 | `cli/index.js` | CLI arg parsing (14→15; needs Node ≥22.12, OK under ≥24.16) |
28
+ | express | ^5.2.1 | `cli/commands/server-start.js` | Local test/manifest server |
29
+ | ora | ^9.4.0 | `cli/commands/{backend-create,monitor}.js` | Spinners |
30
+ | prompts | ^2.4.2 | `cli/commands/init.js` | Interactive init |
31
+
32
+ > Plugin TS (`src/**`) imports only `@capacitor/core`, `@capacitor/filesystem`, `@capacitor/preferences` — all Rollup `external`; core is the lone peer. Not bundled.
33
+
34
+ ### Dev deps
35
+ | Package | Version | Notes |
36
+ |---|---|---|
37
+ | @capacitor/app | ^8.1.0 | Capacitor 8 lockstep (referenced in src/build context) |
38
+ | @capacitor/core | ^8.4.1 | `src/**` peer + type-check |
39
+ | @capacitor/device | ^8.0.2 | Capacitor 8 lockstep |
40
+ | @capacitor/filesystem | ^8.1.2 | `src/**` (external) |
41
+ | @capacitor/preferences | ^8.0.1 | `src/**` (external) |
42
+ | @rollup/plugin-node-resolve | ^16.0.3 | `rollup.config.js` |
43
+ | @rollup/plugin-terser | ^1.0.0 | `rollup.config.js` |
44
+ | @types/node | ^26.0.0 | tsconfig node typings |
45
+ | @typescript-eslint/eslint-plugin · parser | ^8.61.1 | `eslint.config.js` |
46
+ | eslint | ^10.5.0 | `yarn lint` |
47
+ | prettier | ^3.8.4 | `yarn prettier` |
48
+ | rimraf | ^6.1.3 | `build`/`clean` scripts |
49
+ | rollup | ^4.62.0 | `build` |
50
+ | typescript | ^6.0.3 | `build`/`tsc` |
51
+
52
+ ### Peer deps
53
+ | Package | Version | Notes |
54
+ |---|---|---|
55
+ | @capacitor/core | ^8.0.1 | Provided by the consumer app |
56
+
57
+ ---
58
+
59
+ ## website/ (React 19 + Vite 8 + Tailwind v4)
60
+
61
+ ### Production deps
62
+ | Package | Version | Used where |
63
+ |---|---|---|
64
+ | @amplitude/analytics-browser | ^2.44.1 | `src/lib/analytics.ts` |
65
+ | @capacitor/android · cli · core · ios | ^8.4.1 | native build / `cap:sync` |
66
+ | @capacitor/motion | ^8.0.0 | `src/services/capacitor/motion.service.ts` |
67
+ | @capacitor/preferences | ^8.0.1 | token/theme storage |
68
+ | @capacitor/privacy-screen | ^2.0.1 | `src/services/capacitor/privacy-screen.service.ts` |
69
+ | @capacitor/share | ^8.0.1 | `src/services/capacitor/share.service.ts` |
70
+ | @capawesome/capacitor-app-shortcuts | ^8.0.1 | `src/services/capacitor/app-shortcuts.service.ts` |
71
+ | @hookform/resolvers | ^5.4.0 | RHF + Zod (UploadPage) |
72
+ | @microsoft/clarity | ^1.0.2 | `src/lib/errorTracking.ts` |
73
+ | @radix-ui/react-{dialog,icons,select,slider,slot,switch} | various | UI components |
74
+ | @sentry/react | ^10.58.0 | `src/lib/errorTracking.ts` |
75
+ | @tanstack/react-query | ^5.101.0 | `src/App.tsx` + hooks |
76
+ | @types/d3 | ^7.4.3 | type-only for `d3` (kept; see ambiguous) |
77
+ | axios | ^1.18.0 | `src/lib/api.ts` |
78
+ | class-variance-authority / clsx / tailwind-merge | — | UI utils |
79
+ | d3 | ^7.9.0 | `src/pages/ExamplesPage.tsx` |
80
+ | framer-motion | 12.40.0 | **PINNED exact** (see pins) |
81
+ | jszip | ^3.10.1 | `src/services/manifest-generator.ts` |
82
+ | lucide-react | ^1.21.0 | icons |
83
+ | react / react-dom | ^19.2.7 | app-wide |
84
+ | react-hook-form | ^7.79.0 | UploadPage |
85
+ | react-markdown / remark-gfm | — | DocsMarkdownPage |
86
+ | react-router-dom | ^7.18.0 | `src/router.tsx` |
87
+ | zod | ^4.4.3 | validation |
88
+ | zustand | ^5.0.14 | `src/stores/themeStore.ts` |
89
+
90
+ ### Dev deps
91
+ | Package | Version | Notes |
92
+ |---|---|---|
93
+ | @tailwindcss/vite | ^4.3.1 | `vite.config.ts` — the ONLY Tailwind path now |
94
+ | @trapezedev/configure | ^7.1.4 | `sync:apps-config` |
95
+ | @types/node | ^26.0.0 | `tsconfig.node.json` |
96
+ | @types/react · @types/react-dom | ^19.2.x | typings |
97
+ | @vitejs/plugin-react | ^6.0.2 | `vite.config.ts` |
98
+ | eslint + eslint-plugin-react-hooks + eslint-plugin-react-refresh + typescript-eslint + globals | — | lint |
99
+ | tailwindcss | ^4.3.1 | resolves `@import "tailwindcss"` |
100
+ | tsx | ^4.22.4 | runs `postbuild-seo.ts` (added so build doesn't `npx`-fetch) |
101
+ | typescript | ~6.0.3 | `tsc -b` (typecheck gate) |
102
+ | vite | ^8.0.16 | build/dev |
103
+
104
+ ---
105
+
106
+ ## cli/ (`native-update-cli`)
107
+ Now self-contained (previously declared only `commander`, but imports more):
108
+ | Package | Version | Used where |
109
+ |---|---|---|
110
+ | archiver ^8.0.0 · chalk ^5.6.2 · commander ^15.0.0 · express ^5.2.1 · ora ^9.4.0 · prompts ^2.4.2 | — | `cli/index.js` + `cli/commands/*.js` |
111
+
112
+ ---
113
+
114
+ ## backend/ — Composer (PHP, Laravel 13 + Nova 5)
115
+ | Package | Version | Notes |
116
+ |---|---|---|
117
+ | php | ^8.3 | raised from ^8.2 for Laravel 13 |
118
+ | laravel/framework | ^13.0 (13.16.1) | 11→13; fixes 3 security advisories (CRLF email / signed-URL) |
119
+ | laravel/nova | ^5.8 | supports Laravel 13 |
120
+ | laravel/sanctum | ^4.3 | dashboard bearer tokens |
121
+ | laravel/socialite | ^5.27 | Google OAuth |
122
+ | laravel/tinker | ^3.0 | 2→3 (needed for L13) |
123
+ | spatie/laravel-permission | ^8.0 | 6→8 — **RBAC: re-run migrations + Pest before deploy** |
124
+ | srmklive/paypal | ^3.1 | unlocked by L13 (was stuck at 3.0.40) |
125
+ | google/apiclient | ^2.15 | Drive API |
126
+ | phpunit/phpunit (dev) | ^12.0 | 11→12 |
127
+
128
+ ## backend/ — npm (Vite asset build)
129
+ | Package | Version | Notes |
130
+ |---|---|---|
131
+ | @tailwindcss/postcss + postcss | ^4.3.1 / ^8.5.15 | backend uses the postcss Tailwind path (no @tailwindcss/vite here) — KEPT |
132
+ | tailwindcss | ^4.3.1 | `tailwind.config.js` |
133
+ | axios | ^1.18.0 | `resources/js/bootstrap.js` |
134
+ | concurrently | ^10.0.3 | composer `dev` script — KEPT |
135
+ | laravel-vite-plugin | ^3.1.0 | `vite.config.js` |
136
+ | vite | ^8.0.16 | build/dev |
137
+
138
+ ---
139
+
140
+ ## Intentional pins / floors
141
+ | Item | Value | Reason |
142
+ |---|---|---|
143
+ | framer-motion | 12.40.0 exact (website) | Pre-existing exact pin; held to avoid animation-runtime regressions. |
144
+ | @capacitor/* | ^8.x (all units) | Capacitor major lockstep. |
145
+ | node engine | >=24.16.0 (all units) | User directive 2026-06-19 — unblocks commander@15 + latest majors. |
146
+ | php | ^8.3 (backend) | Laravel 13 minimum. |
147
+
148
+ ## Removed in cleanup
149
+ | Date | Package | unit | Why |
150
+ |---|---|---|---|
151
+ | 2026-06-19 | @capacitor/android, @capacitor/ios | root dev | A plugin's TS never imports native runtime packages (only core/filesystem/preferences); confirmed unused. |
152
+ | 2026-06-19 | @tailwindcss/postcss, postcss (+ `postcss.config.js`) | website dev | Redundant — Tailwind already runs via `@tailwindcss/vite`; the postcss path double-processed it. |
153
+ | 2026-06-18 | @rollup/plugin-json | root dev | Not used by `rollup.config.js`. |
154
+ | 2026-06-18 | 8× unused `@radix-ui/react-*` | website prod | No imports in `src/` (accordion, dropdown-menu, label, navigation-menu, scroll-area, separator, tabs, tooltip). |
155
+ | 2026-06-18 | autoprefixer | backend dev | Tailwind v4 handles prefixing. |
156
+
157
+ ## Ambiguous / kept
158
+ | Package | Why |
159
+ |---|---|
160
+ | @types/d3 (website) | Type-only; consumed implicitly for `d3`. Kept (lives in deps; left as-is). |
161
+
162
+ ## Build (re-measured 2026-06-19 — all <60s; outputs preserved)
163
+ The website's `tsc -b` was moved **out of `build`** into the `typecheck` gate (was the ~80s bottleneck), so the three checks are now independent and each green:
164
+ - **Root**: `yarn build` (rimraf + tsc + rollup) **~4s** · lint 0. Outputs: `dist/esm/**` + `plugin.{js,cjs.js,esm.js}` + `.d.ts` + sourcemaps.
165
+ - **website**: `yarn build` (sitemap + `vite build` + `tsx postbuild-seo`) **~4s** · `yarn typecheck` (`tsc -b`) **~10s** · lint 0. Outputs: 122 dist files, 17 HTML, 9 discovery files, sitemap/feed — preserved. (Removing the double-Tailwind processing also trimmed the vite step.)
166
+ - **cli**: no build step; verified `node cli/index.js --help` runs under commander@15.
167
+ - **backend**: `npx vite build` **~2s**; PHP boot verified (`route:list` 161 routes, `config:cache`/`view:cache` OK, Nova assets publish, `composer audit` clean).
@@ -0,0 +1,110 @@
1
+ # Performance
2
+
3
+ This document captures the SDK's performance characteristics — what's measured,
4
+ what the targets are, and where the hot paths live. It is the entry point for
5
+ anyone investigating a perf regression or considering an optimisation patch.
6
+
7
+ Real-device perf testing is out of scope here — that needs a separate
8
+ Maestro / XCTest harness and is on the roadmap.
9
+
10
+ Maintained by Ahsan Mahmood. Last review: 2026-05-11.
11
+
12
+ ## What dominates real-world OTA performance
13
+
14
+ For most apps, the user-visible latency between "release pushed" and "device
15
+ running the new code" is dominated by three things, in order:
16
+
17
+ 1. **Bundle download time** — completely network-bound. A 5 MB bundle on a
18
+ typical mobile connection takes ~10-30 seconds. The SDK's job here is to
19
+ not make it worse with extra round-trips or stalled retries.
20
+ 2. **The wait for the user's next app launch** — depending on the update
21
+ strategy, this is hours or days for `on-app-start`, minutes for
22
+ `on-app-resume`, and immediate for `immediate`. See [Update strategies
23
+ compared](https://docs.nativeupdate.aoneahsan.com/concepts/update-strategies-compared).
24
+ 3. **Server-side check latency** — typically ~50-200 ms when the backend is
25
+ warm. Cold-start backends (Firebase Functions, Cloud Run) can push this to
26
+ 2-5 seconds on the first request.
27
+
28
+ The SDK's compute work — checksum, signature verify, ZIP extraction, atomic
29
+ swap — is comparatively cheap. SHA-256 over 5 MB takes ~12 ms; RSA-SHA256
30
+ verify takes ~2 ms with RSA-2048; ZIP extraction is dominated by I/O. None
31
+ of these is the bottleneck unless something has gone wrong.
32
+
33
+ That priority ordering also dictates where optimisation effort pays off:
34
+ network-aware retry backoff > update-strategy selection > server warm-up >
35
+ compute path optimisation.
36
+
37
+ ## Microbenchmark targets
38
+
39
+ The compute-bound paths have the following calibration targets (MacBook M2,
40
+ Node 20.10, single-threaded):
41
+
42
+ | Operation | p50 target | p95 target | Notes |
43
+ |---|---|---|---|
44
+ | SHA-256 over 1 MB | ~2.5 ms | ~4 ms | Linear in bundle size. |
45
+ | SHA-256 over 5 MB | ~12 ms | ~18 ms | The common case for Capacitor bundles. |
46
+ | SHA-256 over 20 MB | ~50 ms | ~70 ms | Large bundles; consider asset CDN offload. |
47
+ | RSA-SHA256 verify (2048-bit, 5 MB) | ~2 ms | ~4 ms | Dominated by the SHA, not the asymmetric op. |
48
+ | RSA-SHA256 verify (4096-bit, 5 MB) | ~6 ms | ~10 ms | ~3x slower than 2048-bit verify. |
49
+
50
+ Real Android / iOS devices are typically 2-5x slower than the dev machine.
51
+ Tail devices (iOS 14-era, Android API 22-26) can be 8-10x slower. Plan
52
+ backend timeouts and SDK retry policies accordingly.
53
+
54
+ ## Regression workflow
55
+
56
+ If the compute paths show numbers >2x the calibration target on equivalent
57
+ hardware:
58
+
59
+ 1. **Re-measure on a quiet machine** to confirm the regression is real and not
60
+ noise from a busy machine.
61
+ 2. **Profile with `clinic.js`** against a small harness exercising the hot path.
62
+ The flame graph usually points at the regression directly.
63
+ 3. **Common culprits**:
64
+ - Streaming hash with too-small chunk sizes (each `update()` has overhead)
65
+ - PEM parsing in the verify hot loop instead of pre-parsing the key
66
+ - Allocations inside the loop (`Buffer.alloc()` per iteration)
67
+ - Crypto algorithm fallback to a slow polyfill
68
+ 4. **Fix** with the smallest possible patch. Re-run bench to confirm. PR
69
+ should include before/after numbers.
70
+
71
+ ## Hot paths in the SDK
72
+
73
+ For anyone optimising the plugin internals, here's the runtime map of where
74
+ CPU goes during a typical OTA update:
75
+
76
+ ```
77
+ sync() ← orchestration, no hot work
78
+ ├── checkForUpdate() ← one HTTP call, ~100 ms wall
79
+ ├── downloadUpdate()
80
+ │ ├── fetch(downloadUrl) ← network I/O, ~10-30 s
81
+ │ ├── SecurityValidator.verifyChecksum() ← ~12 ms for 5 MB
82
+ │ ├── SecurityValidator.verifySignature() ← ~2 ms for RSA-2048
83
+ │ └── ZIP extraction ← I/O dominated, ~100-500 ms
84
+ └── notifyAppReady() (later, next launch) ← O(1)
85
+ ```
86
+
87
+ The two checksum/signature steps run sequentially after the bundle hits
88
+ disk. They are the only places where compute time is measurable. ZIP
89
+ extraction is platform-native (java.util.zip on Android, NSFileManager
90
+ on iOS) and not exposed to optimisation from the TypeScript side.
91
+
92
+ ## What's NOT covered here
93
+
94
+ Real-device benchmarks (Android API ladder, iOS device matrix). The
95
+ microbenches measure Node performance, which differs from on-device
96
+ JavaScript engines (Hermes on Android, JavaScriptCore on iOS). Real-device
97
+ perf testing is a separate roadmap item.
98
+
99
+ Web-platform performance. The plugin's web target uses `SubtleCrypto` for
100
+ hashing and verification, which has its own perf profile. No web benches
101
+ exist today.
102
+
103
+ Memory profiling. The benches measure CPU time only. Memory pressure is
104
+ typically not an issue for the SDK (the largest allocation is the bundle
105
+ buffer during streaming), but a memory bench would be welcome — file an
106
+ issue if you want to contribute one.
107
+
108
+ ## Authored by
109
+
110
+ [Ahsan Mahmood](https://aoneahsan.com) — author and maintainer of `native-update`.
@@ -21,10 +21,8 @@ This document provides a comprehensive tracking of all project components, their
21
21
  | Example Applications | ✅ Complete | 100% |
22
22
  | Documentation | ✅ Complete | 100% |
23
23
  | Firebase Integration | ✅ Complete | 100% |
24
- | Unit Tests | ✅ Complete | 100% |
25
24
  | iOS Native Tests (XCTest) | ✅ Complete | 100% |
26
25
  | Android Native Tests (JUnit) | ✅ Complete | 100% |
27
- | E2E Tests (Detox) | ✅ Complete | 100% |
28
26
 
29
27
  **Overall:** Production ready with comprehensive test coverage.
30
28
 
@@ -273,21 +271,7 @@ This document provides a comprehensive tracking of all project components, their
273
271
 
274
272
  ## 10. Testing ✅ COMPLETE
275
273
 
276
- ### 10.1 TypeScript Unit Tests (`/src/__tests__/`)
277
-
278
- | Test File | Status |
279
- |-----------|--------|
280
- | `bundle-manager.test.ts` | ✅ Complete |
281
- | `config.test.ts` | ✅ Complete |
282
- | `delta-processor.test.ts` | ✅ Complete |
283
- | `firestore-schema.test.ts` | ✅ Complete |
284
- | `manifest-reader.test.ts` | ✅ Complete |
285
- | `rollout-checker.test.ts` | ✅ Complete |
286
- | `security.test.ts` | ✅ Complete |
287
- | `version-manager.test.ts` | ✅ Complete |
288
- | `integration.test.ts` | ✅ Complete |
289
-
290
- ### 10.2 iOS Native Tests (XCTest) ✅ IMPLEMENTED
274
+ ### 10.1 iOS Native Tests (XCTest) ✅ IMPLEMENTED
291
275
 
292
276
  | Test File | Tests | Status |
293
277
  |-----------|-------|--------|
@@ -300,7 +284,7 @@ This document provides a comprehensive tracking of all project components, their
300
284
 
301
285
  **Location:** `/ios/Tests/NativeUpdateTests/`
302
286
 
303
- ### 10.3 Android Native Tests (JUnit/Kotlin) ✅ IMPLEMENTED
287
+ ### 10.2 Android Native Tests (JUnit/Kotlin) ✅ IMPLEMENTED
304
288
 
305
289
  | Test File | Tests | Status |
306
290
  |-----------|-------|--------|
@@ -314,27 +298,13 @@ This document provides a comprehensive tracking of all project components, their
314
298
 
315
299
  **Location:** `/android/src/test/java/com/aoneahsan/nativeupdate/`
316
300
 
317
- ### 10.4 E2E Tests (Detox) ✅ IMPLEMENTED
318
-
319
- | Spec File | Tests | Status |
320
- |-----------|-------|--------|
321
- | `ota-update.e2e.spec.js` | 5 | ✅ Complete |
322
- | `download-progress.e2e.spec.js` | 5 | ✅ Complete |
323
- | `channel-switching.e2e.spec.js` | 5 | ✅ Complete |
324
- | `error-handling.e2e.spec.js` | 4 | ✅ Complete |
325
- | **Total** | **19 tests** | ✅ |
326
-
327
- **Location:** `/e2e/specs/`
328
-
329
- ### 10.5 Test Summary
301
+ ### 10.3 Test Summary
330
302
 
331
303
  | Category | Files | Tests | Status |
332
304
  |----------|-------|-------|--------|
333
- | TypeScript Unit Tests | 9 | ~30 | ✅ Complete |
334
305
  | iOS Native Tests | 5 | 32 | ✅ Complete |
335
306
  | Android Native Tests | 6 | 40 | ✅ Complete |
336
- | E2E Tests | 4 | 19 | ✅ Complete |
337
- | **Total** | **24** | **~121** | ✅ |
307
+ | **Total** | **11** | **72** | ✅ |
338
308
 
339
309
  ---
340
310
 
@@ -355,7 +325,6 @@ The delta processor (`/src/live-update/delta-processor.ts`) has a WASM placehold
355
325
  Native platform tests are fully implemented:
356
326
  - **iOS XCTest:** 5 test files with 32 tests in `/ios/Tests/NativeUpdateTests/`
357
327
  - **Android JUnit/Kotlin:** 6 test files with 40 tests in `/android/src/test/`
358
- - **E2E Detox:** 4 spec files with 19 tests in `/e2e/specs/`
359
328
 
360
329
  See `/docs/TESTING_REQUIREMENTS.md` for detailed test documentation.
361
330
 
package/docs/README.md CHANGED
@@ -6,7 +6,6 @@ Welcome to the comprehensive documentation for **Capacitor Native Update**, a co
6
6
 
7
7
  - Last reviewed: `2026-03-25`
8
8
  - Current package version: `1.4.9`
9
- - Test status: `yarn test:run` passed with 81 tests
10
9
  - Build status: `yarn build` passed
11
10
  - Root package manager: `yarn@4.10.3`
12
11
  - Root package workflow is Yarn-only and no longer shells out to npm or pnpm