@next-bricks/nav 1.18.0 → 1.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bricks.json +24 -24
- package/dist/chunks/{2248.8f0a67fc.js → 2248.4d4ba0c4.js} +2 -2
- package/dist/chunks/2248.4d4ba0c4.js.map +1 -0
- package/dist/chunks/get-menu-config-options.ee24c2f0.js +2 -0
- package/dist/chunks/get-menu-config-options.ee24c2f0.js.map +1 -0
- package/dist/chunks/get-menu-config-tree.b15d378f.js +2 -0
- package/dist/chunks/get-menu-config-tree.b15d378f.js.map +1 -0
- package/dist/chunks/{main.e553de02.js → main.894241b7.js} +2 -2
- package/dist/chunks/{main.e553de02.js.map → main.894241b7.js.map} +1 -1
- package/dist/examples.json +3 -3
- package/dist/{index.34f743c0.js → index.bce02739.js} +2 -2
- package/dist/{index.34f743c0.js.map → index.bce02739.js.map} +1 -1
- package/dist/manifest.json +96 -96
- package/dist/types.json +34 -34
- package/dist-types/data-providers/get-menu-config-options.d.ts +1 -1
- package/dist-types/data-providers/get-menu-config-tree.d.ts +1 -1
- package/dist-types/data-providers/shared/smartDisplayForMenuTitle.d.ts +6 -1
- package/package.json +2 -2
- package/dist/chunks/2248.8f0a67fc.js.map +0 -1
- package/dist/chunks/get-menu-config-options.ee72965c.js +0 -2
- package/dist/chunks/get-menu-config-options.ee72965c.js.map +0 -1
- package/dist/chunks/get-menu-config-tree.3dea2b0a.js +0 -2
- package/dist/chunks/get-menu-config-tree.3dea2b0a.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_next_bricks_nav=globalThis.webpackChunk_next_bricks_nav||[]).push([[7159],{3162:(e,t,o)=>{o.r(t),o.d(t,{getMenuConfigOptions:()=>i});var s=o(532),n=o(1590),a=o(1189);async function i(e){const t=[];for(const i of e)if("main"===i.type){var o,s;const e=`customize-menu/${i.menuId}~${i.app[0].appId}+${i.instanceId}`;Object.entries(null!==(o=i.i18n)&&void 0!==o?o:{}).forEach((t=>{let[o,s]=t;n.i18n.addResourceBundle(o,e,s)})),t.push({label:`${null!==(s=(0,a.G)(i.title,e,i.overrideApp))&&void 0!==s?s:""} (${i.menuId})`,value:i.menuId})}return t}customElements.define("nav.get-menu-config-options",(0,s.createProviderClass)(i))},1189:(e,t,o)=>{o.d(t,{G:()=>c});var s=o(1590),n=o(532),a=o(1431),i=o(9297),r=o(7216);const l=new Set(["name","id","homepage","localeName"]);function c(e,t,o){if("string"==typeof e){if((0,a.isEvaluable)(e)){let c;const u={usedProperties:new Set,hasNonStaticUsage:!1};try{c=(0,a.preevaluate)(e,{withParent:!0,hooks:{beforeVisitGlobal:(0,r.beforeVisitGlobalMember)(u,["APP"])}})}catch(t){console.error(`Parse menu title expression "${e}" failed:`,t)}if(c&&(!c.attemptToVisitGlobals.has("APP")||o&&!u.hasNonStaticUsage&&[...u.usedProperties].every((e=>l.has(e))))){const r={};for(const e of c.attemptToVisitGlobals)switch(e){case"I18N":r[e]=s.i18n.getFixedT(null,[t].filter(Boolean));break;case"APP":r[e]={...o,localeName:null==o?void 0:o.name}}const l=(0,i.supply)(c.attemptToVisitGlobals,r);let u=!0;for(const e of c.attemptToVisitGlobals)if(!(0,n.hasOwnProperty)(l,e)){u=!1;break}if(u)try{const t=(0,a.cook)(c.expression,c.source,{globalVariables:l});if("string"==typeof t)return t;console.error(`The result of menu title expression "${e}" is not a string:`,t)}catch(t){console.error(`Evaluate menu title expression "${e}" failed:`,t)}}}return e}}}}]);
|
|
2
|
-
//# sourceMappingURL=get-menu-config-options.ee72965c.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chunks/get-menu-config-options.ee72965c.js","mappings":"4MAeOA,eAAeC,EACpBC,GAEA,MAAMC,EAAwB,GAE9B,IAAK,MAAMC,KAAQF,EACjB,GAAkB,SAAdE,EAAKC,KAAiB,KAAAC,EAAAC,EACxB,MAAMC,EAAoB,kBAAkBJ,EAAKK,UAAUL,EAAKM,IAAI,GAAGC,SACrEP,EAAKQ,aAGPC,OAAOC,QAAiB,QAAVR,EAACF,EAAKW,YAAI,IAAAT,EAAAA,EAAI,CAAC,GAAGU,SAAQC,IAAuB,IAArBC,EAAMC,GAAUF,EACxDF,EAAAA,KAAKK,kBAAkBF,EAAMV,EAAmBW,EAAU,IAE5DhB,EAAQkB,KAAK,CACXC,MAAO,GAA4E,QAA5Ef,GAAGgB,EAAAA,EAAAA,GAAyBnB,EAAKoB,MAAOhB,EAAmBJ,EAAKqB,oBAAY,IAAAlB,EAAAA,EAAI,OAAOH,EAAKK,UACnGiB,MAAOtB,EAAKK,QAEhB,CAGF,OAAON,CACT,CAEAwB,eAAeC,OACb,+BACAC,EAAAA,EAAAA,qBAAoB5B,G,uFC1BtB,MAAM6B,EAAkB,IAAIC,IAAI,CAAC,OAAQ,KAAM,WAAY,eAKpD,SAASR,EACdC,EACAQ,EACAP,GAEA,GAAqB,iBAAVD,EAAX,CAGA,IAAIS,EAAAA,EAAAA,aAAYT,GAAQ,CAEtB,IAAIU,EACJ,MAAMC,EAAqC,CACzCC,eAAgB,IAAIL,IACpBM,mBAAmB,GAErB,IACEH,GAAYI,EAAAA,EAAAA,aAAYd,EAAO,CAC7Be,YAAY,EACZC,MAAO,CACLC,mBAAmBC,EAAAA,EAAAA,yBAAwBP,EAAU,CAAC,UAG5D,CAAE,MAAOQ,GAEPC,QAAQD,MAAM,gCAAgCnB,aAAkBmB,EAClE,CAEA,GACET,KACEA,EAAUW,sBAAsBC,IAAI,QACnCrB,IACEU,EAASE,mBACV,IAAIF,EAASC,gBAAgBW,OAAOC,GAClClB,EAAgBgB,IAAIE,MAE1B,CACA,MAAMC,EAAmC,CAAC,EAC1C,IAAK,MAAMC,KAAOhB,EAAUW,sBAC1B,OAAQK,GACN,IAAK,OACHD,EAAQC,GAAOnC,EAAAA,KAAKoC,UAClB,KACA,CAACnB,GAAeoB,OAAOC,UAEzB,MACF,IAAK,MACHJ,EAAQC,GAAO,IACVzB,EACH6B,WAAY7B,aAAW,EAAXA,EAAa8B,MAKjC,MAAMC,GAAkBC,EAAAA,EAAAA,QAAOvB,EAAUW,sBAAuBI,GAEhE,IAAIS,GAAa,EACjB,IAAK,MAAMR,KAAOhB,EAAUW,sBAC1B,KAAKc,EAAAA,EAAAA,gBAAeH,EAAiBN,GAAM,CACzCQ,GAAa,EACb,KACF,CAGF,GAAIA,EACF,IACE,MAAME,GAASC,EAAAA,EAAAA,MAAK3B,EAAU4B,WAAY5B,EAAU6B,OAAQ,CAC1DC,gBAAiBR,IAEnB,GAAsB,iBAAXI,EACT,OAAOA,EAGThB,QAAQD,MACN,wCAAwCnB,sBACxCoC,EAEJ,CAAE,MAAOjB,GAEPC,QAAQD,MACN,mCAAmCnB,aACnCmB,EAEJ,CAEJ,CACF,CACA,OAAOnB,CA/EP,CAgFF,C","sources":["webpack:///./src/data-providers/get-menu-config-options.ts","webpack:///./src/data-providers/shared/smartDisplayForMenuTitle.ts"],"sourcesContent":["import { createProviderClass } from \"@next-core/utils/general\";\nimport { i18n } from \"@next-core/i18n\";\nimport type { MenuRawData } from \"./get-menu-config-tree\";\nimport { smartDisplayForMenuTitle } from \"./shared/smartDisplayForMenuTitle\";\n\nexport interface MenuOption {\n label: string;\n value: string;\n}\n\n/**\n * 构造用于菜单自定义的下拉选项数据。\n *\n * 将对菜单标题进行表达式解析,支持 I8N 和 APP。\n */\nexport async function getMenuConfigOptions(\n menuList: MenuRawData[]\n): Promise<MenuOption[]> {\n const options: MenuOption[] = [];\n\n for (const menu of menuList) {\n if (menu.type === \"main\") {\n const menuI18nNamespace = `customize-menu/${menu.menuId}~${menu.app[0].appId}+${\n menu.instanceId\n }`;\n // Support any language in `menu.i18n`.\n Object.entries(menu.i18n ?? {}).forEach(([lang, resources]) => {\n i18n.addResourceBundle(lang, menuI18nNamespace, resources);\n });\n options.push({\n label: `${smartDisplayForMenuTitle(menu.title, menuI18nNamespace, menu.overrideApp) ?? \"\"} (${menu.menuId})`,\n value: menu.menuId,\n });\n }\n }\n\n return options;\n}\n\ncustomElements.define(\n \"nav.get-menu-config-options\",\n createProviderClass(getMenuConfigOptions)\n);\n","import type { MicroApp } from \"@next-core/types\";\nimport { i18n } from \"@next-core/i18n\";\nimport { hasOwnProperty } from \"@next-core/utils/general\";\nimport {\n cook,\n isEvaluable,\n preevaluate,\n type PreevaluateResult,\n} from \"@next-core/cook\";\nimport { supply } from \"@next-core/supply\";\nimport {\n beforeVisitGlobalMember,\n type MemberUsageInExpressions,\n} from \"@next-core/utils/storyboard\";\n\nconst allowedAppProps = new Set([\"name\", \"id\", \"homepage\", \"localeName\"]);\n\n/**\n * 对菜单标题进行表达式解析,支持 I8N 和 APP。\n */\nexport function smartDisplayForMenuTitle(\n title: unknown,\n i18nNamespace: string | undefined,\n overrideApp: MicroApp | undefined\n): string | undefined {\n if (typeof title !== \"string\") {\n return;\n }\n if (isEvaluable(title)) {\n // A `SyntaxError` maybe thrown.\n let precooked: PreevaluateResult | undefined;\n const appUsage: MemberUsageInExpressions = {\n usedProperties: new Set(),\n hasNonStaticUsage: false,\n };\n try {\n precooked = preevaluate(title, {\n withParent: true,\n hooks: {\n beforeVisitGlobal: beforeVisitGlobalMember(appUsage, [\"APP\"]),\n },\n });\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Parse menu title expression \"${title}\" failed:`, error);\n }\n\n if (\n precooked &&\n (!precooked.attemptToVisitGlobals.has(\"APP\") ||\n (overrideApp &&\n !appUsage.hasNonStaticUsage &&\n [...appUsage.usedProperties].every((prop) =>\n allowedAppProps.has(prop)\n )))\n ) {\n const globals: Record<string, unknown> = {};\n for (const key of precooked.attemptToVisitGlobals) {\n switch (key) {\n case \"I18N\":\n globals[key] = i18n.getFixedT(\n null,\n [i18nNamespace].filter(Boolean)\n );\n break;\n case \"APP\":\n globals[key] = {\n ...overrideApp,\n localeName: overrideApp?.name,\n };\n break;\n }\n }\n const suppliedGlobals = supply(precooked.attemptToVisitGlobals, globals);\n\n let computable = true;\n for (const key of precooked.attemptToVisitGlobals) {\n if (!hasOwnProperty(suppliedGlobals, key)) {\n computable = false;\n break;\n }\n }\n\n if (computable) {\n try {\n const result = cook(precooked.expression, precooked.source, {\n globalVariables: suppliedGlobals,\n });\n if (typeof result === \"string\") {\n return result;\n }\n // eslint-disable-next-line no-console\n console.error(\n `The result of menu title expression \"${title}\" is not a string:`,\n result\n );\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\n `Evaluate menu title expression \"${title}\" failed:`,\n error\n );\n }\n }\n }\n }\n return title;\n}\n"],"names":["async","getMenuConfigOptions","menuList","options","menu","type","_menu$i18n","_smartDisplayForMenuT","menuI18nNamespace","menuId","app","appId","instanceId","Object","entries","i18n","forEach","_ref","lang","resources","addResourceBundle","push","label","smartDisplayForMenuTitle","title","overrideApp","value","customElements","define","createProviderClass","allowedAppProps","Set","i18nNamespace","isEvaluable","precooked","appUsage","usedProperties","hasNonStaticUsage","preevaluate","withParent","hooks","beforeVisitGlobal","beforeVisitGlobalMember","error","console","attemptToVisitGlobals","has","every","prop","globals","key","getFixedT","filter","Boolean","localeName","name","suppliedGlobals","supply","computable","hasOwnProperty","result","cook","expression","source","globalVariables"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_next_bricks_nav=globalThis.webpackChunk_next_bricks_nav||[]).push([[1255],{1794:(e,t,n)=>{n.r(t),n.d(t,{getMenuConfigTree:()=>u});var o=n(1590),i=n(532),r=n(1030),s=n(1189);const a=Symbol("menuI18nNamespace"),l=Symbol("overrideApp"),c={lib:"fa",icon:"bars"};async function u(e){var t;const n=[],i=e.find((e=>"main"===e.type));if(!i)return[];const r=[],c=new Map,u=new WeakMap;for(const t of e){var m;const e=`customize-menu/${t.menuId}~${t.app[0].appId}+${t.instanceId}`;Object.entries(null!==(m=t.i18n)&&void 0!==m?m:{}).forEach((t=>{let[n,i]=t;o.i18n.addResourceBundle(n,e,i)})),u.set(t,e)}for(const t of e){var h;if((!t.dynamicItems||!t.itemsResolve)&&null!==(h=t.items)&&void 0!==h&&h.length)if("inject"===t.type&&t.injectMenuGroupId){let e=c.get(t.injectMenuGroupId);e||(e=[],c.set(t.injectMenuGroupId,e)),e.push(t)}else r.push(t)}n.push("0");const v=f(r.flatMap((e=>p(e.items,e,c,u))));return[{key:"0",__keys:n,title:null!==(t=(0,s.G)(i.title,u.get(i),i.overrideApp))&&void 0!==t?t:i.menuId,data:i,icon:d(i.icon),children:function e(t,o){const i=null==t?void 0:t.map(((t,i)=>{var r;const c=`${o}-${i}`;return n.push(c),{key:c,title:null!==(r=(0,s.G)(t.text,t[a],t[l]))&&void 0!==r?r:"",data:t,icon:d(t.icon),faded:t.hidden,children:e(t.children,c)}}));return null!=i&&i.length?i:void 0}(v,"0")}]}function d(e){return null!=e&&e.imgSrc?c:null!=e?e:c}function p(e,t,n,o){return null==e?void 0:e.map((e=>{var i;const r=e.groupId&&n.get(e.groupId);return r&&n.delete(e.groupId),{...e,children:(null!==(i=p(e.children,t,n,o))&&void 0!==i?i:[]).concat(r?r.flatMap((e=>p(e.items,e,n,o))):[]),[l]:t.overrideApp,[a]:o.get(t)}}))}function f(e){return function(e){return(0,r.sortBy)(e,(e=>{var t;return null!==(t=e.sort)&&void 0!==t?t:-1/0}),"text")}(e).map((e=>({...e,children:f(e.children)})))}customElements.define("nav.get-menu-config-tree",(0,i.createProviderClass)(u))},1189:(e,t,n)=>{n.d(t,{G:()=>c});var o=n(1590),i=n(532),r=n(1431),s=n(9297),a=n(7216);const l=new Set(["name","id","homepage","localeName"]);function c(e,t,n){if("string"==typeof e){if((0,r.isEvaluable)(e)){let c;const u={usedProperties:new Set,hasNonStaticUsage:!1};try{c=(0,r.preevaluate)(e,{withParent:!0,hooks:{beforeVisitGlobal:(0,a.beforeVisitGlobalMember)(u,["APP"])}})}catch(t){console.error(`Parse menu title expression "${e}" failed:`,t)}if(c&&(!c.attemptToVisitGlobals.has("APP")||n&&!u.hasNonStaticUsage&&[...u.usedProperties].every((e=>l.has(e))))){const a={};for(const e of c.attemptToVisitGlobals)switch(e){case"I18N":a[e]=o.i18n.getFixedT(null,[t].filter(Boolean));break;case"APP":a[e]={...n,localeName:null==n?void 0:n.name}}const l=(0,s.supply)(c.attemptToVisitGlobals,a);let u=!0;for(const e of c.attemptToVisitGlobals)if(!(0,i.hasOwnProperty)(l,e)){u=!1;break}if(u)try{const t=(0,r.cook)(c.expression,c.source,{globalVariables:l});if("string"==typeof t)return t;console.error(`The result of menu title expression "${e}" is not a string:`,t)}catch(t){console.error(`Evaluate menu title expression "${e}" failed:`,t)}}}return e}}}}]);
|
|
2
|
-
//# sourceMappingURL=get-menu-config-tree.3dea2b0a.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chunks/get-menu-config-tree.3dea2b0a.js","mappings":"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","sources":["webpack:///./src/data-providers/get-menu-config-tree.ts","webpack:///./src/data-providers/shared/smartDisplayForMenuTitle.ts"],"sourcesContent":["import type { MetaI18n, MicroApp } from \"@next-core/types\";\nimport { i18n } from \"@next-core/i18n\";\nimport { createProviderClass } from \"@next-core/utils/general\";\nimport { sortBy } from \"lodash\";\nimport { smartDisplayForMenuTitle } from \"./shared/smartDisplayForMenuTitle\";\n\nconst symbolMenuI18nNamespace = Symbol(\"menuI18nNamespace\");\nconst symbolOverrideApp = Symbol(\"overrideApp\");\n\n/** 原始菜单数据。 */\nexport interface MenuRawData {\n menuId: string;\n title: string;\n icon?: {\n imgSrc?: string;\n };\n type?: \"main\" | \"inject\";\n injectMenuGroupId?: string;\n dynamicItems?: boolean;\n itemsResolve?: unknown;\n items?: MenuItemRawData[];\n instanceId: string;\n app: [\n {\n appId: string;\n },\n ];\n i18n?: MetaI18n;\n overrideApp?: MicroApp;\n}\n\n/** 原始菜单项数据。 */\nexport type MenuItemRawData = {\n /** 菜单项文本。 */\n text: string;\n icon?: {\n imgSrc?: string;\n };\n sort?: number;\n groupId?: string;\n hidden?: boolean;\n children?: MenuItemRawData[];\n};\n\nexport interface TitleDataSource {\n objectId: string;\n instanceId: string;\n attributeId?: string;\n}\n\ninterface RuntimeMenuItemRawData extends MenuItemRawData {\n children?: RuntimeMenuItemRawData[];\n [symbolMenuI18nNamespace]?: string;\n [symbolOverrideApp]?: MicroApp;\n}\n\nexport interface TreeNode {\n key: string;\n title: string;\n icon?: unknown;\n faded?: unknown;\n children?: TreeNode[];\n data: MenuRawData | MenuItemRawData;\n /** 第一个节点额外返回 __keys,包含所有节点的 key */\n __keys?: string[];\n}\n\nconst DEFAULT_ICON = {\n lib: \"fa\",\n icon: \"bars\",\n};\n\n/**\n * 构造用于菜单自定义的树形结构数据。\n *\n * 将对菜单标题进行表达式解析,支持 I8N 和 APP。\n */\nexport async function getMenuConfigTree(\n menuList: MenuRawData[]\n): Promise<TreeNode[]> {\n const keys: string[] = [];\n\n function getChildren(\n items: RuntimeMenuItemRawData[] | undefined,\n prefixKey: string\n ): TreeNode[] | undefined {\n const children = items?.map<TreeNode>((item, j) => {\n const key = `${prefixKey}-${j}`;\n keys.push(key);\n return {\n key,\n title:\n smartDisplayForMenuTitle(\n item.text,\n item[symbolMenuI18nNamespace],\n item[symbolOverrideApp]\n ) ?? \"\",\n data: item,\n icon: getIcon(item.icon),\n faded: item.hidden,\n children: getChildren(item.children, key),\n };\n });\n return children?.length ? children : undefined;\n }\n\n const mainMenu = menuList.find((menu) => menu.type === \"main\");\n if (!mainMenu) {\n return [];\n }\n\n const validMenuList: MenuRawData[] = [];\n const injectWithMenus = new Map<string, MenuRawData[]>();\n const menuWithI18n = new WeakMap<MenuRawData, string>();\n\n for (const menu of menuList) {\n const menuI18nNamespace = `customize-menu/${menu.menuId}~${menu.app[0].appId}+${\n menu.instanceId\n }`;\n // Support any language in `menu.i18n`.\n Object.entries(menu.i18n ?? {}).forEach(([lang, resources]) => {\n i18n.addResourceBundle(lang, menuI18nNamespace, resources);\n });\n menuWithI18n.set(menu, menuI18nNamespace);\n }\n\n for (const menu of menuList) {\n if (!(menu.dynamicItems && menu.itemsResolve) && menu.items?.length) {\n if (menu.type === \"inject\" && menu.injectMenuGroupId) {\n let injectingMenus = injectWithMenus.get(menu.injectMenuGroupId);\n if (!injectingMenus) {\n injectingMenus = [];\n injectWithMenus.set(menu.injectMenuGroupId, injectingMenus);\n }\n injectingMenus.push(menu);\n } else {\n validMenuList.push(menu);\n }\n }\n }\n\n keys.push(\"0\");\n\n const firstLevelItems = reorderMenuItems(\n validMenuList.flatMap(\n (menu) =>\n // Here always have non-empty items\n processGroupInject(menu.items, menu, injectWithMenus, menuWithI18n)!\n )\n );\n\n const tree: TreeNode[] = [\n {\n key: \"0\",\n __keys: keys,\n title:\n smartDisplayForMenuTitle(\n mainMenu.title,\n menuWithI18n.get(mainMenu),\n mainMenu.overrideApp\n ) ?? mainMenu.menuId,\n data: mainMenu,\n icon: getIcon(mainMenu.icon),\n children: getChildren(firstLevelItems, \"0\"),\n },\n ];\n\n return tree;\n}\n\nfunction getIcon(icon: { imgSrc?: string } | undefined): unknown {\n // 使用图片图标时,该图标一般是表达式,是应用的运行时数据,菜单管理无法获取。\n if (icon?.imgSrc) {\n return DEFAULT_ICON;\n }\n return icon ?? DEFAULT_ICON;\n}\n\nfunction processGroupInject(\n items: MenuItemRawData[] | undefined,\n menu: MenuRawData,\n injectWithMenus: Map<string, MenuRawData[]>,\n menuWithI18n: WeakMap<MenuRawData, string>\n): RuntimeMenuItemRawData[] | undefined {\n return items?.map((item) => {\n const foundInjectingMenus =\n item.groupId && injectWithMenus.get(item.groupId);\n if (foundInjectingMenus) {\n // Each menu to be injected with should be injected only once.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n injectWithMenus.delete(item.groupId!);\n }\n return {\n ...item,\n children: (\n processGroupInject(\n item.children,\n menu,\n injectWithMenus,\n menuWithI18n\n ) ?? ([] as RuntimeMenuItemRawData[])\n ).concat(\n foundInjectingMenus\n ? foundInjectingMenus.flatMap(\n (injectingMenu) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n processGroupInject(\n injectingMenu.items,\n injectingMenu,\n injectWithMenus,\n menuWithI18n\n )!\n )\n : ([] as RuntimeMenuItemRawData[])\n ),\n [symbolOverrideApp]: menu.overrideApp,\n [symbolMenuI18nNamespace]: menuWithI18n.get(menu),\n };\n });\n}\n\nfunction reorderMenuItems(\n list: MenuItemRawData[] | undefined\n): MenuItemRawData[] {\n return sortMenuItems(list).map((item) => ({\n ...item,\n children: reorderMenuItems(item.children),\n }));\n}\n\nfunction sortMenuItems(list: MenuItemRawData[] | undefined): MenuItemRawData[] {\n return sortBy(list, (item) => item.sort ?? -Infinity, \"text\");\n}\n\ncustomElements.define(\n \"nav.get-menu-config-tree\",\n createProviderClass(getMenuConfigTree)\n);\n","import type { MicroApp } from \"@next-core/types\";\nimport { i18n } from \"@next-core/i18n\";\nimport { hasOwnProperty } from \"@next-core/utils/general\";\nimport {\n cook,\n isEvaluable,\n preevaluate,\n type PreevaluateResult,\n} from \"@next-core/cook\";\nimport { supply } from \"@next-core/supply\";\nimport {\n beforeVisitGlobalMember,\n type MemberUsageInExpressions,\n} from \"@next-core/utils/storyboard\";\n\nconst allowedAppProps = new Set([\"name\", \"id\", \"homepage\", \"localeName\"]);\n\n/**\n * 对菜单标题进行表达式解析,支持 I8N 和 APP。\n */\nexport function smartDisplayForMenuTitle(\n title: unknown,\n i18nNamespace: string | undefined,\n overrideApp: MicroApp | undefined\n): string | undefined {\n if (typeof title !== \"string\") {\n return;\n }\n if (isEvaluable(title)) {\n // A `SyntaxError` maybe thrown.\n let precooked: PreevaluateResult | undefined;\n const appUsage: MemberUsageInExpressions = {\n usedProperties: new Set(),\n hasNonStaticUsage: false,\n };\n try {\n precooked = preevaluate(title, {\n withParent: true,\n hooks: {\n beforeVisitGlobal: beforeVisitGlobalMember(appUsage, [\"APP\"]),\n },\n });\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Parse menu title expression \"${title}\" failed:`, error);\n }\n\n if (\n precooked &&\n (!precooked.attemptToVisitGlobals.has(\"APP\") ||\n (overrideApp &&\n !appUsage.hasNonStaticUsage &&\n [...appUsage.usedProperties].every((prop) =>\n allowedAppProps.has(prop)\n )))\n ) {\n const globals: Record<string, unknown> = {};\n for (const key of precooked.attemptToVisitGlobals) {\n switch (key) {\n case \"I18N\":\n globals[key] = i18n.getFixedT(\n null,\n [i18nNamespace].filter(Boolean)\n );\n break;\n case \"APP\":\n globals[key] = {\n ...overrideApp,\n localeName: overrideApp?.name,\n };\n break;\n }\n }\n const suppliedGlobals = supply(precooked.attemptToVisitGlobals, globals);\n\n let computable = true;\n for (const key of precooked.attemptToVisitGlobals) {\n if (!hasOwnProperty(suppliedGlobals, key)) {\n computable = false;\n break;\n }\n }\n\n if (computable) {\n try {\n const result = cook(precooked.expression, precooked.source, {\n globalVariables: suppliedGlobals,\n });\n if (typeof result === \"string\") {\n return result;\n }\n // eslint-disable-next-line no-console\n console.error(\n `The result of menu title expression \"${title}\" is not a string:`,\n result\n );\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\n `Evaluate menu title expression \"${title}\" failed:`,\n error\n );\n }\n }\n }\n }\n return title;\n}\n"],"names":["symbolMenuI18nNamespace","Symbol","symbolOverrideApp","DEFAULT_ICON","lib","icon","async","getMenuConfigTree","menuList","_smartDisplayForMenuT2","keys","mainMenu","find","menu","type","validMenuList","injectWithMenus","Map","menuWithI18n","WeakMap","_menu$i18n","menuI18nNamespace","menuId","app","appId","instanceId","Object","entries","i18n","forEach","_ref","lang","resources","addResourceBundle","set","_menu$items","dynamicItems","itemsResolve","items","length","injectMenuGroupId","injectingMenus","get","push","firstLevelItems","reorderMenuItems","flatMap","processGroupInject","key","__keys","title","smartDisplayForMenuTitle","overrideApp","data","getIcon","children","getChildren","prefixKey","map","item","j","_smartDisplayForMenuT","text","faded","hidden","undefined","imgSrc","_processGroupInject","foundInjectingMenus","groupId","delete","concat","injectingMenu","list","sortBy","_item$sort","sort","sortMenuItems","customElements","define","createProviderClass","allowedAppProps","Set","i18nNamespace","isEvaluable","precooked","appUsage","usedProperties","hasNonStaticUsage","preevaluate","withParent","hooks","beforeVisitGlobal","beforeVisitGlobalMember","error","console","attemptToVisitGlobals","has","every","prop","globals","getFixedT","filter","Boolean","localeName","name","suppliedGlobals","supply","computable","hasOwnProperty","result","cook","expression","source","globalVariables"],"sourceRoot":""}
|