refactor: ts path alias

This commit is contained in:
GyDi 2022-08-06 02:35:11 +08:00
parent bf0dafabe2
commit f3341f201f
No known key found for this signature in database
GPG Key ID: 1C95E0D3467B3084
44 changed files with 140 additions and 155 deletions

View File

@ -2,9 +2,8 @@ import dayjs from "dayjs";
import { useLockFn } from "ahooks";
import { styled, ListItem, IconButton, ListItemText } from "@mui/material";
import { CloseRounded } from "@mui/icons-material";
import { ApiType } from "../../services/types";
import { deleteConnection } from "../../services/api";
import parseTraffic from "../../utils/parse-traffic";
import { deleteConnection } from "@/services/api";
import parseTraffic from "@/utils/parse-traffic";
const Tag = styled("span")(({ theme }) => ({
display: "inline-block",

View File

@ -4,13 +4,12 @@ import { useRecoilValue } from "recoil";
import { Box, Typography } from "@mui/material";
import { ArrowDownward, ArrowUpward } from "@mui/icons-material";
import { listen } from "@tauri-apps/api/event";
import { ApiType } from "../../services/types";
import { getInformation } from "../../services/api";
import { getVergeConfig } from "../../services/cmds";
import { atomClashPort } from "../../services/states";
import { getInformation } from "@/services/api";
import { getVergeConfig } from "@/services/cmds";
import { atomClashPort } from "@/services/states";
import TrafficGraph from "./traffic-graph";
import useLogSetup from "./use-log-setup";
import parseTraffic from "../../utils/parse-traffic";
import parseTraffic from "@/utils/parse-traffic";
// setup the traffic
const LayoutTraffic = () => {

View File

@ -13,8 +13,8 @@ import {
} from "@mui/material";
import { relaunch } from "@tauri-apps/api/process";
import { checkUpdate, installUpdate } from "@tauri-apps/api/updater";
import { killSidecar, restartSidecar } from "../../services/cmds";
import { atomUpdateState } from "../../services/states";
import { killSidecar, restartSidecar } from "@/services/cmds";
import { atomUpdateState } from "@/services/states";
import Notice from "../base/base-notice";
interface Props {

View File

@ -3,9 +3,9 @@ import { useEffect, useMemo } from "react";
import { useRecoilState } from "recoil";
import { createTheme } from "@mui/material";
import { appWindow } from "@tauri-apps/api/window";
import { getVergeConfig } from "../../services/cmds";
import { atomThemeMode } from "../../services/states";
import { defaultTheme, defaultDarkTheme } from "../../pages/_theme";
import { getVergeConfig } from "@/services/cmds";
import { atomThemeMode } from "@/services/states";
import { defaultTheme, defaultDarkTheme } from "@/pages/_theme";
/**
* custome theme

View File

@ -2,9 +2,8 @@ import dayjs from "dayjs";
import { useEffect, useState } from "react";
import { useSetRecoilState } from "recoil";
import { listen } from "@tauri-apps/api/event";
import { ApiType } from "../../services/types";
import { getInformation } from "../../services/api";
import { atomLogData } from "../../services/states";
import { getInformation } from "@/services/api";
import { atomLogData } from "@/services/states";
const MAX_LOG_NUM = 1000;

View File

@ -1,5 +1,4 @@
import { styled, Box } from "@mui/material";
import { ApiType } from "../../services/types";
const Item = styled(Box)(({ theme }) => ({
padding: "8px 0",

View File

@ -24,8 +24,7 @@ import {
enhanceProfiles,
changeProfileChain,
changeProfileValid,
} from "../../services/cmds";
import { CmdType } from "../../services/types";
} from "@/services/cmds";
import ProfileMore from "./profile-more";
import Notice from "../base/base-notice";

View File

@ -9,8 +9,8 @@ import {
DialogContent,
DialogTitle,
} from "@mui/material";
import { atomThemeMode } from "../../services/states";
import { readProfileFile, saveProfileFile } from "../../services/cmds";
import { atomThemeMode } from "@/services/states";
import { readProfileFile, saveProfileFile } from "@/services/cmds";
import Notice from "../base/base-notice";
import "monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution.js";

View File

@ -12,8 +12,7 @@ import {
TextField,
} from "@mui/material";
import { Settings } from "@mui/icons-material";
import { CmdType } from "../../services/types";
import { patchProfile } from "../../services/cmds";
import { patchProfile } from "@/services/cmds";
import Notice from "../base/base-notice";
interface Props {

View File

@ -16,10 +16,9 @@ import {
Menu,
} from "@mui/material";
import { RefreshRounded } from "@mui/icons-material";
import { CmdType } from "../../services/types";
import { atomLoadingCache } from "../../services/states";
import { updateProfile, deleteProfile, viewProfile } from "../../services/cmds";
import parseTraffic from "../../utils/parse-traffic";
import { atomLoadingCache } from "@/services/states";
import { updateProfile, deleteProfile, viewProfile } from "@/services/cmds";
import parseTraffic from "@/utils/parse-traffic";
import ProfileEdit from "./profile-edit";
import FileEditor from "./file-editor";
import Notice from "../base/base-notice";

View File

@ -11,9 +11,8 @@ import {
MenuItem,
Menu,
} from "@mui/material";
import { CmdType } from "../../services/types";
import { viewProfile } from "../../services/cmds";
import enhance from "../../services/enhance";
import { viewProfile } from "@/services/cmds";
import enhance from "@/services/enhance";
import ProfileEdit from "./profile-edit";
import FileEditor from "./file-editor";
import Notice from "../base/base-notice";

View File

@ -15,7 +15,7 @@ import {
TextField,
} from "@mui/material";
import { Settings } from "@mui/icons-material";
import { createProfile } from "../../services/cmds";
import { createProfile } from "@/services/cmds";
import Notice from "../base/base-notice";
import FileInput from "./file-input";

View File

@ -2,13 +2,12 @@ import useSWR, { useSWRConfig } from "swr";
import { useEffect, useRef, useState } from "react";
import { useLockFn } from "ahooks";
import { Virtuoso } from "react-virtuoso";
import { ApiType } from "../../services/types";
import { updateProxy } from "../../services/api";
import { getProfiles, patchProfile } from "../../services/cmds";
import { updateProxy } from "@/services/api";
import { getProfiles, patchProfile } from "@/services/cmds";
import delayManager from "@/services/delay";
import useSortProxy from "./use-sort-proxy";
import useHeadState from "./use-head-state";
import useFilterProxy from "./use-filter-proxy";
import delayManager from "../../services/delay";
import ProxyHead from "./proxy-head";
import ProxyItem from "./proxy-item";

View File

@ -15,13 +15,12 @@ import {
ExpandLessRounded,
ExpandMoreRounded,
} from "@mui/icons-material";
import { ApiType } from "../../services/types";
import { updateProxy } from "../../services/api";
import { getProfiles, patchProfile } from "../../services/cmds";
import { updateProxy } from "@/services/api";
import { getProfiles, patchProfile } from "@/services/cmds";
import delayManager from "@/services/delay";
import useSortProxy from "./use-sort-proxy";
import useHeadState from "./use-head-state";
import useFilterProxy from "./use-filter-proxy";
import delayManager from "../../services/delay";
import ProxyHead from "./proxy-head";
import ProxyItem from "./proxy-item";

View File

@ -13,7 +13,7 @@ import {
SortByAlphaRounded,
SortRounded,
} from "@mui/icons-material";
import delayManager from "../../services/delay";
import delayManager from "@/services/delay";
import type { HeadState } from "./use-head-state";
import type { ProxySortType } from "./use-sort-proxy";

View File

@ -12,8 +12,7 @@ import {
SxProps,
Theme,
} from "@mui/material";
import { ApiType } from "../../services/types";
import delayManager from "../../services/delay";
import delayManager from "@/services/delay";
interface Props {
groupName: string;

View File

@ -1,6 +1,5 @@
import { useMemo } from "react";
import { ApiType } from "../../services/types";
import delayManager from "../../services/delay";
import delayManager from "@/services/delay";
const regex1 = /delay([=<>])(\d+|timeout|error)/i;
const regex2 = /type=(.*)/i;

View File

@ -1,6 +1,6 @@
import { useCallback, useEffect, useState } from "react";
import { useRecoilValue } from "recoil";
import { atomCurrentProfile } from "../../services/states";
import { atomCurrentProfile } from "@/services/states";
import { ProxySortType } from "./use-sort-proxy";
export interface HeadState {

View File

@ -1,6 +1,5 @@
import { useMemo } from "react";
import { ApiType } from "../../services/types";
import delayManager from "../../services/delay";
import delayManager from "@/services/delay";
// default | delay | alpha
export type ProxySortType = 0 | 1 | 2;

View File

@ -10,8 +10,8 @@ import {
DialogTitle,
} from "@mui/material";
import { InfoRounded } from "@mui/icons-material";
import { atomThemeMode } from "../../services/states";
import { getRunningConfig } from "../../services/cmds";
import { atomThemeMode } from "../../../services/states";
import { getRunningConfig } from "../../../services/cmds";
import "monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution.js";
import "monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution.js";

View File

@ -3,9 +3,9 @@ import { useState } from "react";
import { useLockFn } from "ahooks";
import { Menu, MenuItem } from "@mui/material";
import { Settings } from "@mui/icons-material";
import { changeClashCore, getVergeConfig } from "../../services/cmds";
import { getVersion } from "../../services/api";
import Notice from "../base/base-notice";
import { changeClashCore, getVergeConfig } from "@/services/cmds";
import { getVersion } from "@/services/api";
import Notice from "@/components/base/base-notice";
const VALID_CORE = [
{ name: "Clash", core: "clash" },

View File

@ -1,5 +1,5 @@
import { cloneElement, isValidElement, ReactNode, useRef } from "react";
import noop from "../../utils/noop";
import noop from "@/utils/noop";
interface Props<Value> {
value?: Value;

View File

@ -14,9 +14,9 @@ import {
installService,
uninstallService,
patchVergeConfig,
} from "../../services/cmds";
import Notice from "../base/base-notice";
import noop from "../../utils/noop";
} from "@/services/cmds";
import Notice from "@/components/base/base-notice";
import noop from "@/utils/noop";
interface Props {
open: boolean;

View File

@ -1,7 +1,7 @@
import { useEffect, useState } from "react";
import { InfoRounded } from "@mui/icons-material";
import { ClickAwayListener, Tooltip } from "@mui/material";
import { getSystemProxy } from "../../services/cmds";
import { getSystemProxy } from "@/services/cmds";
const SysproxyTooltip = () => {
const [open, setOpen] = useState(false);

View File

@ -1,6 +1,5 @@
import { useTranslation } from "react-i18next";
import { Button, ButtonGroup } from "@mui/material";
import { CmdType } from "../../services/types";
type ThemeValue = CmdType.VergeConfig["theme_mode"];

View File

@ -10,22 +10,18 @@ import {
Typography,
Box,
} from "@mui/material";
import { ApiType } from "../../services/types";
import { atomClashPort } from "../../services/states";
import { patchClashConfig } from "../../services/cmds";
import { atomClashPort } from "@/services/states";
import { patchClashConfig } from "@/services/cmds";
import { SettingList, SettingItem } from "./setting";
import { getClashConfig, getVersion, updateConfigs } from "../../services/api";
import { getClashConfig, getVersion, updateConfigs } from "@/services/api";
import Notice from "../base/base-notice";
import GuardState from "./guard-state";
import CoreSwitch from "./core-switch";
import GuardState from "./mods/guard-state";
import CoreSwitch from "./mods/core-switch";
interface Props {
onError: (err: Error) => void;
}
// const MULTI_CORE = !!import.meta.env.VITE_MULTI_CORE;
const MULTI_CORE = true;
const SettingClash = ({ onError }: Props) => {
const { t } = useTranslation();
const { mutate } = useSWRConfig();
@ -136,14 +132,10 @@ const SettingClash = ({ onError }: Props) => {
<SettingItem>
<ListItemText
primary={
MULTI_CORE ? (
<Box sx={{ display: "flex", alignItems: "center" }}>
<span style={{ marginRight: 4 }}>{t("Clash Core")}</span>
<CoreSwitch />
</Box>
) : (
t("Clash Core")
)
<Box sx={{ display: "flex", alignItems: "center" }}>
<span style={{ marginRight: 4 }}>{t("Clash Core")}</span>
<CoreSwitch />
</Box>
}
/>
<Typography sx={{ py: 1 }}>{clashVer}</Typography>

View File

@ -13,14 +13,13 @@ import {
checkService,
getVergeConfig,
patchVergeConfig,
} from "../../services/cmds";
} from "@/services/cmds";
import { SettingList, SettingItem } from "./setting";
import { CmdType } from "../../services/types";
import GuardState from "./guard-state";
import ServiceMode from "./service-mode";
import ConfigViewer from "./config-viewer";
import SysproxyTooltip from "./sysproxy-tooltip";
import getSystem from "../../utils/get-system";
import getSystem from "@/utils/get-system";
import GuardState from "./mods/guard-state";
import ServiceMode from "./mods/service-mode";
import ConfigViewer from "./mods/config-viewer";
import SysproxyTooltip from "./mods/sysproxy-tooltip";
interface Props {
onError?: (err: Error) => void;

View File

@ -15,8 +15,8 @@ import {
TextField,
useTheme,
} from "@mui/material";
import { getVergeConfig, patchVergeConfig } from "../../services/cmds";
import { defaultTheme, defaultDarkTheme } from "../../pages/_theme";
import { getVergeConfig, patchVergeConfig } from "@/services/cmds";
import { defaultTheme, defaultDarkTheme } from "@/pages/_theme";
interface Props {
open: boolean;

View File

@ -14,13 +14,12 @@ import {
openAppDir,
openLogsDir,
patchVergeConfig,
} from "../../services/cmds";
} from "@/services/cmds";
import { ArrowForward } from "@mui/icons-material";
import { SettingList, SettingItem } from "./setting";
import { CmdType } from "../../services/types";
import { version } from "../../../package.json";
import ThemeModeSwitch from "./theme-mode-switch";
import GuardState from "./guard-state";
import { version } from "@root/package.json";
import ThemeModeSwitch from "./mods/theme-mode-switch";
import GuardState from "./mods/guard-state";
import SettingTheme from "./setting-theme";
interface Props {

View File

@ -10,16 +10,16 @@ import { alpha, List, Paper, ThemeProvider } from "@mui/material";
import { listen } from "@tauri-apps/api/event";
import { appWindow } from "@tauri-apps/api/window";
import { routers } from "./_routers";
import { getAxios } from "../services/api";
import { atomCurrentProfile } from "../services/states";
import { getVergeConfig, getProfiles } from "../services/cmds";
import { ReactComponent as LogoSvg } from "../assets/image/logo.svg";
import LayoutItem from "../components/layout/layout-item";
import LayoutControl from "../components/layout/layout-control";
import LayoutTraffic from "../components/layout/layout-traffic";
import UpdateButton from "../components/layout/update-button";
import useCustomTheme from "../components/layout/use-custom-theme";
import getSystem from "../utils/get-system";
import { getAxios } from "@/services/api";
import { atomCurrentProfile } from "@/services/states";
import { getVergeConfig, getProfiles } from "@/services/cmds";
import { ReactComponent as LogoSvg } from "@/assets/image/logo.svg";
import LayoutItem from "@/components/layout/layout-item";
import LayoutControl from "@/components/layout/layout-control";
import LayoutTraffic from "@/components/layout/layout-traffic";
import UpdateButton from "@/components/layout/update-button";
import useCustomTheme from "@/components/layout/use-custom-theme";
import getSystem from "@/utils/get-system";
import "dayjs/locale/zh-cn";
dayjs.extend(relativeTime);

View File

@ -3,10 +3,9 @@ import { useLockFn } from "ahooks";
import { Box, Button, Paper, TextField } from "@mui/material";
import { Virtuoso } from "react-virtuoso";
import { useTranslation } from "react-i18next";
import { ApiType } from "../services/types";
import { closeAllConnections, getInformation } from "../services/api";
import BasePage from "../components/base/base-page";
import ConnectionItem from "../components/connection/connection-item";
import { closeAllConnections, getInformation } from "@/services/api";
import BasePage from "@/components/base/base-page";
import ConnectionItem from "@/components/connection/connection-item";
const initConn = { uploadTotal: 0, downloadTotal: 0, connections: [] };

View File

@ -3,9 +3,9 @@ import { useRecoilState } from "recoil";
import { Box, Button, MenuItem, Paper, Select, TextField } from "@mui/material";
import { Virtuoso } from "react-virtuoso";
import { useTranslation } from "react-i18next";
import { atomLogData } from "../services/states";
import BasePage from "../components/base/base-page";
import LogItem from "../components/log/log-item";
import { atomLogData } from "@/services/states";
import BasePage from "@/components/base/base-page";
import LogItem from "@/components/log/log-item";
const LogPage = () => {
const { t } = useTranslation();

View File

@ -9,14 +9,14 @@ import {
patchProfile,
selectProfile,
importProfile,
} from "../services/cmds";
import { getProxies, updateProxy } from "../services/api";
import { atomCurrentProfile } from "../services/states";
import Notice from "../components/base/base-notice";
import BasePage from "../components/base/base-page";
import ProfileNew from "../components/profile/profile-new";
import ProfileItem from "../components/profile/profile-item";
import EnhancedMode from "../components/profile/enhanced";
} from "@/services/cmds";
import { getProxies, updateProxy } from "@/services/api";
import { atomCurrentProfile } from "@/services/states";
import Notice from "@/components/base/base-notice";
import BasePage from "@/components/base/base-page";
import ProfileNew from "@/components/profile/profile-new";
import ProfileItem from "@/components/profile/profile-item";
import EnhancedMode from "@/components/profile/enhanced";
const ProfilePage = () => {
const { t } = useTranslation();

View File

@ -3,12 +3,12 @@ import { useEffect } from "react";
import { useLockFn } from "ahooks";
import { useTranslation } from "react-i18next";
import { Button, ButtonGroup, List, Paper } from "@mui/material";
import { getClashConfig, updateConfigs } from "../services/api";
import { patchClashConfig } from "../services/cmds";
import { getProxies } from "../services/api";
import BasePage from "../components/base/base-page";
import ProxyGroup from "../components/proxy/proxy-group";
import ProxyGlobal from "../components/proxy/proxy-global";
import { getClashConfig, updateConfigs } from "@/services/api";
import { patchClashConfig } from "@/services/cmds";
import { getProxies } from "@/services/api";
import BasePage from "@/components/base/base-page";
import ProxyGroup from "@/components/proxy/proxy-group";
import ProxyGlobal from "@/components/proxy/proxy-global";
const ProxyPage = () => {
const { t } = useTranslation();

View File

@ -1,10 +1,10 @@
import { Paper } from "@mui/material";
import { useTranslation } from "react-i18next";
import Notice from "../components/base/base-notice";
import BasePage from "../components/base/base-page";
import SettingVerge from "../components/setting/setting-verge";
import SettingClash from "../components/setting/setting-clash";
import SettingSystem from "../components/setting/setting-system";
import Notice from "@/components/base/base-notice";
import BasePage from "@/components/base/base-page";
import SettingVerge from "@/components/setting/setting-verge";
import SettingClash from "@/components/setting/setting-clash";
import SettingSystem from "@/components/setting/setting-system";
const SettingPage = () => {
const { t } = useTranslation();

View File

@ -1,6 +1,5 @@
import axios, { AxiosInstance } from "axios";
import { getClashInfo } from "./cmds";
import { ApiType } from "./types";
let axiosIns: AxiosInstance = null!;
let server = "";

View File

@ -1,6 +1,5 @@
import { invoke } from "@tauri-apps/api/tauri";
import { ApiType, CmdType } from "./types";
import Notice from "../components/base/base-notice";
import Notice from "@/components/base/base-notice";
export async function getProfiles() {
return invoke<CmdType.ProfilesConfig>("get_profiles");

View File

@ -1,7 +1,6 @@
import { emit, listen, Event } from "@tauri-apps/api/event";
import { appWindow } from "@tauri-apps/api/window";
import { CmdType } from "./types";
import ignoreCase from "../utils/ignore-case";
import ignoreCase from "@/utils/ignore-case";
const DEFAULT_FIELDS = [
"rules",

View File

@ -1,7 +1,7 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import en from "../locales/en.json";
import zh from "../locales/zh.json";
import en from "@/locales/en.json";
import zh from "@/locales/zh.json";
const resources = {
en: { translation: en },

View File

@ -1,5 +1,4 @@
import { atom } from "recoil";
import { ApiType } from "./types";
export const atomThemeMode = atom<"light" | "dark">({
key: "atomThemeMode",

View File

@ -1,8 +1,9 @@
// declare global {
/**
* Some interface for clash api
*/
export namespace ApiType {
export interface ConfigData {
declare namespace ApiType {
interface ConfigData {
port: number;
mode: string;
ipv6: boolean;
@ -15,13 +16,13 @@ export namespace ApiType {
"tproxy-port": number;
}
export interface RuleItem {
interface RuleItem {
type: string;
payload: string;
proxy: string;
}
export interface ProxyItem {
interface ProxyItem {
name: string;
type: string;
udp: boolean;
@ -33,22 +34,22 @@ export namespace ApiType {
now?: string;
}
export type ProxyGroupItem = Omit<ProxyItem, "all"> & {
type ProxyGroupItem = Omit<ProxyItem, "all"> & {
all: ProxyItem[];
};
export interface TrafficItem {
interface TrafficItem {
up: number;
down: number;
}
export interface LogItem {
interface LogItem {
type: string;
time?: string;
payload: string;
}
export interface ConnectionsItem {
interface ConnectionsItem {
id: string;
metadata: {
network: string;
@ -69,7 +70,7 @@ export namespace ApiType {
curDownload?: number; // calculate
}
export interface Connections {
interface Connections {
downloadTotal: number;
uploadTotal: number;
connections: ConnectionsItem[];
@ -79,17 +80,17 @@ export namespace ApiType {
/**
* Some interface for command
*/
export namespace CmdType {
export type ProfileType = "local" | "remote" | "merge" | "script";
declare namespace CmdType {
type ProfileType = "local" | "remote" | "merge" | "script";
export interface ClashInfo {
interface ClashInfo {
status: string;
port?: string;
server?: string;
secret?: string;
}
export interface ProfileItem {
interface ProfileItem {
uid: string;
type?: ProfileType | string;
name?: string;
@ -110,20 +111,20 @@ export namespace CmdType {
option?: ProfileOption;
}
export interface ProfileOption {
interface ProfileOption {
user_agent?: string;
with_proxy?: boolean;
update_interval?: number;
}
export interface ProfilesConfig {
interface ProfilesConfig {
current?: string;
chain?: string[];
valid?: string[];
items?: ProfileItem[];
}
export interface VergeConfig {
interface VergeConfig {
language?: string;
clash_core?: string;
theme_mode?: "light" | "dark" | "system";
@ -152,7 +153,7 @@ export namespace CmdType {
type ClashConfigValue = any;
export interface ProfileMerge {
interface ProfileMerge {
// clash config fields (default supports)
rules?: ClashConfigValue;
proxies?: ClashConfigValue;
@ -179,7 +180,7 @@ export namespace CmdType {
}
// partial of the clash config
export type ProfileData = Partial<{
type ProfileData = Partial<{
rules: any[];
proxies: any[];
"proxy-groups": any[];
@ -189,22 +190,23 @@ export namespace CmdType {
[k: string]: any;
}>;
export interface ChainItem {
interface ChainItem {
item: ProfileItem;
merge?: ProfileMerge;
script?: string;
}
export interface EnhancedPayload {
interface EnhancedPayload {
chain: ChainItem[];
valid: string[];
current: ProfileData;
callback: string;
}
export interface EnhancedResult {
interface EnhancedResult {
data: ProfileData;
status: string;
error?: string;
}
}
// }

View File

@ -1,5 +1,6 @@
{
"compilerOptions": {
"baseUrl": ".",
"target": "ESNext",
"useDefineForClassFields": true,
"lib": ["DOM", "DOM.Iterable", "ESNext"],
@ -14,7 +15,11 @@
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx"
"jsx": "react-jsx",
"paths": {
"@/*": ["src/*"],
"@root/*": ["./*"]
}
},
"include": ["./src"]
}

View File

@ -1,4 +1,5 @@
import { defineConfig } from "vite";
import path from "path";
import svgr from "vite-plugin-svgr";
import react from "@vitejs/plugin-react";
import monaco from "vite-plugin-monaco-editor";
@ -15,4 +16,10 @@ export default defineConfig({
outDir: "../dist",
emptyOutDir: true,
},
resolve: {
alias: {
"@": path.resolve("./src"),
"@root": path.resolve("."),
},
},
});