@4399ywkf/core 5.0.0 → 5.0.2

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/cli/index.js CHANGED
@@ -2157,7 +2157,7 @@ async function build(options = {}) {
2157
2157
 
2158
2158
  // src/cli/index.ts
2159
2159
  var program = new Command();
2160
- program.name("ywkf").description("4399\u8FD0\u7EF4\u5BA2\u670D\u524D\u7AEF\u6846\u67B6 CLI").version("1.0.0");
2160
+ program.name("ywkf").description("4399\u8FD0\u7EF4\u5F00\u53D1\u524D\u7AEF\u6846\u67B6 CLI").version("1.0.0");
2161
2161
  program.command("dev").description("\u542F\u52A8\u5F00\u53D1\u670D\u52A1\u5668").option("-p, --port <port>", "\u6307\u5B9A\u7AEF\u53E3\u53F7").option("-h, --host <host>", "\u6307\u5B9A\u4E3B\u673A").action(async (options) => {
2162
2162
  if (options.port) {
2163
2163
  process.env.APP_PORT = options.port;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/dev.ts","../../src/config/loader.ts","../../src/config/schema.ts","../../src/rspack/index.ts","../../src/rspack/dev.ts","../../src/rspack/base.ts","../../src/generator/plugin.ts","../../src/generator/generator.ts","../../src/router/generator.ts","../../src/generator/templates/entry.ts","../../src/generator/templates/bootstrap.ts","../../src/generator/templates/env-types.ts","../../src/generator/templates/route-types.ts","../../src/rspack/prod.ts","../../src/cli/env.ts","../../src/plugin/manager.ts","../../src/cli/build.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { dev } from \"./dev.js\";\nimport { build } from \"./build.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"ywkf\")\n .description(\"4399运维客服前端框架 CLI\")\n .version(\"1.0.0\");\n\nprogram\n .command(\"dev\")\n .description(\"启动开发服务器\")\n .option(\"-p, --port <port>\", \"指定端口号\")\n .option(\"-h, --host <host>\", \"指定主机\")\n .action(async (options) => {\n // 通过环境变量传递 CLI 参数\n if (options.port) {\n process.env.APP_PORT = options.port;\n }\n if (options.host) {\n process.env.APP_HOST = options.host;\n }\n\n await dev({ cwd: process.cwd() });\n });\n\nprogram\n .command(\"build\")\n .description(\"构建生产环境\")\n .option(\"--analyze\", \"启用构建分析\")\n .action(async (options) => {\n if (options.analyze) {\n process.env.RSDOCTOR = \"true\";\n }\n\n await build({ cwd: process.cwd() });\n });\n\nprogram\n .command(\"start\")\n .description(\"启动生产服务器(需要先执行 build)\")\n .action(() => {\n console.log(chalk.yellow(\"⚠️ start 命令暂未实现,请使用 nginx 或其他静态服务器\"));\n });\n\n// 解析命令行参数\nprogram.parse();\n","import { rspack } from \"@rspack/core\";\nimport { RspackDevServer } from \"@rspack/dev-server\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { resolveConfig } from \"../config/loader.js\";\nimport { createRspackConfig } from \"../rspack/index.js\";\nimport { preloadEnv, loadEnv } from \"./env.js\";\nimport { PluginManager } from \"../plugin/manager.js\";\n\n/**\n * 启动开发服务器\n */\nexport async function dev(options: { cwd?: string } = {}): Promise<void> {\n const cwd = options.cwd || process.cwd();\n const spinner = ora(\"正在启动开发服务器...\").start();\n\n try {\n // 1. 预加载环境变量(在配置解析之前)\n preloadEnv(cwd, \"development\");\n\n // 2. 加载配置\n const { config, configPath } = await resolveConfig(cwd);\n\n if (configPath) {\n spinner.text = `已加载配置: ${configPath}`;\n }\n\n // 3. 完整加载环境变量\n loadEnv(config, cwd, \"development\");\n\n // 3. 加载插件\n const pluginManager = new PluginManager(config, cwd, true);\n if (config.plugins && config.plugins.length > 0) {\n spinner.text = \"加载插件...\";\n await pluginManager.loadPlugins(config.plugins);\n }\n\n // 4. 执行 beforeDevServer 钩子\n await pluginManager.runBeforeDevServer();\n\n // 5. 创建 Rspack 配置\n let rspackConfig = createRspackConfig(config, cwd, { isDev: true });\n\n // 6. 应用插件的 rspack 配置修改\n rspackConfig = await pluginManager.applyRspackConfigHooks(rspackConfig);\n\n // 7. 创建编译器\n const compiler = rspack(rspackConfig);\n\n // 8. 创建开发服务器\n const devServerOptions = rspackConfig.devServer || {};\n const server = new RspackDevServer(devServerOptions, compiler);\n\n // 9. 启动服务器\n const host = config.dev.host || \"localhost\";\n const port = config.dev.port || 3000;\n\n await server.start();\n\n // 10. 执行 afterDevServer 钩子\n await pluginManager.runAfterDevServer({ host, port });\n\n spinner.succeed(chalk.green(\"开发服务器启动成功!\"));\n console.log();\n console.log(\n ` ${chalk.bold(\"Local:\")} ${chalk.cyan(`http://${host}:${port}`)}`\n );\n \n const pluginNames = pluginManager.getPluginNames();\n if (pluginNames.length > 0) {\n console.log(` ${chalk.bold(\"插件:\")} ${chalk.dim(pluginNames.join(\", \"))}`);\n }\n console.log();\n\n // 监听退出信号\n const signals: NodeJS.Signals[] = [\"SIGINT\", \"SIGTERM\"];\n for (const signal of signals) {\n process.on(signal, async () => {\n await server.stop();\n process.exit(0);\n });\n }\n } catch (error) {\n spinner.fail(chalk.red(\"开发服务器启动失败\"));\n console.error(error);\n process.exit(1);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve, extname } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport deepmerge from \"deepmerge\";\nimport { defaultConfig, type YwkfConfig } from \"./schema.js\";\n\n/** 支持的配置文件名 */\nconst CONFIG_FILES = [\n \"ywkf.config.ts\",\n \"ywkf.config.mts\",\n \"ywkf.config.js\",\n \"ywkf.config.mjs\",\n];\n\n/**\n * 查找配置文件\n */\nexport function findConfigFile(cwd: string): string | null {\n for (const file of CONFIG_FILES) {\n const configPath = resolve(cwd, file);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n return null;\n}\n\n/**\n * 加载 TypeScript 配置文件\n */\nasync function loadTsConfig(configPath: string): Promise<YwkfConfig> {\n const jiti = (await import(\"jiti\")).default;\n const loader = jiti(configPath, {\n interopDefault: true,\n });\n\n const config = loader(configPath);\n return config.default || config;\n}\n\n/**\n * 加载 JavaScript 配置文件\n */\nasync function loadJsConfig(configPath: string): Promise<YwkfConfig> {\n const fileUrl = pathToFileURL(configPath).href;\n const module = await import(fileUrl);\n return module.default || module;\n}\n\n/**\n * 加载配置文件\n */\nexport async function loadConfigFile(configPath: string): Promise<YwkfConfig> {\n const ext = extname(configPath);\n\n if (ext === \".ts\" || ext === \".mts\") {\n return loadTsConfig(configPath);\n }\n\n return loadJsConfig(configPath);\n}\n\n/**\n * 合并配置\n */\nexport function mergeConfig(\n userConfig: YwkfConfig,\n baseConfig: YwkfConfig = defaultConfig\n): Required<YwkfConfig> {\n return deepmerge(baseConfig, userConfig, {\n arrayMerge: (_, sourceArray) => sourceArray,\n }) as Required<YwkfConfig>;\n}\n\n/**\n * 解析并加载完整配置\n * @param cwd 工作目录\n * @returns 合并后的完整配置\n */\nexport async function resolveConfig(cwd: string): Promise<{\n config: Required<YwkfConfig>;\n configPath: string | null;\n}> {\n const configPath = findConfigFile(cwd);\n\n if (!configPath) {\n console.warn(\n \"⚠️ 未找到配置文件 (ywkf.config.ts),使用默认配置\"\n );\n return {\n config: defaultConfig as Required<YwkfConfig>,\n configPath: null,\n };\n }\n\n try {\n const userConfig = await loadConfigFile(configPath);\n const config = mergeConfig(userConfig);\n\n return { config, configPath };\n } catch (error) {\n console.error(\"❌ 配置文件加载失败:\", error);\n throw error;\n }\n}\n\n/**\n * 获取应用路径解析器\n */\nexport function createPathResolver(cwd: string) {\n return {\n resolveApp: (relativePath: string) => resolve(cwd, relativePath),\n cwd,\n };\n}\n","import type { Configuration as RspackConfig } from \"@rspack/core\";\nimport type { PluginConfig } from \"../plugin/types.js\";\n\n/**\n * 开发服务器配置\n */\nexport interface DevServerConfig {\n /** 开发服务器端口 */\n port?: number;\n /** 开发服务器主机 */\n host?: string;\n /** 代理配置 */\n proxy?: Record<string, string | object>;\n /** 是否开启 HTTPS */\n https?: boolean;\n}\n\n/**\n * 输出配置\n */\nexport interface OutputConfig {\n /** 输出目录 */\n path?: string;\n /** 公共路径 */\n publicPath?: string;\n /** 是否清理输出目录 */\n clean?: boolean;\n}\n\n/**\n * HTML 配置\n */\nexport interface HtmlConfig {\n /** 页面标题 */\n title?: string;\n /** HTML 模板路径 */\n template?: string;\n /** favicon 路径 */\n favicon?: string;\n /** 挂载根元素 ID */\n mountRoot?: string;\n}\n\n/**\n * 样式配置\n */\nexport interface StyleConfig {\n /** 是否启用 CSS Modules */\n cssModules?: boolean;\n /** Less 配置 */\n less?: {\n /** 是否启用 */\n enabled?: boolean;\n /** Less 选项 */\n lessOptions?: Record<string, unknown>;\n };\n /** Sass 配置 */\n sass?: {\n /** 是否启用 */\n enabled?: boolean;\n /** Sass 选项 */\n sassOptions?: Record<string, unknown>;\n };\n /** 是否启用 TailwindCSS */\n tailwindcss?: boolean;\n}\n\n/**\n * 路由配置\n */\nexport interface RouterConfig {\n /** 路由基础路径 */\n basename?: string;\n /** 是否启用约定式路由 */\n conventional?: boolean;\n /** 约定式路由扫描目录 */\n pagesDir?: string;\n /** 排除的文件/目录模式 */\n exclude?: (string | RegExp)[];\n}\n\n/**\n * 微前端配置\n */\nexport interface MicroFrontendConfig {\n /** 是否启用微前端模式 */\n enabled?: boolean;\n /** 应用名称(用于 UMD 导出) */\n name?: string;\n /** 微前端框架类型 */\n framework?: \"qiankun\" | \"garfish\";\n}\n\n/**\n * 性能配置\n */\nexport interface PerformanceConfig {\n /** 是否启用 Rsdoctor 分析 */\n rsdoctor?: boolean;\n /** 是否开启代码分割 */\n splitChunks?: boolean;\n /** 是否移除 console */\n dropConsole?: boolean;\n}\n\n/**\n * 工具链配置\n */\nexport interface ToolsConfig {\n /**\n * 自定义 Rspack 配置\n * @param config 当前配置\n * @param context 上下文信息\n * @returns 修改后的配置\n */\n rspack?: (\n config: RspackConfig,\n context: { isDev: boolean; isProd: boolean }\n ) => RspackConfig | void;\n}\n\n/**\n * 环境变量配置\n */\nexport interface EnvConfig {\n /** 公共环境变量文件路径 */\n publicEnvFile?: string;\n /** 环境特定的变量文件目录 */\n envDir?: string;\n}\n\n/**\n * 框架完整配置\n */\nexport interface YwkfConfig {\n /** 应用名称 */\n appName?: string;\n /** 应用中文名 */\n appCName?: string;\n /** 开发服务器配置 */\n dev?: DevServerConfig;\n /** 输出配置 */\n output?: OutputConfig;\n /** HTML 配置 */\n html?: HtmlConfig;\n /** 样式配置 */\n style?: StyleConfig;\n /** 路由配置 */\n router?: RouterConfig;\n /** 微前端配置 */\n microFrontend?: MicroFrontendConfig;\n /** 性能配置 */\n performance?: PerformanceConfig;\n /** 工具链配置 */\n tools?: ToolsConfig;\n /** 环境变量配置 */\n env?: EnvConfig;\n /** 路径别名 */\n alias?: Record<string, string>;\n /** 插件列表 */\n plugins?: PluginConfig[];\n}\n\n/**\n * 定义配置的辅助函数(提供类型提示)\n */\nexport function defineConfig(config: YwkfConfig): YwkfConfig {\n return config;\n}\n\n/**\n * 默认配置\n */\nexport const defaultConfig: Required<YwkfConfig> = {\n appName: \"app\",\n appCName: \"应用\",\n dev: {\n port: 3000,\n host: \"localhost\",\n proxy: {},\n https: false,\n },\n output: {\n path: \"dist\",\n publicPath: \"/\",\n clean: true,\n },\n html: {\n title: \"应用\",\n template: \"public/index.html\",\n favicon: \"public/favicon.ico\",\n mountRoot: \"root\",\n },\n style: {\n cssModules: true,\n less: { enabled: true, lessOptions: { javascriptEnabled: true } },\n sass: { enabled: true, sassOptions: {} },\n tailwindcss: true,\n },\n router: {\n basename: \"/\",\n conventional: false,\n pagesDir: \"src/pages\",\n exclude: [\n /\\/components?\\//,\n /\\/models\\//,\n /\\/utils?\\//,\n /^_/,\n /\\.d\\.ts$/,\n /\\.(test|spec|e2e)\\.(ts|tsx|js|jsx)$/,\n ],\n },\n microFrontend: {\n enabled: false,\n name: \"app\",\n framework: \"qiankun\",\n },\n performance: {\n rsdoctor: false,\n splitChunks: true,\n dropConsole: false,\n },\n tools: {},\n env: {\n publicEnvFile: \"config/env/.env.public\",\n envDir: \"config/env\",\n },\n alias: {},\n plugins: [],\n};\n","import type { Configuration } from \"@rspack/core\";\nimport { RsdoctorRspackPlugin } from \"@rsdoctor/rspack-plugin\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport { createDevConfig } from \"./dev.js\";\nimport { createProdConfig } from \"./prod.js\";\n\nexport { createBaseConfig } from \"./base.js\";\nexport { createDevConfig } from \"./dev.js\";\nexport { createProdConfig } from \"./prod.js\";\n\n/**\n * 根据环境创建 Rspack 配置\n */\nexport function createRspackConfig(\n config: Required<YwkfConfig>,\n cwd: string,\n options: { isDev?: boolean } = {}\n): Configuration {\n const isDev = options.isDev ?? process.env.NODE_ENV !== \"production\";\n\n let rspackConfig = isDev\n ? createDevConfig(config, cwd)\n : createProdConfig(config, cwd);\n\n // Rsdoctor 性能分析\n if (config.performance.rsdoctor) {\n rspackConfig.plugins = [\n ...(rspackConfig.plugins || []),\n new RsdoctorRspackPlugin({}),\n ];\n }\n\n // 用户自定义配置\n if (config.tools.rspack) {\n const userConfig = config.tools.rspack(rspackConfig, {\n isDev,\n isProd: !isDev,\n });\n\n if (userConfig) {\n rspackConfig = userConfig;\n }\n }\n\n return rspackConfig;\n}\n","import { rspack, type Configuration } from \"@rspack/core\";\nimport { merge } from \"webpack-merge\";\nimport { join } from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport { createBaseConfig } from \"./base.js\";\n\nconst require = createRequire(import.meta.url);\n\n/**\n * 将 proxy 对象格式转换为数组格式\n * webpack-dev-server v4+ 需要数组格式\n */\nfunction convertProxyToArray(\n proxy?: Record<string, string | object>\n): { context: string; target: string; changeOrigin?: boolean; secure?: boolean }[] | undefined {\n if (!proxy || Object.keys(proxy).length === 0) {\n return undefined;\n }\n\n return Object.entries(proxy).map(([context, target]) => {\n if (typeof target === \"string\") {\n return {\n context: [context],\n target,\n changeOrigin: true,\n secure: false,\n } as unknown as { context: string; target: string };\n }\n return {\n context: [context],\n changeOrigin: true,\n secure: false,\n ...(target as object),\n } as unknown as { context: string; target: string };\n });\n}\n\n/**\n * 创建开发环境 Rspack 配置\n */\nexport function createDevConfig(\n config: Required<YwkfConfig>,\n cwd: string\n): Configuration {\n const baseConfig = createBaseConfig(config, cwd);\n const { resolveApp } = createPathResolver(cwd);\n const { dev, style } = config;\n\n const styleRules: Configuration[\"module\"] = {\n rules: [\n // Less - antd\n {\n test: /\\.less$/,\n include: [\n /[\\\\/]node_modules[\\\\/].*antd/,\n /[\\\\/]node_modules[\\\\/]@4399ywkf[\\\\/]design/,\n ],\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n strictMath: false,\n math: \"always\",\n javascriptEnabled: true,\n },\n },\n },\n ],\n },\n // Less - 项目文件\n ...(style.less?.enabled !== false\n ? [\n {\n test: /\\.less$/,\n include: [resolveApp(\"src\")],\n exclude: [resolveApp(\"node_modules\")],\n oneOf: [\n {\n test: /\\.module\\.less$/,\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: {\n sourceMap: true,\n modules: {\n localIdentName:\n \"[path][name]__[local]--[hash:base64:5]\",\n },\n importLoaders: 2,\n },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n javascriptEnabled: true,\n math: \"always\",\n ...style.less?.lessOptions,\n },\n },\n },\n ],\n },\n {\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n javascriptEnabled: true,\n ...style.less?.lessOptions,\n },\n },\n },\n ],\n },\n ],\n },\n ]\n : []),\n // Sass\n ...(style.sass?.enabled !== false\n ? [\n {\n test: /\\.s[ac]ss$/i,\n include: [resolveApp(\"src\")],\n exclude: [resolveApp(\"node_modules\")],\n oneOf: [\n {\n test: /\\.module\\.s[ac]ss$/,\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: {\n sourceMap: true,\n modules: {\n localIdentName:\n \"[path][name]__[local]--[hash:base64:5]\",\n },\n importLoaders: 2,\n },\n },\n {\n loader: \"sass-loader\",\n options: {\n sourceMap: true,\n sassOptions: {\n outputStyle: \"compressed\",\n ...style.sass?.sassOptions,\n },\n },\n },\n ],\n },\n {\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"sass-loader\",\n options: {\n sourceMap: true,\n sassOptions: {\n outputStyle: \"compressed\",\n ...style.sass?.sassOptions,\n },\n },\n },\n ],\n },\n ],\n },\n ]\n : []),\n // TailwindCSS\n ...(style.tailwindcss\n ? [\n {\n test: /\\.css$/,\n include: [resolveApp(\"src/index.css\")],\n use: [\n \"style-loader\",\n \"css-loader\",\n {\n loader: \"postcss-loader\",\n options: {\n postcssOptions: {\n config: resolveApp(\"postcss.config.js\"),\n },\n },\n },\n ],\n },\n ]\n : []),\n // 其他 CSS\n {\n test: /\\.css$/,\n include: [resolveApp(\"src\"), resolveApp(\"node_modules\")],\n exclude: style.tailwindcss ? [resolveApp(\"src/index.css\")] : [],\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n ],\n },\n ],\n };\n\n const devConfig: Configuration = {\n mode: \"development\",\n devtool: \"inline-source-map\",\n\n output: {\n filename: \"[name].bundle.js\",\n clean: false,\n },\n\n stats: \"errors-only\",\n\n devServer: {\n host: dev.host,\n port: dev.port,\n compress: true,\n historyApiFallback: true,\n hot: true,\n allowedHosts: \"all\",\n client: {\n overlay: false,\n progress: true,\n },\n proxy: convertProxyToArray(dev.proxy),\n },\n\n module: styleRules,\n };\n\n return merge(baseConfig, devConfig);\n}\n","import { rspack, type Configuration } from \"@rspack/core\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport { YwkfGeneratorPlugin } from \"../generator/plugin.js\";\n\nconst require = createRequire(import.meta.url);\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst coreNodeModules = join(__dirname, \"../../node_modules\");\n\n/**\n * 创建基础 Rspack 配置\n */\nexport function createBaseConfig(\n config: Required<YwkfConfig>,\n cwd: string\n): Configuration {\n const { resolveApp } = createPathResolver(cwd);\n\n const {\n appName,\n appCName,\n output,\n html,\n alias: userAlias,\n microFrontend,\n router,\n } = config;\n\n // 约定式路由输出目录\n const ywkfOutputDir = resolveApp(\".ywkf\");\n\n const defaultAlias: Record<string, string> = {\n \"@\": resolveApp(\"src\"),\n \"@config\": resolveApp(\"config\"),\n \"@store\": resolveApp(\"store\"),\n \"@locales\": resolveApp(\"locales\"),\n \"@public\": resolveApp(\"public\"),\n // 约定式路由生成的文件\n \"@ywkf/routes\": join(ywkfOutputDir, \"routes.tsx\"),\n // 请求层(由 reactQueryPlugin 生成)\n \"@ywkf/request\": join(ywkfOutputDir, \"request.ts\"),\n // Store 工具(由 zustandPlugin 生成)\n \"@ywkf/store\": join(ywkfOutputDir, \"store.ts\"),\n };\n\n const alias = { ...defaultAlias, ...userAlias };\n\n return {\n // 使用 .ywkf/index.tsx 作为入口(由框架生成)\n entry: [join(ywkfOutputDir, \"index.tsx\")],\n\n resolve: {\n extensions: [\".ts\", \".tsx\", \".jsx\", \".js\", \".json\", \".mjs\"],\n symlinks: false,\n alias: {\n ...alias,\n \"process/browser.js\": require.resolve(\"process/browser.js\"),\n \"process/browser\": require.resolve(\"process/browser.js\"),\n // 确保 React 系列包从用户项目的 node_modules 解析\n react: resolveApp(\"node_modules/react\"),\n \"react-dom\": resolveApp(\"node_modules/react-dom\"),\n \"react-router\": resolveApp(\"node_modules/react-router\"),\n },\n fallback: {\n path: require.resolve(\"path-browserify\"),\n process: require.resolve(\"process/browser.js\"),\n buffer: require.resolve(\"buffer/\"),\n util: require.resolve(\"util/\"),\n stream: require.resolve(\"stream-browserify\"),\n crypto: require.resolve(\"crypto-browserify\"),\n zlib: require.resolve(\"browserify-zlib\"),\n querystring: require.resolve(\"querystring-es3\"),\n url: require.resolve(\"url/\"),\n assert: require.resolve(\"assert/\"),\n fs: false,\n net: false,\n tls: false,\n os: false,\n https: false,\n http: false,\n },\n },\n\n resolveLoader: {\n modules: [coreNodeModules, \"node_modules\"],\n },\n\n module: {\n rules: [\n {\n test: /\\.m?js$/,\n resolve: {\n fullySpecified: false,\n },\n },\n {\n test: /\\.[jt]sx?$/,\n include: [\n resolveApp(\"src\"),\n resolveApp(\"config\"),\n resolveApp(\"store\"),\n resolveApp(\"packages\"),\n ywkfOutputDir, // 约定式路由生成的文件\n ],\n exclude: [resolveApp(\"node_modules\")],\n use: [\n {\n loader: \"builtin:swc-loader\",\n options: {\n jsc: {\n parser: {\n syntax: \"typescript\",\n tsx: true,\n decorators: true,\n },\n transform: {\n react: {\n runtime: \"automatic\",\n },\n },\n target: \"es2015\",\n },\n sourceMaps: true,\n },\n },\n ],\n },\n {\n test: /\\.(png|jpg|jpeg|gif|webp|m3u8|exr|hdr|json|woff2)$/,\n include: [resolveApp(\"public\")],\n exclude: [resolveApp(\"src\"), resolveApp(\"store\")],\n type: \"asset\",\n parser: {\n dataUrlCondition: {\n maxSize: 10 * 1024,\n },\n },\n },\n {\n test: /\\.(md)$/,\n include: [resolveApp(\"src\")],\n type: \"asset/source\",\n },\n {\n test: /\\.svg$/,\n use: [\"@svgr/webpack\"],\n },\n ],\n },\n\n plugins: [\n new rspack.ProvidePlugin({\n process: \"process/browser.js\",\n Buffer: [\"buffer\", \"Buffer\"],\n }),\n new rspack.DefinePlugin({\n \"process.env\": JSON.stringify(process.env),\n }),\n new rspack.HtmlRspackPlugin({\n template: resolveApp(html.template ?? \"public/index.html\"),\n filename: \"index.html\",\n inject: \"body\",\n hash: true,\n minify: process.env.NODE_ENV === \"production\",\n favicon: resolveApp(html.favicon ?? \"public/favicon.ico\"),\n templateParameters: {\n title: html.title ?? appCName,\n mountRoot: html.mountRoot ?? appName,\n },\n }),\n new rspack.CopyRspackPlugin({\n patterns: [\n {\n from: resolveApp(\"public/images\"),\n to: \"public/images\",\n noErrorOnMissing: true,\n },\n ],\n }),\n // .ywkf 目录生成插件(传递用户配置的插件列表)\n new YwkfGeneratorPlugin({\n cwd,\n config,\n outputDir: ywkfOutputDir,\n isDev: process.env.NODE_ENV !== \"production\",\n pluginConfigs: config.plugins,\n }),\n ].filter(Boolean),\n\n output: {\n assetModuleFilename: \"images/[hash][ext]\",\n library: microFrontend.enabled ? `${appCName}-[name]` : undefined,\n chunkFilename: \"[name].[contenthash].js\",\n libraryTarget: microFrontend.enabled ? \"umd\" : undefined,\n globalObject: microFrontend.enabled ? \"window\" : undefined,\n chunkLoadingGlobal: microFrontend.enabled\n ? `chunk_global_${appName}`\n : undefined,\n publicPath: output.publicPath ?? \"/\",\n path: resolveApp(output.path ?? \"dist\"),\n },\n\n ignoreWarnings: [\n {\n module: /@testing-library\\/react/,\n message: /export 'act'/,\n },\n ],\n\n devtool: \"source-map\",\n };\n}\n","import type { Compiler } from \"@rspack/core\";\nimport { watch, existsSync } from \"fs\";\nimport { join } from \"path\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport type { YwkfPlugin, PluginHooks, PluginContext, PluginConfig } from \"../plugin/types.js\";\nimport { YwkfGenerator } from \"./generator.js\";\n\nexport interface YwkfGeneratorPluginOptions {\n /** 项目根目录 */\n cwd: string;\n /** 解析后的配置 */\n config: Required<YwkfConfig>;\n /** 输出目录(.ywkf) */\n outputDir: string;\n /** 是否开发模式 */\n isDev: boolean;\n /** 用户配置的插件列表(PluginConfig 格式) */\n pluginConfigs?: PluginConfig[];\n}\n\n/**\n * .ywkf 目录生成插件\n *\n * 在编译前生成 .ywkf 目录下的所有文件\n */\nexport class YwkfGeneratorPlugin {\n private options: YwkfGeneratorPluginOptions;\n private hasGenerated = false;\n private isWatching = false;\n private generator: YwkfGenerator | null = null;\n private pluginHooks: PluginHooks[] = [];\n private initialized = false;\n\n constructor(options: YwkfGeneratorPluginOptions) {\n this.options = options;\n }\n\n /**\n * 解析插件配置为插件实例\n */\n private async resolvePlugin(\n pluginConfig: PluginConfig\n ): Promise<YwkfPlugin | null> {\n try {\n let plugin: YwkfPlugin;\n let options: Record<string, unknown> = {};\n\n if (typeof pluginConfig === \"string\") {\n const module = await import(pluginConfig);\n plugin = module.default || module;\n } else if (Array.isArray(pluginConfig)) {\n const [pluginOrName, pluginOptions] = pluginConfig;\n options = pluginOptions;\n\n if (typeof pluginOrName === \"string\") {\n const module = await import(pluginOrName);\n plugin = module.default || module;\n } else {\n plugin = pluginOrName;\n }\n } else {\n plugin = pluginConfig;\n }\n\n // 如果是工厂函数,调用它\n if (typeof plugin === \"function\") {\n plugin = (plugin as (opts?: Record<string, unknown>) => YwkfPlugin)(options);\n }\n\n return plugin;\n } catch (error) {\n console.error(`[ywkf] 解析插件失败: ${error}`);\n return null;\n }\n }\n\n /**\n * 初始化插件钩子\n */\n private async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n const { cwd, config, isDev, pluginConfigs = [] } = this.options;\n\n // 创建插件上下文\n const context: PluginContext = {\n cwd,\n isDev,\n isProd: !isDev,\n config,\n logger: {\n info: (msg) => console.log(`[ywkf] ${msg}`),\n warn: (msg) => console.warn(`[ywkf] ${msg}`),\n error: (msg) => console.error(`[ywkf] ${msg}`),\n debug: (msg) => {\n if (process.env.DEBUG) {\n console.log(`[ywkf:debug] ${msg}`);\n }\n },\n },\n };\n\n // 解析并初始化所有插件,收集钩子\n for (const pluginConfig of pluginConfigs) {\n const plugin = await this.resolvePlugin(pluginConfig);\n if (plugin) {\n const hooks = await plugin.setup(context);\n this.pluginHooks.push(hooks);\n console.log(`[ywkf] 插件已加载: ${plugin.name}`);\n }\n }\n\n // 创建生成器\n this.generator = new YwkfGenerator(\n {\n cwd: this.options.cwd,\n config: this.options.config,\n outputDir: this.options.outputDir,\n isDev: this.options.isDev,\n },\n this.pluginHooks\n );\n\n this.initialized = true;\n }\n\n apply(compiler: Compiler): void {\n const pluginName = \"YwkfGeneratorPlugin\";\n\n // 在编译开始前生成代码\n compiler.hooks.beforeCompile.tapAsync(pluginName, async (params, callback) => {\n try {\n // 确保初始化完成\n await this.initialize();\n\n if (!this.hasGenerated && this.generator) {\n await this.generator.generate();\n this.hasGenerated = true;\n }\n callback();\n } catch (error) {\n callback(error as Error);\n }\n });\n\n // 开发模式下监听文件变化\n if (this.options.isDev && !this.isWatching) {\n this.watchPages();\n }\n }\n\n /**\n * 监听页面目录变化\n */\n private watchPages(): void {\n const { config, cwd } = this.options;\n const pagesDir = join(cwd, config.router.pagesDir || \"src/pages\");\n\n if (!existsSync(pagesDir)) {\n return;\n }\n\n this.isWatching = true;\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const watcher = watch(\n pagesDir,\n { recursive: true },\n (eventType, filename) => {\n // 只处理 tsx/jsx 文件\n if (!filename?.match(/\\.(tsx?|jsx?)$/)) {\n return;\n }\n\n // 防抖处理\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n console.log(`[ywkf] 检测到页面变化: ${filename}`);\n if (this.generator) {\n await this.generator.generate();\n }\n }, 500);\n }\n );\n\n // 进程退出时关闭监听\n process.on(\"exit\", () => {\n watcher.close();\n });\n }\n}\n","import { existsSync, mkdirSync, writeFileSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport type {\n PluginHooks,\n GeneratorContext,\n CodeInjection,\n GeneratedFile,\n} from \"../plugin/types.js\";\nimport { ConventionalRouteGenerator } from \"../router/generator.js\";\nimport { generateEntry } from \"./templates/entry.js\";\nimport { generateBootstrap } from \"./templates/bootstrap.js\";\nimport { generateEnvTypes } from \"./templates/env-types.js\";\nimport { generateRouteTypes } from \"./templates/route-types.js\";\n\n/**\n * 插件钩子执行器\n */\nexport interface PluginHooksRunner {\n hooks: PluginHooks[];\n}\n\n/**\n * .ywkf 目录代码生成器\n *\n * 生成的文件:\n * - index.tsx - 应用入口\n * - routes.tsx - 约定式路由\n * - bootstrap.tsx - 启动逻辑\n * - types/routes.d.ts - 路由类型\n * - types/env.d.ts - 环境变量类型\n * - config.json - 配置快照\n */\nexport class YwkfGenerator {\n private context: GeneratorContext;\n private pluginHooks: PluginHooks[];\n private lastGeneratedContent: Map<string, string> = new Map();\n\n constructor(\n context: Omit<GeneratorContext, \"outputDir\"> & { outputDir?: string },\n pluginHooks: PluginHooks[] = []\n ) {\n this.context = {\n ...context,\n outputDir: context.outputDir || join(context.cwd, \".ywkf\"),\n };\n this.pluginHooks = pluginHooks;\n }\n\n /**\n * 生成所有文件\n */\n async generate(): Promise<void> {\n const { outputDir } = this.context;\n\n // 确保目录存在\n this.ensureDir(outputDir);\n this.ensureDir(join(outputDir, \"types\"));\n\n // 生成各个文件\n this.generateConfigSnapshot();\n this.generateRoutes();\n this.generateBootstrapFile();\n this.generateEntryFile();\n this.generateTypes();\n\n // 生成插件附加文件\n await this.generatePluginFiles();\n\n // 调用插件 afterGenerate 钩子\n for (const hooks of this.pluginHooks) {\n if (hooks.afterGenerate) {\n await hooks.afterGenerate(this.context);\n }\n }\n\n console.log(`[ywkf] 已生成 .ywkf 目录`);\n }\n\n /**\n * 生成配置快照\n */\n private generateConfigSnapshot(): void {\n const { outputDir, config } = this.context;\n const configPath = join(outputDir, \"config.json\");\n\n // 移除函数类型的配置(无法序列化)\n const serializableConfig = JSON.parse(\n JSON.stringify(config, (key, value) => {\n if (typeof value === \"function\") {\n return \"[Function]\";\n }\n return value;\n })\n );\n\n this.writeFileIfChanged(\n configPath,\n JSON.stringify(serializableConfig, null, 2)\n );\n }\n\n /**\n * 生成约定式路由\n */\n private generateRoutes(): void {\n const { cwd, outputDir, config } = this.context;\n\n if (!config.router.conventional) {\n return;\n }\n\n const pagesDir = join(cwd, config.router.pagesDir || \"src/pages\");\n const generator = new ConventionalRouteGenerator({\n pagesDir,\n outputDir,\n basename: config.router.basename,\n });\n\n const content = generator.generateCode();\n const routesPath = join(outputDir, \"routes.tsx\");\n\n this.writeFileIfChanged(routesPath, content);\n }\n\n /**\n * 生成启动文件\n */\n private generateBootstrapFile(): void {\n const { outputDir, config } = this.context;\n\n // 收集插件注入\n const injections = this.collectInjections(\"bootstrap\");\n\n // 生成基础代码\n let content = generateBootstrap(config, injections);\n\n // 调用插件修改钩子\n for (const hooks of this.pluginHooks) {\n if (hooks.modifyBootstrapCode) {\n const result = hooks.modifyBootstrapCode(content, this.context);\n if (result) {\n content = result;\n }\n }\n }\n\n const bootstrapPath = join(outputDir, \"bootstrap.tsx\");\n this.writeFileIfChanged(bootstrapPath, content);\n }\n\n /**\n * 生成入口文件\n */\n private generateEntryFile(): void {\n const { outputDir, config } = this.context;\n\n // 收集插件注入\n const injections = this.collectInjections(\"entry\");\n\n // 生成基础代码\n let content = generateEntry(config, injections);\n\n // 调用插件修改钩子\n for (const hooks of this.pluginHooks) {\n if (hooks.modifyEntryCode) {\n const result = hooks.modifyEntryCode(content, this.context);\n if (result) {\n content = result;\n }\n }\n }\n\n const entryPath = join(outputDir, \"index.tsx\");\n this.writeFileIfChanged(entryPath, content);\n }\n\n /**\n * 收集插件代码注入\n */\n private collectInjections(\n type: \"entry\" | \"bootstrap\"\n ): CodeInjection {\n const result: CodeInjection = {\n imports: [],\n topLevel: [],\n exports: [],\n };\n\n const hookName = type === \"entry\" ? \"injectEntry\" : \"injectBootstrap\";\n\n for (const hooks of this.pluginHooks) {\n const hook = hooks[hookName];\n if (hook) {\n const injection = hook(this.context);\n if (injection) {\n result.imports?.push(...(injection.imports || []));\n result.topLevel?.push(...(injection.topLevel || []));\n result.exports?.push(...(injection.exports || []));\n }\n }\n }\n\n return result;\n }\n\n /**\n * 生成插件附加文件\n */\n private async generatePluginFiles(): Promise<void> {\n const { outputDir } = this.context;\n\n for (const hooks of this.pluginHooks) {\n if (hooks.generateFiles) {\n const files = hooks.generateFiles(this.context);\n if (files) {\n for (const file of files) {\n const filePath = join(outputDir, file.path);\n const dir = join(filePath, \"..\");\n this.ensureDir(dir);\n this.writeFileIfChanged(filePath, file.content);\n }\n }\n }\n }\n }\n\n /**\n * 生成类型定义\n */\n private generateTypes(): void {\n const { outputDir, config, cwd } = this.context;\n\n // 生成环境变量类型\n const envTypesContent = generateEnvTypes(cwd, config);\n this.writeFileIfChanged(\n join(outputDir, \"types\", \"env.d.ts\"),\n envTypesContent\n );\n\n // 生成路由类型\n if (config.router.conventional) {\n const routeTypesContent = generateRouteTypes();\n this.writeFileIfChanged(\n join(outputDir, \"types\", \"routes.d.ts\"),\n routeTypesContent\n );\n }\n }\n\n /**\n * 确保目录存在\n */\n private ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n /**\n * 只在内容变化时写入文件(避免触发不必要的热更新)\n */\n private writeFileIfChanged(filePath: string, content: string): void {\n const normalizedContent = this.normalizeContent(content);\n const lastContent = this.lastGeneratedContent.get(filePath);\n\n if (lastContent === normalizedContent) {\n return;\n }\n\n // 检查文件是否存在且内容相同\n if (existsSync(filePath)) {\n const existingContent = readFileSync(filePath, \"utf-8\");\n if (this.normalizeContent(existingContent) === normalizedContent) {\n this.lastGeneratedContent.set(filePath, normalizedContent);\n return;\n }\n }\n\n writeFileSync(filePath, content, \"utf-8\");\n this.lastGeneratedContent.set(filePath, normalizedContent);\n }\n\n /**\n * 标准化内容(去掉时间戳等动态部分)\n */\n private normalizeContent(content: string): string {\n return content\n .replace(/\\/\\/ Generated at: .+/g, \"\")\n .replace(/\\/\\*\\* Generated at: .+ \\*\\//g, \"\");\n }\n}\n","import { existsSync, readdirSync, statSync, mkdirSync, writeFileSync } from \"fs\";\nimport { join, relative, basename } from \"path\";\n\n/**\n * 路由节点配置\n */\nexport interface RouteConfig {\n /** 路由路径 */\n path: string;\n /** 页面文件(page.tsx)相对路径 */\n file?: string;\n /** 布局文件(layout.tsx)相对路径 */\n layoutFile?: string;\n /** 错误边界文件(error.tsx)相对路径 */\n errorFile?: string;\n /** 加载状态文件(loading.tsx)相对路径 */\n loadingFile?: string;\n /** 通配路由文件($.tsx)相对路径 */\n catchAllFile?: string;\n /** 组件名称 */\n name: string;\n /** 子路由 */\n children?: RouteConfig[];\n /** 是否为 index 路由 */\n index?: boolean;\n /** 是否为布局路由 */\n isLayout?: boolean;\n /** 是否为无路径布局(__prefix) */\n pathless?: boolean;\n}\n\nexport interface GeneratorOptions {\n /** 页面目录 */\n pagesDir: string;\n /** 输出目录 */\n outputDir: string;\n /** 路由 basename */\n basename?: string;\n}\n\n/**\n * 不参与路由扫描的目录名\n */\nconst EXCLUDED_DIRS = new Set([\n \"components\",\n \"hooks\",\n \"utils\",\n \"services\",\n \"models\",\n \"assets\",\n \"types\",\n \"constants\",\n \"styles\",\n]);\n\n/**\n * 约定文件名匹配\n */\nconst CONVENTION_FILES = {\n page: /^page\\.(tsx?|jsx?)$/,\n layout: /^layout\\.(tsx?|jsx?)$/,\n error: /^error\\.(tsx?|jsx?)$/,\n loading: /^loading\\.(tsx?|jsx?)$/,\n catchAll: /^\\$\\.(tsx?|jsx?)$/,\n};\n\n/**\n * Modern.js 风格约定式路由生成器\n *\n * 文件约定:\n * - page.tsx — 页面内容(叶子组件)\n * - layout.tsx — 布局组件(使用 <Outlet> 渲染子路由)\n * - error.tsx — 错误边界组件\n * - loading.tsx — 加载状态组件\n * - $.tsx — 通配/404 路由\n *\n * 目录约定:\n * - [id]/ — 动态路由 → /:id\n * - [id$]/ — 可选动态路由 → /:id?\n * - [...slug]/ — 全匹配路由 → /*\n * - __auth/ — 无路径布局(不生成 URL 片段)\n * - user.profile/ — 扁平路由(. 分隔 → /user/profile)\n */\nexport class ConventionalRouteGenerator {\n private options: GeneratorOptions;\n\n constructor(options: GeneratorOptions) {\n this.options = options;\n }\n\n generate(): RouteConfig[] {\n const { pagesDir } = this.options;\n if (!existsSync(pagesDir)) {\n console.warn(`[ywkf] 页面目录不存在: ${pagesDir}`);\n return [];\n }\n return this.scanDirectory(pagesDir, \"/\");\n }\n\n /**\n * 扫描目录,生成路由树\n */\n private scanDirectory(dir: string, routePath: string): RouteConfig[] {\n const entries = readdirSync(dir);\n\n // 查找约定文件\n const layoutFile = entries.find((e) => CONVENTION_FILES.layout.test(e));\n const pageFile = entries.find((e) => CONVENTION_FILES.page.test(e));\n const errorFile = entries.find((e) => CONVENTION_FILES.error.test(e));\n const loadingFile = entries.find((e) => CONVENTION_FILES.loading.test(e));\n const catchAllFile = entries.find((e) => CONVENTION_FILES.catchAll.test(e));\n\n // 收集子目录\n const subDirs = entries.filter((e) => {\n if (e.startsWith(\".\")) return false;\n if (EXCLUDED_DIRS.has(e)) return false;\n return statSync(join(dir, e)).isDirectory();\n });\n\n // 递归子目录\n const childRoutes: RouteConfig[] = [];\n for (const subDir of subDirs) {\n const subDirPath = join(dir, subDir);\n\n // __prefix:无路径布局\n if (subDir.startsWith(\"__\")) {\n const pathlessRoutes = this.scanDirectory(subDirPath, routePath);\n // 如果该无路径目录有 layout,将子路由包装在其中\n const pathlessLayout = readdirSync(subDirPath).find((e) =>\n CONVENTION_FILES.layout.test(e)\n );\n if (pathlessLayout) {\n const pathlessChildren = this.scanDirectory(subDirPath, routePath);\n childRoutes.push({\n path: routePath,\n name: this.generateRouteName(subDir.slice(2)),\n layoutFile: relative(this.options.pagesDir, join(subDirPath, pathlessLayout)),\n isLayout: true,\n pathless: true,\n children: pathlessChildren.filter(\n (r) => r.layoutFile !== relative(this.options.pagesDir, join(subDirPath, pathlessLayout))\n ),\n });\n } else {\n childRoutes.push(...pathlessRoutes);\n }\n continue;\n }\n\n // 计算路由路径\n const subRoutePath = this.resolveRoutePath(subDir, routePath);\n childRoutes.push(...this.scanDirectory(subDirPath, subRoutePath));\n }\n\n // 构建当前目录的路由节点\n const routeName = this.generateRouteName(routePath);\n const relPath = (file: string) => relative(this.options.pagesDir, join(dir, file));\n\n // 有 layout.tsx → 创建布局路由节点,children 为子路由\n if (layoutFile) {\n const layoutChildren: RouteConfig[] = [];\n\n // page.tsx 作为 index 子路由\n if (pageFile) {\n layoutChildren.push({\n path: routePath,\n file: relPath(pageFile),\n name: routeName + \"Index\",\n index: true,\n });\n }\n\n // 通配路由\n if (catchAllFile) {\n layoutChildren.push({\n path: \"*\",\n file: relPath(catchAllFile),\n name: routeName + \"CatchAll\",\n });\n }\n\n layoutChildren.push(...childRoutes);\n\n return [\n {\n path: routePath,\n layoutFile: relPath(layoutFile),\n errorFile: errorFile ? relPath(errorFile) : undefined,\n loadingFile: loadingFile ? relPath(loadingFile) : undefined,\n name: routeName,\n isLayout: true,\n children: layoutChildren,\n },\n ];\n }\n\n // 无 layout → page.tsx 是叶子页面\n const result: RouteConfig[] = [];\n\n if (pageFile) {\n result.push({\n path: routePath,\n file: relPath(pageFile),\n errorFile: errorFile ? relPath(errorFile) : undefined,\n name: routeName,\n });\n }\n\n if (catchAllFile) {\n result.push({\n path: \"*\",\n file: relPath(catchAllFile),\n name: routeName + \"CatchAll\",\n });\n }\n\n result.push(...childRoutes);\n return result;\n }\n\n /**\n * 解析目录名到路由路径\n *\n * - [id] → :id\n * - [id$] → :id?\n * - [...slug] → *\n * - user.profile → user/profile\n */\n private resolveRoutePath(dirName: string, parentPath: string): string {\n let segment: string;\n\n // [...slug] → *\n if (dirName.match(/^\\[\\.\\.\\.(.+)\\]$/)) {\n segment = \"*\";\n }\n // [id$] → :id? (可选动态)\n else if (dirName.match(/^\\[(.+)\\$\\]$/)) {\n const param = dirName.slice(1, -2);\n segment = `:${param}?`;\n }\n // [id] → :id\n else if (dirName.match(/^\\[(.+)\\]$/)) {\n const param = dirName.slice(1, -1);\n segment = `:${param}`;\n }\n // user.profile → user/profile (扁平路由)\n else if (dirName.includes(\".\")) {\n segment = dirName.replace(/\\./g, \"/\");\n } else {\n segment = dirName;\n }\n\n return parentPath === \"/\"\n ? `/${segment}`\n : `${parentPath}/${segment}`;\n }\n\n /**\n * 生成有效的 JS 标识符名称\n */\n private generateRouteName(path: string): string {\n const name = path\n .split(\"/\")\n .filter(Boolean)\n .map((s) =>\n s\n .replace(/^:/, \"Param\")\n .replace(/\\?$/, \"Optional\")\n .replace(/^\\*$/, \"CatchAll\")\n )\n .map((s) => {\n const cleaned = s.replace(/[^a-zA-Z0-9]/g, \"\");\n if (!cleaned) return \"\";\n return cleaned.charAt(0).toUpperCase() + cleaned.slice(1);\n })\n .join(\"\");\n\n if (!name || /^\\d/.test(name)) {\n return \"Page\" + (name || \"Root\");\n }\n return name;\n }\n\n // ===== 代码生成 =====\n\n generateCode(): string {\n const routes = this.generate();\n const lazyImports: string[] = [];\n const errorImports: string[] = [];\n const loadingImports: string[] = [];\n\n this.collectImports(routes, lazyImports, errorImports, loadingImports);\n\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\nimport React, { lazy, Suspense } from \"react\";\nimport { createBrowserRouter, type RouteObject } from \"react-router\";\n\n// 懒加载页面组件\n${lazyImports.join(\"\\n\")}\n${errorImports.length > 0 ? \"\\n// 错误边界组件\\n\" + errorImports.join(\"\\n\") : \"\"}\n${loadingImports.length > 0 ? \"\\n// 加载状态组件\\n\" + loadingImports.join(\"\\n\") : \"\"}\n\n// 默认加载状态\nconst DefaultLoading = () => <div style={{ padding: 24, textAlign: \"center\" }}>加载中...</div>;\n\n// 懒加载包装\nfunction LazyRoute({\n Component,\n Loading = DefaultLoading,\n}: {\n Component: React.LazyExoticComponent<React.ComponentType<unknown>>;\n Loading?: React.ComponentType;\n}) {\n return (\n <Suspense fallback={<Loading />}>\n <Component />\n </Suspense>\n );\n}\n\n// 路由配置\nexport const routes: RouteObject[] = ${this.emitRouteArray(routes)};\n\n/**\n * 创建路由实例\n */\nexport function createRouter(basename?: string) {\n return createBrowserRouter(routes, { basename: basename || \"/\" });\n}\n\nexport default routes;\n`;\n }\n\n private collectImports(\n routes: RouteConfig[],\n lazyImports: string[],\n errorImports: string[],\n loadingImports: string[]\n ): void {\n for (const route of routes) {\n const name = route.name;\n const toImportPath = (f: string) => f.replace(/\\.(tsx?|jsx?)$/, \"\");\n\n if (route.isLayout && route.layoutFile) {\n lazyImports.push(\n `const ${name}Layout = lazy(() => import(\"@/pages/${toImportPath(route.layoutFile)}\"));`\n );\n }\n if (route.file) {\n lazyImports.push(\n `const ${name}Page = lazy(() => import(\"@/pages/${toImportPath(route.file)}\"));`\n );\n }\n if (route.errorFile) {\n errorImports.push(\n `const ${name}Error = lazy(() => import(\"@/pages/${toImportPath(route.errorFile)}\"));`\n );\n }\n if (route.loadingFile) {\n loadingImports.push(\n `const ${name}Loading = lazy(() => import(\"@/pages/${toImportPath(route.loadingFile)}\"));`\n );\n }\n\n if (route.children) {\n this.collectImports(route.children, lazyImports, errorImports, loadingImports);\n }\n }\n }\n\n private emitRouteArray(routes: RouteConfig[], parentPath?: string): string {\n const items = routes.map((r) => this.emitRouteObject(r, parentPath));\n return `[\\n ${items.join(\",\\n \")}\\n]`;\n }\n\n private emitRouteObject(route: RouteConfig, parentPath?: string): string {\n const parts: string[] = [];\n const name = route.name;\n\n // path\n if (route.index) {\n parts.push(\"index: true\");\n } else if (route.pathless) {\n // 无路径布局不输出 path\n } else if (route.path === \"*\") {\n parts.push(`path: \"*\"`);\n } else if (parentPath && route.path.startsWith(parentPath) && parentPath !== \"/\") {\n const rel = route.path.slice(parentPath.length + 1);\n parts.push(`path: \"${rel || \"\"}\"`);\n } else {\n parts.push(`path: \"${route.path}\"`);\n }\n\n // element\n if (route.isLayout && route.layoutFile) {\n const loadingProp = route.loadingFile ? ` Loading={${name}Loading}` : \"\";\n parts.push(`element: <LazyRoute Component={${name}Layout}${loadingProp} />`);\n } else if (route.file) {\n parts.push(`element: <LazyRoute Component={${name}Page} />`);\n }\n\n // errorElement\n if (route.errorFile) {\n parts.push(`errorElement: <LazyRoute Component={${name}Error} />`);\n }\n\n // children\n if (route.children && route.children.length > 0) {\n const childParent = route.pathless ? parentPath : route.path;\n parts.push(`children: ${this.emitRouteArray(route.children, childParent)}`);\n }\n\n return `{\\n ${parts.join(\",\\n \")}\\n }`;\n }\n\n /**\n * 写入路由文件\n */\n write(): void {\n const { outputDir } = this.options;\n const code = this.generateCode();\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n writeFileSync(join(outputDir, \"routes.tsx\"), code, \"utf-8\");\n console.log(`[ywkf] 约定式路由已生成`);\n }\n}\n\n/**\n * 生成约定式路由\n */\nexport function generateConventionalRoutes(options: GeneratorOptions): void {\n new ConventionalRouteGenerator(options).write();\n}\n","import type { YwkfConfig } from \"../../config/schema.js\";\nimport type { CodeInjection } from \"../../plugin/types.js\";\n\n/**\n * 生成应用入口文件 (.ywkf/index.tsx)\n *\n * 基础版本只负责启动应用,微前端等功能通过插件注入\n */\nexport function generateEntry(\n config: Required<YwkfConfig>,\n injections: CodeInjection = {}\n): string {\n const imports = [\n `import \"@/index.css\";`,\n `import { runApp } from \"./bootstrap\";`,\n ...(injections.imports || []),\n ];\n\n const topLevel = injections.topLevel || [];\n const exports = injections.exports || [];\n\n // 如果有插件注入的 exports(比如微前端),使用条件启动\n const hasPluginExports = exports.length > 0;\n\n const startupCode = hasPluginExports\n ? `// 独立运行模式\nif (shouldRunIndependently !== false) {\n runApp();\n}`\n : `// 启动应用\nrunApp();`;\n\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\n${imports.join(\"\\n\")}\n\n${topLevel.length > 0 ? topLevel.join(\"\\n\") + \"\\n\" : \"\"}${exports.length > 0 ? exports.join(\"\\n\") + \"\\n\\n\" : \"\"}${startupCode}\n`;\n}\n","import type { YwkfConfig } from \"../../config/schema.js\";\nimport type { CodeInjection } from \"../../plugin/types.js\";\n\n/**\n * 生成启动文件 (.ywkf/bootstrap.tsx)\n *\n * 基础版本包含应用启动核心逻辑,微前端等功能通过插件注入\n */\nexport function generateBootstrap(\n config: Required<YwkfConfig>,\n injections: CodeInjection = {}\n): string {\n const { appName, router } = config;\n\n const routerImport = router.conventional\n ? `import { createRouter } from \"./routes\";`\n : `import { createRouter } from \"@/routes\";`;\n\n const imports = [\n `import { bootstrap, type AppConfig } from \"@4399ywkf/core/runtime\";`,\n routerImport,\n ...(injections.imports || []),\n ];\n\n const topLevel = injections.topLevel || [];\n const exports = injections.exports || [];\n\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\n${imports.join(\"\\n\")}\n\n/**\n * 应用名称\n */\nexport const APP_NAME = \"${appName}\";\n\n/**\n * 路由 basename\n */\nexport const BASENAME = \"${router.basename || \"/\"}\";\n\n/**\n * 获取用户自定义配置(如果存在)\n * 用户可在 src/app.config.ts 中导出配置来覆盖默认值\n */\nasync function getUserConfig(): Promise<Partial<AppConfig>> {\n try {\n // webpackIgnore 注释让打包器跳过模块存在性检查\n const userConfigModule = await import(/* webpackIgnore: true */ \"@/app.config\");\n return userConfigModule.default || {};\n } catch {\n // 文件不存在时返回空配置\n return {};\n }\n}\n\n/**\n * 创建应用配置\n */\nexport function createAppConfig(userConfig: Partial<AppConfig> = {}): AppConfig {\n const router = createRouter(BASENAME);\n\n const defaultConfig: AppConfig = {\n appName: APP_NAME,\n router,\n basename: BASENAME,\n rootId: APP_NAME,\n strictMode: true,\n antd: {\n enabled: true,\n },\n providers: [],\n lifecycle: {\n onMounted() {\n console.log(\\`[\\${APP_NAME}] 应用已挂载\\`);\n },\n onUnmount() {\n console.log(\\`[\\${APP_NAME}] 应用已卸载\\`);\n },\n onError(error) {\n console.error(\\`[\\${APP_NAME}] 全局错误:\\`, error);\n },\n },\n };\n\n // 深度合并用户配置\n return {\n ...defaultConfig,\n ...userConfig,\n antd: { ...defaultConfig.antd, ...userConfig.antd },\n providers: [...(defaultConfig.providers || []), ...(userConfig.providers || [])],\n lifecycle: { ...defaultConfig.lifecycle, ...userConfig.lifecycle },\n };\n}\n\n/**\n * 启动应用\n */\nexport async function runApp(): Promise<void> {\n const userConfig = await getUserConfig();\n await bootstrap(createAppConfig(userConfig));\n}\n${topLevel.length > 0 ? \"\\n\" + topLevel.join(\"\\n\") : \"\"}\n${exports.length > 0 ? \"\\n\" + exports.join(\"\\n\") : \"\"}\n`;\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { YwkfConfig } from \"../../config/schema.js\";\n\n/**\n * 生成环境变量类型定义 (.ywkf/types/env.d.ts)\n */\nexport function generateEnvTypes(\n cwd: string,\n config: Required<YwkfConfig>\n): string {\n const envVars = collectEnvVars(cwd, config);\n\n const envInterface = envVars\n .map((key) => ` readonly ${key}: string;`)\n .join(\"\\n\");\n\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\n/// <reference types=\"react\" />\n/// <reference types=\"react-dom\" />\n\ndeclare namespace NodeJS {\n interface ProcessEnv {\n${envInterface}\n readonly NODE_ENV: \"development\" | \"production\" | \"test\";\n }\n}\n\ndeclare module \"*.svg\" {\n import * as React from \"react\";\n const ReactComponent: React.FunctionComponent<\n React.SVGProps<SVGSVGElement> & { title?: string }\n >;\n export default ReactComponent;\n}\n\ndeclare module \"*.png\" {\n const src: string;\n export default src;\n}\n\ndeclare module \"*.jpg\" {\n const src: string;\n export default src;\n}\n\ndeclare module \"*.jpeg\" {\n const src: string;\n export default src;\n}\n\ndeclare module \"*.gif\" {\n const src: string;\n export default src;\n}\n\ndeclare module \"*.webp\" {\n const src: string;\n export default src;\n}\n\ndeclare module \"*.css\" {\n const classes: { readonly [key: string]: string };\n export default classes;\n}\n\ndeclare module \"*.less\" {\n const classes: { readonly [key: string]: string };\n export default classes;\n}\n\ndeclare module \"*.scss\" {\n const classes: { readonly [key: string]: string };\n export default classes;\n}\n\ndeclare module \"*.md\" {\n const content: string;\n export default content;\n}\n`;\n}\n\n/**\n * 收集环境变量\n */\nfunction collectEnvVars(cwd: string, config: Required<YwkfConfig>): string[] {\n const envVars = new Set<string>();\n\n // 从 .env.public 读取\n const publicEnvPath = join(cwd, config.env.publicEnvFile || \"config/env/.env.public\");\n if (existsSync(publicEnvPath)) {\n const content = readFileSync(publicEnvPath, \"utf-8\");\n parseEnvFile(content, envVars);\n }\n\n // 从 .env.development 读取\n const devEnvPath = join(cwd, config.env.envDir || \"config/env\", \".env.development\");\n if (existsSync(devEnvPath)) {\n const content = readFileSync(devEnvPath, \"utf-8\");\n parseEnvFile(content, envVars);\n }\n\n // 从 .env.production 读取\n const prodEnvPath = join(cwd, config.env.envDir || \"config/env\", \".env.production\");\n if (existsSync(prodEnvPath)) {\n const content = readFileSync(prodEnvPath, \"utf-8\");\n parseEnvFile(content, envVars);\n }\n\n return Array.from(envVars).sort();\n}\n\n/**\n * 解析 .env 文件\n */\nfunction parseEnvFile(content: string, envVars: Set<string>): void {\n const lines = content.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue;\n }\n const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)\\s*=/);\n if (match) {\n envVars.add(match[1]);\n }\n }\n}\n","/**\n * 生成路由类型定义 (.ywkf/types/routes.d.ts)\n */\nexport function generateRouteTypes(): string {\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\nimport type { RouteObject } from \"react-router\";\n\ndeclare module \"@ywkf/routes\" {\n export const routes: RouteObject[];\n export function createRouter(basename?: string): ReturnType<typeof import(\"react-router\").createBrowserRouter>;\n export default routes;\n}\n`;\n}\n","import { rspack, type Configuration } from \"@rspack/core\";\nimport { merge } from \"webpack-merge\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport { createBaseConfig } from \"./base.js\";\n\n/**\n * 创建生产环境 Rspack 配置\n */\nexport function createProdConfig(\n config: Required<YwkfConfig>,\n cwd: string\n): Configuration {\n const baseConfig = createBaseConfig(config, cwd);\n const { resolveApp } = createPathResolver(cwd);\n const { style, performance, output } = config;\n\n const styleRules: Configuration[\"module\"] = {\n rules: [\n // Less - antd\n {\n test: /\\.less$/,\n include: [\n /[\\\\/]node_modules[\\\\/].*antd/,\n /[\\\\/]node_modules[\\\\/]@4399ywkf[\\\\/]design/,\n ],\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n strictMath: false,\n math: \"always\",\n javascriptEnabled: true,\n },\n },\n },\n ],\n },\n // Less - 项目文件\n ...(style.less?.enabled !== false\n ? [\n {\n test: /\\.less$/,\n include: [resolveApp(\"src\")],\n exclude: [resolveApp(\"node_modules\")],\n oneOf: [\n {\n test: /\\.module\\.less$/,\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: {\n sourceMap: true,\n modules: {\n localIdentName:\n \"[path][name]__[local]--[hash:base64:5]\",\n },\n importLoaders: 2,\n },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n javascriptEnabled: true,\n ...style.less?.lessOptions,\n },\n },\n },\n ],\n },\n {\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n javascriptEnabled: true,\n ...style.less?.lessOptions,\n },\n },\n },\n ],\n },\n ],\n },\n ]\n : []),\n // Sass\n ...(style.sass?.enabled !== false\n ? [\n {\n test: /\\.s[ac]ss$/i,\n include: [resolveApp(\"src\")],\n exclude: [resolveApp(\"node_modules\")],\n oneOf: [\n {\n test: /\\.module\\.s[ac]ss$/,\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: {\n sourceMap: true,\n modules: {\n localIdentName:\n \"[path][name]__[local]--[hash:base64:5]\",\n },\n importLoaders: 2,\n },\n },\n {\n loader: \"sass-loader\",\n options: {\n sourceMap: true,\n sassOptions: {\n outputStyle: \"compressed\",\n ...style.sass?.sassOptions,\n },\n },\n },\n ],\n },\n {\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"sass-loader\",\n options: {\n sourceMap: true,\n sassOptions: {\n outputStyle: \"compressed\",\n ...style.sass?.sassOptions,\n },\n },\n },\n ],\n },\n ],\n },\n ]\n : []),\n // TailwindCSS\n ...(style.tailwindcss\n ? [\n {\n test: /\\.css$/,\n include: [resolveApp(\"src/index.css\")],\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n \"css-loader\",\n {\n loader: \"postcss-loader\",\n options: {\n postcssOptions: {\n config: resolveApp(\"postcss.config.js\"),\n },\n },\n },\n ],\n },\n ]\n : []),\n // src 目录中的其他 CSS\n {\n test: /\\.css$/,\n include: [resolveApp(\"src\")],\n exclude: style.tailwindcss ? [resolveApp(\"src/index.css\")] : [],\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n ],\n },\n // node_modules CSS\n {\n test: /\\.css$/,\n include: [resolveApp(\"node_modules\")],\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n ],\n },\n ],\n };\n\n const prodConfig: Configuration = {\n mode: \"production\",\n devtool: \"hidden-source-map\",\n\n output: {\n filename: \"[name].[contenthash].bundle.js\",\n chunkFilename: \"[name].[contenthash].chunk.js\",\n clean: output.clean,\n },\n\n module: styleRules,\n\n plugins: [\n new rspack.CssExtractRspackPlugin({\n filename: \"[name].[contenthash:8].css\",\n chunkFilename: \"[name].[contenthash:8].chunk.css\",\n }),\n ],\n\n optimization: {\n minimize: true,\n minimizer: [\n new rspack.SwcJsMinimizerRspackPlugin({\n exclude: [resolveApp(\"node_modules\")],\n minimizerOptions: {\n compress: {\n pure_funcs: performance.dropConsole\n ? [\"console.log\", \"console.info\", \"console.debug\", \"console.warn\"]\n : [\"console.info\", \"console.debug\"],\n drop_console: false,\n drop_debugger: true,\n },\n },\n }),\n new rspack.LightningCssMinimizerRspackPlugin(),\n ],\n },\n };\n\n return merge(baseConfig, prodConfig);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport dotenv from \"dotenv\";\nimport type { YwkfConfig } from \"../config/schema.js\";\n\n/**\n * 预加载环境变量(在配置解析之前)\n * 使用默认路径加载公共环境变量\n */\nexport function preloadEnv(\n cwd: string,\n mode: \"development\" | \"production\"\n): void {\n process.env.NODE_ENV = mode;\n\n // 尝试加载公共环境变量(使用默认路径)\n const defaultPaths = [\n resolve(cwd, \"config/env/.env.public\"),\n resolve(cwd, \".env.public\"),\n resolve(cwd, \".env\"),\n ];\n\n for (const envPath of defaultPaths) {\n if (existsSync(envPath)) {\n dotenv.config({ path: envPath });\n break;\n }\n }\n\n // 尝试加载环境特定的变量\n const modeEnvPaths = [\n resolve(cwd, `config/env/.env.${mode}`),\n resolve(cwd, `.env.${mode}`),\n ];\n\n for (const envPath of modeEnvPaths) {\n if (existsSync(envPath)) {\n const envContent = readFileSync(envPath, \"utf-8\");\n const parsed = dotenv.parse(envContent);\n for (const key in parsed) {\n process.env[key] = parsed[key];\n }\n break;\n }\n }\n}\n\n/**\n * 加载环境变量(完整版,依赖配置)\n */\nexport function loadEnv(\n config: Required<YwkfConfig>,\n cwd: string,\n mode: \"development\" | \"production\"\n): void {\n const { env } = config;\n\n // 加载公共环境变量\n const publicEnvPath = resolve(cwd, env.publicEnvFile ?? \"config/env/.env.public\");\n if (existsSync(publicEnvPath)) {\n dotenv.config({ path: publicEnvPath });\n }\n\n // 加载环境特定的变量\n const modeEnvPath = resolve(cwd, env.envDir ?? \"config/env\", `.env.${mode}`);\n if (existsSync(modeEnvPath)) {\n const envContent = readFileSync(modeEnvPath, \"utf-8\");\n const parsed = dotenv.parse(envContent);\n\n for (const key in parsed) {\n process.env[key] = parsed[key];\n }\n }\n\n // 设置默认值\n process.env.NODE_ENV = mode;\n process.env.APP_NAME = process.env.APP_NAME || config.appName;\n process.env.APP_CNAME = process.env.APP_CNAME || config.appCName;\n process.env.OUTPUT_PATH = process.env.OUTPUT_PATH || config.output.path;\n process.env.PUBLIC_PATH = process.env.PUBLIC_PATH || config.output.publicPath;\n process.env.APP_HOST = process.env.APP_HOST || config.dev.host;\n process.env.APP_PORT = process.env.APP_PORT || String(config.dev.port);\n}\n","import type { Configuration as RspackConfig } from \"@rspack/core\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport type { AppConfig, ProviderConfig } from \"../runtime/types.js\";\nimport type { RouteItem } from \"../router/types.js\";\nimport type {\n YwkfPlugin,\n PluginConfig,\n PluginContext,\n PluginHooks,\n PluginLogger,\n} from \"./types.js\";\n\n/**\n * 创建插件日志工具\n */\nfunction createLogger(pluginName: string): PluginLogger {\n const prefix = `[${pluginName}]`;\n\n return {\n info: (msg) => console.log(`${prefix} ${msg}`),\n warn: (msg) => console.warn(`${prefix} ${msg}`),\n error: (msg) => console.error(`${prefix} ${msg}`),\n debug: (msg) => {\n if (process.env.DEBUG) {\n console.debug(`${prefix} ${msg}`);\n }\n },\n };\n}\n\n/**\n * 解析插件配置\n */\nasync function resolvePlugin(\n pluginConfig: PluginConfig,\n cwd: string\n): Promise<{ plugin: YwkfPlugin; options: Record<string, unknown> }> {\n let plugin: YwkfPlugin;\n let options: Record<string, unknown> = {};\n\n if (typeof pluginConfig === \"string\") {\n // 字符串:插件包名\n const module = await import(pluginConfig);\n plugin = module.default || module;\n } else if (Array.isArray(pluginConfig)) {\n // 数组:[插件, 配置]\n const [pluginOrName, pluginOptions] = pluginConfig;\n options = pluginOptions;\n\n if (typeof pluginOrName === \"string\") {\n const module = await import(pluginOrName);\n plugin = module.default || module;\n } else {\n plugin = pluginOrName;\n }\n } else {\n // 插件对象\n plugin = pluginConfig;\n }\n\n // 如果是工厂函数,调用它\n if (typeof plugin === \"function\") {\n plugin = (plugin as (opts?: Record<string, unknown>) => YwkfPlugin)(options);\n }\n\n return { plugin, options };\n}\n\n/**\n * 插件管理器\n */\nexport class PluginManager {\n private plugins: Map<string, { plugin: YwkfPlugin; hooks: PluginHooks }> =\n new Map();\n private context: PluginContext;\n\n constructor(\n config: Required<YwkfConfig>,\n cwd: string,\n isDev: boolean\n ) {\n this.context = {\n cwd,\n isDev,\n isProd: !isDev,\n config,\n logger: createLogger(\"PluginManager\"),\n };\n }\n\n /**\n * 加载并初始化所有插件\n */\n async loadPlugins(pluginConfigs: PluginConfig[]): Promise<void> {\n for (const pluginConfig of pluginConfigs) {\n try {\n const { plugin } = await resolvePlugin(pluginConfig, this.context.cwd);\n\n if (this.plugins.has(plugin.name)) {\n this.context.logger.warn(`插件 ${plugin.name} 已加载,跳过重复加载`);\n continue;\n }\n\n // 创建插件专属 logger\n const pluginContext: PluginContext = {\n ...this.context,\n logger: createLogger(plugin.name),\n };\n\n // 调用插件 setup\n const hooks = await plugin.setup(pluginContext);\n\n this.plugins.set(plugin.name, { plugin, hooks });\n this.context.logger.info(`已加载插件: ${plugin.name}`);\n } catch (error) {\n this.context.logger.error(\n `加载插件失败: ${String(pluginConfig)} - ${error}`\n );\n }\n }\n }\n\n /**\n * 执行 modifyRspackConfig 钩子\n */\n async applyRspackConfigHooks(config: RspackConfig): Promise<RspackConfig> {\n let result = config;\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.modifyRspackConfig) {\n try {\n const modified = await hooks.modifyRspackConfig(result, this.context);\n if (modified) {\n result = modified;\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} modifyRspackConfig 执行失败: ${error}`\n );\n }\n }\n }\n\n return result;\n }\n\n /**\n * 执行 modifyRoutes 钩子\n */\n async applyRoutesHooks(routes: RouteItem[]): Promise<RouteItem[]> {\n let result = routes;\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.modifyRoutes) {\n try {\n const modified = await hooks.modifyRoutes(result, this.context);\n if (modified) {\n result = modified;\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} modifyRoutes 执行失败: ${error}`\n );\n }\n }\n }\n\n return result;\n }\n\n /**\n * 执行 modifyAppConfig 钩子\n */\n applyAppConfigHooks(appConfig: AppConfig): AppConfig {\n let result = appConfig;\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.modifyAppConfig) {\n try {\n const modified = hooks.modifyAppConfig(result, this.context);\n if (modified) {\n result = modified;\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} modifyAppConfig 执行失败: ${error}`\n );\n }\n }\n }\n\n return result;\n }\n\n /**\n * 收集所有插件的 Provider\n */\n collectProviders(): ProviderConfig[] {\n const providers: ProviderConfig[] = [];\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.addProvider) {\n try {\n const result = hooks.addProvider(this.context);\n if (Array.isArray(result)) {\n providers.push(...result);\n } else if (result) {\n providers.push(result);\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} addProvider 执行失败: ${error}`\n );\n }\n }\n }\n\n return providers;\n }\n\n /**\n * 执行 beforeBuild 钩子\n */\n async runBeforeBuild(): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.beforeBuild) {\n try {\n await hooks.beforeBuild(this.context);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} beforeBuild 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 执行 afterBuild 钩子\n */\n async runAfterBuild(stats: {\n success: boolean;\n errors?: string[];\n }): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.afterBuild) {\n try {\n await hooks.afterBuild(this.context, stats);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} afterBuild 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 执行 beforeDevServer 钩子\n */\n async runBeforeDevServer(): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.beforeDevServer) {\n try {\n await hooks.beforeDevServer(this.context);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} beforeDevServer 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 执行 afterDevServer 钩子\n */\n async runAfterDevServer(server: {\n port: number;\n host: string;\n }): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.afterDevServer) {\n try {\n await hooks.afterDevServer(this.context, server);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} afterDevServer 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 获取所有已加载的插件名称\n */\n getPluginNames(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * 获取所有已加载的插件\n */\n getPlugins(): YwkfPlugin[] {\n return Array.from(this.plugins.values()).map((p) => p.plugin);\n }\n\n /**\n * 获取所有已加载的插件钩子\n */\n getPluginHooks(): PluginHooks[] {\n return Array.from(this.plugins.values()).map((p) => p.hooks);\n }\n}\n","import { rspack, type Stats } from \"@rspack/core\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { resolveConfig } from \"../config/loader.js\";\nimport { createRspackConfig } from \"../rspack/index.js\";\nimport { preloadEnv, loadEnv } from \"./env.js\";\nimport { PluginManager } from \"../plugin/manager.js\";\n\n/**\n * 格式化文件大小\n */\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n}\n\n/**\n * 打印构建结果\n */\nfunction printBuildResult(stats: Stats): void {\n const info = stats.toJson({\n assets: true,\n errors: true,\n warnings: true,\n });\n\n if (info.errors && info.errors.length > 0) {\n console.log(chalk.red(\"\\n构建错误:\"));\n for (const error of info.errors) {\n console.log(chalk.red(` ${error.message}`));\n }\n return;\n }\n\n if (info.warnings && info.warnings.length > 0) {\n console.log(chalk.yellow(\"\\n构建警告:\"));\n for (const warning of info.warnings) {\n console.log(chalk.yellow(` ${warning.message}`));\n }\n }\n\n console.log(chalk.bold(\"\\n构建产物:\"));\n console.log();\n\n const assets = info.assets || [];\n const sortedAssets = assets\n .filter((asset) => !asset.name.endsWith(\".map\"))\n .sort((a, b) => b.size - a.size);\n\n for (const asset of sortedAssets.slice(0, 15)) {\n const sizeColor = asset.size > 500 * 1024 ? chalk.yellow : chalk.green;\n console.log(\n ` ${chalk.dim(asset.name.padEnd(50))} ${sizeColor(formatSize(asset.size))}`\n );\n }\n\n if (sortedAssets.length > 15) {\n console.log(chalk.dim(` ... 还有 ${sortedAssets.length - 15} 个文件`));\n }\n\n console.log();\n console.log(\n chalk.green(\n `✓ 构建完成,耗时 ${((info.time || 0) / 1000).toFixed(2)}s`\n )\n );\n}\n\n/**\n * 执行生产构建\n */\nexport async function build(options: { cwd?: string } = {}): Promise<void> {\n const cwd = options.cwd || process.cwd();\n const spinner = ora(\"正在构建生产环境...\").start();\n\n try {\n // 1. 预加载环境变量(在配置解析之前)\n preloadEnv(cwd, \"production\");\n\n // 2. 加载配置\n const { config, configPath } = await resolveConfig(cwd);\n\n if (configPath) {\n spinner.text = `已加载配置: ${configPath}`;\n }\n\n // 3. 完整加载环境变量\n loadEnv(config, cwd, \"production\");\n\n // 4. 加载插件\n const pluginManager = new PluginManager(config, cwd, false);\n if (config.plugins && config.plugins.length > 0) {\n spinner.text = \"加载插件...\";\n await pluginManager.loadPlugins(config.plugins);\n }\n\n // 5. 执行 beforeBuild 钩子\n await pluginManager.runBeforeBuild();\n\n // 6. 创建 Rspack 配置\n let rspackConfig = createRspackConfig(config, cwd, { isDev: false });\n\n // 7. 应用插件的 rspack 配置修改\n rspackConfig = await pluginManager.applyRspackConfigHooks(rspackConfig);\n\n spinner.text = \"正在编译...\";\n\n // 8. 执行构建\n const compiler = rspack(rspackConfig);\n\n const stats = await new Promise<Stats>((resolve, reject) => {\n compiler.run((err, stats) => {\n if (err) {\n reject(err);\n return;\n }\n if (!stats) {\n reject(new Error(\"构建失败: 无法获取统计信息\"));\n return;\n }\n resolve(stats);\n });\n });\n\n // 5. 关闭编译器\n await new Promise<void>((resolve, reject) => {\n compiler.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n\n // 9. 检查构建结果\n const hasErrors = stats.hasErrors();\n const statsInfo = stats.toJson({ errors: true });\n\n // 10. 执行 afterBuild 钩子\n await pluginManager.runAfterBuild({\n success: !hasErrors,\n errors: statsInfo.errors?.map((e) => e.message),\n });\n\n if (hasErrors) {\n spinner.fail(chalk.red(\"构建失败\"));\n printBuildResult(stats);\n process.exit(1);\n }\n\n spinner.succeed(chalk.green(\"构建完成!\"));\n printBuildResult(stats);\n } catch (error) {\n spinner.fail(chalk.red(\"构建失败\"));\n console.error(error);\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["chalk","rspack","createRequire","join","existsSync","join","existsSync","mkdirSync","writeFileSync","readFileSync","join","existsSync","existsSync","join","join","existsSync","mkdirSync","readFileSync","writeFileSync","join","existsSync","require","join","require","createRequire","dev","rspack","merge","rspack","merge","existsSync","readFileSync","resolve","rspack","rspack","chalk","ora","chalk","ora","rspack","resolve","stats","chalk"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/dev.ts","../../src/config/loader.ts","../../src/config/schema.ts","../../src/rspack/index.ts","../../src/rspack/dev.ts","../../src/rspack/base.ts","../../src/generator/plugin.ts","../../src/generator/generator.ts","../../src/router/generator.ts","../../src/generator/templates/entry.ts","../../src/generator/templates/bootstrap.ts","../../src/generator/templates/env-types.ts","../../src/generator/templates/route-types.ts","../../src/rspack/prod.ts","../../src/cli/env.ts","../../src/plugin/manager.ts","../../src/cli/build.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { dev } from \"./dev.js\";\nimport { build } from \"./build.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"ywkf\")\n .description(\"4399运维开发前端框架 CLI\")\n .version(\"1.0.0\");\n\nprogram\n .command(\"dev\")\n .description(\"启动开发服务器\")\n .option(\"-p, --port <port>\", \"指定端口号\")\n .option(\"-h, --host <host>\", \"指定主机\")\n .action(async (options) => {\n // 通过环境变量传递 CLI 参数\n if (options.port) {\n process.env.APP_PORT = options.port;\n }\n if (options.host) {\n process.env.APP_HOST = options.host;\n }\n\n await dev({ cwd: process.cwd() });\n });\n\nprogram\n .command(\"build\")\n .description(\"构建生产环境\")\n .option(\"--analyze\", \"启用构建分析\")\n .action(async (options) => {\n if (options.analyze) {\n process.env.RSDOCTOR = \"true\";\n }\n\n await build({ cwd: process.cwd() });\n });\n\nprogram\n .command(\"start\")\n .description(\"启动生产服务器(需要先执行 build)\")\n .action(() => {\n console.log(chalk.yellow(\"⚠️ start 命令暂未实现,请使用 nginx 或其他静态服务器\"));\n });\n\n// 解析命令行参数\nprogram.parse();\n","import { rspack } from \"@rspack/core\";\nimport { RspackDevServer } from \"@rspack/dev-server\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { resolveConfig } from \"../config/loader.js\";\nimport { createRspackConfig } from \"../rspack/index.js\";\nimport { preloadEnv, loadEnv } from \"./env.js\";\nimport { PluginManager } from \"../plugin/manager.js\";\n\n/**\n * 启动开发服务器\n */\nexport async function dev(options: { cwd?: string } = {}): Promise<void> {\n const cwd = options.cwd || process.cwd();\n const spinner = ora(\"正在启动开发服务器...\").start();\n\n try {\n // 1. 预加载环境变量(在配置解析之前)\n preloadEnv(cwd, \"development\");\n\n // 2. 加载配置\n const { config, configPath } = await resolveConfig(cwd);\n\n if (configPath) {\n spinner.text = `已加载配置: ${configPath}`;\n }\n\n // 3. 完整加载环境变量\n loadEnv(config, cwd, \"development\");\n\n // 3. 加载插件\n const pluginManager = new PluginManager(config, cwd, true);\n if (config.plugins && config.plugins.length > 0) {\n spinner.text = \"加载插件...\";\n await pluginManager.loadPlugins(config.plugins);\n }\n\n // 4. 执行 beforeDevServer 钩子\n await pluginManager.runBeforeDevServer();\n\n // 5. 创建 Rspack 配置\n let rspackConfig = createRspackConfig(config, cwd, { isDev: true });\n\n // 6. 应用插件的 rspack 配置修改\n rspackConfig = await pluginManager.applyRspackConfigHooks(rspackConfig);\n\n // 7. 创建编译器\n const compiler = rspack(rspackConfig);\n\n // 8. 创建开发服务器\n const devServerOptions = rspackConfig.devServer || {};\n const server = new RspackDevServer(devServerOptions, compiler);\n\n // 9. 启动服务器\n const host = config.dev.host || \"localhost\";\n const port = config.dev.port || 3000;\n\n await server.start();\n\n // 10. 执行 afterDevServer 钩子\n await pluginManager.runAfterDevServer({ host, port });\n\n spinner.succeed(chalk.green(\"开发服务器启动成功!\"));\n console.log();\n console.log(\n ` ${chalk.bold(\"Local:\")} ${chalk.cyan(`http://${host}:${port}`)}`\n );\n \n const pluginNames = pluginManager.getPluginNames();\n if (pluginNames.length > 0) {\n console.log(` ${chalk.bold(\"插件:\")} ${chalk.dim(pluginNames.join(\", \"))}`);\n }\n console.log();\n\n // 监听退出信号\n const signals: NodeJS.Signals[] = [\"SIGINT\", \"SIGTERM\"];\n for (const signal of signals) {\n process.on(signal, async () => {\n await server.stop();\n process.exit(0);\n });\n }\n } catch (error) {\n spinner.fail(chalk.red(\"开发服务器启动失败\"));\n console.error(error);\n process.exit(1);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve, extname } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport deepmerge from \"deepmerge\";\nimport { defaultConfig, type YwkfConfig } from \"./schema.js\";\n\n/** 支持的配置文件名 */\nconst CONFIG_FILES = [\n \"ywkf.config.ts\",\n \"ywkf.config.mts\",\n \"ywkf.config.js\",\n \"ywkf.config.mjs\",\n];\n\n/**\n * 查找配置文件\n */\nexport function findConfigFile(cwd: string): string | null {\n for (const file of CONFIG_FILES) {\n const configPath = resolve(cwd, file);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n return null;\n}\n\n/**\n * 加载 TypeScript 配置文件\n */\nasync function loadTsConfig(configPath: string): Promise<YwkfConfig> {\n const jiti = (await import(\"jiti\")).default;\n const loader = jiti(configPath, {\n interopDefault: true,\n });\n\n const config = loader(configPath);\n return config.default || config;\n}\n\n/**\n * 加载 JavaScript 配置文件\n */\nasync function loadJsConfig(configPath: string): Promise<YwkfConfig> {\n const fileUrl = pathToFileURL(configPath).href;\n const module = await import(fileUrl);\n return module.default || module;\n}\n\n/**\n * 加载配置文件\n */\nexport async function loadConfigFile(configPath: string): Promise<YwkfConfig> {\n const ext = extname(configPath);\n\n if (ext === \".ts\" || ext === \".mts\") {\n return loadTsConfig(configPath);\n }\n\n return loadJsConfig(configPath);\n}\n\n/**\n * 合并配置\n */\nexport function mergeConfig(\n userConfig: YwkfConfig,\n baseConfig: YwkfConfig = defaultConfig\n): Required<YwkfConfig> {\n return deepmerge(baseConfig, userConfig, {\n arrayMerge: (_, sourceArray) => sourceArray,\n }) as Required<YwkfConfig>;\n}\n\n/**\n * 解析并加载完整配置\n * @param cwd 工作目录\n * @returns 合并后的完整配置\n */\nexport async function resolveConfig(cwd: string): Promise<{\n config: Required<YwkfConfig>;\n configPath: string | null;\n}> {\n const configPath = findConfigFile(cwd);\n\n if (!configPath) {\n console.warn(\n \"⚠️ 未找到配置文件 (ywkf.config.ts),使用默认配置\"\n );\n return {\n config: defaultConfig as Required<YwkfConfig>,\n configPath: null,\n };\n }\n\n try {\n const userConfig = await loadConfigFile(configPath);\n const config = mergeConfig(userConfig);\n\n return { config, configPath };\n } catch (error) {\n console.error(\"❌ 配置文件加载失败:\", error);\n throw error;\n }\n}\n\n/**\n * 获取应用路径解析器\n */\nexport function createPathResolver(cwd: string) {\n return {\n resolveApp: (relativePath: string) => resolve(cwd, relativePath),\n cwd,\n };\n}\n","import type { Configuration as RspackConfig } from \"@rspack/core\";\nimport type { PluginConfig } from \"../plugin/types.js\";\n\n/**\n * 开发服务器配置\n */\nexport interface DevServerConfig {\n /** 开发服务器端口 */\n port?: number;\n /** 开发服务器主机 */\n host?: string;\n /** 代理配置 */\n proxy?: Record<string, string | object>;\n /** 是否开启 HTTPS */\n https?: boolean;\n}\n\n/**\n * 输出配置\n */\nexport interface OutputConfig {\n /** 输出目录 */\n path?: string;\n /** 公共路径 */\n publicPath?: string;\n /** 是否清理输出目录 */\n clean?: boolean;\n}\n\n/**\n * HTML 配置\n */\nexport interface HtmlConfig {\n /** 页面标题 */\n title?: string;\n /** HTML 模板路径 */\n template?: string;\n /** favicon 路径 */\n favicon?: string;\n /** 挂载根元素 ID */\n mountRoot?: string;\n}\n\n/**\n * 样式配置\n */\nexport interface StyleConfig {\n /** 是否启用 CSS Modules */\n cssModules?: boolean;\n /** Less 配置 */\n less?: {\n /** 是否启用 */\n enabled?: boolean;\n /** Less 选项 */\n lessOptions?: Record<string, unknown>;\n };\n /** Sass 配置 */\n sass?: {\n /** 是否启用 */\n enabled?: boolean;\n /** Sass 选项 */\n sassOptions?: Record<string, unknown>;\n };\n /** 是否启用 TailwindCSS */\n tailwindcss?: boolean;\n}\n\n/**\n * 路由配置\n */\nexport interface RouterConfig {\n /** 路由基础路径 */\n basename?: string;\n /** 是否启用约定式路由 */\n conventional?: boolean;\n /** 约定式路由扫描目录 */\n pagesDir?: string;\n /** 排除的文件/目录模式 */\n exclude?: (string | RegExp)[];\n}\n\n/**\n * 微前端配置\n */\nexport interface MicroFrontendConfig {\n /** 是否启用微前端模式 */\n enabled?: boolean;\n /** 应用名称(用于 UMD 导出) */\n name?: string;\n /** 微前端框架类型 */\n framework?: \"qiankun\" | \"garfish\";\n}\n\n/**\n * 性能配置\n */\nexport interface PerformanceConfig {\n /** 是否启用 Rsdoctor 分析 */\n rsdoctor?: boolean;\n /** 是否开启代码分割 */\n splitChunks?: boolean;\n /** 是否移除 console */\n dropConsole?: boolean;\n}\n\n/**\n * 工具链配置\n */\nexport interface ToolsConfig {\n /**\n * 自定义 Rspack 配置\n * @param config 当前配置\n * @param context 上下文信息\n * @returns 修改后的配置\n */\n rspack?: (\n config: RspackConfig,\n context: { isDev: boolean; isProd: boolean }\n ) => RspackConfig | void;\n}\n\n/**\n * 环境变量配置\n */\nexport interface EnvConfig {\n /** 公共环境变量文件路径 */\n publicEnvFile?: string;\n /** 环境特定的变量文件目录 */\n envDir?: string;\n}\n\n/**\n * 框架完整配置\n */\nexport interface YwkfConfig {\n /** 应用名称 */\n appName?: string;\n /** 应用中文名 */\n appCName?: string;\n /** 开发服务器配置 */\n dev?: DevServerConfig;\n /** 输出配置 */\n output?: OutputConfig;\n /** HTML 配置 */\n html?: HtmlConfig;\n /** 样式配置 */\n style?: StyleConfig;\n /** 路由配置 */\n router?: RouterConfig;\n /** 微前端配置 */\n microFrontend?: MicroFrontendConfig;\n /** 性能配置 */\n performance?: PerformanceConfig;\n /** 工具链配置 */\n tools?: ToolsConfig;\n /** 环境变量配置 */\n env?: EnvConfig;\n /** 路径别名 */\n alias?: Record<string, string>;\n /** 插件列表 */\n plugins?: PluginConfig[];\n}\n\n/**\n * 定义配置的辅助函数(提供类型提示)\n */\nexport function defineConfig(config: YwkfConfig): YwkfConfig {\n return config;\n}\n\n/**\n * 默认配置\n */\nexport const defaultConfig: Required<YwkfConfig> = {\n appName: \"app\",\n appCName: \"应用\",\n dev: {\n port: 3000,\n host: \"localhost\",\n proxy: {},\n https: false,\n },\n output: {\n path: \"dist\",\n publicPath: \"/\",\n clean: true,\n },\n html: {\n title: \"应用\",\n template: \"public/index.html\",\n favicon: \"public/favicon.ico\",\n mountRoot: \"root\",\n },\n style: {\n cssModules: true,\n less: { enabled: true, lessOptions: { javascriptEnabled: true } },\n sass: { enabled: true, sassOptions: {} },\n tailwindcss: true,\n },\n router: {\n basename: \"/\",\n conventional: false,\n pagesDir: \"src/pages\",\n exclude: [\n /\\/components?\\//,\n /\\/models\\//,\n /\\/utils?\\//,\n /^_/,\n /\\.d\\.ts$/,\n /\\.(test|spec|e2e)\\.(ts|tsx|js|jsx)$/,\n ],\n },\n microFrontend: {\n enabled: false,\n name: \"app\",\n framework: \"qiankun\",\n },\n performance: {\n rsdoctor: false,\n splitChunks: true,\n dropConsole: false,\n },\n tools: {},\n env: {\n publicEnvFile: \"config/env/.env.public\",\n envDir: \"config/env\",\n },\n alias: {},\n plugins: [],\n};\n","import type { Configuration } from \"@rspack/core\";\nimport { RsdoctorRspackPlugin } from \"@rsdoctor/rspack-plugin\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport { createDevConfig } from \"./dev.js\";\nimport { createProdConfig } from \"./prod.js\";\n\nexport { createBaseConfig } from \"./base.js\";\nexport { createDevConfig } from \"./dev.js\";\nexport { createProdConfig } from \"./prod.js\";\n\n/**\n * 根据环境创建 Rspack 配置\n */\nexport function createRspackConfig(\n config: Required<YwkfConfig>,\n cwd: string,\n options: { isDev?: boolean } = {}\n): Configuration {\n const isDev = options.isDev ?? process.env.NODE_ENV !== \"production\";\n\n let rspackConfig = isDev\n ? createDevConfig(config, cwd)\n : createProdConfig(config, cwd);\n\n // Rsdoctor 性能分析\n if (config.performance.rsdoctor) {\n rspackConfig.plugins = [\n ...(rspackConfig.plugins || []),\n new RsdoctorRspackPlugin({}),\n ];\n }\n\n // 用户自定义配置\n if (config.tools.rspack) {\n const userConfig = config.tools.rspack(rspackConfig, {\n isDev,\n isProd: !isDev,\n });\n\n if (userConfig) {\n rspackConfig = userConfig;\n }\n }\n\n return rspackConfig;\n}\n","import { rspack, type Configuration } from \"@rspack/core\";\nimport { merge } from \"webpack-merge\";\nimport { join } from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport { createBaseConfig } from \"./base.js\";\n\nconst require = createRequire(import.meta.url);\n\n/**\n * 将 proxy 对象格式转换为数组格式\n * webpack-dev-server v4+ 需要数组格式\n */\nfunction convertProxyToArray(\n proxy?: Record<string, string | object>\n): { context: string; target: string; changeOrigin?: boolean; secure?: boolean }[] | undefined {\n if (!proxy || Object.keys(proxy).length === 0) {\n return undefined;\n }\n\n return Object.entries(proxy).map(([context, target]) => {\n if (typeof target === \"string\") {\n return {\n context: [context],\n target,\n changeOrigin: true,\n secure: false,\n } as unknown as { context: string; target: string };\n }\n return {\n context: [context],\n changeOrigin: true,\n secure: false,\n ...(target as object),\n } as unknown as { context: string; target: string };\n });\n}\n\n/**\n * 创建开发环境 Rspack 配置\n */\nexport function createDevConfig(\n config: Required<YwkfConfig>,\n cwd: string\n): Configuration {\n const baseConfig = createBaseConfig(config, cwd);\n const { resolveApp } = createPathResolver(cwd);\n const { dev, style } = config;\n\n const styleRules: Configuration[\"module\"] = {\n rules: [\n // Less - antd\n {\n test: /\\.less$/,\n include: [\n /[\\\\/]node_modules[\\\\/].*antd/,\n /[\\\\/]node_modules[\\\\/]@4399ywkf[\\\\/]design/,\n ],\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n strictMath: false,\n math: \"always\",\n javascriptEnabled: true,\n },\n },\n },\n ],\n },\n // Less - 项目文件\n ...(style.less?.enabled !== false\n ? [\n {\n test: /\\.less$/,\n include: [resolveApp(\"src\")],\n exclude: [resolveApp(\"node_modules\")],\n oneOf: [\n {\n test: /\\.module\\.less$/,\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: {\n sourceMap: true,\n modules: {\n localIdentName:\n \"[path][name]__[local]--[hash:base64:5]\",\n },\n importLoaders: 2,\n },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n javascriptEnabled: true,\n math: \"always\",\n ...style.less?.lessOptions,\n },\n },\n },\n ],\n },\n {\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n javascriptEnabled: true,\n ...style.less?.lessOptions,\n },\n },\n },\n ],\n },\n ],\n },\n ]\n : []),\n // Sass\n ...(style.sass?.enabled !== false\n ? [\n {\n test: /\\.s[ac]ss$/i,\n include: [resolveApp(\"src\")],\n exclude: [resolveApp(\"node_modules\")],\n oneOf: [\n {\n test: /\\.module\\.s[ac]ss$/,\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: {\n sourceMap: true,\n modules: {\n localIdentName:\n \"[path][name]__[local]--[hash:base64:5]\",\n },\n importLoaders: 2,\n },\n },\n {\n loader: \"sass-loader\",\n options: {\n sourceMap: true,\n sassOptions: {\n outputStyle: \"compressed\",\n ...style.sass?.sassOptions,\n },\n },\n },\n ],\n },\n {\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"sass-loader\",\n options: {\n sourceMap: true,\n sassOptions: {\n outputStyle: \"compressed\",\n ...style.sass?.sassOptions,\n },\n },\n },\n ],\n },\n ],\n },\n ]\n : []),\n // TailwindCSS\n ...(style.tailwindcss\n ? [\n {\n test: /\\.css$/,\n include: [resolveApp(\"src/index.css\")],\n use: [\n \"style-loader\",\n \"css-loader\",\n {\n loader: \"postcss-loader\",\n options: {\n postcssOptions: {\n config: resolveApp(\"postcss.config.js\"),\n },\n },\n },\n ],\n },\n ]\n : []),\n // 其他 CSS\n {\n test: /\\.css$/,\n include: [resolveApp(\"src\"), resolveApp(\"node_modules\")],\n exclude: style.tailwindcss ? [resolveApp(\"src/index.css\")] : [],\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n ],\n },\n ],\n };\n\n const devConfig: Configuration = {\n mode: \"development\",\n devtool: \"inline-source-map\",\n\n output: {\n filename: \"[name].bundle.js\",\n clean: false,\n },\n\n stats: \"errors-only\",\n\n devServer: {\n host: dev.host,\n port: dev.port,\n compress: true,\n historyApiFallback: true,\n hot: true,\n allowedHosts: \"all\",\n client: {\n overlay: false,\n progress: true,\n },\n proxy: convertProxyToArray(dev.proxy),\n },\n\n module: styleRules,\n };\n\n return merge(baseConfig, devConfig);\n}\n","import { rspack, type Configuration } from \"@rspack/core\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport { YwkfGeneratorPlugin } from \"../generator/plugin.js\";\n\nconst require = createRequire(import.meta.url);\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst coreNodeModules = join(__dirname, \"../../node_modules\");\n\n/**\n * 创建基础 Rspack 配置\n */\nexport function createBaseConfig(\n config: Required<YwkfConfig>,\n cwd: string\n): Configuration {\n const { resolveApp } = createPathResolver(cwd);\n\n const {\n appName,\n appCName,\n output,\n html,\n alias: userAlias,\n microFrontend,\n router,\n } = config;\n\n // 约定式路由输出目录\n const ywkfOutputDir = resolveApp(\".ywkf\");\n\n const defaultAlias: Record<string, string> = {\n \"@\": resolveApp(\"src\"),\n \"@config\": resolveApp(\"config\"),\n \"@store\": resolveApp(\"store\"),\n \"@locales\": resolveApp(\"locales\"),\n \"@public\": resolveApp(\"public\"),\n // 约定式路由生成的文件\n \"@ywkf/routes\": join(ywkfOutputDir, \"routes.tsx\"),\n // 请求层(由 reactQueryPlugin 生成)\n \"@ywkf/request\": join(ywkfOutputDir, \"request.ts\"),\n // Store 工具(由 zustandPlugin 生成)\n \"@ywkf/store\": join(ywkfOutputDir, \"store.ts\"),\n };\n\n const alias = { ...defaultAlias, ...userAlias };\n\n return {\n // 使用 .ywkf/index.tsx 作为入口(由框架生成)\n entry: [join(ywkfOutputDir, \"index.tsx\")],\n\n resolve: {\n extensions: [\".ts\", \".tsx\", \".jsx\", \".js\", \".json\", \".mjs\"],\n symlinks: false,\n alias: {\n ...alias,\n \"process/browser.js\": require.resolve(\"process/browser.js\"),\n \"process/browser\": require.resolve(\"process/browser.js\"),\n // 确保 React 系列包从用户项目的 node_modules 解析\n react: resolveApp(\"node_modules/react\"),\n \"react-dom\": resolveApp(\"node_modules/react-dom\"),\n \"react-router\": resolveApp(\"node_modules/react-router\"),\n },\n fallback: {\n path: require.resolve(\"path-browserify\"),\n process: require.resolve(\"process/browser.js\"),\n buffer: require.resolve(\"buffer/\"),\n util: require.resolve(\"util/\"),\n stream: require.resolve(\"stream-browserify\"),\n crypto: require.resolve(\"crypto-browserify\"),\n zlib: require.resolve(\"browserify-zlib\"),\n querystring: require.resolve(\"querystring-es3\"),\n url: require.resolve(\"url/\"),\n assert: require.resolve(\"assert/\"),\n fs: false,\n net: false,\n tls: false,\n os: false,\n https: false,\n http: false,\n },\n },\n\n resolveLoader: {\n modules: [coreNodeModules, \"node_modules\"],\n },\n\n module: {\n rules: [\n {\n test: /\\.m?js$/,\n resolve: {\n fullySpecified: false,\n },\n },\n {\n test: /\\.[jt]sx?$/,\n include: [\n resolveApp(\"src\"),\n resolveApp(\"config\"),\n resolveApp(\"store\"),\n resolveApp(\"packages\"),\n ywkfOutputDir, // 约定式路由生成的文件\n ],\n exclude: [resolveApp(\"node_modules\")],\n use: [\n {\n loader: \"builtin:swc-loader\",\n options: {\n jsc: {\n parser: {\n syntax: \"typescript\",\n tsx: true,\n decorators: true,\n },\n transform: {\n react: {\n runtime: \"automatic\",\n },\n },\n target: \"es2015\",\n },\n sourceMaps: true,\n },\n },\n ],\n },\n {\n test: /\\.(png|jpg|jpeg|gif|webp|m3u8|exr|hdr|json|woff2)$/,\n include: [resolveApp(\"public\")],\n exclude: [resolveApp(\"src\"), resolveApp(\"store\")],\n type: \"asset\",\n parser: {\n dataUrlCondition: {\n maxSize: 10 * 1024,\n },\n },\n },\n {\n test: /\\.(md)$/,\n include: [resolveApp(\"src\")],\n type: \"asset/source\",\n },\n {\n test: /\\.svg$/,\n use: [\"@svgr/webpack\"],\n },\n ],\n },\n\n plugins: [\n new rspack.ProvidePlugin({\n process: \"process/browser.js\",\n Buffer: [\"buffer\", \"Buffer\"],\n }),\n new rspack.DefinePlugin({\n \"process.env\": JSON.stringify(process.env),\n }),\n new rspack.HtmlRspackPlugin({\n template: resolveApp(html.template ?? \"public/index.html\"),\n filename: \"index.html\",\n inject: \"body\",\n hash: true,\n minify: process.env.NODE_ENV === \"production\",\n favicon: resolveApp(html.favicon ?? \"public/favicon.ico\"),\n templateParameters: {\n title: html.title ?? appCName,\n mountRoot: html.mountRoot ?? appName,\n },\n }),\n new rspack.CopyRspackPlugin({\n patterns: [\n {\n from: resolveApp(\"public/images\"),\n to: \"public/images\",\n noErrorOnMissing: true,\n },\n ],\n }),\n // .ywkf 目录生成插件(传递用户配置的插件列表)\n new YwkfGeneratorPlugin({\n cwd,\n config,\n outputDir: ywkfOutputDir,\n isDev: process.env.NODE_ENV !== \"production\",\n pluginConfigs: config.plugins,\n }),\n ].filter(Boolean),\n\n output: {\n assetModuleFilename: \"images/[hash][ext]\",\n library: microFrontend.enabled ? `${appCName}-[name]` : undefined,\n chunkFilename: \"[name].[contenthash].js\",\n libraryTarget: microFrontend.enabled ? \"umd\" : undefined,\n globalObject: microFrontend.enabled ? \"window\" : undefined,\n chunkLoadingGlobal: microFrontend.enabled\n ? `chunk_global_${appName}`\n : undefined,\n publicPath: output.publicPath ?? \"/\",\n path: resolveApp(output.path ?? \"dist\"),\n },\n\n ignoreWarnings: [\n {\n module: /@testing-library\\/react/,\n message: /export 'act'/,\n },\n ],\n\n devtool: \"source-map\",\n };\n}\n","import type { Compiler } from \"@rspack/core\";\nimport { watch, existsSync } from \"fs\";\nimport { join } from \"path\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport type { YwkfPlugin, PluginHooks, PluginContext, PluginConfig } from \"../plugin/types.js\";\nimport { YwkfGenerator } from \"./generator.js\";\n\nexport interface YwkfGeneratorPluginOptions {\n /** 项目根目录 */\n cwd: string;\n /** 解析后的配置 */\n config: Required<YwkfConfig>;\n /** 输出目录(.ywkf) */\n outputDir: string;\n /** 是否开发模式 */\n isDev: boolean;\n /** 用户配置的插件列表(PluginConfig 格式) */\n pluginConfigs?: PluginConfig[];\n}\n\n/**\n * .ywkf 目录生成插件\n *\n * 在编译前生成 .ywkf 目录下的所有文件\n */\nexport class YwkfGeneratorPlugin {\n private options: YwkfGeneratorPluginOptions;\n private hasGenerated = false;\n private isWatching = false;\n private generator: YwkfGenerator | null = null;\n private pluginHooks: PluginHooks[] = [];\n private initialized = false;\n\n constructor(options: YwkfGeneratorPluginOptions) {\n this.options = options;\n }\n\n /**\n * 解析插件配置为插件实例\n */\n private async resolvePlugin(\n pluginConfig: PluginConfig\n ): Promise<YwkfPlugin | null> {\n try {\n let plugin: YwkfPlugin;\n let options: Record<string, unknown> = {};\n\n if (typeof pluginConfig === \"string\") {\n const module = await import(pluginConfig);\n plugin = module.default || module;\n } else if (Array.isArray(pluginConfig)) {\n const [pluginOrName, pluginOptions] = pluginConfig;\n options = pluginOptions;\n\n if (typeof pluginOrName === \"string\") {\n const module = await import(pluginOrName);\n plugin = module.default || module;\n } else {\n plugin = pluginOrName;\n }\n } else {\n plugin = pluginConfig;\n }\n\n // 如果是工厂函数,调用它\n if (typeof plugin === \"function\") {\n plugin = (plugin as (opts?: Record<string, unknown>) => YwkfPlugin)(options);\n }\n\n return plugin;\n } catch (error) {\n console.error(`[ywkf] 解析插件失败: ${error}`);\n return null;\n }\n }\n\n /**\n * 初始化插件钩子\n */\n private async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n const { cwd, config, isDev, pluginConfigs = [] } = this.options;\n\n // 创建插件上下文\n const context: PluginContext = {\n cwd,\n isDev,\n isProd: !isDev,\n config,\n logger: {\n info: (msg) => console.log(`[ywkf] ${msg}`),\n warn: (msg) => console.warn(`[ywkf] ${msg}`),\n error: (msg) => console.error(`[ywkf] ${msg}`),\n debug: (msg) => {\n if (process.env.DEBUG) {\n console.log(`[ywkf:debug] ${msg}`);\n }\n },\n },\n };\n\n // 解析并初始化所有插件,收集钩子\n for (const pluginConfig of pluginConfigs) {\n const plugin = await this.resolvePlugin(pluginConfig);\n if (plugin) {\n const hooks = await plugin.setup(context);\n this.pluginHooks.push(hooks);\n console.log(`[ywkf] 插件已加载: ${plugin.name}`);\n }\n }\n\n // 创建生成器\n this.generator = new YwkfGenerator(\n {\n cwd: this.options.cwd,\n config: this.options.config,\n outputDir: this.options.outputDir,\n isDev: this.options.isDev,\n },\n this.pluginHooks\n );\n\n this.initialized = true;\n }\n\n apply(compiler: Compiler): void {\n const pluginName = \"YwkfGeneratorPlugin\";\n\n // 在编译开始前生成代码\n compiler.hooks.beforeCompile.tapAsync(pluginName, async (params, callback) => {\n try {\n // 确保初始化完成\n await this.initialize();\n\n if (!this.hasGenerated && this.generator) {\n await this.generator.generate();\n this.hasGenerated = true;\n }\n callback();\n } catch (error) {\n callback(error as Error);\n }\n });\n\n // 开发模式下监听文件变化\n if (this.options.isDev && !this.isWatching) {\n this.watchPages();\n }\n }\n\n /**\n * 监听页面目录变化\n */\n private watchPages(): void {\n const { config, cwd } = this.options;\n const pagesDir = join(cwd, config.router.pagesDir || \"src/pages\");\n\n if (!existsSync(pagesDir)) {\n return;\n }\n\n this.isWatching = true;\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const watcher = watch(\n pagesDir,\n { recursive: true },\n (eventType, filename) => {\n // 只处理 tsx/jsx 文件\n if (!filename?.match(/\\.(tsx?|jsx?)$/)) {\n return;\n }\n\n // 防抖处理\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n console.log(`[ywkf] 检测到页面变化: ${filename}`);\n if (this.generator) {\n await this.generator.generate();\n }\n }, 500);\n }\n );\n\n // 进程退出时关闭监听\n process.on(\"exit\", () => {\n watcher.close();\n });\n }\n}\n","import { existsSync, mkdirSync, writeFileSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport type {\n PluginHooks,\n GeneratorContext,\n CodeInjection,\n GeneratedFile,\n} from \"../plugin/types.js\";\nimport { ConventionalRouteGenerator } from \"../router/generator.js\";\nimport { generateEntry } from \"./templates/entry.js\";\nimport { generateBootstrap } from \"./templates/bootstrap.js\";\nimport { generateEnvTypes } from \"./templates/env-types.js\";\nimport { generateRouteTypes } from \"./templates/route-types.js\";\n\n/**\n * 插件钩子执行器\n */\nexport interface PluginHooksRunner {\n hooks: PluginHooks[];\n}\n\n/**\n * .ywkf 目录代码生成器\n *\n * 生成的文件:\n * - index.tsx - 应用入口\n * - routes.tsx - 约定式路由\n * - bootstrap.tsx - 启动逻辑\n * - types/routes.d.ts - 路由类型\n * - types/env.d.ts - 环境变量类型\n * - config.json - 配置快照\n */\nexport class YwkfGenerator {\n private context: GeneratorContext;\n private pluginHooks: PluginHooks[];\n private lastGeneratedContent: Map<string, string> = new Map();\n\n constructor(\n context: Omit<GeneratorContext, \"outputDir\"> & { outputDir?: string },\n pluginHooks: PluginHooks[] = []\n ) {\n this.context = {\n ...context,\n outputDir: context.outputDir || join(context.cwd, \".ywkf\"),\n };\n this.pluginHooks = pluginHooks;\n }\n\n /**\n * 生成所有文件\n */\n async generate(): Promise<void> {\n const { outputDir } = this.context;\n\n // 确保目录存在\n this.ensureDir(outputDir);\n this.ensureDir(join(outputDir, \"types\"));\n\n // 生成各个文件\n this.generateConfigSnapshot();\n this.generateRoutes();\n this.generateBootstrapFile();\n this.generateEntryFile();\n this.generateTypes();\n\n // 生成插件附加文件\n await this.generatePluginFiles();\n\n // 调用插件 afterGenerate 钩子\n for (const hooks of this.pluginHooks) {\n if (hooks.afterGenerate) {\n await hooks.afterGenerate(this.context);\n }\n }\n\n console.log(`[ywkf] 已生成 .ywkf 目录`);\n }\n\n /**\n * 生成配置快照\n */\n private generateConfigSnapshot(): void {\n const { outputDir, config } = this.context;\n const configPath = join(outputDir, \"config.json\");\n\n // 移除函数类型的配置(无法序列化)\n const serializableConfig = JSON.parse(\n JSON.stringify(config, (key, value) => {\n if (typeof value === \"function\") {\n return \"[Function]\";\n }\n return value;\n })\n );\n\n this.writeFileIfChanged(\n configPath,\n JSON.stringify(serializableConfig, null, 2)\n );\n }\n\n /**\n * 生成约定式路由\n */\n private generateRoutes(): void {\n const { cwd, outputDir, config } = this.context;\n\n if (!config.router.conventional) {\n return;\n }\n\n const pagesDir = join(cwd, config.router.pagesDir || \"src/pages\");\n const generator = new ConventionalRouteGenerator({\n pagesDir,\n outputDir,\n basename: config.router.basename,\n });\n\n const content = generator.generateCode();\n const routesPath = join(outputDir, \"routes.tsx\");\n\n this.writeFileIfChanged(routesPath, content);\n }\n\n /**\n * 生成启动文件\n */\n private generateBootstrapFile(): void {\n const { outputDir, config } = this.context;\n\n // 收集插件注入\n const injections = this.collectInjections(\"bootstrap\");\n\n // 生成基础代码\n let content = generateBootstrap(config, injections);\n\n // 调用插件修改钩子\n for (const hooks of this.pluginHooks) {\n if (hooks.modifyBootstrapCode) {\n const result = hooks.modifyBootstrapCode(content, this.context);\n if (result) {\n content = result;\n }\n }\n }\n\n const bootstrapPath = join(outputDir, \"bootstrap.tsx\");\n this.writeFileIfChanged(bootstrapPath, content);\n }\n\n /**\n * 生成入口文件\n */\n private generateEntryFile(): void {\n const { outputDir, config } = this.context;\n\n // 收集插件注入\n const injections = this.collectInjections(\"entry\");\n\n // 生成基础代码\n let content = generateEntry(config, injections);\n\n // 调用插件修改钩子\n for (const hooks of this.pluginHooks) {\n if (hooks.modifyEntryCode) {\n const result = hooks.modifyEntryCode(content, this.context);\n if (result) {\n content = result;\n }\n }\n }\n\n const entryPath = join(outputDir, \"index.tsx\");\n this.writeFileIfChanged(entryPath, content);\n }\n\n /**\n * 收集插件代码注入\n */\n private collectInjections(\n type: \"entry\" | \"bootstrap\"\n ): CodeInjection {\n const result: CodeInjection = {\n imports: [],\n topLevel: [],\n exports: [],\n };\n\n const hookName = type === \"entry\" ? \"injectEntry\" : \"injectBootstrap\";\n\n for (const hooks of this.pluginHooks) {\n const hook = hooks[hookName];\n if (hook) {\n const injection = hook(this.context);\n if (injection) {\n result.imports?.push(...(injection.imports || []));\n result.topLevel?.push(...(injection.topLevel || []));\n result.exports?.push(...(injection.exports || []));\n }\n }\n }\n\n return result;\n }\n\n /**\n * 生成插件附加文件\n */\n private async generatePluginFiles(): Promise<void> {\n const { outputDir } = this.context;\n\n for (const hooks of this.pluginHooks) {\n if (hooks.generateFiles) {\n const files = hooks.generateFiles(this.context);\n if (files) {\n for (const file of files) {\n const filePath = join(outputDir, file.path);\n const dir = join(filePath, \"..\");\n this.ensureDir(dir);\n this.writeFileIfChanged(filePath, file.content);\n }\n }\n }\n }\n }\n\n /**\n * 生成类型定义\n */\n private generateTypes(): void {\n const { outputDir, config, cwd } = this.context;\n\n // 生成环境变量类型\n const envTypesContent = generateEnvTypes(cwd, config);\n this.writeFileIfChanged(\n join(outputDir, \"types\", \"env.d.ts\"),\n envTypesContent\n );\n\n // 生成路由类型\n if (config.router.conventional) {\n const routeTypesContent = generateRouteTypes();\n this.writeFileIfChanged(\n join(outputDir, \"types\", \"routes.d.ts\"),\n routeTypesContent\n );\n }\n }\n\n /**\n * 确保目录存在\n */\n private ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n /**\n * 只在内容变化时写入文件(避免触发不必要的热更新)\n */\n private writeFileIfChanged(filePath: string, content: string): void {\n const normalizedContent = this.normalizeContent(content);\n const lastContent = this.lastGeneratedContent.get(filePath);\n\n if (lastContent === normalizedContent) {\n return;\n }\n\n // 检查文件是否存在且内容相同\n if (existsSync(filePath)) {\n const existingContent = readFileSync(filePath, \"utf-8\");\n if (this.normalizeContent(existingContent) === normalizedContent) {\n this.lastGeneratedContent.set(filePath, normalizedContent);\n return;\n }\n }\n\n writeFileSync(filePath, content, \"utf-8\");\n this.lastGeneratedContent.set(filePath, normalizedContent);\n }\n\n /**\n * 标准化内容(去掉时间戳等动态部分)\n */\n private normalizeContent(content: string): string {\n return content\n .replace(/\\/\\/ Generated at: .+/g, \"\")\n .replace(/\\/\\*\\* Generated at: .+ \\*\\//g, \"\");\n }\n}\n","import { existsSync, readdirSync, statSync, mkdirSync, writeFileSync } from \"fs\";\nimport { join, relative, basename } from \"path\";\n\n/**\n * 路由节点配置\n */\nexport interface RouteConfig {\n /** 路由路径 */\n path: string;\n /** 页面文件(page.tsx)相对路径 */\n file?: string;\n /** 布局文件(layout.tsx)相对路径 */\n layoutFile?: string;\n /** 错误边界文件(error.tsx)相对路径 */\n errorFile?: string;\n /** 加载状态文件(loading.tsx)相对路径 */\n loadingFile?: string;\n /** 通配路由文件($.tsx)相对路径 */\n catchAllFile?: string;\n /** 组件名称 */\n name: string;\n /** 子路由 */\n children?: RouteConfig[];\n /** 是否为 index 路由 */\n index?: boolean;\n /** 是否为布局路由 */\n isLayout?: boolean;\n /** 是否为无路径布局(__prefix) */\n pathless?: boolean;\n}\n\nexport interface GeneratorOptions {\n /** 页面目录 */\n pagesDir: string;\n /** 输出目录 */\n outputDir: string;\n /** 路由 basename */\n basename?: string;\n}\n\n/**\n * 不参与路由扫描的目录名\n */\nconst EXCLUDED_DIRS = new Set([\n \"components\",\n \"hooks\",\n \"utils\",\n \"services\",\n \"models\",\n \"assets\",\n \"types\",\n \"constants\",\n \"styles\",\n]);\n\n/**\n * 约定文件名匹配\n */\nconst CONVENTION_FILES = {\n page: /^page\\.(tsx?|jsx?)$/,\n layout: /^layout\\.(tsx?|jsx?)$/,\n error: /^error\\.(tsx?|jsx?)$/,\n loading: /^loading\\.(tsx?|jsx?)$/,\n catchAll: /^\\$\\.(tsx?|jsx?)$/,\n};\n\n/**\n * Modern.js 风格约定式路由生成器\n *\n * 文件约定:\n * - page.tsx — 页面内容(叶子组件)\n * - layout.tsx — 布局组件(使用 <Outlet> 渲染子路由)\n * - error.tsx — 错误边界组件\n * - loading.tsx — 加载状态组件\n * - $.tsx — 通配/404 路由\n *\n * 目录约定:\n * - [id]/ — 动态路由 → /:id\n * - [id$]/ — 可选动态路由 → /:id?\n * - [...slug]/ — 全匹配路由 → /*\n * - __auth/ — 无路径布局(不生成 URL 片段)\n * - user.profile/ — 扁平路由(. 分隔 → /user/profile)\n */\nexport class ConventionalRouteGenerator {\n private options: GeneratorOptions;\n\n constructor(options: GeneratorOptions) {\n this.options = options;\n }\n\n generate(): RouteConfig[] {\n const { pagesDir } = this.options;\n if (!existsSync(pagesDir)) {\n console.warn(`[ywkf] 页面目录不存在: ${pagesDir}`);\n return [];\n }\n return this.scanDirectory(pagesDir, \"/\");\n }\n\n /**\n * 扫描目录,生成路由树\n */\n private scanDirectory(dir: string, routePath: string): RouteConfig[] {\n const entries = readdirSync(dir);\n\n // 查找约定文件\n const layoutFile = entries.find((e) => CONVENTION_FILES.layout.test(e));\n const pageFile = entries.find((e) => CONVENTION_FILES.page.test(e));\n const errorFile = entries.find((e) => CONVENTION_FILES.error.test(e));\n const loadingFile = entries.find((e) => CONVENTION_FILES.loading.test(e));\n const catchAllFile = entries.find((e) => CONVENTION_FILES.catchAll.test(e));\n\n // 收集子目录\n const subDirs = entries.filter((e) => {\n if (e.startsWith(\".\")) return false;\n if (EXCLUDED_DIRS.has(e)) return false;\n return statSync(join(dir, e)).isDirectory();\n });\n\n // 递归子目录\n const childRoutes: RouteConfig[] = [];\n for (const subDir of subDirs) {\n const subDirPath = join(dir, subDir);\n\n // __prefix:无路径布局\n if (subDir.startsWith(\"__\")) {\n const pathlessRoutes = this.scanDirectory(subDirPath, routePath);\n // 如果该无路径目录有 layout,将子路由包装在其中\n const pathlessLayout = readdirSync(subDirPath).find((e) =>\n CONVENTION_FILES.layout.test(e)\n );\n if (pathlessLayout) {\n const pathlessChildren = this.scanDirectory(subDirPath, routePath);\n childRoutes.push({\n path: routePath,\n name: this.generateRouteName(subDir.slice(2)),\n layoutFile: relative(this.options.pagesDir, join(subDirPath, pathlessLayout)),\n isLayout: true,\n pathless: true,\n children: pathlessChildren.filter(\n (r) => r.layoutFile !== relative(this.options.pagesDir, join(subDirPath, pathlessLayout))\n ),\n });\n } else {\n childRoutes.push(...pathlessRoutes);\n }\n continue;\n }\n\n // 计算路由路径\n const subRoutePath = this.resolveRoutePath(subDir, routePath);\n childRoutes.push(...this.scanDirectory(subDirPath, subRoutePath));\n }\n\n // 构建当前目录的路由节点\n const routeName = this.generateRouteName(routePath);\n const relPath = (file: string) => relative(this.options.pagesDir, join(dir, file));\n\n // 有 layout.tsx → 创建布局路由节点,children 为子路由\n if (layoutFile) {\n const layoutChildren: RouteConfig[] = [];\n\n // page.tsx 作为 index 子路由\n if (pageFile) {\n layoutChildren.push({\n path: routePath,\n file: relPath(pageFile),\n name: routeName + \"Index\",\n index: true,\n });\n }\n\n // 通配路由\n if (catchAllFile) {\n layoutChildren.push({\n path: \"*\",\n file: relPath(catchAllFile),\n name: routeName + \"CatchAll\",\n });\n }\n\n layoutChildren.push(...childRoutes);\n\n return [\n {\n path: routePath,\n layoutFile: relPath(layoutFile),\n errorFile: errorFile ? relPath(errorFile) : undefined,\n loadingFile: loadingFile ? relPath(loadingFile) : undefined,\n name: routeName,\n isLayout: true,\n children: layoutChildren,\n },\n ];\n }\n\n // 无 layout → page.tsx 是叶子页面\n const result: RouteConfig[] = [];\n\n if (pageFile) {\n result.push({\n path: routePath,\n file: relPath(pageFile),\n errorFile: errorFile ? relPath(errorFile) : undefined,\n name: routeName,\n });\n }\n\n if (catchAllFile) {\n result.push({\n path: \"*\",\n file: relPath(catchAllFile),\n name: routeName + \"CatchAll\",\n });\n }\n\n result.push(...childRoutes);\n return result;\n }\n\n /**\n * 解析目录名到路由路径\n *\n * - [id] → :id\n * - [id$] → :id?\n * - [...slug] → *\n * - user.profile → user/profile\n */\n private resolveRoutePath(dirName: string, parentPath: string): string {\n let segment: string;\n\n // [...slug] → *\n if (dirName.match(/^\\[\\.\\.\\.(.+)\\]$/)) {\n segment = \"*\";\n }\n // [id$] → :id? (可选动态)\n else if (dirName.match(/^\\[(.+)\\$\\]$/)) {\n const param = dirName.slice(1, -2);\n segment = `:${param}?`;\n }\n // [id] → :id\n else if (dirName.match(/^\\[(.+)\\]$/)) {\n const param = dirName.slice(1, -1);\n segment = `:${param}`;\n }\n // user.profile → user/profile (扁平路由)\n else if (dirName.includes(\".\")) {\n segment = dirName.replace(/\\./g, \"/\");\n } else {\n segment = dirName;\n }\n\n return parentPath === \"/\"\n ? `/${segment}`\n : `${parentPath}/${segment}`;\n }\n\n /**\n * 生成有效的 JS 标识符名称\n */\n private generateRouteName(path: string): string {\n const name = path\n .split(\"/\")\n .filter(Boolean)\n .map((s) =>\n s\n .replace(/^:/, \"Param\")\n .replace(/\\?$/, \"Optional\")\n .replace(/^\\*$/, \"CatchAll\")\n )\n .map((s) => {\n const cleaned = s.replace(/[^a-zA-Z0-9]/g, \"\");\n if (!cleaned) return \"\";\n return cleaned.charAt(0).toUpperCase() + cleaned.slice(1);\n })\n .join(\"\");\n\n if (!name || /^\\d/.test(name)) {\n return \"Page\" + (name || \"Root\");\n }\n return name;\n }\n\n // ===== 代码生成 =====\n\n generateCode(): string {\n const routes = this.generate();\n const lazyImports: string[] = [];\n const errorImports: string[] = [];\n const loadingImports: string[] = [];\n\n this.collectImports(routes, lazyImports, errorImports, loadingImports);\n\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\nimport React, { lazy, Suspense } from \"react\";\nimport { createBrowserRouter, type RouteObject } from \"react-router\";\n\n// 懒加载页面组件\n${lazyImports.join(\"\\n\")}\n${errorImports.length > 0 ? \"\\n// 错误边界组件\\n\" + errorImports.join(\"\\n\") : \"\"}\n${loadingImports.length > 0 ? \"\\n// 加载状态组件\\n\" + loadingImports.join(\"\\n\") : \"\"}\n\n// 默认加载状态\nconst DefaultLoading = () => <div style={{ padding: 24, textAlign: \"center\" }}>加载中...</div>;\n\n// 懒加载包装\nfunction LazyRoute({\n Component,\n Loading = DefaultLoading,\n}: {\n Component: React.LazyExoticComponent<React.ComponentType<unknown>>;\n Loading?: React.ComponentType;\n}) {\n return (\n <Suspense fallback={<Loading />}>\n <Component />\n </Suspense>\n );\n}\n\n// 路由配置\nexport const routes: RouteObject[] = ${this.emitRouteArray(routes)};\n\n/**\n * 创建路由实例\n */\nexport function createRouter(basename?: string) {\n return createBrowserRouter(routes, { basename: basename || \"/\" });\n}\n\nexport default routes;\n`;\n }\n\n private collectImports(\n routes: RouteConfig[],\n lazyImports: string[],\n errorImports: string[],\n loadingImports: string[]\n ): void {\n for (const route of routes) {\n const name = route.name;\n const toImportPath = (f: string) => f.replace(/\\.(tsx?|jsx?)$/, \"\");\n\n if (route.isLayout && route.layoutFile) {\n lazyImports.push(\n `const ${name}Layout = lazy(() => import(\"@/pages/${toImportPath(route.layoutFile)}\"));`\n );\n }\n if (route.file) {\n lazyImports.push(\n `const ${name}Page = lazy(() => import(\"@/pages/${toImportPath(route.file)}\"));`\n );\n }\n if (route.errorFile) {\n errorImports.push(\n `const ${name}Error = lazy(() => import(\"@/pages/${toImportPath(route.errorFile)}\"));`\n );\n }\n if (route.loadingFile) {\n loadingImports.push(\n `const ${name}Loading = lazy(() => import(\"@/pages/${toImportPath(route.loadingFile)}\"));`\n );\n }\n\n if (route.children) {\n this.collectImports(route.children, lazyImports, errorImports, loadingImports);\n }\n }\n }\n\n private emitRouteArray(routes: RouteConfig[], parentPath?: string): string {\n const items = routes.map((r) => this.emitRouteObject(r, parentPath));\n return `[\\n ${items.join(\",\\n \")}\\n]`;\n }\n\n private emitRouteObject(route: RouteConfig, parentPath?: string): string {\n const parts: string[] = [];\n const name = route.name;\n\n // path\n if (route.index) {\n parts.push(\"index: true\");\n } else if (route.pathless) {\n // 无路径布局不输出 path\n } else if (route.path === \"*\") {\n parts.push(`path: \"*\"`);\n } else if (parentPath && route.path.startsWith(parentPath) && parentPath !== \"/\") {\n const rel = route.path.slice(parentPath.length + 1);\n parts.push(`path: \"${rel || \"\"}\"`);\n } else {\n parts.push(`path: \"${route.path}\"`);\n }\n\n // element\n if (route.isLayout && route.layoutFile) {\n const loadingProp = route.loadingFile ? ` Loading={${name}Loading}` : \"\";\n parts.push(`element: <LazyRoute Component={${name}Layout}${loadingProp} />`);\n } else if (route.file) {\n parts.push(`element: <LazyRoute Component={${name}Page} />`);\n }\n\n // errorElement\n if (route.errorFile) {\n parts.push(`errorElement: <LazyRoute Component={${name}Error} />`);\n }\n\n // children\n if (route.children && route.children.length > 0) {\n const childParent = route.pathless ? parentPath : route.path;\n parts.push(`children: ${this.emitRouteArray(route.children, childParent)}`);\n }\n\n return `{\\n ${parts.join(\",\\n \")}\\n }`;\n }\n\n /**\n * 写入路由文件\n */\n write(): void {\n const { outputDir } = this.options;\n const code = this.generateCode();\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n writeFileSync(join(outputDir, \"routes.tsx\"), code, \"utf-8\");\n console.log(`[ywkf] 约定式路由已生成`);\n }\n}\n\n/**\n * 生成约定式路由\n */\nexport function generateConventionalRoutes(options: GeneratorOptions): void {\n new ConventionalRouteGenerator(options).write();\n}\n","import type { YwkfConfig } from \"../../config/schema.js\";\nimport type { CodeInjection } from \"../../plugin/types.js\";\n\n/**\n * 生成应用入口文件 (.ywkf/index.tsx)\n *\n * 基础版本只负责启动应用,微前端等功能通过插件注入\n */\nexport function generateEntry(\n config: Required<YwkfConfig>,\n injections: CodeInjection = {}\n): string {\n const imports = [\n `import \"@/index.css\";`,\n `import { runApp } from \"./bootstrap\";`,\n ...(injections.imports || []),\n ];\n\n const topLevel = injections.topLevel || [];\n const exports = injections.exports || [];\n\n // 如果有插件注入的 exports(比如微前端),使用条件启动\n const hasPluginExports = exports.length > 0;\n\n const startupCode = hasPluginExports\n ? `// 独立运行模式\nif (shouldRunIndependently !== false) {\n runApp();\n}`\n : `// 启动应用\nrunApp();`;\n\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\n${imports.join(\"\\n\")}\n\n${topLevel.length > 0 ? topLevel.join(\"\\n\") + \"\\n\" : \"\"}${exports.length > 0 ? exports.join(\"\\n\") + \"\\n\\n\" : \"\"}${startupCode}\n`;\n}\n","import type { YwkfConfig } from \"../../config/schema.js\";\nimport type { CodeInjection } from \"../../plugin/types.js\";\n\n/**\n * 生成启动文件 (.ywkf/bootstrap.tsx)\n *\n * 基础版本包含应用启动核心逻辑,微前端等功能通过插件注入\n */\nexport function generateBootstrap(\n config: Required<YwkfConfig>,\n injections: CodeInjection = {}\n): string {\n const { appName, router } = config;\n\n const routerImport = router.conventional\n ? `import { createRouter } from \"./routes\";`\n : `import { createRouter } from \"@/routes\";`;\n\n const imports = [\n `import { bootstrap, type AppConfig } from \"@4399ywkf/core/runtime\";`,\n routerImport,\n ...(injections.imports || []),\n ];\n\n const topLevel = injections.topLevel || [];\n const exports = injections.exports || [];\n\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\n${imports.join(\"\\n\")}\n\n/**\n * 应用名称\n */\nexport const APP_NAME = \"${appName}\";\n\n/**\n * 路由 basename\n */\nexport const BASENAME = \"${router.basename || \"/\"}\";\n\n/**\n * 获取用户自定义配置(如果存在)\n * 用户可在 src/app.config.ts 中导出配置来覆盖默认值\n */\nasync function getUserConfig(): Promise<Partial<AppConfig>> {\n try {\n // webpackIgnore 注释让打包器跳过模块存在性检查\n const userConfigModule = await import(/* webpackIgnore: true */ \"@/app.config\");\n return userConfigModule.default || {};\n } catch {\n // 文件不存在时返回空配置\n return {};\n }\n}\n\n/**\n * 创建应用配置\n */\nexport function createAppConfig(userConfig: Partial<AppConfig> = {}): AppConfig {\n const router = createRouter(BASENAME);\n\n const defaultConfig: AppConfig = {\n appName: APP_NAME,\n router,\n basename: BASENAME,\n rootId: APP_NAME,\n strictMode: true,\n antd: {\n enabled: true,\n },\n providers: [],\n lifecycle: {\n onMounted() {\n console.log(\\`[\\${APP_NAME}] 应用已挂载\\`);\n },\n onUnmount() {\n console.log(\\`[\\${APP_NAME}] 应用已卸载\\`);\n },\n onError(error) {\n console.error(\\`[\\${APP_NAME}] 全局错误:\\`, error);\n },\n },\n };\n\n // 深度合并用户配置\n return {\n ...defaultConfig,\n ...userConfig,\n antd: { ...defaultConfig.antd, ...userConfig.antd },\n providers: [...(defaultConfig.providers || []), ...(userConfig.providers || [])],\n lifecycle: { ...defaultConfig.lifecycle, ...userConfig.lifecycle },\n };\n}\n\n/**\n * 启动应用\n */\nexport async function runApp(): Promise<void> {\n const userConfig = await getUserConfig();\n await bootstrap(createAppConfig(userConfig));\n}\n${topLevel.length > 0 ? \"\\n\" + topLevel.join(\"\\n\") : \"\"}\n${exports.length > 0 ? \"\\n\" + exports.join(\"\\n\") : \"\"}\n`;\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { YwkfConfig } from \"../../config/schema.js\";\n\n/**\n * 生成环境变量类型定义 (.ywkf/types/env.d.ts)\n */\nexport function generateEnvTypes(\n cwd: string,\n config: Required<YwkfConfig>\n): string {\n const envVars = collectEnvVars(cwd, config);\n\n const envInterface = envVars\n .map((key) => ` readonly ${key}: string;`)\n .join(\"\\n\");\n\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\n/// <reference types=\"react\" />\n/// <reference types=\"react-dom\" />\n\ndeclare namespace NodeJS {\n interface ProcessEnv {\n${envInterface}\n readonly NODE_ENV: \"development\" | \"production\" | \"test\";\n }\n}\n\ndeclare module \"*.svg\" {\n import * as React from \"react\";\n const ReactComponent: React.FunctionComponent<\n React.SVGProps<SVGSVGElement> & { title?: string }\n >;\n export default ReactComponent;\n}\n\ndeclare module \"*.png\" {\n const src: string;\n export default src;\n}\n\ndeclare module \"*.jpg\" {\n const src: string;\n export default src;\n}\n\ndeclare module \"*.jpeg\" {\n const src: string;\n export default src;\n}\n\ndeclare module \"*.gif\" {\n const src: string;\n export default src;\n}\n\ndeclare module \"*.webp\" {\n const src: string;\n export default src;\n}\n\ndeclare module \"*.css\" {\n const classes: { readonly [key: string]: string };\n export default classes;\n}\n\ndeclare module \"*.less\" {\n const classes: { readonly [key: string]: string };\n export default classes;\n}\n\ndeclare module \"*.scss\" {\n const classes: { readonly [key: string]: string };\n export default classes;\n}\n\ndeclare module \"*.md\" {\n const content: string;\n export default content;\n}\n`;\n}\n\n/**\n * 收集环境变量\n */\nfunction collectEnvVars(cwd: string, config: Required<YwkfConfig>): string[] {\n const envVars = new Set<string>();\n\n // 从 .env.public 读取\n const publicEnvPath = join(cwd, config.env.publicEnvFile || \"config/env/.env.public\");\n if (existsSync(publicEnvPath)) {\n const content = readFileSync(publicEnvPath, \"utf-8\");\n parseEnvFile(content, envVars);\n }\n\n // 从 .env.development 读取\n const devEnvPath = join(cwd, config.env.envDir || \"config/env\", \".env.development\");\n if (existsSync(devEnvPath)) {\n const content = readFileSync(devEnvPath, \"utf-8\");\n parseEnvFile(content, envVars);\n }\n\n // 从 .env.production 读取\n const prodEnvPath = join(cwd, config.env.envDir || \"config/env\", \".env.production\");\n if (existsSync(prodEnvPath)) {\n const content = readFileSync(prodEnvPath, \"utf-8\");\n parseEnvFile(content, envVars);\n }\n\n return Array.from(envVars).sort();\n}\n\n/**\n * 解析 .env 文件\n */\nfunction parseEnvFile(content: string, envVars: Set<string>): void {\n const lines = content.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue;\n }\n const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)\\s*=/);\n if (match) {\n envVars.add(match[1]);\n }\n }\n}\n","/**\n * 生成路由类型定义 (.ywkf/types/routes.d.ts)\n */\nexport function generateRouteTypes(): string {\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\nimport type { RouteObject } from \"react-router\";\n\ndeclare module \"@ywkf/routes\" {\n export const routes: RouteObject[];\n export function createRouter(basename?: string): ReturnType<typeof import(\"react-router\").createBrowserRouter>;\n export default routes;\n}\n`;\n}\n","import { rspack, type Configuration } from \"@rspack/core\";\nimport { merge } from \"webpack-merge\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport { createBaseConfig } from \"./base.js\";\n\n/**\n * 创建生产环境 Rspack 配置\n */\nexport function createProdConfig(\n config: Required<YwkfConfig>,\n cwd: string\n): Configuration {\n const baseConfig = createBaseConfig(config, cwd);\n const { resolveApp } = createPathResolver(cwd);\n const { style, performance, output } = config;\n\n const styleRules: Configuration[\"module\"] = {\n rules: [\n // Less - antd\n {\n test: /\\.less$/,\n include: [\n /[\\\\/]node_modules[\\\\/].*antd/,\n /[\\\\/]node_modules[\\\\/]@4399ywkf[\\\\/]design/,\n ],\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n strictMath: false,\n math: \"always\",\n javascriptEnabled: true,\n },\n },\n },\n ],\n },\n // Less - 项目文件\n ...(style.less?.enabled !== false\n ? [\n {\n test: /\\.less$/,\n include: [resolveApp(\"src\")],\n exclude: [resolveApp(\"node_modules\")],\n oneOf: [\n {\n test: /\\.module\\.less$/,\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: {\n sourceMap: true,\n modules: {\n localIdentName:\n \"[path][name]__[local]--[hash:base64:5]\",\n },\n importLoaders: 2,\n },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n javascriptEnabled: true,\n ...style.less?.lessOptions,\n },\n },\n },\n ],\n },\n {\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"less-loader\",\n options: {\n sourceMap: true,\n lessOptions: {\n javascriptEnabled: true,\n ...style.less?.lessOptions,\n },\n },\n },\n ],\n },\n ],\n },\n ]\n : []),\n // Sass\n ...(style.sass?.enabled !== false\n ? [\n {\n test: /\\.s[ac]ss$/i,\n include: [resolveApp(\"src\")],\n exclude: [resolveApp(\"node_modules\")],\n oneOf: [\n {\n test: /\\.module\\.s[ac]ss$/,\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: {\n sourceMap: true,\n modules: {\n localIdentName:\n \"[path][name]__[local]--[hash:base64:5]\",\n },\n importLoaders: 2,\n },\n },\n {\n loader: \"sass-loader\",\n options: {\n sourceMap: true,\n sassOptions: {\n outputStyle: \"compressed\",\n ...style.sass?.sassOptions,\n },\n },\n },\n ],\n },\n {\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n {\n loader: \"sass-loader\",\n options: {\n sourceMap: true,\n sassOptions: {\n outputStyle: \"compressed\",\n ...style.sass?.sassOptions,\n },\n },\n },\n ],\n },\n ],\n },\n ]\n : []),\n // TailwindCSS\n ...(style.tailwindcss\n ? [\n {\n test: /\\.css$/,\n include: [resolveApp(\"src/index.css\")],\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n \"css-loader\",\n {\n loader: \"postcss-loader\",\n options: {\n postcssOptions: {\n config: resolveApp(\"postcss.config.js\"),\n },\n },\n },\n ],\n },\n ]\n : []),\n // src 目录中的其他 CSS\n {\n test: /\\.css$/,\n include: [resolveApp(\"src\")],\n exclude: style.tailwindcss ? [resolveApp(\"src/index.css\")] : [],\n use: [\n { loader: rspack.CssExtractRspackPlugin.loader },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n ],\n },\n // node_modules CSS\n {\n test: /\\.css$/,\n include: [resolveApp(\"node_modules\")],\n use: [\n { loader: \"style-loader\" },\n {\n loader: \"css-loader\",\n options: { sourceMap: true },\n },\n ],\n },\n ],\n };\n\n const prodConfig: Configuration = {\n mode: \"production\",\n devtool: \"hidden-source-map\",\n\n output: {\n filename: \"[name].[contenthash].bundle.js\",\n chunkFilename: \"[name].[contenthash].chunk.js\",\n clean: output.clean,\n },\n\n module: styleRules,\n\n plugins: [\n new rspack.CssExtractRspackPlugin({\n filename: \"[name].[contenthash:8].css\",\n chunkFilename: \"[name].[contenthash:8].chunk.css\",\n }),\n ],\n\n optimization: {\n minimize: true,\n minimizer: [\n new rspack.SwcJsMinimizerRspackPlugin({\n exclude: [resolveApp(\"node_modules\")],\n minimizerOptions: {\n compress: {\n pure_funcs: performance.dropConsole\n ? [\"console.log\", \"console.info\", \"console.debug\", \"console.warn\"]\n : [\"console.info\", \"console.debug\"],\n drop_console: false,\n drop_debugger: true,\n },\n },\n }),\n new rspack.LightningCssMinimizerRspackPlugin(),\n ],\n },\n };\n\n return merge(baseConfig, prodConfig);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport dotenv from \"dotenv\";\nimport type { YwkfConfig } from \"../config/schema.js\";\n\n/**\n * 预加载环境变量(在配置解析之前)\n * 使用默认路径加载公共环境变量\n */\nexport function preloadEnv(\n cwd: string,\n mode: \"development\" | \"production\"\n): void {\n process.env.NODE_ENV = mode;\n\n // 尝试加载公共环境变量(使用默认路径)\n const defaultPaths = [\n resolve(cwd, \"config/env/.env.public\"),\n resolve(cwd, \".env.public\"),\n resolve(cwd, \".env\"),\n ];\n\n for (const envPath of defaultPaths) {\n if (existsSync(envPath)) {\n dotenv.config({ path: envPath });\n break;\n }\n }\n\n // 尝试加载环境特定的变量\n const modeEnvPaths = [\n resolve(cwd, `config/env/.env.${mode}`),\n resolve(cwd, `.env.${mode}`),\n ];\n\n for (const envPath of modeEnvPaths) {\n if (existsSync(envPath)) {\n const envContent = readFileSync(envPath, \"utf-8\");\n const parsed = dotenv.parse(envContent);\n for (const key in parsed) {\n process.env[key] = parsed[key];\n }\n break;\n }\n }\n}\n\n/**\n * 加载环境变量(完整版,依赖配置)\n */\nexport function loadEnv(\n config: Required<YwkfConfig>,\n cwd: string,\n mode: \"development\" | \"production\"\n): void {\n const { env } = config;\n\n // 加载公共环境变量\n const publicEnvPath = resolve(cwd, env.publicEnvFile ?? \"config/env/.env.public\");\n if (existsSync(publicEnvPath)) {\n dotenv.config({ path: publicEnvPath });\n }\n\n // 加载环境特定的变量\n const modeEnvPath = resolve(cwd, env.envDir ?? \"config/env\", `.env.${mode}`);\n if (existsSync(modeEnvPath)) {\n const envContent = readFileSync(modeEnvPath, \"utf-8\");\n const parsed = dotenv.parse(envContent);\n\n for (const key in parsed) {\n process.env[key] = parsed[key];\n }\n }\n\n // 设置默认值\n process.env.NODE_ENV = mode;\n process.env.APP_NAME = process.env.APP_NAME || config.appName;\n process.env.APP_CNAME = process.env.APP_CNAME || config.appCName;\n process.env.OUTPUT_PATH = process.env.OUTPUT_PATH || config.output.path;\n process.env.PUBLIC_PATH = process.env.PUBLIC_PATH || config.output.publicPath;\n process.env.APP_HOST = process.env.APP_HOST || config.dev.host;\n process.env.APP_PORT = process.env.APP_PORT || String(config.dev.port);\n}\n","import type { Configuration as RspackConfig } from \"@rspack/core\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport type { AppConfig, ProviderConfig } from \"../runtime/types.js\";\nimport type { RouteItem } from \"../router/types.js\";\nimport type {\n YwkfPlugin,\n PluginConfig,\n PluginContext,\n PluginHooks,\n PluginLogger,\n} from \"./types.js\";\n\n/**\n * 创建插件日志工具\n */\nfunction createLogger(pluginName: string): PluginLogger {\n const prefix = `[${pluginName}]`;\n\n return {\n info: (msg) => console.log(`${prefix} ${msg}`),\n warn: (msg) => console.warn(`${prefix} ${msg}`),\n error: (msg) => console.error(`${prefix} ${msg}`),\n debug: (msg) => {\n if (process.env.DEBUG) {\n console.debug(`${prefix} ${msg}`);\n }\n },\n };\n}\n\n/**\n * 解析插件配置\n */\nasync function resolvePlugin(\n pluginConfig: PluginConfig,\n cwd: string\n): Promise<{ plugin: YwkfPlugin; options: Record<string, unknown> }> {\n let plugin: YwkfPlugin;\n let options: Record<string, unknown> = {};\n\n if (typeof pluginConfig === \"string\") {\n // 字符串:插件包名\n const module = await import(pluginConfig);\n plugin = module.default || module;\n } else if (Array.isArray(pluginConfig)) {\n // 数组:[插件, 配置]\n const [pluginOrName, pluginOptions] = pluginConfig;\n options = pluginOptions;\n\n if (typeof pluginOrName === \"string\") {\n const module = await import(pluginOrName);\n plugin = module.default || module;\n } else {\n plugin = pluginOrName;\n }\n } else {\n // 插件对象\n plugin = pluginConfig;\n }\n\n // 如果是工厂函数,调用它\n if (typeof plugin === \"function\") {\n plugin = (plugin as (opts?: Record<string, unknown>) => YwkfPlugin)(options);\n }\n\n return { plugin, options };\n}\n\n/**\n * 插件管理器\n */\nexport class PluginManager {\n private plugins: Map<string, { plugin: YwkfPlugin; hooks: PluginHooks }> =\n new Map();\n private context: PluginContext;\n\n constructor(\n config: Required<YwkfConfig>,\n cwd: string,\n isDev: boolean\n ) {\n this.context = {\n cwd,\n isDev,\n isProd: !isDev,\n config,\n logger: createLogger(\"PluginManager\"),\n };\n }\n\n /**\n * 加载并初始化所有插件\n */\n async loadPlugins(pluginConfigs: PluginConfig[]): Promise<void> {\n for (const pluginConfig of pluginConfigs) {\n try {\n const { plugin } = await resolvePlugin(pluginConfig, this.context.cwd);\n\n if (this.plugins.has(plugin.name)) {\n this.context.logger.warn(`插件 ${plugin.name} 已加载,跳过重复加载`);\n continue;\n }\n\n // 创建插件专属 logger\n const pluginContext: PluginContext = {\n ...this.context,\n logger: createLogger(plugin.name),\n };\n\n // 调用插件 setup\n const hooks = await plugin.setup(pluginContext);\n\n this.plugins.set(plugin.name, { plugin, hooks });\n this.context.logger.info(`已加载插件: ${plugin.name}`);\n } catch (error) {\n this.context.logger.error(\n `加载插件失败: ${String(pluginConfig)} - ${error}`\n );\n }\n }\n }\n\n /**\n * 执行 modifyRspackConfig 钩子\n */\n async applyRspackConfigHooks(config: RspackConfig): Promise<RspackConfig> {\n let result = config;\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.modifyRspackConfig) {\n try {\n const modified = await hooks.modifyRspackConfig(result, this.context);\n if (modified) {\n result = modified;\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} modifyRspackConfig 执行失败: ${error}`\n );\n }\n }\n }\n\n return result;\n }\n\n /**\n * 执行 modifyRoutes 钩子\n */\n async applyRoutesHooks(routes: RouteItem[]): Promise<RouteItem[]> {\n let result = routes;\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.modifyRoutes) {\n try {\n const modified = await hooks.modifyRoutes(result, this.context);\n if (modified) {\n result = modified;\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} modifyRoutes 执行失败: ${error}`\n );\n }\n }\n }\n\n return result;\n }\n\n /**\n * 执行 modifyAppConfig 钩子\n */\n applyAppConfigHooks(appConfig: AppConfig): AppConfig {\n let result = appConfig;\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.modifyAppConfig) {\n try {\n const modified = hooks.modifyAppConfig(result, this.context);\n if (modified) {\n result = modified;\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} modifyAppConfig 执行失败: ${error}`\n );\n }\n }\n }\n\n return result;\n }\n\n /**\n * 收集所有插件的 Provider\n */\n collectProviders(): ProviderConfig[] {\n const providers: ProviderConfig[] = [];\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.addProvider) {\n try {\n const result = hooks.addProvider(this.context);\n if (Array.isArray(result)) {\n providers.push(...result);\n } else if (result) {\n providers.push(result);\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} addProvider 执行失败: ${error}`\n );\n }\n }\n }\n\n return providers;\n }\n\n /**\n * 执行 beforeBuild 钩子\n */\n async runBeforeBuild(): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.beforeBuild) {\n try {\n await hooks.beforeBuild(this.context);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} beforeBuild 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 执行 afterBuild 钩子\n */\n async runAfterBuild(stats: {\n success: boolean;\n errors?: string[];\n }): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.afterBuild) {\n try {\n await hooks.afterBuild(this.context, stats);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} afterBuild 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 执行 beforeDevServer 钩子\n */\n async runBeforeDevServer(): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.beforeDevServer) {\n try {\n await hooks.beforeDevServer(this.context);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} beforeDevServer 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 执行 afterDevServer 钩子\n */\n async runAfterDevServer(server: {\n port: number;\n host: string;\n }): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.afterDevServer) {\n try {\n await hooks.afterDevServer(this.context, server);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} afterDevServer 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 获取所有已加载的插件名称\n */\n getPluginNames(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * 获取所有已加载的插件\n */\n getPlugins(): YwkfPlugin[] {\n return Array.from(this.plugins.values()).map((p) => p.plugin);\n }\n\n /**\n * 获取所有已加载的插件钩子\n */\n getPluginHooks(): PluginHooks[] {\n return Array.from(this.plugins.values()).map((p) => p.hooks);\n }\n}\n","import { rspack, type Stats } from \"@rspack/core\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { resolveConfig } from \"../config/loader.js\";\nimport { createRspackConfig } from \"../rspack/index.js\";\nimport { preloadEnv, loadEnv } from \"./env.js\";\nimport { PluginManager } from \"../plugin/manager.js\";\n\n/**\n * 格式化文件大小\n */\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n}\n\n/**\n * 打印构建结果\n */\nfunction printBuildResult(stats: Stats): void {\n const info = stats.toJson({\n assets: true,\n errors: true,\n warnings: true,\n });\n\n if (info.errors && info.errors.length > 0) {\n console.log(chalk.red(\"\\n构建错误:\"));\n for (const error of info.errors) {\n console.log(chalk.red(` ${error.message}`));\n }\n return;\n }\n\n if (info.warnings && info.warnings.length > 0) {\n console.log(chalk.yellow(\"\\n构建警告:\"));\n for (const warning of info.warnings) {\n console.log(chalk.yellow(` ${warning.message}`));\n }\n }\n\n console.log(chalk.bold(\"\\n构建产物:\"));\n console.log();\n\n const assets = info.assets || [];\n const sortedAssets = assets\n .filter((asset) => !asset.name.endsWith(\".map\"))\n .sort((a, b) => b.size - a.size);\n\n for (const asset of sortedAssets.slice(0, 15)) {\n const sizeColor = asset.size > 500 * 1024 ? chalk.yellow : chalk.green;\n console.log(\n ` ${chalk.dim(asset.name.padEnd(50))} ${sizeColor(formatSize(asset.size))}`\n );\n }\n\n if (sortedAssets.length > 15) {\n console.log(chalk.dim(` ... 还有 ${sortedAssets.length - 15} 个文件`));\n }\n\n console.log();\n console.log(\n chalk.green(\n `✓ 构建完成,耗时 ${((info.time || 0) / 1000).toFixed(2)}s`\n )\n );\n}\n\n/**\n * 执行生产构建\n */\nexport async function build(options: { cwd?: string } = {}): Promise<void> {\n const cwd = options.cwd || process.cwd();\n const spinner = ora(\"正在构建生产环境...\").start();\n\n try {\n // 1. 预加载环境变量(在配置解析之前)\n preloadEnv(cwd, \"production\");\n\n // 2. 加载配置\n const { config, configPath } = await resolveConfig(cwd);\n\n if (configPath) {\n spinner.text = `已加载配置: ${configPath}`;\n }\n\n // 3. 完整加载环境变量\n loadEnv(config, cwd, \"production\");\n\n // 4. 加载插件\n const pluginManager = new PluginManager(config, cwd, false);\n if (config.plugins && config.plugins.length > 0) {\n spinner.text = \"加载插件...\";\n await pluginManager.loadPlugins(config.plugins);\n }\n\n // 5. 执行 beforeBuild 钩子\n await pluginManager.runBeforeBuild();\n\n // 6. 创建 Rspack 配置\n let rspackConfig = createRspackConfig(config, cwd, { isDev: false });\n\n // 7. 应用插件的 rspack 配置修改\n rspackConfig = await pluginManager.applyRspackConfigHooks(rspackConfig);\n\n spinner.text = \"正在编译...\";\n\n // 8. 执行构建\n const compiler = rspack(rspackConfig);\n\n const stats = await new Promise<Stats>((resolve, reject) => {\n compiler.run((err, stats) => {\n if (err) {\n reject(err);\n return;\n }\n if (!stats) {\n reject(new Error(\"构建失败: 无法获取统计信息\"));\n return;\n }\n resolve(stats);\n });\n });\n\n // 5. 关闭编译器\n await new Promise<void>((resolve, reject) => {\n compiler.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n\n // 9. 检查构建结果\n const hasErrors = stats.hasErrors();\n const statsInfo = stats.toJson({ errors: true });\n\n // 10. 执行 afterBuild 钩子\n await pluginManager.runAfterBuild({\n success: !hasErrors,\n errors: statsInfo.errors?.map((e) => e.message),\n });\n\n if (hasErrors) {\n spinner.fail(chalk.red(\"构建失败\"));\n printBuildResult(stats);\n process.exit(1);\n }\n\n spinner.succeed(chalk.green(\"构建完成!\"));\n printBuildResult(stats);\n } catch (error) {\n spinner.fail(chalk.red(\"构建失败\"));\n console.error(error);\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["chalk","rspack","createRequire","join","existsSync","join","existsSync","mkdirSync","writeFileSync","readFileSync","join","existsSync","existsSync","join","join","existsSync","mkdirSync","readFileSync","writeFileSync","join","existsSync","require","join","require","createRequire","dev","rspack","merge","rspack","merge","existsSync","readFileSync","resolve","rspack","rspack","chalk","ora","chalk","ora","rspack","resolve","stats","chalk"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@4399ywkf/core",
3
- "version": "5.0.0",
4
- "description": "4399运维客服前端框架核心",
3
+ "version": "5.0.2",
4
+ "description": "4399运维开发前端框架核心",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -40,7 +40,11 @@
40
40
  "scripts": {
41
41
  "build": "tsup",
42
42
  "dev": "tsup --watch",
43
- "typecheck": "tsc --noEmit"
43
+ "typecheck": "tsc --noEmit",
44
+ "prepublishOnly": "npm run build",
45
+ "release": "npm version patch && npm publish --access public",
46
+ "release:minor": "npm version minor && npm publish --access public",
47
+ "release:major": "npm version major && npm publish --access public"
44
48
  },
45
49
  "dependencies": {
46
50
  "@rsdoctor/rspack-plugin": "^1.1.0",
@@ -88,8 +92,10 @@
88
92
  "typescript": "^5.8.2"
89
93
  },
90
94
  "peerDependencies": {
91
- "react": "^18.0.0",
92
- "react-dom": "^18.0.0"
95
+ "antd": "^5.0.0 || ^6.0.0",
96
+ "react": "^18.0.0 || ^19.0.0",
97
+ "react-dom": "^18.0.0 || ^19.0.0",
98
+ "react-router": "^7.0.0"
93
99
  },
94
100
  "engines": {
95
101
  "node": ">=18.0.0"