@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.
- package/README.md +13 -0
- package/dist-lib/AndroidPlatformModal-2Ykjo2V7.js +48 -0
- package/dist-lib/AndroidPlatformModal-DTglyxUG.cjs +1 -0
- package/dist-lib/Dialog-yEP-7Deb.js +1399 -0
- package/dist-lib/Dialog-yZ9bWtK1.cjs +45 -0
- package/dist-lib/GoToSafariModal-C_KBizh8.js +86 -0
- package/dist-lib/GoToSafariModal-Cgx0X0rg.cjs +1 -0
- package/dist-lib/UpdateIOSModal-BGWvssyd.js +170 -0
- package/dist-lib/UpdateIOSModal-CE-d3YCr.cjs +1 -0
- package/dist-lib/hooks.cjs +1 -0
- package/dist-lib/hooks.d.ts +45 -0
- package/dist-lib/hooks.js +5 -0
- package/dist-lib/install-package-B17QfMPy.cjs +1 -0
- package/dist-lib/install-package-DowlG4hO.js +3036 -0
- package/dist-lib/install-package.cjs +1 -45
- package/dist-lib/install-package.d.ts +106 -1
- package/dist-lib/install-package.js +21 -5012
- package/dist-lib/install-widget.css +1 -1
- package/dist-lib/installUrlService-AjG03i8i.cjs +1 -0
- package/dist-lib/installUrlService-CrJfYPwM.js +95 -0
- package/dist-lib/useInstallUrl-CjUspi0p.cjs +1 -0
- package/dist-lib/useInstallUrl-JIdkWpgj.js +87 -0
- package/dist-lib/utils.cjs +1 -0
- package/dist-lib/utils.d.ts +93 -0
- package/dist-lib/utils.js +279 -0
- package/package.json +23 -2
|
@@ -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.
|
|
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
|
}
|