@capgo/capacitor-webview-version-checker 8.0.0 → 8.1.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.
@@ -4,14 +4,33 @@ export type WebViewPlatform = 'android' | 'ios' | 'web';
4
4
  /**
5
5
  * Capacitor config shape for `plugins.WebviewVersionChecker`.
6
6
  *
7
+ * Main use case (default, no plugin config required):
8
+ * Browserslist-style compatibility checks with a built-in version-share dataset
9
+ * generated from caniuse at plugin build time.
10
+ *
11
+ * ```ts
12
+ * plugins: {
13
+ * WebviewVersionChecker: {}
14
+ * }
15
+ * ```
16
+ *
17
+ * Simple setup with automatic prompt:
18
+ *
7
19
  * ```ts
8
20
  * plugins: {
9
21
  * WebviewVersionChecker: {
10
- * autoCheckOnLoad: true,
11
- * autoCheckOnResume: true,
12
22
  * autoPromptOnOutdated: true,
13
- * minimumMajorVersion: 124,
14
- * latestVersionApiUrl: 'https://versionhistory.googleapis.com/v1/chrome/platforms/android/channels/stable/versions?page_size=1',
23
+ * }
24
+ * }
25
+ * ```
26
+ *
27
+ * Advanced setup with custom dataset and threshold:
28
+ *
29
+ * ```ts
30
+ * plugins: {
31
+ * WebviewVersionChecker: {
32
+ * minimumDeviceSharePercent: 3,
33
+ * versionShareByMajor: { '137': 58.2, '136': 21.3, '135': 4.6 },
15
34
  * }
16
35
  * }
17
36
  * ```
@@ -45,6 +64,50 @@ export interface WebviewVersionCheckerConfig {
45
64
  * Used when `latestVersion` cannot be resolved.
46
65
  */
47
66
  minimumMajorVersion?: number;
67
+ /**
68
+ * Browserslist-style compatibility threshold in percentage points.
69
+ *
70
+ * Example: `3` means the installed WebView major version must represent at least 3%
71
+ * of devices in the selected version-share dataset.
72
+ *
73
+ * Data source priority:
74
+ * - `versionShareByMajor` (inline dataset) if provided
75
+ * - else `versionShareApiUrl` if provided
76
+ * - else built-in generated dataset (`generatedVersionShareByMajor`)
77
+ *
78
+ * If the threshold cannot be evaluated (missing dataset or missing major entry),
79
+ * the plugin falls back to normal version checks (`latestVersion` / `latestVersionApiUrl`,
80
+ * then `minimumMajorVersion`).
81
+ *
82
+ * @default 3
83
+ */
84
+ minimumDeviceSharePercent?: number;
85
+ /**
86
+ * Optional inline dataset for major-version device share.
87
+ *
88
+ * Keys are major versions (string or number-like), values are percentages (`0..100`).
89
+ *
90
+ * Example:
91
+ * `{ "137": 54.2, "136": 23.8, "135": 7.1, "134": 2.4 }`
92
+ *
93
+ * Used when `minimumDeviceSharePercent` is set.
94
+ * If both `versionShareByMajor` and `versionShareApiUrl` are provided,
95
+ * this inline map is used first.
96
+ */
97
+ versionShareByMajor?: Record<string, number>;
98
+ /**
99
+ * Optional endpoint returning a version-share dataset.
100
+ *
101
+ * Used when `minimumDeviceSharePercent` is set and no inline `versionShareByMajor`
102
+ * is provided. If omitted, the plugin uses its built-in generated dataset.
103
+ *
104
+ * Supported response shapes:
105
+ * - `{ "versionShareByMajor": { "137": 54.2, "136": 23.8 } }`
106
+ * - `{ "shareByMajor": { "137": 54.2, "136": 23.8 } }`
107
+ * - `{ "versions": [{ "major": 137, "share": 54.2 }, { "version": "136.0.0.0", "percent": 23.8 }] }`
108
+ * - Caniuse full dataset shape (`agents.*.usage_global`)
109
+ */
110
+ versionShareApiUrl?: string;
48
111
  /**
49
112
  * Optional endpoint returning a JSON payload with the latest version.
50
113
  *
@@ -186,6 +249,34 @@ export interface WebViewVersionStatus {
186
249
  * Resolved latest major version (if parseable).
187
250
  */
188
251
  latestMajorVersion?: number;
252
+ /**
253
+ * Device-share percentage for the installed WebView major version.
254
+ *
255
+ * Present only when a version-share dataset is available and includes the current major version.
256
+ */
257
+ currentVersionSharePercent?: number;
258
+ /**
259
+ * Configured threshold used by compatibility-threshold mode.
260
+ *
261
+ * Present only when `minimumDeviceSharePercent` was requested for that check.
262
+ */
263
+ minimumDeviceSharePercent?: number;
264
+ /**
265
+ * Source used for version-share data.
266
+ *
267
+ * Values:
268
+ * - `versionShareByMajor` (inline dataset)
269
+ * - `versionShareApiUrl` (remote dataset)
270
+ * - `generatedVersionShareByMajor` (built-in dataset generated at build time)
271
+ */
272
+ versionShareSource?: string;
273
+ /**
274
+ * Diagnostic message for compatibility-threshold mode.
275
+ *
276
+ * Present when `minimumDeviceSharePercent` was requested but the threshold check
277
+ * could not be fully evaluated.
278
+ */
279
+ deviceShareError?: string;
189
280
  /**
190
281
  * Android package name of the active WebView provider.
191
282
  */
@@ -1 +1 @@
1
- {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["import type { PluginListenerHandle } from '@capacitor/core';\n\nexport type WebViewVersionState = 'latest' | 'outdated' | 'unknown';\n\nexport type WebViewPlatform = 'android' | 'ios' | 'web';\n\n/**\n * Capacitor config shape for `plugins.WebviewVersionChecker`.\n *\n * ```ts\n * plugins: {\n * WebviewVersionChecker: {\n * autoCheckOnLoad: true,\n * autoCheckOnResume: true,\n * autoPromptOnOutdated: true,\n * minimumMajorVersion: 124,\n * latestVersionApiUrl: 'https://versionhistory.googleapis.com/v1/chrome/platforms/android/channels/stable/versions?page_size=1',\n * }\n * }\n * ```\n */\nexport interface WebviewVersionCheckerConfig {\n /**\n * Automatically run a version check once when the plugin loads.\n *\n * @default true\n */\n autoCheckOnLoad?: boolean;\n\n /**\n * Automatically run a version check each time the app returns to foreground.\n *\n * @default true\n */\n autoCheckOnResume?: boolean;\n\n /**\n * Automatically show a native update prompt whenever an outdated WebView is detected.\n *\n * @default false\n */\n autoPromptOnOutdated?: boolean;\n\n /**\n * Explicit latest version to compare with.\n * If provided, this value is used before any API lookup.\n */\n latestVersion?: string;\n\n /**\n * Fallback minimum allowed major version.\n * Used when `latestVersion` cannot be resolved.\n */\n minimumMajorVersion?: number;\n\n /**\n * Optional endpoint returning a JSON payload with the latest version.\n *\n * Supported response shapes:\n * - `{ \"version\": \"137.0.7151.44\" }`\n * - `{ \"latestVersion\": \"137.0.7151.44\" }`\n * - Google version history format: `{ \"versions\": [{ \"version\": \"137.0.7151.44\" }] }`\n */\n latestVersionApiUrl?: string;\n\n /**\n * Optional URL opened when users tap update in the native prompt.\n *\n * Android default: Play Store listing of the active WebView package.\n * iOS default: Apple iOS update help page.\n */\n updateUrl?: string;\n\n /**\n * Native prompt title.\n */\n promptTitle?: string;\n\n /**\n * Native prompt message.\n */\n promptMessage?: string;\n\n /**\n * Native prompt update button text.\n */\n promptUpdateButtonText?: string;\n\n /**\n * Native prompt cancel button text.\n */\n promptCancelButtonText?: string;\n}\n\n/**\n * Options for running a WebView version check.\n */\nexport interface CheckWebViewOptions extends WebviewVersionCheckerConfig {\n /**\n * Force showing a native prompt if an outdated WebView is detected.\n *\n * @default false\n */\n showPromptOnOutdated?: boolean;\n\n /**\n * Optional tag included in the status payload so you can identify the check origin.\n *\n * @default \"manual\"\n */\n source?: string;\n}\n\n/**\n * Options for starting monitor mode.\n */\nexport interface StartMonitoringOptions extends CheckWebViewOptions {\n /**\n * Run a check immediately when monitoring starts.\n *\n * @default true\n */\n checkOnStart?: boolean;\n\n /**\n * Whether foreground checks should run while monitoring is enabled.\n *\n * @default true\n */\n checkOnResume?: boolean;\n}\n\n/**\n * Options for showing the native update prompt.\n */\nexport interface ShowUpdatePromptOptions {\n /**\n * Prompt title.\n */\n title?: string;\n\n /**\n * Prompt message.\n */\n message?: string;\n\n /**\n * Update CTA label.\n */\n updateButtonText?: string;\n\n /**\n * Cancel CTA label.\n */\n cancelButtonText?: string;\n\n /**\n * Optional URL to open if the update action is selected.\n */\n updateUrl?: string;\n}\n\n/**\n * Options for opening the update page directly.\n */\nexport interface OpenUpdatePageOptions {\n /**\n * Optional URL override.\n */\n updateUrl?: string;\n}\n\n/**\n * Snapshot of the currently detected WebView status.\n */\nexport interface WebViewVersionStatus {\n /**\n * Native platform that generated the status.\n */\n platform: WebViewPlatform;\n\n /**\n * Resolved version state.\n */\n state: WebViewVersionState;\n\n /**\n * Convenience boolean equivalent to `state === 'latest'`.\n */\n isLatest: boolean;\n\n /**\n * ISO-8601 timestamp of the check.\n */\n checkedAt: string;\n\n /**\n * Human-readable explanation for the reported state.\n */\n reason: string;\n\n /**\n * Current WebView (or iOS system WebKit) version string.\n */\n currentVersion: string;\n\n /**\n * Current detected major version (if parseable).\n */\n currentMajorVersion?: number;\n\n /**\n * Resolved latest version used for comparison.\n */\n latestVersion?: string;\n\n /**\n * Resolved latest major version (if parseable).\n */\n latestMajorVersion?: number;\n\n /**\n * Android package name of the active WebView provider.\n */\n providerPackage?: string;\n\n /**\n * URL that should be opened to update when outdated.\n */\n updateUrl?: string;\n\n /**\n * Internal source identifier for the check implementation.\n */\n source: string;\n}\n\n/**\n * Result payload for monitor controls.\n */\nexport interface MonitoringStateResult {\n /**\n * Whether monitoring is currently active.\n */\n monitoring: boolean;\n\n /**\n * Whether checks run on app resume while monitoring is active.\n */\n checkOnResume: boolean;\n\n /**\n * Whether outdated checks auto-trigger the native prompt.\n */\n autoPromptOnOutdated: boolean;\n}\n\n/**\n * Last known check snapshot.\n */\nexport interface LastStatusResult {\n /**\n * Null until the first check completes.\n */\n status: WebViewVersionStatus | null;\n}\n\n/**\n * Result payload for `showUpdatePrompt()`.\n */\nexport interface ShowUpdatePromptResult {\n /**\n * Whether a native prompt was actually shown.\n */\n shown: boolean;\n\n /**\n * Whether the update page was opened from the prompt action.\n */\n openedUpdatePage: boolean;\n}\n\n/**\n * Result payload for `openUpdatePage()`.\n */\nexport interface OpenUpdatePageResult {\n /**\n * Whether opening the update URL succeeded.\n */\n opened: boolean;\n\n /**\n * URL that was attempted.\n */\n url: string;\n}\n\n/**\n * Public API for checking WebView freshness and guiding users to updates.\n */\nexport interface WebviewVersionCheckerPlugin {\n /**\n * Runs a version check and returns the latest known status.\n */\n check(options?: CheckWebViewOptions): Promise<WebViewVersionStatus>;\n\n /**\n * Enables background monitoring (typically on app resume).\n */\n startMonitoring(options?: StartMonitoringOptions): Promise<MonitoringStateResult>;\n\n /**\n * Disables monitoring.\n */\n stopMonitoring(): Promise<MonitoringStateResult>;\n\n /**\n * Returns the last resolved status, or `null` if no check was run yet.\n */\n getLastStatus(): Promise<LastStatusResult>;\n\n /**\n * Shows a native prompt asking the user to update the WebView.\n */\n showUpdatePrompt(options?: ShowUpdatePromptOptions): Promise<ShowUpdatePromptResult>;\n\n /**\n * Opens the configured update page directly.\n */\n openUpdatePage(options?: OpenUpdatePageOptions): Promise<OpenUpdatePageResult>;\n\n /**\n * Fired for every successful status evaluation.\n */\n addListener(eventName: 'statusChanged', listenerFunc: (status: WebViewVersionStatus) => void): Promise<PluginListenerHandle>;\n\n /**\n * Fired when the state resolves to `latest`.\n */\n addListener(eventName: 'webViewLatest', listenerFunc: (status: WebViewVersionStatus) => void): Promise<PluginListenerHandle>;\n\n /**\n * Fired when the state resolves to `outdated`.\n */\n addListener(eventName: 'webViewOutdated', listenerFunc: (status: WebViewVersionStatus) => void): Promise<PluginListenerHandle>;\n}\n"]}
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["import type { PluginListenerHandle } from '@capacitor/core';\n\nexport type WebViewVersionState = 'latest' | 'outdated' | 'unknown';\n\nexport type WebViewPlatform = 'android' | 'ios' | 'web';\n\n/**\n * Capacitor config shape for `plugins.WebviewVersionChecker`.\n *\n * Main use case (default, no plugin config required):\n * Browserslist-style compatibility checks with a built-in version-share dataset\n * generated from caniuse at plugin build time.\n *\n * ```ts\n * plugins: {\n * WebviewVersionChecker: {}\n * }\n * ```\n *\n * Simple setup with automatic prompt:\n *\n * ```ts\n * plugins: {\n * WebviewVersionChecker: {\n * autoPromptOnOutdated: true,\n * }\n * }\n * ```\n *\n * Advanced setup with custom dataset and threshold:\n *\n * ```ts\n * plugins: {\n * WebviewVersionChecker: {\n * minimumDeviceSharePercent: 3,\n * versionShareByMajor: { '137': 58.2, '136': 21.3, '135': 4.6 },\n * }\n * }\n * ```\n */\nexport interface WebviewVersionCheckerConfig {\n /**\n * Automatically run a version check once when the plugin loads.\n *\n * @default true\n */\n autoCheckOnLoad?: boolean;\n\n /**\n * Automatically run a version check each time the app returns to foreground.\n *\n * @default true\n */\n autoCheckOnResume?: boolean;\n\n /**\n * Automatically show a native update prompt whenever an outdated WebView is detected.\n *\n * @default false\n */\n autoPromptOnOutdated?: boolean;\n\n /**\n * Explicit latest version to compare with.\n * If provided, this value is used before any API lookup.\n */\n latestVersion?: string;\n\n /**\n * Fallback minimum allowed major version.\n * Used when `latestVersion` cannot be resolved.\n */\n minimumMajorVersion?: number;\n\n /**\n * Browserslist-style compatibility threshold in percentage points.\n *\n * Example: `3` means the installed WebView major version must represent at least 3%\n * of devices in the selected version-share dataset.\n *\n * Data source priority:\n * - `versionShareByMajor` (inline dataset) if provided\n * - else `versionShareApiUrl` if provided\n * - else built-in generated dataset (`generatedVersionShareByMajor`)\n *\n * If the threshold cannot be evaluated (missing dataset or missing major entry),\n * the plugin falls back to normal version checks (`latestVersion` / `latestVersionApiUrl`,\n * then `minimumMajorVersion`).\n *\n * @default 3\n */\n minimumDeviceSharePercent?: number;\n\n /**\n * Optional inline dataset for major-version device share.\n *\n * Keys are major versions (string or number-like), values are percentages (`0..100`).\n *\n * Example:\n * `{ \"137\": 54.2, \"136\": 23.8, \"135\": 7.1, \"134\": 2.4 }`\n *\n * Used when `minimumDeviceSharePercent` is set.\n * If both `versionShareByMajor` and `versionShareApiUrl` are provided,\n * this inline map is used first.\n */\n versionShareByMajor?: Record<string, number>;\n\n /**\n * Optional endpoint returning a version-share dataset.\n *\n * Used when `minimumDeviceSharePercent` is set and no inline `versionShareByMajor`\n * is provided. If omitted, the plugin uses its built-in generated dataset.\n *\n * Supported response shapes:\n * - `{ \"versionShareByMajor\": { \"137\": 54.2, \"136\": 23.8 } }`\n * - `{ \"shareByMajor\": { \"137\": 54.2, \"136\": 23.8 } }`\n * - `{ \"versions\": [{ \"major\": 137, \"share\": 54.2 }, { \"version\": \"136.0.0.0\", \"percent\": 23.8 }] }`\n * - Caniuse full dataset shape (`agents.*.usage_global`)\n */\n versionShareApiUrl?: string;\n\n /**\n * Optional endpoint returning a JSON payload with the latest version.\n *\n * Supported response shapes:\n * - `{ \"version\": \"137.0.7151.44\" }`\n * - `{ \"latestVersion\": \"137.0.7151.44\" }`\n * - Google version history format: `{ \"versions\": [{ \"version\": \"137.0.7151.44\" }] }`\n */\n latestVersionApiUrl?: string;\n\n /**\n * Optional URL opened when users tap update in the native prompt.\n *\n * Android default: Play Store listing of the active WebView package.\n * iOS default: Apple iOS update help page.\n */\n updateUrl?: string;\n\n /**\n * Native prompt title.\n */\n promptTitle?: string;\n\n /**\n * Native prompt message.\n */\n promptMessage?: string;\n\n /**\n * Native prompt update button text.\n */\n promptUpdateButtonText?: string;\n\n /**\n * Native prompt cancel button text.\n */\n promptCancelButtonText?: string;\n}\n\n/**\n * Options for running a WebView version check.\n */\nexport interface CheckWebViewOptions extends WebviewVersionCheckerConfig {\n /**\n * Force showing a native prompt if an outdated WebView is detected.\n *\n * @default false\n */\n showPromptOnOutdated?: boolean;\n\n /**\n * Optional tag included in the status payload so you can identify the check origin.\n *\n * @default \"manual\"\n */\n source?: string;\n}\n\n/**\n * Options for starting monitor mode.\n */\nexport interface StartMonitoringOptions extends CheckWebViewOptions {\n /**\n * Run a check immediately when monitoring starts.\n *\n * @default true\n */\n checkOnStart?: boolean;\n\n /**\n * Whether foreground checks should run while monitoring is enabled.\n *\n * @default true\n */\n checkOnResume?: boolean;\n}\n\n/**\n * Options for showing the native update prompt.\n */\nexport interface ShowUpdatePromptOptions {\n /**\n * Prompt title.\n */\n title?: string;\n\n /**\n * Prompt message.\n */\n message?: string;\n\n /**\n * Update CTA label.\n */\n updateButtonText?: string;\n\n /**\n * Cancel CTA label.\n */\n cancelButtonText?: string;\n\n /**\n * Optional URL to open if the update action is selected.\n */\n updateUrl?: string;\n}\n\n/**\n * Options for opening the update page directly.\n */\nexport interface OpenUpdatePageOptions {\n /**\n * Optional URL override.\n */\n updateUrl?: string;\n}\n\n/**\n * Snapshot of the currently detected WebView status.\n */\nexport interface WebViewVersionStatus {\n /**\n * Native platform that generated the status.\n */\n platform: WebViewPlatform;\n\n /**\n * Resolved version state.\n */\n state: WebViewVersionState;\n\n /**\n * Convenience boolean equivalent to `state === 'latest'`.\n */\n isLatest: boolean;\n\n /**\n * ISO-8601 timestamp of the check.\n */\n checkedAt: string;\n\n /**\n * Human-readable explanation for the reported state.\n */\n reason: string;\n\n /**\n * Current WebView (or iOS system WebKit) version string.\n */\n currentVersion: string;\n\n /**\n * Current detected major version (if parseable).\n */\n currentMajorVersion?: number;\n\n /**\n * Resolved latest version used for comparison.\n */\n latestVersion?: string;\n\n /**\n * Resolved latest major version (if parseable).\n */\n latestMajorVersion?: number;\n\n /**\n * Device-share percentage for the installed WebView major version.\n *\n * Present only when a version-share dataset is available and includes the current major version.\n */\n currentVersionSharePercent?: number;\n\n /**\n * Configured threshold used by compatibility-threshold mode.\n *\n * Present only when `minimumDeviceSharePercent` was requested for that check.\n */\n minimumDeviceSharePercent?: number;\n\n /**\n * Source used for version-share data.\n *\n * Values:\n * - `versionShareByMajor` (inline dataset)\n * - `versionShareApiUrl` (remote dataset)\n * - `generatedVersionShareByMajor` (built-in dataset generated at build time)\n */\n versionShareSource?: string;\n\n /**\n * Diagnostic message for compatibility-threshold mode.\n *\n * Present when `minimumDeviceSharePercent` was requested but the threshold check\n * could not be fully evaluated.\n */\n deviceShareError?: string;\n\n /**\n * Android package name of the active WebView provider.\n */\n providerPackage?: string;\n\n /**\n * URL that should be opened to update when outdated.\n */\n updateUrl?: string;\n\n /**\n * Internal source identifier for the check implementation.\n */\n source: string;\n}\n\n/**\n * Result payload for monitor controls.\n */\nexport interface MonitoringStateResult {\n /**\n * Whether monitoring is currently active.\n */\n monitoring: boolean;\n\n /**\n * Whether checks run on app resume while monitoring is active.\n */\n checkOnResume: boolean;\n\n /**\n * Whether outdated checks auto-trigger the native prompt.\n */\n autoPromptOnOutdated: boolean;\n}\n\n/**\n * Last known check snapshot.\n */\nexport interface LastStatusResult {\n /**\n * Null until the first check completes.\n */\n status: WebViewVersionStatus | null;\n}\n\n/**\n * Result payload for `showUpdatePrompt()`.\n */\nexport interface ShowUpdatePromptResult {\n /**\n * Whether a native prompt was actually shown.\n */\n shown: boolean;\n\n /**\n * Whether the update page was opened from the prompt action.\n */\n openedUpdatePage: boolean;\n}\n\n/**\n * Result payload for `openUpdatePage()`.\n */\nexport interface OpenUpdatePageResult {\n /**\n * Whether opening the update URL succeeded.\n */\n opened: boolean;\n\n /**\n * URL that was attempted.\n */\n url: string;\n}\n\n/**\n * Public API for checking WebView freshness and guiding users to updates.\n */\nexport interface WebviewVersionCheckerPlugin {\n /**\n * Runs a version check and returns the latest known status.\n */\n check(options?: CheckWebViewOptions): Promise<WebViewVersionStatus>;\n\n /**\n * Enables background monitoring (typically on app resume).\n */\n startMonitoring(options?: StartMonitoringOptions): Promise<MonitoringStateResult>;\n\n /**\n * Disables monitoring.\n */\n stopMonitoring(): Promise<MonitoringStateResult>;\n\n /**\n * Returns the last resolved status, or `null` if no check was run yet.\n */\n getLastStatus(): Promise<LastStatusResult>;\n\n /**\n * Shows a native prompt asking the user to update the WebView.\n */\n showUpdatePrompt(options?: ShowUpdatePromptOptions): Promise<ShowUpdatePromptResult>;\n\n /**\n * Opens the configured update page directly.\n */\n openUpdatePage(options?: OpenUpdatePageOptions): Promise<OpenUpdatePageResult>;\n\n /**\n * Fired for every successful status evaluation.\n */\n addListener(\n eventName: 'statusChanged',\n listenerFunc: (status: WebViewVersionStatus) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * Fired when the state resolves to `latest`.\n */\n addListener(\n eventName: 'webViewLatest',\n listenerFunc: (status: WebViewVersionStatus) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * Fired when the state resolves to `outdated`.\n */\n addListener(\n eventName: 'webViewOutdated',\n listenerFunc: (status: WebViewVersionStatus) => void,\n ): Promise<PluginListenerHandle>;\n}\n"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * AUTO-GENERATED FILE. DO NOT EDIT.
3
+ * Generated by: scripts/generate-version-share-data.mjs
4
+ * Source: https://raw.githubusercontent.com/Fyrd/caniuse/main/data.json
5
+ * Generated at: 2026-02-20T04:04:07.658Z
6
+ */
7
+ export declare const DEFAULT_VERSION_SHARE_DATA_SOURCE = "generatedVersionShareByMajor";
8
+ export declare const DEFAULT_VERSION_SHARE_GENERATED_AT = "2026-02-20T04:04:07.658Z";
9
+ export declare const DEFAULT_VERSION_SHARE_BY_MAJOR: Record<string, number>;
@@ -0,0 +1,106 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * AUTO-GENERATED FILE. DO NOT EDIT.
4
+ * Generated by: scripts/generate-version-share-data.mjs
5
+ * Source: https://raw.githubusercontent.com/Fyrd/caniuse/main/data.json
6
+ * Generated at: 2026-02-20T04:04:07.658Z
7
+ */
8
+ export const DEFAULT_VERSION_SHARE_DATA_SOURCE = 'generatedVersionShareByMajor';
9
+ export const DEFAULT_VERSION_SHARE_GENERATED_AT = '2026-02-20T04:04:07.658Z';
10
+ export const DEFAULT_VERSION_SHARE_BY_MAJOR = {
11
+ "4": 0.000092,
12
+ "39": 0.004796,
13
+ "40": 0.004796,
14
+ "41": 0.009592,
15
+ "42": 0.004796,
16
+ "43": 0.004796,
17
+ "44": 0.004796,
18
+ "45": 0.009592,
19
+ "46": 0.004796,
20
+ "47": 0.009592,
21
+ "48": 0.014388,
22
+ "49": 0.014388,
23
+ "50": 0.009592,
24
+ "51": 0.009592,
25
+ "52": 0.014388,
26
+ "53": 0.009592,
27
+ "54": 0.004796,
28
+ "55": 0.009592,
29
+ "56": 0.009592,
30
+ "57": 0.009592,
31
+ "58": 0.009592,
32
+ "59": 0.009592,
33
+ "60": 0.014388,
34
+ "61": 0.004796,
35
+ "62": 0.009592,
36
+ "63": 0.009592,
37
+ "64": 0.009592,
38
+ "65": 0.004796,
39
+ "66": 0.02398,
40
+ "67": 0.009592,
41
+ "68": 0.009592,
42
+ "69": 0.033572,
43
+ "70": 0.009592,
44
+ "75": 0.004796,
45
+ "77": 0.004796,
46
+ "79": 0.067144,
47
+ "80": 0.009592,
48
+ "81": 0.009592,
49
+ "83": 0.043164,
50
+ "85": 0.004796,
51
+ "86": 0.009592,
52
+ "87": 0.028776,
53
+ "88": 0.004796,
54
+ "91": 0.019184,
55
+ "92": 0.014388,
56
+ "93": 0.009592,
57
+ "97": 0.009592,
58
+ "98": 0.04796,
59
+ "99": 0.043164,
60
+ "101": 0.014388,
61
+ "102": 0.009592,
62
+ "103": 0.26378,
63
+ "104": 0.230208,
64
+ "105": 0.273372,
65
+ "106": 0.206228,
66
+ "107": 0.230208,
67
+ "108": 0.230208,
68
+ "109": 0.786544,
69
+ "110": 0.235004,
70
+ "111": 0.292556,
71
+ "112": 2.71454,
72
+ "113": 0.004796,
73
+ "114": 0.062348,
74
+ "115": 0.02398,
75
+ "116": 0.446028,
76
+ "117": 0.282964,
77
+ "118": 0.052756,
78
+ "119": 0.038368,
79
+ "120": 0.31174,
80
+ "121": 0.04796,
81
+ "122": 0.091124,
82
+ "123": 0.062348,
83
+ "124": 0.230208,
84
+ "125": 0.244596,
85
+ "126": 0.052756,
86
+ "127": 0.052756,
87
+ "128": 0.076736,
88
+ "129": 0.067144,
89
+ "130": 0.09592,
90
+ "131": 0.709808,
91
+ "132": 0.139084,
92
+ "133": 0.52756,
93
+ "134": 0.067144,
94
+ "135": 0.067144,
95
+ "136": 0.09592,
96
+ "137": 0.062348,
97
+ "138": 0.235004,
98
+ "139": 3.34761,
99
+ "140": 0.177452,
100
+ "141": 0.398068,
101
+ "142": 1.29972,
102
+ "143": 10.4121,
103
+ "144": 41.8835,
104
+ "145": 0.019184
105
+ };
106
+ //# sourceMappingURL=generated-version-share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-version-share.js","sourceRoot":"","sources":["../../src/generated-version-share.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,iCAAiC,GAAG,8BAA8B,CAAC;AAChF,MAAM,CAAC,MAAM,kCAAkC,GAAG,0BAA0B,CAAC;AAC7E,MAAM,CAAC,MAAM,8BAA8B,GAA2B;IACpE,GAAG,EAAE,QAAQ;IACb,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,QAAQ;CAChB,CAAC","sourcesContent":["/* eslint-disable */\n/**\n * AUTO-GENERATED FILE. DO NOT EDIT.\n * Generated by: scripts/generate-version-share-data.mjs\n * Source: https://raw.githubusercontent.com/Fyrd/caniuse/main/data.json\n * Generated at: 2026-02-20T04:04:07.658Z\n */\n\nexport const DEFAULT_VERSION_SHARE_DATA_SOURCE = 'generatedVersionShareByMajor';\nexport const DEFAULT_VERSION_SHARE_GENERATED_AT = '2026-02-20T04:04:07.658Z';\nexport const DEFAULT_VERSION_SHARE_BY_MAJOR: Record<string, number> = {\n \"4\": 0.000092,\n \"39\": 0.004796,\n \"40\": 0.004796,\n \"41\": 0.009592,\n \"42\": 0.004796,\n \"43\": 0.004796,\n \"44\": 0.004796,\n \"45\": 0.009592,\n \"46\": 0.004796,\n \"47\": 0.009592,\n \"48\": 0.014388,\n \"49\": 0.014388,\n \"50\": 0.009592,\n \"51\": 0.009592,\n \"52\": 0.014388,\n \"53\": 0.009592,\n \"54\": 0.004796,\n \"55\": 0.009592,\n \"56\": 0.009592,\n \"57\": 0.009592,\n \"58\": 0.009592,\n \"59\": 0.009592,\n \"60\": 0.014388,\n \"61\": 0.004796,\n \"62\": 0.009592,\n \"63\": 0.009592,\n \"64\": 0.009592,\n \"65\": 0.004796,\n \"66\": 0.02398,\n \"67\": 0.009592,\n \"68\": 0.009592,\n \"69\": 0.033572,\n \"70\": 0.009592,\n \"75\": 0.004796,\n \"77\": 0.004796,\n \"79\": 0.067144,\n \"80\": 0.009592,\n \"81\": 0.009592,\n \"83\": 0.043164,\n \"85\": 0.004796,\n \"86\": 0.009592,\n \"87\": 0.028776,\n \"88\": 0.004796,\n \"91\": 0.019184,\n \"92\": 0.014388,\n \"93\": 0.009592,\n \"97\": 0.009592,\n \"98\": 0.04796,\n \"99\": 0.043164,\n \"101\": 0.014388,\n \"102\": 0.009592,\n \"103\": 0.26378,\n \"104\": 0.230208,\n \"105\": 0.273372,\n \"106\": 0.206228,\n \"107\": 0.230208,\n \"108\": 0.230208,\n \"109\": 0.786544,\n \"110\": 0.235004,\n \"111\": 0.292556,\n \"112\": 2.71454,\n \"113\": 0.004796,\n \"114\": 0.062348,\n \"115\": 0.02398,\n \"116\": 0.446028,\n \"117\": 0.282964,\n \"118\": 0.052756,\n \"119\": 0.038368,\n \"120\": 0.31174,\n \"121\": 0.04796,\n \"122\": 0.091124,\n \"123\": 0.062348,\n \"124\": 0.230208,\n \"125\": 0.244596,\n \"126\": 0.052756,\n \"127\": 0.052756,\n \"128\": 0.076736,\n \"129\": 0.067144,\n \"130\": 0.09592,\n \"131\": 0.709808,\n \"132\": 0.139084,\n \"133\": 0.52756,\n \"134\": 0.067144,\n \"135\": 0.067144,\n \"136\": 0.09592,\n \"137\": 0.062348,\n \"138\": 0.235004,\n \"139\": 3.34761,\n \"140\": 0.177452,\n \"141\": 0.398068,\n \"142\": 1.29972,\n \"143\": 10.4121,\n \"144\": 41.8835,\n \"145\": 0.019184\n};\n"]}
package/dist/esm/web.d.ts CHANGED
@@ -15,4 +15,7 @@ export declare class WebviewVersionCheckerWeb extends WebPlugin implements Webvi
15
15
  private openUrl;
16
16
  private parseMajorVersion;
17
17
  private compareVersions;
18
+ private normalizePercent;
19
+ private normalizeVersionShareByMajor;
20
+ private resolveCurrentVersionSharePercent;
18
21
  }
package/dist/esm/web.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { WebPlugin } from '@capacitor/core';
2
+ import { DEFAULT_VERSION_SHARE_BY_MAJOR, DEFAULT_VERSION_SHARE_DATA_SOURCE } from './generated-version-share';
2
3
  const UNKNOWN_REASON = 'Web implementation is a compatibility shim. Native Android/iOS implementations provide full WebView checks.';
3
4
  export class WebviewVersionCheckerWeb extends WebPlugin {
4
5
  constructor() {
@@ -9,21 +10,60 @@ export class WebviewVersionCheckerWeb extends WebPlugin {
9
10
  this.lastStatus = null;
10
11
  }
11
12
  async check(options = {}) {
12
- var _a;
13
+ var _a, _b;
13
14
  const currentVersion = this.detectCurrentVersion();
14
15
  const currentMajorVersion = this.parseMajorVersion(currentVersion);
15
16
  const latestVersion = options.latestVersion;
16
17
  const latestMajorVersion = this.parseMajorVersion(latestVersion);
18
+ const minimumDeviceSharePercent = this.normalizePercent((_a = options.minimumDeviceSharePercent) !== null && _a !== void 0 ? _a : 3);
19
+ const normalizedInlineVersionShareByMajor = this.normalizeVersionShareByMajor(options.versionShareByMajor);
20
+ const normalizedGeneratedVersionShareByMajor = this.normalizeVersionShareByMajor(DEFAULT_VERSION_SHARE_BY_MAJOR);
21
+ const normalizedVersionShareByMajor = normalizedInlineVersionShareByMajor !== null && normalizedInlineVersionShareByMajor !== void 0 ? normalizedInlineVersionShareByMajor : normalizedGeneratedVersionShareByMajor;
22
+ const versionShareSource = normalizedInlineVersionShareByMajor
23
+ ? 'versionShareByMajor'
24
+ : DEFAULT_VERSION_SHARE_DATA_SOURCE;
25
+ const currentVersionSharePercent = this.resolveCurrentVersionSharePercent(currentMajorVersion, normalizedVersionShareByMajor);
26
+ let deviceShareError;
17
27
  let state = 'unknown';
18
28
  let reason = UNKNOWN_REASON;
19
- if (latestVersion && currentVersion) {
29
+ if (typeof minimumDeviceSharePercent === 'number') {
30
+ if (typeof currentVersionSharePercent === 'number') {
31
+ state = currentVersionSharePercent >= minimumDeviceSharePercent ? 'latest' : 'outdated';
32
+ reason =
33
+ state === 'latest'
34
+ ? 'Current browser engine major version meets the configured device-share threshold.'
35
+ : 'Current browser engine major version is below the configured device-share threshold.';
36
+ }
37
+ else if (!normalizedVersionShareByMajor && options.versionShareApiUrl) {
38
+ deviceShareError =
39
+ 'Web shim does not fetch version-share API data. Provide versionShareByMajor to evaluate minimumDeviceSharePercent.';
40
+ }
41
+ else if (!normalizedVersionShareByMajor) {
42
+ deviceShareError = 'minimumDeviceSharePercent is set, but no versionShareByMajor dataset was provided.';
43
+ }
44
+ else {
45
+ deviceShareError = 'No device-share entry was found for the current browser engine major version.';
46
+ }
47
+ }
48
+ if (state === 'unknown' && latestVersion && currentVersion) {
20
49
  const cmp = this.compareVersions(currentVersion, latestVersion);
21
50
  state = cmp >= 0 ? 'latest' : 'outdated';
22
- reason = cmp >= 0 ? 'Current browser engine is at or above the requested latest version.' : 'Current browser engine is below the requested latest version.';
51
+ reason =
52
+ cmp >= 0
53
+ ? 'Current browser engine is at or above the requested latest version.'
54
+ : 'Current browser engine is below the requested latest version.';
23
55
  }
24
- else if (typeof options.minimumMajorVersion === 'number' && typeof currentMajorVersion === 'number') {
56
+ else if (state === 'unknown' &&
57
+ typeof options.minimumMajorVersion === 'number' &&
58
+ typeof currentMajorVersion === 'number') {
25
59
  state = currentMajorVersion >= options.minimumMajorVersion ? 'latest' : 'outdated';
26
- reason = state === 'latest' ? 'Current browser engine major version meets the minimum requirement.' : 'Current browser engine major version is below the minimum requirement.';
60
+ reason =
61
+ state === 'latest'
62
+ ? 'Current browser engine major version meets the minimum requirement.'
63
+ : 'Current browser engine major version is below the minimum requirement.';
64
+ }
65
+ else if (state === 'unknown' && deviceShareError) {
66
+ reason = deviceShareError;
27
67
  }
28
68
  const status = {
29
69
  platform: 'web',
@@ -35,8 +75,12 @@ export class WebviewVersionCheckerWeb extends WebPlugin {
35
75
  currentMajorVersion,
36
76
  latestVersion,
37
77
  latestMajorVersion,
78
+ currentVersionSharePercent,
79
+ minimumDeviceSharePercent,
80
+ versionShareSource: normalizedVersionShareByMajor ? versionShareSource : undefined,
81
+ deviceShareError,
38
82
  updateUrl: options.updateUrl,
39
- source: (_a = options.source) !== null && _a !== void 0 ? _a : 'web-shim',
83
+ source: (_b = options.source) !== null && _b !== void 0 ? _b : 'web-shim',
40
84
  };
41
85
  this.lastStatus = status;
42
86
  this.notifyListeners('statusChanged', status);
@@ -109,11 +153,11 @@ export class WebviewVersionCheckerWeb extends WebPlugin {
109
153
  }
110
154
  detectCurrentVersion() {
111
155
  const chromiumMatch = navigator.userAgent.match(/Chrome\/([\d.]+)/i);
112
- if (chromiumMatch && chromiumMatch[1]) {
156
+ if (chromiumMatch === null || chromiumMatch === void 0 ? void 0 : chromiumMatch[1]) {
113
157
  return chromiumMatch[1];
114
158
  }
115
159
  const appleWebKitMatch = navigator.userAgent.match(/AppleWebKit\/([\d.]+)/i);
116
- if (appleWebKitMatch && appleWebKitMatch[1]) {
160
+ if (appleWebKitMatch === null || appleWebKitMatch === void 0 ? void 0 : appleWebKitMatch[1]) {
117
161
  return appleWebKitMatch[1];
118
162
  }
119
163
  return navigator.userAgent;
@@ -140,8 +184,14 @@ export class WebviewVersionCheckerWeb extends WebPlugin {
140
184
  }
141
185
  compareVersions(left, right) {
142
186
  var _a, _b;
143
- const leftParts = left.split(/[^0-9]+/).filter(Boolean).map((part) => Number.parseInt(part, 10));
144
- const rightParts = right.split(/[^0-9]+/).filter(Boolean).map((part) => Number.parseInt(part, 10));
187
+ const leftParts = left
188
+ .split(/[^0-9]+/)
189
+ .filter(Boolean)
190
+ .map((part) => Number.parseInt(part, 10));
191
+ const rightParts = right
192
+ .split(/[^0-9]+/)
193
+ .filter(Boolean)
194
+ .map((part) => Number.parseInt(part, 10));
145
195
  const maxLength = Math.max(leftParts.length, rightParts.length);
146
196
  for (let i = 0; i < maxLength; i += 1) {
147
197
  const a = (_a = leftParts[i]) !== null && _a !== void 0 ? _a : 0;
@@ -155,5 +205,31 @@ export class WebviewVersionCheckerWeb extends WebPlugin {
155
205
  }
156
206
  return 0;
157
207
  }
208
+ normalizePercent(value) {
209
+ if (typeof value !== 'number' || Number.isNaN(value) || !Number.isFinite(value)) {
210
+ return undefined;
211
+ }
212
+ return Math.min(100, Math.max(0, value));
213
+ }
214
+ normalizeVersionShareByMajor(shareByMajor) {
215
+ if (!shareByMajor) {
216
+ return undefined;
217
+ }
218
+ const normalized = {};
219
+ for (const [rawKey, rawShare] of Object.entries(shareByMajor)) {
220
+ const major = this.parseMajorVersion(rawKey);
221
+ const share = this.normalizePercent(rawShare);
222
+ if (typeof major === 'number' && typeof share === 'number') {
223
+ normalized[major] = share;
224
+ }
225
+ }
226
+ return Object.keys(normalized).length > 0 ? normalized : undefined;
227
+ }
228
+ resolveCurrentVersionSharePercent(currentMajorVersion, normalizedShareByMajor) {
229
+ if (typeof currentMajorVersion !== 'number' || !normalizedShareByMajor) {
230
+ return undefined;
231
+ }
232
+ return normalizedShareByMajor[currentMajorVersion];
233
+ }
158
234
  }
159
235
  //# sourceMappingURL=web.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport type {\n CheckWebViewOptions,\n LastStatusResult,\n MonitoringStateResult,\n OpenUpdatePageOptions,\n OpenUpdatePageResult,\n ShowUpdatePromptOptions,\n ShowUpdatePromptResult,\n StartMonitoringOptions,\n WebViewVersionState,\n WebViewVersionStatus,\n WebviewVersionCheckerPlugin,\n} from './definitions';\n\nconst UNKNOWN_REASON =\n 'Web implementation is a compatibility shim. Native Android/iOS implementations provide full WebView checks.';\n\nexport class WebviewVersionCheckerWeb extends WebPlugin implements WebviewVersionCheckerPlugin {\n private monitoring = false;\n private checkOnResume = true;\n private autoPromptOnOutdated = false;\n private lastStatus: WebViewVersionStatus | null = null;\n\n async check(options: CheckWebViewOptions = {}): Promise<WebViewVersionStatus> {\n const currentVersion = this.detectCurrentVersion();\n const currentMajorVersion = this.parseMajorVersion(currentVersion);\n const latestVersion = options.latestVersion;\n const latestMajorVersion = this.parseMajorVersion(latestVersion);\n\n let state: WebViewVersionState = 'unknown';\n let reason = UNKNOWN_REASON;\n\n if (latestVersion && currentVersion) {\n const cmp = this.compareVersions(currentVersion, latestVersion);\n state = cmp >= 0 ? 'latest' : 'outdated';\n reason = cmp >= 0 ? 'Current browser engine is at or above the requested latest version.' : 'Current browser engine is below the requested latest version.';\n } else if (typeof options.minimumMajorVersion === 'number' && typeof currentMajorVersion === 'number') {\n state = currentMajorVersion >= options.minimumMajorVersion ? 'latest' : 'outdated';\n reason = state === 'latest' ? 'Current browser engine major version meets the minimum requirement.' : 'Current browser engine major version is below the minimum requirement.';\n }\n\n const status: WebViewVersionStatus = {\n platform: 'web',\n state,\n isLatest: state === 'latest',\n checkedAt: new Date().toISOString(),\n reason,\n currentVersion,\n currentMajorVersion,\n latestVersion,\n latestMajorVersion,\n updateUrl: options.updateUrl,\n source: options.source ?? 'web-shim',\n };\n\n this.lastStatus = status;\n this.notifyListeners('statusChanged', status);\n if (state === 'latest') {\n this.notifyListeners('webViewLatest', status);\n } else if (state === 'outdated') {\n this.notifyListeners('webViewOutdated', status);\n if (options.showPromptOnOutdated || this.autoPromptOnOutdated) {\n await this.showUpdatePrompt({ updateUrl: status.updateUrl });\n }\n }\n\n return status;\n }\n\n async startMonitoring(options: StartMonitoringOptions = {}): Promise<MonitoringStateResult> {\n this.monitoring = true;\n this.checkOnResume = options.checkOnResume ?? true;\n this.autoPromptOnOutdated = options.autoPromptOnOutdated ?? false;\n\n if (options.checkOnStart ?? true) {\n await this.check({ ...options, source: options.source ?? 'startMonitoring' });\n }\n\n return {\n monitoring: this.monitoring,\n checkOnResume: this.checkOnResume,\n autoPromptOnOutdated: this.autoPromptOnOutdated,\n };\n }\n\n async stopMonitoring(): Promise<MonitoringStateResult> {\n this.monitoring = false;\n return {\n monitoring: this.monitoring,\n checkOnResume: this.checkOnResume,\n autoPromptOnOutdated: this.autoPromptOnOutdated,\n };\n }\n\n async getLastStatus(): Promise<LastStatusResult> {\n return {\n status: this.lastStatus,\n };\n }\n\n async showUpdatePrompt(options: ShowUpdatePromptOptions = {}): Promise<ShowUpdatePromptResult> {\n const url = options.updateUrl ?? this.lastStatus?.updateUrl;\n\n if (!url) {\n return {\n shown: false,\n openedUpdatePage: false,\n };\n }\n\n const opened = this.openUrl(url);\n\n return {\n shown: true,\n openedUpdatePage: opened,\n };\n }\n\n async openUpdatePage(options: OpenUpdatePageOptions = {}): Promise<OpenUpdatePageResult> {\n const url = options.updateUrl ?? this.lastStatus?.updateUrl ?? '';\n if (!url) {\n return {\n opened: false,\n url,\n };\n }\n\n return {\n opened: this.openUrl(url),\n url,\n };\n }\n\n private detectCurrentVersion(): string {\n const chromiumMatch = navigator.userAgent.match(/Chrome\\/([\\d.]+)/i);\n if (chromiumMatch && chromiumMatch[1]) {\n return chromiumMatch[1];\n }\n\n const appleWebKitMatch = navigator.userAgent.match(/AppleWebKit\\/([\\d.]+)/i);\n if (appleWebKitMatch && appleWebKitMatch[1]) {\n return appleWebKitMatch[1];\n }\n\n return navigator.userAgent;\n }\n\n private openUrl(url: string): boolean {\n try {\n window.open(url, '_blank', 'noopener,noreferrer');\n return true;\n } catch {\n return false;\n }\n }\n\n private parseMajorVersion(version?: string): number | undefined {\n if (!version) {\n return undefined;\n }\n\n const match = version.match(/(\\d+)/);\n if (!match) {\n return undefined;\n }\n\n const major = Number.parseInt(match[1], 10);\n return Number.isFinite(major) ? major : undefined;\n }\n\n private compareVersions(left: string, right: string): number {\n const leftParts = left.split(/[^0-9]+/).filter(Boolean).map((part) => Number.parseInt(part, 10));\n const rightParts = right.split(/[^0-9]+/).filter(Boolean).map((part) => Number.parseInt(part, 10));\n const maxLength = Math.max(leftParts.length, rightParts.length);\n\n for (let i = 0; i < maxLength; i += 1) {\n const a = leftParts[i] ?? 0;\n const b = rightParts[i] ?? 0;\n if (a > b) {\n return 1;\n }\n if (a < b) {\n return -1;\n }\n }\n\n return 0;\n }\n}\n"]}
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport type {\n CheckWebViewOptions,\n LastStatusResult,\n MonitoringStateResult,\n OpenUpdatePageOptions,\n OpenUpdatePageResult,\n ShowUpdatePromptOptions,\n ShowUpdatePromptResult,\n StartMonitoringOptions,\n WebViewVersionState,\n WebViewVersionStatus,\n WebviewVersionCheckerPlugin,\n} from './definitions';\nimport { DEFAULT_VERSION_SHARE_BY_MAJOR, DEFAULT_VERSION_SHARE_DATA_SOURCE } from './generated-version-share';\n\nconst UNKNOWN_REASON =\n 'Web implementation is a compatibility shim. Native Android/iOS implementations provide full WebView checks.';\n\nexport class WebviewVersionCheckerWeb extends WebPlugin implements WebviewVersionCheckerPlugin {\n private monitoring = false;\n private checkOnResume = true;\n private autoPromptOnOutdated = false;\n private lastStatus: WebViewVersionStatus | null = null;\n\n async check(options: CheckWebViewOptions = {}): Promise<WebViewVersionStatus> {\n const currentVersion = this.detectCurrentVersion();\n const currentMajorVersion = this.parseMajorVersion(currentVersion);\n const latestVersion = options.latestVersion;\n const latestMajorVersion = this.parseMajorVersion(latestVersion);\n const minimumDeviceSharePercent = this.normalizePercent(options.minimumDeviceSharePercent ?? 3);\n const normalizedInlineVersionShareByMajor = this.normalizeVersionShareByMajor(options.versionShareByMajor);\n const normalizedGeneratedVersionShareByMajor = this.normalizeVersionShareByMajor(DEFAULT_VERSION_SHARE_BY_MAJOR);\n const normalizedVersionShareByMajor = normalizedInlineVersionShareByMajor ?? normalizedGeneratedVersionShareByMajor;\n const versionShareSource = normalizedInlineVersionShareByMajor\n ? 'versionShareByMajor'\n : DEFAULT_VERSION_SHARE_DATA_SOURCE;\n const currentVersionSharePercent = this.resolveCurrentVersionSharePercent(\n currentMajorVersion,\n normalizedVersionShareByMajor,\n );\n let deviceShareError: string | undefined;\n\n let state: WebViewVersionState = 'unknown';\n let reason = UNKNOWN_REASON;\n\n if (typeof minimumDeviceSharePercent === 'number') {\n if (typeof currentVersionSharePercent === 'number') {\n state = currentVersionSharePercent >= minimumDeviceSharePercent ? 'latest' : 'outdated';\n reason =\n state === 'latest'\n ? 'Current browser engine major version meets the configured device-share threshold.'\n : 'Current browser engine major version is below the configured device-share threshold.';\n } else if (!normalizedVersionShareByMajor && options.versionShareApiUrl) {\n deviceShareError =\n 'Web shim does not fetch version-share API data. Provide versionShareByMajor to evaluate minimumDeviceSharePercent.';\n } else if (!normalizedVersionShareByMajor) {\n deviceShareError = 'minimumDeviceSharePercent is set, but no versionShareByMajor dataset was provided.';\n } else {\n deviceShareError = 'No device-share entry was found for the current browser engine major version.';\n }\n }\n\n if (state === 'unknown' && latestVersion && currentVersion) {\n const cmp = this.compareVersions(currentVersion, latestVersion);\n state = cmp >= 0 ? 'latest' : 'outdated';\n reason =\n cmp >= 0\n ? 'Current browser engine is at or above the requested latest version.'\n : 'Current browser engine is below the requested latest version.';\n } else if (\n state === 'unknown' &&\n typeof options.minimumMajorVersion === 'number' &&\n typeof currentMajorVersion === 'number'\n ) {\n state = currentMajorVersion >= options.minimumMajorVersion ? 'latest' : 'outdated';\n reason =\n state === 'latest'\n ? 'Current browser engine major version meets the minimum requirement.'\n : 'Current browser engine major version is below the minimum requirement.';\n } else if (state === 'unknown' && deviceShareError) {\n reason = deviceShareError;\n }\n\n const status: WebViewVersionStatus = {\n platform: 'web',\n state,\n isLatest: state === 'latest',\n checkedAt: new Date().toISOString(),\n reason,\n currentVersion,\n currentMajorVersion,\n latestVersion,\n latestMajorVersion,\n currentVersionSharePercent,\n minimumDeviceSharePercent,\n versionShareSource: normalizedVersionShareByMajor ? versionShareSource : undefined,\n deviceShareError,\n updateUrl: options.updateUrl,\n source: options.source ?? 'web-shim',\n };\n\n this.lastStatus = status;\n this.notifyListeners('statusChanged', status);\n if (state === 'latest') {\n this.notifyListeners('webViewLatest', status);\n } else if (state === 'outdated') {\n this.notifyListeners('webViewOutdated', status);\n if (options.showPromptOnOutdated || this.autoPromptOnOutdated) {\n await this.showUpdatePrompt({ updateUrl: status.updateUrl });\n }\n }\n\n return status;\n }\n\n async startMonitoring(options: StartMonitoringOptions = {}): Promise<MonitoringStateResult> {\n this.monitoring = true;\n this.checkOnResume = options.checkOnResume ?? true;\n this.autoPromptOnOutdated = options.autoPromptOnOutdated ?? false;\n\n if (options.checkOnStart ?? true) {\n await this.check({ ...options, source: options.source ?? 'startMonitoring' });\n }\n\n return {\n monitoring: this.monitoring,\n checkOnResume: this.checkOnResume,\n autoPromptOnOutdated: this.autoPromptOnOutdated,\n };\n }\n\n async stopMonitoring(): Promise<MonitoringStateResult> {\n this.monitoring = false;\n return {\n monitoring: this.monitoring,\n checkOnResume: this.checkOnResume,\n autoPromptOnOutdated: this.autoPromptOnOutdated,\n };\n }\n\n async getLastStatus(): Promise<LastStatusResult> {\n return {\n status: this.lastStatus,\n };\n }\n\n async showUpdatePrompt(options: ShowUpdatePromptOptions = {}): Promise<ShowUpdatePromptResult> {\n const url = options.updateUrl ?? this.lastStatus?.updateUrl;\n\n if (!url) {\n return {\n shown: false,\n openedUpdatePage: false,\n };\n }\n\n const opened = this.openUrl(url);\n\n return {\n shown: true,\n openedUpdatePage: opened,\n };\n }\n\n async openUpdatePage(options: OpenUpdatePageOptions = {}): Promise<OpenUpdatePageResult> {\n const url = options.updateUrl ?? this.lastStatus?.updateUrl ?? '';\n if (!url) {\n return {\n opened: false,\n url,\n };\n }\n\n return {\n opened: this.openUrl(url),\n url,\n };\n }\n\n private detectCurrentVersion(): string {\n const chromiumMatch = navigator.userAgent.match(/Chrome\\/([\\d.]+)/i);\n if (chromiumMatch?.[1]) {\n return chromiumMatch[1];\n }\n\n const appleWebKitMatch = navigator.userAgent.match(/AppleWebKit\\/([\\d.]+)/i);\n if (appleWebKitMatch?.[1]) {\n return appleWebKitMatch[1];\n }\n\n return navigator.userAgent;\n }\n\n private openUrl(url: string): boolean {\n try {\n window.open(url, '_blank', 'noopener,noreferrer');\n return true;\n } catch {\n return false;\n }\n }\n\n private parseMajorVersion(version?: string): number | undefined {\n if (!version) {\n return undefined;\n }\n\n const match = version.match(/(\\d+)/);\n if (!match) {\n return undefined;\n }\n\n const major = Number.parseInt(match[1], 10);\n return Number.isFinite(major) ? major : undefined;\n }\n\n private compareVersions(left: string, right: string): number {\n const leftParts = left\n .split(/[^0-9]+/)\n .filter(Boolean)\n .map((part) => Number.parseInt(part, 10));\n const rightParts = right\n .split(/[^0-9]+/)\n .filter(Boolean)\n .map((part) => Number.parseInt(part, 10));\n const maxLength = Math.max(leftParts.length, rightParts.length);\n\n for (let i = 0; i < maxLength; i += 1) {\n const a = leftParts[i] ?? 0;\n const b = rightParts[i] ?? 0;\n if (a > b) {\n return 1;\n }\n if (a < b) {\n return -1;\n }\n }\n\n return 0;\n }\n\n private normalizePercent(value?: number): number | undefined {\n if (typeof value !== 'number' || Number.isNaN(value) || !Number.isFinite(value)) {\n return undefined;\n }\n return Math.min(100, Math.max(0, value));\n }\n\n private normalizeVersionShareByMajor(shareByMajor?: Record<string, number>): Record<number, number> | undefined {\n if (!shareByMajor) {\n return undefined;\n }\n\n const normalized: Record<number, number> = {};\n for (const [rawKey, rawShare] of Object.entries(shareByMajor)) {\n const major = this.parseMajorVersion(rawKey);\n const share = this.normalizePercent(rawShare);\n if (typeof major === 'number' && typeof share === 'number') {\n normalized[major] = share;\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n }\n\n private resolveCurrentVersionSharePercent(\n currentMajorVersion: number | undefined,\n normalizedShareByMajor: Record<number, number> | undefined,\n ): number | undefined {\n if (typeof currentMajorVersion !== 'number' || !normalizedShareByMajor) {\n return undefined;\n }\n\n return normalizedShareByMajor[currentMajorVersion];\n }\n}\n"]}