diff --git a/components.d.ts b/components.d.ts index 621cae1..60b00bf 100644 --- a/components.d.ts +++ b/components.d.ts @@ -8,9 +8,13 @@ export {} declare module 'vue' { export interface GlobalComponents { AButton: typeof import('ant-design-vue/es')['Button'] - Login: typeof import('./src/views/login/LoginPage.vue')['default'] - LoginPage: typeof import('./src/views/login/LoginPage.vue')['default'] + AButtonGroup: typeof import('ant-design-vue/es')['ButtonGroup'] + AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider'] + ASelect: typeof import('ant-design-vue/es')['Select'] + ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] + LoginPage: typeof import('./src/views/Login/LoginPage.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] + TestTheme: typeof import('./src/views/TestTheme.vue')['default'] } } diff --git a/eslint.config.js b/eslint.config.js index 13b2ea6..af9e7d4 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -5,10 +5,16 @@ import pluginVue from "eslint-plugin-vue"; export default [ - {files: ["**/*.{js,mjs,cjs,ts,vue}"]}, - {languageOptions: { globals: {...globals.browser, ...globals.node} }}, - pluginJs.configs.recommended, - ...tseslint.configs.recommended, - ...pluginVue.configs["flat/essential"], - {files: ["**/*.vue"], languageOptions: {parserOptions: {parser: tseslint.parser}}}, -]; \ No newline at end of file + {files: ["**/*.{js,mjs,cjs,ts,vue}"]}, + {languageOptions: {globals: {...globals.browser, ...globals.node}}}, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + ...pluginVue.configs["flat/essential"], + {files: ["**/*.vue"], languageOptions: {parserOptions: {parser: tseslint.parser}}}, + { + rules: { + semi: "error", + "@typescript-eslint/no-explicit-any": "off" + } + } +]; diff --git a/package.json b/package.json index b5cb92b..d186dd6 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "axios": "^1.7.3", "crypto-js": "^4.2.0", "eslint": "9.x", + "less": "^4.2.0", "localforage": "^1.10.0", "pinia": "^2.2.1", "pinia-plugin-persistedstate": "^3.2.1", @@ -24,7 +25,8 @@ "vite-plugin-html": "^3.2.2", "vite-plugin-node-polyfills": "^0.22.0", "vue": "^3.4.31", - "vue-router": "^4.4.3" + "vue-router": "^4.4.3", + "zipson": "^0.2.12" }, "devDependencies": { "@eslint/js": "^9.8.0", diff --git a/src/App.vue b/src/App.vue index 57b5ffe..68f3299 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,4 +1,7 @@ + diff --git a/src/assets/styles/colors.module.scss b/src/assets/styles/colors.module.scss new file mode 100644 index 0000000..696ea24 --- /dev/null +++ b/src/assets/styles/colors.module.scss @@ -0,0 +1,48 @@ +$red: #F5222D; +$orange: #FA541C; +$yellow: #FAAD14; +$cyan: #13C2C2; +$green: #52C41A; +$blue: #2F54EB; +$purple: #722ED1; + + +$colors: ( + "red": ( + primary: $red, + info: $red, + ), + "orange": ( + primary: $orange, + info: $orange, + ), + "yellow": ( + primary: $yellow, + info: $yellow, + ), + "cyan": ( + primary: $cyan, + info: $cyan, + ), + "green": ( + primary: $green, + info: $green, + ), + "blue": ( + primary: $blue, + info: $blue, + ), + "purple": ( + primary: $purple, + info: $purple, + ) +); +:export { + red: $red; + orange: $orange; + yellow: $yellow; + cyan: $cyan; + green: $green; + blue: $blue; + purple: $purple; +} diff --git a/src/assets/styles/variables.scss b/src/assets/styles/scroll-bar.scss similarity index 58% rename from src/assets/styles/variables.scss rename to src/assets/styles/scroll-bar.scss index 54ec063..cb83725 100644 --- a/src/assets/styles/variables.scss +++ b/src/assets/styles/scroll-bar.scss @@ -1,22 +1,19 @@ - +@import "theme"; ::-webkit-scrollbar { width: 6px; height: 8px; } - ::-webkit-scrollbar-button { display: none; } - ::-webkit-scrollbar-thumb { background: rgba(144, 147, 153, 0.3); cursor: pointer; border-radius: 4px; } - ::-webkit-scrollbar-corner { display: none; } @@ -24,3 +21,13 @@ ::-webkit-resizer { display: none; } + +body { + position: relative; + transition: background-color 0.3s, + color 0.3s; + @include useTheme { + background-color: getModeVar('bgColor'); + color: getModeVar('infoColor'); + } +} diff --git a/src/assets/styles/theme.scss b/src/assets/styles/theme.scss new file mode 100644 index 0000000..a22dfe3 --- /dev/null +++ b/src/assets/styles/theme.scss @@ -0,0 +1,36 @@ +@import "colors.module"; + +$modes: ( + light: ( + bgColor: #fff, + infoColor: #000 + ), + dark: ( + bgColor: #000, + infoColor: #fff + ) +); + +$curMode: light; +$curTheme: red; +@mixin useTheme() { + @each $key1, $value1 in $modes { + $curMode: $key1 !global; + @each $key2, $value2 in $colors { + $curTheme: $key2 !global; + html[data-dark='#{$key1}'][data-theme='#{$key2}'] & { + @content; + } + } + } +} + +@function getModeVar($key) { + $modeMap: map-get($modes, $curMode); + @return map-get($modeMap, $key); +} + +@function getColor($key) { + $themeMap: map-get($colors, $curTheme); + @return map-get($themeMap, $key); +} diff --git a/src/layout/default/Layout.vue b/src/layout/default/Layout.vue new file mode 100644 index 0000000..d505570 --- /dev/null +++ b/src/layout/default/Layout.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/main.ts b/src/main.ts index 16e1634..f367e80 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,6 @@ import {createApp} from 'vue' import App from './App.vue' -import '@/assets/styles/variables.scss' +import '@/assets/styles/scroll-bar.scss' import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' //Pinia import {createPinia, Pinia} from 'pinia' diff --git a/src/router/modules/login.ts b/src/router/modules/login.ts index 3a5a1e9..0914b75 100644 --- a/src/router/modules/login.ts +++ b/src/router/modules/login.ts @@ -2,9 +2,9 @@ export default [ { path: '/', name: 'login', - component: () => import('@/views/login/LoginPage.vue'), + component: () => import('@/views/Login/LoginPage.vue'), meta: { title: '登录页' } } -] +]; diff --git a/src/router/modules/test.ts b/src/router/modules/test.ts new file mode 100644 index 0000000..9699fa3 --- /dev/null +++ b/src/router/modules/test.ts @@ -0,0 +1,10 @@ +export default [ + { + path: '/test', + name: 'test', + component: () => import('@/views/TestTheme.vue'), + meta: { + title: '测试' + } + } +]; diff --git a/src/router/router.ts b/src/router/router.ts index c34721b..f162710 100644 --- a/src/router/router.ts +++ b/src/router/router.ts @@ -1,11 +1,17 @@ -import {createRouter, createWebHistory, RouteRecordRaw} from 'vue-router' +import {createRouter, createWebHistory, RouteRecordRaw} from 'vue-router'; -import login from './modules/login' +import login from './modules/login'; +import test from "@/router/modules/test.ts"; -const routes: Array = [...login] + +const routes: Array = [ + ...login, + ...test + +]; const router = createRouter({ history: createWebHistory(), routes -}) -export default router +}); +export default router; diff --git a/src/store/index.ts b/src/store/index.ts index d0c8d4d..90c1fe3 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,7 +1,9 @@ -import {useAuthStore} from '@/store/modules/user.ts' +import {useAuthStore} from '@/store/modules/userStore.ts'; +import {useThemeStore} from "@/store/modules/themeStore.ts"; export default function useStore() { return { - user: useAuthStore() - } + user: useAuthStore(), + theme: useThemeStore() + }; } diff --git a/src/store/modules/themeStore.ts b/src/store/modules/themeStore.ts new file mode 100644 index 0000000..6715e71 --- /dev/null +++ b/src/store/modules/themeStore.ts @@ -0,0 +1,54 @@ +import {defineStore} from 'pinia'; +import {computed, ref} from 'vue'; +import {theme} from 'ant-design-vue'; +import variables from '@/assets/styles/colors.module.scss'; +import {handleLocalforage} from "@/utils/localforage"; +import {parse, stringify} from "zipson/lib"; + +/** + * theme 配置 开启持久化 + */ +export const useThemeStore = defineStore( + 'theme', + () => { + const themeName = ref('green'); // 主题名称 + const darkMode = ref('light'); // 颜色模式 + const darkModeComp = computed(() => { + document.documentElement.setAttribute('data-dark', darkMode.value); + return darkMode.value; + }); + const themeConfig = computed(() => { + document.documentElement.setAttribute('data-theme', themeName.value); + // 主题配置 + return { + token: { + colorPrimary: variables[themeName.value] || '#27ba9b', + colorSuccess: '#1dc779', + colorWarning: '#ffb302', + colorError: '#cf4444', + colorInfo: variables[themeName.value] || '#27ba9b', + wireframe: true + }, + algorithm: darkMode.value === 'light' ? theme.defaultAlgorithm : theme.darkAlgorithm + }; + }); + const setThemeName = (value: string) => { + themeName.value = value; + }; + const toggleDarkMode = () => { + darkMode.value = darkMode.value === 'light' ? 'dark' : 'light'; + }; + return {themeName, themeConfig, darkMode, darkModeComp, setThemeName, toggleDarkMode}; + }, + { + persist: { + key: 'theme', + paths: ['themeName','darkMode',"darkModeComp","themeConfig"], + storage: handleLocalforage, + serializer: { + deserialize: parse, + serialize: stringify, + }, + } + } +); diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts deleted file mode 100644 index 59b8175..0000000 --- a/src/store/modules/user.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {defineStore} from 'pinia' -import {ref} from 'vue' - -export const useAuthStore = defineStore( - 'user', - () => { - const user = ref() - - function setUser(data: any) { - user.value = data - } - - function getUser() { - return user.value - } - - function clearUser() { - user.value = void 0 - } - - return { - user, - setUser, - getUser, - clearUser - } - }, - { - // 开启数据持久化 - persist: true - } -) diff --git a/src/store/modules/userStore.ts b/src/store/modules/userStore.ts new file mode 100644 index 0000000..abce994 --- /dev/null +++ b/src/store/modules/userStore.ts @@ -0,0 +1,44 @@ +import {defineStore} from 'pinia'; +import {ref} from 'vue'; +import {User} from "@/types/user"; +import {parse, stringify} from "zipson/lib"; +import {handleLocalforage} from "@/utils/localforage"; + + +export const useAuthStore = defineStore( + 'user', + () => { + const user = ref(); + + function setUser(data: User) { + user.value = data; + } + + function getUser() { + return user.value; + } + + function clearUser() { + user.value = void 0; + } + + return { + user, + setUser, + getUser, + clearUser + }; + }, + { + // 开启数据持久化 + persist: { + key: 'user', + paths: ['user'], + storage: handleLocalforage, + serializer: { + deserialize: parse, + serialize: stringify, + }, + } + } +); diff --git a/src/types/user.d.ts b/src/types/user.d.ts new file mode 100644 index 0000000..f01c3a0 --- /dev/null +++ b/src/types/user.d.ts @@ -0,0 +1,6 @@ + +export interface User { + token?: string + userId?: string + +} diff --git a/src/utils/localStorage/config.ts b/src/utils/localStorage/config.ts index 825b8aa..ec9130a 100644 --- a/src/utils/localStorage/config.ts +++ b/src/utils/localStorage/config.ts @@ -10,7 +10,7 @@ const config: globalConfig = { isEncrypt: true, //支持加密、解密数据处理 }; -const setStorage = (key: string, value: any, expire: number = 24 * 60): boolean => { +const setStorage = (key: string, value: null | string, expire: number = 24 * 60): boolean => { //设定值 if (value === "" || value === null || value === undefined) { //空值重置 @@ -58,7 +58,7 @@ const getStorageFromKey = (key: string) => { }; const getAllStorage = () => { //获取所有值 - const storageList: any = {}; + const storageList: any= {}; const keys = Object.keys(window[config.type]); keys.forEach((key) => { const value = getStorageFromKey(autoRemovePreFix(key)); diff --git a/src/utils/localforage/index.ts b/src/utils/localforage/index.ts index 7df293b..a075fab 100644 --- a/src/utils/localforage/index.ts +++ b/src/utils/localforage/index.ts @@ -10,7 +10,7 @@ const SECRET_IV = CryptoJS.enc.Utf8.parse("e3bbe7e3ba84431a"); //十六位十六 * @param data * @param output */ -export const encrypt = (data: string, output?: any) => { +export const encrypt = (data: string, output?: undefined) => { const dataHex = CryptoJS.enc.Utf8.parse(data); const encrypted = CryptoJS.AES.encrypt(dataHex, SECRET_KEY, { iv: SECRET_IV, @@ -24,11 +24,11 @@ export const encrypt = (data: string, output?: any) => { * 解密 * @param data */ -export const decrypt = (data: string | null) => { +export const decrypt = (data: string | unknown) => { if (data === null) { return; } - const encryptedHex = CryptoJS.enc.Hex.parse(data); + const encryptedHex = CryptoJS.enc.Hex.parse(data as string); const encryptedHexStr = CryptoJS.enc.Base64.stringify(encryptedHex); const decrypted = CryptoJS.AES.decrypt(encryptedHexStr, SECRET_KEY, { iv: SECRET_IV, @@ -41,29 +41,18 @@ export const decrypt = (data: string | null) => { export const handleLocalforage = { config: async (options?: LocalForageOptions) => localforage.config(options || {}), - setItem: async (key: string, value: string): Promise => { - await localforage.setItem(key, encrypt(value)); + setItem: (key: string, value: string) => { + localforage.setItem(key, encrypt(value)); }, - getItem: async function getItem(key: string): Promise { - try { - const value: any = decrypt(await localforage.getItem(key)) as any; - // 如果值是 undefined,返回 null - if (value === undefined) { - return null; - } - // 如果值是 T 类型,直接返回 - if (typeof value === "object" && value !== null) { - return value as T; - } - // 如果值是 string 类型,直接返回 - return value as string; - } catch (error) { - console.error("Error retrieving data from localforage:", error); - return null; - } + getItem: (key: string) => { + let value: unknown = null; + localforage.getItem(key).then((res: unknown) => { + value = res; + }); + return decrypt(value) as string; }, - removeItem: async (key: string): Promise => { - await localforage.removeItem(key); + removeItem: (key: string) => { + localforage.removeItem(key); }, clear: async () => { return await localforage.clear(); diff --git a/src/views/Login/LoginPage.vue b/src/views/Login/LoginPage.vue new file mode 100644 index 0000000..994a9d1 --- /dev/null +++ b/src/views/Login/LoginPage.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/views/login/index.scss b/src/views/Login/index.scss similarity index 100% rename from src/views/login/index.scss rename to src/views/Login/index.scss diff --git a/src/views/TestTheme.vue b/src/views/TestTheme.vue new file mode 100644 index 0000000..4408566 --- /dev/null +++ b/src/views/TestTheme.vue @@ -0,0 +1,37 @@ + + + + diff --git a/src/views/login/LoginPage.vue b/src/views/login/LoginPage.vue deleted file mode 100644 index 6e52447..0000000 --- a/src/views/login/LoginPage.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 8c4efa2..6634d44 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -12,5 +12,21 @@ interface ImportMeta { readonly env: ImportMetaEnv; } +declare module '*.vue' { + import type { DefineComponent } from 'vue'; + const component: DefineComponent; + export default component; +} +declare module '*.svg' { + const content: any; + export default content; +} +declare module '*.svg' +declare module '*.png' +declare module '*.jpg' +declare module '*.jpeg' +declare module '*.gif' +declare module '*.bmp' +declare module '*.tiff' diff --git a/vite.config.ts b/vite.config.ts index 7752703..b8115ea 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,15 +1,15 @@ -import {defineConfig, loadEnv} from 'vite' -import vue from '@vitejs/plugin-vue' -import * as path from 'path' +import {defineConfig, loadEnv} from 'vite'; +import vue from '@vitejs/plugin-vue'; +import * as path from 'path'; import viteCompression from "vite-plugin-compression"; import {createHtmlPlugin} from "vite-plugin-html"; import {nodePolyfills} from "vite-plugin-node-polyfills"; import Components from 'unplugin-vue-components/vite'; import {AntDesignVueResolver} from 'unplugin-vue-components/resolvers'; -import AutoImport from 'unplugin-auto-import/vite' +import AutoImport from 'unplugin-auto-import/vite'; export default defineConfig(({mode}: { mode: string }): object => { - const env: Record = loadEnv(mode, process.cwd()) + const env: Record = loadEnv(mode, process.cwd()); return { resolve: { //设置别名 @@ -102,16 +102,13 @@ export default defineConfig(({mode}: { mode: string }): object => { output: { chunkFileNames: 'js/[name]-[hash].js', // 引入文件名的名称 entryFileNames: 'js/[name]-[hash].js', // 包的入口文件名称 - assetFileNames: '[ext]/[name]-[hash].[ext]' // 资源文件像 字体,图片等 - } - } - }, - output: { - // 最小化拆分包 - manualChunks(id: string) { - if (id.includes('node_modules')) { - return id.toString().split('node_modules/')[1].split('/')[0].toString() - } + assetFileNames: '[ext]/[name]-[hash].[ext]' ,// 资源文件像 字体,图片等 + manualChunks(id: string){ + if (id.includes('node_modules')) { + return id.toString().split('node_modules/')[1].split('/')[0].toString(); + } + } + }, } }, server: { @@ -125,5 +122,5 @@ export default defineConfig(({mode}: { mode: string }): object => { }, }, }, - } -}) + }; +}); diff --git a/yarn.lock b/yarn.lock index 10821bc..c0537b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1071,6 +1071,13 @@ constants-browserify@^1.0.0: resolved "https://registry.npmmirror.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== +copy-anything@^2.0.1: + version "2.0.6" + resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" + integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== + dependencies: + is-what "^3.14.1" + core-js@^3.15.1: version "3.38.0" resolved "https://registry.npmmirror.com/core-js/-/core-js-3.38.0.tgz#8acb7c050bf2ccbb35f938c0d040132f6110f636" @@ -1336,6 +1343,13 @@ entities@^5.0.0: resolved "https://registry.npmmirror.com/entities/-/entities-5.0.0.tgz#b2ab51fe40d995817979ec79dd621154c3c0f62b" integrity sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA== +errno@^0.1.1: + version "0.1.8" + resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" @@ -1710,7 +1724,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -1813,6 +1827,13 @@ https-browserify@^1.0.0: resolved "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -1823,6 +1844,11 @@ ignore@^5.2.0, ignore@^5.3.1: resolved "https://registry.npmmirror.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -1927,6 +1953,11 @@ is-typed-array@^1.1.3: dependencies: which-typed-array "^1.1.14" +is-what@^3.14.1: + version "3.14.1" + resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -2000,6 +2031,23 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" +less@^4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/less/-/less-4.2.0.tgz#cbefbfaa14a4cd388e2099b2b51f956e1465c450" + integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + levn@^0.4.1: version "0.4.1" resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2073,6 +2121,14 @@ magic-string@^0.30.10, magic-string@^0.30.11, magic-string@^0.30.3: dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -2115,6 +2171,11 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -2181,6 +2242,14 @@ natural-compare@^1.4.0: resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +needle@^3.1.0: + version "3.3.1" + resolved "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz#63f75aec580c2e77e209f3f324e2cdf3d29bd049" + integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q== + dependencies: + iconv-lite "^0.6.3" + sax "^1.2.4" + no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -2333,6 +2402,11 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.7: pbkdf2 "^3.1.2" safe-buffer "^5.2.1" +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + pascal-case@^3.1.2: version "3.1.2" resolved "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" @@ -2397,6 +2471,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinia-plugin-persistedstate@^3.2.1: version "3.2.1" resolved "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.1.tgz#66780602aecd6c7b152dd7e3ddc249a1f7a13fe5" @@ -2468,6 +2547,11 @@ proxy-from-env@^1.1.0: resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -2635,6 +2719,11 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + sass@^1.77.8: version "1.77.8" resolved "https://registry.npmmirror.com/sass/-/sass-1.77.8.tgz#9f18b449ea401759ef7ec1752a16373e296b52bd" @@ -2644,6 +2733,11 @@ sass@^1.77.8: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +sax@^1.2.4: + version "1.4.1" + resolved "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + scroll-into-view-if-needed@^2.2.25: version "2.2.31" resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz#d3c482959dc483e37962d1521254e3295d0d1587" @@ -2656,6 +2750,11 @@ scule@^1.3.0: resolved "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz#6efbd22fd0bb801bdcc585c89266a7d2daa8fbd3" integrity sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g== +semver@^5.6.0: + version "5.7.2" + resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^7.3.6, semver@^7.5.4, semver@^7.6.0: version "7.6.3" resolved "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" @@ -2848,7 +2947,7 @@ ts-api-utils@^1.3.0: resolved "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== -tslib@^2.0.3: +tslib@^2.0.3, tslib@^2.3.0: version "2.6.3" resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== @@ -3151,3 +3250,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zipson@^0.2.12: + version "0.2.12" + resolved "https://registry.npmmirror.com/zipson/-/zipson-0.2.12.tgz#501f92e93f1c602ff908ad2c1c602e72746ecebb" + integrity sha512-+u+fyZQXJUJDTf4NGCChW+LoWGqCrhwHAfvtCtcmE0e40KmQt4YSP4l3TOay1WjRNv+VfODgBD/vNwaSSGnDwA==