@parrotnavy/rn-native-updates 0.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 (46) hide show
  1. package/README.ko.md +246 -0
  2. package/README.md +245 -0
  3. package/android/build.gradle +56 -0
  4. package/android/src/main/AndroidManifest.xml +2 -0
  5. package/android/src/main/java/com/parrotnavy/nativeupdates/NativeUpdatesExceptions.kt +33 -0
  6. package/android/src/main/java/com/parrotnavy/nativeupdates/NativeUpdatesModule.kt +171 -0
  7. package/expo-module.config.json +9 -0
  8. package/ios/NativeUpdatesExceptions.swift +26 -0
  9. package/ios/NativeUpdatesModule.swift +77 -0
  10. package/lib/module/NativeUpdatesModule.js +5 -0
  11. package/lib/module/NativeUpdatesModule.js.map +1 -0
  12. package/lib/module/api.js +163 -0
  13. package/lib/module/api.js.map +1 -0
  14. package/lib/module/hooks/index.js +4 -0
  15. package/lib/module/hooks/index.js.map +1 -0
  16. package/lib/module/hooks/useAppUpdate.js +135 -0
  17. package/lib/module/hooks/useAppUpdate.js.map +1 -0
  18. package/lib/module/index.js +6 -0
  19. package/lib/module/index.js.map +1 -0
  20. package/lib/module/types.js +157 -0
  21. package/lib/module/types.js.map +1 -0
  22. package/lib/module/versionUtils.js +18 -0
  23. package/lib/module/versionUtils.js.map +1 -0
  24. package/lib/typescript/src/NativeUpdatesModule.d.ts +3 -0
  25. package/lib/typescript/src/NativeUpdatesModule.d.ts.map +1 -0
  26. package/lib/typescript/src/api.d.ts +15 -0
  27. package/lib/typescript/src/api.d.ts.map +1 -0
  28. package/lib/typescript/src/hooks/index.d.ts +2 -0
  29. package/lib/typescript/src/hooks/index.d.ts.map +1 -0
  30. package/lib/typescript/src/hooks/useAppUpdate.d.ts +3 -0
  31. package/lib/typescript/src/hooks/useAppUpdate.d.ts.map +1 -0
  32. package/lib/typescript/src/index.d.ts +4 -0
  33. package/lib/typescript/src/index.d.ts.map +1 -0
  34. package/lib/typescript/src/types.d.ts +246 -0
  35. package/lib/typescript/src/types.d.ts.map +1 -0
  36. package/lib/typescript/src/versionUtils.d.ts +3 -0
  37. package/lib/typescript/src/versionUtils.d.ts.map +1 -0
  38. package/package.json +103 -0
  39. package/rn-native-updates.podspec +19 -0
  40. package/src/NativeUpdatesModule.ts +5 -0
  41. package/src/api.ts +239 -0
  42. package/src/hooks/index.ts +1 -0
  43. package/src/hooks/useAppUpdate.ts +189 -0
  44. package/src/index.ts +36 -0
  45. package/src/types.ts +315 -0
  46. package/src/versionUtils.ts +28 -0
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * @parrotnavy/rn-native-updates
5
+ * TypeScript Type Definitions
6
+ */
7
+
8
+ // =============================================================================
9
+ // Error Types
10
+ // =============================================================================
11
+
12
+ /**
13
+ * Error codes returned by the native modules
14
+ */
15
+ export let AppUpdateErrorCode = /*#__PURE__*/function (AppUpdateErrorCode) {
16
+ /** Network request failed */
17
+ AppUpdateErrorCode["NETWORK_ERROR"] = "NETWORK_ERROR";
18
+ /** App not found on store */
19
+ AppUpdateErrorCode["APP_NOT_FOUND"] = "APP_NOT_FOUND";
20
+ /** API rate limit exceeded (iOS) */
21
+ AppUpdateErrorCode["RATE_LIMITED"] = "RATE_LIMITED";
22
+ /** App not installed from Play Store (Android) */
23
+ AppUpdateErrorCode["NOT_FROM_PLAY_STORE"] = "NOT_FROM_PLAY_STORE";
24
+ /** Play Store not available on device (Android) */
25
+ AppUpdateErrorCode["PLAY_STORE_NOT_AVAILABLE"] = "PLAY_STORE_NOT_AVAILABLE";
26
+ /** Update check failed */
27
+ AppUpdateErrorCode["CHECK_FAILED"] = "CHECK_FAILED";
28
+ /** Update flow failed */
29
+ AppUpdateErrorCode["UPDATE_FAILED"] = "UPDATE_FAILED";
30
+ /** Update was cancelled by user */
31
+ AppUpdateErrorCode["UPDATE_CANCELLED"] = "UPDATE_CANCELLED";
32
+ /** Unknown error */
33
+ AppUpdateErrorCode["UNKNOWN"] = "UNKNOWN";
34
+ return AppUpdateErrorCode;
35
+ }({});
36
+
37
+ /**
38
+ * Custom error class for app update operations
39
+ */
40
+ export class AppUpdateError extends Error {
41
+ constructor(code, message, nativeError) {
42
+ super(message);
43
+ this.name = 'AppUpdateError';
44
+ this.code = code;
45
+ this.nativeError = nativeError;
46
+ }
47
+ }
48
+
49
+ // =============================================================================
50
+ // Android Types
51
+ // =============================================================================
52
+
53
+ /**
54
+ * Android update type
55
+ */
56
+ export let UpdateType = /*#__PURE__*/function (UpdateType) {
57
+ /** Background download, user can continue using app */
58
+ UpdateType[UpdateType["FLEXIBLE"] = 0] = "FLEXIBLE";
59
+ /** Full-screen blocking update */
60
+ UpdateType[UpdateType["IMMEDIATE"] = 1] = "IMMEDIATE";
61
+ return UpdateType;
62
+ }({});
63
+
64
+ /**
65
+ * Android update availability status
66
+ */
67
+ export let UpdateAvailability = /*#__PURE__*/function (UpdateAvailability) {
68
+ UpdateAvailability[UpdateAvailability["UNKNOWN"] = 0] = "UNKNOWN";
69
+ UpdateAvailability[UpdateAvailability["UPDATE_NOT_AVAILABLE"] = 1] = "UPDATE_NOT_AVAILABLE";
70
+ UpdateAvailability[UpdateAvailability["UPDATE_AVAILABLE"] = 2] = "UPDATE_AVAILABLE";
71
+ UpdateAvailability[UpdateAvailability["DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS"] = 3] = "DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS";
72
+ return UpdateAvailability;
73
+ }({});
74
+
75
+ /**
76
+ * Android install status
77
+ */
78
+ export let InstallStatus = /*#__PURE__*/function (InstallStatus) {
79
+ InstallStatus[InstallStatus["UNKNOWN"] = 0] = "UNKNOWN";
80
+ InstallStatus[InstallStatus["PENDING"] = 1] = "PENDING";
81
+ InstallStatus[InstallStatus["DOWNLOADING"] = 2] = "DOWNLOADING";
82
+ InstallStatus[InstallStatus["DOWNLOADED"] = 3] = "DOWNLOADED";
83
+ InstallStatus[InstallStatus["INSTALLING"] = 4] = "INSTALLING";
84
+ InstallStatus[InstallStatus["INSTALLED"] = 5] = "INSTALLED";
85
+ InstallStatus[InstallStatus["FAILED"] = 6] = "FAILED";
86
+ InstallStatus[InstallStatus["CANCELED"] = 7] = "CANCELED";
87
+ return InstallStatus;
88
+ }({});
89
+
90
+ /**
91
+ * Android Play Store update info
92
+ */
93
+
94
+ /**
95
+ * Android install state during update
96
+ */
97
+
98
+ /**
99
+ * Android update listener callback
100
+ */
101
+
102
+ /**
103
+ * Subscription handle for removing listener
104
+ */
105
+
106
+ // =============================================================================
107
+ // iOS Types
108
+ // =============================================================================
109
+
110
+ /**
111
+ * iOS App Store version info
112
+ */
113
+
114
+ // =============================================================================
115
+ // Common Types
116
+ // =============================================================================
117
+
118
+ /**
119
+ * Result of needUpdate() check
120
+ */
121
+
122
+ /**
123
+ * Options for getLatestVersion()
124
+ */
125
+
126
+ /**
127
+ * Options for needUpdate()
128
+ */
129
+
130
+ /**
131
+ * Options for getStoreUrl()
132
+ */
133
+
134
+ // =============================================================================
135
+ // Hook Types
136
+ // =============================================================================
137
+
138
+ /**
139
+ * Options for useAppUpdate hook
140
+ */
141
+
142
+ /**
143
+ * Return type of useAppUpdate hook
144
+ */
145
+
146
+ // =============================================================================
147
+ // Native Module Types (internal)
148
+ // =============================================================================
149
+
150
+ /**
151
+ * Native module constants (exposed at load time)
152
+ */
153
+
154
+ /**
155
+ * Native module interface (internal)
156
+ */
157
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AppUpdateErrorCode","AppUpdateError","Error","constructor","code","message","nativeError","name","UpdateType","UpdateAvailability","InstallStatus"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAYA,kBAAkB,0BAAlBA,kBAAkB;EAC5B;EADUA,kBAAkB;EAG5B;EAHUA,kBAAkB;EAK5B;EALUA,kBAAkB;EAO5B;EAPUA,kBAAkB;EAS5B;EATUA,kBAAkB;EAW5B;EAXUA,kBAAkB;EAa5B;EAbUA,kBAAkB;EAe5B;EAfUA,kBAAkB;EAiB5B;EAjBUA,kBAAkB;EAAA,OAAlBA,kBAAkB;AAAA;;AAqB9B;AACA;AACA;AACA,OAAO,MAAMC,cAAc,SAASC,KAAK,CAAC;EAIxCC,WAAWA,CAACC,IAAwB,EAAEC,OAAe,EAAEC,WAAqB,EAAE;IAC5E,KAAK,CAACD,OAAO,CAAC;IACd,IAAI,CAACE,IAAI,GAAG,gBAAgB;IAC5B,IAAI,CAACH,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACE,WAAW,GAAGA,WAAW;EAChC;AACF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAYE,UAAU,0BAAVA,UAAU;EACpB;EADUA,UAAU,CAAVA,UAAU;EAGpB;EAHUA,UAAU,CAAVA,UAAU;EAAA,OAAVA,UAAU;AAAA;;AAOtB;AACA;AACA;AACA,WAAYC,kBAAkB,0BAAlBA,kBAAkB;EAAlBA,kBAAkB,CAAlBA,kBAAkB;EAAlBA,kBAAkB,CAAlBA,kBAAkB;EAAlBA,kBAAkB,CAAlBA,kBAAkB;EAAlBA,kBAAkB,CAAlBA,kBAAkB;EAAA,OAAlBA,kBAAkB;AAAA;;AAO9B;AACA;AACA;AACA,WAAYC,aAAa,0BAAbA,aAAa;EAAbA,aAAa,CAAbA,aAAa;EAAbA,aAAa,CAAbA,aAAa;EAAbA,aAAa,CAAbA,aAAa;EAAbA,aAAa,CAAbA,aAAa;EAAbA,aAAa,CAAbA,aAAa;EAAbA,aAAa,CAAbA,aAAa;EAAbA,aAAa,CAAbA,aAAa;EAAbA,aAAa,CAAbA,aAAa;EAAA,OAAbA,aAAa;AAAA;;AAWzB;AACA;AACA;;AAoBA;AACA;AACA;;AAYA;AACA;AACA;;AAGA;AACA;AACA;;AAKA;AACA;AACA;;AAEA;AACA;AACA;;AAgBA;AACA;AACA;;AAEA;AACA;AACA;;AAYA;AACA;AACA;;AAQA;AACA;AACA;;AAgBA;AACA;AACA;;AAMA;AACA;AACA;;AAEA;AACA;AACA;;AAUA;AACA;AACA;;AAyDA;AACA;AACA;;AAEA;AACA;AACA;;AAYA;AACA;AACA","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ export function compareVersions(version1, version2, depth = Number.POSITIVE_INFINITY) {
4
+ const v1Parts = version1.split('.').map(p => Number.parseInt(p, 10) || 0);
5
+ const v2Parts = version2.split('.').map(p => Number.parseInt(p, 10) || 0);
6
+ const maxLength = Math.min(Math.max(v1Parts.length, v2Parts.length), depth);
7
+ for (let i = 0; i < maxLength; i++) {
8
+ const v1 = v1Parts[i] ?? 0;
9
+ const v2 = v2Parts[i] ?? 0;
10
+ if (v1 > v2) return 1;
11
+ if (v1 < v2) return -1;
12
+ }
13
+ return 0;
14
+ }
15
+ export function isNewerVersion(currentVersion, latestVersion, depth) {
16
+ return compareVersions(latestVersion, currentVersion, depth) > 0;
17
+ }
18
+ //# sourceMappingURL=versionUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["compareVersions","version1","version2","depth","Number","POSITIVE_INFINITY","v1Parts","split","map","p","parseInt","v2Parts","maxLength","Math","min","max","length","i","v1","v2","isNewerVersion","currentVersion","latestVersion"],"sourceRoot":"../../src","sources":["versionUtils.ts"],"mappings":";;AAAA,OAAO,SAASA,eAAeA,CAC7BC,QAAgB,EAChBC,QAAgB,EAChBC,KAAa,GAAGC,MAAM,CAACC,iBAAiB,EAChC;EACR,MAAMC,OAAO,GAAGL,QAAQ,CAACM,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAEC,CAAC,IAAKL,MAAM,CAACM,QAAQ,CAACD,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;EAC3E,MAAME,OAAO,GAAGT,QAAQ,CAACK,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAEC,CAAC,IAAKL,MAAM,CAACM,QAAQ,CAACD,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;EAE3E,MAAMG,SAAS,GAAGC,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,GAAG,CAACT,OAAO,CAACU,MAAM,EAAEL,OAAO,CAACK,MAAM,CAAC,EAAEb,KAAK,CAAC;EAE3E,KAAK,IAAIc,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,SAAS,EAAEK,CAAC,EAAE,EAAE;IAClC,MAAMC,EAAE,GAAGZ,OAAO,CAACW,CAAC,CAAC,IAAI,CAAC;IAC1B,MAAME,EAAE,GAAGR,OAAO,CAACM,CAAC,CAAC,IAAI,CAAC;IAE1B,IAAIC,EAAE,GAAGC,EAAE,EAAE,OAAO,CAAC;IACrB,IAAID,EAAE,GAAGC,EAAE,EAAE,OAAO,CAAC,CAAC;EACxB;EAEA,OAAO,CAAC;AACV;AAEA,OAAO,SAASC,cAAcA,CAC5BC,cAAsB,EACtBC,aAAqB,EACrBnB,KAAc,EACL;EACT,OAAOH,eAAe,CAACsB,aAAa,EAAED,cAAc,EAAElB,KAAK,CAAC,GAAG,CAAC;AAClE","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ import type { NativeUpdatesModuleType } from './types';
2
+ export declare const NativeUpdatesModule: NativeUpdatesModuleType;
3
+ //# sourceMappingURL=NativeUpdatesModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeUpdatesModule.d.ts","sourceRoot":"","sources":["../../../src/NativeUpdatesModule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,eAAO,MAAM,mBAAmB,yBAAgE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type AppStoreInfo, type GetLatestVersionOptions, type GetStoreUrlOptions, type NeedUpdateOptions, type NeedUpdateResult, type PlayStoreUpdateInfo, type UpdateListener, type UpdateSubscription, type UpdateType } from './types';
2
+ export declare function getPackageName(): string;
3
+ export declare function getCurrentVersion(): string;
4
+ export declare function getCurrentBuildNumber(): number;
5
+ export declare function getCountry(): string;
6
+ export declare function getLatestVersion(options?: GetLatestVersionOptions): Promise<string>;
7
+ export declare function getStoreUrl(options?: GetStoreUrlOptions): Promise<string>;
8
+ export declare function needUpdate(options?: NeedUpdateOptions): Promise<NeedUpdateResult>;
9
+ export declare function openStore(options?: GetStoreUrlOptions): Promise<void>;
10
+ export declare function getAppStoreInfo(options?: GetLatestVersionOptions): Promise<AppStoreInfo>;
11
+ export declare function checkPlayStoreUpdate(): Promise<PlayStoreUpdateInfo>;
12
+ export declare function startInAppUpdate(type: UpdateType): Promise<void>;
13
+ export declare function completeInAppUpdate(): void;
14
+ export declare function addUpdateListener(listener: UpdateListener): UpdateSubscription;
15
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,YAAY,EAGjB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAExB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,SAAS,CAAC;AAGjB,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBzF;AAED,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB/E;AAED,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsCvF;AAED,wBAAsB,SAAS,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3E;AAED,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAY9F;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CASzE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAS1C;AAgDD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,kBAAkB,CAgB9E"}
@@ -0,0 +1,2 @@
1
+ export { useAppUpdate } from './useAppUpdate';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type UseAppUpdateOptions, type UseAppUpdateResult } from '../types';
2
+ export declare function useAppUpdate(options?: UseAppUpdateOptions): UseAppUpdateResult;
3
+ //# sourceMappingURL=useAppUpdate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAppUpdate.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useAppUpdate.ts"],"names":[],"mappings":"AAYA,OAAO,EAQL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAElB,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,kBAAkB,CAoK9E"}
@@ -0,0 +1,4 @@
1
+ export { addUpdateListener, checkPlayStoreUpdate, completeInAppUpdate, getAppStoreInfo, getCountry, getCurrentBuildNumber, getCurrentVersion, getLatestVersion, getPackageName, getStoreUrl, needUpdate, openStore, startInAppUpdate, } from './api';
2
+ export { useAppUpdate } from './hooks';
3
+ export { type AppStoreInfo, AppUpdateError, AppUpdateErrorCode, type GetLatestVersionOptions, type GetStoreUrlOptions, type InstallState, InstallStatus, type NativeConstants, type NativeUpdatesModuleType, type NeedUpdateOptions, type NeedUpdateResult, type PlayStoreUpdateInfo, UpdateAvailability, type UpdateListener, type UpdateSubscription, UpdateType, type UseAppUpdateOptions, type UseAppUpdateResult, } from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,UAAU,EACV,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,UAAU,EACV,SAAS,EACT,gBAAgB,GACjB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EACL,KAAK,YAAY,EACjB,cAAc,EACd,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,UAAU,EACV,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * @parrotnavy/rn-native-updates
3
+ * TypeScript Type Definitions
4
+ */
5
+ /**
6
+ * Error codes returned by the native modules
7
+ */
8
+ export declare enum AppUpdateErrorCode {
9
+ /** Network request failed */
10
+ NETWORK_ERROR = "NETWORK_ERROR",
11
+ /** App not found on store */
12
+ APP_NOT_FOUND = "APP_NOT_FOUND",
13
+ /** API rate limit exceeded (iOS) */
14
+ RATE_LIMITED = "RATE_LIMITED",
15
+ /** App not installed from Play Store (Android) */
16
+ NOT_FROM_PLAY_STORE = "NOT_FROM_PLAY_STORE",
17
+ /** Play Store not available on device (Android) */
18
+ PLAY_STORE_NOT_AVAILABLE = "PLAY_STORE_NOT_AVAILABLE",
19
+ /** Update check failed */
20
+ CHECK_FAILED = "CHECK_FAILED",
21
+ /** Update flow failed */
22
+ UPDATE_FAILED = "UPDATE_FAILED",
23
+ /** Update was cancelled by user */
24
+ UPDATE_CANCELLED = "UPDATE_CANCELLED",
25
+ /** Unknown error */
26
+ UNKNOWN = "UNKNOWN"
27
+ }
28
+ /**
29
+ * Custom error class for app update operations
30
+ */
31
+ export declare class AppUpdateError extends Error {
32
+ code: AppUpdateErrorCode;
33
+ nativeError?: unknown;
34
+ constructor(code: AppUpdateErrorCode, message: string, nativeError?: unknown);
35
+ }
36
+ /**
37
+ * Android update type
38
+ */
39
+ export declare enum UpdateType {
40
+ /** Background download, user can continue using app */
41
+ FLEXIBLE = 0,
42
+ /** Full-screen blocking update */
43
+ IMMEDIATE = 1
44
+ }
45
+ /**
46
+ * Android update availability status
47
+ */
48
+ export declare enum UpdateAvailability {
49
+ UNKNOWN = 0,
50
+ UPDATE_NOT_AVAILABLE = 1,
51
+ UPDATE_AVAILABLE = 2,
52
+ DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS = 3
53
+ }
54
+ /**
55
+ * Android install status
56
+ */
57
+ export declare enum InstallStatus {
58
+ UNKNOWN = 0,
59
+ PENDING = 1,
60
+ DOWNLOADING = 2,
61
+ DOWNLOADED = 3,
62
+ INSTALLING = 4,
63
+ INSTALLED = 5,
64
+ FAILED = 6,
65
+ CANCELED = 7
66
+ }
67
+ /**
68
+ * Android Play Store update info
69
+ */
70
+ export interface PlayStoreUpdateInfo {
71
+ /** Update availability status */
72
+ updateAvailability: UpdateAvailability;
73
+ /** Available version code (if update available) */
74
+ availableVersionCode: number | null;
75
+ /** Whether flexible update is allowed */
76
+ isFlexibleUpdateAllowed: boolean;
77
+ /** Whether immediate update is allowed */
78
+ isImmediateUpdateAllowed: boolean;
79
+ /** Days since update became available */
80
+ clientVersionStalenessDays: number | null;
81
+ /** Update priority (0-5, set in Play Console) */
82
+ updatePriority: number;
83
+ /** Total bytes to download */
84
+ totalBytesToDownload: number;
85
+ /** Package name */
86
+ packageName: string;
87
+ }
88
+ /**
89
+ * Android install state during update
90
+ */
91
+ export interface InstallState {
92
+ /** Current install status */
93
+ installStatus: InstallStatus;
94
+ /** Bytes downloaded so far */
95
+ bytesDownloaded: number;
96
+ /** Total bytes to download */
97
+ totalBytesToDownload: number;
98
+ /** Download progress percentage (0-100) */
99
+ downloadProgress: number;
100
+ }
101
+ /**
102
+ * Android update listener callback
103
+ */
104
+ export type UpdateListener = (state: InstallState) => void;
105
+ /**
106
+ * Subscription handle for removing listener
107
+ */
108
+ export interface UpdateSubscription {
109
+ remove: () => void;
110
+ }
111
+ /**
112
+ * iOS App Store version info
113
+ */
114
+ export interface AppStoreInfo {
115
+ /** App Store version */
116
+ version: string;
117
+ /** iTunes track ID */
118
+ trackId: number;
119
+ /** App Store URL */
120
+ trackViewUrl: string;
121
+ /** Release date of current version */
122
+ currentVersionReleaseDate: string;
123
+ /** Release notes */
124
+ releaseNotes: string | null;
125
+ /** Minimum iOS version required */
126
+ minimumOsVersion: string;
127
+ }
128
+ /**
129
+ * Result of needUpdate() check
130
+ */
131
+ export interface NeedUpdateResult {
132
+ /** Whether an update is needed */
133
+ isNeeded: boolean;
134
+ /** Current installed version */
135
+ currentVersion: string;
136
+ /** Latest version available on store */
137
+ latestVersion: string;
138
+ /** Store URL (App Store or Play Store) */
139
+ storeUrl: string;
140
+ }
141
+ /**
142
+ * Options for getLatestVersion()
143
+ */
144
+ export interface GetLatestVersionOptions {
145
+ /** Force refresh (bypass cache) - iOS only */
146
+ forceRefresh?: boolean;
147
+ /** Country code for App Store lookup (e.g., 'us', 'kr') - iOS only */
148
+ country?: string;
149
+ }
150
+ /**
151
+ * Options for needUpdate()
152
+ */
153
+ export interface NeedUpdateOptions extends GetLatestVersionOptions {
154
+ /** Current version to compare (defaults to installed version) */
155
+ currentVersion?: string;
156
+ /** Latest version to compare (will fetch from store if not provided) */
157
+ latestVersion?: string;
158
+ /**
159
+ * Depth of version comparison
160
+ * - 1: Major only (1.x.x)
161
+ * - 2: Major + Minor (1.2.x)
162
+ * - 3: Major + Minor + Patch (1.2.3)
163
+ * - Infinity: Full comparison (default)
164
+ */
165
+ depth?: number;
166
+ }
167
+ /**
168
+ * Options for getStoreUrl()
169
+ */
170
+ export interface GetStoreUrlOptions {
171
+ /** Country code for App Store URL - iOS only */
172
+ country?: string;
173
+ }
174
+ /**
175
+ * Options for useAppUpdate hook
176
+ */
177
+ export interface UseAppUpdateOptions {
178
+ /** Automatically check for updates on mount (default: false) */
179
+ checkOnMount?: boolean;
180
+ /** Country code for App Store lookup - iOS only */
181
+ country?: string;
182
+ /** Error callback */
183
+ onError?: (error: AppUpdateError) => void;
184
+ }
185
+ /**
186
+ * Return type of useAppUpdate hook
187
+ */
188
+ export interface UseAppUpdateResult {
189
+ /** Whether an update check is in progress */
190
+ isChecking: boolean;
191
+ /** Whether an update is available */
192
+ isUpdateAvailable: boolean;
193
+ /** Current installed version */
194
+ currentVersion: string;
195
+ /** Latest version available on store (null if not checked) */
196
+ latestVersion: string | null;
197
+ /** Store URL for the app */
198
+ storeUrl: string | null;
199
+ /** Last error that occurred */
200
+ error: AppUpdateError | null;
201
+ /** Android: Whether update is currently downloading */
202
+ isDownloading: boolean;
203
+ /** Android: Download progress (0-100) */
204
+ downloadProgress: number;
205
+ /** Android: Whether download is complete and ready to install */
206
+ isReadyToInstall: boolean;
207
+ /** Android: Detailed Play Store update info */
208
+ playStoreInfo: PlayStoreUpdateInfo | null;
209
+ /** Check for available updates */
210
+ checkUpdate: () => Promise<void>;
211
+ /** Open store page for the app */
212
+ openStore: () => Promise<void>;
213
+ /**
214
+ * Android: Start in-app update
215
+ * @param type - Update type (FLEXIBLE or IMMEDIATE)
216
+ */
217
+ startUpdate: (type: UpdateType) => Promise<void>;
218
+ /**
219
+ * Android: Complete flexible update (triggers app restart)
220
+ * Only call after download is complete
221
+ */
222
+ completeUpdate: () => Promise<void>;
223
+ }
224
+ /**
225
+ * Native module constants (exposed at load time)
226
+ */
227
+ export interface NativeConstants {
228
+ /** Current app version */
229
+ currentVersion: string;
230
+ /** Current build number */
231
+ buildNumber: string;
232
+ /** Bundle ID (iOS) or package name (Android) */
233
+ packageName: string;
234
+ /** Device country code */
235
+ country: string;
236
+ }
237
+ /**
238
+ * Native module interface (internal)
239
+ */
240
+ export interface NativeUpdatesModuleType extends NativeConstants {
241
+ getAppStoreVersion(country: string | null, forceRefresh: boolean): Promise<AppStoreInfo>;
242
+ checkPlayStoreUpdate(): Promise<PlayStoreUpdateInfo>;
243
+ startUpdate(updateType: number): Promise<void>;
244
+ completeUpdate(): Promise<void>;
245
+ }
246
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function compareVersions(version1: string, version2: string, depth?: number): number;
2
+ export declare function isNewerVersion(currentVersion: string, latestVersion: string, depth?: number): boolean;
3
+ //# sourceMappingURL=versionUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versionUtils.d.ts","sourceRoot":"","sources":["../../../src/versionUtils.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,MAAiC,GACvC,MAAM,CAeR;AAED,wBAAgB,cAAc,CAC5B,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAET"}
package/package.json ADDED
@@ -0,0 +1,103 @@
1
+ {
2
+ "name": "@parrotnavy/rn-native-updates",
3
+ "version": "0.1.0",
4
+ "description": "React Native app update checker with hooks support. Uses Play Core for Android and iTunes Lookup API for iOS.",
5
+ "main": "./lib/module/index.js",
6
+ "types": "./lib/typescript/src/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "source": "./src/index.ts",
10
+ "types": "./lib/typescript/src/index.d.ts",
11
+ "default": "./lib/module/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": [
16
+ "src",
17
+ "lib",
18
+ "android",
19
+ "ios",
20
+ "*.podspec",
21
+ "expo-module.config.json",
22
+ "!ios/build",
23
+ "!android/build",
24
+ "!**/__tests__",
25
+ "!**/__mocks__",
26
+ "!**/.*"
27
+ ],
28
+ "scripts": {
29
+ "build": "bob build",
30
+ "clean": "del-cli lib android/build ios/build",
31
+ "prepare": "bob build",
32
+ "typecheck": "tsc --noEmit",
33
+ "lint": "biome lint .",
34
+ "lint:fix": "biome lint --write .",
35
+ "format": "biome format --write .",
36
+ "check": "biome check src/",
37
+ "check:fix": "biome check --write .",
38
+ "test": "jest",
39
+ "test:coverage": "jest --coverage"
40
+ },
41
+ "keywords": [
42
+ "react-native",
43
+ "expo",
44
+ "app-update",
45
+ "version-check",
46
+ "play-store",
47
+ "app-store",
48
+ "in-app-update"
49
+ ],
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://github.com/parrotnavy/rn-native-updates.git"
53
+ },
54
+ "author": "ParrotNavy",
55
+ "license": "MIT",
56
+ "bugs": {
57
+ "url": "https://github.com/parrotnavy/rn-native-updates/issues"
58
+ },
59
+ "homepage": "https://github.com/parrotnavy/rn-native-updates#readme",
60
+ "devDependencies": {
61
+ "@biomejs/biome": "^2.0.0",
62
+ "@testing-library/react-native": "^13.3.0",
63
+ "@types/jest": "^29.5.0",
64
+ "@types/react": "^18.2.0",
65
+ "del-cli": "^6.0.0",
66
+ "expo-modules-core": "^2.0.0",
67
+ "jest": "^29.7.0",
68
+ "react": "^18.2.0",
69
+ "react-native": "^0.76.0",
70
+ "react-native-builder-bob": "^0.35.0",
71
+ "react-test-renderer": "^18.2.0",
72
+ "ts-jest": "^29.4.6",
73
+ "typescript": "^5.0.0"
74
+ },
75
+ "peerDependencies": {
76
+ "expo": "*",
77
+ "react": "*",
78
+ "react-native": ">=0.73.0"
79
+ },
80
+ "peerDependenciesMeta": {
81
+ "expo": {
82
+ "optional": true
83
+ }
84
+ },
85
+ "react-native-builder-bob": {
86
+ "source": "src",
87
+ "output": "lib",
88
+ "targets": [
89
+ [
90
+ "module",
91
+ {
92
+ "esm": true
93
+ }
94
+ ],
95
+ [
96
+ "typescript",
97
+ {
98
+ "project": "tsconfig.build.json"
99
+ }
100
+ ]
101
+ ]
102
+ }
103
+ }
@@ -0,0 +1,19 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = "rn-native-updates"
7
+ s.version = package["version"]
8
+ s.summary = package["description"]
9
+ s.homepage = package["homepage"]
10
+ s.license = package["license"]
11
+ s.authors = package["author"]
12
+
13
+ s.platforms = { :ios => "13.4" }
14
+ s.source = { :git => package["repository"]["url"], :tag => "#{s.version}" }
15
+
16
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
17
+
18
+ s.dependency "ExpoModulesCore"
19
+ end
@@ -0,0 +1,5 @@
1
+ import { requireNativeModule } from 'expo-modules-core';
2
+
3
+ import type { NativeUpdatesModuleType } from './types';
4
+
5
+ export const NativeUpdatesModule = requireNativeModule<NativeUpdatesModuleType>('NativeUpdates');