bobe-router 0.0.67 → 0.0.69
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/bobe-router.cjs +1108 -0
- package/dist/bobe-router.cjs.map +1 -0
- package/dist/bobe-router.esm.js +980 -204
- package/dist/bobe-router.esm.js.map +1 -1
- package/dist/index.d.ts +194 -68
- package/dist/index.umd.js +978 -203
- package/dist/index.umd.js.map +1 -1
- package/dist/{plugin.cjs.js → plugin.cjs} +141 -21
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.esm.js +141 -21
- package/dist/plugin.esm.js.map +1 -1
- package/package.json +5 -5
- package/dist/bobe-router.cjs.js +0 -333
- package/dist/bobe-router.cjs.js.map +0 -1
- package/dist/plugin.cjs.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.cjs","sources":["../src/plugin/scan.ts","../src/global.ts","../src/plugin/generate.ts","../src/plugin/index.ts"],"sourcesContent":["import { Menu } from '#/type';\nimport { Dirent, readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport matter from 'gray-matter';\n\nexport interface ScanItem {\n url: string;\n file: string;\n menuName?: string;\n /** routeMeta 对象字面量源文(用于嵌入生成代码) */\n metaRaw?: string;\n /** 文件是否有 layout 导出 */\n hasLayout?: boolean;\n}\n\nconst RE_DIR = /^(?:(\\d+)_)?([^_]+?)(?:_(.+?))?$/;\n\nconst DEFAULT_EXTENSIONS = ['js', 'jsx', 'ts', 'tsx'];\n\nfunction buildFileRegex(extensions: string[]): RegExp {\n const exts = extensions.map(e => e.replace(/^\\./, '')).join('|');\n return new RegExp(`^(?:(\\\\d+)_)?([^_]+?)(?:_(.*))?\\\\.(${exts})$`);\n}\n\nfunction buildUrl(base: string, part: string): string {\n return (base === '/' ? '' : base) + '/' + part.replace(/\\./g, '/');\n}\n\n/**\n * 从页面文件源文中提取 `export const routeMeta = {...}`。\n * 返回 { raw: 源文, value: 求值后的对象 },无导出时返回 undefined。\n */\nfunction extractRouteMeta(filePath: string): { raw: string; value: Record<string, any> } | undefined {\n try {\n const ext = filePath.split('.').pop()?.toLowerCase();\n\n // .md/.mdx:解析 YAML frontmatter 中的 meta 字段\n if (ext === 'md' || ext === 'mdx') {\n const content = readFileSync(filePath, 'utf-8');\n const { data } = matter(content);\n if (!data.meta || typeof data.meta !== 'object') return undefined;\n const meta = data.meta as Record<string, any>;\n return { raw: JSON.stringify(meta), value: meta };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n // 匹配 export const routeMeta(兼容 TS 类型标注 `: SomeType`)\n const metaExportRe = /export\\s+const\\s+routeMeta(\\s*:\\s*[\\w.]+(?:\\s*<[^>]*>)?)?\\s*=\\s*/;\n const match = content.match(metaExportRe);\n if (!match) return undefined;\n\n const startIdx = match.index! + match[0].length;\n let braceDepth = 0;\n let inString = false;\n let stringChar: string | null = null;\n let endIdx = startIdx;\n\n for (let i = startIdx; i < content.length; i++) {\n const ch = content[i];\n const prev = i > 0 ? content[i - 1] : '';\n\n // 字符串状态跟踪,避免字符串内的括号干扰\n if (!inString && (ch === '\"' || ch === \"'\" || ch === '`')) {\n inString = true;\n stringChar = ch;\n } else if (inString && ch === stringChar && prev !== '\\\\') {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (ch === '{') braceDepth++;\n else if (ch === '}') {\n braceDepth--;\n if (braceDepth === 0) {\n endIdx = i + 1;\n break;\n }\n }\n }\n }\n\n const raw = content.slice(startIdx, endIdx).trim();\n if (!raw) return undefined;\n\n // 尝试求值为 JS 对象(用于 Menu)\n let value: Record<string, any> | undefined;\n try {\n value = new Function('return ' + raw)() as Record<string, any>;\n } catch {\n // 求值失败(如 import 引用),Menu 无 meta 但仍返回 raw 用于嵌入路由表\n }\n\n return { raw, value: value || {} };\n } catch {\n return undefined;\n }\n}\n\n/**\n * 检测文件是否有 default 导出(即有组件),还是仅导出 routeMeta。\n * .ts/.js: 检查是否有 `export default`\n * .md/.mdx: 检查 frontmatter 之后是否有实际 markdown 内容\n */\nfunction hasDefaultExport(filePath: string): boolean {\n try {\n const ext = filePath.split('.').pop()?.toLowerCase();\n\n if (ext === 'md' || ext === 'mdx') {\n const content = readFileSync(filePath, 'utf-8');\n const { content: mdContent } = matter(content);\n return mdContent.trim().length > 0;\n }\n\n // .ts/.js/.tsx/.jsx:检查 export default\n const content = readFileSync(filePath, 'utf-8');\n return /export\\s+default\\s/.test(content);\n } catch {\n return false;\n }\n}\n\n/**\n * 检测文件是否有 layout 导出。\n * .md/.mdx: 检查 frontmatter 中是否有 layout 字段(markdown 插件会据此生成 export)\n * .ts/.js: 检查是否有 `export const layout` 或 `export { ... layout ... }`\n */\nfunction hasLayoutExport(filePath: string): boolean {\n try {\n const ext = filePath.split('.').pop()?.toLowerCase();\n\n if (ext === 'md' || ext === 'mdx') {\n const content = readFileSync(filePath, 'utf-8');\n const { data } = matter(content);\n return !!data.layout;\n }\n\n const content = readFileSync(filePath, 'utf-8');\n // 匹配: export const layout = ... 或 export { layout } 或 export { xxx as layout }\n return /export\\s+(?:const\\s+layout\\b|\\{[^}]*\\blayout\\b[^}]*\\})/.test(content);\n } catch {\n return false;\n }\n}\n\nfunction parseEntry(name: string, fileRe: RegExp): { order: number; pathPart: string; menuName?: string } | null {\n const dirMatch = name.match(RE_DIR);\n const isDir = !name.includes('.');\n\n if (isDir && dirMatch) {\n const [, orderStr, pathPart, menuName] = dirMatch;\n return { order: orderStr ? parseInt(orderStr, 10) : Infinity, pathPart, menuName };\n }\n\n const fileMatch = name.match(fileRe);\n if (fileMatch) {\n const [, orderStr, pathPart, menuName] = fileMatch;\n return { order: orderStr ? parseInt(orderStr, 10) : Infinity, pathPart, menuName };\n }\n\n return null;\n}\n\nfunction sortEntries(entries: Dirent[], fileRe: RegExp): Dirent[] {\n return entries.sort((a, b) => {\n const pa = parseEntry(a.name, fileRe);\n const pb = parseEntry(b.name, fileRe);\n const oa = pa?.order ?? Infinity;\n const ob = pb?.order ?? Infinity;\n if (oa !== ob) return oa - ob;\n return a.name.localeCompare(b.name);\n });\n}\n\nexport function scanDir(\n absDir: string,\n basePath = absDir,\n parentPath = '',\n parentMenu?: Menu,\n extensions: string[] = DEFAULT_EXTENSIONS,\n nearestRef: { value?: { name: string; path: string } } = {}\n): { routes: ScanItem[]; menus: Menu[] } {\n const routes: ScanItem[] = [];\n const menus: Menu[] = [];\n let entries: Dirent[];\n const fileRe = buildFileRegex(extensions);\n\n try {\n entries = readdirSync(absDir, { withFileTypes: true });\n } catch {\n return { routes, menus };\n }\n\n entries = sortEntries(entries, fileRe);\n\n for (const ent of entries) {\n const full = join(absDir, ent.name);\n const parsed = parseEntry(ent.name, fileRe);\n if (!parsed) continue;\n\n const { pathPart, menuName } = parsed;\n const handledName = menuName || pathPart;\n\n if (ent.isDirectory()) {\n const urlPath = buildUrl(parentPath, pathPart);\n const menu: Menu = {\n name: menuName || pathPart,\n hasComponent: false,\n path: urlPath,\n children: []\n };\n const child = scanDir(full, basePath, urlPath, menu, extensions, nearestRef);\n routes.push(...child.routes);\n // 自身有, 父级还没有就给父级赋值\n if (menu.nearestFile && parentMenu && !parentMenu.nearestFile) {\n parentMenu.nearestFile = menu.nearestFile;\n }\n\n menu.children = child.menus;\n menus.push(menu);\n } else if (ent.isFile()) {\n const isIndex = pathPart === 'index';\n const relFile = '/' + full.slice(basePath.length).replace(/^[/\\\\]/, '');\n const urlPath = buildUrl(parentPath, pathPart);\n\n // 提取 routeMeta\n const metaResult = extractRouteMeta(full);\n const metaRaw = metaResult?.raw;\n const meta = metaResult?.value && Object.keys(metaResult.value).length > 0 ? metaResult.value : undefined;\n\n // 检测是否有 default 导出(有组件 = 有路由页面)\n const hasComp = hasDefaultExport(full);\n\n // 检测是否有 layout 导出\n const hasLayout = hasLayoutExport(full);\n\n if (isIndex) {\n const url = parentPath || '/';\n\n // 仅有 routeMeta 无 default 导出的文件不加入路由表\n if (hasComp) {\n routes.push({ url, file: relFile, menuName, metaRaw, hasLayout });\n }\n\n if (parentMenu) {\n // 直接修改父菜单,不走 push\n if (menuName) parentMenu.name = menuName;\n if (hasComp) {\n parentMenu.path = url;\n parentMenu.hasComponent = true;\n parentMenu.nearestFile = { name: handledName, path: url };\n }\n if (meta) parentMenu.meta = meta;\n }\n // 首页\n else if (menuName) {\n menus.push({\n name: menuName,\n path: hasComp ? '/' : undefined,\n hasComponent: hasComp,\n children: [],\n meta,\n nearestFile: hasComp ? { name: menuName, path: '/' } : undefined\n });\n }\n }\n // 非 index\n else {\n if (hasComp) {\n routes.push({ url: urlPath, file: relFile, menuName, metaRaw, hasLayout });\n if (parentMenu && !parentMenu.nearestFile) {\n parentMenu.nearestFile = { name: handledName, path: urlPath };\n }\n }\n if (menuName || meta) {\n menus.push({\n name: menuName || pathPart,\n path: hasComp ? urlPath : undefined,\n hasComponent: hasComp,\n meta,\n nearestFile: hasComp ? { name: handledName, path: urlPath } : undefined\n });\n }\n }\n }\n }\n\n return { routes, menus };\n}\n","/** 通过 globalThis 传递的路由全局变量名 */\nexport enum GlobalKey {\n /** 路由表:{ [url]: { import/component } } */\n Routes = '__BOBE_INIT_ROUTES__',\n /** 菜单树:Menu[] */\n Menus = '__BOBE_INIT_MENUS__',\n /** 初始路径 */\n Path = '__BOBE_INIT_PATH__',\n}\n","import { GlobalKey } from '#/global';\nimport { Menu } from '#/type';\nimport type { ScanItem } from './scan';\n\nconst { Routes, Menus } = GlobalKey;\n\nexport function generateCsrInit(items: ScanItem[]): string {\n const entries = items.map(({ url, file, metaRaw }) => {\n const metaPart = metaRaw ? `, meta: ${metaRaw}` : '';\n return ` '${url}': { import: () => import('${file}')${metaPart} }`;\n });\n return `globalThis['${Routes}'] = {\\n` + entries.join(',\\n') + '\\n};';\n}\n\nexport function generateSsgInit(items: ScanItem[]): string {\n const imports = items.map(({ file }, i) =>\n `import * as __module_${i} from '${file}';`\n );\n const names = items.map((_, i) => `__module_${i}.default`);\n const entries = items.map(({ url, metaRaw, hasLayout }, i) => {\n const metaPart = metaRaw ? `, meta: ${metaRaw}` : '';\n const layoutPart = hasLayout ? `, layout: __module_${i}.layout` : '';\n return ` '${url}': { component: __module_${i}.default${layoutPart}${metaPart} }`;\n });\n return imports.join('\\n')\n + `\\n\\nglobalThis['${Routes}'] = {\\n` + entries.join(',\\n') + '\\n};'\n + `\\nexport const __bobe_routes = [${names.join(', ')}];`;\n}\n\nexport function generateCsrMenus(menus: Menu[]): string {\n return `globalThis['${Menus}'] = ${JSON.stringify(menus)};`;\n}\n","import type { Plugin } from 'vite';\nimport { isAbsolute, resolve } from 'path';\nimport { scanDir } from './scan';\nimport { generateCsrInit, generateSsgInit, generateCsrMenus } from './generate';\n\nfunction injectImport(code: string, source: string): string {\n if (code.includes(`'${source}'`) || code.includes(`\"${source}\"`)) return code;\n return `import '${source}';\\n` + code;\n}\n\nfunction normalizeEntryId(id: string, root: string): string {\n const cleanId = id.split('?')[0].replace(/\\\\/g, '/');\n const cleanRoot = root.replace(/\\\\/g, '/');\n if (cleanId.startsWith(cleanRoot + '/')) {\n return cleanId.slice(cleanRoot.length + 1);\n }\n return cleanId.replace(/^\\/+/, '');\n}\n\nfunction normalizeConfigEntry(entry: string, root: string): string {\n const cleanEntry = entry.split('?')[0].replace(/\\\\/g, '/');\n const absEntry = isAbsolute(cleanEntry) ? cleanEntry : resolve(root, cleanEntry);\n return normalizeEntryId(absEntry, root);\n}\n\nfunction normalizeUrlEntry(url: string, root: string): string {\n const cleanUrl = url.split('?')[0].replace(/\\\\/g, '/').replace(/^\\/+/, '');\n return normalizeEntryId(resolve(root, cleanUrl), root);\n}\n\nfunction collectInputEntries(input: unknown, root: string): string[] {\n const values =\n typeof input === 'string'\n ? [input]\n : Array.isArray(input)\n ? input\n : input && typeof input === 'object'\n ? Object.values(input as Record<string, unknown>)\n : [];\n return values\n .filter((entry): entry is string => typeof entry === 'string' && !entry.split('?')[0].endsWith('.html'))\n .map(entry => normalizeConfigEntry(entry, root));\n}\n\nexport interface BobeRouterPluginOptions {\n dir?: string;\n ssg?: boolean;\n /** 可识别的文件后缀,默认 ['js', 'jsx', 'ts', 'tsx'] */\n extensions?: string[];\n}\n\nexport default function bobeRouter(opt: BobeRouterPluginOptions = {}): Plugin[] {\n const dir = opt.dir || 'pages';\n const extensions = opt.extensions || ['js', 'jsx', 'ts', 'tsx'];\n const csrRoutesId = 'bobe-router/csr-routes';\n const ssgRoutesId = 'bobe-router/ssg-routes';\n const resolvedCsrRoutesId = '\\0' + csrRoutesId;\n const resolvedSsgRoutesId = '\\0' + ssgRoutesId;\n\n let root: string;\n let isSsrBuild = false;\n let csrEntryIds = new Set<string>();\n let ssgEntryIds = new Set<string>();\n\n return [{\n name: 'bobe-router',\n enforce: 'pre',\n configResolved(config) {\n root = config.root;\n isSsrBuild = Boolean(config.build.ssr);\n csrEntryIds = new Set();\n ssgEntryIds = new Set();\n\n if (typeof config.build.ssr === 'string') {\n ssgEntryIds.add(normalizeConfigEntry(config.build.ssr, root));\n } else if (config.build.ssr) {\n ssgEntryIds = new Set(collectInputEntries(config.build.rollupOptions.input, root));\n } else {\n const libEntry = config.build.lib && typeof config.build.lib === 'object'\n ? config.build.lib.entry\n : undefined;\n csrEntryIds = new Set(collectInputEntries((config.build.rolldownOptions ?? config.build.rollupOptions).input || libEntry, root));\n }\n },\n\n configureServer(server) {\n const ssrLoadModule = server.ssrLoadModule.bind(server);\n server.ssrLoadModule = (url, opts) => {\n ssgEntryIds.add(normalizeUrlEntry(url, root));\n return ssrLoadModule(url, opts);\n };\n },\n\n resolveId(id) {\n if (id === csrRoutesId) return { id: resolvedCsrRoutesId, moduleSideEffects: true };\n if (id === ssgRoutesId) return { id: resolvedSsgRoutesId, moduleSideEffects: true };\n },\n\n load(id) {\n if (id === resolvedCsrRoutesId) {\n const absDir = resolve(root, dir);\n const { routes, menus } = scanDir(absDir, root, '', undefined, extensions);\n return generateCsrInit(routes) + (menus.length ? '\\n' + generateCsrMenus(menus) : '');\n }\n if (id === resolvedSsgRoutesId) {\n const absDir = resolve(root, dir);\n const { routes, menus } = scanDir(absDir, root, '', undefined, extensions);\n return generateSsgInit(routes) + (menus.length ? '\\n' + generateCsrMenus(menus) : '');\n }\n },\n\n // SSR 使用 build.ssr / rollupOptions.input 定位入口;CSR HTML 入口走 transformIndexHtml。\n // 显式 JS input 的 CSR build 会在这里注入 csr-routes。\n transform(code, id) {\n const entryId = normalizeEntryId(id, root);\n if (ssgEntryIds.has(entryId)) {\n return injectImport(code, ssgRoutesId);\n }\n if (!isSsrBuild && csrEntryIds.has(entryId)) {\n return injectImport(code, csrRoutesId);\n }\n },\n\n transformIndexHtml: {\n order: 'pre',\n handler(html) {\n if (isSsrBuild || html.includes(csrRoutesId)) return;\n return [{\n tag: 'script',\n attrs: { type: 'module' },\n children: `import '${csrRoutesId}';`,\n injectTo: 'head-prepend',\n }];\n }\n }\n }];\n}\n"],"names":["RE_DIR","DEFAULT_EXTENSIONS","buildFileRegex","extensions","exts","map","e","replace","join","RegExp","buildUrl","base","part","extractRouteMeta","filePath","ext","split","pop","toLowerCase","content","readFileSync","_matter","matter","data","meta","undefined","raw","JSON","stringify","value","metaExportRe","match","startIdx","index","length","braceDepth","inString","stringChar","endIdx","i","ch","prev","slice","trim","Function","hasDefaultExport","_matter2","mdContent","test","hasLayoutExport","_matter3","layout","parseEntry","name","fileRe","dirMatch","isDir","includes","_dirMatch","_slicedToArray","orderStr","pathPart","menuName","order","parseInt","Infinity","fileMatch","_fileMatch","sortEntries","entries","sort","a","b","pa","pb","oa","ob","localeCompare","scanDir","absDir","basePath","parentPath","parentMenu","nearestRef","routes","menus","readdirSync","withFileTypes","ent","full","parsed","handledName","isDirectory","urlPath","menu","hasComponent","path","children","child","push","nearestFile","isFile","isIndex","relFile","metaResult","metaRaw","Object","keys","hasComp","hasLayout","url","file","GlobalKey","Routes","Menus","generateCsrInit","items","metaPart","generateSsgInit","imports","names","_","layoutPart","generateCsrMenus","injectImport","code","source","normalizeEntryId","id","root","cleanId","cleanRoot","startsWith","normalizeConfigEntry","entry","cleanEntry","absEntry","isAbsolute","resolve","normalizeUrlEntry","cleanUrl","collectInputEntries","input","values","Array","isArray","filter","endsWith","bobeRouter","opt","dir","csrRoutesId","ssgRoutesId","resolvedCsrRoutesId","resolvedSsgRoutesId","isSsrBuild","csrEntryIds","Set","ssgEntryIds","enforce","configResolved","config","Boolean","build","ssr","add","rollupOptions","libEntry","lib","rolldownOptions","configureServer","server","ssrLoadModule","bind","opts","resolveId","moduleSideEffects","load","_scanDir","_scanDir2","transform","entryId","has","transformIndexHtml","handler","html","tag","attrs","type","injectTo"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,MAAMA,MAAM,GAAG,kCAAkC;AAEjD,MAAMC,kBAAkB,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;AAErD,SAASC,cAAcA,CAACC,UAAoB,EAAU;EACpD,MAAMC,IAAI,GAAGD,UAAU,CAACE,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;AAChE,EAAA,OAAO,IAAIC,MAAM,CAAC,CAAA,mCAAA,EAAsCL,IAAI,IAAI,CAAC;AACnE;AAEA,SAASM,QAAQA,CAACC,IAAY,EAAEC,IAAY,EAAU;AACpD,EAAA,OAAO,CAACD,IAAI,KAAK,GAAG,GAAG,EAAE,GAAGA,IAAI,IAAI,GAAG,GAAGC,IAAI,CAACL,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACpE;AAMA,SAASM,gBAAgBA,CAACC,QAAgB,EAA2D;EACnG,IAAI;AACF,IAAA,MAAMC,GAAG,GAAGD,QAAQ,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,EAAE,EAAEC,WAAW,EAAE;AAGpD,IAAA,IAAIH,GAAG,KAAK,IAAI,IAAIA,GAAG,KAAK,KAAK,EAAE;AACjC,MAAA,MAAMI,OAAO,GAAGC,eAAY,CAACN,QAAQ,EAAE,OAAO,CAAC;AAC/C,MAAA,MAAAO,OAAA,GAAiBC,MAAM,CAACH,OAAO,CAAC;QAAxBI,IAAI,GAAAF,OAAA,CAAJE,IAAI;AACZ,MAAA,IAAI,CAACA,IAAI,CAACC,IAAI,IAAI,OAAOD,IAAI,CAACC,IAAI,KAAK,QAAQ,EAAE,OAAOC,SAAS;AACjE,MAAA,MAAMD,IAAI,GAAGD,IAAI,CAACC,IAA2B;MAC7C,OAAO;AAAEE,QAAAA,GAAG,EAAEC,IAAI,CAACC,SAAS,CAACJ,IAAI,CAAC;AAAEK,QAAAA,KAAK,EAAEL;OAAM;AACnD,IAAA;AAEA,IAAA,MAAML,OAAO,GAAGC,eAAY,CAACN,QAAQ,EAAE,OAAO,CAAC;IAE/C,MAAMgB,YAAY,GAAG,kEAAkE;AACvF,IAAA,MAAMC,KAAK,GAAGZ,OAAO,CAACY,KAAK,CAACD,YAAY,CAAC;AACzC,IAAA,IAAI,CAACC,KAAK,EAAE,OAAON,SAAS;IAE5B,MAAMO,QAAQ,GAAGD,KAAK,CAACE,KAAK,GAAIF,KAAK,CAAC,CAAC,CAAC,CAACG,MAAM;IAC/C,IAAIC,UAAU,GAAG,CAAC;IAClB,IAAIC,QAAQ,GAAG,KAAK;IACpB,IAAIC,UAAyB,GAAG,IAAI;IACpC,IAAIC,MAAM,GAAGN,QAAQ;AAErB,IAAA,KAAK,IAAIO,CAAC,GAAGP,QAAQ,EAAEO,CAAC,GAAGpB,OAAO,CAACe,MAAM,EAAEK,CAAC,EAAE,EAAE;AAC9C,MAAA,MAAMC,EAAE,GAAGrB,OAAO,CAACoB,CAAC,CAAC;AACrB,MAAA,MAAME,IAAI,GAAGF,CAAC,GAAG,CAAC,GAAGpB,OAAO,CAACoB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;AAGxC,MAAA,IAAI,CAACH,QAAQ,KAAKI,EAAE,KAAK,GAAG,IAAIA,EAAE,KAAK,GAAG,IAAIA,EAAE,KAAK,GAAG,CAAC,EAAE;AACzDJ,QAAAA,QAAQ,GAAG,IAAI;AACfC,QAAAA,UAAU,GAAGG,EAAE;MACjB,CAAC,MAAM,IAAIJ,QAAQ,IAAII,EAAE,KAAKH,UAAU,IAAII,IAAI,KAAK,IAAI,EAAE;AACzDL,QAAAA,QAAQ,GAAG,KAAK;AAChBC,QAAAA,UAAU,GAAG,IAAI;AACnB,MAAA;MAEA,IAAI,CAACD,QAAQ,EAAE;AACb,QAAA,IAAII,EAAE,KAAK,GAAG,EAAEL,UAAU,EAAE,CAAC,KACxB,IAAIK,EAAE,KAAK,GAAG,EAAE;AACnBL,UAAAA,UAAU,EAAE;UACZ,IAAIA,UAAU,KAAK,CAAC,EAAE;YACpBG,MAAM,GAAGC,CAAC,GAAG,CAAC;AACd,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,MAAMb,GAAG,GAAGP,OAAO,CAACuB,KAAK,CAACV,QAAQ,EAAEM,MAAM,CAAC,CAACK,IAAI,EAAE;AAClD,IAAA,IAAI,CAACjB,GAAG,EAAE,OAAOD,SAAS;AAG1B,IAAA,IAAII,KAAsC;IAC1C,IAAI;MACFA,KAAK,GAAG,IAAIe,QAAQ,CAAC,SAAS,GAAGlB,GAAG,CAAC,EAAyB;IAChE,CAAC,CAAC,MAAM,CAER;IAEA,OAAO;MAAEA,GAAG;MAAEG,KAAK,EAAEA,KAAK,IAAI;KAAI;AACpC,EAAA,CAAC,CAAC,MAAM;AACN,IAAA,OAAOJ,SAAS;AAClB,EAAA;AACF;AAOA,SAASoB,gBAAgBA,CAAC/B,QAAgB,EAAW;EACnD,IAAI;AACF,IAAA,MAAMC,GAAG,GAAGD,QAAQ,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,EAAE,EAAEC,WAAW,EAAE;AAEpD,IAAA,IAAIH,GAAG,KAAK,IAAI,IAAIA,GAAG,KAAK,KAAK,EAAE;AACjC,MAAA,MAAMI,OAAO,GAAGC,eAAY,CAACN,QAAQ,EAAE,OAAO,CAAC;AAC/C,MAAA,MAAAgC,QAAA,GAA+BxB,MAAM,CAACH,OAAO,CAAC;QAA7B4B,SAAS,GAAAD,QAAA,CAAlB3B,OAAO;MACf,OAAO4B,SAAS,CAACJ,IAAI,EAAE,CAACT,MAAM,GAAG,CAAC;AACpC,IAAA;AAGA,IAAA,MAAMf,OAAO,GAAGC,eAAY,CAACN,QAAQ,EAAE,OAAO,CAAC;AAC/C,IAAA,OAAO,oBAAoB,CAACkC,IAAI,CAAC7B,OAAO,CAAC;AAC3C,EAAA,CAAC,CAAC,MAAM;AACN,IAAA,OAAO,KAAK;AACd,EAAA;AACF;AAOA,SAAS8B,eAAeA,CAACnC,QAAgB,EAAW;EAClD,IAAI;AACF,IAAA,MAAMC,GAAG,GAAGD,QAAQ,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,EAAE,EAAEC,WAAW,EAAE;AAEpD,IAAA,IAAIH,GAAG,KAAK,IAAI,IAAIA,GAAG,KAAK,KAAK,EAAE;AACjC,MAAA,MAAMI,OAAO,GAAGC,eAAY,CAACN,QAAQ,EAAE,OAAO,CAAC;AAC/C,MAAA,MAAAoC,QAAA,GAAiB5B,MAAM,CAACH,OAAO,CAAC;QAAxBI,IAAI,GAAA2B,QAAA,CAAJ3B,IAAI;AACZ,MAAA,OAAO,CAAC,CAACA,IAAI,CAAC4B,MAAM;AACtB,IAAA;AAEA,IAAA,MAAMhC,OAAO,GAAGC,eAAY,CAACN,QAAQ,EAAE,OAAO,CAAC;AAE/C,IAAA,OAAO,wDAAwD,CAACkC,IAAI,CAAC7B,OAAO,CAAC;AAC/E,EAAA,CAAC,CAAC,MAAM;AACN,IAAA,OAAO,KAAK;AACd,EAAA;AACF;AAEA,SAASiC,UAAUA,CAACC,IAAY,EAAEC,MAAc,EAAiE;AAC/G,EAAA,MAAMC,QAAQ,GAAGF,IAAI,CAACtB,KAAK,CAAC/B,MAAM,CAAC;EACnC,MAAMwD,KAAK,GAAG,CAACH,IAAI,CAACI,QAAQ,CAAC,GAAG,CAAC;EAEjC,IAAID,KAAK,IAAID,QAAQ,EAAE;AACrB,IAAA,MAAAG,SAAA,GAAAC,cAAA,CAAyCJ,QAAQ,EAAA,CAAA,CAAA;AAAxCK,MAAAA,QAAQ,GAAAF,SAAA,CAAA,CAAA,CAAA;AAAEG,MAAAA,QAAQ,GAAAH,SAAA,CAAA,CAAA,CAAA;AAAEI,MAAAA,QAAQ,GAAAJ,SAAA,CAAA,CAAA,CAAA;IACrC,OAAO;MAAEK,KAAK,EAAEH,QAAQ,GAAGI,QAAQ,CAACJ,QAAQ,EAAE,EAAE,CAAC,GAAGK,QAAQ;MAAEJ,QAAQ;AAAEC,MAAAA;KAAU;AACpF,EAAA;AAEA,EAAA,MAAMI,SAAS,GAAGb,IAAI,CAACtB,KAAK,CAACuB,MAAM,CAAC;AACpC,EAAA,IAAIY,SAAS,EAAE;AACb,IAAA,MAAAC,UAAA,GAAAR,cAAA,CAAyCO,SAAS,EAAA,CAAA,CAAA;AAAzCN,MAAAA,QAAQ,GAAAO,UAAA,CAAA,CAAA,CAAA;AAAEN,MAAAA,QAAQ,GAAAM,UAAA,CAAA,CAAA,CAAA;AAAEL,MAAAA,QAAQ,GAAAK,UAAA,CAAA,CAAA,CAAA;IACrC,OAAO;MAAEJ,KAAK,EAAEH,QAAQ,GAAGI,QAAQ,CAACJ,QAAQ,EAAE,EAAE,CAAC,GAAGK,QAAQ;MAAEJ,QAAQ;AAAEC,MAAAA;KAAU;AACpF,EAAA;AAEA,EAAA,OAAO,IAAI;AACb;AAEA,SAASM,WAAWA,CAACC,OAAiB,EAAEf,MAAc,EAAY;EAChE,OAAOe,OAAO,CAACC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;IAC5B,MAAMC,EAAE,GAAGrB,UAAU,CAACmB,CAAC,CAAClB,IAAI,EAAEC,MAAM,CAAC;IACrC,MAAMoB,EAAE,GAAGtB,UAAU,CAACoB,CAAC,CAACnB,IAAI,EAAEC,MAAM,CAAC;AACrC,IAAA,MAAMqB,EAAE,GAAGF,EAAE,EAAEV,KAAK,IAAIE,QAAQ;AAChC,IAAA,MAAMW,EAAE,GAAGF,EAAE,EAAEX,KAAK,IAAIE,QAAQ;AAChC,IAAA,IAAIU,EAAE,KAAKC,EAAE,EAAE,OAAOD,EAAE,GAAGC,EAAE;IAC7B,OAAOL,CAAC,CAAClB,IAAI,CAACwB,aAAa,CAACL,CAAC,CAACnB,IAAI,CAAC;AACrC,EAAA,CAAC,CAAC;AACJ;AAEO,SAASyB,OAAOA,CACrBC,MAAc,EACdC,QAAQ,GAAGD,MAAM,EACjBE,UAAU,GAAG,EAAE,EACfC,UAAiB,EACjB/E,UAAoB,GAAGF,kBAAkB,EACzCkF,UAAsD,GAAG,EAAE,EACpB;EACvC,MAAMC,MAAkB,GAAG,EAAE;EAC7B,MAAMC,KAAa,GAAG,EAAE;AACxB,EAAA,IAAIhB,OAAiB;AACrB,EAAA,MAAMf,MAAM,GAAGpD,cAAc,CAACC,UAAU,CAAC;EAEzC,IAAI;AACFkE,IAAAA,OAAO,GAAGiB,cAAW,CAACP,MAAM,EAAE;AAAEQ,MAAAA,aAAa,EAAE;AAAK,KAAC,CAAC;AACxD,EAAA,CAAC,CAAC,MAAM;IACN,OAAO;MAAEH,MAAM;AAAEC,MAAAA;KAAO;AAC1B,EAAA;AAEAhB,EAAAA,OAAO,GAAGD,WAAW,CAACC,OAAO,EAAEf,MAAM,CAAC;AAEtC,EAAA,KAAK,MAAMkC,GAAG,IAAInB,OAAO,EAAE;IACzB,MAAMoB,IAAI,GAAGjF,SAAI,CAACuE,MAAM,EAAES,GAAG,CAACnC,IAAI,CAAC;IACnC,MAAMqC,MAAM,GAAGtC,UAAU,CAACoC,GAAG,CAACnC,IAAI,EAAEC,MAAM,CAAC;IAC3C,IAAI,CAACoC,MAAM,EAAE;AAEb,IAAA,MAAQ7B,QAAQ,GAAe6B,MAAM,CAA7B7B,QAAQ;MAAEC,QAAQ,GAAK4B,MAAM,CAAnB5B,QAAQ;AAC1B,IAAA,MAAM6B,WAAW,GAAG7B,QAAQ,IAAID,QAAQ;AAExC,IAAA,IAAI2B,GAAG,CAACI,WAAW,EAAE,EAAE;AACrB,MAAA,MAAMC,OAAO,GAAGnF,QAAQ,CAACuE,UAAU,EAAEpB,QAAQ,CAAC;AAC9C,MAAA,MAAMiC,IAAU,GAAG;QACjBzC,IAAI,EAAES,QAAQ,IAAID,QAAQ;AAC1BkC,QAAAA,YAAY,EAAE,KAAK;AACnBC,QAAAA,IAAI,EAAEH,OAAO;AACbI,QAAAA,QAAQ,EAAE;OACX;AACD,MAAA,MAAMC,KAAK,GAAGpB,OAAO,CAACW,IAAI,EAAET,QAAQ,EAAEa,OAAO,EAAEC,IAAI,EAAE3F,UAAU,EAAEgF,UAAU,CAAC;AAC5EC,MAAAA,MAAM,CAACe,IAAI,CAAC,GAAGD,KAAK,CAACd,MAAM,CAAC;MAE5B,IAAIU,IAAI,CAACM,WAAW,IAAKlB,UAAU,IAAI,CAACA,UAAU,CAACkB,WAAW,EAAE;AAC9DlB,QAAAA,UAAU,CAACkB,WAAW,GAAGN,IAAI,CAACM,WAAW;AAC3C,MAAA;AAEAN,MAAAA,IAAI,CAACG,QAAQ,GAAGC,KAAK,CAACb,KAAK;AAC3BA,MAAAA,KAAK,CAACc,IAAI,CAACL,IAAI,CAAC;AAClB,IAAA,CAAC,MAAM,IAAIN,GAAG,CAACa,MAAM,EAAE,EAAE;AACvB,MAAA,MAAMC,OAAO,GAAGzC,QAAQ,KAAK,OAAO;AACpC,MAAA,MAAM0C,OAAO,GAAG,GAAG,GAAGd,IAAI,CAAC/C,KAAK,CAACsC,QAAQ,CAAC9C,MAAM,CAAC,CAAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;AACvE,MAAA,MAAMsF,OAAO,GAAGnF,QAAQ,CAACuE,UAAU,EAAEpB,QAAQ,CAAC;AAG9C,MAAA,MAAM2C,UAAU,GAAG3F,gBAAgB,CAAC4E,IAAI,CAAC;AACzC,MAAA,MAAMgB,OAAO,GAAGD,UAAU,EAAE9E,GAAG;MAC/B,MAAMF,IAAI,GAAGgF,UAAU,EAAE3E,KAAK,IAAI6E,MAAM,CAACC,IAAI,CAACH,UAAU,CAAC3E,KAAK,CAAC,CAACK,MAAM,GAAG,CAAC,GAAGsE,UAAU,CAAC3E,KAAK,GAAGJ,SAAS;AAGzG,MAAA,MAAMmF,OAAO,GAAG/D,gBAAgB,CAAC4C,IAAI,CAAC;AAGtC,MAAA,MAAMoB,SAAS,GAAG5D,eAAe,CAACwC,IAAI,CAAC;AAEvC,MAAA,IAAIa,OAAO,EAAE;AACX,QAAA,MAAMQ,GAAG,GAAG7B,UAAU,IAAI,GAAG;AAG7B,QAAA,IAAI2B,OAAO,EAAE;UACXxB,MAAM,CAACe,IAAI,CAAC;YAAEW,GAAG;AAAEC,YAAAA,IAAI,EAAER,OAAO;YAAEzC,QAAQ;YAAE2C,OAAO;AAAEI,YAAAA;AAAU,WAAC,CAAC;AACnE,QAAA;AAEA,QAAA,IAAI3B,UAAU,EAAE;AAEd,UAAA,IAAIpB,QAAQ,EAAEoB,UAAU,CAAC7B,IAAI,GAAGS,QAAQ;AACxC,UAAA,IAAI8C,OAAO,EAAE;YACX1B,UAAU,CAACc,IAAI,GAAGc,GAAG;YACrB5B,UAAU,CAACa,YAAY,GAAG,IAAI;YAC9Bb,UAAU,CAACkB,WAAW,GAAG;AAAE/C,cAAAA,IAAI,EAAEsC,WAAW;AAAEK,cAAAA,IAAI,EAAEc;aAAK;AAC3D,UAAA;AACA,UAAA,IAAItF,IAAI,EAAE0D,UAAU,CAAC1D,IAAI,GAAGA,IAAI;QAClC,CAAC,MAEI,IAAIsC,QAAQ,EAAE;UACjBuB,KAAK,CAACc,IAAI,CAAC;AACT9C,YAAAA,IAAI,EAAES,QAAQ;AACdkC,YAAAA,IAAI,EAAEY,OAAO,GAAG,GAAG,GAAGnF,SAAS;AAC/BsE,YAAAA,YAAY,EAAEa,OAAO;AACrBX,YAAAA,QAAQ,EAAE,EAAE;YACZzE,IAAI;YACJ4E,WAAW,EAAEQ,OAAO,GAAG;AAAEvD,cAAAA,IAAI,EAAES,QAAQ;AAAEkC,cAAAA,IAAI,EAAE;AAAI,aAAC,GAAGvE;AACzD,WAAC,CAAC;AACJ,QAAA;AACF,MAAA,CAAC,MAEI;AACH,QAAA,IAAImF,OAAO,EAAE;UACXxB,MAAM,CAACe,IAAI,CAAC;AAAEW,YAAAA,GAAG,EAAEjB,OAAO;AAAEkB,YAAAA,IAAI,EAAER,OAAO;YAAEzC,QAAQ;YAAE2C,OAAO;AAAEI,YAAAA;AAAU,WAAC,CAAC;AAC1E,UAAA,IAAI3B,UAAU,IAAI,CAACA,UAAU,CAACkB,WAAW,EAAE;YACzClB,UAAU,CAACkB,WAAW,GAAG;AAAE/C,cAAAA,IAAI,EAAEsC,WAAW;AAAEK,cAAAA,IAAI,EAAEH;aAAS;AAC/D,UAAA;AACF,QAAA;QACA,IAAI/B,QAAQ,IAAItC,IAAI,EAAE;UACpB6D,KAAK,CAACc,IAAI,CAAC;YACT9C,IAAI,EAAES,QAAQ,IAAID,QAAQ;AAC1BmC,YAAAA,IAAI,EAAEY,OAAO,GAAGf,OAAO,GAAGpE,SAAS;AACnCsE,YAAAA,YAAY,EAAEa,OAAO;YACrBpF,IAAI;YACJ4E,WAAW,EAAEQ,OAAO,GAAG;AAAEvD,cAAAA,IAAI,EAAEsC,WAAW;AAAEK,cAAAA,IAAI,EAAEH;AAAQ,aAAC,GAAGpE;AAChE,WAAC,CAAC;AACJ,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;EAEA,OAAO;IAAE2D,MAAM;AAAEC,IAAAA;GAAO;AAC1B;;AC/RA,IAAY2B,SAAS,aAATA,SAAS,EAAA;EAATA,SAAS,CAAA,QAAA,CAAA,GAAA,sBAAA;EAATA,SAAS,CAAA,OAAA,CAAA,GAAA,qBAAA;EAATA,SAAS,CAAA,MAAA,CAAA,GAAA,oBAAA;AAAA,EAAA,OAATA,SAAS;AAAA,CAAA,CAAA,EAAA,CAAA;;ACGrB,MAAQC,MAAM,GAAYD,SAAS,CAA3BC,MAAM;EAAEC,KAAK,GAAKF,SAAS,CAAnBE,KAAK;AAEd,SAASC,eAAeA,CAACC,KAAiB,EAAU;AACzD,EAAA,MAAM/C,OAAO,GAAG+C,KAAK,CAAC/G,GAAG,CAAC,CAAC;IAAEyG,GAAG;IAAEC,IAAI;AAAEN,IAAAA;AAAQ,GAAC,KAAK;IACpD,MAAMY,QAAQ,GAAGZ,OAAO,GAAG,WAAWA,OAAO,CAAA,CAAE,GAAG,EAAE;AACpD,IAAA,OAAO,MAAMK,GAAG,CAAA,2BAAA,EAA8BC,IAAI,CAAA,EAAA,EAAKM,QAAQ,CAAA,EAAA,CAAI;AACrE,EAAA,CAAC,CAAC;EACF,OAAO,CAAA,YAAA,EAAeJ,MAAM,CAAA,QAAA,CAAU,GAAG5C,OAAO,CAAC7D,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM;AACvE;AAEO,SAAS8G,eAAeA,CAACF,KAAiB,EAAU;AACzD,EAAA,MAAMG,OAAO,GAAGH,KAAK,CAAC/G,GAAG,CAAC,CAAC;AAAE0G,IAAAA;GAAM,EAAExE,CAAC,KACpC,CAAA,qBAAA,EAAwBA,CAAC,CAAA,OAAA,EAAUwE,IAAI,IACzC,CAAC;AACD,EAAA,MAAMS,KAAK,GAAGJ,KAAK,CAAC/G,GAAG,CAAC,CAACoH,CAAC,EAAElF,CAAC,KAAK,CAAA,SAAA,EAAYA,CAAC,UAAU,CAAC;AAC1D,EAAA,MAAM8B,OAAO,GAAG+C,KAAK,CAAC/G,GAAG,CAAC,CAAC;IAAEyG,GAAG;IAAEL,OAAO;AAAEI,IAAAA;GAAW,EAAEtE,CAAC,KAAK;IAC5D,MAAM8E,QAAQ,GAAGZ,OAAO,GAAG,WAAWA,OAAO,CAAA,CAAE,GAAG,EAAE;IACpD,MAAMiB,UAAU,GAAGb,SAAS,GAAG,sBAAsBtE,CAAC,CAAA,OAAA,CAAS,GAAG,EAAE;IACpE,OAAO,CAAA,GAAA,EAAMuE,GAAG,CAAA,yBAAA,EAA4BvE,CAAC,WAAWmF,UAAU,CAAA,EAAGL,QAAQ,CAAA,EAAA,CAAI;AACnF,EAAA,CAAC,CAAC;EACF,OAAOE,OAAO,CAAC/G,IAAI,CAAC,IAAI,CAAC,GACrB,CAAA,gBAAA,EAAmByG,MAAM,CAAA,QAAA,CAAU,GAAG5C,OAAO,CAAC7D,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,GAClE,CAAA,gCAAA,EAAmCgH,KAAK,CAAChH,IAAI,CAAC,IAAI,CAAC,CAAA,EAAA,CAAI;AAC7D;AAEO,SAASmH,gBAAgBA,CAACtC,KAAa,EAAU;EACtD,OAAO,CAAA,YAAA,EAAe6B,KAAK,CAAA,KAAA,EAAQvF,IAAI,CAACC,SAAS,CAACyD,KAAK,CAAC,CAAA,CAAA,CAAG;AAC7D;;AC1BA,SAASuC,YAAYA,CAACC,IAAY,EAAEC,MAAc,EAAU;AAC1D,EAAA,IAAID,IAAI,CAACpE,QAAQ,CAAC,CAAA,CAAA,EAAIqE,MAAM,GAAG,CAAC,IAAID,IAAI,CAACpE,QAAQ,CAAC,CAAA,CAAA,EAAIqE,MAAM,GAAG,CAAC,EAAE,OAAOD,IAAI;AAC7E,EAAA,OAAO,CAAA,QAAA,EAAWC,MAAM,CAAA,IAAA,CAAM,GAAGD,IAAI;AACvC;AAEA,SAASE,gBAAgBA,CAACC,EAAU,EAAEC,IAAY,EAAU;AAC1D,EAAA,MAAMC,OAAO,GAAGF,EAAE,CAAChH,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAACT,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;EACpD,MAAM4H,SAAS,GAAGF,IAAI,CAAC1H,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;EAC1C,IAAI2H,OAAO,CAACE,UAAU,CAACD,SAAS,GAAG,GAAG,CAAC,EAAE;IACvC,OAAOD,OAAO,CAACxF,KAAK,CAACyF,SAAS,CAACjG,MAAM,GAAG,CAAC,CAAC;AAC5C,EAAA;AACA,EAAA,OAAOgG,OAAO,CAAC3H,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACpC;AAEA,SAAS8H,oBAAoBA,CAACC,KAAa,EAAEL,IAAY,EAAU;AACjE,EAAA,MAAMM,UAAU,GAAGD,KAAK,CAACtH,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAACT,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AAC1D,EAAA,MAAMiI,QAAQ,GAAGC,eAAU,CAACF,UAAU,CAAC,GAAGA,UAAU,GAAGG,YAAO,CAACT,IAAI,EAAEM,UAAU,CAAC;AAChF,EAAA,OAAOR,gBAAgB,CAACS,QAAQ,EAAEP,IAAI,CAAC;AACzC;AAEA,SAASU,iBAAiBA,CAAC7B,GAAW,EAAEmB,IAAY,EAAU;EAC5D,MAAMW,QAAQ,GAAG9B,GAAG,CAAC9F,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAACT,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAACA,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;EAC1E,OAAOwH,gBAAgB,CAACW,YAAO,CAACT,IAAI,EAAEW,QAAQ,CAAC,EAAEX,IAAI,CAAC;AACxD;AAEA,SAASY,mBAAmBA,CAACC,KAAc,EAAEb,IAAY,EAAY;AACnE,EAAA,MAAMc,MAAM,GACV,OAAOD,KAAK,KAAK,QAAQ,GACrB,CAACA,KAAK,CAAC,GACPE,KAAK,CAACC,OAAO,CAACH,KAAK,CAAC,GAClBA,KAAK,GACLA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,GAChCpC,MAAM,CAACqC,MAAM,CAACD,KAAgC,CAAC,GAC/C,EAAE;AACZ,EAAA,OAAOC,MAAM,CACVG,MAAM,CAAEZ,KAAK,IAAsB,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAACA,KAAK,CAACtH,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAACmI,QAAQ,CAAC,OAAO,CAAC,CAAC,CACvG9I,GAAG,CAACiI,KAAK,IAAID,oBAAoB,CAACC,KAAK,EAAEL,IAAI,CAAC,CAAC;AACpD;AASe,SAASmB,UAAUA,CAACC,GAA4B,GAAG,EAAE,EAAY;AAC9E,EAAA,MAAMC,GAAG,GAAGD,GAAG,CAACC,GAAG,IAAI,OAAO;AAC9B,EAAA,MAAMnJ,UAAU,GAAGkJ,GAAG,CAAClJ,UAAU,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;EAC/D,MAAMoJ,WAAW,GAAG,wBAAwB;EAC5C,MAAMC,WAAW,GAAG,wBAAwB;AAC5C,EAAA,MAAMC,mBAAmB,GAAG,IAAI,GAAGF,WAAW;AAC9C,EAAA,MAAMG,mBAAmB,GAAG,IAAI,GAAGF,WAAW;AAE9C,EAAA,IAAIvB,IAAY;EAChB,IAAI0B,UAAU,GAAG,KAAK;AACtB,EAAA,IAAIC,WAAW,GAAG,IAAIC,GAAG,EAAU;AACnC,EAAA,IAAIC,WAAW,GAAG,IAAID,GAAG,EAAU;AAEnC,EAAA,OAAO,CAAC;AACNxG,IAAAA,IAAI,EAAE,aAAa;AACnB0G,IAAAA,OAAO,EAAE,KAAK;IACdC,cAAcA,CAACC,MAAM,EAAE;MACrBhC,IAAI,GAAGgC,MAAM,CAAChC,IAAI;MAClB0B,UAAU,GAAGO,OAAO,CAACD,MAAM,CAACE,KAAK,CAACC,GAAG,CAAC;AACtCR,MAAAA,WAAW,GAAG,IAAIC,GAAG,EAAE;AACvBC,MAAAA,WAAW,GAAG,IAAID,GAAG,EAAE;MAEvB,IAAI,OAAOI,MAAM,CAACE,KAAK,CAACC,GAAG,KAAK,QAAQ,EAAE;AACxCN,QAAAA,WAAW,CAACO,GAAG,CAAChC,oBAAoB,CAAC4B,MAAM,CAACE,KAAK,CAACC,GAAG,EAAEnC,IAAI,CAAC,CAAC;AAC/D,MAAA,CAAC,MAAM,IAAIgC,MAAM,CAACE,KAAK,CAACC,GAAG,EAAE;AAC3BN,QAAAA,WAAW,GAAG,IAAID,GAAG,CAAChB,mBAAmB,CAACoB,MAAM,CAACE,KAAK,CAACG,aAAa,CAACxB,KAAK,EAAEb,IAAI,CAAC,CAAC;AACpF,MAAA,CAAC,MAAM;QACL,MAAMsC,QAAQ,GAAGN,MAAM,CAACE,KAAK,CAACK,GAAG,IAAI,OAAOP,MAAM,CAACE,KAAK,CAACK,GAAG,KAAK,QAAQ,GACrEP,MAAM,CAACE,KAAK,CAACK,GAAG,CAAClC,KAAK,GACtB7G,SAAS;QACbmI,WAAW,GAAG,IAAIC,GAAG,CAAChB,mBAAmB,CAAC,CAACoB,MAAM,CAACE,KAAK,CAACM,eAAe,IAAIR,MAAM,CAACE,KAAK,CAACG,aAAa,EAAExB,KAAK,IAAIyB,QAAQ,EAAEtC,IAAI,CAAC,CAAC;AAClI,MAAA;IACF,CAAC;IAEDyC,eAAeA,CAACC,MAAM,EAAE;MACtB,MAAMC,aAAa,GAAGD,MAAM,CAACC,aAAa,CAACC,IAAI,CAACF,MAAM,CAAC;AACvDA,MAAAA,MAAM,CAACC,aAAa,GAAG,CAAC9D,GAAG,EAAEgE,IAAI,KAAK;QACpChB,WAAW,CAACO,GAAG,CAAC1B,iBAAiB,CAAC7B,GAAG,EAAEmB,IAAI,CAAC,CAAC;AAC7C,QAAA,OAAO2C,aAAa,CAAC9D,GAAG,EAAEgE,IAAI,CAAC;MACjC,CAAC;IACH,CAAC;IAEDC,SAASA,CAAC/C,EAAE,EAAE;AACZ,MAAA,IAAIA,EAAE,KAAKuB,WAAW,EAAE,OAAO;AAAEvB,QAAAA,EAAE,EAAEyB,mBAAmB;AAAEuB,QAAAA,iBAAiB,EAAE;OAAM;AACnF,MAAA,IAAIhD,EAAE,KAAKwB,WAAW,EAAE,OAAO;AAAExB,QAAAA,EAAE,EAAE0B,mBAAmB;AAAEsB,QAAAA,iBAAiB,EAAE;OAAM;IACrF,CAAC;IAEDC,IAAIA,CAACjD,EAAE,EAAE;MACP,IAAIA,EAAE,KAAKyB,mBAAmB,EAAE;AAC9B,QAAA,MAAM1E,MAAM,GAAG2D,YAAO,CAACT,IAAI,EAAEqB,GAAG,CAAC;AACjC,QAAA,MAAA4B,QAAA,GAA0BpG,OAAO,CAACC,MAAM,EAAEkD,IAAI,EAAE,EAAE,EAAExG,SAAS,EAAEtB,UAAU,CAAC;UAAlEiF,MAAM,GAAA8F,QAAA,CAAN9F,MAAM;UAAEC,KAAK,GAAA6F,QAAA,CAAL7F,KAAK;AACrB,QAAA,OAAO8B,eAAe,CAAC/B,MAAM,CAAC,IAAIC,KAAK,CAACnD,MAAM,GAAG,IAAI,GAAGyF,gBAAgB,CAACtC,KAAK,CAAC,GAAG,EAAE,CAAC;AACvF,MAAA;MACA,IAAI2C,EAAE,KAAK0B,mBAAmB,EAAE;AAC9B,QAAA,MAAM3E,MAAM,GAAG2D,YAAO,CAACT,IAAI,EAAEqB,GAAG,CAAC;AACjC,QAAA,MAAA6B,SAAA,GAA0BrG,OAAO,CAACC,MAAM,EAAEkD,IAAI,EAAE,EAAE,EAAExG,SAAS,EAAEtB,UAAU,CAAC;UAAlEiF,MAAM,GAAA+F,SAAA,CAAN/F,MAAM;UAAEC,KAAK,GAAA8F,SAAA,CAAL9F,KAAK;AACrB,QAAA,OAAOiC,eAAe,CAAClC,MAAM,CAAC,IAAIC,KAAK,CAACnD,MAAM,GAAG,IAAI,GAAGyF,gBAAgB,CAACtC,KAAK,CAAC,GAAG,EAAE,CAAC;AACvF,MAAA;IACF,CAAC;AAID+F,IAAAA,SAASA,CAACvD,IAAI,EAAEG,EAAE,EAAE;AAClB,MAAA,MAAMqD,OAAO,GAAGtD,gBAAgB,CAACC,EAAE,EAAEC,IAAI,CAAC;AAC1C,MAAA,IAAI6B,WAAW,CAACwB,GAAG,CAACD,OAAO,CAAC,EAAE;AAC5B,QAAA,OAAOzD,YAAY,CAACC,IAAI,EAAE2B,WAAW,CAAC;AACxC,MAAA;MACA,IAAI,CAACG,UAAU,IAAIC,WAAW,CAAC0B,GAAG,CAACD,OAAO,CAAC,EAAE;AAC3C,QAAA,OAAOzD,YAAY,CAACC,IAAI,EAAE0B,WAAW,CAAC;AACxC,MAAA;IACF,CAAC;AAEDgC,IAAAA,kBAAkB,EAAE;AAClBxH,MAAAA,KAAK,EAAE,KAAK;MACZyH,OAAOA,CAACC,IAAI,EAAE;QACZ,IAAI9B,UAAU,IAAI8B,IAAI,CAAChI,QAAQ,CAAC8F,WAAW,CAAC,EAAE;AAC9C,QAAA,OAAO,CAAC;AACNmC,UAAAA,GAAG,EAAE,QAAQ;AACbC,UAAAA,KAAK,EAAE;AAAEC,YAAAA,IAAI,EAAE;WAAU;UACzB3F,QAAQ,EAAE,CAAA,QAAA,EAAWsD,WAAW,CAAA,EAAA,CAAI;AACpCsC,UAAAA,QAAQ,EAAE;AACZ,SAAC,CAAC;AACJ,MAAA;AACF;AACF,GAAC,CAAC;AACJ;;;;"}
|
package/dist/plugin.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { join, resolve } from 'path';
|
|
1
|
+
import { join, resolve, isAbsolute } from 'path';
|
|
2
2
|
import { readdirSync, readFileSync } from 'fs';
|
|
3
3
|
import matter from 'gray-matter';
|
|
4
4
|
|
|
@@ -129,6 +129,21 @@ function hasDefaultExport(filePath) {
|
|
|
129
129
|
return false;
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
|
+
function hasLayoutExport(filePath) {
|
|
133
|
+
try {
|
|
134
|
+
const ext = filePath.split('.').pop()?.toLowerCase();
|
|
135
|
+
if (ext === 'md' || ext === 'mdx') {
|
|
136
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
137
|
+
const _matter3 = matter(content),
|
|
138
|
+
data = _matter3.data;
|
|
139
|
+
return !!data.layout;
|
|
140
|
+
}
|
|
141
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
142
|
+
return /export\s+(?:const\s+layout\b|\{[^}]*\blayout\b[^}]*\})/.test(content);
|
|
143
|
+
} catch {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
132
147
|
function parseEntry(name, fileRe) {
|
|
133
148
|
const dirMatch = name.match(RE_DIR);
|
|
134
149
|
const isDir = !name.includes('.');
|
|
@@ -167,7 +182,7 @@ function sortEntries(entries, fileRe) {
|
|
|
167
182
|
return a.name.localeCompare(b.name);
|
|
168
183
|
});
|
|
169
184
|
}
|
|
170
|
-
function scanDir(absDir, basePath = absDir, parentPath = '',
|
|
185
|
+
function scanDir(absDir, basePath = absDir, parentPath = '', parentMenu, extensions = DEFAULT_EXTENSIONS, nearestRef = {}) {
|
|
171
186
|
const routes = [];
|
|
172
187
|
const menus = [];
|
|
173
188
|
let entries;
|
|
@@ -189,15 +204,20 @@ function scanDir(absDir, basePath = absDir, parentPath = '', menuRef, extensions
|
|
|
189
204
|
if (!parsed) continue;
|
|
190
205
|
const pathPart = parsed.pathPart,
|
|
191
206
|
menuName = parsed.menuName;
|
|
207
|
+
const handledName = menuName || pathPart;
|
|
192
208
|
if (ent.isDirectory()) {
|
|
193
209
|
const urlPath = buildUrl(parentPath, pathPart);
|
|
194
210
|
const menu = {
|
|
195
211
|
name: menuName || pathPart,
|
|
196
212
|
hasComponent: false,
|
|
213
|
+
path: urlPath,
|
|
197
214
|
children: []
|
|
198
215
|
};
|
|
199
|
-
const child = scanDir(full, basePath, urlPath, menu, extensions);
|
|
216
|
+
const child = scanDir(full, basePath, urlPath, menu, extensions, nearestRef);
|
|
200
217
|
routes.push(...child.routes);
|
|
218
|
+
if (menu.nearestFile && parentMenu && !parentMenu.nearestFile) {
|
|
219
|
+
parentMenu.nearestFile = menu.nearestFile;
|
|
220
|
+
}
|
|
201
221
|
menu.children = child.menus;
|
|
202
222
|
menus.push(menu);
|
|
203
223
|
} else if (ent.isFile()) {
|
|
@@ -208,6 +228,7 @@ function scanDir(absDir, basePath = absDir, parentPath = '', menuRef, extensions
|
|
|
208
228
|
const metaRaw = metaResult?.raw;
|
|
209
229
|
const meta = metaResult?.value && Object.keys(metaResult.value).length > 0 ? metaResult.value : undefined;
|
|
210
230
|
const hasComp = hasDefaultExport(full);
|
|
231
|
+
const hasLayout = hasLayoutExport(full);
|
|
211
232
|
if (isIndex) {
|
|
212
233
|
const url = parentPath || '/';
|
|
213
234
|
if (hasComp) {
|
|
@@ -215,23 +236,32 @@ function scanDir(absDir, basePath = absDir, parentPath = '', menuRef, extensions
|
|
|
215
236
|
url,
|
|
216
237
|
file: relFile,
|
|
217
238
|
menuName,
|
|
218
|
-
metaRaw
|
|
239
|
+
metaRaw,
|
|
240
|
+
hasLayout
|
|
219
241
|
});
|
|
220
242
|
}
|
|
221
|
-
if (
|
|
222
|
-
if (menuName)
|
|
243
|
+
if (parentMenu) {
|
|
244
|
+
if (menuName) parentMenu.name = menuName;
|
|
223
245
|
if (hasComp) {
|
|
224
|
-
|
|
225
|
-
|
|
246
|
+
parentMenu.path = url;
|
|
247
|
+
parentMenu.hasComponent = true;
|
|
248
|
+
parentMenu.nearestFile = {
|
|
249
|
+
name: handledName,
|
|
250
|
+
path: url
|
|
251
|
+
};
|
|
226
252
|
}
|
|
227
|
-
if (meta)
|
|
253
|
+
if (meta) parentMenu.meta = meta;
|
|
228
254
|
} else if (menuName) {
|
|
229
255
|
menus.push({
|
|
230
256
|
name: menuName,
|
|
231
257
|
path: hasComp ? '/' : undefined,
|
|
232
258
|
hasComponent: hasComp,
|
|
233
259
|
children: [],
|
|
234
|
-
meta
|
|
260
|
+
meta,
|
|
261
|
+
nearestFile: hasComp ? {
|
|
262
|
+
name: menuName,
|
|
263
|
+
path: '/'
|
|
264
|
+
} : undefined
|
|
235
265
|
});
|
|
236
266
|
}
|
|
237
267
|
} else {
|
|
@@ -240,15 +270,26 @@ function scanDir(absDir, basePath = absDir, parentPath = '', menuRef, extensions
|
|
|
240
270
|
url: urlPath,
|
|
241
271
|
file: relFile,
|
|
242
272
|
menuName,
|
|
243
|
-
metaRaw
|
|
273
|
+
metaRaw,
|
|
274
|
+
hasLayout
|
|
244
275
|
});
|
|
276
|
+
if (parentMenu && !parentMenu.nearestFile) {
|
|
277
|
+
parentMenu.nearestFile = {
|
|
278
|
+
name: handledName,
|
|
279
|
+
path: urlPath
|
|
280
|
+
};
|
|
281
|
+
}
|
|
245
282
|
}
|
|
246
283
|
if (menuName || meta) {
|
|
247
284
|
menus.push({
|
|
248
285
|
name: menuName || pathPart,
|
|
249
286
|
path: hasComp ? urlPath : undefined,
|
|
250
287
|
hasComponent: hasComp,
|
|
251
|
-
meta
|
|
288
|
+
meta,
|
|
289
|
+
nearestFile: hasComp ? {
|
|
290
|
+
name: handledName,
|
|
291
|
+
path: urlPath
|
|
292
|
+
} : undefined
|
|
252
293
|
});
|
|
253
294
|
}
|
|
254
295
|
}
|
|
@@ -287,10 +328,12 @@ function generateSsgInit(items) {
|
|
|
287
328
|
const names = items.map((_, i) => `__module_${i}.default`);
|
|
288
329
|
const entries = items.map(({
|
|
289
330
|
url,
|
|
290
|
-
metaRaw
|
|
331
|
+
metaRaw,
|
|
332
|
+
hasLayout
|
|
291
333
|
}, i) => {
|
|
292
334
|
const metaPart = metaRaw ? `, meta: ${metaRaw}` : '';
|
|
293
|
-
|
|
335
|
+
const layoutPart = hasLayout ? `, layout: __module_${i}.layout` : '';
|
|
336
|
+
return ` '${url}': { component: __module_${i}.default${layoutPart}${metaPart} }`;
|
|
294
337
|
});
|
|
295
338
|
return imports.join('\n') + `\n\nglobalThis['${Routes}'] = {\n` + entries.join(',\n') + '\n};' + `\nexport const __bobe_routes = [${names.join(', ')}];`;
|
|
296
339
|
}
|
|
@@ -298,36 +341,113 @@ function generateCsrMenus(menus) {
|
|
|
298
341
|
return `globalThis['${Menus}'] = ${JSON.stringify(menus)};`;
|
|
299
342
|
}
|
|
300
343
|
|
|
344
|
+
function injectImport(code, source) {
|
|
345
|
+
if (code.includes(`'${source}'`) || code.includes(`"${source}"`)) return code;
|
|
346
|
+
return `import '${source}';\n` + code;
|
|
347
|
+
}
|
|
348
|
+
function normalizeEntryId(id, root) {
|
|
349
|
+
const cleanId = id.split('?')[0].replace(/\\/g, '/');
|
|
350
|
+
const cleanRoot = root.replace(/\\/g, '/');
|
|
351
|
+
if (cleanId.startsWith(cleanRoot + '/')) {
|
|
352
|
+
return cleanId.slice(cleanRoot.length + 1);
|
|
353
|
+
}
|
|
354
|
+
return cleanId.replace(/^\/+/, '');
|
|
355
|
+
}
|
|
356
|
+
function normalizeConfigEntry(entry, root) {
|
|
357
|
+
const cleanEntry = entry.split('?')[0].replace(/\\/g, '/');
|
|
358
|
+
const absEntry = isAbsolute(cleanEntry) ? cleanEntry : resolve(root, cleanEntry);
|
|
359
|
+
return normalizeEntryId(absEntry, root);
|
|
360
|
+
}
|
|
361
|
+
function normalizeUrlEntry(url, root) {
|
|
362
|
+
const cleanUrl = url.split('?')[0].replace(/\\/g, '/').replace(/^\/+/, '');
|
|
363
|
+
return normalizeEntryId(resolve(root, cleanUrl), root);
|
|
364
|
+
}
|
|
365
|
+
function collectInputEntries(input, root) {
|
|
366
|
+
const values = typeof input === 'string' ? [input] : Array.isArray(input) ? input : input && typeof input === 'object' ? Object.values(input) : [];
|
|
367
|
+
return values.filter(entry => typeof entry === 'string' && !entry.split('?')[0].endsWith('.html')).map(entry => normalizeConfigEntry(entry, root));
|
|
368
|
+
}
|
|
301
369
|
function bobeRouter(opt = {}) {
|
|
302
370
|
const dir = opt.dir || 'pages';
|
|
303
371
|
const extensions = opt.extensions || ['js', 'jsx', 'ts', 'tsx'];
|
|
372
|
+
const csrRoutesId = 'bobe-router/csr-routes';
|
|
373
|
+
const ssgRoutesId = 'bobe-router/ssg-routes';
|
|
374
|
+
const resolvedCsrRoutesId = '\0' + csrRoutesId;
|
|
375
|
+
const resolvedSsgRoutesId = '\0' + ssgRoutesId;
|
|
304
376
|
let root;
|
|
377
|
+
let isSsrBuild = false;
|
|
378
|
+
let csrEntryIds = new Set();
|
|
379
|
+
let ssgEntryIds = new Set();
|
|
305
380
|
return [{
|
|
306
381
|
name: 'bobe-router',
|
|
307
382
|
enforce: 'pre',
|
|
308
383
|
configResolved(config) {
|
|
309
384
|
root = config.root;
|
|
385
|
+
isSsrBuild = Boolean(config.build.ssr);
|
|
386
|
+
csrEntryIds = new Set();
|
|
387
|
+
ssgEntryIds = new Set();
|
|
388
|
+
if (typeof config.build.ssr === 'string') {
|
|
389
|
+
ssgEntryIds.add(normalizeConfigEntry(config.build.ssr, root));
|
|
390
|
+
} else if (config.build.ssr) {
|
|
391
|
+
ssgEntryIds = new Set(collectInputEntries(config.build.rollupOptions.input, root));
|
|
392
|
+
} else {
|
|
393
|
+
const libEntry = config.build.lib && typeof config.build.lib === 'object' ? config.build.lib.entry : undefined;
|
|
394
|
+
csrEntryIds = new Set(collectInputEntries((config.build.rolldownOptions ?? config.build.rollupOptions).input || libEntry, root));
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
configureServer(server) {
|
|
398
|
+
const ssrLoadModule = server.ssrLoadModule.bind(server);
|
|
399
|
+
server.ssrLoadModule = (url, opts) => {
|
|
400
|
+
ssgEntryIds.add(normalizeUrlEntry(url, root));
|
|
401
|
+
return ssrLoadModule(url, opts);
|
|
402
|
+
};
|
|
310
403
|
},
|
|
311
404
|
resolveId(id) {
|
|
312
|
-
if (id ===
|
|
405
|
+
if (id === csrRoutesId) return {
|
|
406
|
+
id: resolvedCsrRoutesId,
|
|
407
|
+
moduleSideEffects: true
|
|
408
|
+
};
|
|
409
|
+
if (id === ssgRoutesId) return {
|
|
410
|
+
id: resolvedSsgRoutesId,
|
|
411
|
+
moduleSideEffects: true
|
|
412
|
+
};
|
|
313
413
|
},
|
|
314
414
|
load(id) {
|
|
315
|
-
if (id ===
|
|
415
|
+
if (id === resolvedCsrRoutesId) {
|
|
316
416
|
const absDir = resolve(root, dir);
|
|
317
417
|
const _scanDir = scanDir(absDir, root, '', undefined, extensions),
|
|
318
418
|
routes = _scanDir.routes,
|
|
319
419
|
menus = _scanDir.menus;
|
|
320
420
|
return generateCsrInit(routes) + (menus.length ? '\n' + generateCsrMenus(menus) : '');
|
|
321
421
|
}
|
|
322
|
-
|
|
323
|
-
transform(code, id) {
|
|
324
|
-
if (id.includes('entry-server.ts')) {
|
|
422
|
+
if (id === resolvedSsgRoutesId) {
|
|
325
423
|
const absDir = resolve(root, dir);
|
|
326
424
|
const _scanDir2 = scanDir(absDir, root, '', undefined, extensions),
|
|
327
425
|
routes = _scanDir2.routes,
|
|
328
426
|
menus = _scanDir2.menus;
|
|
329
|
-
|
|
330
|
-
|
|
427
|
+
return generateSsgInit(routes) + (menus.length ? '\n' + generateCsrMenus(menus) : '');
|
|
428
|
+
}
|
|
429
|
+
},
|
|
430
|
+
transform(code, id) {
|
|
431
|
+
const entryId = normalizeEntryId(id, root);
|
|
432
|
+
if (ssgEntryIds.has(entryId)) {
|
|
433
|
+
return injectImport(code, ssgRoutesId);
|
|
434
|
+
}
|
|
435
|
+
if (!isSsrBuild && csrEntryIds.has(entryId)) {
|
|
436
|
+
return injectImport(code, csrRoutesId);
|
|
437
|
+
}
|
|
438
|
+
},
|
|
439
|
+
transformIndexHtml: {
|
|
440
|
+
order: 'pre',
|
|
441
|
+
handler(html) {
|
|
442
|
+
if (isSsrBuild || html.includes(csrRoutesId)) return;
|
|
443
|
+
return [{
|
|
444
|
+
tag: 'script',
|
|
445
|
+
attrs: {
|
|
446
|
+
type: 'module'
|
|
447
|
+
},
|
|
448
|
+
children: `import '${csrRoutesId}';`,
|
|
449
|
+
injectTo: 'head-prepend'
|
|
450
|
+
}];
|
|
331
451
|
}
|
|
332
452
|
}
|
|
333
453
|
}];
|
package/dist/plugin.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin/scan.ts","../src/global.ts","../src/plugin/generate.ts","../src/plugin/index.ts"],"sourcesContent":["import { Menu } from '#/type';\nimport { Dirent, readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport matter from 'gray-matter';\n\nexport interface ScanItem {\n url: string;\n file: string;\n menuName?: string;\n /** routeMeta 对象字面量源文(用于嵌入生成代码) */\n metaRaw?: string;\n}\n\nconst RE_DIR = /^(?:(\\d+)_)?([^_]+?)(?:_(.+?))?$/;\n\nconst DEFAULT_EXTENSIONS = ['js', 'jsx', 'ts', 'tsx'];\n\nfunction buildFileRegex(extensions: string[]): RegExp {\n const exts = extensions.map(e => e.replace(/^\\./, '')).join('|');\n return new RegExp(`^(?:(\\\\d+)_)?([^_]+?)(?:_(.*))?\\\\.(${exts})$`);\n}\n\nfunction buildUrl(base: string, part: string): string {\n return (base === '/' ? '' : base) + '/' + part.replace(/\\./g, '/');\n}\n\n/**\n * 从页面文件源文中提取 `export const routeMeta = {...}`。\n * 返回 { raw: 源文, value: 求值后的对象 },无导出时返回 undefined。\n */\nfunction extractRouteMeta(filePath: string): { raw: string; value: Record<string, any> } | undefined {\n try {\n const ext = filePath.split('.').pop()?.toLowerCase();\n\n // .md/.mdx:解析 YAML frontmatter 中的 meta 字段\n if (ext === 'md' || ext === 'mdx') {\n const content = readFileSync(filePath, 'utf-8');\n const { data } = matter(content);\n if (!data.meta || typeof data.meta !== 'object') return undefined;\n const meta = data.meta as Record<string, any>;\n return { raw: JSON.stringify(meta), value: meta };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n // 匹配 export const routeMeta(兼容 TS 类型标注 `: SomeType`)\n const metaExportRe = /export\\s+const\\s+routeMeta(\\s*:\\s*[\\w.]+(?:\\s*<[^>]*>)?)?\\s*=\\s*/;\n const match = content.match(metaExportRe);\n if (!match) return undefined;\n\n const startIdx = match.index! + match[0].length;\n let braceDepth = 0;\n let inString = false;\n let stringChar: string | null = null;\n let endIdx = startIdx;\n\n for (let i = startIdx; i < content.length; i++) {\n const ch = content[i];\n const prev = i > 0 ? content[i - 1] : '';\n\n // 字符串状态跟踪,避免字符串内的括号干扰\n if (!inString && (ch === '\"' || ch === \"'\" || ch === '`')) {\n inString = true;\n stringChar = ch;\n } else if (inString && ch === stringChar && prev !== '\\\\') {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (ch === '{') braceDepth++;\n else if (ch === '}') {\n braceDepth--;\n if (braceDepth === 0) {\n endIdx = i + 1;\n break;\n }\n }\n }\n }\n\n const raw = content.slice(startIdx, endIdx).trim();\n if (!raw) return undefined;\n\n // 尝试求值为 JS 对象(用于 Menu)\n let value: Record<string, any> | undefined;\n try {\n value = new Function('return ' + raw)() as Record<string, any>;\n } catch {\n // 求值失败(如 import 引用),Menu 无 meta 但仍返回 raw 用于嵌入路由表\n }\n\n return { raw, value: value || {} };\n } catch {\n return undefined;\n }\n}\n\n/**\n * 检测文件是否有 default 导出(即有组件),还是仅导出 routeMeta。\n * .ts/.js: 检查是否有 `export default`\n * .md/.mdx: 检查 frontmatter 之后是否有实际 markdown 内容\n */\nfunction hasDefaultExport(filePath: string): boolean {\n try {\n const ext = filePath.split('.').pop()?.toLowerCase();\n\n if (ext === 'md' || ext === 'mdx') {\n const content = readFileSync(filePath, 'utf-8');\n const { content: mdContent } = matter(content);\n return mdContent.trim().length > 0;\n }\n\n // .ts/.js/.tsx/.jsx:检查 export default\n const content = readFileSync(filePath, 'utf-8');\n return /export\\s+default\\s/.test(content);\n } catch {\n return false;\n }\n}\n\nfunction parseEntry(name: string, fileRe: RegExp): { order: number; pathPart: string; menuName?: string } | null {\n const dirMatch = name.match(RE_DIR);\n const isDir = !name.includes('.');\n\n if (isDir && dirMatch) {\n const [, orderStr, pathPart, menuName] = dirMatch;\n return { order: orderStr ? parseInt(orderStr, 10) : Infinity, pathPart, menuName };\n }\n\n const fileMatch = name.match(fileRe);\n if (fileMatch) {\n const [, orderStr, pathPart, menuName] = fileMatch;\n return { order: orderStr ? parseInt(orderStr, 10) : Infinity, pathPart, menuName };\n }\n\n return null;\n}\n\nfunction sortEntries(entries: Dirent[], fileRe: RegExp): Dirent[] {\n return entries.sort((a, b) => {\n const pa = parseEntry(a.name, fileRe);\n const pb = parseEntry(b.name, fileRe);\n const oa = pa?.order ?? Infinity;\n const ob = pb?.order ?? Infinity;\n if (oa !== ob) return oa - ob;\n return a.name.localeCompare(b.name);\n });\n}\n\nexport function scanDir(\n absDir: string,\n basePath = absDir,\n parentPath = '',\n menuRef?: Menu,\n extensions: string[] = DEFAULT_EXTENSIONS\n): { routes: ScanItem[]; menus: Menu[] } {\n const routes: ScanItem[] = [];\n const menus: Menu[] = [];\n let entries: Dirent[];\n const fileRe = buildFileRegex(extensions);\n\n try {\n entries = readdirSync(absDir, { withFileTypes: true });\n } catch {\n return { routes, menus };\n }\n\n entries = sortEntries(entries, fileRe);\n\n for (const ent of entries) {\n const full = join(absDir, ent.name);\n const parsed = parseEntry(ent.name, fileRe);\n if (!parsed) continue;\n\n const { pathPart, menuName } = parsed;\n\n if (ent.isDirectory()) {\n const urlPath = buildUrl(parentPath, pathPart);\n const menu: Menu = {\n name: menuName || pathPart,\n hasComponent: false,\n children: []\n };\n const child = scanDir(full, basePath, urlPath, menu, extensions);\n routes.push(...child.routes);\n menu.children = child.menus;\n menus.push(menu);\n } else if (ent.isFile()) {\n const isIndex = pathPart === 'index';\n const relFile = '/' + full.slice(basePath.length).replace(/^[/\\\\]/, '');\n const urlPath = buildUrl(parentPath, pathPart);\n\n // 提取 routeMeta\n const metaResult = extractRouteMeta(full);\n const metaRaw = metaResult?.raw;\n const meta = metaResult?.value && Object.keys(metaResult.value).length > 0\n ? metaResult.value\n : undefined;\n\n // 检测是否有 default 导出(有组件 = 有路由页面)\n const hasComp = hasDefaultExport(full);\n\n if (isIndex) {\n const url = parentPath || '/';\n\n // 仅有 routeMeta 无 default 导出的文件不加入路由表\n if (hasComp) {\n routes.push({ url, file: relFile, menuName, metaRaw });\n }\n\n if (menuRef) {\n // 直接修改父菜单,不走 push\n if (menuName) menuRef.name = menuName;\n if (hasComp) {\n menuRef.path = url;\n menuRef.hasComponent = true;\n }\n if (meta) menuRef.meta = meta;\n } else if (menuName) {\n menus.push({ name: menuName, path: hasComp ? '/' : undefined, hasComponent: hasComp, children: [], meta });\n }\n } else {\n if (hasComp) {\n routes.push({ url: urlPath, file: relFile, menuName, metaRaw });\n }\n if (menuName || meta) {\n menus.push({ name: menuName || pathPart, path: hasComp ? urlPath : undefined, hasComponent: hasComp, meta });\n }\n }\n }\n }\n\n return { routes, menus };\n}\n","/** 通过 globalThis 传递的路由全局变量名 */\nexport enum GlobalKey {\n /** 路由表:{ [url]: { import/component } } */\n Routes = '__BOBE_INIT_ROUTES__',\n /** 菜单树:Menu[] */\n Menus = '__BOBE_INIT_MENUS__',\n /** 初始路径 */\n Path = '__BOBE_INIT_PATH__',\n}\n","import { GlobalKey } from '#/global';\nimport { Menu } from '#/type';\nimport type { ScanItem } from './scan';\n\nconst { Routes, Menus } = GlobalKey;\n\nexport function generateCsrInit(items: ScanItem[]): string {\n const entries = items.map(({ url, file, metaRaw }) => {\n const metaPart = metaRaw ? `, meta: ${metaRaw}` : '';\n return ` '${url}': { import: () => import('${file}')${metaPart} }`;\n });\n return `globalThis['${Routes}'] = {\\n` + entries.join(',\\n') + '\\n};';\n}\n\nexport function generateSsgInit(items: ScanItem[]): string {\n const imports = items.map(({ file }, i) =>\n `import * as __module_${i} from '${file}';`\n );\n const names = items.map((_, i) => `__module_${i}.default`);\n const entries = items.map(({ url, metaRaw }, i) => {\n const metaPart = metaRaw ? `, meta: ${metaRaw}` : '';\n return ` '${url}': { component: __module_${i}.default, layout: __module_${i}.layout${metaPart} }`;\n });\n return imports.join('\\n')\n + `\\n\\nglobalThis['${Routes}'] = {\\n` + entries.join(',\\n') + '\\n};'\n + `\\nexport const __bobe_routes = [${names.join(', ')}];`;\n}\n\nexport function generateCsrMenus(menus: Menu[]): string {\n return `globalThis['${Menus}'] = ${JSON.stringify(menus)};`;\n}\n","import type { Plugin } from 'vite';\nimport { resolve } from 'path';\nimport { scanDir } from './scan';\nimport { generateCsrInit, generateSsgInit, generateCsrMenus } from './generate';\n\nexport interface BobeRouterPluginOptions {\n dir?: string;\n ssg?: boolean;\n /** 可识别的文件后缀,默认 ['js', 'jsx', 'ts', 'tsx'] */\n extensions?: string[];\n}\n\nexport default function bobeRouter(opt: BobeRouterPluginOptions = {}): Plugin[] {\n const dir = opt.dir || 'pages';\n const extensions = opt.extensions || ['js', 'jsx', 'ts', 'tsx'];\n\n let root: string;\n\n return [{\n name: 'bobe-router',\n enforce: 'pre',\n configResolved(config) {\n root = config.root;\n },\n\n resolveId(id) {\n if (id === 'bobe-router/csr-routes') return '\\0bobe-router/csr-routes';\n },\n\n load(id) {\n if (id === '\\0bobe-router/csr-routes') {\n const absDir = resolve(root, dir);\n const { routes, menus } = scanDir(absDir, root, '', undefined, extensions);\n return generateCsrInit(routes) + (menus.length ? '\\n' + generateCsrMenus(menus) : '');\n }\n },\n\n // SSR routes 直接注入到 entry-server.ts,不走虚拟模块(避免 Rollup tree-shake)\n transform(code, id) {\n if (id.includes('entry-server.ts')) {\n const absDir = resolve(root, dir);\n const { routes, menus } = scanDir(absDir, root, '', undefined, extensions);\n const ssg = generateSsgInit(routes) + (menus.length ? '\\n' + generateCsrMenus(menus) : '');\n return ssg + '\\n' + code;\n }\n }\n }];\n}\n"],"names":["RE_DIR","DEFAULT_EXTENSIONS","buildFileRegex","extensions","exts","map","e","replace","join","RegExp","buildUrl","base","part","extractRouteMeta","filePath","ext","split","pop","toLowerCase","content","readFileSync","_matter","matter","data","meta","undefined","raw","JSON","stringify","value","metaExportRe","match","startIdx","index","length","braceDepth","inString","stringChar","endIdx","i","ch","prev","slice","trim","Function","hasDefaultExport","_matter2","mdContent","test","parseEntry","name","fileRe","dirMatch","isDir","includes","_dirMatch","_slicedToArray","orderStr","pathPart","menuName","order","parseInt","Infinity","fileMatch","_fileMatch","sortEntries","entries","sort","a","b","pa","pb","oa","ob","localeCompare","scanDir","absDir","basePath","parentPath","menuRef","routes","menus","readdirSync","withFileTypes","ent","full","parsed","isDirectory","urlPath","menu","hasComponent","children","child","push","isFile","isIndex","relFile","metaResult","metaRaw","Object","keys","hasComp","url","file","path","GlobalKey","Routes","Menus","generateCsrInit","items","metaPart","generateSsgInit","imports","names","_","generateCsrMenus","bobeRouter","opt","dir","root","enforce","configResolved","config","resolveId","id","load","resolve","_scanDir","transform","code","_scanDir2","ssg"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin/scan.ts","../src/global.ts","../src/plugin/generate.ts","../src/plugin/index.ts"],"sourcesContent":["import { Menu } from '#/type';\nimport { Dirent, readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport matter from 'gray-matter';\n\nexport interface ScanItem {\n url: string;\n file: string;\n menuName?: string;\n /** routeMeta 对象字面量源文(用于嵌入生成代码) */\n metaRaw?: string;\n /** 文件是否有 layout 导出 */\n hasLayout?: boolean;\n}\n\nconst RE_DIR = /^(?:(\\d+)_)?([^_]+?)(?:_(.+?))?$/;\n\nconst DEFAULT_EXTENSIONS = ['js', 'jsx', 'ts', 'tsx'];\n\nfunction buildFileRegex(extensions: string[]): RegExp {\n const exts = extensions.map(e => e.replace(/^\\./, '')).join('|');\n return new RegExp(`^(?:(\\\\d+)_)?([^_]+?)(?:_(.*))?\\\\.(${exts})$`);\n}\n\nfunction buildUrl(base: string, part: string): string {\n return (base === '/' ? '' : base) + '/' + part.replace(/\\./g, '/');\n}\n\n/**\n * 从页面文件源文中提取 `export const routeMeta = {...}`。\n * 返回 { raw: 源文, value: 求值后的对象 },无导出时返回 undefined。\n */\nfunction extractRouteMeta(filePath: string): { raw: string; value: Record<string, any> } | undefined {\n try {\n const ext = filePath.split('.').pop()?.toLowerCase();\n\n // .md/.mdx:解析 YAML frontmatter 中的 meta 字段\n if (ext === 'md' || ext === 'mdx') {\n const content = readFileSync(filePath, 'utf-8');\n const { data } = matter(content);\n if (!data.meta || typeof data.meta !== 'object') return undefined;\n const meta = data.meta as Record<string, any>;\n return { raw: JSON.stringify(meta), value: meta };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n // 匹配 export const routeMeta(兼容 TS 类型标注 `: SomeType`)\n const metaExportRe = /export\\s+const\\s+routeMeta(\\s*:\\s*[\\w.]+(?:\\s*<[^>]*>)?)?\\s*=\\s*/;\n const match = content.match(metaExportRe);\n if (!match) return undefined;\n\n const startIdx = match.index! + match[0].length;\n let braceDepth = 0;\n let inString = false;\n let stringChar: string | null = null;\n let endIdx = startIdx;\n\n for (let i = startIdx; i < content.length; i++) {\n const ch = content[i];\n const prev = i > 0 ? content[i - 1] : '';\n\n // 字符串状态跟踪,避免字符串内的括号干扰\n if (!inString && (ch === '\"' || ch === \"'\" || ch === '`')) {\n inString = true;\n stringChar = ch;\n } else if (inString && ch === stringChar && prev !== '\\\\') {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (ch === '{') braceDepth++;\n else if (ch === '}') {\n braceDepth--;\n if (braceDepth === 0) {\n endIdx = i + 1;\n break;\n }\n }\n }\n }\n\n const raw = content.slice(startIdx, endIdx).trim();\n if (!raw) return undefined;\n\n // 尝试求值为 JS 对象(用于 Menu)\n let value: Record<string, any> | undefined;\n try {\n value = new Function('return ' + raw)() as Record<string, any>;\n } catch {\n // 求值失败(如 import 引用),Menu 无 meta 但仍返回 raw 用于嵌入路由表\n }\n\n return { raw, value: value || {} };\n } catch {\n return undefined;\n }\n}\n\n/**\n * 检测文件是否有 default 导出(即有组件),还是仅导出 routeMeta。\n * .ts/.js: 检查是否有 `export default`\n * .md/.mdx: 检查 frontmatter 之后是否有实际 markdown 内容\n */\nfunction hasDefaultExport(filePath: string): boolean {\n try {\n const ext = filePath.split('.').pop()?.toLowerCase();\n\n if (ext === 'md' || ext === 'mdx') {\n const content = readFileSync(filePath, 'utf-8');\n const { content: mdContent } = matter(content);\n return mdContent.trim().length > 0;\n }\n\n // .ts/.js/.tsx/.jsx:检查 export default\n const content = readFileSync(filePath, 'utf-8');\n return /export\\s+default\\s/.test(content);\n } catch {\n return false;\n }\n}\n\n/**\n * 检测文件是否有 layout 导出。\n * .md/.mdx: 检查 frontmatter 中是否有 layout 字段(markdown 插件会据此生成 export)\n * .ts/.js: 检查是否有 `export const layout` 或 `export { ... layout ... }`\n */\nfunction hasLayoutExport(filePath: string): boolean {\n try {\n const ext = filePath.split('.').pop()?.toLowerCase();\n\n if (ext === 'md' || ext === 'mdx') {\n const content = readFileSync(filePath, 'utf-8');\n const { data } = matter(content);\n return !!data.layout;\n }\n\n const content = readFileSync(filePath, 'utf-8');\n // 匹配: export const layout = ... 或 export { layout } 或 export { xxx as layout }\n return /export\\s+(?:const\\s+layout\\b|\\{[^}]*\\blayout\\b[^}]*\\})/.test(content);\n } catch {\n return false;\n }\n}\n\nfunction parseEntry(name: string, fileRe: RegExp): { order: number; pathPart: string; menuName?: string } | null {\n const dirMatch = name.match(RE_DIR);\n const isDir = !name.includes('.');\n\n if (isDir && dirMatch) {\n const [, orderStr, pathPart, menuName] = dirMatch;\n return { order: orderStr ? parseInt(orderStr, 10) : Infinity, pathPart, menuName };\n }\n\n const fileMatch = name.match(fileRe);\n if (fileMatch) {\n const [, orderStr, pathPart, menuName] = fileMatch;\n return { order: orderStr ? parseInt(orderStr, 10) : Infinity, pathPart, menuName };\n }\n\n return null;\n}\n\nfunction sortEntries(entries: Dirent[], fileRe: RegExp): Dirent[] {\n return entries.sort((a, b) => {\n const pa = parseEntry(a.name, fileRe);\n const pb = parseEntry(b.name, fileRe);\n const oa = pa?.order ?? Infinity;\n const ob = pb?.order ?? Infinity;\n if (oa !== ob) return oa - ob;\n return a.name.localeCompare(b.name);\n });\n}\n\nexport function scanDir(\n absDir: string,\n basePath = absDir,\n parentPath = '',\n parentMenu?: Menu,\n extensions: string[] = DEFAULT_EXTENSIONS,\n nearestRef: { value?: { name: string; path: string } } = {}\n): { routes: ScanItem[]; menus: Menu[] } {\n const routes: ScanItem[] = [];\n const menus: Menu[] = [];\n let entries: Dirent[];\n const fileRe = buildFileRegex(extensions);\n\n try {\n entries = readdirSync(absDir, { withFileTypes: true });\n } catch {\n return { routes, menus };\n }\n\n entries = sortEntries(entries, fileRe);\n\n for (const ent of entries) {\n const full = join(absDir, ent.name);\n const parsed = parseEntry(ent.name, fileRe);\n if (!parsed) continue;\n\n const { pathPart, menuName } = parsed;\n const handledName = menuName || pathPart;\n\n if (ent.isDirectory()) {\n const urlPath = buildUrl(parentPath, pathPart);\n const menu: Menu = {\n name: menuName || pathPart,\n hasComponent: false,\n path: urlPath,\n children: []\n };\n const child = scanDir(full, basePath, urlPath, menu, extensions, nearestRef);\n routes.push(...child.routes);\n // 自身有, 父级还没有就给父级赋值\n if (menu.nearestFile && parentMenu && !parentMenu.nearestFile) {\n parentMenu.nearestFile = menu.nearestFile;\n }\n\n menu.children = child.menus;\n menus.push(menu);\n } else if (ent.isFile()) {\n const isIndex = pathPart === 'index';\n const relFile = '/' + full.slice(basePath.length).replace(/^[/\\\\]/, '');\n const urlPath = buildUrl(parentPath, pathPart);\n\n // 提取 routeMeta\n const metaResult = extractRouteMeta(full);\n const metaRaw = metaResult?.raw;\n const meta = metaResult?.value && Object.keys(metaResult.value).length > 0 ? metaResult.value : undefined;\n\n // 检测是否有 default 导出(有组件 = 有路由页面)\n const hasComp = hasDefaultExport(full);\n\n // 检测是否有 layout 导出\n const hasLayout = hasLayoutExport(full);\n\n if (isIndex) {\n const url = parentPath || '/';\n\n // 仅有 routeMeta 无 default 导出的文件不加入路由表\n if (hasComp) {\n routes.push({ url, file: relFile, menuName, metaRaw, hasLayout });\n }\n\n if (parentMenu) {\n // 直接修改父菜单,不走 push\n if (menuName) parentMenu.name = menuName;\n if (hasComp) {\n parentMenu.path = url;\n parentMenu.hasComponent = true;\n parentMenu.nearestFile = { name: handledName, path: url };\n }\n if (meta) parentMenu.meta = meta;\n }\n // 首页\n else if (menuName) {\n menus.push({\n name: menuName,\n path: hasComp ? '/' : undefined,\n hasComponent: hasComp,\n children: [],\n meta,\n nearestFile: hasComp ? { name: menuName, path: '/' } : undefined\n });\n }\n }\n // 非 index\n else {\n if (hasComp) {\n routes.push({ url: urlPath, file: relFile, menuName, metaRaw, hasLayout });\n if (parentMenu && !parentMenu.nearestFile) {\n parentMenu.nearestFile = { name: handledName, path: urlPath };\n }\n }\n if (menuName || meta) {\n menus.push({\n name: menuName || pathPart,\n path: hasComp ? urlPath : undefined,\n hasComponent: hasComp,\n meta,\n nearestFile: hasComp ? { name: handledName, path: urlPath } : undefined\n });\n }\n }\n }\n }\n\n return { routes, menus };\n}\n","/** 通过 globalThis 传递的路由全局变量名 */\nexport enum GlobalKey {\n /** 路由表:{ [url]: { import/component } } */\n Routes = '__BOBE_INIT_ROUTES__',\n /** 菜单树:Menu[] */\n Menus = '__BOBE_INIT_MENUS__',\n /** 初始路径 */\n Path = '__BOBE_INIT_PATH__',\n}\n","import { GlobalKey } from '#/global';\nimport { Menu } from '#/type';\nimport type { ScanItem } from './scan';\n\nconst { Routes, Menus } = GlobalKey;\n\nexport function generateCsrInit(items: ScanItem[]): string {\n const entries = items.map(({ url, file, metaRaw }) => {\n const metaPart = metaRaw ? `, meta: ${metaRaw}` : '';\n return ` '${url}': { import: () => import('${file}')${metaPart} }`;\n });\n return `globalThis['${Routes}'] = {\\n` + entries.join(',\\n') + '\\n};';\n}\n\nexport function generateSsgInit(items: ScanItem[]): string {\n const imports = items.map(({ file }, i) =>\n `import * as __module_${i} from '${file}';`\n );\n const names = items.map((_, i) => `__module_${i}.default`);\n const entries = items.map(({ url, metaRaw, hasLayout }, i) => {\n const metaPart = metaRaw ? `, meta: ${metaRaw}` : '';\n const layoutPart = hasLayout ? `, layout: __module_${i}.layout` : '';\n return ` '${url}': { component: __module_${i}.default${layoutPart}${metaPart} }`;\n });\n return imports.join('\\n')\n + `\\n\\nglobalThis['${Routes}'] = {\\n` + entries.join(',\\n') + '\\n};'\n + `\\nexport const __bobe_routes = [${names.join(', ')}];`;\n}\n\nexport function generateCsrMenus(menus: Menu[]): string {\n return `globalThis['${Menus}'] = ${JSON.stringify(menus)};`;\n}\n","import type { Plugin } from 'vite';\nimport { isAbsolute, resolve } from 'path';\nimport { scanDir } from './scan';\nimport { generateCsrInit, generateSsgInit, generateCsrMenus } from './generate';\n\nfunction injectImport(code: string, source: string): string {\n if (code.includes(`'${source}'`) || code.includes(`\"${source}\"`)) return code;\n return `import '${source}';\\n` + code;\n}\n\nfunction normalizeEntryId(id: string, root: string): string {\n const cleanId = id.split('?')[0].replace(/\\\\/g, '/');\n const cleanRoot = root.replace(/\\\\/g, '/');\n if (cleanId.startsWith(cleanRoot + '/')) {\n return cleanId.slice(cleanRoot.length + 1);\n }\n return cleanId.replace(/^\\/+/, '');\n}\n\nfunction normalizeConfigEntry(entry: string, root: string): string {\n const cleanEntry = entry.split('?')[0].replace(/\\\\/g, '/');\n const absEntry = isAbsolute(cleanEntry) ? cleanEntry : resolve(root, cleanEntry);\n return normalizeEntryId(absEntry, root);\n}\n\nfunction normalizeUrlEntry(url: string, root: string): string {\n const cleanUrl = url.split('?')[0].replace(/\\\\/g, '/').replace(/^\\/+/, '');\n return normalizeEntryId(resolve(root, cleanUrl), root);\n}\n\nfunction collectInputEntries(input: unknown, root: string): string[] {\n const values =\n typeof input === 'string'\n ? [input]\n : Array.isArray(input)\n ? input\n : input && typeof input === 'object'\n ? Object.values(input as Record<string, unknown>)\n : [];\n return values\n .filter((entry): entry is string => typeof entry === 'string' && !entry.split('?')[0].endsWith('.html'))\n .map(entry => normalizeConfigEntry(entry, root));\n}\n\nexport interface BobeRouterPluginOptions {\n dir?: string;\n ssg?: boolean;\n /** 可识别的文件后缀,默认 ['js', 'jsx', 'ts', 'tsx'] */\n extensions?: string[];\n}\n\nexport default function bobeRouter(opt: BobeRouterPluginOptions = {}): Plugin[] {\n const dir = opt.dir || 'pages';\n const extensions = opt.extensions || ['js', 'jsx', 'ts', 'tsx'];\n const csrRoutesId = 'bobe-router/csr-routes';\n const ssgRoutesId = 'bobe-router/ssg-routes';\n const resolvedCsrRoutesId = '\\0' + csrRoutesId;\n const resolvedSsgRoutesId = '\\0' + ssgRoutesId;\n\n let root: string;\n let isSsrBuild = false;\n let csrEntryIds = new Set<string>();\n let ssgEntryIds = new Set<string>();\n\n return [{\n name: 'bobe-router',\n enforce: 'pre',\n configResolved(config) {\n root = config.root;\n isSsrBuild = Boolean(config.build.ssr);\n csrEntryIds = new Set();\n ssgEntryIds = new Set();\n\n if (typeof config.build.ssr === 'string') {\n ssgEntryIds.add(normalizeConfigEntry(config.build.ssr, root));\n } else if (config.build.ssr) {\n ssgEntryIds = new Set(collectInputEntries(config.build.rollupOptions.input, root));\n } else {\n const libEntry = config.build.lib && typeof config.build.lib === 'object'\n ? config.build.lib.entry\n : undefined;\n csrEntryIds = new Set(collectInputEntries((config.build.rolldownOptions ?? config.build.rollupOptions).input || libEntry, root));\n }\n },\n\n configureServer(server) {\n const ssrLoadModule = server.ssrLoadModule.bind(server);\n server.ssrLoadModule = (url, opts) => {\n ssgEntryIds.add(normalizeUrlEntry(url, root));\n return ssrLoadModule(url, opts);\n };\n },\n\n resolveId(id) {\n if (id === csrRoutesId) return { id: resolvedCsrRoutesId, moduleSideEffects: true };\n if (id === ssgRoutesId) return { id: resolvedSsgRoutesId, moduleSideEffects: true };\n },\n\n load(id) {\n if (id === resolvedCsrRoutesId) {\n const absDir = resolve(root, dir);\n const { routes, menus } = scanDir(absDir, root, '', undefined, extensions);\n return generateCsrInit(routes) + (menus.length ? '\\n' + generateCsrMenus(menus) : '');\n }\n if (id === resolvedSsgRoutesId) {\n const absDir = resolve(root, dir);\n const { routes, menus } = scanDir(absDir, root, '', undefined, extensions);\n return generateSsgInit(routes) + (menus.length ? '\\n' + generateCsrMenus(menus) : '');\n }\n },\n\n // SSR 使用 build.ssr / rollupOptions.input 定位入口;CSR HTML 入口走 transformIndexHtml。\n // 显式 JS input 的 CSR build 会在这里注入 csr-routes。\n transform(code, id) {\n const entryId = normalizeEntryId(id, root);\n if (ssgEntryIds.has(entryId)) {\n return injectImport(code, ssgRoutesId);\n }\n if (!isSsrBuild && csrEntryIds.has(entryId)) {\n return injectImport(code, csrRoutesId);\n }\n },\n\n transformIndexHtml: {\n order: 'pre',\n handler(html) {\n if (isSsrBuild || html.includes(csrRoutesId)) return;\n return [{\n tag: 'script',\n attrs: { type: 'module' },\n children: `import '${csrRoutesId}';`,\n injectTo: 'head-prepend',\n }];\n }\n }\n }];\n}\n"],"names":["RE_DIR","DEFAULT_EXTENSIONS","buildFileRegex","extensions","exts","map","e","replace","join","RegExp","buildUrl","base","part","extractRouteMeta","filePath","ext","split","pop","toLowerCase","content","readFileSync","_matter","matter","data","meta","undefined","raw","JSON","stringify","value","metaExportRe","match","startIdx","index","length","braceDepth","inString","stringChar","endIdx","i","ch","prev","slice","trim","Function","hasDefaultExport","_matter2","mdContent","test","hasLayoutExport","_matter3","layout","parseEntry","name","fileRe","dirMatch","isDir","includes","_dirMatch","_slicedToArray","orderStr","pathPart","menuName","order","parseInt","Infinity","fileMatch","_fileMatch","sortEntries","entries","sort","a","b","pa","pb","oa","ob","localeCompare","scanDir","absDir","basePath","parentPath","parentMenu","nearestRef","routes","menus","readdirSync","withFileTypes","ent","full","parsed","handledName","isDirectory","urlPath","menu","hasComponent","path","children","child","push","nearestFile","isFile","isIndex","relFile","metaResult","metaRaw","Object","keys","hasComp","hasLayout","url","file","GlobalKey","Routes","Menus","generateCsrInit","items","metaPart","generateSsgInit","imports","names","_","layoutPart","generateCsrMenus","injectImport","code","source","normalizeEntryId","id","root","cleanId","cleanRoot","startsWith","normalizeConfigEntry","entry","cleanEntry","absEntry","isAbsolute","resolve","normalizeUrlEntry","cleanUrl","collectInputEntries","input","values","Array","isArray","filter","endsWith","bobeRouter","opt","dir","csrRoutesId","ssgRoutesId","resolvedCsrRoutesId","resolvedSsgRoutesId","isSsrBuild","csrEntryIds","Set","ssgEntryIds","enforce","configResolved","config","Boolean","build","ssr","add","rollupOptions","libEntry","lib","rolldownOptions","configureServer","server","ssrLoadModule","bind","opts","resolveId","moduleSideEffects","load","_scanDir","_scanDir2","transform","entryId","has","transformIndexHtml","handler","html","tag","attrs","type","injectTo"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bobe-router",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.69",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"main": "dist/bobe-router.cjs
|
|
5
|
+
"main": "dist/bobe-router.cjs",
|
|
6
6
|
"module": "dist/bobe-router.esm.js",
|
|
7
7
|
"browser": "dist/bobe-router.umd.js",
|
|
8
8
|
"types": "dist/index.d.ts",
|
|
9
9
|
"private": false,
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"gray-matter": "^4.0.3",
|
|
12
|
-
"aoye": "0.0.
|
|
12
|
+
"aoye": "0.0.69"
|
|
13
13
|
},
|
|
14
14
|
"exports": {
|
|
15
15
|
".": {
|
|
16
16
|
"types": "./dist/index.d.ts",
|
|
17
17
|
"import": "./dist/bobe-router.esm.js",
|
|
18
|
-
"require": "./dist/bobe-router.cjs
|
|
18
|
+
"require": "./dist/bobe-router.cjs"
|
|
19
19
|
},
|
|
20
20
|
"./plugin": {
|
|
21
21
|
"types": "./dist/plugin.d.ts",
|
|
22
22
|
"import": "./dist/plugin.esm.js",
|
|
23
|
-
"require": "./dist/plugin.cjs
|
|
23
|
+
"require": "./dist/plugin.cjs"
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"files": [
|