@akanjs/ui 0.9.21 → 0.9.22
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/Data/Item.d.ts +1 -1
- package/Load/PageCSR.d.ts +1 -1
- package/System/Reconnect.d.ts +1 -1
- package/System/index.d.ts +1 -1
- package/cjs/System/HealthCheck.js +2 -0
- package/cjs/System/Reconnect.js +47 -26
- package/esm/System/HealthCheck.js +2 -0
- package/esm/System/Reconnect.js +37 -26
- package/package.json +2 -1
package/Data/Item.d.ts
CHANGED
|
@@ -71,4 +71,4 @@ export declare const Action: <T extends string, M extends {
|
|
|
71
71
|
id: string;
|
|
72
72
|
}>({ action, model, sliceName, outline, }: ActionProps<T, M, L> & {
|
|
73
73
|
outline?: boolean;
|
|
74
|
-
}) => string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<React.AwaitedReactNode> |
|
|
74
|
+
}) => string | number | bigint | boolean | import("react/jsx-runtime").JSX.Element | Iterable<React.ReactNode> | Promise<React.AwaitedReactNode> | null | undefined;
|
package/Load/PageCSR.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { ReactNode } from "react";
|
|
2
2
|
import type { PageProps } from "./Page";
|
|
3
|
-
export declare const PageCSR: <Return>({ of, loader, render, loading, noCache }: PageProps<Return>) => string | number | bigint | boolean | Iterable<ReactNode> | Promise<import("react").AwaitedReactNode> |
|
|
3
|
+
export declare const PageCSR: <Return>({ of, loader, render, loading, noCache }: PageProps<Return>) => string | number | bigint | boolean | import("react/jsx-runtime").JSX.Element | Iterable<ReactNode> | Promise<import("react").AwaitedReactNode> | null | undefined;
|
package/System/Reconnect.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ export interface ReconnectProps {
|
|
|
3
3
|
dev?: boolean;
|
|
4
4
|
fetchPing?: () => Promise<any>;
|
|
5
5
|
}
|
|
6
|
-
export declare const Reconnect: ({ path, dev, fetchPing
|
|
6
|
+
export declare const Reconnect: ({ path, dev, fetchPing }: ReconnectProps) => import("react/jsx-runtime").JSX.Element;
|
package/System/index.d.ts
CHANGED
|
@@ -6,6 +6,6 @@ export declare const System: {
|
|
|
6
6
|
ThemeToggle: () => import("react/jsx-runtime").JSX.Element | null;
|
|
7
7
|
Root: ({ children, st }: import("./Root").RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
8
|
SelectLanguage: ({ className, languages }: import("./SelectLanguage").SelectLanguageProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
-
Reconnect: ({ path, dev, fetchPing
|
|
9
|
+
Reconnect: ({ path, dev, fetchPing }: import("./Reconnect").ReconnectProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
10
|
DevModeToggle: () => import("react/jsx-runtime").JSX.Element;
|
|
11
11
|
};
|
|
@@ -30,6 +30,8 @@ var import_react = require("react");
|
|
|
30
30
|
const HealthCheck = ({ fetchPing = () => import_signal.fetch.ping() }) => {
|
|
31
31
|
(0, import_react.useEffect)(() => {
|
|
32
32
|
void (async () => {
|
|
33
|
+
if (window.location.href.includes("/unknown"))
|
|
34
|
+
return;
|
|
33
35
|
const fullPath = import_client.router.getFullPath(false);
|
|
34
36
|
try {
|
|
35
37
|
await fetchPing();
|
package/cjs/System/Reconnect.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
29
|
var Reconnect_exports = {};
|
|
20
30
|
__export(Reconnect_exports, {
|
|
@@ -26,14 +36,11 @@ var import_client = require("@akanjs/client");
|
|
|
26
36
|
var import_next = require("@akanjs/next");
|
|
27
37
|
var import_signal = require("@akanjs/signal");
|
|
28
38
|
var import_store = require("@akanjs/store");
|
|
39
|
+
var import_clsx = __toESM(require("clsx"));
|
|
29
40
|
var import_react = require("react");
|
|
30
41
|
var import_tb = require("react-icons/tb");
|
|
31
42
|
var import_Image = require("../Image");
|
|
32
|
-
const Reconnect = ({
|
|
33
|
-
path,
|
|
34
|
-
dev = false,
|
|
35
|
-
fetchPing = import_signal.fetch.ping
|
|
36
|
-
}) => {
|
|
43
|
+
const Reconnect = ({ path, dev = false, fetchPing = () => import_signal.fetch.ping() }) => {
|
|
37
44
|
const DOTS_LENGTH = 4;
|
|
38
45
|
const [dots, setDots] = (0, import_react.useState)(0);
|
|
39
46
|
const connectStatus = import_store.st.use.connectStatus();
|
|
@@ -43,13 +50,15 @@ const Reconnect = ({
|
|
|
43
50
|
const reconnect = async () => {
|
|
44
51
|
try {
|
|
45
52
|
import_store.st.do.setConnectStatus("connecting");
|
|
46
|
-
await fetchPing
|
|
53
|
+
await fetchPing();
|
|
47
54
|
import_store.st.do.setConnectStatus("connected");
|
|
48
55
|
setTimeout(() => {
|
|
49
|
-
|
|
56
|
+
if (!path || path === "/")
|
|
57
|
+
import_client.router.replace("/");
|
|
58
|
+
else
|
|
59
|
+
import_client.router.replace(`/${path}`);
|
|
50
60
|
}, 500);
|
|
51
61
|
} catch (e) {
|
|
52
|
-
import_store.st.do.setConnectStatus("disconnected");
|
|
53
62
|
}
|
|
54
63
|
};
|
|
55
64
|
(0, import_next.useInterval)(async () => {
|
|
@@ -59,25 +68,37 @@ const Reconnect = ({
|
|
|
59
68
|
return;
|
|
60
69
|
await reconnect();
|
|
61
70
|
}, 5e3);
|
|
62
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: dev ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.
|
|
63
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
64
|
-
|
|
65
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: "
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
) })
|
|
76
|
-
] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: "Server disconnected." })
|
|
77
|
-
] })
|
|
71
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: dev ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex h-screen flex-col items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "bg-base-300 flex w-4/5 flex-col items-center justify-center rounded-md p-5 md:w-1/3", children: [
|
|
72
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-3xl font-bold", children: connectStatus === "disconnected" ? "Something's wrong!" : connectStatus === "connecting" ? "Connecting..." : "Connected!" }),
|
|
73
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col items-center justify-center", children: [
|
|
74
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "py-5", children: connectStatus === "disconnected" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-[150px] text-gray-500", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_tb.TbPlugConnectedX, {}) }) }) : connectStatus === "connecting" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "animate-pulse py-5 text-[150px] text-gray-500", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_tb.TbPlugConnectedX, {}) }) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "animate-pop text-[150px] text-white", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_tb.TbPlugConnected, {}) }) }) }),
|
|
75
|
+
connectStatus === "connected" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
76
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "animate-pop" }),
|
|
77
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-lg", children: "Redirecting to the previous page in some seconds." }) })
|
|
78
|
+
] }) : connectStatus === "connecting" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-center", children: [
|
|
79
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-lg", children: "Try reconnecting to the server" }),
|
|
80
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex items-center", children: Array.from({ length: DOTS_LENGTH }).map(
|
|
81
|
+
(_, index) => dots >= index ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "visible", children: "." }, index) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "invisible", children: "." }, index)
|
|
82
|
+
) })
|
|
83
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-lg", children: "Server disconnected." })
|
|
78
84
|
] }),
|
|
79
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
80
|
-
|
|
85
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
86
|
+
"div",
|
|
87
|
+
{
|
|
88
|
+
className: (0, import_clsx.default)(
|
|
89
|
+
"mt-2 text-center text-sm leading-tight text-gray-500",
|
|
90
|
+
connectStatus === "disconnected" || connectStatus === "connecting" ? "visible" : "invisible"
|
|
91
|
+
),
|
|
92
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-center gap-2", children: [
|
|
93
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "font-bold", children: "*" }),
|
|
94
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col items-center justify-center", children: [
|
|
95
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: " Maybe your server is having a problem." }),
|
|
96
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "font-bold", children: "please check your server status." })
|
|
97
|
+
] })
|
|
98
|
+
] })
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
] }) }) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex h-screen items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "bg-base-300 flex w-4/5 flex-col items-center justify-center rounded-md py-5 md:w-1/3", children: [
|
|
81
102
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-3xl font-bold", children: "\uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC5B4\uC694!" }),
|
|
82
103
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Image.Image, { className: "mt-5", src: "/deadBot.svg", alt: "deadBot", color: "gray", width: 120, height: 120 }),
|
|
83
104
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-lg", children: "\uC11C\uBC84\uC5D0 \uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4." }),
|
|
@@ -8,6 +8,8 @@ import { useEffect } from "react";
|
|
|
8
8
|
const HealthCheck = ({ fetchPing = () => fetch.ping() }) => {
|
|
9
9
|
useEffect(() => {
|
|
10
10
|
void (async () => {
|
|
11
|
+
if (window.location.href.includes("/unknown"))
|
|
12
|
+
return;
|
|
11
13
|
const fullPath = router.getFullPath(false);
|
|
12
14
|
try {
|
|
13
15
|
await fetchPing();
|
package/esm/System/Reconnect.js
CHANGED
|
@@ -4,14 +4,11 @@ import { router } from "@akanjs/client";
|
|
|
4
4
|
import { useInterval } from "@akanjs/next";
|
|
5
5
|
import { fetch } from "@akanjs/signal";
|
|
6
6
|
import { st } from "@akanjs/store";
|
|
7
|
+
import clsx from "clsx";
|
|
7
8
|
import { useState } from "react";
|
|
8
9
|
import { TbPlugConnected, TbPlugConnectedX } from "react-icons/tb";
|
|
9
10
|
import { Image } from "../Image";
|
|
10
|
-
const Reconnect = ({
|
|
11
|
-
path,
|
|
12
|
-
dev = false,
|
|
13
|
-
fetchPing = fetch.ping
|
|
14
|
-
}) => {
|
|
11
|
+
const Reconnect = ({ path, dev = false, fetchPing = () => fetch.ping() }) => {
|
|
15
12
|
const DOTS_LENGTH = 4;
|
|
16
13
|
const [dots, setDots] = useState(0);
|
|
17
14
|
const connectStatus = st.use.connectStatus();
|
|
@@ -21,13 +18,15 @@ const Reconnect = ({
|
|
|
21
18
|
const reconnect = async () => {
|
|
22
19
|
try {
|
|
23
20
|
st.do.setConnectStatus("connecting");
|
|
24
|
-
await fetchPing
|
|
21
|
+
await fetchPing();
|
|
25
22
|
st.do.setConnectStatus("connected");
|
|
26
23
|
setTimeout(() => {
|
|
27
|
-
|
|
24
|
+
if (!path || path === "/")
|
|
25
|
+
router.replace("/");
|
|
26
|
+
else
|
|
27
|
+
router.replace(`/${path}`);
|
|
28
28
|
}, 500);
|
|
29
29
|
} catch (e) {
|
|
30
|
-
st.do.setConnectStatus("disconnected");
|
|
31
30
|
}
|
|
32
31
|
};
|
|
33
32
|
useInterval(async () => {
|
|
@@ -37,25 +36,37 @@ const Reconnect = ({
|
|
|
37
36
|
return;
|
|
38
37
|
await reconnect();
|
|
39
38
|
}, 5e3);
|
|
40
|
-
return /* @__PURE__ */ jsx(Fragment, { children: dev ? /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */
|
|
41
|
-
/* @__PURE__ */
|
|
42
|
-
|
|
43
|
-
/* @__PURE__ */
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
/* @__PURE__ */ jsx("div", { children: "
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
) })
|
|
54
|
-
] }) : /* @__PURE__ */ jsx("div", { children: "Server disconnected." })
|
|
55
|
-
] })
|
|
39
|
+
return /* @__PURE__ */ jsx(Fragment, { children: dev ? /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("div", { className: "flex h-screen flex-col items-center justify-center", children: /* @__PURE__ */ jsxs("div", { className: "bg-base-300 flex w-4/5 flex-col items-center justify-center rounded-md p-5 md:w-1/3", children: [
|
|
40
|
+
/* @__PURE__ */ jsx("div", { className: "text-3xl font-bold", children: connectStatus === "disconnected" ? "Something's wrong!" : connectStatus === "connecting" ? "Connecting..." : "Connected!" }),
|
|
41
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center", children: [
|
|
42
|
+
/* @__PURE__ */ jsx("div", { className: "py-5", children: connectStatus === "disconnected" ? /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("div", { className: "text-[150px] text-gray-500", children: /* @__PURE__ */ jsx(TbPlugConnectedX, {}) }) }) : connectStatus === "connecting" ? /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("div", { className: "animate-pulse py-5 text-[150px] text-gray-500", children: /* @__PURE__ */ jsx(TbPlugConnectedX, {}) }) }) : /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("div", { className: "animate-pop text-[150px] text-white", children: /* @__PURE__ */ jsx(TbPlugConnected, {}) }) }) }),
|
|
43
|
+
connectStatus === "connected" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
44
|
+
/* @__PURE__ */ jsx("div", { className: "animate-pop" }),
|
|
45
|
+
/* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx("span", { className: "text-lg", children: "Redirecting to the previous page in some seconds." }) })
|
|
46
|
+
] }) : connectStatus === "connecting" ? /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center", children: [
|
|
47
|
+
/* @__PURE__ */ jsx("div", { className: "text-lg", children: "Try reconnecting to the server" }),
|
|
48
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center", children: Array.from({ length: DOTS_LENGTH }).map(
|
|
49
|
+
(_, index) => dots >= index ? /* @__PURE__ */ jsx("div", { className: "visible", children: "." }, index) : /* @__PURE__ */ jsx("div", { className: "invisible", children: "." }, index)
|
|
50
|
+
) })
|
|
51
|
+
] }) : /* @__PURE__ */ jsx("div", { className: "text-lg", children: "Server disconnected." })
|
|
56
52
|
] }),
|
|
57
|
-
/* @__PURE__ */ jsx(
|
|
58
|
-
|
|
53
|
+
/* @__PURE__ */ jsx(
|
|
54
|
+
"div",
|
|
55
|
+
{
|
|
56
|
+
className: clsx(
|
|
57
|
+
"mt-2 text-center text-sm leading-tight text-gray-500",
|
|
58
|
+
connectStatus === "disconnected" || connectStatus === "connecting" ? "visible" : "invisible"
|
|
59
|
+
),
|
|
60
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-2", children: [
|
|
61
|
+
/* @__PURE__ */ jsx("div", { className: "font-bold", children: "*" }),
|
|
62
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center", children: [
|
|
63
|
+
/* @__PURE__ */ jsx("div", { children: " Maybe your server is having a problem." }),
|
|
64
|
+
/* @__PURE__ */ jsx("div", { className: "font-bold", children: "please check your server status." })
|
|
65
|
+
] })
|
|
66
|
+
] })
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
] }) }) }) : /* @__PURE__ */ jsx("div", { className: "flex h-screen items-center justify-center", children: /* @__PURE__ */ jsxs("div", { className: "bg-base-300 flex w-4/5 flex-col items-center justify-center rounded-md py-5 md:w-1/3", children: [
|
|
59
70
|
/* @__PURE__ */ jsx("div", { className: "text-3xl font-bold", children: "\uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC5B4\uC694!" }),
|
|
60
71
|
/* @__PURE__ */ jsx(Image, { className: "mt-5", src: "/deadBot.svg", alt: "deadBot", color: "gray", width: 120, height: 120 }),
|
|
61
72
|
/* @__PURE__ */ jsx("div", { className: "text-lg", children: "\uC11C\uBC84\uC5D0 \uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4." }),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akanjs/ui",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.22",
|
|
4
4
|
"sourceType": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"@radix-ui/react-dialog": "1.1.4",
|
|
20
20
|
"@react-spring/web": "^9.7.5",
|
|
21
21
|
"@use-gesture/react": "^10.3.1",
|
|
22
|
+
"clsx": "^2.1.1",
|
|
22
23
|
"dayjs": "^1.11.13",
|
|
23
24
|
"file-saver": "^2.0.5",
|
|
24
25
|
"jsonwebtoken": "^9.0.2",
|