394 lines
20 KiB
JavaScript
394 lines
20 KiB
JavaScript
var _excluded = ["pro_layout_parentKeys", "children", "icon", "flatMenu", "indexRoute", "routes"];
|
||
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
||
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
||
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
||
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
||
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
|
||
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
||
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
|
||
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
||
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
||
function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
|
||
function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
|
||
function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
|
||
function _wrapNativeSuper(t) { var r = "function" == typeof Map ? new Map() : void 0; return _wrapNativeSuper = function _wrapNativeSuper(t) { if (null === t || !_isNativeFunction(t)) return t; if ("function" != typeof t) throw new TypeError("Super expression must either be null or a function"); if (void 0 !== r) { if (r.has(t)) return r.get(t); r.set(t, Wrapper); } function Wrapper() { return _construct(t, arguments, _getPrototypeOf(this).constructor); } return Wrapper.prototype = Object.create(t.prototype, { constructor: { value: Wrapper, enumerable: !1, writable: !0, configurable: !0 } }), _setPrototypeOf(Wrapper, t); }, _wrapNativeSuper(t); }
|
||
function _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; }
|
||
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
||
function _isNativeFunction(t) { try { return -1 !== Function.toString.call(t).indexOf("[native code]"); } catch (n) { return "function" == typeof t; } }
|
||
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
|
||
function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
|
||
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
||
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
||
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
||
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
||
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
||
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
||
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
||
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
||
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
||
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
||
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
||
//@ts-ignore
|
||
import { pathToRegexp } from '../path-to-regexp';
|
||
import sha265 from '../sha265';
|
||
export var childrenPropsName = 'routes';
|
||
export function stripQueryStringAndHashFromPath(url) {
|
||
return url.split('?')[0].split('#')[0];
|
||
}
|
||
export var isUrl = function isUrl(path) {
|
||
if (!path.startsWith('http')) {
|
||
return false;
|
||
}
|
||
try {
|
||
var url = new URL(path);
|
||
return !!url;
|
||
} catch (error) {
|
||
return false;
|
||
}
|
||
};
|
||
export var getKeyByPath = function getKeyByPath(item) {
|
||
var path = item.path;
|
||
if (!path || path === '/') {
|
||
// 如果还是没有,用对象的hash 生成一个
|
||
try {
|
||
return "/".concat(sha265(JSON.stringify(item)));
|
||
} catch (error) {
|
||
// dom some thing
|
||
}
|
||
}
|
||
return path ? stripQueryStringAndHashFromPath(path) : path;
|
||
};
|
||
/**
|
||
* 获取locale,增加了一个功能,如果 locale = false,将不使用国际化
|
||
* @param item
|
||
* @param parentName
|
||
*/
|
||
var getItemLocaleName = function getItemLocaleName(item, parentName) {
|
||
var name = item.name,
|
||
locale = item.locale;
|
||
// 如果配置了 locale 并且 locale 为 false或 ""
|
||
if ('locale' in item && locale === false || !name) {
|
||
return false;
|
||
}
|
||
return item.locale || "".concat(parentName, ".").concat(name);
|
||
};
|
||
/**
|
||
* 如果不是 / 开头的和父节点做一下合并
|
||
* 如果是 / 开头的不作任何处理
|
||
* 如果是 url 也直接返回
|
||
* @param path
|
||
* @param parentPath
|
||
*/
|
||
var mergePath = function mergePath() {
|
||
var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
||
var parentPath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '/';
|
||
if (path.endsWith('/*')) {
|
||
return path.replace('/*', '/');
|
||
}
|
||
if ((path || parentPath).startsWith('/')) {
|
||
return path;
|
||
}
|
||
if (isUrl(path)) {
|
||
return path;
|
||
}
|
||
return "/".concat(parentPath, "/").concat(path).replace(/\/\//g, '/').replace(/\/\//g, '/');
|
||
};
|
||
// bigfish 的兼容准话
|
||
var bigfishCompatibleConversions = function bigfishCompatibleConversions(route, props) {
|
||
var _route$menu = route.menu,
|
||
menu = _route$menu === void 0 ? {} : _route$menu,
|
||
indexRoute = route.indexRoute,
|
||
_route$path = route.path,
|
||
path = _route$path === void 0 ? '' : _route$path;
|
||
var routerChildren = route.children || [];
|
||
var _menu$name = menu.name,
|
||
name = _menu$name === void 0 ? route.name : _menu$name,
|
||
_menu$icon = menu.icon,
|
||
icon = _menu$icon === void 0 ? route.icon : _menu$icon,
|
||
_menu$hideChildren = menu.hideChildren,
|
||
hideChildren = _menu$hideChildren === void 0 ? route.hideChildren : _menu$hideChildren,
|
||
_menu$flatMenu = menu.flatMenu,
|
||
flatMenu = _menu$flatMenu === void 0 ? route.flatMenu : _menu$flatMenu; // 兼容平铺式写法
|
||
// 拼接 childrenRoutes, 处理存在 indexRoute 时的逻辑
|
||
var childrenList = indexRoute &&
|
||
// 如果只有 redirect,不用处理的
|
||
Object.keys(indexRoute).join(',') !== 'redirect' ? [_objectSpread({
|
||
path: path,
|
||
menu: menu
|
||
}, indexRoute)].concat(routerChildren || []) : routerChildren;
|
||
// 拼接返回的 menu 数据
|
||
var result = _objectSpread({}, route);
|
||
if (name) {
|
||
result.name = name;
|
||
}
|
||
if (icon) {
|
||
result.icon = icon;
|
||
}
|
||
if (childrenList && childrenList.length) {
|
||
/** 在菜单中隐藏子项 */
|
||
if (hideChildren) {
|
||
delete result.children;
|
||
return result;
|
||
}
|
||
// 需要重新进行一次
|
||
var finalChildren = formatter(_objectSpread(_objectSpread({}, props), {}, {
|
||
data: childrenList
|
||
}), route);
|
||
/** 在菜单中只隐藏此项,子项往上提,仍旧展示 */
|
||
if (flatMenu) {
|
||
return finalChildren;
|
||
}
|
||
delete result[childrenPropsName];
|
||
}
|
||
return result;
|
||
};
|
||
var notNullArray = function notNullArray(value) {
|
||
return Array.isArray(value) && value.length > 0;
|
||
};
|
||
/**
|
||
*
|
||
* @param props
|
||
* @param parent
|
||
*/
|
||
function formatter(props) {
|
||
var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
||
path: '/'
|
||
};
|
||
var data = props.data,
|
||
formatMessage = props.formatMessage,
|
||
parentName = props.parentName,
|
||
menuLocale = props.locale;
|
||
if (!data || !Array.isArray(data)) {
|
||
return [];
|
||
}
|
||
return data.filter(function (item) {
|
||
if (!item) return false;
|
||
if (notNullArray(item.children)) return true;
|
||
if (item.path) return true;
|
||
if (item.originPath) return true;
|
||
if (item.layout) return true;
|
||
// 重定向
|
||
if (item.redirect) return false;
|
||
if (item.unaccessible) return false;
|
||
return false;
|
||
}).filter(function (item) {
|
||
var _item$menu, _item$menu2;
|
||
if ((item === null || item === void 0 ? void 0 : (_item$menu = item.menu) === null || _item$menu === void 0 ? void 0 : _item$menu.name) || (item === null || item === void 0 ? void 0 : item.flatMenu) || (item === null || item === void 0 ? void 0 : (_item$menu2 = item.menu) === null || _item$menu2 === void 0 ? void 0 : _item$menu2.flatMenu)) {
|
||
return true;
|
||
}
|
||
// 显示指定在 menu 中隐藏该项
|
||
// layout 插件的功能,其实不应该存在的
|
||
if (item.menu === false) {
|
||
return false;
|
||
}
|
||
return true;
|
||
}).map(function (finallyItem) {
|
||
var item = _objectSpread(_objectSpread({}, finallyItem), {}, {
|
||
path: finallyItem.path || finallyItem.originPath
|
||
});
|
||
if (!item.children && item[childrenPropsName]) {
|
||
item.children = item[childrenPropsName];
|
||
delete item[childrenPropsName];
|
||
}
|
||
// 是否没有权限查看
|
||
// 这样就不会显示,是一个兼容性的方式
|
||
if (item.unaccessible) {
|
||
// eslint-disable-next-line no-param-reassign
|
||
delete item.name;
|
||
}
|
||
if (item.path === '*') {
|
||
item.path = '.';
|
||
}
|
||
if (item.path === '/*') {
|
||
item.path = '.';
|
||
}
|
||
if (!item.path && item.originPath) {
|
||
item.path = item.originPath;
|
||
}
|
||
return item;
|
||
}).map(function () {
|
||
var item = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
||
path: '/'
|
||
};
|
||
var routerChildren = item.children || item[childrenPropsName] || [];
|
||
var path = mergePath(item.path, parent ? parent.path : '/');
|
||
var name = item.name;
|
||
var locale = getItemLocaleName(item, parentName || 'menu');
|
||
// if enableMenuLocale use item.name,
|
||
// close menu international
|
||
var localeName = locale !== false && menuLocale !== false && formatMessage && locale ? formatMessage({
|
||
id: locale,
|
||
defaultMessage: name
|
||
}) : name;
|
||
var _parent$pro_layout_pa = parent.pro_layout_parentKeys,
|
||
pro_layout_parentKeys = _parent$pro_layout_pa === void 0 ? [] : _parent$pro_layout_pa,
|
||
children = parent.children,
|
||
icon = parent.icon,
|
||
flatMenu = parent.flatMenu,
|
||
indexRoute = parent.indexRoute,
|
||
routes = parent.routes,
|
||
restParent = _objectWithoutProperties(parent, _excluded);
|
||
var item_pro_layout_parentKeys = new Set([].concat(_toConsumableArray(pro_layout_parentKeys), _toConsumableArray(item.parentKeys || [])));
|
||
if (parent.key) {
|
||
item_pro_layout_parentKeys.add(parent.key);
|
||
}
|
||
var finallyItem = _objectSpread(_objectSpread(_objectSpread({}, restParent), {}, {
|
||
menu: undefined
|
||
}, item), {}, {
|
||
path: path,
|
||
locale: locale,
|
||
key: item.key || getKeyByPath(_objectSpread(_objectSpread({}, item), {}, {
|
||
path: path
|
||
})),
|
||
pro_layout_parentKeys: Array.from(item_pro_layout_parentKeys).filter(function (key) {
|
||
return key && key !== '/';
|
||
})
|
||
});
|
||
if (localeName) {
|
||
finallyItem.name = localeName;
|
||
} else {
|
||
delete finallyItem.name;
|
||
}
|
||
if (finallyItem.menu === undefined) {
|
||
delete finallyItem.menu;
|
||
}
|
||
if (notNullArray(routerChildren)) {
|
||
var formatterChildren = formatter(_objectSpread(_objectSpread({}, props), {}, {
|
||
data: routerChildren,
|
||
parentName: locale || ''
|
||
}), finallyItem);
|
||
if (notNullArray(formatterChildren)) {
|
||
finallyItem.children = formatterChildren;
|
||
}
|
||
}
|
||
return bigfishCompatibleConversions(finallyItem, props);
|
||
}).flat(1);
|
||
}
|
||
/**
|
||
* 删除 hideInMenu 和 item.name 不存在的
|
||
*/
|
||
var _defaultFilterMenuData = function defaultFilterMenuData() {
|
||
var menuData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
||
return menuData.filter(function (item) {
|
||
return item && (item.name || notNullArray(item.children)) && !item.hideInMenu && !item.redirect;
|
||
}).map(function (item) {
|
||
var newItem = _objectSpread({}, item);
|
||
var routerChildren = newItem.children || item[childrenPropsName] || [];
|
||
delete newItem[childrenPropsName];
|
||
if (notNullArray(routerChildren) && !newItem.hideChildrenInMenu && routerChildren.some(function (child) {
|
||
return child && !!child.name;
|
||
})) {
|
||
var newChildren = _defaultFilterMenuData(routerChildren);
|
||
if (newChildren.length) return _objectSpread(_objectSpread({}, newItem), {}, {
|
||
children: newChildren
|
||
});
|
||
}
|
||
return _objectSpread({}, item);
|
||
}).filter(function (item) {
|
||
return item;
|
||
});
|
||
};
|
||
/**
|
||
* support pathToRegexp get string
|
||
*/
|
||
var RouteListMap = /*#__PURE__*/function (_Map) {
|
||
function RouteListMap() {
|
||
_classCallCheck(this, RouteListMap);
|
||
return _callSuper(this, RouteListMap, arguments);
|
||
}
|
||
_inherits(RouteListMap, _Map);
|
||
return _createClass(RouteListMap, [{
|
||
key: "get",
|
||
value: function get(pathname) {
|
||
var routeValue;
|
||
try {
|
||
// eslint-disable-next-line no-restricted-syntax
|
||
var _iterator = _createForOfIteratorHelper(this.entries()),
|
||
_step;
|
||
try {
|
||
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
||
var _step$value = _slicedToArray(_step.value, 2),
|
||
key = _step$value[0],
|
||
value = _step$value[1];
|
||
var path = stripQueryStringAndHashFromPath(key);
|
||
if (!isUrl(key) && pathToRegexp(path, []).test(pathname)) {
|
||
routeValue = value;
|
||
break;
|
||
}
|
||
}
|
||
} catch (err) {
|
||
_iterator.e(err);
|
||
} finally {
|
||
_iterator.f();
|
||
}
|
||
} catch (error) {
|
||
routeValue = undefined;
|
||
}
|
||
return routeValue;
|
||
}
|
||
}]);
|
||
}(/*#__PURE__*/_wrapNativeSuper(Map));
|
||
/**
|
||
* 获取面包屑映射
|
||
* @param MenuDataItem[] menuData 菜单配置
|
||
*/
|
||
var getBreadcrumbNameMap = function getBreadcrumbNameMap(menuData) {
|
||
// Map is used to ensure the order of keys
|
||
var routerMap = new RouteListMap();
|
||
var _flattenMenuData = function flattenMenuData(data, parent) {
|
||
data.forEach(function (menuItem) {
|
||
var routerChildren = menuItem.children || menuItem[childrenPropsName] || [];
|
||
if (notNullArray(routerChildren)) {
|
||
_flattenMenuData(routerChildren, menuItem);
|
||
}
|
||
// Reduce memory usage
|
||
var path = mergePath(menuItem.path, parent ? parent.path : '/');
|
||
routerMap.set(stripQueryStringAndHashFromPath(path), menuItem);
|
||
});
|
||
};
|
||
_flattenMenuData(menuData);
|
||
return routerMap;
|
||
};
|
||
var _clearChildren = function clearChildren() {
|
||
var menuData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
||
return menuData.map(function (item) {
|
||
var routerChildren = item.children || item[childrenPropsName];
|
||
if (notNullArray(routerChildren)) {
|
||
var newChildren = _clearChildren(routerChildren);
|
||
if (newChildren.length) return _objectSpread({}, item);
|
||
}
|
||
var finallyItem = _objectSpread({}, item);
|
||
delete finallyItem[childrenPropsName];
|
||
delete finallyItem.children;
|
||
return finallyItem;
|
||
}).filter(function (item) {
|
||
return item;
|
||
});
|
||
};
|
||
/**
|
||
* @param routeList 路由配置
|
||
* @param locale 是否使用国际化
|
||
* @param formatMessage 国际化的程序
|
||
* @param ignoreFilter 是否筛选掉不展示的 menuItem 项,plugin-layout需要所有项目来计算布局样式
|
||
* @returns { breadcrumb, menuData}
|
||
*/
|
||
var transformRoute = function transformRoute(routeList, locale, formatMessage, ignoreFilter) {
|
||
var originalMenuData = formatter({
|
||
data: _toConsumableArray(routeList).map(function (item) {
|
||
return _objectSpread({}, item);
|
||
}),
|
||
formatMessage: formatMessage,
|
||
locale: locale
|
||
});
|
||
var menuData = ignoreFilter ? _clearChildren(originalMenuData) : _defaultFilterMenuData(originalMenuData);
|
||
// Map type used for internal logic
|
||
var breadcrumb = getBreadcrumbNameMap(originalMenuData);
|
||
return {
|
||
breadcrumb: breadcrumb,
|
||
menuData: menuData
|
||
};
|
||
};
|
||
export default transformRoute; |