everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
114 lines (109 loc) • 3.57 kB
JavaScript
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
import { dirname, join } from "node:path";
//#region src/sidebar.ts
const ICON_IMPORTS = {
Home: "lucide-react",
Globe: "lucide-react",
FolderKanban: "lucide-react",
Building2: "lucide-react",
Settings: "lucide-react",
User: "lucide-react",
Users: "lucide-react",
Shield: "lucide-react",
LayoutDashboard: "lucide-react",
CreditCard: "lucide-react",
Bell: "lucide-react",
Key: "lucide-react",
FileText: "lucide-react",
Database: "lucide-react",
Activity: "lucide-react",
BarChart3: "lucide-react",
Zap: "lucide-react",
Terminal: "lucide-react",
Code: "lucide-react",
Package: "lucide-react",
Store: "lucide-react",
ShoppingBag: "lucide-react",
Wallet: "lucide-react",
Coins: "lucide-react",
Plug: "lucide-react",
Link: "lucide-react",
ExternalLink: "lucide-react",
Puzzle: "lucide-react",
Layers: "lucide-react",
Grid3X3: "lucide-react",
AppWindow: "lucide-react"
};
function resolveIconModule(iconName) {
if (ICON_IMPORTS[iconName]) return ICON_IMPORTS[iconName];
return "lucide-react";
}
function collectIconImports(items) {
const moduleMap = /* @__PURE__ */ new Map();
for (const item of items) {
const module = resolveIconModule(item.icon);
if (!moduleMap.has(module)) moduleMap.set(module, /* @__PURE__ */ new Set());
moduleMap.get(module).add(item.icon);
}
return moduleMap;
}
function generatePluginSidebarContent(runtimeConfig) {
const coreItems = [{
icon: "Home",
label: "home",
to: "/",
roleRequired: "anon"
}];
if (runtimeConfig.auth?.sidebar) for (const item of runtimeConfig.auth.sidebar) coreItems.push({
...item,
to: item.to ?? "/auth",
roleRequired: item.roleRequired ?? "member"
});
const pluginItems = [];
if (runtimeConfig.plugins) for (const [key, entry] of Object.entries(runtimeConfig.plugins)) {
const sidebar = entry.sidebar;
if (!sidebar) continue;
for (const item of sidebar) pluginItems.push({
...item,
to: item.to ?? `/${key}`,
roleRequired: item.roleRequired ?? "member"
});
}
const allItems = [...coreItems, ...pluginItems];
const moduleMap = collectIconImports(allItems);
const importLines = [];
for (const [module, icons] of moduleMap) {
const iconList = [...icons].join(", ");
importLines.push(`import { ${iconList} } from "${module}";`);
}
const itemsCode = allItems.map((item) => ` { icon: ${item.icon}, label: "${item.label}", to: "${item.to}" as const, roleRequired: "${item.roleRequired}" as const },`).join("\n");
return `// Auto-generated by bos sync/pluginAdd/pluginRemove. Do not edit.
${importLines.join("\n")}
export type SidebarRole = "anon" | "member" | "admin";
export interface SidebarItem {
icon: React.ComponentType<{ className?: string }>;
label: string;
to: string;
roleRequired: SidebarRole;
}
export const pluginSidebarItems: SidebarItem[] = [
${itemsCode}
];
`;
}
function writePluginSidebarGen(configDir, runtimeConfig) {
const outputPath = join(configDir, "ui/src/lib/plugin-sidebar.gen.ts");
const content = generatePluginSidebarContent(runtimeConfig);
const outputDir = dirname(outputPath);
if (!existsSync(outputDir)) mkdirSync(outputDir, { recursive: true });
let existingContent = null;
try {
existingContent = existsSync(outputPath) ? readFileSync(outputPath, "utf-8") : null;
} catch {}
if (existingContent === content) return outputPath;
writeFileSync(outputPath, content);
return outputPath;
}
//#endregion
export { generatePluginSidebarContent, writePluginSidebarGen };
//# sourceMappingURL=sidebar.mjs.map