UNPKG

@lorcan-store/vue-auto-router

Version:

A Vite plugin for auto-generating Vue router configuration with smart naming conventions and custom templates

156 lines 4.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const generator_1 = require("./generator"); /** * Vue 路由自动生成插件 * @param options 插件配置选项 * @returns Vite 插件 */ function VueAutoRouter(options = {}) { const generator = new generator_1.RouteGenerator(options); let server; let isWatcherEnabled = false; // 消息模板 const messages = { EN: { routesRegenerated: (dir) => `🔄 Routes regenerated due to changes in ${dir} directory`, regenerateError: (dir) => `Failed to regenerate routes for ${dir}:`, routesGenerated: '🚀 Routes generated successfully', configureError: 'Failed to configure server:', buildGenerated: '🚀 Routes generated for production build', buildError: 'Failed to generate routes during build:' }, CN: { routesRegenerated: (dir) => `🔄 已重新生成 ${dir} 目录的路由`, regenerateError: (dir) => `重新生成 ${dir} 的路由失败:`, routesGenerated: '🚀 路由生成成功', configureError: '配置服务器失败:', buildGenerated: '🚀 已为生产构建生成路由', buildError: '构建时生成路由失败:' } }; const msg = messages[options.language || 'EN']; /** * 获取目录名称 * @param file 文件路径 * @returns 目录名称或 null */ function getDirectoryName(file) { // 标准化路径 const normalizedFile = file.replace(/\\/g, '/'); // 检查是否是 .vue 文件 if (!normalizedFile.endsWith('.vue')) { return null; } // 获取扫描目录的基础路径 const scanDir = (options.scanDir || 'src/pages').replace(/\\/g, '/'); const scanDirBase = scanDir.split('/').pop() || 'pages'; // 匹配目录名 const pattern = new RegExp(`${scanDirBase}/([^/]+)`); const match = normalizedFile.match(pattern); if (!match) return null; return match[1]; } /** * 处理文件变化 * @param file 变化的文件路径 */ async function handleFileChange(file) { const dirName = getDirectoryName(file); if (!dirName) return; // 检查是否在排除列表中 if (options.exclude?.includes(dirName)) { return; } try { await generator.generate(); console.log(msg.routesRegenerated(dirName)); server?.ws.send({ type: 'custom', event: 'vue-auto-router:update', data: { file: file.replace(/\\/g, '/'), directory: dirName, timestamp: Date.now() } }); } catch (error) { console.error(msg.regenerateError(dirName), error); } } /** * 启用文件监听 */ function enableWatcher() { if (!server || isWatcherEnabled) return; server.watcher.on('add', handleFileChange); server.watcher.on('unlink', handleFileChange); server.watcher.on('change', handleFileChange); isWatcherEnabled = true; } /** * 禁用文件监听 */ function disableWatcher() { if (!server || !isWatcherEnabled) return; server.watcher.off('add', handleFileChange); server.watcher.off('unlink', handleFileChange); server.watcher.off('change', handleFileChange); isWatcherEnabled = false; } return { name: 'vue-auto-router', /** * 配置开发服务器 */ async configureServer(_server) { server = _server; try { await generator.generate(); console.log(msg.routesGenerated); enableWatcher(); } catch (error) { console.error(msg.configureError, error); throw error; } }, /** * 构建开始时生成路由 */ async buildStart() { try { await generator.generate(); console.log(msg.buildGenerated); } catch (error) { console.error(msg.buildError, error); throw error; } }, /** * 构建结束时清理 */ buildEnd() { disableWatcher(); server = undefined; }, /** * 关闭时清理 */ closeBundle() { disableWatcher(); server = undefined; } }; } // 修改导出方式 module.exports = VueAutoRouter; module.exports.default = VueAutoRouter; exports.default = VueAutoRouter; //# sourceMappingURL=index.js.map