react-native-nitro-version-check 0.0.1
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.
- package/NitroVersionCheck.podspec +31 -0
- package/README.md +117 -0
- package/android/CMakeLists.txt +29 -0
- package/android/build.gradle +142 -0
- package/android/fix-prefab.gradle +51 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/cpp-adapter.cpp +9 -0
- package/android/src/main/java/com/margelo/nitro/nitroversioncheck/HybridVersionCheck.kt +74 -0
- package/android/src/main/java/com/margelo/nitro/nitroversioncheck/NitroVersionCheckPackage.kt +18 -0
- package/ios/Bridge.h +8 -0
- package/ios/HybridVersionCheck.swift +71 -0
- package/lib/index.d.ts +168 -0
- package/lib/index.js +174 -0
- package/lib/semver.d.ts +22 -0
- package/lib/semver.js +51 -0
- package/lib/specs/Version.nitro.d.ts +14 -0
- package/lib/specs/Version.nitro.js +1 -0
- package/lib/types/UpdateResult.d.ts +6 -0
- package/lib/types/UpdateResult.js +1 -0
- package/nitro.json +18 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/NitroVersionCheck+autolinking.cmake +81 -0
- package/nitrogen/generated/android/NitroVersionCheck+autolinking.gradle +27 -0
- package/nitrogen/generated/android/NitroVersionCheckOnLoad.cpp +47 -0
- package/nitrogen/generated/android/NitroVersionCheckOnLoad.hpp +34 -0
- package/nitrogen/generated/android/c++/JHybridVersionCheckSpec.cpp +129 -0
- package/nitrogen/generated/android/c++/JHybridVersionCheckSpec.hpp +72 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroversioncheck/HybridVersionCheckSpec.kt +84 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroversioncheck/NitroVersionCheckOnLoad.kt +35 -0
- package/nitrogen/generated/ios/NitroVersionCheck+autolinking.rb +60 -0
- package/nitrogen/generated/ios/NitroVersionCheck-Swift-Cxx-Bridge.cpp +57 -0
- package/nitrogen/generated/ios/NitroVersionCheck-Swift-Cxx-Bridge.hpp +179 -0
- package/nitrogen/generated/ios/NitroVersionCheck-Swift-Cxx-Umbrella.hpp +46 -0
- package/nitrogen/generated/ios/NitroVersionCheckAutolinking.mm +33 -0
- package/nitrogen/generated/ios/NitroVersionCheckAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridVersionCheckSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridVersionCheckSpecSwift.hpp +123 -0
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +46 -0
- package/nitrogen/generated/ios/swift/HybridVersionCheckSpec.swift +61 -0
- package/nitrogen/generated/ios/swift/HybridVersionCheckSpec_cxx.swift +227 -0
- package/nitrogen/generated/shared/c++/HybridVersionCheckSpec.cpp +28 -0
- package/nitrogen/generated/shared/c++/HybridVersionCheckSpec.hpp +70 -0
- package/package.json +116 -0
- package/react-native.config.js +16 -0
- package/src/index.ts +185 -0
- package/src/semver.ts +54 -0
- package/src/specs/Version.nitro.ts +16 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridVersionCheckSpec.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#if __has_include(<NitroModules/HybridObject.hpp>)
|
|
11
|
+
#include <NitroModules/HybridObject.hpp>
|
|
12
|
+
#else
|
|
13
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
#include <string>
|
|
19
|
+
#include <optional>
|
|
20
|
+
#include <NitroModules/Promise.hpp>
|
|
21
|
+
|
|
22
|
+
namespace margelo::nitro::nitroversioncheck {
|
|
23
|
+
|
|
24
|
+
using namespace margelo::nitro;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* An abstract base class for `VersionCheck`
|
|
28
|
+
* Inherit this class to create instances of `HybridVersionCheckSpec` in C++.
|
|
29
|
+
* You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
|
|
30
|
+
* @example
|
|
31
|
+
* ```cpp
|
|
32
|
+
* class HybridVersionCheck: public HybridVersionCheckSpec {
|
|
33
|
+
* public:
|
|
34
|
+
* HybridVersionCheck(...): HybridObject(TAG) { ... }
|
|
35
|
+
* // ...
|
|
36
|
+
* };
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
class HybridVersionCheckSpec: public virtual HybridObject {
|
|
40
|
+
public:
|
|
41
|
+
// Constructor
|
|
42
|
+
explicit HybridVersionCheckSpec(): HybridObject(TAG) { }
|
|
43
|
+
|
|
44
|
+
// Destructor
|
|
45
|
+
~HybridVersionCheckSpec() override = default;
|
|
46
|
+
|
|
47
|
+
public:
|
|
48
|
+
// Properties
|
|
49
|
+
virtual std::string getVersion() = 0;
|
|
50
|
+
virtual std::string getBuildNumber() = 0;
|
|
51
|
+
virtual std::string getPackageName() = 0;
|
|
52
|
+
virtual std::optional<std::string> getInstallSource() = 0;
|
|
53
|
+
|
|
54
|
+
public:
|
|
55
|
+
// Methods
|
|
56
|
+
virtual std::string getCountry() = 0;
|
|
57
|
+
virtual std::shared_ptr<Promise<std::string>> getStoreUrl() = 0;
|
|
58
|
+
virtual std::shared_ptr<Promise<std::string>> getLatestVersion() = 0;
|
|
59
|
+
virtual std::shared_ptr<Promise<bool>> needsUpdate() = 0;
|
|
60
|
+
|
|
61
|
+
protected:
|
|
62
|
+
// Hybrid Setup
|
|
63
|
+
void loadHybridMethods() override;
|
|
64
|
+
|
|
65
|
+
protected:
|
|
66
|
+
// Tag for logging
|
|
67
|
+
static constexpr auto TAG = "VersionCheck";
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
} // namespace margelo::nitro::nitroversioncheck
|
package/package.json
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-native-nitro-version-check",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "react-native-nitro-version-check",
|
|
5
|
+
"main": "lib/index",
|
|
6
|
+
"module": "lib/index",
|
|
7
|
+
"types": "lib/index.d.ts",
|
|
8
|
+
"react-native": "src/index",
|
|
9
|
+
"source": "src/index",
|
|
10
|
+
"files": [
|
|
11
|
+
"src",
|
|
12
|
+
"react-native.config.js",
|
|
13
|
+
"lib",
|
|
14
|
+
"nitrogen",
|
|
15
|
+
"android/build.gradle",
|
|
16
|
+
"android/gradle.properties",
|
|
17
|
+
"android/fix-prefab.gradle",
|
|
18
|
+
"android/CMakeLists.txt",
|
|
19
|
+
"android/src",
|
|
20
|
+
"cpp",
|
|
21
|
+
"ios/**/*.h",
|
|
22
|
+
"ios/**/*.m",
|
|
23
|
+
"ios/**/*.mm",
|
|
24
|
+
"ios/**/*.cpp",
|
|
25
|
+
"ios/**/*.swift",
|
|
26
|
+
"app.plugin.js",
|
|
27
|
+
"nitro.json",
|
|
28
|
+
"*.podspec",
|
|
29
|
+
"README.md"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"prepack": "cp ../README.md ./README.md",
|
|
33
|
+
"postpack": "rm ./README.md",
|
|
34
|
+
"release": "release-it",
|
|
35
|
+
"build": "tsc",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"lint": "biome check .",
|
|
38
|
+
"lint:fix": "biome check --write .",
|
|
39
|
+
"format": "biome format --write .",
|
|
40
|
+
"specs": "tsc --noEmit false && nitrogen --logLevel=\"debug\"",
|
|
41
|
+
"start": "cd ../example && bun start",
|
|
42
|
+
"pods": "cd ../example && cd ios && bundle exec pod install",
|
|
43
|
+
"bootstrap": "cd .. && bun install && cd example && bun pods",
|
|
44
|
+
"clean": "rm -rf android/build node_modules/**/android/build lib",
|
|
45
|
+
"clean:ios": "cd ../example && rm -rf ios/build ios/Pods ios/DerivedData",
|
|
46
|
+
"clean:android": "cd ../example && rm -rf android/build android/app/build android/.gradle",
|
|
47
|
+
"clean:all": "bun clean && bun clean:ios && bun clean:android && rm -rf node_modules ../example/node_modules"
|
|
48
|
+
},
|
|
49
|
+
"keywords": [
|
|
50
|
+
"react-native",
|
|
51
|
+
"nitro",
|
|
52
|
+
"version-check",
|
|
53
|
+
"version",
|
|
54
|
+
"react-native-nitro-version-check",
|
|
55
|
+
"react-native-version",
|
|
56
|
+
"react-native-version-check",
|
|
57
|
+
"expo",
|
|
58
|
+
"expo-version-check",
|
|
59
|
+
"expo-version",
|
|
60
|
+
"nitro-modules",
|
|
61
|
+
"nitro-modules-version-check",
|
|
62
|
+
"nitro-modules-version",
|
|
63
|
+
"app store version",
|
|
64
|
+
"play store version",
|
|
65
|
+
"market version"
|
|
66
|
+
],
|
|
67
|
+
"repository": {
|
|
68
|
+
"type": "git",
|
|
69
|
+
"url": "git+https://github.com/AlshehriAli0/react-native-nitro-version-check.git"
|
|
70
|
+
},
|
|
71
|
+
"author": "AlshehriAli0 (https://github.com/AlshehriAli0)",
|
|
72
|
+
"license": "MIT",
|
|
73
|
+
"bugs": {
|
|
74
|
+
"url": "https://github.com/AlshehriAli0/react-native-nitro-version-check/issues"
|
|
75
|
+
},
|
|
76
|
+
"homepage": "https://github.com/AlshehriAli0/react-native-nitro-version-check#readme",
|
|
77
|
+
"publishConfig": {
|
|
78
|
+
"registry": "https://registry.npmjs.org/"
|
|
79
|
+
},
|
|
80
|
+
"release-it": {
|
|
81
|
+
"git": {
|
|
82
|
+
"commitMessage": "chore: release v${version}",
|
|
83
|
+
"tagName": "v${version}"
|
|
84
|
+
},
|
|
85
|
+
"npm": {
|
|
86
|
+
"publish": true
|
|
87
|
+
},
|
|
88
|
+
"github": {
|
|
89
|
+
"release": true
|
|
90
|
+
},
|
|
91
|
+
"hooks": {
|
|
92
|
+
"before:init": "bun run build"
|
|
93
|
+
},
|
|
94
|
+
"plugins": {
|
|
95
|
+
"@release-it/conventional-changelog": {
|
|
96
|
+
"preset": "conventionalcommits",
|
|
97
|
+
"infile": "../CHANGELOG.md"
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"devDependencies": {
|
|
102
|
+
"@release-it/conventional-changelog": "^10.0.5",
|
|
103
|
+
"@types/react": "^19.1.03",
|
|
104
|
+
"nitrogen": "*",
|
|
105
|
+
"react": "19.2.0",
|
|
106
|
+
"react-native": "0.83.0",
|
|
107
|
+
"react-native-nitro-modules": "*",
|
|
108
|
+
"release-it": "^19.2.4",
|
|
109
|
+
"typescript": "^5.8.3"
|
|
110
|
+
},
|
|
111
|
+
"peerDependencies": {
|
|
112
|
+
"react": "*",
|
|
113
|
+
"react-native": "*",
|
|
114
|
+
"react-native-nitro-modules": "*"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// https://github.com/react-native-community/cli/blob/main/docs/dependencies.md
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
dependency: {
|
|
5
|
+
platforms: {
|
|
6
|
+
/**
|
|
7
|
+
* @type {import('@react-native-community/cli-types').IOSDependencyParams}
|
|
8
|
+
*/
|
|
9
|
+
ios: {},
|
|
10
|
+
/**
|
|
11
|
+
* @type {import('@react-native-community/cli-types').AndroidDependencyParams}
|
|
12
|
+
*/
|
|
13
|
+
android: {},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { NitroModules } from "react-native-nitro-modules";
|
|
2
|
+
import type { UpdateLevel } from "./semver";
|
|
3
|
+
import { compareVersions, isNewerVersion } from "./semver";
|
|
4
|
+
import type { VersionCheck as VersionCheckType } from "./specs/Version.nitro";
|
|
5
|
+
|
|
6
|
+
const HybridVersionCheck = NitroModules.createHybridObject<VersionCheckType>("VersionCheck");
|
|
7
|
+
|
|
8
|
+
// Cached at module init — plain JS values, no JSI overhead on repeated access.
|
|
9
|
+
const version = HybridVersionCheck.version;
|
|
10
|
+
const buildNumber = HybridVersionCheck.buildNumber;
|
|
11
|
+
const packageName = HybridVersionCheck.packageName;
|
|
12
|
+
const installSource = HybridVersionCheck.installSource;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Returns the device's current 2-letter ISO country code.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* getCountry() // "US"
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export const getCountry = () => HybridVersionCheck.getCountry();
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Returns the store URL for this app.
|
|
26
|
+
*
|
|
27
|
+
* Automatically resolves to the App Store on iOS and Play Store on Android.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const url = await getStoreUrl();
|
|
32
|
+
* Linking.openURL(url);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export const getStoreUrl = () => HybridVersionCheck.getStoreUrl();
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Fetches the latest version of this app available in the store.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* const latest = await getLatestVersion(); // "1.3.0"
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export const getLatestVersion = () => HybridVersionCheck.getLatestVersion();
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Checks whether an app update is available.
|
|
49
|
+
*
|
|
50
|
+
* Uses semantic version comparison. By default checks for any version
|
|
51
|
+
* increase, but you can filter by granularity:
|
|
52
|
+
*
|
|
53
|
+
* - `"major"` — only returns `true` for major bumps (1.x → 2.x)
|
|
54
|
+
* - `"minor"` — returns `true` for major or minor bumps
|
|
55
|
+
* - `"patch"` — returns `true` for any version increase (default)
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* if (await needsUpdate()) {
|
|
60
|
+
* const url = await getStoreUrl();
|
|
61
|
+
* Linking.openURL(url);
|
|
62
|
+
* }
|
|
63
|
+
*
|
|
64
|
+
* // Only prompt for major updates
|
|
65
|
+
* const majorUpdate = await needsUpdate({ level: "major" });
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export const needsUpdate = async (options?: { level?: UpdateLevel }): Promise<boolean> => {
|
|
69
|
+
const latest = await HybridVersionCheck.getLatestVersion();
|
|
70
|
+
return isNewerVersion(version, latest, options?.level ?? "patch");
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* All version-check APIs in one object.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* VersionCheck.version // "1.2.0"
|
|
79
|
+
* VersionCheck.buildNumber // "42"
|
|
80
|
+
* VersionCheck.packageName // "com.example.app"
|
|
81
|
+
* VersionCheck.getCountry() // "US"
|
|
82
|
+
*
|
|
83
|
+
* const url = await VersionCheck.getStoreUrl();
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export const VersionCheck = {
|
|
87
|
+
/**
|
|
88
|
+
* The current app version string.
|
|
89
|
+
*
|
|
90
|
+
* Read from `CFBundleShortVersionString` on iOS and `versionName` on Android.
|
|
91
|
+
* Cached at module init, so repeated reads have zero native overhead.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* VersionCheck.version // "1.2.0"
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
version,
|
|
99
|
+
/**
|
|
100
|
+
* The current build number.
|
|
101
|
+
*
|
|
102
|
+
* Read from `CFBundleVersion` on iOS and `versionCode` on Android.
|
|
103
|
+
* Cached at module init.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* VersionCheck.buildNumber // "42"
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
buildNumber,
|
|
111
|
+
/**
|
|
112
|
+
* The app's unique identifier.
|
|
113
|
+
*
|
|
114
|
+
* This is the Bundle ID on iOS and the Application ID on Android.
|
|
115
|
+
* Cached at module init.
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```ts
|
|
119
|
+
* VersionCheck.packageName // "com.example.app"
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
packageName,
|
|
123
|
+
/**
|
|
124
|
+
* Where the app was installed from, or `undefined` for dev/sideloaded builds.
|
|
125
|
+
*
|
|
126
|
+
* - iOS: `"appstore"` | `"testflight"` | `undefined`
|
|
127
|
+
* - Android: `"playstore"` | `undefined`
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```ts
|
|
131
|
+
* if (VersionCheck.installSource === "testflight") {
|
|
132
|
+
* // running a TestFlight build
|
|
133
|
+
* }
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
installSource,
|
|
137
|
+
/**
|
|
138
|
+
* Returns the device's current 2-letter ISO country code.
|
|
139
|
+
*
|
|
140
|
+
* This is a synchronous Nitro call, no `await` needed.
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```ts
|
|
144
|
+
* VersionCheck.getCountry() // "US"
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
getCountry,
|
|
148
|
+
/**
|
|
149
|
+
* Returns the App Store (iOS) or Play Store (Android) URL for this app.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```ts
|
|
153
|
+
* const url = await VersionCheck.getStoreUrl();
|
|
154
|
+
* Linking.openURL(url);
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
getStoreUrl,
|
|
158
|
+
/**
|
|
159
|
+
* Fetches the latest version of this app available in the store.
|
|
160
|
+
*
|
|
161
|
+
* Queries the iTunes API on iOS and the Play Store on Android.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```ts
|
|
165
|
+
* const latest = await VersionCheck.getLatestVersion(); // "1.3.0"
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
getLatestVersion,
|
|
169
|
+
/**
|
|
170
|
+
* Checks whether an app update is available by comparing the current
|
|
171
|
+
* version against the latest store version.
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```ts
|
|
175
|
+
* if (await VersionCheck.needsUpdate()) {
|
|
176
|
+
* const url = await VersionCheck.getStoreUrl();
|
|
177
|
+
* Linking.openURL(url);
|
|
178
|
+
* }
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
needsUpdate: () => HybridVersionCheck.needsUpdate(),
|
|
182
|
+
} as const;
|
|
183
|
+
|
|
184
|
+
export { compareVersions };
|
|
185
|
+
export type { UpdateLevel };
|
package/src/semver.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type UpdateLevel = "major" | "minor" | "patch";
|
|
2
|
+
|
|
3
|
+
type SemVer = [major: number, minor: number, patch: number];
|
|
4
|
+
|
|
5
|
+
function parseVersion(version: string): SemVer {
|
|
6
|
+
const parts = version.split(".");
|
|
7
|
+
return [Number(parts[0]) || 0, Number(parts[1]) || 0, Number(parts[2]) || 0];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Compares two version strings.
|
|
12
|
+
*
|
|
13
|
+
* @returns `-1` if `v1 < v2`, `0` if equal, `1` if `v1 > v2`
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* compareVersions("1.2.0", "1.3.0") // -1
|
|
18
|
+
* compareVersions("2.0.0", "1.9.9") // 1
|
|
19
|
+
* compareVersions("1.0.0", "1.0.0") // 0
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function compareVersions(v1: string, v2: string): -1 | 0 | 1 {
|
|
23
|
+
const a = parseVersion(v1);
|
|
24
|
+
const b = parseVersion(v2);
|
|
25
|
+
|
|
26
|
+
for (let i = 0; i < 3; i++) {
|
|
27
|
+
if (a[i]! > b[i]!) return 1;
|
|
28
|
+
if (a[i]! < b[i]!) return -1;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Checks whether `latest` is newer than `current` at the given granularity.
|
|
36
|
+
*
|
|
37
|
+
* - `"major"` — only returns `true` for major bumps (1.x → 2.x)
|
|
38
|
+
* - `"minor"` — returns `true` for major or minor bumps
|
|
39
|
+
* - `"patch"` — returns `true` for any version increase (default)
|
|
40
|
+
*/
|
|
41
|
+
export function isNewerVersion(current: string, latest: string, level: UpdateLevel = "patch"): boolean {
|
|
42
|
+
const [curMajor, curMinor, curPatch] = parseVersion(current);
|
|
43
|
+
const [latMajor, latMinor, latPatch] = parseVersion(latest);
|
|
44
|
+
|
|
45
|
+
if (latMajor > curMajor) return true;
|
|
46
|
+
if (latMajor < curMajor) return false;
|
|
47
|
+
if (level === "major") return false;
|
|
48
|
+
|
|
49
|
+
if (latMinor > curMinor) return true;
|
|
50
|
+
if (latMinor < curMinor) return false;
|
|
51
|
+
if (level === "minor") return false;
|
|
52
|
+
|
|
53
|
+
return latPatch > curPatch;
|
|
54
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { HybridObject } from "react-native-nitro-modules";
|
|
2
|
+
|
|
3
|
+
export interface VersionCheck
|
|
4
|
+
extends HybridObject<{
|
|
5
|
+
ios: "swift";
|
|
6
|
+
android: "kotlin";
|
|
7
|
+
}> {
|
|
8
|
+
readonly version: string;
|
|
9
|
+
readonly buildNumber: string;
|
|
10
|
+
readonly packageName: string;
|
|
11
|
+
readonly installSource: string | undefined;
|
|
12
|
+
getCountry(): string;
|
|
13
|
+
getStoreUrl(): Promise<string>;
|
|
14
|
+
getLatestVersion(): Promise<string>;
|
|
15
|
+
needsUpdate(): Promise<boolean>;
|
|
16
|
+
}
|