fix: stylelint not work
parent
11a36ef03f
commit
59b4f7d9f8
|
@ -134,7 +134,8 @@
|
|||
|
||||
"stylelint.enable": true,
|
||||
"stylelint.packageManager": "pnpm",
|
||||
"stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"],
|
||||
"stylelint.validate": ["css", "less", "postcss", "scss", "vue"],
|
||||
"stylelint.snippet": ["css", "less", "postcss", "scss", "vue"],
|
||||
|
||||
"typescript.inlayHints.enumMemberValues.enabled": true,
|
||||
"typescript.preferences.preferTypeOnlyAutoImports": true,
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
"postcss-html": "^1.7.0",
|
||||
"postcss-scss": "^4.0.9",
|
||||
"prettier": "^3.2.5",
|
||||
"stylelint": "^16.6.0",
|
||||
"stylelint": "^16.6.1",
|
||||
"stylelint-config-recommended": "^14.0.0",
|
||||
"stylelint-config-recommended-scss": "^14.0.0",
|
||||
"stylelint-config-recommended-vue": "^1.5.0",
|
||||
|
|
|
@ -11,7 +11,7 @@ export default {
|
|||
overrides: [
|
||||
{
|
||||
customSyntax: 'postcss-html',
|
||||
files: ['**/*.(css|html|vue)'],
|
||||
files: ['*.(html|vue)', '**/*.(html|vue)'],
|
||||
rules: {
|
||||
'selector-pseudo-class-no-unknown': [
|
||||
true,
|
||||
|
|
|
@ -48,16 +48,19 @@
|
|||
"@iconify/json": "^2.2.214",
|
||||
"@iconify/tailwind": "^1.1.1",
|
||||
"@tailwindcss/forms": "^0.5.7",
|
||||
"@tailwindcss/nesting": "0.0.0-insiders.565cd3e",
|
||||
"@tailwindcss/typography": "^0.5.13",
|
||||
"autoprefixer": "^10.4.19",
|
||||
"cssnano": "^7.0.1",
|
||||
"postcss": "^8.4.38",
|
||||
"postcss-antd-fixes": "^0.2.0",
|
||||
"postcss-import": "^16.1.0",
|
||||
"postcss-preset-env": "^9.5.14",
|
||||
"tailwindcss": "^3.4.3",
|
||||
"tailwindcss-animate": "^1.0.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/postcss-import": "^14.0.3",
|
||||
"@vben/node-utils": "workspace:*"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ import typographyPlugin from '@tailwindcss/typography';
|
|||
import { fs, getPackagesSync } from '@vben/node-utils';
|
||||
import animate from 'tailwindcss-animate';
|
||||
|
||||
import { plugins } from './plugins';
|
||||
// import defaultTheme from 'tailwindcss/defaultTheme';
|
||||
|
||||
const { packages } = getPackagesSync();
|
||||
|
@ -30,13 +29,7 @@ export default {
|
|||
),
|
||||
],
|
||||
darkMode: 'class',
|
||||
plugins: [
|
||||
...plugins,
|
||||
animate,
|
||||
formsPlugin,
|
||||
typographyPlugin,
|
||||
addDynamicIconSelectors(),
|
||||
],
|
||||
plugins: [animate, formsPlugin, typographyPlugin, addDynamicIconSelectors()],
|
||||
prefix: '',
|
||||
safelist: ['dark'],
|
||||
theme: {
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
declare module '@tailwindcss/nesting' {
|
||||
export default any;
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
import type { Config } from 'tailwindcss';
|
||||
|
||||
import plugin from 'tailwindcss/plugin';
|
||||
|
||||
const flexCenterStyles = {
|
||||
'align-items': 'center',
|
||||
display: 'flex',
|
||||
'justify-content': 'center',
|
||||
};
|
||||
|
||||
const plugins = [
|
||||
plugin(({ addUtilities }) => {
|
||||
addUtilities({
|
||||
'.flex-center': flexCenterStyles,
|
||||
'.flex-col-center': {
|
||||
...flexCenterStyles,
|
||||
},
|
||||
});
|
||||
}),
|
||||
] as unknown as Config['plugins'][];
|
||||
|
||||
export { plugins };
|
|
@ -7,8 +7,9 @@ export default {
|
|||
autoprefixer: {},
|
||||
// 修复 element-plus 和 ant-design-vue 的样式和tailwindcss冲突问题
|
||||
'postcss-antd-fixes': { prefixes: ['ant', 'el'] },
|
||||
'postcss-import': {},
|
||||
'postcss-preset-env': {},
|
||||
// here to share the same config across the entire monorepo
|
||||
tailwindcss: { config },
|
||||
'tailwindcss/nesting': {},
|
||||
},
|
||||
};
|
||||
|
|
|
@ -55,11 +55,6 @@ function defineApplicationConfig(options: DefineAppcationOptions = {}) {
|
|||
legalComments: 'none',
|
||||
},
|
||||
plugins,
|
||||
// css: {
|
||||
// preprocessorOptions: {
|
||||
// scss: {
|
||||
// additionalData: `@import "@vben-core/design/global";`,
|
||||
// },
|
||||
resolve: {
|
||||
alias: [
|
||||
{
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
"version": "pnpm exec changeset version && pnpm install --no-frozen-lockfile"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@changesets/cli": "^2.27.3",
|
||||
"@changesets/cli": "^2.27.5",
|
||||
"@ls-lint/ls-lint": "^2.2.3",
|
||||
"@types/jsdom": "^21.1.6",
|
||||
"@types/node": "^20.12.12",
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
import { defineBuildConfig } from 'unbuild';
|
||||
|
||||
export default defineBuildConfig({
|
||||
clean: true,
|
||||
declaration: true,
|
||||
entries: ['src/index'],
|
||||
});
|
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
"name": "@vben-core/cache",
|
||||
"version": "1.0.0",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/vbenjs/vue-vben-admin.git",
|
||||
"directory": "packages/@vben-core/shared/toolkit"
|
||||
},
|
||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||
"scripts": {
|
||||
"build": "pnpm unbuild",
|
||||
"stub": "pnpm unbuild --stub"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"sideEffects": false,
|
||||
"main": "./dist/index.mjs",
|
||||
"module": "./dist/index.mjs",
|
||||
"imports": {
|
||||
"#*": "./src/*"
|
||||
},
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./src/index.ts",
|
||||
"development": "./src/index.ts",
|
||||
"default": "./dist/index.mjs"
|
||||
}
|
||||
},
|
||||
"publishConfig": {
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./dist/index.d.ts",
|
||||
"default": "./dist/index.mjs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
export * from './storage-cache';
|
|
@ -0,0 +1,104 @@
|
|||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import { StorageCache } from './storage-cache';
|
||||
|
||||
describe('storageCache', () => {
|
||||
let localStorageCache: StorageCache;
|
||||
let sessionStorageCache: StorageCache;
|
||||
|
||||
beforeEach(() => {
|
||||
localStorageCache = new StorageCache('prefix_', 'localStorage');
|
||||
sessionStorageCache = new StorageCache('prefix_', 'sessionStorage');
|
||||
localStorage.clear();
|
||||
sessionStorage.clear();
|
||||
vi.useFakeTimers();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
it('should set and get an item with prefix in localStorage', () => {
|
||||
localStorageCache.setItem('testKey', 'testValue');
|
||||
const value = localStorageCache.getItem<string>('testKey');
|
||||
expect(value).toBe('testValue');
|
||||
expect(localStorage.getItem('prefix_testKey')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('should set and get an item with prefix in sessionStorage', () => {
|
||||
sessionStorageCache.setItem('testKey', 'testValue');
|
||||
const value = sessionStorageCache.getItem<string>('testKey');
|
||||
expect(value).toBe('testValue');
|
||||
expect(sessionStorage.getItem('prefix_testKey')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('should return null for expired item in localStorage', () => {
|
||||
localStorageCache.setItem('testKey', 'testValue', 1 / 60); // 1 second expiry
|
||||
vi.advanceTimersByTime(2000); // Fast-forward 2 seconds
|
||||
const value = localStorageCache.getItem<string>('testKey');
|
||||
expect(value).toBeNull();
|
||||
});
|
||||
|
||||
it('should return null for expired item in sessionStorage', () => {
|
||||
sessionStorageCache.setItem('testKey', 'testValue', 1 / 60); // 1 second expiry
|
||||
vi.advanceTimersByTime(2000); // Fast-forward 2 seconds
|
||||
const value = sessionStorageCache.getItem<string>('testKey');
|
||||
expect(value).toBeNull();
|
||||
});
|
||||
|
||||
it('should remove an item with prefix in localStorage', () => {
|
||||
localStorageCache.setItem('testKey', 'testValue');
|
||||
localStorageCache.removeItem('testKey');
|
||||
const value = localStorageCache.getItem<string>('testKey');
|
||||
expect(value).toBeNull();
|
||||
expect(localStorage.getItem('prefix_testKey')).toBeNull();
|
||||
});
|
||||
|
||||
it('should remove an item with prefix in sessionStorage', () => {
|
||||
sessionStorageCache.setItem('testKey', 'testValue');
|
||||
sessionStorageCache.removeItem('testKey');
|
||||
const value = sessionStorageCache.getItem<string>('testKey');
|
||||
expect(value).toBeNull();
|
||||
expect(sessionStorage.getItem('prefix_testKey')).toBeNull();
|
||||
});
|
||||
|
||||
it('should clear all items in localStorage', () => {
|
||||
localStorageCache.setItem('testKey1', 'testValue1');
|
||||
localStorageCache.setItem('testKey2', 'testValue2');
|
||||
localStorageCache.clear();
|
||||
expect(localStorageCache.length()).toBe(0);
|
||||
});
|
||||
|
||||
it('should clear all items in sessionStorage', () => {
|
||||
sessionStorageCache.setItem('testKey1', 'testValue1');
|
||||
sessionStorageCache.setItem('testKey2', 'testValue2');
|
||||
sessionStorageCache.clear();
|
||||
expect(sessionStorageCache.length()).toBe(0);
|
||||
});
|
||||
|
||||
it('should return correct length in localStorage', () => {
|
||||
localStorageCache.setItem('testKey1', 'testValue1');
|
||||
localStorageCache.setItem('testKey2', 'testValue2');
|
||||
expect(localStorageCache.length()).toBe(2);
|
||||
});
|
||||
|
||||
it('should return correct length in sessionStorage', () => {
|
||||
sessionStorageCache.setItem('testKey1', 'testValue1');
|
||||
sessionStorageCache.setItem('testKey2', 'testValue2');
|
||||
expect(sessionStorageCache.length()).toBe(2);
|
||||
});
|
||||
|
||||
it('should return correct key by index in localStorage', () => {
|
||||
localStorageCache.setItem('testKey1', 'testValue1');
|
||||
localStorageCache.setItem('testKey2', 'testValue2');
|
||||
expect(localStorageCache.key(0)).toBe('prefix_testKey1');
|
||||
expect(localStorageCache.key(1)).toBe('prefix_testKey2');
|
||||
});
|
||||
|
||||
it('should return correct key by index in sessionStorage', () => {
|
||||
sessionStorageCache.setItem('testKey1', 'testValue1');
|
||||
sessionStorageCache.setItem('testKey2', 'testValue2');
|
||||
expect(sessionStorageCache.key(0)).toBe('prefix_testKey1');
|
||||
expect(sessionStorageCache.key(1)).toBe('prefix_testKey2');
|
||||
});
|
||||
});
|
|
@ -0,0 +1,145 @@
|
|||
import type { IStorageCache, StorageType, StorageValue } from './types';
|
||||
|
||||
class StorageCache implements IStorageCache {
|
||||
protected prefix: string;
|
||||
protected storage: Storage;
|
||||
|
||||
constructor(prefix: string = '', storageType: StorageType = 'localStorage') {
|
||||
this.prefix = prefix;
|
||||
this.storage =
|
||||
storageType === 'localStorage' ? localStorage : sessionStorage;
|
||||
}
|
||||
|
||||
// 获取带前缀的键名
|
||||
private getFullKey(key: string): string {
|
||||
return this.prefix + key;
|
||||
}
|
||||
|
||||
// 获取项之后的钩子方法
|
||||
protected afterGetItem<T>(_key: string, _value: T | null): void {}
|
||||
|
||||
// 设置项之后的钩子方法
|
||||
protected afterSetItem<T>(
|
||||
_key: string,
|
||||
_value: T,
|
||||
_expiryInMinutes?: number,
|
||||
): void {}
|
||||
|
||||
// 获取项之前的钩子方法
|
||||
protected beforeGetItem(_key: string): void {}
|
||||
|
||||
// 设置项之前的钩子方法
|
||||
protected beforeSetItem<T>(
|
||||
_key: string,
|
||||
_value: T,
|
||||
_expiryInMinutes?: number,
|
||||
): void {}
|
||||
|
||||
/**
|
||||
* 清空存储
|
||||
*/
|
||||
clear(): void {
|
||||
try {
|
||||
this.storage.clear();
|
||||
} catch (error) {
|
||||
console.error('Error clearing storage', error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取存储项
|
||||
* @param key 存储键
|
||||
* @returns 存储值或 null
|
||||
*/
|
||||
getItem<T>(key: string): T | null {
|
||||
const fullKey = this.getFullKey(key);
|
||||
this.beforeGetItem(fullKey);
|
||||
|
||||
let value: T | null = null;
|
||||
try {
|
||||
const item = this.storage.getItem(fullKey);
|
||||
if (item) {
|
||||
const storageValue: StorageValue<T> = JSON.parse(item);
|
||||
if (storageValue.expiry && storageValue.expiry < Date.now()) {
|
||||
this.storage.removeItem(fullKey);
|
||||
} else {
|
||||
value = storageValue.data;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error getting item from storage', error);
|
||||
}
|
||||
|
||||
this.afterGetItem(fullKey, value);
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取存储中的键
|
||||
* @param index 键的索引
|
||||
* @returns 存储键或 null
|
||||
*/
|
||||
key(index: number): null | string {
|
||||
try {
|
||||
return this.storage.key(index);
|
||||
} catch (error) {
|
||||
console.error('Error getting key from storage', error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取存储项的数量
|
||||
* @returns 存储项的数量
|
||||
*/
|
||||
length(): number {
|
||||
try {
|
||||
return this.storage.length;
|
||||
} catch (error) {
|
||||
console.error('Error getting storage length', error);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除存储项
|
||||
* @param key 存储键
|
||||
*/
|
||||
removeItem(key: string): void {
|
||||
const fullKey = this.getFullKey(key);
|
||||
try {
|
||||
this.storage.removeItem(fullKey);
|
||||
} catch (error) {
|
||||
console.error('Error removing item from storage', error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置存储项
|
||||
* @param key 存储键
|
||||
* @param value 存储值
|
||||
* @param expiryInMinutes 过期时间(分钟)
|
||||
*/
|
||||
setItem<T>(key: string, value: T, expiryInMinutes?: number): void {
|
||||
const fullKey = this.getFullKey(key);
|
||||
this.beforeSetItem(fullKey, value, expiryInMinutes);
|
||||
|
||||
const now = Date.now();
|
||||
const expiry = expiryInMinutes ? now + expiryInMinutes * 60_000 : null;
|
||||
|
||||
const storageValue: StorageValue<T> = {
|
||||
data: value,
|
||||
expiry,
|
||||
};
|
||||
|
||||
try {
|
||||
this.storage.setItem(fullKey, JSON.stringify(storageValue));
|
||||
} catch (error) {
|
||||
console.error('Error setting item in storage', error);
|
||||
}
|
||||
|
||||
this.afterSetItem(fullKey, value, expiryInMinutes);
|
||||
}
|
||||
}
|
||||
|
||||
export { StorageCache };
|
|
@ -0,0 +1,17 @@
|
|||
type StorageType = 'localStorage' | 'sessionStorage';
|
||||
|
||||
interface StorageValue<T> {
|
||||
data: T;
|
||||
expiry: null | number;
|
||||
}
|
||||
|
||||
interface IStorageCache {
|
||||
clear(): void;
|
||||
getItem<T>(key: string): T | null;
|
||||
key(index: number): null | string;
|
||||
length(): number;
|
||||
removeItem(key: string): void;
|
||||
setItem<T>(key: string, value: T, expiryInMinutes?: number): void;
|
||||
}
|
||||
|
||||
export type { IStorageCache, StorageType, StorageValue };
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/tsconfig",
|
||||
"extends": "@vben/tsconfig/library.json",
|
||||
"include": ["src"]
|
||||
}
|
|
@ -76,4 +76,6 @@
|
|||
|
||||
/* 基本圆角大小 */
|
||||
--radius-base: 0.5rem;
|
||||
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
|
|
@ -89,5 +89,8 @@
|
|||
// --color-menu-opened-dark: 225deg 12.12% 11%;
|
||||
--color-menu: 0deg 0% 100%;
|
||||
--color-menu-darken: 0deg 0% 95%;
|
||||
|
||||
accent-color: var(--color-primary);
|
||||
color-scheme: light;
|
||||
// --color-menu-opened: 0deg 0% 100%;
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ export default defineBuildConfig({
|
|||
{
|
||||
builder: 'mkdist',
|
||||
input: './src',
|
||||
// loaders: ['postcss'],
|
||||
loaders: ['postcss'],
|
||||
outDir: './dist',
|
||||
pattern: ['tailwind.css'],
|
||||
},
|
||||
|
|
|
@ -34,7 +34,7 @@ html {
|
|||
font-synthesis-weight: none;
|
||||
scroll-behavior: smooth;
|
||||
text-rendering: optimizelegibility;
|
||||
-webkit-tap-highlight-color: rgb(128 128 128 / 50%);
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
}
|
||||
|
||||
a,
|
||||
|
|
|
@ -8,20 +8,31 @@
|
|||
}
|
||||
}
|
||||
|
||||
@layer components {
|
||||
@layer utilities {
|
||||
.flex-center {
|
||||
@apply flex items-center justify-center;
|
||||
}
|
||||
|
||||
.flex-col-center {
|
||||
@apply flex flex-col items-center justify-center;
|
||||
}
|
||||
|
||||
.outline-box {
|
||||
&:after {
|
||||
@apply outline-border relative cursor-pointer rounded-md p-1 outline outline-1;
|
||||
|
||||
&::after {
|
||||
@apply absolute left-1/2 top-1/2 z-20 h-0 w-[1px] rounded-sm opacity-0 outline outline-2 outline-transparent transition-all duration-300 content-[''];
|
||||
}
|
||||
|
||||
&.outline-box-active {
|
||||
@apply outline-primary outline outline-2;
|
||||
&:after {
|
||||
|
||||
&::after {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&:not(.outline-box-active):hover:after {
|
||||
&:not(.outline-box-active):hover::after {
|
||||
@apply outline-primary left-0 top-0 h-full w-full p-1 opacity-100;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ function handleGo(path: string) {
|
|||
</template>
|
||||
</Title>
|
||||
|
||||
<div class="mt-6 flex flex-col items-center justify-center">
|
||||
<div class="flex-col-center mt-6">
|
||||
<img :src="qrcode" alt="qrcode" class="w-1/2" />
|
||||
<p class="text-muted-foreground mt-4 text-sm">
|
||||
{{ $t('authentication.qrcode-prompt') }}
|
||||
|
|
|
@ -63,7 +63,7 @@ function back() {
|
|||
>
|
||||
<img v-if="image" :src="image" class="md:1/3 w-1/2 lg:w-1/4" />
|
||||
<FeedbackIcon v-else class="md:1/3 h-1/3 w-1/2 lg:w-1/4" />
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<div class="flex-col-center">
|
||||
<p class="text-foreground mt-12 text-3xl md:text-4xl lg:text-5xl">
|
||||
{{ titleText }}
|
||||
</p>
|
||||
|
|
|
@ -12,7 +12,7 @@ defineOptions({
|
|||
|
||||
<template>
|
||||
<VbenButton
|
||||
class="bg-primary flex-center h-9 w-9 cursor-pointer flex-col rounded-l-md rounded-r-none border-none"
|
||||
class="bg-primary flex-col-center h-9 w-9 cursor-pointer rounded-l-md rounded-r-none border-none"
|
||||
:title="$t('preference.preferences')"
|
||||
>
|
||||
<IconSetting class="text-lg" />
|
||||
|
|
|
@ -59,9 +59,7 @@ watch(
|
|||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@vben-core/design/global';
|
||||
|
||||
<style scoped>
|
||||
@keyframes jump-ani {
|
||||
15% {
|
||||
border-bottom-right-radius: 3px;
|
||||
|
|
|
@ -47,7 +47,7 @@ const { authPanelCenter, authPanelLeft, authPanelRight } = usePreference();
|
|||
<div
|
||||
class="absolute inset-0 h-full w-full bg-[var(--color-authentication)]"
|
||||
>
|
||||
<div class="flex-center mr-20 flex h-full flex-col">
|
||||
<div class="flex-col-center mr-20 h-full">
|
||||
<SloganIcon
|
||||
:alt="preference.appName"
|
||||
class="animate-float h-64 w-2/5"
|
||||
|
|
|
@ -8,9 +8,7 @@ defineOptions({
|
|||
});
|
||||
</script>
|
||||
<template>
|
||||
<div
|
||||
class="relative flex flex-col items-center justify-center px-6 py-10 lg:flex-initial lg:px-8"
|
||||
>
|
||||
<div class="flex-col-center relative px-6 py-10 lg:flex-initial lg:px-8">
|
||||
<slot name="toolbar">
|
||||
<Toolbar />
|
||||
</slot>
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
:root.dark {
|
||||
/* authentication */
|
||||
--color-authentication: hsl(240deg 11% 2%);
|
||||
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
|
707
pnpm-lock.yaml
707
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
|
@ -20,6 +20,8 @@
|
|||
},
|
||||
"stub": {},
|
||||
"dev": {
|
||||
"dependsOn": ["^build"],
|
||||
"outputs": [""],
|
||||
"cache": false,
|
||||
"persistent": true
|
||||
},
|
||||
|
|
|
@ -40,6 +40,10 @@
|
|||
"name": "@vben/vite-config",
|
||||
"path": "internal/vite-config",
|
||||
},
|
||||
{
|
||||
"name": "@vben-core/cache",
|
||||
"path": "packages/@vben-core/shared/chche",
|
||||
},
|
||||
{
|
||||
"name": "@vben-core/design",
|
||||
"path": "packages/@vben-core/shared/design",
|
||||
|
|
Loading…
Reference in New Issue