Commit 0ec1a62e596c363f3f017d6ac3b374a1b5caa7c5

Authored by vben
1 parent 783e6581

fix(menu): top submenu disappeared problem #214

CHANGELOG.zh_CN.md
... ... @@ -15,6 +15,7 @@
15 15 - 修复 form 表单初始化值为 0 问题
16 16 - 修复表格换行问题
17 17 - 修复菜单外链不跳转
  18 +- 修复菜单顶部显示问题
18 19  
19 20 ## 2.0.0-rc.17 (2020-01-18)
20 21  
... ...
build/config/lessModifyVars.ts
1 1 /**
2 2 * less global variable
3 3 */
4   -const primaryColor = '#018ffb';
  4 +const primaryColor = '#0084f4';
  5 +// const primaryColor = '#018ffb';
5 6 // const primaryColor = '#0065cc';
6 7 //{
7 8 const modifyVars = {
... ...
package.json
... ... @@ -64,7 +64,7 @@
64 64 "@typescript-eslint/eslint-plugin": "^4.14.0",
65 65 "@typescript-eslint/parser": "^4.14.0",
66 66 "@vitejs/plugin-legacy": "^1.2.1",
67   - "@vitejs/plugin-vue": "^1.1.2",
  67 + "@vitejs/plugin-vue": "1.1.0",
68 68 "@vitejs/plugin-vue-jsx": "^1.0.2",
69 69 "@vue/compiler-sfc": "^3.0.5",
70 70 "@vuedx/typecheck": "^0.6.0",
... ...
src/components/Menu/src/BasicMenu.vue
... ... @@ -13,13 +13,7 @@
13 13 v-bind="getInlineCollapseOptions"
14 14 >
15 15 <template v-for="item in items" :key="item.path">
16   - <BasicSubMenuItem
17   - :item="item"
18   - :theme="theme"
19   - :level="1"
20   - :showTitle="showTitle"
21   - :isHorizontal="isHorizontal"
22   - />
  16 + <BasicSubMenuItem :item="item" :theme="theme" :isHorizontal="isHorizontal" />
23 17 </template>
24 18 </Menu>
25 19 </template>
... ... @@ -46,6 +40,7 @@
46 40  
47 41 // import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
48 42 import { listenerLastChangeTab } from '/@/logics/mitt/tabChange';
  43 + import { getAllParentPath } from '/@/router/helper/menuHelper';
49 44  
50 45 export default defineComponent({
51 46 name: 'BasicMenu',
... ... @@ -96,16 +91,12 @@
96 91 prefixCls,
97 92 `justify-${align}`,
98 93 {
99   - [`${prefixCls}--hide-title`]: !unref(showTitle),
100   - [`${prefixCls}--collapsed-show-title`]: props.collapsedShowTitle,
101 94 [`${prefixCls}__second`]: !props.isHorizontal && unref(getSplit),
102 95 [`${prefixCls}__sidebar-hor`]: unref(getIsTopMenu),
103 96 },
104 97 ];
105 98 });
106 99  
107   - const showTitle = computed(() => props.collapsedShowTitle && unref(getCollapsed));
108   -
109 100 const getInlineCollapseOptions = computed(() => {
110 101 const isInline = props.mode === MenuModeEnum.INLINE;
111 102  
... ... @@ -135,7 +126,7 @@
135 126 }
136 127 );
137 128  
138   - async function handleMenuClick({ key, keyPath }: { key: string; keyPath: string[] }) {
  129 + async function handleMenuClick({ key }: { key: string; keyPath: string[] }) {
139 130 const { beforeClickFn } = props;
140 131 if (beforeClickFn && isFunction(beforeClickFn)) {
141 132 const flag = await beforeClickFn(key);
... ... @@ -144,7 +135,9 @@
144 135 emit('menuClick', key);
145 136  
146 137 isClickGo.value = true;
147   - menuState.openKeys = keyPath;
  138 + // const parentPath = await getCurrentParentPath(key);
  139 +
  140 + // menuState.openKeys = [parentPath];
148 141 menuState.selectedKeys = [key];
149 142 }
150 143  
... ... @@ -160,7 +153,8 @@
160 153 const parentPath = await getCurrentParentPath(path);
161 154 menuState.selectedKeys = [parentPath];
162 155 } else {
163   - menuState.selectedKeys = [path];
  156 + const parentPaths = await getAllParentPath(props.items, path);
  157 + menuState.selectedKeys = parentPaths;
164 158 }
165 159 }
166 160  
... ... @@ -172,7 +166,6 @@
172 166 getMenuClass,
173 167 handleOpenChange,
174 168 getOpenKeys,
175   - showTitle,
176 169 ...toRefs(menuState),
177 170 };
178 171 },
... ...
src/components/Menu/src/components/BasicMenuItem.vue
1 1 <template>
2   - <MenuItem :class="getLevelClass">
  2 + <MenuItem>
  3 + <!-- <MenuItem :class="getLevelClass"> -->
3 4 <MenuItemContent v-bind="$props" :item="item" />
4 5 </MenuItem>
5 6 </template>
6 7 <script lang="ts">
7   - import { defineComponent, computed } from 'vue';
  8 + import { defineComponent } from 'vue';
8 9 import { Menu } from 'ant-design-vue';
9 10 import { useDesign } from '/@/hooks/web/useDesign';
10 11 import { itemProps } from '../props';
... ... @@ -14,18 +15,19 @@
14 15 name: 'BasicMenuItem',
15 16 components: { MenuItem: Menu.Item, MenuItemContent },
16 17 props: itemProps,
17   - setup(props) {
  18 + setup() // props
  19 + {
18 20 const { prefixCls } = useDesign('basic-menu-item');
19 21  
20   - const getLevelClass = computed(() => {
21   - const { level, theme } = props;
  22 + // const getLevelClass = computed(() => {
  23 + // const { level, theme } = props;
22 24  
23   - const levelCls = [`${prefixCls}__level${level}`, theme];
24   - return levelCls;
25   - });
  25 + // const levelCls = [`${prefixCls}__level${level}`, theme];
  26 + // return levelCls;
  27 + // });
26 28 return {
27 29 prefixCls,
28   - getLevelClass,
  30 + // getLevelClass,
29 31 };
30 32 },
31 33 });
... ...
src/components/Menu/src/components/BasicSubMenuItem.vue
... ... @@ -2,17 +2,15 @@
2 2 <BasicMenuItem v-if="!menuHasChildren(item) && getShowMenu" v-bind="$props" />
3 3 <SubMenu
4 4 v-if="menuHasChildren(item) && getShowMenu"
5   - :class="[`${prefixCls}__level${level}`, theme]"
  5 + :class="[theme]"
  6 + popupClassName="app-top-menu-popup"
6 7 >
7 8 <template #title>
8 9 <MenuItemContent v-bind="$props" :item="item" />
9 10 </template>
10   - <!-- <template #expandIcon="{ key }">
11   - <ExpandIcon :key="key" />
12   - </template> -->
13 11  
14 12 <template v-for="childrenItem in item.children || []" :key="childrenItem.path">
15   - <BasicSubMenuItem v-bind="$props" :item="childrenItem" :level="level + 1" />
  13 + <BasicSubMenuItem v-bind="$props" :item="childrenItem" />
16 14 </template>
17 15 </SubMenu>
18 16 </template>
... ... @@ -26,7 +24,6 @@
26 24 import BasicMenuItem from './BasicMenuItem.vue';
27 25 import MenuItemContent from './MenuItemContent.vue';
28 26  
29   - // import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
30 27 export default defineComponent({
31 28 name: 'BasicSubMenuItem',
32 29 isSubMenu: true,
... ... @@ -35,7 +32,6 @@
35 32 SubMenu: Menu.SubMenu,
36 33 MenuItem: Menu.Item,
37 34 MenuItemContent,
38   - // ExpandIcon: createAsyncComponent(() => import('./ExpandIcon.vue')),
39 35 },
40 36 props: itemProps,
41 37 setup(props) {
... ...
src/components/Menu/src/components/MenuItemContent.vue
1 1 <template>
2 2 <span :class="`${prefixCls}-wrapper`">
3 3 <Icon v-if="getIcon" :icon="getIcon" :size="18" :class="`${prefixCls}-wrapper__icon`" />
4   - <span :class="getNameClass">
5   - {{ getI18nName }}
6   - <MenuItemTag v-bind="$props" />
7   - </span>
  4 + {{ getI18nName }}
8 5 </span>
9 6 </template>
10 7 <script lang="ts">
... ... @@ -14,25 +11,21 @@
14 11 import { useI18n } from '/@/hooks/web/useI18n';
15 12 import { useDesign } from '/@/hooks/web/useDesign';
16 13 import { contentProps } from '../props';
17   - import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
18 14 const { t } = useI18n();
19 15  
20 16 export default defineComponent({
21 17 name: 'MenuItemContent',
22   - components: { Icon, MenuItemTag: createAsyncComponent(() => import('./MenuItemTag.vue')) },
  18 + components: {
  19 + Icon,
  20 + },
23 21 props: contentProps,
24 22 setup(props) {
25 23 const { prefixCls } = useDesign('basic-menu-item-content');
26 24 const getI18nName = computed(() => t(props.item?.name));
27 25 const getIcon = computed(() => props.item?.icon);
28 26  
29   - const getNameClass = computed(() => {
30   - const { showTitle } = props;
31   - return { [`${prefixCls}--show-title`]: showTitle, [`${prefixCls}__name`]: !showTitle };
32   - });
33 27 return {
34 28 prefixCls,
35   - getNameClass,
36 29 getI18nName,
37 30 getIcon,
38 31 };
... ...
src/components/Menu/src/index.less
1 1 @basic-menu-prefix-cls: ~'@{namespace}-basic-menu';
2   -@basic-menu-content-prefix-cls: ~'@{namespace}-basic-menu-item-content';
3   -@basic-menu-tag-prefix-cls: ~'@{namespace}-basic-menu-item-tag';
4 2  
5   -.active-style() {
6   - color: @white;
7   - // background: @primary-color !important;
8   - background: linear-gradient(
9   - 118deg,
10   - rgba(@primary-color, 0.8),
11   - rgba(@primary-color, 1)
12   - ) !important;
13   -}
14   -
15   -.active-menu-style() {
16   - .ant-menu-item-selected,
17   - .ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected {
18   - .active-style();
19   - }
  3 +.app-top-menu-popup {
  4 + min-width: 150px;
20 5 }
21 6  
22 7 .@{basic-menu-prefix-cls} {
23 8 width: 100%;
24 9  
25   - // &__expand-icon {
26   - // position: absolute;
27   - // top: calc(50% - 6px);
28   - // right: 16px;
29   - // width: 10px;
30   - // transform-origin: none;
31   - // opacity: 0.45;
32   -
33   - // span[role='img'] {
34   - // margin-right: 0;
35   - // font-size: 11px;
36   - // }
37   -
38   - // &--collapsed {
39   - // opacity: 0;
40   - // }
41   - // }
42   -
43   - // collapsed show title start
44   - .@{basic-menu-content-prefix-cls}--show-title {
45   - max-width: unset !important;
46   - opacity: 1 !important;
47   - }
48   -
49   - &--hide-title {
50   - &.ant-menu-inline-collapsed > .ant-menu-item,
51   - &.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item,
52   - &.ant-menu-inline-collapsed
53   - > .ant-menu-item-group
54   - > .ant-menu-item-group-list
55   - > .ant-menu-submenu
56   - > .ant-menu-submenu-title,
57   - &.ant-menu-inline-collapsed .ant-menu-submenu-title {
58   - padding-right: 16px !important;
59   - padding-left: 16px !important;
60   - }
61   - }
62   -
63   - &--collapsed-show-title.ant-menu-inline-collapsed {
64   - .@{basic-menu-prefix-cls}-item__level1 {
65   - padding: 2px 0;
66   - justify-content: center !important;
67   -
68   - &.ant-menu-item {
69   - display: flex;
70   - align-items: center;
71   - height: 60px !important;
72   - margin-top: 0 !important;
73   - margin-bottom: 0 !important;
74   - line-height: 60px !important;
75   -
76   - > span {
77   - margin-top: 10px;
78   - }
79   - }
80   - }
81   -
82   - & > li[role='menuitem']:not(.ant-menu-submenu),
83   - & > li > .ant-menu-submenu-title {
84   - display: flex;
85   - margin-top: 10px;
86   - font-size: 12px;
87   - flex-direction: column;
88   - align-items: center;
89   - line-height: 24px;
90   - }
91   -
92   - & > li > .ant-menu-submenu-title {
93   - line-height: 24px;
94   - }
95   - .@{basic-menu-content-prefix-cls}-wrapper {
96   - display: flex;
97   - justify-content: center;
98   - align-items: center;
99   - flex-direction: column;
100   - .@{basic-menu-content-prefix-cls}--show-title {
101   - line-height: 30px;
102   - }
103   - }
104   - }
105   -
106   - &.ant-menu-inline-collapsed > .ant-menu-item,
107   - &.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item,
108   - &.ant-menu-inline-collapsed
109   - > .ant-menu-item-group
110   - > .ant-menu-item-group-list
111   - > .ant-menu-submenu
112   - > .ant-menu-submenu-title,
113   - &.ant-menu-inline-collapsed .ant-menu-submenu-title {
114   - padding-right: 16px !important;
115   - padding-left: 16px !important;
116   - }
117   -
118   - .@{basic-menu-content-prefix-cls}-wrapper {
119   - width: 100%;
120   - margin-top: 4px;
121   -
122   - &__icon {
123   - vertical-align: text-top;
124   - }
125   - }
126   -
127 10 .ant-menu-item {
128 11 transition: unset;
129 12 }
... ... @@ -179,117 +62,6 @@
179 62 }
180 63 }
181 64  
182   - &.ant-menu-dark:not(.@{basic-menu-prefix-cls}__sidebar-hor):not(.@{basic-menu-prefix-cls}__second) {
183   - // Reset menu item row height
184   - .ant-menu-item:not(.@{basic-menu-prefix-cls}-item__level1),
185   - .ant-menu-sub.ant-menu-inline > .ant-menu-item,
186   - .ant-menu-sub.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title {
187   - height: @app-menu-item-height;
188   - margin: 0;
189   - line-height: @app-menu-item-height;
190   - }
191   -
192   - .ant-menu-item.@{basic-menu-prefix-cls}-item__level1 {
193   - height: @app-menu-item-height;
194   - line-height: @app-menu-item-height;
195   - }
196   - }
197   -
198   - // 层级样式
199   - &.ant-menu-dark:not(.@{basic-menu-prefix-cls}__sidebar-hor) {
200   - overflow: hidden;
201   - background: @sider-dark-bg-color;
202   - .active-menu-style();
203   -
204   - .ant-menu-item.ant-menu-item-selected.@{basic-menu-prefix-cls}-menu-item__level1,
205   - .ant-menu-submenu-selected.@{basic-menu-prefix-cls}-menu-item__level1 {
206   - color: @white;
207   - }
208   -
209   - .@{basic-menu-prefix-cls}-item__level1 {
210   - background-color: @sider-dark-bg-color;
211   -
212   - > .ant-menu-sub > li {
213   - background-color: @sider-dark-lighten-1-bg-color;
214   - }
215   - }
216   -
217   - .@{basic-menu-prefix-cls}-item__level2:not(.ant-menu-item-selected),
218   - .ant-menu-sub {
219   - background-color: @sider-dark-lighten-1-bg-color;
220   - }
221   -
222   - .@{basic-menu-prefix-cls}-item__level3:not(.ant-menu-item-selected) {
223   - background-color: @sider-dark-lighten-2-bg-color;
224   -
225   - .ant-menu-item {
226   - background-color: @sider-dark-lighten-2-bg-color;
227   - }
228   - }
229   -
230   - .ant-menu-submenu-title {
231   - display: flex;
232   - height: @app-menu-item-height;
233   - // margin: 0;
234   - align-items: center;
235   - }
236   -
237   - &.ant-menu-inline-collapsed {
238   - .ant-menu-submenu-selected,
239   - .ant-menu-item-selected {
240   - position: relative;
241   - font-weight: 500;
242   - color: @white;
243   - background: @sider-dark-darken-bg-color !important;
244   -
245   - &::before {
246   - position: absolute;
247   - top: 0;
248   - left: 0;
249   - width: 3px;
250   - height: 100%;
251   - background: @primary-color;
252   - content: '';
253   - }
254   - }
255   - }
256   - }
257   -
258   - &.ant-menu-light:not(.@{basic-menu-prefix-cls}__sidebar-hor) {
259   - // overflow: hidden;
260   - border-right: none;
261   -
262   - .ant-menu-item.ant-menu-item-selected.@{basic-menu-prefix-cls}-menu-item__level1,
263   - .ant-menu-submenu-selected.@{basic-menu-prefix-cls}-menu-item__level1 {
264   - color: @primary-color;
265   - }
266   - }
267   -
268   - &.@{basic-menu-prefix-cls}__second.ant-menu-inline-collapsed:not(.@{basic-menu-prefix-cls}__sidebar-hor) {
269   - // Reset menu item row height
270   - .@{basic-menu-prefix-cls}-item__level1 {
271   - display: flex;
272   - height: @app-menu-item-height * 1.4;
273   - padding: 6px 0 !important;
274   - margin: 0;
275   - font-size: 12px;
276   - line-height: @app-menu-item-height;
277   - align-items: center;
278   - text-align: center;
279   -
280   - > div {
281   - padding: 6px 0 !important;
282   - font-size: 12px;
283   - }
284   -
285   - .@{basic-menu-content-prefix-cls}__name {
286   - display: inline-block;
287   - width: 50%;
288   - overflow: hidden;
289   - }
290   - }
291   - }
292   -
293 65 .ant-menu-submenu,
294 66 .ant-menu-submenu-inline {
295 67 transition: unset;
... ... @@ -300,63 +72,3 @@
300 72 transition: unset;
301 73 }
302 74 }
303   -
304   -.ant-menu-dark {
305   - &.ant-menu-submenu-popup {
306   - > ul {
307   - background: @sider-dark-bg-color;
308   - }
309   - .active-menu-style();
310   - }
311   -}
312   -
313   -// collapsed show title end
314   -.ant-menu-item,
315   -.ant-menu-submenu-title {
316   - > .@{basic-menu-content-prefix-cls}__name {
317   - width: 100%;
318   -
319   - .@{basic-menu-tag-prefix-cls} {
320   - float: right;
321   - margin-top: @app-menu-item-height / 2;
322   - transform: translate(0%, -50%);
323   - }
324   - }
325   -}
326   -
327   -.@{basic-menu-tag-prefix-cls} {
328   - position: absolute;
329   - top: calc(50% - 8px);
330   - right: 30px;
331   - display: inline-block;
332   - padding: 2px 4px;
333   - margin-right: 4px;
334   - font-size: 12px;
335   - line-height: 14px;
336   - color: #fff;
337   - border-radius: 2px;
338   -
339   - &--dot {
340   - top: calc(50% - 4px);
341   - width: 6px;
342   - height: 6px;
343   - padding: 0;
344   - border-radius: 50%;
345   - }
346   -
347   - &--primary {
348   - background: @primary-color;
349   - }
350   -
351   - &--error {
352   - background: @error-color;
353   - }
354   -
355   - &--success {
356   - background: @success-color;
357   - }
358   -
359   - &--warn {
360   - background: @warning-color;
361   - }
362   -}
... ...
src/layouts/default/menu/useLayoutMenu.ts
... ... @@ -72,9 +72,6 @@ export function useSplitMenu(splitType: Ref&lt;MenuSplitTyeEnum&gt;) {
72 72  
73 73 // Handle left menu split
74 74 async function handleSplitLeftMenu(parentPath: string) {
75   - console.log('======================');
76   - console.log(unref(getSplitLeft));
77   - console.log('======================');
78 75 if (unref(getSplitLeft) || unref(getIsMobile)) return;
79 76  
80 77 // spilt mode left
... ...
src/layouts/page/ParentView.vue
... ... @@ -19,9 +19,9 @@
19 19 appear
20 20 >
21 21 <keep-alive v-if="openCache" :include="getCaches">
22   - <component :is="Component" :key="route.fullPath" />
  22 + <component :is="Component" v-bind="getKey(Component, route)" />
23 23 </keep-alive>
24   - <component v-else :is="Component" :key="route.fullPath" />
  24 + <component v-else :is="Component" v-bind="getKey(Component, route)" />
25 25 </transition>
26 26 </template>
27 27 </router-view>
... ... @@ -34,7 +34,7 @@
34 34 import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
35 35  
36 36 import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
37   - import { useCache } from './useCache';
  37 + import { useCache, getKey } from './useCache';
38 38 import { getTransitionName } from './transition';
39 39  
40 40 export default defineComponent({
... ... @@ -56,6 +56,7 @@
56 56 openCache,
57 57 getEnableTransition,
58 58 getTransitionName,
  59 + getKey,
59 60 };
60 61 },
61 62 });
... ...
src/layouts/page/index.vue
... ... @@ -27,9 +27,6 @@
27 27 </template>
28 28  
29 29 <script lang="ts">
30   - import type { FunctionalComponent } from 'vue';
31   - import type { RouteLocation } from 'vue-router';
32   -
33 30 import { computed, defineComponent, unref } from 'vue';
34 31  
35 32 import FrameLayout from '/@/layouts/iframe/index.vue';
... ... @@ -37,7 +34,7 @@
37 34 import { useRootSetting } from '/@/hooks/setting/useRootSetting';
38 35  
39 36 import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
40   - import { useCache } from './useCache';
  37 + import { useCache, getKey } from './useCache';
41 38 import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
42 39 import { getTransitionName } from './transition';
43 40  
... ... @@ -54,10 +51,6 @@
54 51  
55 52 const openCache = computed(() => unref(getOpenKeepAlive) && unref(getShowMultipleTab));
56 53  
57   - function getKey(component: FunctionalComponent & { type: Indexable }, route: RouteLocation) {
58   - return !!component?.type.parentView ? {} : { key: route.fullPath };
59   - }
60   -
61 54 return {
62 55 getTransitionName,
63 56 openCache,
... ...
src/layouts/page/useCache.ts
  1 +import type { FunctionalComponent } from 'vue';
  2 +import type { RouteLocation } from 'vue-router';
1 3 import { computed, ref, unref } from 'vue';
2 4 import { useRootSetting } from '/@/hooks/setting/useRootSetting';
3 5 import { tryTsxEmit } from '/@/utils/helper/vueHelper';
... ... @@ -6,6 +8,11 @@ import { tabStore, PAGE_LAYOUT_KEY } from &#39;/@/store/modules/tab&#39;;
6 8 import { useRouter } from 'vue-router';
7 9  
8 10 const ParentLayoutName = 'ParentLayout';
  11 +
  12 +export function getKey(component: FunctionalComponent & { type: Indexable }, route: RouteLocation) {
  13 + return !!component?.type.parentView ? {} : { key: route.fullPath };
  14 +}
  15 +
9 16 export function useCache(isPage: boolean) {
10 17 const name = ref('');
11 18 const { currentRoute } = useRouter();
... ...
yarn.lock
... ... @@ -1768,10 +1768,10 @@
1768 1768 "@vue/babel-plugin-jsx" "^1.0.1"
1769 1769 hash-sum "^2.0.0"
1770 1770  
1771   -"@vitejs/plugin-vue@^1.1.2":
1772   - version "1.1.2"
1773   - resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-1.1.2.tgz#64d1f0e0739675f5717015ffb4d861c53af8fe60"
1774   - integrity sha512-a5ORYuPsiAO4Kb2blA/x63mDiBQBxEJkbjhVtiv5IP/I7fGfpwXPPGHx9LHD4MedpXp8icngJYMKO0hOwahtmQ==
  1771 +"@vitejs/plugin-vue@1.1.0":
  1772 + version "1.1.0"
  1773 + resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-1.1.0.tgz#8ae0b11388897b07259c9e5198c0e3fb5e4b37d9"
  1774 + integrity sha512-ExlAt3nb3PB31jV9AgRZSMoGd+aQRU53fc/seghV8/l0JCzaX2mqlgpG8iytWkRxbBPgtAx4TpCPdiVKnTFT/A==
1775 1775  
1776 1776 "@vue/babel-helper-vue-transform-on@^1.0.2":
1777 1777 version "1.0.2"
... ...