@onside/install-widget 1.0.1 → 1.0.3

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.
@@ -0,0 +1,279 @@
1
+ import { c as J, b as Q, g as Z, a as ee, s as te } from "./installUrlService-CrJfYPwM.js";
2
+ const l = {
3
+ IOS: /iPhone|iPad|iPod/i,
4
+ IPAD: /iPad/i,
5
+ ANDROID: /Android/i,
6
+ INTEL_MAC: /Intel Mac/i
7
+ }, r = {
8
+ IOS_CHROME: /CriOS/i,
9
+ IOS_FIREFOX: /FxiOS/i,
10
+ IOS_EDGE: /EdgiOS/i,
11
+ IOS_OPERA: /OPiOS/i,
12
+ IOS_OPERA_NEW: /OPT\//i,
13
+ IOS_BRAVE: /Brave\//i,
14
+ IOS_DUCKDUCKGO: /Ddg\//i,
15
+ IOS_DUCKDUCKGO_ALT: /DuckDuckGo\//i,
16
+ IOS_GOOGLE_APP: /GSA/i,
17
+ SAFARI: /Safari/i,
18
+ CHROME: /Chrome|CriOS/i,
19
+ FIREFOX: /Firefox|FxiOS/i,
20
+ EDGE: /Edge|Edg/i,
21
+ OPERA: /Opera|OPiOS|OPT\/|OPR\/|OPX\//i
22
+ }, _ = {
23
+ WEBKIT: /AppleWebKit|WebKit/i,
24
+ BLINK: /Chrome|Chromium|Edg|OPR\/|SamsungBrowser|YaBrowser/i,
25
+ GECKO: /Gecko\/\d|Firefox/i
26
+ }, c = {
27
+ IOS_VERSION: /Version\/(\d+[_.\d]*)/,
28
+ IOS_OS: /(?:iPhone|iPad|iPod).*?OS (\d+[_.\d]*)/i,
29
+ IOS_APP: /(?:iOS|iPadOS)\/(\d+[_.\d]*)/i,
30
+ ANDROID_VERSION: /Android\s+(\d+[.\d]*)/,
31
+ MACOS_VERSION: /Mac OS X (\d+[_.\d]*)/i
32
+ }, u = {
33
+ MOBILE: /Mobile/i,
34
+ ANDROID_TABLET_KEYWORDS: /Tablet|SM-T|SM-P|GT-P|SCH-I|SCH-T/i
35
+ }, a = {
36
+ IOS_INSTAGRAM: /\bInstagram\b/i,
37
+ IOS_FACEBOOK: /\bFBAN\/FBIOS\b|\bFBAV\b/i,
38
+ IOS_LINKEDIN: /LinkedInApp/i,
39
+ IOS_LINKEDIN_ALT: /LinkedIn\/\d/i,
40
+ IOS_DISCORD: /\bDiscord\b/i,
41
+ IOS_TWITTER: /Twitter for iPhone/i,
42
+ IOS_TIKTOK: /\bTikTok\b/i,
43
+ IOS_TIKTOK_ALT: /zhiliaoapp\.musically|musically\/\d/i,
44
+ IOS_TELEGRAM: /\bTelegram\b/i,
45
+ IOS_WECHAT: /\bMicroMessenger\b/i,
46
+ IOS_LINE: /\bLine\/\d/i
47
+ }, w = [
48
+ { detail: "instagram", pattern: a.IOS_INSTAGRAM },
49
+ { detail: "facebook", pattern: a.IOS_FACEBOOK },
50
+ { detail: "linkedin", pattern: a.IOS_LINKEDIN },
51
+ { detail: "linkedin", pattern: a.IOS_LINKEDIN_ALT },
52
+ { detail: "discord", pattern: a.IOS_DISCORD },
53
+ { detail: "twitter", pattern: a.IOS_TWITTER },
54
+ { detail: "tiktok", pattern: a.IOS_TIKTOK },
55
+ { detail: "tiktok", pattern: a.IOS_TIKTOK_ALT },
56
+ { detail: "telegram", pattern: a.IOS_TELEGRAM },
57
+ { detail: "wechat", pattern: a.IOS_WECHAT },
58
+ { detail: "line", pattern: a.IOS_LINE }
59
+ ], h = 768, b = () => "ontouchstart" in window || window.navigator?.maxTouchPoints > 0 || // @ts-expect-error - msMaxTouchPoints exists in some browsers
60
+ window.navigator?.msMaxTouchPoints > 0, k = () => window.navigator.userAgent, L = (e) => {
61
+ if (l.IOS.test(e)) {
62
+ const i = l.IPAD.test(e);
63
+ return {
64
+ platform: "ios",
65
+ isMobile: !i,
66
+ isTablet: i,
67
+ isDesktop: !1
68
+ };
69
+ }
70
+ if (l.ANDROID.test(e)) {
71
+ const i = u.MOBILE.test(e), n = u.ANDROID_TABLET_KEYWORDS.test(e), o = window.innerWidth, t = n || !i && o >= h;
72
+ return {
73
+ platform: "android",
74
+ isMobile: !t,
75
+ isTablet: t,
76
+ isDesktop: !1
77
+ };
78
+ }
79
+ return m(e) ? {
80
+ platform: "ios",
81
+ isMobile: !1,
82
+ isTablet: !0,
83
+ isDesktop: !1
84
+ } : r.IOS_GOOGLE_APP.test(e) ? {
85
+ platform: "ios",
86
+ isMobile: !0,
87
+ isTablet: !1,
88
+ isDesktop: !1
89
+ } : {
90
+ platform: "desktop",
91
+ isMobile: !1,
92
+ isTablet: !1,
93
+ isDesktop: !0
94
+ };
95
+ }, m = (e) => r.SAFARI.test(e) && l.INTEL_MAC.test(e) && !r.CHROME.test(e) && !r.FIREFOX.test(e) && !r.OPERA.test(e) ? b() : !1, p = () => (
96
+ // @ts-expect-error - TelegramWebviewProxy may exist
97
+ typeof window?.TelegramWebviewProxy < "u"
98
+ ), g = (e) => {
99
+ for (const i of w)
100
+ if (i.pattern.test(e))
101
+ return i.detail;
102
+ }, M = (e, i) => {
103
+ const n = (...o) => o.some((t) => t.test(e));
104
+ return n(r.IOS_EDGE, r.EDGE) ? "edge" : n(
105
+ r.IOS_OPERA,
106
+ r.IOS_OPERA_NEW,
107
+ r.OPERA
108
+ ) ? "opera" : n(r.IOS_BRAVE) ? "brave" : n(r.IOS_DUCKDUCKGO) || n(r.IOS_DUCKDUCKGO_ALT) ? "duckduckgo" : n(r.IOS_CHROME, r.CHROME) ? "chrome" : n(r.IOS_GOOGLE_APP) ? "google" : n(r.IOS_FIREFOX, r.FIREFOX) ? "firefox" : i === "ios" && (g(e) || p()) ? "in-app" : r.SAFARI.test(e) && !r.CHROME.test(e) && !r.FIREFOX.test(e) && !r.OPERA.test(e) && !r.IOS_BRAVE.test(e) && !r.IOS_DUCKDUCKGO.test(e) && !r.IOS_DUCKDUCKGO_ALT.test(e) && !r.IOS_GOOGLE_APP.test(e) && !a.IOS_TELEGRAM.test(e) && !a.IOS_WECHAT.test(e) && !a.IOS_LINE.test(e) && !p() ? "safari" : "unknown";
109
+ }, v = (e, i) => {
110
+ switch (i) {
111
+ case "chrome":
112
+ return r.IOS_CHROME.test(e) ? "crios" : "chrome";
113
+ case "firefox":
114
+ return r.IOS_FIREFOX.test(e) ? "fxios" : "firefox";
115
+ case "edge":
116
+ return r.IOS_EDGE.test(e) ? "edgios" : "edge";
117
+ case "opera":
118
+ return r.IOS_OPERA_NEW.test(e) ? "opt" : r.IOS_OPERA.test(e) ? "opios" : "opera";
119
+ case "duckduckgo":
120
+ return "duckduckgo";
121
+ case "google":
122
+ return "gsa";
123
+ case "safari":
124
+ return "safari";
125
+ case "in-app":
126
+ return a.IOS_TELEGRAM.test(e) || p() ? "telegram" : g(e);
127
+ default:
128
+ return;
129
+ }
130
+ }, C = (e, i, n) => i === "ios" ? "webkit" : n === "firefox" && !r.IOS_FIREFOX.test(e) ? "gecko" : n === "chrome" || n === "edge" || n === "opera" || n === "brave" || n === "google" ? "blink" : n === "safari" ? "webkit" : _.GECKO.test(e) && !/like Gecko/i.test(e) ? "gecko" : _.BLINK.test(e) ? "blink" : _.WEBKIT.test(e) ? "webkit" : "unknown", F = (e, i) => {
131
+ if (i.platform === "ios")
132
+ return m(e) || l.IPAD.test(e) || /Apple\/iPad|iPad\d/i.test(e) ? "ipad" : /iPhone|Apple\/iPhone|iPhone\d/i.test(e) ? "iphone" : /iPod/i.test(e) ? "ipod" : "unknown";
133
+ }, K = (e, i, n) => {
134
+ const o = (t) => t.replace(/_/g, ".").split(".").filter((s) => s.length > 0).join(".");
135
+ switch (i) {
136
+ case "ios": {
137
+ let t = n === "safari" ? e.match(c.IOS_VERSION) : null;
138
+ return t || (t = e.match(c.IOS_OS)), t || (t = e.match(c.IOS_APP)), !t && n === "safari" && (t = e.match(c.IOS_VERSION)), t ? o(t[1]) : void 0;
139
+ }
140
+ case "android": {
141
+ const t = e.match(c.ANDROID_VERSION);
142
+ return t ? o(t[1]) : void 0;
143
+ }
144
+ case "desktop": {
145
+ const t = e.match(c.MACOS_VERSION);
146
+ return t ? o(t[1]) : void 0;
147
+ }
148
+ }
149
+ }, G = (e) => {
150
+ if (!e) return {};
151
+ const [i, n] = e.split("."), o = Number.parseInt(i, 10), t = Number.parseInt(n ?? "0", 10);
152
+ return {
153
+ version_major: o,
154
+ version_minor: t
155
+ };
156
+ }, B = {
157
+ platform: "unknown",
158
+ browser: "unknown",
159
+ browserEngine: "unknown",
160
+ isMobile: !1,
161
+ isTablet: !1,
162
+ isDesktop: !1,
163
+ version: void 0,
164
+ userAgent: ""
165
+ };
166
+ let E = null, A = null, T = null;
167
+ function V() {
168
+ if (typeof window > "u")
169
+ return B;
170
+ const e = k(), i = window.innerWidth;
171
+ if (E && A === e && T === i)
172
+ return E;
173
+ const n = L(e), o = M(e, n.platform), t = C(e, n.platform, o), s = v(e, o), O = F(e, n), I = K(e, n.platform, o), d = G(I), S = {
174
+ ...n,
175
+ browser: o,
176
+ browserEngine: t,
177
+ browserDetail: s,
178
+ iosDeviceClass: O,
179
+ isInAppBrowser: o === "in-app",
180
+ version: I,
181
+ ...d,
182
+ userAgent: e
183
+ };
184
+ return E = S, A = e, T = i, S;
185
+ }
186
+ const W = ".", R = (e) => e.split(W).map((i) => Number.parseInt(i, 10)).filter((i) => Number.isFinite(i) && i >= 0), f = (e, i) => {
187
+ const n = R(e), o = R(i), t = Math.max(n.length, o.length);
188
+ for (let s = 0; s < t; s += 1) {
189
+ const O = n[s] ?? 0, I = o[s] ?? 0;
190
+ if (O > I) return 1;
191
+ if (O < I) return -1;
192
+ }
193
+ return 0;
194
+ }, U = "17.6", x = "18.6", y = [
195
+ "safari",
196
+ "chrome",
197
+ "edge",
198
+ "brave",
199
+ "duckduckgo"
200
+ ], H = ({
201
+ platform: e,
202
+ isIOSDevice: i,
203
+ shouldUpdateIOS: n,
204
+ isIOSVersionSupported: o,
205
+ browserSupportsInstall: t
206
+ }) => e === "android" ? "android" : n ? "update_ios" : o && t ? "install_available" : i ? "go_to_safari" : "unsupported";
207
+ function Y(e, i = {}) {
208
+ const {
209
+ minIOSVersionForInstall: n = U,
210
+ minIOSVersionForNewSystemUI: o = x
211
+ } = i, t = e.version, s = e.platform === "ios" && (e.isMobile || e.isTablet), O = typeof t == "string", I = !!(s && O && f(t, n) >= 0), d = !!(s && O && f(t, n) < 0), S = y.includes(
212
+ e.browser
213
+ ), P = !!(s && S && !e.isInAppBrowser), D = H({
214
+ platform: e.platform,
215
+ isIOSDevice: s,
216
+ shouldUpdateIOS: d,
217
+ isIOSVersionSupported: I,
218
+ browserSupportsInstall: P
219
+ }), N = !!(s && O && f(t, o) >= 0);
220
+ return {
221
+ installState: D,
222
+ usesNewInstallFlow: N
223
+ };
224
+ }
225
+ function X() {
226
+ return typeof window > "u" ? !1 : localStorage.getItem("onside_analytics_logging") === "true";
227
+ }
228
+ function j(e, i = {}, n) {
229
+ try {
230
+ if (typeof window > "u") return null;
231
+ window.dataLayer || (window.dataLayer = []);
232
+ const o = {
233
+ ...i,
234
+ ...V()
235
+ }, t = {
236
+ event: "amplitude_event",
237
+ event_name: e,
238
+ event_properties: {
239
+ timestamp: Date.now(),
240
+ ...o
241
+ },
242
+ ...n ? { user_properties: n } : {},
243
+ url: window.location.href
244
+ };
245
+ return window.dataLayer.push({
246
+ event: t.event,
247
+ event_name: t.event_name,
248
+ event_properties: t.event_properties,
249
+ ...t.user_properties ? { user_properties: t.user_properties } : {}
250
+ }), X() && console.log("🎯 Analytics Event:", {
251
+ event_name: t.event_name,
252
+ event_properties: t.event_properties,
253
+ user_properties: t.user_properties,
254
+ url: t.url
255
+ }), t;
256
+ } catch (o) {
257
+ return console.error("Analytics error:", o), null;
258
+ }
259
+ }
260
+ function z(e, i, n, o = {}) {
261
+ const t = `${e}.${i}`, s = {
262
+ modal_name: e,
263
+ event_type: i,
264
+ ...o
265
+ };
266
+ return n && (s.action = n), j(t, s);
267
+ }
268
+ export {
269
+ f as compareVersions,
270
+ J as generateUUID,
271
+ Q as getCookie,
272
+ V as getDeviceInfo,
273
+ Z as getInstallUrl,
274
+ ee as getOnsideToken,
275
+ Y as resolveInstallConditions,
276
+ te as setCookie,
277
+ j as trackEvent,
278
+ z as trackModalEvent
279
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onside/install-widget",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "type": "module",
5
5
  "description": "Onside install button widget for partner landings",
6
6
  "keywords": [
@@ -17,6 +17,11 @@
17
17
  "sync:cdn-manifest": "node scripts/sync-cdn-manifest.mjs",
18
18
  "build": "tsc -b && vite build",
19
19
  "build:lib": "tsc -b && vite build --config vite.config.lib.ts",
20
+ "test": "pnpm run test:unit && pnpm run test:e2e",
21
+ "test:unit": "vitest run",
22
+ "test:unit:watch": "vitest",
23
+ "test:e2e": "playwright test",
24
+ "bundle:check": "node scripts/check-bundle-size.mjs",
20
25
  "pack:check": "HUSKY=0 npm pack --dry-run --json --ignore-scripts --cache /tmp/npm-cache",
21
26
  "prepublishOnly": "pnpm run build:lib",
22
27
  "lint": "eslint .",
@@ -36,6 +41,16 @@
36
41
  "import": "./dist-lib/install-package.js",
37
42
  "require": "./dist-lib/install-package.cjs"
38
43
  },
44
+ "./hooks": {
45
+ "types": "./dist-lib/hooks.d.ts",
46
+ "import": "./dist-lib/hooks.js",
47
+ "require": "./dist-lib/hooks.cjs"
48
+ },
49
+ "./utils": {
50
+ "types": "./dist-lib/utils.d.ts",
51
+ "import": "./dist-lib/utils.js",
52
+ "require": "./dist-lib/utils.cjs"
53
+ },
39
54
  "./styles.css": "./dist-lib/install-widget.css"
40
55
  },
41
56
  "files": [
@@ -51,11 +66,15 @@
51
66
  "devDependencies": {
52
67
  "@changesets/cli": "^2.29.8",
53
68
  "@eslint/js": "^9.39.2",
69
+ "@playwright/test": "^1.58.2",
54
70
  "@radix-ui/react-dialog": "^1.1.15",
71
+ "@testing-library/jest-dom": "^6.9.1",
72
+ "@testing-library/react": "^16.3.2",
55
73
  "@types/node": "^24.0.10",
56
74
  "@types/react": "^19.1.8",
57
75
  "@types/react-dom": "^19.1.6",
58
76
  "@vitejs/plugin-react": "^5.1.4",
77
+ "@vitest/coverage-v8": "^4.0.18",
59
78
  "autoprefixer": "^10.4.21",
60
79
  "clsx": "^2.1.1",
61
80
  "eslint": "^9.39.2",
@@ -63,6 +82,7 @@
63
82
  "eslint-plugin-react-refresh": "^0.4.26",
64
83
  "globals": "^15.15.0",
65
84
  "husky": "^9.1.7",
85
+ "jsdom": "^28.0.0",
66
86
  "lint-staged": "^16.2.7",
67
87
  "postcss": "^8.5.6",
68
88
  "prettier": "^3.6.2",
@@ -77,7 +97,8 @@
77
97
  "typescript-eslint": "^8.46.3",
78
98
  "vite": "^7.3.1",
79
99
  "vite-plugin-dts": "^4.5.4",
80
- "vite-plugin-svgr": "^4.3.0"
100
+ "vite-plugin-svgr": "^4.3.0",
101
+ "vitest": "^4.0.18"
81
102
  },
82
103
  "packageManager": "pnpm@10.15.0+sha512.486ebc259d3e999a4e8691ce03b5cac4a71cbeca39372a9b762cb500cfdf0873e2cb16abe3d951b1ee2cf012503f027b98b6584e4df22524e0c7450d9ec7aa7b"
83
104
  }