aesirx-analytics 1.2.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,34 @@
1
+ // src/utils/AnalyticsContextProvider.tsx
2
+ import React, { useState } from "react";
3
+ var AnalyticsContext = React.createContext({
4
+ event_uuid: void 0,
5
+ visitor_uuid: void 0,
6
+ setEventID: void 0,
7
+ setUUID: void 0
8
+ });
9
+ var AnalyticsContextProvider = ({ children }) => {
10
+ const [eventID, setEventID] = useState();
11
+ const [UUID, setUUID] = useState();
12
+ return /* @__PURE__ */ React.createElement(
13
+ AnalyticsContext.Provider,
14
+ {
15
+ value: {
16
+ event_uuid: eventID,
17
+ visitor_uuid: UUID,
18
+ setEventID,
19
+ setUUID
20
+ }
21
+ },
22
+ children
23
+ );
24
+ };
25
+ var AnalyticsContextProvider_default = AnalyticsContextProvider;
26
+
27
+ export {
28
+ AnalyticsContext,
29
+ AnalyticsContextProvider_default
30
+ };
31
+ /*
32
+ * @copyright Copyright (C) 2022 AesirX. All rights reserved.
33
+ * @license GNU General Public License version 3, see LICENSE.
34
+ */
package/dist/index.d.ts CHANGED
@@ -19,15 +19,13 @@ interface AnalyticsReact {
19
19
  }
20
20
  declare const AnalyticsReact: ({ location, history, children }: AnalyticsReact) => React.JSX.Element;
21
21
 
22
- declare const trackEvent: (endpoint: string, visitor_uuid: string, referer?: string, data?: object) => Promise<boolean>;
22
+ declare const trackEvent: (endpoint: string, referer?: string, data?: object) => Promise<boolean>;
23
23
 
24
24
  interface AnalyticsContextType {
25
+ event_uuid: string;
25
26
  visitor_uuid: string;
26
- event_uuid_start: string;
27
- visitor_uuid_start: string;
27
+ setEventID: Dispatch<SetStateAction<string>>;
28
28
  setUUID: Dispatch<SetStateAction<string>>;
29
- setEventIDStart: Dispatch<SetStateAction<string>>;
30
- setUUIDStart: Dispatch<SetStateAction<string>>;
31
29
  }
32
30
  declare const AnalyticsContext: React.Context<AnalyticsContextType>;
33
31
 
package/dist/index.js CHANGED
@@ -1 +1,276 @@
1
- import{AnalyticsContext as t,AnalyticsContextProvider_default as i}from"./chunk-D75AKWUD.js";import e,{Suspense as r}from"react";import o,{useCallback as s,useEffect as n,useState as a}from"react";var u=async(t,i)=>{const e=await fetch(t,{method:"POST",body:JSON.stringify(i),headers:(r={"Content-Type":"application/json"},o={"x-tracker-cache":void 0},Object.keys(o).forEach((t=>{void 0!==o[t]&&(r[t]=o[t])})),r)});var r,o;const s=await e.json();if(s.error)throw s.error;return s};import c from"bowser";var d=(t,i)=>`${t}/visitor/v1/${i}`,_=async(t,i,e,r)=>{const{document:o}=window,{pathname:s,search:n,origin:a}=location;i=`${a}${s}${n}`,e=o.referrer,r=window.navigator.userAgent;const _=c.parse(window.navigator.userAgent),l=_?.browser?.name,v=_?.browser?.version??"0",w=window.navigator.userLanguage||window.navigator.language,m=_?.platform?.model??_?.platform?.type,h=location?.host?.replace(/^www\./,""),p=window.location.search,f=new URLSearchParams(p),g=[];for(const t of f.keys())t.startsWith("utm_")&&f.get(t)&&g.push({name:t,value:f.get(t)});if(!f.get("visitor_uuid")){const o="";try{return await u(d(t,"init"),{url:i,referer:e,user_agent:r,ip:o,domain:h,browser_name:l,browser_version:v,lang:w,device:m,event_name:"visit",event_type:"action",attributes:g})}catch(t){}}},l=async(t,i,e)=>{if("0"===localStorage.getItem("aesirx-analytics-allow"))return null;const{location:r,document:o}=window,{pathname:s,origin:n}=r;e=e?r.protocol+"//"+r.host+e:o.referrer?f("visitor_uuid",o.referrer):`${n}${s}`;const a=r.protocol+"//"+r.host+r.pathname,c=window.location.search,_=new URLSearchParams(c);return await u(d(t,"start"),{..._.get("visitor_uuid")&&{visitor_uuid:_.get("visitor_uuid")},...i&&{visitor_uuid:i},referer:"/"===e?"":e,url:a})},v=async(t,i,e,r)=>{if("0"===localStorage.getItem("aesirx-analytics-allow"))return null;const{location:o,document:s}=window;e=e?o.protocol+"//"+o.host+e:s.referrer.split("?")[0];const n=o.protocol+"//"+o.host+o.pathname,a=window.location.search,u=new URLSearchParams(a),c={...u.get("visitor_uuid")&&{visitor_uuid:u.get("visitor_uuid")},...i&&{visitor_uuid:i},referer:"/"===e?"":e,url:n,...r},_=new Blob([JSON.stringify(c)],{type:"application/json"});return navigator.sendBeacon(d(t,"start"),_)},w=(t,i=window.location.href)=>{if(i){return new URL(i).searchParams.get(t)}},m=t=>{const i=document.getElementsByTagName("a");for(let e=0;e<i.length;e++){const r=w("visitor_uuid",i[e].href);if(i[e].href){const o=new URL(i[e].href);!r&&t&&o.searchParams.append("visitor_uuid",t),i[e].href=o.href}}},h=(t,i,e)=>{if(i&&e){const r={event_uuid:i,visitor_uuid:e},o={type:"application/json"},s=new Blob([JSON.stringify(r)],o);navigator.sendBeacon(d(t,"end"),s)}},p=t=>{document.addEventListener("visibilitychange",(async()=>{if("hidden"===document.visibilityState&&h(t,window.event_uuid_start,window.visitor_uuid_start),"visible"===document.visibilityState){if(new URLSearchParams(window.location.search).get("visitor_uuid")||window.visitor_uuid){const i=await l(t,window.visitor_uuid,window.referer);window.event_uuid_start=i?.event_uuid}}})),window.addEventListener("pagehide",(i=>{i.persisted&&h(t,window.event_uuid_start,window.visitor_uuid_start)}),!1)};function f(t,i){let e,r=i.split("?")[0],o=[];const s=-1!==i.indexOf("?")?i.split("?")[1]:"";if(""!==s){o=s.split("&");for(let i=o.length-1;i>=0;i-=1)e=o[i].split("=")[0],e===t&&o.splice(i,1);o.length&&(r=r+"?"+o.join("&"))}return r}var g=({router:i,children:e})=>{const r=o.useContext(t),u=process.env.NEXT_PUBLIC_ENDPOINT_ANALYTICS_URL,[c,d]=a(""),v=s((async t=>{const i=t||"";window.referer=i;const e=await l(u,r.visitor_uuid,i);e?.event_uuid&&r.setEventIDStart(e.event_uuid),e?.visitor_uuid&&r.setUUIDStart(e.visitor_uuid)}),[r,u]);return n((()=>{(async()=>{const t=new URLSearchParams(window.location.search).get("visitor_uuid");if(r.visitor_uuid)await v(f("visitor_uuid",i.asPath));else if(t)r.setUUID(t);else{const t=await _(u);t?.visitor_uuid&&r.setUUID(t?.visitor_uuid)}})()}),[r.visitor_uuid]),n((()=>{const t=async()=>{const{visitor_uuid:t}=i.query;t&&d(f("visitor_uuid",i.asPath)),r.visitor_uuid_start&&!t&&(h(u,window.event_uuid_start,r.visitor_uuid_start),await v(c))};i.events.on("routeChangeComplete",t);const e=new URLSearchParams(window.location.search),o=e.get("visitor_uuid"),s=e.get("state"),n=e.get("code");return o||s||n||r.visitor_uuid&&(i.asPath.includes("?")?Object.keys(i.query).length&&i.replace({query:{...i.query,visitor_uuid:r.visitor_uuid}},void 0,{shallow:!0}):i.replace({query:{...i.query,visitor_uuid:r.visitor_uuid}},void 0,{shallow:!0})),o&&m(o),()=>{i.events.off("routeChangeComplete",t)}}),[i.events,r.visitor_uuid,i.asPath,i.query]),n((()=>{(async()=>{p(u)})()}),[]),n((()=>{(async()=>{window.visitor_uuid=r.visitor_uuid,window.event_uuid_start=r.event_uuid_start,window.visitor_uuid_start=r.visitor_uuid_start})()}),[r.event_uuid_start,r.visitor_uuid_start]),o.createElement(o.Fragment,null,e)},y=e.lazy((()=>import("./Consent-4MLNPIUE.js"))),E=({router:t,children:o})=>e.createElement(e.Fragment,null,e.createElement(i,null,e.createElement(g,{router:t},o,e.createElement(r,{fallback:e.createElement(e.Fragment,null)},e.createElement(y,{endpoint:process.env.NEXT_PUBLIC_ENDPOINT_ANALYTICS_URL})))));import U,{Suspense as P}from"react";import S,{useEffect as L,useState as I}from"react";import N from"query-string";var b=({location:i,history:e,children:r})=>{const o=S.useContext(t),s=process.env.REACT_APP_ENDPOINT_ANALYTICS_URL,[n,a]=I(i.pathname);return L((()=>{(async()=>{if(o.visitor_uuid_start&&h(s,window.event_uuid_start,o.visitor_uuid_start),o.visitor_uuid){const t={...N.parse(i.search),visitor_uuid:o.visitor_uuid};e.replace({search:N.stringify(t)});const r=n||"";window.referer=r;const u=await l(s,o.visitor_uuid,r);u.event_uuid&&o.setEventIDStart(u.event_uuid),u.visitor_uuid&&o.setUUIDStart(u.visitor_uuid),a(i.pathname),m(o.visitor_uuid)}else{const t=new URLSearchParams(window.location.search).get("visitor_uuid");if(t)o.setUUID(t);else{const t=await _(s);t.visitor_uuid&&o.setUUID(t.visitor_uuid);const r={...N.parse(i.search),visitor_uuid:t.visitor_uuid};e.replace({search:N.stringify(r)})}}})()}),[i.pathname,o.visitor_uuid,e]),L((()=>{(async()=>{p(s)})()}),[]),L((()=>{(async()=>{window.visitor_uuid=o.visitor_uuid,window.event_uuid_start=o.event_uuid_start,window.visitor_uuid_start=o.visitor_uuid_start})()}),[o.visitor_uuid,o.event_uuid_start,o.visitor_uuid_start]),S.createElement(S.Fragment,null,r)},A=U.lazy((()=>import("./Consent-4MLNPIUE.js"))),C=({location:t,history:e,children:r})=>U.createElement(i,null,U.createElement(b,{location:t,history:e},r,U.createElement(P,{fallback:U.createElement(U.Fragment,null)},U.createElement(A,{endpoint:process.env.REACT_APP_ENDPOINT_ANALYTICS_URL}))));export{t as AnalyticsContext,E as AnalyticsNext,C as AnalyticsReact,v as trackEvent};
1
+ import {
2
+ AnalyticsContext,
3
+ AnalyticsContextProvider_default
4
+ } from "./chunk-JQ6CXYV4.js";
5
+
6
+ // src/AnalyticsNext/index.tsx
7
+ import React2 from "react";
8
+
9
+ // src/AnalyticsNext/handle.tsx
10
+ import React, { useCallback, useEffect, useState } from "react";
11
+
12
+ // src/utils/services.ts
13
+ var cache;
14
+ var assign = (a, b) => {
15
+ Object.keys(b).forEach((key) => {
16
+ if (b[key] !== void 0)
17
+ a[key] = b[key];
18
+ });
19
+ return a;
20
+ };
21
+ var trackerService = async (endpoint, payload) => {
22
+ const fetchData = await fetch(endpoint, {
23
+ method: "POST",
24
+ body: JSON.stringify(payload),
25
+ headers: assign({ "Content-Type": "application/json" }, { ["x-tracker-cache"]: cache })
26
+ });
27
+ const response = await fetchData.json();
28
+ if (response.error) {
29
+ throw response.error;
30
+ } else {
31
+ return response;
32
+ }
33
+ };
34
+
35
+ // src/utils/index.ts
36
+ import Bowser from "bowser";
37
+ import * as FingerprintJS from "@fingerprintjs/fingerprintjs";
38
+ var createRequest = (endpoint, task) => {
39
+ return `${endpoint}/visitor/v1/${task}`;
40
+ };
41
+ var createRequestV2 = (endpoint, task) => {
42
+ return `${endpoint}/visitor/v2/${task}`;
43
+ };
44
+ var startTracker = async (endpoint, url, referer, user_agent) => {
45
+ const allow = sessionStorage.getItem("aesirx-analytics-allow");
46
+ if (allow === "0") {
47
+ return null;
48
+ }
49
+ const { location, document: document2 } = window;
50
+ const { pathname, search, origin } = location;
51
+ url = `${origin}${pathname}${search}`;
52
+ referer = referer ? location.protocol + "//" + location.host + referer : document2.referrer ? document2.referrer : "";
53
+ user_agent = window.navigator.userAgent;
54
+ const browser = Bowser.parse(window.navigator.userAgent);
55
+ const browser_name = browser?.browser?.name;
56
+ const browser_version = browser?.browser?.version ?? "0";
57
+ const lang = window.navigator["userLanguage"] || window.navigator.language;
58
+ const device = browser?.platform?.model ?? browser?.platform?.type;
59
+ const queryString = window.location.search;
60
+ const urlParams = new URLSearchParams(queryString);
61
+ const ip = "";
62
+ const fpPromise = FingerprintJS.load({ monitoring: false });
63
+ try {
64
+ const responseStart = fpPromise.then((fp) => fp.get()).then(async (result) => {
65
+ const fingerprint = result.visitorId;
66
+ const attributes = [];
67
+ for (const key of urlParams.keys()) {
68
+ if (key.startsWith("utm_")) {
69
+ urlParams.get(key) && attributes.push({ name: key, value: urlParams.get(key) });
70
+ }
71
+ }
72
+ return await trackerService(createRequestV2(endpoint, "start"), {
73
+ fingerprint,
74
+ url,
75
+ ...referer && referer !== url && {
76
+ referer
77
+ },
78
+ user_agent,
79
+ ip,
80
+ browser_name,
81
+ browser_version,
82
+ lang,
83
+ device,
84
+ ...attributes?.length && {
85
+ event_name: "visit",
86
+ event_type: "action",
87
+ attributes
88
+ }
89
+ });
90
+ });
91
+ return responseStart;
92
+ } catch (error) {
93
+ }
94
+ };
95
+ var trackEvent = async (endpoint, referer, data) => {
96
+ const allow = sessionStorage.getItem("aesirx-analytics-allow");
97
+ if (allow === "0") {
98
+ return null;
99
+ }
100
+ const { location, document: document2 } = window;
101
+ referer = referer ? location.protocol + "//" + location.host + referer : document2.referrer.split("?")[0];
102
+ const url = location.protocol + "//" + location.host + location.pathname;
103
+ const user_agent = window.navigator.userAgent;
104
+ const browser = Bowser.parse(window.navigator.userAgent);
105
+ const browser_name = browser?.browser?.name;
106
+ const browser_version = browser?.browser?.version ?? "0";
107
+ const lang = window.navigator["userLanguage"] || window.navigator.language;
108
+ const device = browser?.platform?.model ?? browser?.platform?.type;
109
+ const ip = "";
110
+ const fpPromise = FingerprintJS.load({ monitoring: false });
111
+ const body = fpPromise.then((fp) => fp.get()).then(async (result) => {
112
+ const fingerprint = result.visitorId;
113
+ return {
114
+ fingerprint,
115
+ url,
116
+ ...referer !== "/" && referer && {
117
+ referer
118
+ },
119
+ user_agent,
120
+ ip,
121
+ browser_name,
122
+ browser_version,
123
+ lang,
124
+ device,
125
+ ...data
126
+ };
127
+ });
128
+ const headers = { type: "application/json" };
129
+ const blob = new Blob([JSON.stringify(body)], headers);
130
+ const responseStart = navigator.sendBeacon(createRequestV2(endpoint, "start"), blob);
131
+ return responseStart;
132
+ };
133
+ var endTracker = (endPoint, event_uuid, visitor_uuid) => {
134
+ if (event_uuid && visitor_uuid) {
135
+ const body = {
136
+ event_uuid,
137
+ visitor_uuid
138
+ };
139
+ const headers = { type: "application/json" };
140
+ const blob = new Blob([JSON.stringify(body)], headers);
141
+ navigator.sendBeacon(createRequest(endPoint, "end"), blob);
142
+ }
143
+ };
144
+ var endTrackerVisibilityState = (endPoint) => {
145
+ document.addEventListener("visibilitychange", async () => {
146
+ if (document.visibilityState === "hidden") {
147
+ endTracker(endPoint, window["event_uuid"], window["visitor_uuid"]);
148
+ }
149
+ if (document.visibilityState === "visible") {
150
+ const response = await startTracker(endPoint);
151
+ window["event_uuid"] = response?.event_uuid;
152
+ }
153
+ });
154
+ window.addEventListener(
155
+ "pagehide",
156
+ (event) => {
157
+ if (event.persisted) {
158
+ endTracker(endPoint, window["event_uuid"], window["visitor_uuid"]);
159
+ }
160
+ },
161
+ false
162
+ );
163
+ };
164
+
165
+ // src/AnalyticsNext/handle.tsx
166
+ var AnalyticsHandle = ({ router, children }) => {
167
+ const AnalyticsStore = React.useContext(AnalyticsContext);
168
+ const endPoint = process.env.NEXT_PUBLIC_ENDPOINT_ANALYTICS_URL;
169
+ const [prevRoute, setPrevRoute] = useState("");
170
+ const handleStartTracker = useCallback(
171
+ async (prevRoute2) => {
172
+ const referer = prevRoute2 ? prevRoute2 : "";
173
+ window["referer"] = referer;
174
+ const responseStart = await startTracker(endPoint, "", referer);
175
+ responseStart?.event_uuid && AnalyticsStore.setEventID(responseStart.event_uuid);
176
+ responseStart?.visitor_uuid && AnalyticsStore.setUUID(responseStart.visitor_uuid);
177
+ },
178
+ [AnalyticsStore, endPoint]
179
+ );
180
+ useEffect(() => {
181
+ const init = async () => {
182
+ if (!AnalyticsStore.visitor_uuid) {
183
+ await handleStartTracker(router.asPath);
184
+ }
185
+ };
186
+ init();
187
+ }, [AnalyticsStore.visitor_uuid]);
188
+ useEffect(() => {
189
+ const handleRouteChange = async () => {
190
+ setPrevRoute(router.asPath);
191
+ if (AnalyticsStore.visitor_uuid) {
192
+ endTracker(endPoint, window["event_uuid"], AnalyticsStore.visitor_uuid);
193
+ await handleStartTracker(prevRoute);
194
+ }
195
+ };
196
+ router.events.on("routeChangeComplete", handleRouteChange);
197
+ return () => {
198
+ router.events.off("routeChangeComplete", handleRouteChange);
199
+ };
200
+ }, [router.events, router.asPath, router.query]);
201
+ useEffect(() => {
202
+ const init = async () => {
203
+ endTrackerVisibilityState(endPoint);
204
+ };
205
+ init();
206
+ }, []);
207
+ useEffect(() => {
208
+ const init = async () => {
209
+ window["event_uuid"] = AnalyticsStore.event_uuid;
210
+ window["visitor_uuid"] = AnalyticsStore.visitor_uuid;
211
+ };
212
+ init();
213
+ }, [AnalyticsStore.event_uuid, AnalyticsStore.visitor_uuid]);
214
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, children);
215
+ };
216
+ var handle_default = AnalyticsHandle;
217
+
218
+ // src/AnalyticsNext/index.tsx
219
+ import dynamic from "next/dynamic";
220
+ var ConsentComponent = dynamic(() => import("./Consent-7KHERFGJ.js"), { ssr: false });
221
+ var AnalyticsNext = ({ router, children }) => {
222
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(AnalyticsContextProvider_default, null, /* @__PURE__ */ React2.createElement(handle_default, { router }, children, /* @__PURE__ */ React2.createElement(ConsentComponent, { endpoint: process.env.NEXT_PUBLIC_ENDPOINT_ANALYTICS_URL }))));
223
+ };
224
+ var AnalyticsNext_default = AnalyticsNext;
225
+
226
+ // src/AnalyticsReact/index.tsx
227
+ import React4, { Suspense } from "react";
228
+
229
+ // src/AnalyticsReact/handle.tsx
230
+ import React3, { useEffect as useEffect2 } from "react";
231
+ var AnalyticsHandle2 = ({ location, history, children }) => {
232
+ const AnalyticsStore = React3.useContext(AnalyticsContext);
233
+ const endPoint = process.env.REACT_APP_ENDPOINT_ANALYTICS_URL;
234
+ useEffect2(() => {
235
+ const init = async () => {
236
+ if (!AnalyticsStore.visitor_uuid) {
237
+ const referer = location.pathname ? location.pathname : "";
238
+ window["referer"] = referer;
239
+ const responseStart = await startTracker(endPoint, "", referer);
240
+ responseStart.event_uuid && AnalyticsStore.setEventID(responseStart.event_uuid);
241
+ responseStart.visitor_uuid && AnalyticsStore.setUUID(responseStart.visitor_uuid);
242
+ } else {
243
+ endTracker(endPoint, window["event_uuid"], AnalyticsStore.visitor_uuid);
244
+ }
245
+ };
246
+ init();
247
+ }, [location.pathname, history]);
248
+ useEffect2(() => {
249
+ const init = async () => {
250
+ endTrackerVisibilityState(endPoint);
251
+ };
252
+ init();
253
+ }, []);
254
+ useEffect2(() => {
255
+ const init = async () => {
256
+ window["event_uuid"] = AnalyticsStore.event_uuid;
257
+ window["visitor_uuid"] = AnalyticsStore.visitor_uuid;
258
+ };
259
+ init();
260
+ }, [AnalyticsStore.event_uuid, AnalyticsStore.visitor_uuid]);
261
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, children);
262
+ };
263
+ var handle_default2 = AnalyticsHandle2;
264
+
265
+ // src/AnalyticsReact/index.tsx
266
+ var ConsentComponent2 = React4.lazy(() => import("./Consent-7KHERFGJ.js"));
267
+ var AnalyticsReact = ({ location, history, children }) => {
268
+ return /* @__PURE__ */ React4.createElement(AnalyticsContextProvider_default, null, /* @__PURE__ */ React4.createElement(handle_default2, { location, history }, children, /* @__PURE__ */ React4.createElement(Suspense, { fallback: /* @__PURE__ */ React4.createElement(React4.Fragment, null) }, /* @__PURE__ */ React4.createElement(ConsentComponent2, { endpoint: process.env.REACT_APP_ENDPOINT_ANALYTICS_URL }))));
269
+ };
270
+ var AnalyticsReact_default = AnalyticsReact;
271
+ export {
272
+ AnalyticsContext,
273
+ AnalyticsNext_default as AnalyticsNext,
274
+ AnalyticsReact_default as AnalyticsReact,
275
+ trackEvent
276
+ };
package/package.json CHANGED
@@ -1,15 +1,17 @@
1
1
  {
2
2
  "name": "aesirx-analytics",
3
- "version": "1.2.2",
3
+ "version": "2.0.0",
4
4
  "license": "GPL-3.0-only",
5
5
  "author": "AesirX",
6
6
  "repository": "https://gitlab.redweb.dk/aesirx/analytics",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
9
+ "types": "dist/index.d.ts",
9
10
  "type": "module",
10
11
  "dependencies": {
11
12
  "@concordium/browser-wallet-api-helpers": "^2",
12
13
  "@concordium/web-sdk": "^6",
14
+ "@fingerprintjs/fingerprintjs": "^3.4.2",
13
15
  "aesirx-sso": "^1.1.1",
14
16
  "axios": "^1.4.0",
15
17
  "bootstrap": "^5.3.0",
@@ -24,7 +26,7 @@
24
26
  "react-toastify": "^9.1.3"
25
27
  },
26
28
  "scripts": {
27
- "dev": "NODE_ENV=development tsup --watch --onSuccess 'yalc push --changed --no-scripts'",
29
+ "dev": "tsup --watch --onSuccess 'yalc push --changed --no-scripts'",
28
30
  "build": "tsup",
29
31
  "lint": "eslint --fix \"src/**/\"",
30
32
  "lint:check": "eslint \"src/**/\"",
@@ -72,7 +74,6 @@
72
74
  "jest-environment-jsdom": "^29.4.3",
73
75
  "node-fetch": "^3.3.1",
74
76
  "prettier": "^2.8.4",
75
- "terser": "^5.19.0",
76
77
  "ts-jest": "^29.0.5",
77
78
  "tsup": "^6.7.0",
78
79
  "typescript": "^5.0.3"