Commit 41d79008c55c96a5aeda5bb2a23d70575fc41333

Authored by vben
1 parent 0692b479

refactor: refactor setting

CHANGELOG.zh_CN.md
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 ### ✨ Refactor 3 ### ✨ Refactor
4 4
5 - 重构整体 layout。更改代码实现方式。代码更精简 5 - 重构整体 layout。更改代码实现方式。代码更精简
  6 +- 配置项重构
6 7
7 ### ✨ Features 8 ### ✨ Features
8 9
@@ -11,6 +12,7 @@ @@ -11,6 +12,7 @@
11 ### 🎫 Chores 12 ### 🎫 Chores
12 13
13 - 移除 messageSetting 配置 14 - 移除 messageSetting 配置
  15 +- 更新 antdv 到`2.0.0-rc.2`
14 - 暂时删除 `@vueuse/core`.等稳定后在集成。目前不太稳定。 16 - 暂时删除 `@vueuse/core`.等稳定后在集成。目前不太稳定。
15 17
16 ## 2.0.0-rc.11 (2020-11-18) 18 ## 2.0.0-rc.11 (2020-11-18)
package.json
@@ -22,7 +22,7 @@ @@ -22,7 +22,7 @@
22 }, 22 },
23 "dependencies": { 23 "dependencies": {
24 "@iconify/iconify": "^2.0.0-rc.2", 24 "@iconify/iconify": "^2.0.0-rc.2",
25 - "ant-design-vue": "2.0.0-beta.15", 25 + "ant-design-vue": "2.0.0-rc.2",
26 "apexcharts": "3.22.0", 26 "apexcharts": "3.22.0",
27 "axios": "^0.21.0", 27 "axios": "^0.21.0",
28 "crypto-es": "^1.2.6", 28 "crypto-es": "^1.2.6",
src/hooks/core/useContext.ts
@@ -5,9 +5,8 @@ export const createContext = <T>( @@ -5,9 +5,8 @@ export const createContext = <T>(
5 contextInjectKey: InjectionKey<T> = Symbol(), 5 contextInjectKey: InjectionKey<T> = Symbol(),
6 _readonly = true 6 _readonly = true
7 ) => { 7 ) => {
8 - const state = reactive({  
9 - ...context,  
10 - }); 8 + const state = reactive({ ...context });
  9 +
11 const provideData = _readonly ? readonly(state) : state; 10 const provideData = _readonly ? readonly(state) : state;
12 provide(contextInjectKey, provideData); 11 provide(contextInjectKey, provideData);
13 }; 12 };
src/hooks/setting/useRootSetting.ts
@@ -12,16 +12,10 @@ type RootSetting = Omit&lt; @@ -12,16 +12,10 @@ type RootSetting = Omit&lt;
12 export function useRootSetting() { 12 export function useRootSetting() {
13 const getRootSetting = computed((): RootSetting => appStore.getProjectConfig); 13 const getRootSetting = computed((): RootSetting => appStore.getProjectConfig);
14 14
15 - const getOpenPageLoading = computed(() => unref(getRootSetting).openPageLoading);  
16 -  
17 const getPageLoading = computed(() => appStore.getPageLoading); 15 const getPageLoading = computed(() => appStore.getPageLoading);
18 16
19 - const getOpenRouterTransition = computed(() => unref(getRootSetting).openRouterTransition);  
20 -  
21 const getOpenKeepAlive = computed(() => unref(getRootSetting).openKeepAlive); 17 const getOpenKeepAlive = computed(() => unref(getRootSetting).openKeepAlive);
22 18
23 - const getRouterTransition = computed(() => unref(getRootSetting).routerTransition);  
24 -  
25 const getCanEmbedIFramePage = computed(() => unref(getRootSetting).canEmbedIFramePage); 19 const getCanEmbedIFramePage = computed(() => unref(getRootSetting).canEmbedIFramePage);
26 20
27 const getPermissionMode = computed(() => unref(getRootSetting).permissionMode); 21 const getPermissionMode = computed(() => unref(getRootSetting).permissionMode);
@@ -65,10 +59,7 @@ export function useRootSetting() { @@ -65,10 +59,7 @@ export function useRootSetting() {
65 getRootSetting, 59 getRootSetting,
66 getLayoutContentMode, 60 getLayoutContentMode,
67 getPageLoading, 61 getPageLoading,
68 - getOpenPageLoading,  
69 - getOpenRouterTransition,  
70 getOpenKeepAlive, 62 getOpenKeepAlive,
71 - getRouterTransition,  
72 getCanEmbedIFramePage, 63 getCanEmbedIFramePage,
73 getPermissionMode, 64 getPermissionMode,
74 getShowLogo, 65 getShowLogo,
src/hooks/setting/useTransitionSetting.ts 0 → 100644
  1 +import type { TransitionSetting } from '/@/types/config';
  2 +
  3 +import { computed, unref } from 'vue';
  4 +
  5 +import { appStore } from '/@/store/modules/app';
  6 +
  7 +export function useTransitionSetting() {
  8 + const getTransitionSetting = computed(() => appStore.getProjectConfig.transitionSetting);
  9 +
  10 + const getEnableTransition = computed(() => unref(getTransitionSetting).enable);
  11 +
  12 + const getOpenNProgress = computed(() => unref(getTransitionSetting)?.openNProgress);
  13 +
  14 + const getOpenPageLoading = computed(() => {
  15 + return unref(getTransitionSetting)?.openPageLoading && unref(getEnableTransition);
  16 + });
  17 +
  18 + const getBasicTransition = computed(() => unref(getTransitionSetting)?.basicTransition);
  19 +
  20 + function setTransitionSetting(transitionSetting: Partial<TransitionSetting>) {
  21 + appStore.commitProjectConfigState({ transitionSetting });
  22 + }
  23 +
  24 + return {
  25 + setTransitionSetting,
  26 +
  27 + getTransitionSetting,
  28 + getEnableTransition,
  29 + getOpenNProgress,
  30 + getOpenPageLoading,
  31 + getBasicTransition,
  32 + };
  33 +}
src/layouts/default/content/index.less
@@ -11,11 +11,15 @@ @@ -11,11 +11,15 @@
11 } 11 }
12 12
13 &__loading { 13 &__loading {
14 - position: fixed; 14 + position: absolute;
15 z-index: @page-loading-z-index; 15 z-index: @page-loading-z-index;
16 16
  17 + &.fill {
  18 + background: rgba(240, 242, 245) !important;
  19 + }
  20 +
17 > .basic-loading { 21 > .basic-loading {
18 - margin-bottom: 20%; 22 + margin-bottom: 30%;
19 } 23 }
20 } 24 }
21 } 25 }
src/layouts/default/content/index.tsx
1 import './index.less'; 1 import './index.less';
2 2
3 -import { defineComponent, unref } from 'vue'; 3 +import { defineComponent, unref, computed } from 'vue';
4 import { FullLoading } from '/@/components/Loading/index'; 4 import { FullLoading } from '/@/components/Loading/index';
5 5
6 import { RouterView } from 'vue-router'; 6 import { RouterView } from 'vue-router';
7 7
8 import { useRootSetting } from '/@/hooks/setting/useRootSetting'; 8 import { useRootSetting } from '/@/hooks/setting/useRootSetting';
  9 +import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
  10 +import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
9 11
10 export default defineComponent({ 12 export default defineComponent({
11 name: 'LayoutContent', 13 name: 'LayoutContent',
12 setup() { 14 setup() {
13 - const { getOpenPageLoading, getLayoutContentMode, getPageLoading } = useRootSetting(); 15 + const { getOpenPageLoading } = useTransitionSetting();
  16 + const { getShowMultipleTab } = useMultipleTabSetting();
  17 + const { getLayoutContentMode, getPageLoading } = useRootSetting();
14 18
  19 + const getLoadingClass = computed(() => {
  20 + return [
  21 + `layout-content__loading`,
  22 + { fill: unref(getShowMultipleTab), hidden: !unref(getPageLoading) },
  23 + ];
  24 + });
15 return () => { 25 return () => {
16 return ( 26 return (
17 <div class={['layout-content', unref(getLayoutContentMode)]}> 27 <div class={['layout-content', unref(getLayoutContentMode)]}>
18 - {unref(getOpenPageLoading) && (  
19 - <FullLoading class={[`layout-content__loading`, { hidden: !unref(getPageLoading) }]} />  
20 - )} 28 + {unref(getOpenPageLoading) && <FullLoading class={unref(getLoadingClass)} />}
21 <RouterView /> 29 <RouterView />
22 </div> 30 </div>
23 ); 31 );
src/layouts/default/multitabs/index.tsx
@@ -24,14 +24,13 @@ export default defineComponent({ @@ -24,14 +24,13 @@ export default defineComponent({
24 name: 'MultiTabs', 24 name: 'MultiTabs',
25 setup() { 25 setup() {
26 let isAddAffix = false; 26 let isAddAffix = false;
  27 +
27 const go = useGo(); 28 const go = useGo();
  29 +
28 const { currentRoute } = useRouter(); 30 const { currentRoute } = useRouter();
29 const { activeKeyRef } = useTabs(); 31 const { activeKeyRef } = useTabs();
30 32
31 - // 当前tab列表  
32 - const getTabsState = computed(() => {  
33 - return tabStore.getTabsState;  
34 - }); 33 + const getTabsState = computed(() => tabStore.getTabsState);
35 34
36 // If you monitor routing changes, tab switching will be stuck. So setting this method 35 // If you monitor routing changes, tab switching will be stuck. So setting this method
37 watch( 36 watch(
@@ -43,6 +42,7 @@ export default defineComponent({ @@ -43,6 +42,7 @@ export default defineComponent({
43 } 42 }
44 43
45 const lastChangeRoute = unref(tabStore.getLastChangeRouteState); 44 const lastChangeRoute = unref(tabStore.getLastChangeRouteState);
  45 +
46 if (!lastChangeRoute || !userStore.getTokenState) return; 46 if (!lastChangeRoute || !userStore.getTokenState) return;
47 47
48 const { path, fullPath } = lastChangeRoute; 48 const { path, fullPath } = lastChangeRoute;
src/layouts/default/setting/SettingDrawer.tsx
@@ -17,6 +17,7 @@ import { useRootSetting } from &#39;/@/hooks/setting/useRootSetting&#39;; @@ -17,6 +17,7 @@ import { useRootSetting } from &#39;/@/hooks/setting/useRootSetting&#39;;
17 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; 17 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
18 import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting'; 18 import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
19 import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting'; 19 import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
  20 +import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
20 21
21 import { updateColorWeak, updateGrayMode } from '/@/setup/theme'; 22 import { updateColorWeak, updateGrayMode } from '/@/setup/theme';
22 23
@@ -177,9 +178,6 @@ export default defineComponent({ @@ -177,9 +178,6 @@ export default defineComponent({
177 setup(_, { attrs }) { 178 setup(_, { attrs }) {
178 const { 179 const {
179 getContentMode, 180 getContentMode,
180 - getRouterTransition,  
181 - getOpenRouterTransition,  
182 - getOpenPageLoading,  
183 getShowFooter, 181 getShowFooter,
184 getShowBreadCrumb, 182 getShowBreadCrumb,
185 getShowBreadCrumbIcon, 183 getShowBreadCrumbIcon,
@@ -190,6 +188,13 @@ export default defineComponent({ @@ -190,6 +188,13 @@ export default defineComponent({
190 } = useRootSetting(); 188 } = useRootSetting();
191 189
192 const { 190 const {
  191 + getOpenPageLoading,
  192 + getBasicTransition,
  193 + getEnableTransition,
  194 + getOpenNProgress,
  195 + } = useTransitionSetting();
  196 +
  197 + const {
193 getIsHorizontal, 198 getIsHorizontal,
194 getShowMenu, 199 getShowMenu,
195 getMenuType, 200 getMenuType,
@@ -447,27 +452,34 @@ export default defineComponent({ @@ -447,27 +452,34 @@ export default defineComponent({
447 function renderTransition() { 452 function renderTransition() {
448 return ( 453 return (
449 <> 454 <>
450 - {renderSwitchItem('页面切换loading', { 455 + {renderSwitchItem('顶部进度条', {
  456 + handler: (e) => {
  457 + baseHandler(HandlerEnum.OPEN_PROGRESS, e);
  458 + },
  459 + def: unref(getOpenNProgress),
  460 + })}
  461 + {renderSwitchItem('切换loading', {
451 handler: (e) => { 462 handler: (e) => {
452 baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e); 463 baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e);
453 }, 464 },
454 def: unref(getOpenPageLoading), 465 def: unref(getOpenPageLoading),
  466 + disabled: !unref(getEnableTransition),
455 })} 467 })}
456 468
457 {renderSwitchItem('切换动画', { 469 {renderSwitchItem('切换动画', {
458 handler: (e) => { 470 handler: (e) => {
459 baseHandler(HandlerEnum.OPEN_ROUTE_TRANSITION, e); 471 baseHandler(HandlerEnum.OPEN_ROUTE_TRANSITION, e);
460 }, 472 },
461 - def: unref(getOpenRouterTransition), 473 + def: unref(getEnableTransition),
462 })} 474 })}
463 475
464 - {renderSelectItem('路由动画', { 476 + {renderSelectItem('动画类型', {
465 handler: (e) => { 477 handler: (e) => {
466 baseHandler(HandlerEnum.ROUTER_TRANSITION, e); 478 baseHandler(HandlerEnum.ROUTER_TRANSITION, e);
467 }, 479 },
468 - def: unref(getRouterTransition), 480 + def: unref(getBasicTransition),
469 options: routerTransitionOptions, 481 options: routerTransitionOptions,
470 - disabled: !unref(getOpenRouterTransition), 482 + disabled: !unref(getEnableTransition),
471 })} 483 })}
472 </> 484 </>
473 ); 485 );
src/layouts/default/setting/enum.ts
@@ -29,9 +29,6 @@ export enum HandlerEnum { @@ -29,9 +29,6 @@ export enum HandlerEnum {
29 TABS_SHOW_QUICK, 29 TABS_SHOW_QUICK,
30 TABS_SHOW, 30 TABS_SHOW,
31 31
32 - OPEN_PAGE_LOADING,  
33 - OPEN_ROUTE_TRANSITION,  
34 - ROUTER_TRANSITION,  
35 LOCK_TIME, 32 LOCK_TIME,
36 FULL_CONTENT, 33 FULL_CONTENT,
37 CONTENT_MODE, 34 CONTENT_MODE,
@@ -41,6 +38,11 @@ export enum HandlerEnum { @@ -41,6 +38,11 @@ export enum HandlerEnum {
41 COLOR_WEAK, 38 COLOR_WEAK,
42 SHOW_LOGO, 39 SHOW_LOGO,
43 SHOW_FOOTER, 40 SHOW_FOOTER,
  41 +
  42 + ROUTER_TRANSITION,
  43 + OPEN_PROGRESS,
  44 + OPEN_PAGE_LOADING,
  45 + OPEN_ROUTE_TRANSITION,
44 } 46 }
45 47
46 export const themeOptions = [ 48 export const themeOptions = [
src/layouts/default/setting/handler.ts
@@ -66,17 +66,20 @@ export function handler(event: HandlerEnum, value: any): DeepPartial&lt;ProjectConf @@ -66,17 +66,20 @@ export function handler(event: HandlerEnum, value: any): DeepPartial&lt;ProjectConf
66 case HandlerEnum.MENU_SHOW_SEARCH: 66 case HandlerEnum.MENU_SHOW_SEARCH:
67 return { menuSetting: { showSearch: value } }; 67 return { menuSetting: { showSearch: value } };
68 68
69 - // ============root==================  
70 - 69 + // ============transition==================
71 case HandlerEnum.OPEN_PAGE_LOADING: 70 case HandlerEnum.OPEN_PAGE_LOADING:
72 appStore.commitPageLoadingState(false); 71 appStore.commitPageLoadingState(false);
73 - return { openPageLoading: value }; 72 + return { transitionSetting: { openPageLoading: value } };
  73 +
  74 + case HandlerEnum.ROUTER_TRANSITION:
  75 + return { transitionSetting: { basicTransition: value } };
74 76
75 case HandlerEnum.OPEN_ROUTE_TRANSITION: 77 case HandlerEnum.OPEN_ROUTE_TRANSITION:
76 - return { openRouterTransition: value }; 78 + return { transitionSetting: { enable: value } };
77 79
78 - case HandlerEnum.ROUTER_TRANSITION:  
79 - return { routerTransition: value }; 80 + case HandlerEnum.OPEN_PROGRESS:
  81 + return { transitionSetting: { openNProgress: value } };
  82 + // ============root==================
80 83
81 case HandlerEnum.LOCK_TIME: 84 case HandlerEnum.LOCK_TIME:
82 return { lockTime: value }; 85 return { lockTime: value };
src/layouts/page/index.tsx
@@ -11,6 +11,7 @@ import { useRootSetting } from &#39;/@/hooks/setting/useRootSetting&#39;; @@ -11,6 +11,7 @@ import { useRootSetting } from &#39;/@/hooks/setting/useRootSetting&#39;;
11 import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting'; 11 import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
12 12
13 import { tabStore } from '/@/store/modules/tab'; 13 import { tabStore } from '/@/store/modules/tab';
  14 +import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
14 15
15 interface DefaultContext { 16 interface DefaultContext {
16 Component: FunctionalComponent; 17 Component: FunctionalComponent;
@@ -21,12 +22,9 @@ export default defineComponent({ @@ -21,12 +22,9 @@ export default defineComponent({
21 name: 'PageLayout', 22 name: 'PageLayout',
22 setup() { 23 setup() {
23 const { getShowMenu } = useMenuSetting(); 24 const { getShowMenu } = useMenuSetting();
24 - const {  
25 - getOpenKeepAlive,  
26 - getRouterTransition,  
27 - getOpenRouterTransition,  
28 - getCanEmbedIFramePage,  
29 - } = useRootSetting(); 25 + const { getOpenKeepAlive, getCanEmbedIFramePage } = useRootSetting();
  26 +
  27 + const { getBasicTransition, getEnableTransition } = useTransitionSetting();
30 28
31 const { getMax } = useMultipleTabSetting(); 29 const { getMax } = useMultipleTabSetting();
32 30
@@ -45,7 +43,7 @@ export default defineComponent({ @@ -45,7 +43,7 @@ export default defineComponent({
45 // No longer show animations that are already in the tab 43 // No longer show animations that are already in the tab
46 const cacheTabs = unref(getCacheTabsRef); 44 const cacheTabs = unref(getCacheTabsRef);
47 const isInCache = cacheTabs.includes(route.name as string); 45 const isInCache = cacheTabs.includes(route.name as string);
48 - const name = isInCache && route.meta.inTab ? 'fade' : null; 46 + const name = isInCache && route.meta.inTab ? 'fade-slide' : null;
49 47
50 const renderComp = () => <Component key={route.fullPath} />; 48 const renderComp = () => <Component key={route.fullPath} />;
51 49
@@ -57,10 +55,10 @@ export default defineComponent({ @@ -57,10 +55,10 @@ export default defineComponent({
57 renderComp() 55 renderComp()
58 ); 56 );
59 57
60 - return unref(getOpenRouterTransition) ? ( 58 + return unref(getEnableTransition) ? (
61 <Transition 59 <Transition
62 {...transitionEvent} 60 {...transitionEvent}
63 - name={name || route.meta.transitionName || unref(getRouterTransition)} 61 + name={name || route.meta.transitionName || unref(getBasicTransition)}
64 mode="out-in" 62 mode="out-in"
65 appear={true} 63 appear={true}
66 > 64 >
src/layouts/page/useTransition.ts
1 -import { useRootSetting } from '/@/hooks/setting/useRootSetting'; 1 +import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
  2 +
2 import { appStore } from '/@/store/modules/app'; 3 import { appStore } from '/@/store/modules/app';
3 import { tryOnUnmounted } from '/@/utils/helper/vueHelper'; 4 import { tryOnUnmounted } from '/@/utils/helper/vueHelper';
4 5
5 export function useTransition() { 6 export function useTransition() {
6 function handleAfterEnter() { 7 function handleAfterEnter() {
7 - const { getOpenPageLoading, getOpenRouterTransition } = useRootSetting();  
8 - if (!getOpenPageLoading.value || !getOpenRouterTransition.value) return; 8 + const { getOpenPageLoading, getEnableTransition } = useTransitionSetting();
  9 + if (!getOpenPageLoading.value || !getEnableTransition.value) return;
9 // Close loading after the route switching animation ends 10 // Close loading after the route switching animation ends
10 appStore.setPageLoadingAction(false); 11 appStore.setPageLoadingAction(false);
11 } 12 }
src/router/guard/index.ts
@@ -16,7 +16,7 @@ import { tabStore } from &#39;/@/store/modules/tab&#39;; @@ -16,7 +16,7 @@ import { tabStore } from &#39;/@/store/modules/tab&#39;;
16 16
17 const globSetting = useGlobSetting(); 17 const globSetting = useGlobSetting();
18 export function createGuard(router: Router) { 18 export function createGuard(router: Router) {
19 - const { openNProgress, closeMessageOnSwitch, removeAllHttpPending } = useProjectSetting(); 19 + const { closeMessageOnSwitch, removeAllHttpPending } = useProjectSetting();
20 let axiosCanceler: AxiosCanceler | null; 20 let axiosCanceler: AxiosCanceler | null;
21 if (removeAllHttpPending) { 21 if (removeAllHttpPending) {
22 axiosCanceler = new AxiosCanceler(); 22 axiosCanceler = new AxiosCanceler();
@@ -44,7 +44,6 @@ export function createGuard(router: Router) { @@ -44,7 +44,6 @@ export function createGuard(router: Router) {
44 Modal.destroyAll(); 44 Modal.destroyAll();
45 notification.destroy(); 45 notification.destroy();
46 } 46 }
47 - // TODO Some special interfaces require long connections  
48 // Switching the route will delete the previous request 47 // Switching the route will delete the previous request
49 removeAllHttpPending && axiosCanceler!.removeAllPending(); 48 removeAllHttpPending && axiosCanceler!.removeAllPending();
50 } catch (error) { 49 } catch (error) {
@@ -58,7 +57,6 @@ export function createGuard(router: Router) { @@ -58,7 +57,6 @@ export function createGuard(router: Router) {
58 // change html title 57 // change html title
59 setTitle(to.meta.title, globSetting.title); 58 setTitle(to.meta.title, globSetting.title);
60 }); 59 });
61 -  
62 - openNProgress && createProgressGuard(router); 60 + createProgressGuard(router);
63 createPermissionGuard(router); 61 createPermissionGuard(router);
64 } 62 }
src/router/guard/pageLoadingGuard.ts
@@ -3,20 +3,18 @@ import { tabStore } from &#39;/@/store/modules/tab&#39;; @@ -3,20 +3,18 @@ import { tabStore } from &#39;/@/store/modules/tab&#39;;
3 import { appStore } from '/@/store/modules/app'; 3 import { appStore } from '/@/store/modules/app';
4 import { userStore } from '/@/store/modules/user'; 4 import { userStore } from '/@/store/modules/user';
5 import { getParams } from '/@/utils/helper/routeHelper'; 5 import { getParams } from '/@/utils/helper/routeHelper';
  6 +import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
  7 +import { unref } from 'vue';
6 8
  9 +const { getOpenPageLoading, getEnableTransition } = useTransitionSetting();
7 export function createPageLoadingGuard(router: Router) { 10 export function createPageLoadingGuard(router: Router) {
8 let isFirstLoad = true; 11 let isFirstLoad = true;
9 router.beforeEach(async (to) => { 12 router.beforeEach(async (to) => {
10 - const {  
11 - openKeepAlive,  
12 - openRouterTransition,  
13 - openPageLoading,  
14 - multiTabsSetting: { show } = {},  
15 - } = appStore.getProjectConfig; 13 + const { openKeepAlive, multiTabsSetting: { show } = {} } = appStore.getProjectConfig;
16 if (!userStore.getTokenState) { 14 if (!userStore.getTokenState) {
17 return true; 15 return true;
18 } 16 }
19 - if (!openRouterTransition && openPageLoading) { 17 + if (!unref(getEnableTransition) && unref(getOpenPageLoading)) {
20 appStore.commitPageLoadingState(true); 18 appStore.commitPageLoadingState(true);
21 return true; 19 return true;
22 } 20 }
@@ -32,11 +30,10 @@ export function createPageLoadingGuard(router: Router) { @@ -32,11 +30,10 @@ export function createPageLoadingGuard(router: Router) {
32 return true; 30 return true;
33 }); 31 });
34 router.afterEach(async (to, from) => { 32 router.afterEach(async (to, from) => {
35 - const { openRouterTransition, openPageLoading } = appStore.getProjectConfig;  
36 const realToPath = to.path.replace(getParams(to), ''); 33 const realToPath = to.path.replace(getParams(to), '');
37 const realFormPath = from.path.replace(getParams(from), ''); 34 const realFormPath = from.path.replace(getParams(from), '');
38 if ( 35 if (
39 - (!openRouterTransition && openPageLoading) || 36 + (!unref(getEnableTransition) && unref(getOpenPageLoading)) ||
40 isFirstLoad || 37 isFirstLoad ||
41 to.meta.afterCloseLoading || 38 to.meta.afterCloseLoading ||
42 realToPath === realFormPath 39 realToPath === realFormPath
src/router/guard/progressGuard.ts
1 import type { Router } from 'vue-router'; 1 import type { Router } from 'vue-router';
2 2
  3 +import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
  4 +
3 import NProgress from 'nprogress'; 5 import NProgress from 'nprogress';
4 import 'nprogress/nprogress.css'; 6 import 'nprogress/nprogress.css';
  7 +import { unref } from 'vue';
  8 +
  9 +const { getOpenNProgress } = useTransitionSetting();
5 10
6 export function createProgressGuard(router: Router) { 11 export function createProgressGuard(router: Router) {
7 // NProgress.inc(0.1); 12 // NProgress.inc(0.1);
8 // NProgress.configure({ easing: 'ease', speed: 200, showSpinner: false }); 13 // NProgress.configure({ easing: 'ease', speed: 200, showSpinner: false });
9 14
10 router.beforeEach(async (to) => { 15 router.beforeEach(async (to) => {
11 - !to.meta.inTab && NProgress.start(); 16 + !to.meta.inTab && unref(getOpenNProgress) && NProgress.start();
12 return true; 17 return true;
13 }); 18 });
14 19
15 router.afterEach(async (to) => { 20 router.afterEach(async (to) => {
16 - !to.meta.inTab && NProgress.done(); 21 + !to.meta.inTab && unref(getOpenNProgress) && NProgress.done();
17 return true; 22 return true;
18 }); 23 });
19 } 24 }
src/settings/projectSetting.ts
@@ -7,155 +7,158 @@ import { isProdMode } from &#39;/@/utils/env&#39;; @@ -7,155 +7,158 @@ import { isProdMode } from &#39;/@/utils/env&#39;;
7 7
8 // ! You need to clear the browser cache after the change 8 // ! You need to clear the browser cache after the change
9 const setting: ProjectConfig = { 9 const setting: ProjectConfig = {
10 - // locale setting  
11 - locale: {  
12 - // Locale  
13 - lang: 'zh_CN',  
14 - // Default locale  
15 - fallback: 'zh_CN',  
16 - // available Locales  
17 - availableLocales: ['zh_CN', 'en'],  
18 - },  
19 -  
20 - // color  
21 - // TODO 主题色  
22 - themeColor: primaryColor,  
23 -  
24 // Whether to show the configuration button 10 // Whether to show the configuration button
25 showSettingButton: true, 11 showSettingButton: true,
26 12
27 - // 权限模式 13 + // Permission mode
28 permissionMode: PermissionModeEnum.ROLE, 14 permissionMode: PermissionModeEnum.ROLE,
29 15
30 - // 网站灰色模式,用于可能悼念的日期开启 16 + // color
  17 + // TODO Theme color
  18 + themeColor: primaryColor,
  19 +
  20 + // Website gray mode, open for possible mourning dates
31 grayMode: false, 21 grayMode: false,
32 22
33 - // 色弱模式 23 + // Color Weakness Mode
34 colorWeak: false, 24 colorWeak: false,
35 25
36 - // 是否取消菜单,顶部,多标签页显示, 用于可能内嵌在别的系统内 26 + // Whether to cancel the menu, the top, the multi-tab page display, for possible embedded in other systems
37 fullContent: false, 27 fullContent: false,
38 28
39 // content mode 29 // content mode
40 contentMode: ContentEnum.FULL, 30 contentMode: ContentEnum.FULL,
41 31
42 - // 是否显示logo 32 + // Whether to display the logo
43 showLogo: true, 33 showLogo: true,
44 34
45 - // 是否显示页脚 35 + // Whether to show footer
46 showFooter: true, 36 showFooter: true,
47 37
48 - // 头部配置 38 + // locale setting
  39 + locale: {
  40 + // Locale
  41 + lang: 'zh_CN',
  42 + // Default locale
  43 + fallback: 'zh_CN',
  44 + // available Locales
  45 + availableLocales: ['zh_CN', 'en'],
  46 + },
  47 +
  48 + // Header configuration
49 headerSetting: { 49 headerSetting: {
50 // header bg color 50 // header bg color
51 bgColor: '#ffffff', 51 bgColor: '#ffffff',
  52 + // Fixed at the top
52 fixed: true, 53 fixed: true,
53 - // 是否显示顶部 54 + // Whether to show top
54 show: true, 55 show: true,
55 // theme 56 // theme
56 theme: ThemeEnum.LIGHT, 57 theme: ThemeEnum.LIGHT,
57 - // 开启锁屏功能 58 + // Whether to enable the lock screen function
58 useLockPage: true, 59 useLockPage: true,
59 - // 显示刷新按钮 60 + // Whether to show the refresh button
60 showRedo: true, 61 showRedo: true,
61 - // 显示全屏按钮 62 + // Whether to show the full screen button
62 showFullScreen: true, 63 showFullScreen: true,
63 - // 显示文档按钮 64 + // Whether to show the document button
64 showDoc: true, 65 showDoc: true,
65 - // 显示消息中心按钮 66 + // Whether to show the notification button
66 showNotice: true, 67 showNotice: true,
67 }, 68 },
68 69
69 - // 菜单配置 70 + // Menu configuration
70 menuSetting: { 71 menuSetting: {
71 // sidebar menu bg color 72 // sidebar menu bg color
72 bgColor: '#273352', 73 bgColor: '#273352',
73 - 74 + // Whether to fix the left menu
74 fixed: true, 75 fixed: true,
75 - // 菜单折叠 76 + // Menu collapse
76 collapsed: false, 77 collapsed: false,
77 - // 折叠菜单时候是否显示菜单名 78 + // Whether to display the menu name when folding the menu
78 collapsedShowTitle: false, 79 collapsedShowTitle: false,
79 - // 是否可拖拽 80 + // Whether it can be dragged
  81 + // Only limited to the opening of the left menu, the mouse has a drag bar on the right side of the menu
80 hasDrag: false, 82 hasDrag: false,
81 - // 是否显示 没有dom 83 + // Whether to show no dom
82 show: true, 84 show: true,
83 - // 是否显示 有dom 85 + // Whether to show dom
84 hidden: true, 86 hidden: true,
85 - // 是否显示搜索框 87 + // Whether to show search box
86 showSearch: true, 88 showSearch: true,
87 - // 菜单宽度 89 + // Menu width
88 menuWidth: 210, 90 menuWidth: 210,
89 - // 菜单模式 91 + // Menu mode
90 mode: MenuModeEnum.INLINE, 92 mode: MenuModeEnum.INLINE,
91 - // 菜单类型 93 + // Menu type
92 type: MenuTypeEnum.SIDEBAR, 94 type: MenuTypeEnum.SIDEBAR,
93 - // 菜单主题 95 + // Menu theme
94 theme: ThemeEnum.DARK, 96 theme: ThemeEnum.DARK,
95 - // 分割菜单 97 + // Split menu
96 split: false, 98 split: false,
97 - // 顶部菜单布局 99 + // Top menu layout
98 topMenuAlign: 'center', 100 topMenuAlign: 'center',
99 - // 折叠菜单时候隐藏搜索框 101 + // Hide the search box when the menu is collapsed
100 collapsedShowSearch: false, 102 collapsedShowSearch: false,
101 - // 折叠触发器的位置 103 + // Fold trigger position
102 trigger: TriggerEnum.HEADER, 104 trigger: TriggerEnum.HEADER,
103 - // 开启手风琴模式,只显示一个菜单 105 + // Turn on accordion mode, only show a menu
104 accordion: true, 106 accordion: true,
105 }, 107 },
106 108
107 - // 多标签 109 + // Multi-label
108 multiTabsSetting: { 110 multiTabsSetting: {
109 - // 开启 111 + // Turn on
110 show: true, 112 show: true,
111 - // 开启快速操作 113 + // Turn on quick actions
112 showQuick: true, 114 showQuick: true,
113 -  
114 - // 标签页缓存最大数量 115 + // Maximum number of tab cache
115 max: 12, 116 max: 12,
116 }, 117 },
117 118
118 - // 是否开启KeepAlive缓存 开发时候最好关闭,不然每次都需要清除缓存 119 + // Transition Setting
  120 + transitionSetting: {
  121 + // Whether to open the page switching animation
  122 + // The disabled state will also disable pageLoadinng
  123 + enable: true,
  124 +
  125 + // Route basic switching animation
  126 + basicTransition: RouterTransitionEnum.FADE_SIDE,
  127 +
  128 + // Whether to open page switching loading
  129 + // Only open when enable=true
  130 + openPageLoading: true,
  131 +
  132 + // Whether to open the top progress bar
  133 + openNProgress: true,
  134 + },
  135 +
  136 + // Whether to enable KeepAlive cache is best to close during development, otherwise the cache needs to be cleared every time
119 openKeepAlive: true, 137 openKeepAlive: true,
120 138
121 - // 自动锁屏时间,为0不锁屏。 单位分钟 默认0 139 + // Automatic screen lock time, 0 does not lock the screen. Unit minute default 0
122 lockTime: 0, 140 lockTime: 0,
123 141
124 - // 显示面包屑 142 + // Whether to show breadcrumbs
125 showBreadCrumb: true, 143 showBreadCrumb: true,
126 144
127 - // 显示面包屑图标 145 + // Whether to show the breadcrumb icon
128 showBreadCrumbIcon: false, 146 showBreadCrumbIcon: false,
129 147
130 - // 使用error-handler-plugin 148 + // Use error-handler-plugin
131 useErrorHandle: isProdMode(), 149 useErrorHandle: isProdMode(),
132 150
133 - // 开启页面切换动画  
134 - openRouterTransition: true,  
135 -  
136 - // 路由切换动画  
137 - routerTransition: RouterTransitionEnum.FADE_SIDE,  
138 -  
139 - // 是否开启登录安全校验  
140 - openLoginVerify: true,  
141 -  
142 - // 是否开启页面切换loading  
143 - openPageLoading: true,  
144 -  
145 - // 是否开启回到顶部 151 + // Whether to open back to top
146 useOpenBackTop: true, 152 useOpenBackTop: true,
147 153
148 - // 开启顶部进度条  
149 - openNProgress: isProdMode(),  
150 -  
151 - // 是否可以嵌入iframe页面 154 + // Is it possible to embed iframe pages
152 canEmbedIFramePage: true, 155 canEmbedIFramePage: true,
153 156
154 - // 切换界面的时候是否删除未关闭的message及notify 157 + // Whether to delete unclosed messages and notify when switching the interface
155 closeMessageOnSwitch: true, 158 closeMessageOnSwitch: true,
156 159
157 - // 切换界面的时候是否取消已经发送但是未响应的http请求。  
158 - // 如果开启,想对单独接口覆盖。可以在单独接口设置 160 + // Whether to cancel the http request that has been sent but not responded when switching the interface.
  161 + // If it is enabled, I want to overwrite a single interface. Can be set in a separate interface
159 removeAllHttpPending: true, 162 removeAllHttpPending: true,
160 }; 163 };
161 164
src/types/config.d.ts
@@ -59,6 +59,20 @@ export interface LocaleSetting { @@ -59,6 +59,20 @@ export interface LocaleSetting {
59 availableLocales: LocaleType[]; 59 availableLocales: LocaleType[];
60 } 60 }
61 61
  62 +export interface TransitionSetting {
  63 + // Whether to open the page switching animation
  64 + enable: boolean;
  65 +
  66 + // Route basic switching animation
  67 + basicTransition: RouterTransitionEnum;
  68 +
  69 + // Whether to open page switching loading
  70 + openPageLoading: boolean;
  71 +
  72 + // Whether to open the top progress bar
  73 + openNProgress: boolean;
  74 +}
  75 +
62 export interface ProjectConfig { 76 export interface ProjectConfig {
63 locale: LocaleSetting; 77 locale: LocaleSetting;
64 78
@@ -86,6 +100,9 @@ export interface ProjectConfig { @@ -86,6 +100,9 @@ export interface ProjectConfig {
86 100
87 // 多标签页设置 101 // 多标签页设置
88 multiTabsSetting: MultiTabsSetting; 102 multiTabsSetting: MultiTabsSetting;
  103 +
  104 + transitionSetting: TransitionSetting;
  105 +
89 // pageLayout是否开启keep-alive 106 // pageLayout是否开启keep-alive
90 openKeepAlive: boolean; 107 openKeepAlive: boolean;
91 108
@@ -97,18 +114,8 @@ export interface ProjectConfig { @@ -97,18 +114,8 @@ export interface ProjectConfig {
97 showBreadCrumbIcon: boolean; 114 showBreadCrumbIcon: boolean;
98 // 使用error-handler-plugin 115 // 使用error-handler-plugin
99 useErrorHandle: boolean; 116 useErrorHandle: boolean;
100 - // 开启页面切换动画  
101 - openRouterTransition: boolean;  
102 - // 路由切换动画  
103 - routerTransition: RouterTransitionEnum;  
104 - // 是否开启登录安全校验  
105 - openLoginVerify: boolean;  
106 - // 是否开启页面切换loading  
107 - openPageLoading: boolean;  
108 // 是否开启回到顶部 117 // 是否开启回到顶部
109 useOpenBackTop: boolean; 118 useOpenBackTop: boolean;
110 - // 开启顶部进度条  
111 - openNProgress: boolean;  
112 // 是否可以嵌入iframe页面 119 // 是否可以嵌入iframe页面
113 canEmbedIFramePage: boolean; 120 canEmbedIFramePage: boolean;
114 // 切换界面的时候是否删除未关闭的message及notify 121 // 切换界面的时候是否删除未关闭的message及notify
src/views/sys/redirect/index.vue
@@ -7,10 +7,13 @@ @@ -7,10 +7,13 @@
7 import { appStore } from '/@/store/modules/app'; 7 import { appStore } from '/@/store/modules/app';
8 8
9 import { useRouter } from 'vue-router'; 9 import { useRouter } from 'vue-router';
  10 + import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
10 export default defineComponent({ 11 export default defineComponent({
11 name: 'Redirect', 12 name: 'Redirect',
12 setup() { 13 setup() {
13 const { currentRoute, replace } = useRouter(); 14 const { currentRoute, replace } = useRouter();
  15 + const { getOpenPageLoading, getEnableTransition } = useTransitionSetting();
  16 +
14 const { params, query } = unref(currentRoute); 17 const { params, query } = unref(currentRoute);
15 const { path } = params; 18 const { path } = params;
16 const _path = Array.isArray(path) ? path.join('/') : path; 19 const _path = Array.isArray(path) ? path.join('/') : path;
@@ -18,8 +21,7 @@ @@ -18,8 +21,7 @@
18 path: '/' + _path, 21 path: '/' + _path,
19 query, 22 query,
20 }); 23 });
21 - const { openRouterTransition, openPageLoading } = appStore.getProjectConfig;  
22 - if (openRouterTransition && openPageLoading) { 24 + if (unref(getEnableTransition) && unref(getOpenPageLoading)) {
23 setTimeout(() => { 25 setTimeout(() => {
24 appStore.setPageLoadingAction(false); 26 appStore.setPageLoadingAction(false);
25 }, 0); 27 }, 0);
yarn.lock
@@ -12,24 +12,24 @@ @@ -12,24 +12,24 @@
12 lodash-es "^4.17.15" 12 lodash-es "^4.17.15"
13 resize-observer-polyfill "^1.5.1" 13 resize-observer-polyfill "^1.5.1"
14 14
15 -"@ant-design/colors@^4.0.0":  
16 - version "4.0.5"  
17 - resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-4.0.5.tgz#d7d100d7545cca8f624954604a6892fc48ba5aae"  
18 - integrity sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q== 15 +"@ant-design/colors@^5.0.0":
  16 + version "5.0.0"
  17 + resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-5.0.0.tgz#46b73b4cc6935b35fc8b84555e8e42c8cfc190e6"
  18 + integrity sha512-Pe1rYorgVC1v4f+InDXvIlQH715pO1g7BsOhy/ehX/U6ebPKqojmkYJKU3lF+84Zmvyar7ngZ28hesAa1nWjLg==
19 dependencies: 19 dependencies:
20 - tinycolor2 "^1.4.1" 20 + "@ctrl/tinycolor" "^3.1.6"
21 21
22 "@ant-design/icons-svg@^4.0.0": 22 "@ant-design/icons-svg@^4.0.0":
23 version "4.1.0" 23 version "4.1.0"
24 resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz#480b025f4b20ef7fe8f47d4a4846e4fee84ea06c" 24 resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz#480b025f4b20ef7fe8f47d4a4846e4fee84ea06c"
25 integrity sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ== 25 integrity sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ==
26 26
27 -"@ant-design/icons-vue@^5.1.5":  
28 - version "5.1.5"  
29 - resolved "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-5.1.5.tgz#8e83ba90a29b7ed8b4c2e7282f5908b9b3de519b"  
30 - integrity sha512-j1qHhzFCLh4UNoOoVNDFKp4qbzX2bpc/am+rNCqNDeze/TpbQ38nSBSmNPucHuD7koQtAjBW+AIcnToYCgKvpA== 27 +"@ant-design/icons-vue@^5.1.6":
  28 + version "5.1.6"
  29 + resolved "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-5.1.6.tgz#af15cbf2375d95199e90166adce4c9f6ad1c17f1"
  30 + integrity sha512-1KY04c/0iDM88ICdu6EW2/ZPOrH+FyL0uvR350XnVqvnDiLijdcrRaLzkZgCdBcy7cy5t5+onXKocymndCOdRA==
31 dependencies: 31 dependencies:
32 - "@ant-design/colors" "^4.0.0" 32 + "@ant-design/colors" "^5.0.0"
33 "@ant-design/icons-svg" "^4.0.0" 33 "@ant-design/icons-svg" "^4.0.0"
34 "@babel/runtime" "^7.10.4" 34 "@babel/runtime" "^7.10.4"
35 lodash "^4.17.15" 35 lodash "^4.17.15"
@@ -992,6 +992,11 @@ @@ -992,6 +992,11 @@
992 resolved "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" 992 resolved "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe"
993 integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== 993 integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==
994 994
  995 +"@ctrl/tinycolor@^3.1.6":
  996 + version "3.1.7"
  997 + resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.1.7.tgz#1585f67629882002a9f8e15a2941c9a4321bf80c"
  998 + integrity sha512-/0C6fjXbCwu22k8mMsKRSAo9zgu61d2p75Or9IuIC0Vu5CWN88t2QHK93LhNnxnqHWf5SFwFU28w9cKfTmnfvg==
  999 +
995 "@eslint/eslintrc@^0.2.1": 1000 "@eslint/eslintrc@^0.2.1":
996 version "0.2.1" 1001 version "0.2.1"
997 resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c" 1002 resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c"
@@ -1847,13 +1852,13 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: @@ -1847,13 +1852,13 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
1847 dependencies: 1852 dependencies:
1848 color-convert "^2.0.1" 1853 color-convert "^2.0.1"
1849 1854
1850 -ant-design-vue@2.0.0-beta.15:  
1851 - version "2.0.0-beta.15"  
1852 - resolved "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-2.0.0-beta.15.tgz#3c787dabb70a33885d0e751e58f9a5610ed06134"  
1853 - integrity sha512-OxZy+ZYU3LauIL4Rhqwy441K/iD++Cit6upnQy5+LVUrX0PSObPqPqMWVpncbAmJJYTEz88gkvgGeYqBdzouWA== 1855 +ant-design-vue@2.0.0-rc.2:
  1856 + version "2.0.0-rc.2"
  1857 + resolved "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-2.0.0-rc.2.tgz#fd3b4a5a64fccbb53ed488a194317a040de2223e"
  1858 + integrity sha512-XA7X/7HHIveiTh41bZWGfoQ2Rys/rqWknK2zzdHwVnfw9ST3v+ciMKH0Uegyn7m14QL/EdUkC8zGsXpiSXqKNQ==
1854 dependencies: 1859 dependencies:
1855 "@ant-design-vue/use" "^0.0.1-0" 1860 "@ant-design-vue/use" "^0.0.1-0"
1856 - "@ant-design/icons-vue" "^5.1.5" 1861 + "@ant-design/icons-vue" "^5.1.6"
1857 "@babel/runtime" "^7.10.5" 1862 "@babel/runtime" "^7.10.5"
1858 "@simonwep/pickr" "~1.7.0" 1863 "@simonwep/pickr" "~1.7.0"
1859 add-dom-event-listener "^1.0.2" 1864 add-dom-event-listener "^1.0.2"
@@ -7705,11 +7710,6 @@ through@2, &quot;through@&gt;=2.2.7 &lt;3&quot;, through@^2.3.6, through@^2.3.8: @@ -7705,11 +7710,6 @@ through@2, &quot;through@&gt;=2.2.7 &lt;3&quot;, through@^2.3.6, through@^2.3.8:
7705 resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 7710 resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
7706 integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 7711 integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
7707 7712
7708 -tinycolor2@^1.4.1:  
7709 - version "1.4.2"  
7710 - resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"  
7711 - integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==  
7712 -  
7713 tmp@^0.0.33: 7713 tmp@^0.0.33:
7714 version "0.0.33" 7714 version "0.0.33"
7715 resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 7715 resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"